sql
  • vb.net
  • visual-studio-2015
  • sql-parametrized-query
  • 2017-09-04 65 views 0 likes 
    0

    我已经使用参数化查询并没有问题,但是今天我遇到了一个我无法调试的错误。 这是我工作的查询带有参数不起作用的Vb 2015查询

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

    相同,但参数,而不是基于内部ID或商业工作

    cmd.CommandText = "select idcliente, ragsociale from Clienti where idcliente = @Cliente or [email protected] or [email protected] or [email protected]" 
    cmd.Parameters.AddWithValue("@Cliente", strName) 
    

    我自动完成过程中使用此,显示了客户端的名称许可证号码(和其他类似的代码)。在数据库客户端记录可以有所有的代码字段编译或只是1.

    随着非参数化查询自动完成建议弹出,与参数化的一个没有显示。没有错误。

    编辑: 使用相同的功能这

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

    现在另一个查询(semplicity前省略)的作品,但是,自叹不如,一个为我所做的这个问题没有。

    工作:

    cmd.CommandText = "select idcliente, ragsociale from Clienti where ragsociale like '%'[email protected]+'%' or [email protected]" 
    

    仍无法正常工作:

    cmd.CommandText = "select idcliente, ragsociale from Clienti where idcliente = @Cliente or [email protected] or [email protected]" 
    
    +0

    你知道你可以将其重写为'where @Cliente in(idcliente,codiceamministrazione,piva,codfisc)' –

    +0

    请不要使用.AddWithValue!我认为,这是问题所在。 – muffi

    +0

    [Joel Coehoorn的博客文章](https://blogs.msmvps.com/jcoehoorn/blog/2014/05/12/can-we-stop-using-addwithvalue-already/)重申muffi的言论。 –

    回答

    0

    在原来的查询,对idcliente测试时,你把strName数字(不包括引号轮),但所有其他领域你把它当作一个字符串。所以你暗示它可能包含一个数字或一个字符串。这是有问题的,如果您键入一个数字,并且查询的参数化版本现在在所有情况下都将其视为字符串,那么它将与数据库中的idcliente的数值不匹配,因此您可能不会得到任何结果。要明确:如果你的输入是一个数字,但你的查询认为它是一个字符串(因为param中的数据类型),它不会与数据库中的任何数字字段相匹配。 12345 != "12345"

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

    相关问题