2013-02-15 60 views
3

我使用參數化查詢的項目,以防止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

回答

0

我想我會用一個選項每HABO的評論去,然後因爲beargle的回答並沒有真正在我的處境工作..