Frage

Ich versuche, eine parametrisierte Abfrage einer DB2-Datenbank von .NET ausführen, um die Client Access-ODBC-Treiber mit dem folgenden Code:

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

Wenn er ausgeführt wird, ein OdbcException geworfen wird:

  

ERROR [42S22] [IBM] [iSeries Access ODBC-Treiber] [DB2 UDB] SQL0206 -. Spalte @LAT nicht in den angegebenen Tabellen

Die internets zu implizieren scheint, dass parametrisierte Abfragen werden durch den Client-Zugriff-ODBC-Treiber unterstützt, aber dieser Fehler scheint anders anzuzeigen. Gibt es etwas falsch mit dem mitgelieferten Code?

War es hilfreich?

Lösung

Haben Sie versucht, mit? als Platzhalter anstelle von @LAT?

var db2Cmd = new OdbcCommand("INSERT INTO presnlats (LAT) VALUES (?)", db2Conn);

db2Cmd.Parameters.AddWithValue("LAT", insertValue);

Console.Out.WriteLine(db2Cmd.ExecuteNonQuery());

Dies ist, was MS Access erfordert, wenn OdbcConnection mit / OdbcCommand.

Sie müssen nur sicherstellen, dass Ihre Parameters.AddWithValue () Aussagen sind in der gleichen Reihenfolge wie die Feldliste in der INSERT-Anweisung. Der erste Parameter zu AddWithValue () übergeben scheinen keine Rolle zu, obwohl vereinbarungs ich es die gleiche wie die Feldnamen zu machen.

Andere Tipps

Wenn ich vermute richtig an, was Sie versuchen, was Sie tun wollen, dies zu tun:

Sie möchten einen Parameter hinzuzufügen, und müssen den Wert des Parameters in der Schleife zu ändern.

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

hinzugefügt

Sie haben nur eine Platzhalter (@Lat) für Ihre Parameter in dem Befehl, so sollten Sie nur einen Parameter hinzufügen. Der Code ist das Hinzufügen eines neuen Parameters für jedes Objekt in der Leser. Nicht einer dieser Parameter würde den Namen „@Lat“ es sei denn youre Leser einen Wert von @Lat zurückkehrt.

Ich bin immer noch ziemlich sicher, dass Sie einen Parameter benötigen (@Lat) und Notwendigkeit, den Wert des Parameters in der Schleife zu ändern.

Die Klärung der Syntax von parameteized Abfragen verwenden, sollten Sie diese Aussage:

cmd.CommandText = „INSERT INTO Person (Vorname, Nachname) Werte (@fname, @lName)

In der obigen Aussage, @fname und @lName sind keine Parameter. Sie sind Platzhalter für Parameter.

Sie müssen sich fügen Sie dann explizit die paramaters die folgenden Regeln:

  • Die Parameter benannt werden müssen genau das gleiche wie die Platzhalter
  • Die parmaters in der richtigen Reihenfolge hinzugefügt werden müssen.

So ein vollständiges Beispiel wäre

cmd.CommandText = „INSERT INTO Person (Vorname, Nachname) Werte (@fname, @lName)

cmd.Parameters.AddWithValue ( "@ fName", "David"); // Diese Zeile in diesem Zusammenhang, sagt: „Mit diesem aktuellen Parameter der Parameter palceholder aus der vorherige Zeile repalce. cmd.Parameters.AddWithValue ( "@ lName", "Stratton"); // in ähnlicher Weise, dies ersetzt den @lname Platzhalter.

Dann, wenn ich einen Datareader, die eine Reihe von Namen haben, kann ich repleatedly die VALUE fromthe Leser auf den Wert des Parameters zuweisen.

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

}

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top