2009-03-19 13 views
17

LIKE %%コマンドを含むクエリのC#でパラメータクエリのSQLを作成しようとしています。ここでC#でパラメータのクエリを構築するSQL - LIKE%

は私がacheiveしようとしているものです(データベースが火の鳥であることに注意してください)

var SQL = string.format("SELECT * FROM {0} WHERE {1} LIKE '%?%'", TABLE, NAME); 
cmd.Parameters.AddWithValue(NAME, "JOHN"); 

今私は、私が試してみました、パラメータが仕事を得るためにすべての単一の順列を試してみました。

  • 追加パラメータに%文字、

    cmd.Parameters.AddWithValue(NAME, "%" + "JOHN" + "%"); 
    
  • または

    cmd.Parameters.AddWithValue(NAME, "'%" + "JOHN" + "%'"); 
    
    私は、パラメータを使用することができますどのように私はこの仕事を得るように見えることはできません

、 LIKEクエリが機能します。

提案は大歓迎です!

+0

どこにコマンドにSQLを割り当てている、いくつかの不足しているコードがあるように思えますか? 取得しているエラーは何ですか? –

+0

はい、SQLはCmd.CommandTextパラメーターに割り当てられています。 –

答えて

26

クエリ内の文字列リテラル内にパラメータを設定することはできません。全体の値にパラメータを作成し、文字列にワイルドカードを追加します。

var SQL = string.format("SELECT * FROM {0} WHERE {1} LIKE ?", TABLE, NAME); 
Cmd.Parameters.AddWithValue(NAME, "%" + "JOHN" + "%"); 
+0

例は?私のコードをコピーしたようです。 –

+0

細心の注意を払う:彼はワイルドカードをパラメータに移動しました。これはうまくいくが、間違ったやり方だ。 –

+0

@マイヤード:そこにしかないことに注意してください。 like演算子の後にはワイルドカード文字はなく、アポストロフィは付きません。 – Guffa

-5

過去にこれを実行していたとき、私は単純にSQLに統合しました.SQLインジェクションに対処するために、単一引用符を疑問符に置き換えています。例:

var SQL = string.format("SELECT * FROM {0} WHERE {1} LIKE '%{2}%'", 
    TABLE, 
    NAME, 
    JOHN.Replace("'","?")); 
+1

引用符を含む正当な検索が実際に機能するように、単一引用符を2つの単一引用符に置き換える方がよいでしょう。 'Replace(" '"、"' '")' – Blorgbeard

+2

それはSQLインジェクション攻撃にさらされます – Ricibald

4
var SQL = string.Format("SELECT * FROM {0} WHERE {1} LIKE '%' + ? + '%'", TABLE, NAME); 
Cmd.CommandText = SQL; 
Cmd.Parameters.Add("?", SqlDbType.VarChar, 50).Value = "JOHN"; 
+0

はこのSQLがFirebirdに有効ですか? –

+0

ファイアバードの要件が見当たりませんでした。私はそれが大丈夫ですが、SqlDbType列挙型はSql Server用であったため、パラメータコードが間違っていることを確認するためにsqlを更新しました。私はまだAddWithValueを避けたいですが、 –

+0

これは私のためにはうまくいきません。私は次のエラーが発生しています。 FirebirdSql.Data.FirebirdClient.FbException:動的SQLエラー 式評価がサポートされていません ----> FirebirdSql.Data.Common.IscException: 'FirebirdSql.Data.Common.IscException'タイプの例外がスローされました。 –

関連する問題