1

私はこれで30分も苦労しています。

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:クエリ式 '1stMusicType ='Ε.60's&70's(Α)''で構文エラー(演算子がありません)が発生します。神の愛のために、なぜ例外がスローされるのか理解できません。

4

2 に答える 2

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 MusicCategory=@MusicCategory";
var cmd = new OleDbCommand(select_cmd, con);
var prm = new OleDbParameter("@MusicCategory", category);
cmd.Parameters.Add(prm);
于 2012-04-04T14:05:58.783 に答える
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); 
于 2012-04-05T07:30:34.523 に答える