[英]SQL + Informix: How do I add a blob when doing an insert? (Using the .NET (C#) SDK)
[英]Informix (C#): How do I properly set/unset a blob field?
IBM Informix SDK:
聲明: Update mytable set myblobcolumn =? where myid = 1;
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
object 更新它,它工作正常,但如果我用DBNull.Value
更新它,我會收到錯誤。 任何人都知道如何使用參數化更新“取消設置”blob 列?
更新:
好的,我做了一些研究,並減少了一些東西。
首先,我發現如果我在生成參數時顯式聲明IfxType
,.NET 驅動程序在從數據庫中的 null 值來回切換並具有實際 IfxBlob 時轉換 DBNull.Value 甚至 Byte[] 數組時遇到問題數據庫。 基本上:
UPDATE mytable SET myblobcolumn =?::byte WHERE myid = 1;
. 這允許我存儲DBNull.Value
的值而不會出現任何錯誤。UPDATE mytable SET myblobcolumn =?::blob WHERE myid = 1;
. 這允許我存儲 IfxBlob 值。 現在,為了避免所有這些,我將 Parameter 初始化減少為僅設置 ParameterName 屬性: var param = new IfxParameter { ParameterName = "myblobcolumn" }
(甚至只是為了能夠從集合中引用它,僅此而已) . 這讓我可以保留我的陳述,而不必對我的參數進行類型轉換。
所以......我剩下以下內容:
語句: UPDATE mytable SET myblobcolumn =? where myid = 1;
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)中發現了一個類似於這個的錯誤。 基本上,提供的鏈接指出發現了一個錯誤,該錯誤不允許 .NET 驅動程序在執行插入時正確使用 byte[] 數組來創建 blob。 這已經得到修復,因為我可以真正做到cmd.Parameters["myblob"].Value = new Byte[] { 0x1, 0x2 };
在執行INSERT語句時。 但是,當將 byte[] 數組用於UPDATE語句時,驅動程序仍然會出現異常。 因此,我必須實際創建 IfxBlob 實例並使用它們而不是實際的 byte[] 數組。
如果這不是驅動程序中的錯誤,那么這個問題需要保持開放,以查看設置/取消設置 blob 字段的正確方法是使用 byte[] 數組進行更新。
我想既然沒有人說我所經歷的不是一個錯誤,我會把我的發現作為答案發布:
對於 Informix .NET 提供程序(版本:3.5.xC7),請勿在生成IfxParameter
(或DbParameter
)時顯式設置IfxType
或DbType
。 相反,只需生成參數並允許 Informix .NET 提供程序到 map 為您提供正確的類型。 這使您不必擔心對參數進行類型轉換(即避免使用“?::blob”和“?::byte”)。
由於一個錯誤(版本:3.5.xC7),將 byte[] 數組插入 Blob 字段可以正常工作,但使用 byte[] 數組更新該 Blob 字段將導致 609 錯誤。 相反,必須創建一個IfxBlob
並將其設置為值。 這在進行插入時也有效。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.