SQL参数化查询。添加不必要的参数

问题描述:

我使用参数化查询的项目,以防止SQL注入,我跑了与查询一个有趣的场景。我有一个查询,有时会有比其他更多的参数,即where子句更改。以下两个代码块在性能或其他方面是否有区别?这段代码在一个对象中,所以“变量”是属性,并且这两个方法都有权访问。SQL参数化查询。添加不必要的参数

在这一个我只添加参数,如果条件得到满足。

public bool TestQuery() 
    { 
     SqlCommand command = new SqlCommand(); 
     string query = GetQuery(command); 
     command.CommandText = query; 
     //execute query and other stuff 
    } 
    private string GetQuery(SqlCommand command ) 
    { 
     StringBuilder sb = new StringBuilder("SELECT * FROM SomeTable WHERE Active = 1 "); 
     if (idVariable != null) 
     { 
      sb.Append("AND id = @Id"); 
      command.Parameters.Add("@Id", SqlDbType.Int).Value = idVariable; 
     } 
     if (!string.IsNullOrEmpty(colorVariable)) 
     { 
      sb.Append("AND Color = @Color"); 
      command.Parameters.Add("@Color", SqlDbType.NVarChar).Value = colorVariable; 
     } 
     if (!string.IsNullOrEmpty(sizeVariable)) 
     { 
      sb.Append("AND Color = @Size"); 
      command.Parameters.Add("@Size", SqlDbType.NVarChar).Value = sizeVariable; 
     } 
     return sb.ToString(); 
    } 

在这个我每次添加所有参数,只添加where子句参数,如果条件满足。

public bool TestQuery() 
    { 
     SqlCommand command = new SqlCommand(GetQuery()); 
     command.Parameters.Add("@Id", SqlDbType.Int).Value = idVariable; 
     command.Parameters.Add("@Color", SqlDbType.NVarChar).Value = colorVariable; 
     command.Parameters.Add("@Size", SqlDbType.NVarChar).Value = sizeVariable; 
     //execute query and other stuff 
    } 
    private string GetQuery() 
    { 
     StringBuilder sb = new StringBuilder("SELECT * FROM SomeTable WHERE Active = 1 "); 
     if (idVariable != null) 
      sb.Append("AND id = @Id"); 
     if (!string.IsNullOrEmpty(colorVariable)) 
      sb.Append("AND Color = @Color"); 
     if (!string.IsNullOrEmpty(sizeVariable)) 
      sb.Append("AND Color = @Size"); 
     return sb.ToString(); 
    } 

根据一项测试,我做了其中任何一项都可以。我个人比较喜欢第二个,因为我觉得这是更清洁和更容易阅读,但我不知道是否有一些性能/安全性的原因,我不应该添加一点用都没有,并且可能会是空/空字符串参数。

+0

的第一选择将是我的偏好。它将这些参数与使用它们的代码一起保存,并且应该使得无意中参考参数变得更加困难,例如,当有人在做维护时。它也避免了如何填充你可能没有值的参数(或值很昂贵),但不会在查询中使用。一般来说,性能和安全性不应该受到任何影响。如果代码被修改为允许SQL注入,则聪明(ab)用户可以访问_any_提供的参数,即使您不使用它们。 – HABO 2013-02-15 20:59:47

我想我会用一个选项每HABO的评论去,然后因为beargle的回答并没有真正在我的处境工作..