1

我已经为此苦苦挣扎了半个小时。

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 回答