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。基本上是:
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 []数组进行更新。
答案 0 :(得分:1)
我认为既然没有人说我所经历的不是一个错误,我会将我的发现作为答案发布:
对于Informix .NET提供程序(版本:3.5.xC7),请勿在生成IfxType
(或{{1}时明确设置DbType
或IfxParameter
}})。相反,只需生成参数并允许Informix .NET提供程序为您映射正确的类型。这使您不必担心类型转换参数(即避免使用“?:: blob”和“?:: byte”)。
由于一个错误(版本:3.5.xC7),将一个byte []数组插入Blob字段工作正常,但使用byte []数组更新该Blob字段将导致609错误。相反,必须创建DbParameter
并将其设置为值。这在插入时也有效。