Vb 2015 年查询参数无效
Vb 2015 query with parameters not working
我已经毫无问题地使用了参数化查询,但今天我遇到了无法调试的错误。
这是我的工作查询[=16=]
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"
在您的原始查询中,当针对 idcliente
进行测试时,您将 strName
视为一个数字(没有引号),但对于所有其他字段,您将其视为一个字符串。所以你暗示它可能包含一个数字或一个字符串。这是有问题的,如果您键入一个数字,并且查询的参数化版本现在在所有情况下都将其视为字符串,那么它将与数据库中 idcliente
的数值不匹配,因此您可能会得到没有结果。
澄清一下:如果您输入的是一个数字,但您的查询认为它是一个字符串(因为参数中的数据类型),它不会与数据库中的任何数字字段匹配。 12345 != "12345"
。
您需要为这些场景定义单独的参数。您可以将相同的值传递给它们,但在一种情况下将参数的数据类型设置为 varchar,在另一种情况下设置为 int(您可能需要在执行此操作之前检查该值是否可以解析为数字,否则它可能崩溃。在那种情况下,只需将其设置为 null 或 0 或不会进行意外匹配的内容)。
我已经毫无问题地使用了参数化查询,但今天我遇到了无法调试的错误。 这是我的工作查询[=16=]
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"
在您的原始查询中,当针对 idcliente
进行测试时,您将 strName
视为一个数字(没有引号),但对于所有其他字段,您将其视为一个字符串。所以你暗示它可能包含一个数字或一个字符串。这是有问题的,如果您键入一个数字,并且查询的参数化版本现在在所有情况下都将其视为字符串,那么它将与数据库中 idcliente
的数值不匹配,因此您可能会得到没有结果。
澄清一下:如果您输入的是一个数字,但您的查询认为它是一个字符串(因为参数中的数据类型),它不会与数据库中的任何数字字段匹配。 12345 != "12345"
。
您需要为这些场景定义单独的参数。您可以将相同的值传递给它们,但在一种情况下将参数的数据类型设置为 varchar,在另一种情况下设置为 int(您可能需要在执行此操作之前检查该值是否可以解析为数字,否则它可能崩溃。在那种情况下,只需将其设置为 null 或 0 或不会进行意外匹配的内容)。