質問

次のコードを使用して、クライアント アクセス 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();

}

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top