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

时间:2011-06-12 03:00:31

标签: c# .net blob informix dbnull

IBM Informix SDK:

声明: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。基本上是:

  • 如果列包含值并且我希望在其中存储null,那么我必须按如下方式对我的参数进行类型转换: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 };。但是,当使用byte []数组作为 UPDATE 语句时,驱动程序仍会出现异常。因此,我必须实际创建IfxBlob实例并使用它们而不是实际的byte []数组。

如果这不是驱动程序中的错误,则此问题需要保持打开状态,以查看设置/取消设置blob字段的正确方法是使用byte []数组进行更新。

1 个答案:

答案 0 :(得分:1)

我认为既然没有人说我所经历的不是一个错误,我会将我的发现作为答案发布:

  1. 对于Informix .NET提供程序(版本:3.5.xC7),请勿在生成IfxType(或{{1}时明确设置DbTypeIfxParameter }})。相反,只需生成参数并允许Informix .NET提供程序为您映射正确的类型。这使您不必担心类型转换参数(即避免使用“?:: blob”和“?:: byte”)。

  2. 由于一个错误(版本:3.5.xC7),将一个byte []数组插入Blob字段工作正常,但使用byte []数组更新该Blob字段将导致609错误。相反,必须创建DbParameter并将其设置为值。这在插入时也有效。