6

次のコードを使用して、クライアント アクセス 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 ドライバー][DB2 UDB]SQL0206 - 列 @LAT が指定されたテーブルにありません。

インターネットは、パラメーター化されたクエリがクライアント アクセス ODBC ドライバーによってサポートされていることを暗示しているようですが、このエラーはそうでないことを示しているようです。提供されたコードに問題はありますか?

4

2 に答える 2

10

使ってみましたか?@LATの代わりにプレースホルダーとして?

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

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

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

これは、MSAccessがOdbcConnection/OdbcCommandを使用するときに必要なものです。

Parameters.AddWithValue()ステートメントがINSERTステートメントのフィールドリストと同じ順序であることを確認する必要があります。AddWithValue()に渡される最初のパラメーターは重要ではないようですが、慣例により、フィールド名と同じにします。

于 2010-03-03T20:35:18.150 に答える
0

私があなたがやろうとしていることを正しく推測しているなら、あなたはこれをしたいです:

1つのパラメーターを追加し、ループ内のパラメーターのVALUEを変更する必要があります。

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

追加した

コマンドのパラメーターにはプレースホルダー(@Lat)が1つしかない ため、パラメーターを1つだけ追加する必要があります。コードは、リーダー内のすべてのオブジェクトに新しいパラメーターを追加しています。リーダーが@Latの値を返さない限り、これらのパラメーターのいずれにも「@Lat」という名前は付けられません。

私はまだ、1つのパラメーター(@Lat)が必要であり、ループ内のパラメーターの値を変更する必要があることを確信しています。

パラメータ化されたクエリを使用する構文を明確にするために、次のステートメントを検討してください。

cmd.CommandText = "Insert Into Person(FirstName、LastName)Values(@fName、@lName)

上記のステートメントでは、@fNameと@lNameはパラメーターではありません。これらはパラメータのプレースホルダーです。

次に、次のルールを使用してパラメータを明示的に追加する必要があります。

  • パラメータには、プレースホルダーとまったく同じ名前を付ける必要があります
  • パーマターは正しい順序で追加する必要があります。

したがって、より完全な例は次のようになります

cmd.CommandText = "Insert Into Person(FirstName、LastName)Values(@fName、@lName)

cmd.Parameters.AddWithValue( "@ fName"、 "David"); //この行は、このコンテキストでは、「前の行のパラメーターpalceholderをこの実際のパラメーターで置き換えます。cmd.Parameters.AddWithValue( "@ lName"、 "Stratton"); //同様に、これは@lnameプレースホルダーを置き換えます。 。

次に、多数の名前を持つデータリーダーがある場合、リーダーからのVALUEをパラメーターのVALUEに繰り返し割り当てることができます。

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

}

于 2010-03-03T20:41:10.650 に答える