The*_*ude 0 c# parameterized-query
根据我的理解,下面的代码应该创建一个参数化语句并为该参数添加一个值.参数为"@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;
Run Code Online (Sandbox Code Playgroud)
我的测试用例的期望结果是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')
Run Code Online (Sandbox Code Playgroud)
我应该可以使用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')`
Run Code Online (Sandbox Code Playgroud)
但事实并非如此.它留下的@exp好像是我想要比较的值[Primary Exp]和[Secondary Exp].那是对的吗?
我已经看到了多种方法,但我一般都遵循这里的例子
我不认为这是问题,但这是我使用查询的方式.
SQl_Reader = SQl_Command.ExecuteReader();
int numRows = 0;
while(SQl_Reader.Read()){
numRows = Convert.ToInt32(SQl_Reader["MyCount"]);
}
Run Code Online (Sandbox Code Playgroud)
我确信这是一件很简单的事我想念但我却无法看到它.
你在这里处理变量,SQL对象不只是执行"更安全"的搜索和替换.将您的代码更改为:
SQl_Command.CommandText = "SELECT COUNT(*) As MyCount FROM members WHERE
([Primary Exp] = @exp) AND ([Approved] = 'True') OR
([Approved] = 'True') AND ([Secondary Exp] = @exp)";
Run Code Online (Sandbox Code Playgroud)
你应该发现你现在得到了正确的价值; 使用您的原始版本,它实际上已经搜索了字符串'@exp'.
请注意,SQL参数和命令本身仅在执行期间组合,作为调用SQL Server的一部分.所以当你看到即使在添加参数后@exp仍然显示CommandText,这实际上是正确的.
| 归档时间: |
|
| 查看次数: |
114 次 |
| 最近记录: |