3

查询有什么变化SqlCommand.Parameters.AddWithValue()

我希望:

  1. '它将每个字符替换为'',

  2. 如果参数值是字符串或必须转换为字符串的东西,它会用 包围该值',例如select * from A where B = @hello将给出select * from A where B = 'hello world'

  3. 如果参数值是像整数这样“安全”的东西,它会按原样插入查询中,不带引号,所以select * from A where B = @one会给出select * from A where B = 1.

还有其他我不知道的变化吗?

4

2 回答 2

7

ADO.NET SqlClient 驱动程序不会做任何替换!这是一个常见的误解——它避免了更换任何东西的麻烦。

它所做的是将带有参数的查询@param1 ... @paramN以及参数名称/值对的集合直接传递给 SQL Server。SQL Server 然后使用sp_executesql存储过程执行那些。

从来没有做过任何替换,在客户端没有“将完整的 SQL 语句串在一起”——没有类似的东西。如果这就是 ADO.NET 运行时所做的事情,那么它也很容易受到 SQL 注入攻击。

于 2010-07-14T03:24:58.437 回答
0

简短的回答是,使用它会在 SqlParameterCollection 的末尾添加一个值,同时使您的参数值免受 SQL 注入的影响。

MSDN 文档没有记录该方法的确切内部行为,我怀疑它是否符合您的描述。但是,如果您愿意,您可以使用Reflector查看该方法的源代码,并确切了解它的作用。

于 2010-07-14T03:25:33.217 回答