Pregunta

Estoy intentando ejecutar una consulta parametrizada en una base de datos DB2 de .NET utilizando el controlador de acceso de cliente ODBC 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, un OdbcException se lanza:

  

ERROR [42S22] [IBM] [Controlador ODBC de Client Access] [DB2 UDB] SQL0206 -. @LAT columna no especificados en las tablas

La web del Congreso parecen dar a entender que consultas con parámetros son compatibles con el controlador ODBC de acceso de cliente, pero este error parece indicar lo contrario. ¿Hay algo mal con el código suministrado?

¿Fue útil?

Solución

¿Ha intentado utilizar? 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 utiliza OdbcConnection / OdbcCommand.

Sólo tiene que asegurarse de que sus Parameters.AddWithValue () declaraciones están en el mismo orden que la lista de campos en la instrucción INSERT. En primer parámetro pasado a AddWithValue () no parece importar, aunque por convención hago lo mismo que el nombre del campo.

Otros consejos

Si estoy acertar en lo que estás tratando de hacer que usted quiere hacer esto:

Si desea añadir un parámetro, y la necesidad de 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());
}

añadido

Sólo tiene un marcador de posición (@Lat) para su parámetro en el comando, por lo que debe ser la adición de un solo parámetro. Su código es la adición de un nuevo parámetro para cada objeto en el lector. No es uno de esos parámetros se llamaría "@Lat" a menos que usted es lector devuelve un valor de @Lat.

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

Aclaración de la sintaxis de uso de consultas parameteized, tenga en cuenta esta declaración:

cmd.CommandText = "Insertar en la Persona (Nombre, Apellido) Valores (@fname, @lName)

En la declaración anterior, @fname y @lName NO son parámetros. Ellos son símbolos para los parámetros.

Es necesario añadir a continuación de manera explícita los parametros usando las siguientes reglas:

  • Los parámetros tienen que ser nombrados exactamente los mismos que los marcadores de posición
  • Los parmaters se debe añadir en el orden correcto.

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

cmd.CommandText = "Insertar en la Persona (Nombre, Apellido) Valores (@fname, @lName)

cmd.Parameters.AddWithValue ( "@ FName", "David"); // Esta línea, en este contexto, afirma que "la Repalce palceholder parámetro de la línea anterior con este parámetro real. cmd.Parameters.AddWithValue ( "@ lName", "Stratton"); // Del mismo modo, se reemplaza el marcador de posición @lname.

A continuación, si tengo una datareader que tiene un montón de nombres, puedo asignar repleatedly el lector VALOR fromthe al valor del parámetro.

mientras (myReader.Read ()) {     cmd.Parameters [ "@ FName '] Valor = myReader.GetString. ( "FirstNameField");     cmd.Parameters [ "@ lName '] Valor = myReader.GetString. ( "LastNameField");     cmd.ExecuteNonQuery ();

}

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