我正在尝试参数化使用LIKE关键字和通配符的搜索查询。原始sql具有如下所示的动态sql:

"AND JOB_POSTCODE LIKE '" + isPostCode + "%' "

所以我尝试了这个,但是却得到了FormatException:
"AND JOB_POSTCODE LIKE @postcode + '%' "

编辑:我猜想FormatException不会来自Sql Server CE,所以根据要求,这是我在C#代码中设置参数的方式。该参数是在代码中设置的,如下所示:
command.Parameters.Add("@postcode", SqlDbType.NVarChar).Value = isPostCode;

我也尝试过:
"AND JOB_POSTCODE LIKE @postcode"


command.Parameters.Add("@postcode", SqlDbType.NVarChar).Value = isPostCode + "%";

但这不会返回任何结果。任何人都可以建议如何在此搜索sql中使用参数吗?

最佳答案

简短的答案是,您应该将通配符放在参数的Value中,而不要放在CommandText中。 IE。

不是那个:sqlCommand.CommandText = "SELECT * FROM JOB WHERE JOB_POSTCODE LIKE @postcode%"
这:

sqlCommand.CommandText = "SELECT * FROM JOB WHERE JOB_POSTCODE LIKE @postcode";
sqlCommand.Parameters.Add("@postcode", SqlDbType.NVarChar).Value = postCode + "%";

在这里长答案:

我回过头,将代码分解为基本内容,以便可以将其发布在此处,同时,我发现我在原始问题中尝试的最后一种方法确实有效。在我的测试中一定出了点问题。因此,这是一个摘要,其中包含已运行的完整代码:

原始动态sql,容易受到sql注入(inject)的影响:
//Dynamic sql works, returns 2 results as expected,
//but I want to use parameters to protect against sql injection

string postCode = "G20";
sqlCommand.CommandText = "SELECT * FROM JOB WHERE JOB_POSTCODE LIKE '"
                         + postCode + "%'";
return Database.fGetDataSet(sqlCommand,
                            iiStartRecord,
                            iiMaxRecords,
                            "JOBVISIT");

首次尝试使用参数会产生错误:
//This syntax with a parameter gives me an error
//(note that I've added the NVarChar length as suggested:
//System.FormatException : @postcode : G20 -
//Input string was not in a correct format.
//at System.Data.SqlServerCe.SqlCeCommand.FillParameterDataBindings()
//at System.Data.SqlServerCe.SqlCeCommand.ExecuteCommandText(IntPtr& pCursor,
// Boolean& isBaseTableCursor)

string postCode = "G20";
sqlCommand.CommandText = "SELECT * FROM JOB WHERE JOB_POSTCODE LIKE @postcode
                         + '%'";
sqlCommand.Parameters.Add("@postcode",
                          SqlDbType.NVarChar,
                          10).Value = postCode;
return Database.fGetDataSet(sqlCommand, iiStartRecord, iiMaxRecords, "JOBVISIT");

第二种技术确实有效:
///This syntax with a parameter works, returns 2 results as expected
string postCode = "G20";
sqlCommand.CommandText = "SELECT * FROM JOB WHERE JOB_POSTCODE LIKE @postcode";
sqlCommand.Parameters.Add("@postcode", SqlDbType.NVarChar).Value = postCode
                                                                   + "%";
return Database.fGetDataSet(sqlCommand, iiStartRecord, iiMaxRecords, "JOBVISIT");

感谢您的所有输入,对于最初的误导性问题表示抱歉...

关于c# - 如何在SQL Server Compact Edition中将参数与LIKE一起使用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1916248/

10-11 03:32
查看更多