具有特殊字符的LIKE查询会导致“无效的模式字符串”异常

时间:2013-11-12 11:09:34

标签: c# sql winforms ms-access

当我使用Like Query搜索特殊字符时,

winform应用程序崩溃。

strSQL = @"SELECT Patient_ID_Internal ,Patient_ID ,Patient_Title, Patient_Name,
                  Patient_MiddleName_Name, Patient_BirthDate,
                  Patient_RegDate,Patient_UIDNumber 
           FROM Patient_Master 
           WHERE Patient_ID LIKE +@paramPatient_ID +'%'
               AND Patient_Name LIKE +'%'+ @paramPatient_Name +'%'";

objOleDbCommand = new OleDbCommand(strSQL,
    Common.OleDbCommObject.OleDbConnectionObject);
objOleDbCommand.Parameters.AddWithValue("@paramPatient_ID", txtPatientId.Text);
objOleDbCommand.Parameters.AddWithValue("@paramPatient_Name", txtPatientName.Text);

在我传递特殊字符(例如([],!,@ etc)时的相似参数中,它崩溃会给我一个错误无效的模式字符串并且还传递%作为参数它给了我一个来自DB的全部记录。

1 个答案:

答案 0 :(得分:3)

方括号在Access SQL LIKE表达式中具有特殊含义(参考:here),因此单个[字符必须转义为[[]。例如,以下代码段将失败并显示“无效的模式字符串”...

cmd.CommandText =
    "SELECT * FROM Clients WHERE LastName LIKE ?";
string s = "%abc[def%";  // test data
cmd.Parameters.AddWithValue("?", s);
OleDbDataReader rdr = cmd.ExecuteReader();

然而这将起作用

cmd.CommandText =
    "SELECT * FROM Clients WHERE LastName LIKE ?";
string s = "%abc[def%";  // test data
cmd.Parameters.AddWithValue("?", s.Replace("[", "[[]"));
OleDbDataReader rdr = cmd.ExecuteReader();