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();
}
根據一項測試,我做了其中任何一項都可以。我個人比較喜歡第二個,因爲我覺得這是更清潔和更容易閱讀,但我不知道是否有一些性能/安全性的原因,我不應該添加一點用都沒有,並且可能會是空/空字符串參數。
的第一選擇將是我的偏好。它將這些參數與使用它們的代碼一起保存,並且應該使得無意中參考參數變得更加困難,例如,當有人在做維護時。它也避免瞭如何填充你可能沒有值的參數(或值很昂貴),但不會在查詢中使用。一般來說,性能和安全性不應該受到任何影響。如果代碼被修改爲允許SQL注入,則聰明(ab)用戶可以訪問_any_提供的參數,即使您不使用它們。 – HABO 2013-02-15 20:59:47