【发布时间】:2013-08-22 13:00:54
【问题描述】:
据我了解,以下代码应该创建一个参数化语句并向该参数添加一个值。参数为“@exp”以及添加到其中的值由用户输入确定。我将用户输入存储在String exp; 中(不是我的选择,其他人编写了这个函数的大部分内容)。
SQl_Command.CommandText = "SELECT COUNT(*) As MyCount FROM members WHERE ([Primary Exp] = '@exp') AND ([Approved] = 'True') OR ([Approved] = 'True') AND ([Secondary Exp] = '@exp')";
SQl_Command.Parameters.Add("@exp", SqlDbType.NVarChar, 255);
SQl_Command.Parameters["@exp"].Value = exp;
我的测试用例所需的结果是 16,但此查询返回 0。从 SQL Server 2008 运行时,查询有效,如下所示。
SELECT COUNT(*) As MyCount
FROM members
WHERE ([Primary Exp] = 'Risk Management')
AND ([Approved] = 'True') OR ([Approved] = 'True')
AND ([Secondary Exp] = 'Risk Management')
我应该能够使用Response.Write(SQl_Command.CommandText);,我选择了“风险管理”并且参数化查询应该打印出来:
SELECT COUNT(*) As MyCount
FROM members
WHERE ([Primary Exp] = 'Risk Management')
AND ([Approved] = 'True') OR ([Approved] = 'True')
AND ([Secondary Exp] = 'Risk Management')`
但它没有。它留下了@exp,好像这是我想比较 [Primary Exp] 和 [Secondary Exp] 的值。对吗?
我已经看到了多种方法,但我一般都在遵循示例 here
我认为这不是问题,但这就是我使用查询的方式。
SQl_Reader = SQl_Command.ExecuteReader();
int numRows = 0;
while(SQl_Reader.Read()){
numRows = Convert.ToInt32(SQl_Reader["MyCount"]);
}
我确定这是我缺少的一些简单的东西,但我无法看到它。
【问题讨论】:
-
您的期望是错误的 - 使用参数并不意味着客户端 SQL 代码会将这些参数替换为它们的实际值。参数作为参数发送到 SQL Server,包括它们的值在值列表中。这就是它的设计方式和设计方式 - 如果您希望在将查询发送到 SQL Server 之前将参数替换为其实际值,那您就错了。