web-dev-qa-db-ja.com

ODBC C#を介してパラメーターをバインドする方法は?

ODBC C#からのクエリでパラメーターをバインドする必要があります。これはサンプルコードですが、VSは1つのパラメーターが不足していることを通知します。

OdbcCommand cmd = conn.CreateCommand();

cmd.CommandText = "SELECT * FROM user WHERE id = @id";
cmd.Parameters.Add("@id", OdbcType.Int).Value = 4;
OdbcDataReader reader = cmd.ExecuteReader();

ODBCで値をバインドするための構文は何ですか?

21

Odbcは名前付きパラメーターを使用できません。つまり、コマンド文字列はすべてのパラメーターにプレースホルダーを使用し、このプレースホルダーはパラメーター名ではなく単一の疑問符です。

OdbcCommand.Parameters

次に、コマンド文字列に表示されるのと同じ順序でコレクションにパラメーターを追加する必要があります

OdbcCommand cmd = conn.CreateCommand();
cmd.CommandText = "SELECT * FROM [user] WHERE id = ?";
cmd.Parameters.Add("@id", OdbcType.Int).Value = 4;
OdbcDataReader reader = cmd.ExecuteReader();

また、別の問題もあります。USERWordはMS Accessデータベースごとの予約済みキーワードであり、それをフィールド名またはテーブル名として使用する場合は、すべての参照を角かっこで囲む必要があります。この問題が頻繁に発生するため、可能であれば、そのテーブル名を変更することを強くお勧めします。

40
Steve

使用する "?" 代わりに @ ODBCを使用している場合。

次のようにしてみてください:

OdbcCommand cmd = conn.CreateCommand();

cmd.CommandText = "SELECT * FROM user WHERE id = ?";
cmd.Parameters.Add("@id", OdbcType.Int).Value = 4;
OdbcDataReader reader = cmd.ExecuteReader();
14
C Sharper

ODBCパラメータ化されたLIKEを使用するには、次のように実行します。つまり、通常の単一引用符を使用せず、%をCommandTextに含めません(さらに、%はおそらくOracleに特別な意味があると思います?:

OdbcCommand cmd = conn.CreateCommand();
cmd.CommandText = "SELECT * FROM [user] WHERE name LIKE ?";
cmd.Parameters.AddWithValue("@fieldName", OdbcType.NVarChar).Value = "%" + nameFilter + "%";
0
Paul Zahra