0

我已经毫无问题地使用了参数化查询,但是今天我遇到了一个我无法调试的错误。这是我的工作查询

cmd.CommandText = "select idcliente, ragsociale from Clienti where idcliente =" & strName & " or codiceamministrazione='" & strName & "' or piva='" & strName & "' or codfisc='" & strName & "'"

相同,但有参数,不起作用

cmd.CommandText = "select idcliente, ragsociale from Clienti where idcliente = @Cliente or codiceamministrazione=@Cliente or piva=@Cliente or codfisc=@Cliente"
cmd.Parameters.AddWithValue("@Cliente", strName)

我在一个自动完成程序中使用它,该程序根据内部 id 或商业许可证号(和其他类似代码)显示客户的名称。在 db 上,客户端记录可以编译所有代码字段,也可以只编译 1 个。

使用非参数化查询会弹出自动完成建议,而使用参数化的查询则什么都不会显示。也没有错误。

编辑: 使用这个

cmd.Parameters.Add("@Cliente", SqlDbType.VarChar)
cmd.Parameters("@Cliente").Value = strName

现在,同一个函数中的另一个查询(之前省略了)可以工作,但是,奇怪的是,我做这个问题的那个没有。

在职的:

cmd.CommandText = "select idcliente, ragsociale from Clienti where ragsociale like '%'+@Cliente+'%' or codiceamministrazione=@Cliente"

还是行不通:

cmd.CommandText = "select idcliente, ragsociale from Clienti where idcliente = @Cliente or piva=@Cliente or codfisc=@Cliente"
4

1 回答 1

0

在您的原始查询中,在针对 进行测试时idcliente,您将strName其视为一个数字(没有引号),但对于所有其他字段,您将其视为一个字符串。所以你暗示它可能包含一个数字或一个字符串。这是有问题的,如果您键入一个数字,并且查询的参数化版本现在在所有情况下都将其视为字符串,那么它将与数据库中的数值不匹配idcliente,因此您可能不会得到任何结果。

澄清一下:如果您的输入是一个数字,但您的查询认为它是一个字符串(因为参数中的数据类型),它不会与数据库中的任何数字字段匹配。12345 != "12345".

您需要为这些场景定义单独的参数。您可以将相同的值传递给它们,但在一种情况下将参数的数据类型设置为 varchar,在另一种情况下设置为 int(您可能需要在执行此操作之前检查该值是否可以解析为数字,否则可能崩溃。在这种情况下,只需将其设置为 null 或 0 或不会意外匹配的东西)。

于 2017-09-04T21:40:11.893 回答