0

我几乎 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,因为没有条目具有该经验。

我将不胜感激有关此问题的任何帮助。如果我在上面的解释中陈述了错误的内容,请告诉我,如果你能解释我为什么错了。

4

1 回答 1

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 发送到数据库的查询的差异

很抱歉将其发布为答案,但我没有将其发布为评论的声誉:)

于 2013-08-23T08:28:15.523 回答