2010-12-26 6 views
0

私はADO.NETを使用してODBCを介してOracle DBに接続しています。すべては、単純なSQLクエリにパラメータを結合以外に、正常に動作している:SQLクエリのWHERE句にパラメータを追加する

Connection.Open(); 
IDbCommand command = Connection.CreateCommand(); 
command.CommandText = "SELECT length FROM activity_type WHERE name = :name_of_activity"; 
var parameter = command.CreateParameter(); 
parameter.ParameterName = ":name_of_activity"; 
parameter.Value = "Short_break"; 
command.Parameters.Add(parameter); 
int result = Convert.ToInt32(command.ExecuteScalar()); 
Connection.Close(); 

それは常に0結果(ExecuteScalar()からヌル - 読者から同じ)を返します。しかし、私はこのような簡単なSQLクエリを置く場合:command.CommandText = "SELECT length FROM activity_type WHERE name = 'Short_break'"それは魅力的なように動作します。さらに、私はINSERT INTO節のコード全体に同様の構造を使用しましたが、それでも問題はありませんでした。

何か不足していますか? OdbcCommand.Parametersのためのドキュメントから

答えて

6

CommandTypeをがTextに設定されている場合は、ODBCの.NET Frameworkデータプロバイダーは、SQL文またはたOdbcCommandによって呼び出されたストアドプロシージャに名前付きパラメータを渡すことをサポートしていません。 。いずれの場合も、疑問符(?)プレースホルダを使用します。たとえば、次のように言い換える

SELECT * FROM Customers WHERE CustomerID = ? 

、あなたのコードは次のようになります。

Connection.Open(); 
IDbCommand command = Connection.CreateCommand(); 
command.CommandText = "SELECT length FROM activity_type WHERE name = ?"; 
var parameter = command.CreateParameter(); 
parameter.Value = "Short_break"; 
command.Parameters.Add(parameter); 
int result = Convert.ToInt32(command.ExecuteScalar()); 
Connection.Close(); 

(おそらくusingステートメントを使用して検討する必要があり、これがスローした場合、あなたがそうでなければ...気に例外は、接続を閉じることはありません)。

+0

を削除します。私は '?'前のプレースホルダ、運がない。それでも同じ結果。名前付きパラメータは、コードの他のすべての部分で機能します。元々 'Connection.Close()'が 'finally'節にあるので、プロジェクトからコードを抽出しました。 – mcmil

+0

@M_F:これは本当に 'OdbcCommand'ですか?それは与えられたかなり一般的なコードから伝えるのは難しいです。残念ながら、さまざまなプロバイダが異なる形式のパラメータ化されたクエリをサポートしています。何が通過しているのかを確認するためにデータベースログを調べてみましたか? –

+0

はい、OdbcCommandです。接続は 'IdbConnection Connection = new OdbcConnection(" DSN = oracle; UID = xxx; PWD = xxx ");'として作成されます。私はログにアクセスしようとします、ありがとう。 – mcmil

0

問題はパラメータ内にしか記述できません。

SQL Server上でvarcharとnvarcharのような奇妙なミックスアップがあるかもしれません。換言すれば、明示的にデータ型を設定してみてください。

0

は、この行を変更してください:

parameter.ParameterName = ":name_of_activity"; 

つまり

parameter.ParameterName = "name_of_activity"; 

にあなたの答えをありがとうございましたコロン文字

関連する問題