2011-06-07 98 views

回答

1

有两点要注意:

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; 
} 


几件事情需要注意:Informix的有一个错误,当它涉及到客户端SDK 3.5.xC7 (至今)。在插入过程中,您可以轻松地传入字节数组,但如果传入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值不为空"INSERT INTO mytable (name, theblob) VALUES (?, ?::blob);";
  • 当Blob值为空"INSERT INTO mytable (name, theblob) VALUES (?, ?::byte);";

你可以看到,这将是一个痛苦的对接有因为类型和价值的不同的查询。只要不指定DbType或IfxType并让Informix .NET提供程序为您映射正确的类型(即使它不能在Update上正确映射byte []数组)。

希望能为你解决问题,因为我经历了同样的痛苦,试图找出并发现我认为是Informix .NET提供程序(Ver:3.5.xC7)中的错误。

+0

将其更改为getblob函数并且它工作正常! – michael 2011-06-20 18:39:22

1

最好的办法是使用参数化查询。例如:

using(System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand("INSERT INTO mytable (name, theblob) VALUES ('foo', @binaryValue)", conn)) 
{ 
    cmd.Parameters.Add("@binaryValue", System.Data.SqlDbType.Text, 8000).Value = arraytoinsert; 
    cmd.ExecuteNonQuery(); 
} 

我已经假设您的列类型为Text。 上述方法的原始信用是从this post

+0

这似乎不起作用。它以@binaryValue的形式提供它,而不是替换参数。 – michael 2011-06-11 13:55:12

+0

尝试将添加的第二个参数更改为'System.Data.SqlDbType.VarBinary'。你可以发布你的sql表定义和你正在尝试使用的代码吗? – IndigoDelta 2011-06-13 08:30:30

0

我读了你两个消息,这是解决方案,在帮助我:

byte[] data = File.ReadAllBytes(PathFile); 

StringBuilder sql = new StringBuilder(); 

sql.Append(" UPDATE updater SET report = ? where path = " + "\'" + Path + "\' and status = 1;"); 
IfxCommand cmd = new IfxCommand(sql.ToString(), i_connect); 
cmd.Parameters.Add("@binaryValue", IfxType.Byte).Value = data; 
int res = cmd.ExecuteNonQuery(); 

PathFile - 是FILE.TXT

我的Informix表:

CREATE TABLE updater 
(
    nzp_up SERIAL PRIMARY KEY, 
    version VARCHAR(50), 
    status INT, 
    path VARCHAR(200), 
    key VARCHAR(100), 
    soup VARCHAR(20), 
    report TEXT 
); 
-1

这个职位是真正有用的解决我的问题,所以我想分享我的解决方案,它可能会帮助其他人。以下是完整的代码:

 try 
     { 
      //pFoto is a byte[] loaded in another method. 
      if (pFoto != null && pFoto.Length > 0) 
      { 
       StringBuilder sentenciaSQL = new StringBuilder(); 
       sentenciaSQL.Append("INSERT INTO bd_imagenes:imagenes "); 
       sentenciaSQL.Append("(identificador, cod_imagen, fecha_desde, fecha_hasta, fecha_grabacion, usuario, sec_transaccion, imagen) "); 
       sentenciaSQL.Append("VALUES (?, 'FP', current, null, current, ?, 0, ?);"); 

       using (IfxConnection conIFX = new IfxConnection("Database=bd_imagenes; Server=xxxxxxxx; uid=xxxxxxx; password=xxxxxxxx; Enlist=true; Client_Locale=en_US.CP1252;Db_Locale=en_US.819")) 
       { 
        conIFX.Open(); //<- Abro la conexion. 
        //Aqui convierto la foto en un BLOB:       
        IfxBlob blob = conIFX.GetIfxBlob(); 
        blob.Open(IfxSmartLOBOpenMode.ReadWrite); 
        blob.Write(pFoto); 
        blob.Close(); 

        //Creo el Comando con la SQL: 
        using (IfxCommand cmd = new IfxCommand(sentenciaSQL.ToString(), conIFX)) 
        { 
         //Agrego los parámetros en el mismo orden que la SQL: 
         cmd.Parameters.Add(new IfxParameter()).Value = pCedula; 
         cmd.Parameters.Add(new IfxParameter()).Value = SecurityHandler.Auditoria.NombreUsuario; 
         cmd.Parameters.Add(new IfxParameter()).Value = blob; 
         //Ejecuto la Consulta: 
         Resultado = cmd.ExecuteNonQuery(); 
        } 
        conIFX.Close(); 
       } 
       if (Resultado != 0) { retorno = true; } 
      } 
     } 
     catch (IfxException ae) 
     { 
      if (exepcionesValidacion == null) { exepcionesValidacion = new ArrayList(); } 
      exepcionesValidacion.Add(Util.CrearExcepcion(ae.Message, "ERROR_INESPERADO", ae.StackTrace)); 
     } 
     catch (Exception ex) 
     { 
      if (exepcionesValidacion == null) { exepcionesValidacion = new ArrayList(); } 
      exepcionesValidacion.Add(Util.CrearExcepcion(ex.Message, "ERROR_INESPERADO", ex.StackTrace)); 
     } 
     return retorno; 
    } 
相关问题