Pregunta

IBM Informix SDK:

Declaración: 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.
}

Si lo actualizo con otro IfxBlob objeto funciona bien, pero si lo actualizo con DBNull.Value Recibo un error. ¿Alguien sabe cómo "desastar" la columna BLOB utilizando una actualización parametrizada?


Actualizar:

Ok, investigué un poco y he reducido un poco las cosas.

En primer lugar, descubrí que si declaro explícitamente el IfxType Al generar el parámetro, el controlador .NET tiene problemas para convertir dbnull.value o incluso una matriz de byte [] al cambiar de un valor nulo en la base de datos y tener un IFXBLOB real en la base de datos. Básicamente:

  • Si la columna contiene un valor y deseo almacenar nulo en él, entonces debo escribir mi parámetro de la siguiente manera: UPDATE mytable SET myblobcolumn = ?::byte WHERE myid = 1;. Esto me permite almacenar el valor de DBNull.Value sin ningún error.
  • Si la columna contiene un valor nulo y deseo almacenar un valor real en ella, entonces debo escribir mi parámetro de la siguiente manera: UPDATE mytable SET myblobcolumn = ?::blob WHERE myid = 1;. Esto me permite almacenar el valor ifxblob.

Ahora, para evitar todo lo que reduje la inicialización de los parámetros para configurar solo la propiedad del nombre de parámetro: var param = new IfxParameter { ParameterName = "myblobcolumn" } (E incluso eso es solo para poder hacer referencia a la colección, nada más). Esto me permite mantener mi declaración sin tener que escribir mi parámetro.

Entonces ... me queda lo siguiente:

Declaración: 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;

    //...
}

Esto funciona bien, excepto que creo que descubrí un error en el controlador Informix .NET (3.50.xc7) similar al Éste. Básicamente, el enlace proporcionó establece que había un error descubierto que no permitía que el controlador .NET usara correctamente una matriz de byte [] para crear una blob al hacer un inserto. Que se ha solucionado en que literalmente puedo hacer cmd.Parameters["myblob"].Value = new Byte[] { 0x1, 0x2 }; Al hacer un INSERTAR declaración. Sin embargo, el controlador todavía da una excepción cuando se usa la matriz de byte [] para una ACTUALIZAR declaración. Por lo tanto, tuve que crear instancias ifxblob y usarlas en lugar de la matriz de byte [] real.

Si esto no es un error en el controlador, esta pregunta debe permanecer abierta para ver cuál es la forma adecuada de establecer/desastar un campo blob es usar una matriz de byte [] para actualizaciones.

¿Fue útil?

Solución

Pensé que, dado que nadie declaró que lo que experimenté no es un error, publicaré mis hallazgos como respuesta:

  1. Para el proveedor de información informix (ver: 3.5.xc7), no, no establezca explícitamente el IfxType o DbType Al generar un IfxParameter (o DbParameter). En su lugar, simplemente genere el parámetro y permita que el proveedor de informes .NET asigne los tipos correctos para usted. Esto le permite no tener que preocuparse por escribir sus parámetros (es decir, evita "? :: blob" y "? :: byte").

  2. Debido a un error (ver: 3.5.xc7), insertar una matriz de byte [] en un campo blob funciona bien, pero actualizar ese campo blob usando una matriz de byte [] dará como resultado un error 609. En cambio, un IfxBlob tendrá que ser creado y configurado como el valor. Esto también funciona al hacer insertos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top