我正在使用Informix和.NET SDK(C#):
基本上,执行标准的插入sql语句时,有什么方法可以插入blob吗?
INSERT INTO mytable (name, theblob) VALUES ('foo', ? what goes here ?);
哦,我拥有的数据是byte []数组的形式。
最佳答案
一些注意事项:
1)您应该使用参数化查询
//Assuming you already have a connection somewhere that is opened.
var sql = "INSERT INTO mytable (name, theblob) VALUES (?, ?);";
using (var command = new IfxCommand(sql, connection))
{
command.Parameters.Add(new IfxParameter()).Value = "foo";
command.Parameters.Add(new IfxParameter()).Value = ifxBlob;
}
需要注意的几件事:关于Client SDK 3.5.xC7(到目前为止),Informix有一个错误。您可以在插入过程中轻松传递字节数组,但是如果传递byte []数组,则在进行更新时会出现609错误。而是必须使用
IfxBlob
对象。public IfxBlob CreateIfxBlob(byte[] data)
{
//Get the connection however you like and make sure it's open...
//Obviously you should make this method handle exceptions and the such.
IfxBlob blob = connection.GetIfxBlob();
blob.Open(IfxSmartLOBOpenMode.ReadWrite);
blob.Write(data);
blob.Close();
return blob;
}
您必须在更新过程中传递一个IfxBlob,因此您也可能在插入过程中传递它。
另外,请记住,如果尝试设置
null
,则会出现错误。相反,如果该值为null,则传递DBNull.Value。public Object AsDBValue(Object value) //Or this Object value if you want it as an extension
{
if (value == null)
return DBNull.Value;
//Other checks
if (value is Enum)
return Convert.ChangeType(value, value.GetType().GetEnumUnderlyingType());
//Is Blob?
if (value is byte[])
return GetIfxBlob(value as byte[]);
return value;
}
不指定参数类型
//These will lead to errors unless you typecast the parameters in the query.
new IfxParameter { IfxType = IfxType.Blob };
new IfxParameter { DbType = DbType.Binary };
如果您选择其中任何一个,则必须执行以下操作:
当Blob值不为null时:
"INSERT INTO mytable (name, theblob) VALUES (?, ?::blob);";
当Blob值为null时:
"INSERT INTO mytable (name, theblob) VALUES (?, ?::byte);";
您会看到,由于类型和值的不同,要进行不同的查询会很麻烦。只是不要指定DbType或IfxType,而是让Informix .NET提供程序为您映射正确的类型(即使它无法在Update上正确映射byte []数组)。
希望对您有用,因为我经历了同样的苦难,试图弄清楚这一点并发现我认为是Informix .NET提供程序(版本:3.5.xC7)中的错误。
关于c# - SQL + Informix:在执行插入操作时如何添加blob? (使用.NET(C#)SDK),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6267159/