簡體   English   中英

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

[英]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[] 數組時遇到問題數據庫。 基本上:

  • 如果該列包含一個值並且我希望將 null 存儲在其中,那么我必須按如下方式對我的參數進行類型轉換: UPDATE mytable SET myblobcolumn =?::byte WHERE myid = 1; . 這允許我存儲DBNull.Value的值而不會出現任何錯誤。
  • 如果該列包含 null 值並且我希望在其中存儲一個實際值,那么我必須按如下方式對我的參數進行類型轉換: 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[] 數組進行更新。

我想既然沒有人說我所經歷的不是一個錯誤,我會把我的發現作為答案發布:

  1. 對於 Informix .NET 提供程序(版本:3.5.xC7),請勿在生成IfxParameter (或DbParameter )時顯式設置IfxTypeDbType 相反,只需生成參數並允許 Informix .NET 提供程序到 map 為您提供正確的類型。 這使您不必擔心對參數進行類型轉換(即避免使用“?::blob”和“?::byte”)。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM