我几乎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中放入撇号,我还将占位符放在查询运行中,则返回0.打印出我得到的命令文本
`SELECT COUNT(ID) As MyCount FROM members WHERE ([Primary Exp] = '@exp') AND ([Approved] = 'True') OR ([Approved] = 'True') AND ([Secondary Exp] = '@exp')`
意味着它正在搜索具有@exp经验的成员,这些成员将返回0,因为没有条目具有该经验。
对此问题我感谢任何帮助。如果我在上面的解释中说了一些错误,请告诉我,如果你能解释为什么我错了。
答案 0 :(得分:2)
如Chris所述,您不需要参数化版本的撇号,因为您声明它是NVarChar类型。虽然,我注意到在你的非参数化版本中,你没有搜索NVarChar字符串,因为这将是
SQl_Command.CommandText = "SELECT COUNT(ID) As MyCount FROM members WHERE ([Primary Exp] = N'" + exp + "') AND ([Approved] = 'True') OR ([Approved] = 'True') AND ([Secondary Exp] = N'" + exp + "')";
另一方面,参数化版本将使用NVarChar字符串自动搜索,因为这是指定的类型。这可能是两者之间结果集不同的原因,具体取决于您保存数据的方式(您可能将其保存为VarChar字符串而不是NVarChar吗?),以及数据是否包含Unicode字符。
您可能还想查看使用SQL Server Profiler发送到数据库的查询的差异
抱歉将此作为答案发布,但我没有将其作为评论发布的声誉:)