Informix(C#):如何正确设置/取消设置Blob字段?
|
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列吗?
更新:
好的,我做了一些研究,并将事情减少了一些。
首先,我发现,如果在生成参数时显式声明the4ѭ,则.NET驱动程序在从数据库中的空值来回切换并具有实际的IfxBlob时,将无法转换DBNull.Value甚至Byte []数组在数据库中。基本上:
如果该列包含一个值,而我希望在其中存储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)中发现一个与此漏洞类似的错误外,此方法工作正常。基本上,提供的链接指出,发现了一个错误,该错误不允许.NET驱动程序在执行插入操作时正确使用byte []数组创建blob。这已经得到修复,因为在执行INSERT语句时我可以按字面意思执行“ 11”。但是,当将byte []数组用于UPDATE语句时,驱动程序仍会给出异常。因此,我必须实际创建IfxBlob实例,并使用这些实例代替实际的byte []数组。
如果这不是驱动程序中的错误,则此问题需要保持开放状态,以了解设置/取消Blob字段的正确方法是使用byte []数组进行UPDATES。
没有找到相关结果
已邀请:
1 个回复
宠封钞轰