2012-04-04 4 views
1

私はこれで30分苦労しました。 構文エラー(演算子がありません)クエリ式 '1stMusicType = 'Ε.60の& 70年代(Α)'' で:OleDbExceptionがスローされた場所を選択

using(con) 
{ 
    con.Open();  

    foreach(string category in categories) 
    { 
     string select_cmd = "SELECT FileName FROM Songs WHERE MusicCategory=\'" + category + "\'"; 
     var cmd = new OleDbCommand(select_cmd, con); 
     using(OleDbDataReader reader = cmd.ExecuteReader()) 
     { 
      while(reader != null && reader.Read() 
      { 
      // do some work 
      } 
     } 
    } 
} 

私はOleDbExceptionを取得しています。 私は神の愛がなぜ例外がスローされるのか理解できません。

+3

あなたはパラメータ化クエリを使用する必要があります –

答えて

1

私がパラメータ設定されたコマンドをテストするために家に帰っても、闘争は続いた。最終的に私は例外を引き起こしていたものを見つけました。

OleDbCommandは、 '?'を使用することになっています。名前付きの '@param'パラメータの代わりに、私は両方の方法で動作させました。私が角括弧でMusicCategoryをラップしなかったので、例外がスローされたことがわかります。

SQLクエリのために働い構文は次のとおりです。

string select_cmd = "SELECT FileName FROM Song WHERE [MusicCategory] = ?" 
var cmd = new OleDbCommand(select_cmd, con); 
cmd.Parameters.AddWithValue("param", category); 
2

アポストロフィの(')カテゴリ名の中のクエリ文字列を抜け出している:

SELECT FileName FROM Songs WHERE MusicCategory='Ε.60's & 70's(Α)' 
                ^this breaks out of the string 

だから、あなたはそれらの文字

MusicCategory=\'" + category.Replace(@"'", @"''") + ... 

をエスケープする必要があるが、これは簡単にできましたユーザーの入力値をクエリーに入れるための推奨事項であるパラメーターを使用することで、より堅牢になりました。

string select_cmd = "Select FileNAme From songs where [email protected]"; 
var cmd = new OleDbCommand(select_cmd, con); 
var prm = new OleDbParameter("@MusicCategory", category); 
cmd.Parameters.Add(prm); 
+0

右、ありがとうございました。 – Pantelis

+1

string.replaceメソッドが実際には機能していません。私はパラメータ化されたコマンドでそれをやった。 – Pantelis

関連する問題