2011-06-12 81 views
2

IBM的Informix SDK:Informix(C#):如何正確設置/取消設置blob字段?

聲明:Update mytable set myblobcolumn = ? where myid = 1;

using (IfxConnection conn = GetIfxConnection()) 
using (IfxCommand cmd = new IfxCommand(updateSql, conn)) 
{ 
    var param = new IfxParameter("myblobcolumn", IfxType.Blob) { IsNullable = true }; 
    cmd.Parameters.Add(param).Value = DBNull.Value 

    cmd.ExecuteNonQuery(); //ERROR [HY000] [Informix .NET provider][Informix]Illegal attempt to use Text/Byte host variable. 
} 

如果我與另一個IfxBlob對象時,它工作正常更新,但如果我用DBNull.Value更新它,我得到一個錯誤。任何人都知道如何使用參數化更新「取消」blob列?


更新:

好吧,我做了一些研究,並降低下來一點。

首先,我發現如果我在生成參數時明確聲明IfxType,.NET驅動程序在轉換數據庫中的空值時來回轉換DBNull.Value或甚至是Byte []數組時遇到問題,並且數據庫中有一個實際的IfxBlob。基本上:

  • 如果列中包含一個值,我希望在其中存儲空值,而不是我的參數,如下所示:UPDATE mytable SET myblobcolumn = ?::byte WHERE myid = 1;。這使我可以存儲DBNull.Value的值而沒有任何錯誤。
  • 如果列中包含一個空值並且我希望在其中存儲實際值,那麼我必須按照以下方式對我的參數進行類型轉換:UPDATE mytable SET myblobcolumn = ?::blob WHERE myid = 1;。這使我可以存儲IfxBlob值。

現在,以避免所有我的參數初始化降低到僅設置ParameterName屬性:var param = new IfxParameter { ParameterName = "myblobcolumn" }(甚至是隻爲了能夠從集合引用它,僅此而已)。這讓我保持我的聲明,而不必強制我的參數。

所以...我留下了以下內容:

聲明:UPDATE mytable SET myblobcolumn = ? where myid = 1;

using (IfxConnection conn = GetIfxConnection()) 
using (IfxCommand cmd = new IfxCommand(updateSql, conn)) 
{ 
    var param = new IfxParameter { ParameterName = "myblob" } 
    cmd.Parameters.Add(param); 

    var value = GetSomeValue(); 

    if (value is Byte[]) 
     cmd.Paremeters["myblob"].Value = GetIfxBlob(value); 
    else 
     cmd.Parameters["myblob"].Value = DBNull.Value; 

    //... 
} 

這工作得很好,但我覺得我在Informix .NET驅動程序(3.50發現的錯誤。 xC7)類似於this one。基本上,提供的鏈接指出發現了一個錯誤,它不允許.NET驅動程序在插入時正確使用byte []數組創建blob。這已被修復,因爲我可以在做INSERT聲明時從字面上做cmd.Parameters["myblob"].Value = new Byte[] { 0x1, 0x2 };。但是,對於UPDATE語句使用byte []數組時,驅動程序仍然會發生異常。因此,我不得不實際創建IfxBlob實例並使用它們來代替實際的byte []數組。

如果這不是驅動程序中的錯誤,那麼這個問題需要保持開放以查看設置/取消設置blob字段的正確方法是使用UPDATE的byte []數組。

+0

什麼是sdk版本號? – 2011-06-12 07:26:34

+0

它是哪種類型的blob列? BYTE,TEXT,BLOB還是CLOB? – 2011-06-15 13:55:29

+0

這是一個Blob列。我已更新我的問題,以更新我的調查結果。 – 2011-06-15 17:23:13

回答

1

我計算過,因爲沒有人說什麼,我經歷是不是一個錯誤,我會後我發現一個答案:

  1. 爲Informix .NET提供程序(版本:3.5。xC7),請不要在生成IfxParameter(或DbParameter)時明確設置IfxTypeDbType。相反,只需生成參數並允許Informix .NET提供程序爲您映射正確的類型。這允許你不必擔心類型化你的參數(即避免「?:: blob」和「?:: byte」)。

  2. 由於bug(ver:3.5.xC7),將一個byte []數組插入Blob字段可以正常工作,但使用byte []數組更新該Blob字段將導致609錯誤。相反,必須創建一個IfxBlob並將其設置爲值。這也適用於插入。

+0

你在第一點意味着什麼?那是不是明確設置讓我們說IFXType.Integer?我有最新的4.70(?)版本的informix庫。所以你說tath我需要的只是一個值和一個參數名,而informix會知道那是什麼? – 2015-10-19 09:13:44