我已经为此挣扎了半个小时了。
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
}
}
}
}查询表达式'1stMusicType = 'Ε.60's & 70's(Α)'‘中出现OleDbException:语法错误(缺少运算符)。看在上帝的份上,我不明白为什么会抛出异常。
发布于 2012-04-05 15:30:35
当我回到家测试参数化命令时,斗争仍在继续。最终,我找到了导致异常的原因。
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-04 22:05:59
类别名称中的撇号(')中断了查询中的字符串:
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);https://stackoverflow.com/questions/10012721
复制相似问题