Parametrizzato DB2 Query Da .NET
-
24-09-2019 - |
Domanda
Sto tentando di eseguire una query con parametri in un database DB2 da .NET utilizzando il driver ODBC Client Access utilizzando il seguente codice:
var db2Cmd = new OdbcCommand("INSERT INTO presnlats (LAT) VALUES (@LAT)", db2Conn);
db2Cmd.Parameters.AddWithValue("@LAT", insertValue);
Console.Out.WriteLine(db2Cmd.ExecuteNonQuery());
Quando viene eseguito, un OdbcException
è gettato:
ERRORE [42S22] [IBM] [driver iSeries Access ODBC] [DB2 UDB] SQL0206 -. @LAT Colonna non in tabelle specificate
I internet sembrano implicare che query con parametri sono supportati dal driver ODBC di accesso client, ma questo errore sembra indicare il contrario. C'è sbagliato nulla con il codice fornito?
Soluzione
Hai provato a usare? come segnaposto invece di @LAT?
var db2Cmd = new OdbcCommand("INSERT INTO presnlats (LAT) VALUES (?)", db2Conn);
db2Cmd.Parameters.AddWithValue("LAT", insertValue);
Console.Out.WriteLine(db2Cmd.ExecuteNonQuery());
Questo è ciò che MS Access richiede quando si utilizza OdbcConnection / OdbcCommand.
Hai solo bisogno di assicurarsi che il proprio Parameters.AddWithValue () dichiarazioni sono nello stesso ordine come l'elenco dei campi nell'istruzione INSERT. In primo parametro passato a AddWithValue () non sembra avere importanza, anche se per convenzione lo faccio lo stesso del nome del campo.
Altri suggerimenti
Se sto cercando di indovinare come a quello che stai cercando di fare che si vuole fare questo:
Si desidera aggiungere un parametro, e la necessità di modificare il valore del parametro nel circuito.
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());
}
Aggiunto
Hai solo una segnaposto (@Lat) per il parametro nel comando, così si dovrebbe essere l'aggiunta di un solo parametro. Il tuo codice è l'aggiunta di un nuovo parametro per ogni oggetto nel lettore. Non uno di questi parametri sarebbe chiamato "@Lat" a meno che tu sei il lettore restituisce un valore @Lat.
Sono ancora abbastanza positiva che avete bisogno di un parametro (@Lat) e necessità di modificare il valore del parametro nel circuito.
Chiarire la sintassi di query utilizzando parameteized, considerare questa dichiarazione:
cmd.CommandText = "INSERT INTO persona (Nome, Cognome) Valori (@fname, @lName)
Nella dichiarazione di cui sopra, e @fname @lName non sono parametri. Essi sono segnaposto per i parametri.
È necessario quindi aggiungere in modo esplicito le paramaters utilizzando le seguenti regole:
- I parametri devono essere nominati esattamente come i segnaposto
- I parmaters deve essere aggiunto nel giusto ordine.
Quindi, un esempio più completo sarebbe
cmd.CommandText = "INSERT INTO persona (Nome, Cognome) Valori (@fname, @lName)
cmd.Parameters.AddWithValue ( "@ fName", "David"); // Questa linea, in questo contesto, dice "repalce il parametro palceholder dalla linea precedente, con questo parametro effettivo. cmd.Parameters.AddWithValue ( "@ LName", "Stratton"); // Allo stesso modo, questo sostituisce il segnaposto @lname.
Quindi, se ho un DataReader che ha un sacco di nomi, posso repleatedly assegnare il lettore VALORE fromthe al valore del parametro.
mentre (myReader.Read ()) { cmd.Parameters [ "@ fName '] = Valore myReader.GetString. ( "FirstNameField"); cmd.Parameters [ "@ lname '] = Valore myReader.GetString. ( "LastNameField"); cmd.ExecuteNonQuery ();
}