2009-12-16 86 views
11

我试图对使用LIKE关键字和通配符的搜索查询进行参数化。原来的SQL具有动态SQL这样的:如何在Sql Server精简版中使用LIKE参数

"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中使用参数?

+0

全面查询: @ “SELECT * FROM JOB WHERE DELETED = false AND JOB_POSTCODE LIKE'”+ isPostCode +'%'“ – Colin 2009-12-16 17:37:33

回答

21

简而言之,您应该将通配符放在参数的值中,而不是放在CommandText中。即

不是: 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注入:

//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"); 

感谢所有的投入,对原误导问题,对不起......

+1

SQLCE(或更可能是提供者)必须在内联表达式中遇到问题 - 这可能是提供程序抛出错误的原因。我没有SQLCE的测试平台,甚至没有注意到这是一个真正的SQL CE问题,直到我已经发布我的第一个答案:-( – 2009-12-17 15:29:04

+0

Cade,感谢您的输入。它帮助我坚持使用我的代码和测试,并帮助我走向代码而不是sql。 – Colin 2009-12-18 21:35:28

2

使用:

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

...是指字符串被上涨到动态SQL之前建造。这样,您就不必在sp_executesql/EXEC的参数列表中指定参数,而此时:

"AND JOB_POSTCODE LIKE @postcode + '%' " 

...确实。请发布更多的查询。

+1

动态SQL的作品,但我想用一个参数来防止SQL注入,我不能让它工作 – Colin 2009-12-16 17:39:33

1

请发布您的完整示例(包括您正在组装您的呼叫的外部客户端代码)。如果您正确传递参数,则第二个和第三个选项都应该可以工作。你是在一个存储过程还是内联的参数化SQL中调用它?

我不承担任何的SP,因为我刚才看到你正在使用CE ...

我认为你需要add a length to your .Add call,因为它是一个nvarchar

+0

你是对的,没有SP。它是内联参数化的sql。我编辑了这个问题,添加了将参数添加到命令的行。 SqlDbType.NVarChar可能是问题吗? – Colin 2009-12-16 19:40:25

+0

凯德,我试图增加长度,发现它没有区别,但在更多的测试中,我发现第三个选项是工作。我很抱歉。请参阅我发布的所有详细信息。我很好奇为什么第二个选项不起作用......... – Colin 2009-12-17 10:24:00

3

这将在SQL Server 05中返回适当的结果(也可以用SP包装),所以它看起来像是你尝试过的最后一件事情。但是我没有Compact Edition的测试平台,所以也许这会有所作为(我会很好奇,看看是否如此,为什么)。

declare @p1 nvarchar(50) 
set @p1 = 'f'   -- initial value passed from your app 
set @p1 = @p1 + '%' -- edit value for use with LIKE 
select * from JOB 
where JOB_POSTCODE like @p1 

编辑:

什么版本SQLCE您使用的是?你能否告诉你的参数值是否真的从代码传递给数据库?我浏览了this MSDN tutorial,并至少从Visual Studio查询设计器中获得了要查找的结果。 (唯一的区别是我使用VS 2008和SQL Server Compact 3.5)。请参阅标题为“创建新查询”的部分;我用一些数据嘲笑了一个表,这个查询按照你的意图工作。

SELECT  JobID, PostCode, OtherValue 
FROM   Job 
WHERE  (PostCode LIKE @p1 + '%') 

就像我说的,我没有写任何代码来调用查询,但它在设计器中工作。换句话说,“它在我的机器上运行”。

+0

Sql Server CE不允许命名参数,并且declare关键字不存在,所以我不能使用你的sql 。我不知道如何在Management Studio中分配未命名的参数。我正在试试这个: SELECT * FROM JOB WHERE JOB_POSTCODE LIKE? +'%','G20' 但语法不正确 – Colin 2009-12-16 19:37:37

+1

@Colin,我想我从你的评论中学到的比你从我的答案中得到的更多;) - 也许编辑有帮助? – Matt 2009-12-16 22:00:10

+0

Matt, 感谢您的链接,现在我将能够测试代码之外的参数化查询(我一直试图在Management Studio中执行此操作,而不是Server Explorer)。我不认为这个错误来自SqlServerCE,我认为它来自.NET Compact Framework数据提供程序 - 请参阅我为错误文本发布的答案。为了记录我正在使用VS2005和Sql Server Compact 3.5 – Colin 2009-12-17 10:20:23

-1

你的答案是:

"AND JOB_POSTCODE LIKE '' + @postcode + '%' " 

和参数:

command.Parameters.Add("@postcode", SqlDbType.NVarChar).Value = isPostCode; 
相关问题