SELECT WHERE抛出OleDbException

时间:2012-04-04 14:03:21

标签: c# tsql

我现在已经挣扎了半个小时了。

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&中的语法错误(缺少运算符) 70年代(Α) ''。 我不能因为上帝的爱而理解为什么会抛出异常。

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分: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);