我现在已经挣扎了半个小时了。
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年代(Α) ''。 我不能因为上帝的爱而理解为什么会抛出异常。
答案 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);