我正在使用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/

10-13 02:56