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 []數組。
什麼是sdk版本號? – 2011-06-12 07:26:34
它是哪種類型的blob列? BYTE,TEXT,BLOB還是CLOB? – 2011-06-15 13:55:29
這是一個Blob列。我已更新我的問題,以更新我的調查結果。 – 2011-06-15 17:23:13