2017-11-03 2 views
0

パラメータ化されたクエリ(C#OleDBライブラリ)の構文を思い出していましたが、私が直面した最初の2つの例は簡単でしたが、構文について何か気づいた:クエリにパラメータを追加するための構文

sqlCommand.CommandText = "SELECT * FROM Customer WHERE Name LIKE @Name;"; 
sqlCommand.Parameters.AddWithValue("@Name", "%" + searchString + "%"); 

私が気づいたのは、パラメータで置き換えられるものを特定するためのSQL形式が、私が通常使っていたものと異なっていたことです。私は通常、コロンと角括弧を使用します。今

sqlCommand.CommandText = "SELECT * FROM Customer WHERE [Name] LIKE :Name;"; 
sqlCommand.Parameters.AddWithValue(":Name", "%" + searchString + "%"); 

を、私は「@」を見ていた2つの例は、私が正常にのみアクセスおよびオラクルと連携SQLサーバ例、からのものでした。しかし、他のアクセス例も '@'を使って見ました。

実際には違いがありますか、それともスタイルのことですか?私は(少なくともアクセスを使用して)エンジンがパラメータ名を無視し、リストされた順序でパラメータを挿入することを思い出します。 (?)

OLE DB.NET Frameworkデータプロバイダーは疑問符が付いている位置パラメータの代わりに、名前付きパラメータを使用しています:

私はMSDNから注意してください。

これは、パラメータ名/構文が問題ではなく、無視されるという私の見解を強調しています。しかし、これが正しかったとしても、他のフレームワークなどに対してより堅牢性を提供する良い習慣がありますか?

+0

OLEDBでは、パラメータ用のsigilは(予約文字を使用しない限り)重要ではなく、単にパラメータを使用するスタイルを定義します。クエリ内にパラメータ名を指定することをお勧めしますが、実際には最初に宣言されたすべてのクエリパラメータが処理されます。 –

答えて

1

明らかに、クエリをパラメータ化することは、SQLインジェクションを防ぐために重要です。異なるデータベースは、異なる構文を使用してパラメータを使用します。たとえば、SQL Serverではパラメータのプレースホルダとして "@"が使用されますが、DOESではパラメータの名前が付けられます。同様に、名前付きプレースホルダとしても ":"を使用することがあります。ただし、OleDBでは、単一の "?"プレースホルダとして指定されていません。したがって、クエリコマンドで表すとおり、パラメータを正確な順序で追加する必要があります。

また、NAMEDパラメータを使用すると、カラムとパラメータが同じであれば、意図したとおりに動作しない可能性があります。 。明確にするために、接頭辞(または接尾辞)を付けてパラメータの名前を変更してください。このような例があるかもしれません。

sqlCommand.CommandText = "update MyCustomerTable set email = @email where customerID = @customerID"; 

sqlCommand.Parameters.AddWithValue("email", "[email protected]"); 
sqlCommand.Parameters.AddWithValue("customerID", someIDValue); 

また、実際には名前付きパラメータに "@"または ":"を含めません。エンジンはそれらをどのように扱うか知っているでしょう。

すべてがうまく見えますが、「パラメータ」が見つからない場合、あいまいさを防ぐために、列名に戻ってみてください。

sqlCommand.CommandText = "update MyCustomerTable set email = @parmEmail where customerID = @parmCustomerID"; 

sqlCommand.Parameters.AddWithValue("parmEmail", "[email protected]"); 
sqlCommand.Parameters.AddWithValue("parmCustomerID", someIDValue); 

このように混乱はありません。

ここで、 "?"プレースホルダー。複数回適用される単一のパラメータ値がある場合、各インスタンスのパラメータを追加する必要があります。名前付きパラメータが許可されている場合、あなたは...と

sqlCommand.CommandText = 
@"update SomeTable 
    set Rate1 = Rate1 * @newRateFactor, 
     Rate2 = Rate2 * @newRateFactor"; 

    sqlCommand.Parameters.AddWithValue("newRateFactor", 1.15); 

お知らせつだけという名前のパラメータが必要とされるが逃げるかもしれない...しかし、「?」と、あなたはそれを毎回追加する必要が

sqlCommand.CommandText = 
@"update SomeTable 
    set Rate1 = Rate1 * ?, 
     Rate2 = Rate2 * ?"; 

    sqlCommand.Parameters.AddWithValue("ratePlaceHolder1", 1.15); 
    sqlCommand.Parameters.AddWithValue("ratePlaceHolder2", 1.15); 

SQLの挿入や更新のようなことは、すべての列名に対して多数のパラメータを設定すると難しくなります。パラメータNAMEの値を指定することはできますが、クエリの実行順序は同じでなければなりません。

0

これは、パラメータ名/構文が問題ではなく、無視されるという私の見解を強調しています。

これは確かに真実ではありません。使用しているパラメータの接頭辞は問題ありませんが、ODBCは多くのプラットフォームをサポートしなければならないので、少し面倒です。それはあなたをかむので、あなたはただのゴミを投げ入れることはできますが、決して決して捨てません。

実際にOLE DBのパラメータには?を使用する必要があります。パラメータを指定するときに指定した名前は無視されます。順序はすべて重要です。

+0

ありがとうございます - あなたが意味することを明確にすることができますか? "本当にOLE DBのパラメータに'? 'を使用する必要がありますか?私はいくつかの '? '構文を見たことがありますが、それを使ったことはありません。 – ainwood

関連する問題