Consulta DB2 parametrizada desde .NET

Estoy intentando ejecutar una consulta parametrizada contra una base de datos DB2 desde .NET usando el controlador ODBC de Client Access usando el siguiente código:

var db2Cmd = new OdbcCommand("INSERT INTO presnlats (LAT) VALUES (@LAT)", db2Conn); db2Cmd.Parameters.AddWithValue("@LAT", insertValue); Console.Out.WriteLine(db2Cmd.ExecuteNonQuery()); 

Cuando se ejecuta, se lanza una OdbcException :

ERROR [42S22] [IBM] [Controlador ODBC de iSeries Access] [DB2 UDB] SQL0206 – La columna @LAT no está en las tablas especificadas.

Las internets parecen implicar que las consultas parametrizadas son compatibles con el controlador ODBC de acceso del cliente, pero este error parece indicar lo contrario. ¿Hay algún problema con el código suministrado?

    ¿Has probado de usar? como el marcador de posición en lugar de @LAT?

     var db2Cmd = new OdbcCommand("INSERT INTO presnlats (LAT) VALUES (?)", db2Conn); db2Cmd.Parameters.AddWithValue("LAT", insertValue); Console.Out.WriteLine(db2Cmd.ExecuteNonQuery()); 

    Esto es lo que requiere MS Access cuando se usa OdbcConnection / OdbcCommand.

    Solo debe asegurarse de que sus instrucciones Parameters.AddWithValue () estén en el mismo orden que la lista de campos en la instrucción INSERT. El primer parámetro pasado a AddWithValue () no parece importar, aunque por convención lo hago igual que el nombre de campo.

    Si estoy adivinando lo que estás tratando de hacer, quieres hacer esto:

    Desea agregar UN parámetro, y necesita cambiar el VALOR del parámetro en el bucle.

     var db2Cmd = new OdbcCommand("INSERT INTO presnlats (LAT) VALUES (@Lat)", db2Conn); db2Cmd.Parameters.AddWithValue("@Lat", 0); for (int j = 0; j < reader.FieldCount; ++j) { db2Cmd.Parameters["@Lat"].Value = reader[j]; Console.Out.WriteLine(db2Cmd.ExecuteNonQuery()); } 

    Adicional

    Solo tiene un marcador de posición (@Lat) para su parámetro en el comando, por lo que debe agregar solo un parámetro. Su código está agregando un nuevo parámetro para cada objeto en el lector. Ninguno de esos parámetros se llamaría "@Lat" a menos que su lector esté devolviendo un valor de @Lat.

    Todavía estoy bastante seguro de que necesita un parámetro (@Lat) y necesita modificar el valor del parámetro en el bucle.

    Aclarando la syntax del uso de consultas parametizadas, considere esta statement:

    cmd.CommandText = "Insertar en los valores de la persona (Nombre, Apellido) (@fName, @lName)

    En la statement anterior, @fName y @lName NO son parámetros. Son marcadores de posición para los parámetros.

    Debe agregar explícitamente los parámetros usando las siguientes reglas:

    • Los parámetros deben tener el mismo nombre que los marcadores de posición.
    • Los parmaters deben ser agregados en el orden correcto.

    Así que un ejemplo más completo sería

    cmd.CommandText = "Insertar en los valores de la persona (Nombre, Apellido) (@fName, @lName)

    cmd.Parameters.AddWithValue ("@ fName", "David"); // Esta línea, en este contexto, dice "Repalce el marcador de posición del parámetro de la línea anterior con este parámetro real. Cmd.Parameters.AddWithValue (" @ lName "," Stratton "); // de manera similar, esto reemplaza al marcador de posición @lname .

    Luego, si tengo un datareader que tiene un montón de nombres, puedo asignar repetidamente el VALOR del lector al VALOR del parámetro.

    while (myReader.Read ()) {cmd.Parameters ["@ fName ']. Value = myReader.GetString (" FirstNameField "); cmd.Parameters [" @ lName']. Value = myReader.GetString ("LastNameField") ; cmd.ExecuteNonQuery ();

    }