Question

Je tente d'exécuter une requête paramétrées contre une base de données DB2 .NET à l'aide du pilote ODBC d'accès au client en utilisant le code suivant:

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

Lors de son exécution, est lancé un OdbcException:

  

ERREUR [42S22] [IBM] [iSeries Access ODBC Driver] [DB2 UDB] SQL0206 -. Colonne @LAT pas dans les tables spécifiées

Les internets semblent impliquer que requêtes paramétrées sont pris en charge par le pilote ODBC d'accès client, mais cette erreur semble indiquer le contraire. Y at-il quelque chose de mal avec le code fourni?

Était-ce utile?

La solution

Avez-vous essayé d'utiliser? comme l'espace réservé au lieu de @LAT?

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

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

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

est ce que MS Access lors de l'utilisation nécessite OdbcConnection / OdbcCommand.

Il vous suffit de vous assurer que vos déclarations Parameters.AddWithValue () sont dans le même ordre que la liste des champs dans l'instruction INSERT. Le premier paramètre est passé à AddWithValue () ne semble pas à la matière, bien que par convention, je fais la même chose que le nom du champ.

Autres conseils

Si je devine juste à ce que vous essayez de vous voulez faire cela:

Vous voulez ajouter le paramètre ONE, et la nécessité de modifier la valeur du paramètre dans la boucle.

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

Ajouté

Vous avez seulement un espace réservé (@Lat) pour votre paramètre dans la commande, vous devez donc ajouterez un seul paramètre. Votre code ajoute un nouveau paramètre pour chaque objet dans le lecteur. Pas un de ces paramètres serait nommé « @Lat » sauf si vous êtes lecteur retourne une valeur de @Lat.

Je suis encore assez positif que vous avez besoin d'un paramètre (@Lat) et la nécessité de modifier la valeur du paramètre dans la boucle.

La clarification de la syntaxe des requêtes à l'aide parameteized, pensez à cette déclaration:

cmd.CommandText = « Insérer dans personne (FirstName, LastName) Valeurs (@fName, @lName)

Dans la déclaration ci-dessus, et @fName @lName sont pas des paramètres. Ils sont représentent les paramètres.

Vous devez alors ajouter explicitement les paramaters en utilisant les règles suivantes:

  • Les paramètres doivent être nommés exactement les mêmes que les espaces réservés
  • Les parmaters doivent être ajoutés dans l'ordre.

Ainsi, un exemple plus complet serait

cmd.CommandText = « Insérer dans personne (FirstName, LastName) Valeurs (@fName, @lName)

cmd.Parameters.AddWithValue ( "@ fName", "David"); // Cette ligne, dans ce contexte, dit « repalce le paramètre palceholder de la ligne précédente avec ce paramètre réel. cmd.Parameters.AddWithValue ( "@ lName", "Stratton"); // De même, il remplace l'espace réservé @lname.

Alors si j'ai un datareader qui a un tas de noms, je peux repleatedly attribuer la valeur lesemployés lecteur à la valeur du paramètre.

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

}

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top