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?

È stato utile?

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 ();

}

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top