创建一个参数化查询,该查询允许以字符串形式存储的用户输入与数据库字段进行比较

本文关键字:查询 用户 存储 输入 比较 字段 数据库 字符串 一个 参数 创建 | 更新日期: 2023-09-27 18:28:46

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

如果能在这个问题上提供任何帮助,我将不胜感激。如果我在上面的解释中说了一些错误的地方,请告诉我,如果你能解释我为什么错了。

创建一个参数化查询,该查询允许以字符串形式存储的用户输入与数据库字段进行比较

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

很抱歉将此作为答案发布,但我没有资格将其作为评论发布:)