我已经使用了参数化查询没有问题,但今天我遇到了一个无法调试的错误。 这是我的工作查询
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或商业许可证号(以及其他类似代码)显示客户端的名称。在数据库上,客户端记录可以编译所有代码字段,或者仅包含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"
答案 0 :(得分:0)
在原始查询中,当针对idcliente
进行测试时,您将strName
视为一个数字(没有引号括起来),但对于所有其他字段,您将其视为字符串。因此,您暗示它可能包含数字或字符串。这是有问题的,如果你输入一个数字,并且查询的参数化版本现在在所有情况下都将它视为一个字符串,那么它就不会匹配数据库中idcliente
的数值,因此你可能没有结果。
澄清一下:如果您的输入是一个数字,但您的查询认为它是一个字符串(因为参数中的数据类型),它将与数据库中的任何数字字段不匹配。 12345 != "12345"
。
您需要为这些方案定义单独的参数。您可以将相同的值传递给它们,但在一种情况下,将参数的数据类型设置为varchar,在另一种情况下将其设置为int(您可能需要在执行此操作之前检查该值是否可以解析为数字,否则它可能会崩溃。在这种情况下,只需将其设置为null或0或不会发生意外匹配的事情。)