我几乎 100% 确定我的问题是在将 nvarchar 值作为我的搜索键添加到参数化查询时引起的。问题出现了,如果我有撇号的周围@exp
是我的占位符,则查询被解释为@exp 是我的搜索键而不是占位符。我会删除撇号,除非查询在语法上不正确,除非搜索键被撇号包围。有人向我解释说,我不能只将撇号添加到插入参数的值中,因为已经评估了执行计划,并且搜索键值实际上是“西班牙文”而不是西班牙文。我的问题是如何解决这个问题。有关该问题的更广泛背景,请参阅下面的说明。
正如标题所述,我有两个动态查询,一个使用参数化,一个不使用,这两个查询都是为了做同样的事情。查询用于返回具有特定语言的主要或次要经验的成员数量。
话虽这么说,查询是这样设置的。连接设置正确,并且String exp
在两个查询中使用的值都被硬编码为西班牙语以进行测试。
不使用参数化:
SQl_Command.CommandText = "SELECT COUNT(ID) As MyCount FROM members WHERE ([Primary Exp] = '" + exp + "') AND ([Approved] = 'True') OR ([Approved] = 'True') AND ([Secondary Exp] ='" + exp + "')";
使用参数化:
SQl_Command.CommandText = "SELECT COUNT(ID) 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).Value = exp;
我也试过:
SqlParameter param = new SqlParameter("@exp", SqlDbType.NVarChar, 255);
param.Value = exp;
SQl_Command.Parameters.Add(param);
我相当确定该错误与我如何将值添加到参数或如何将参数添加到 SqlCommand 在上下文中我需要撇号围绕搜索键有关。如果我当时在 CommandText 中放置了撇号,我还放置了查询运行的占位符 put 返回 0。打印出我得到的命令文本
`SELECT COUNT(ID) As MyCount FROM members WHERE ([Primary Exp] = '@exp') AND ([Approved] = 'True') OR ([Approved] = 'True') AND ([Secondary Exp] = '@exp')`
这意味着它正在搜索具有 @exp 经验的成员,这将返回 0,因为没有条目具有该经验。
我将不胜感激有关此问题的任何帮助。如果我在上面的解释中陈述了错误的内容,请告诉我,如果你能解释我为什么错了。