参数化查询执行时,它似乎没有参数值

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)

我确信这是一件很简单的事我想念但我却无法看到它.

Adr*_*agg 6

你在这里处理变量,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,这实际上是正确的.