.NET からのパラメータ化された DB2 クエリ
-
24-09-2019 - |
質問
次のコードを使用して、クライアント アクセス ODBC ドライバーを使用して .NET から DB2 データベースに対してパラメーター化されたクエリを実行しようとしています。
var db2Cmd = new OdbcCommand("INSERT INTO presnlats (LAT) VALUES (@LAT)", db2Conn);
db2Cmd.Parameters.AddWithValue("@LAT", insertValue);
Console.Out.WriteLine(db2Cmd.ExecuteNonQuery());
実行されると、 OdbcException
投げられる:
エラー [42S22] [IBM][iSeries Access ODBC Driver][DB2 UDB]SQL0206 - 列 @LAT が指定されたテーブルにありません。
インターネッツ パラメータ化されたクエリがクライアント アクセス ODBC ドライバーでサポートされていることを暗示しているようですが、このエラーはそうではないことを示しているようです。提供されたコードに何か問題がありますか?
解決
あなたは使用してみましたか?プレースホルダとして代わりの@LAT?
var db2Cmd = new OdbcCommand("INSERT INTO presnlats (LAT) VALUES (?)", db2Conn);
db2Cmd.Parameters.AddWithValue("LAT", insertValue);
Console.Out.WriteLine(db2Cmd.ExecuteNonQuery());
このはてOdbcConnection /たOdbcCommandを使用した場合のMS Accessが必要とするものです。
あなたは必ずあなたのParameters.AddWithValue()文がINSERT文でフィールドリストと同じ順序であるようにする必要があります。 AddWithValue()に渡される最初のパラメータは、慣例により、私は、フィールド名と同じそれを作るものの、重要ではしていないようです。
他のヒント
あなたがやろうとしていることを私が正しく推測している場合、あなたはこれをやりたいと思っています:
パラメータを 1 つ追加する必要があり、ループ内のパラメータの値を変更する必要があります。
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());
}
追加した
あなたは1つしか持っていません プレースホルダー (@lat)コマンド内のパラメーターの場合、1つのパラメーターのみを追加する必要があります。コードは、リーダー内のすべてのオブジェクトに新しいパラメーターを追加しています。リーダーが @Lat の値を返さない限り、これらのパラメーターのいずれも「@Lat」という名前は付けられません。
私は、1 つのパラメーター (@Lat) が必要で、ループ内のパラメーターの値を変更する必要があることをかなり確信しています。
パラメーター化されたクエリを使用する構文を明確にするために、次のステートメントを検討してください。
cmd.CommandText = "個人 (名、姓) の値 (@fName、@lName) に挿入
上記のステートメントでは、@fName と @lName はパラメーターではありません。これらはパラメータのプレースホルダです。
次に、次のルールを使用してパラメータを明示的に追加する必要があります。
- パラメータにはプレースホルダとまったく同じ名前を付ける必要があります
- パラメータは正しい順序で追加する必要があります。
したがって、より完全な例は次のようになります
cmd.CommandText = "個人 (名、姓) の値 (@fName、@lName) に挿入
cmd.Parameters.AddWithValue("@fName", "David");// このコンテキストでのこの行は、「前の行のパラメーター palceholder をこの実際のパラメーターで置き換えます。cmd.Parameters.AddWithValue("@lName", "ストラットン");// 同様に、これは @lname プレースホルダーを置き換えます。
次に、多数の名前を持つデータリーダーがある場合、リーダーからの VALUE をパラメーターの VALUE に繰り返し割り当てることができます。
while(myreader.read()){cmd.parameters ["@fname ']。value = myreader.getString(" firstNamefield ");cmd.Parameters["@lName'].Value = myReader.GetString("LastNameField");cmd.ExecuteNonQuery();
}