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();
}
根据一项测试,我做了其中任何一项都可以。我个人比较喜欢第二个,因为我觉得这是更清洁和更容易阅读,但我不知道是否有一些性能/安全性的原因,我不应该添加一点用都没有,并且可能会是空/空字符串参数。
答
我想我会用一个选项每HABO的评论去,然后因为beargle的回答并没有真正在我的处境工作..
的第一选择将是我的偏好。它将这些参数与使用它们的代码一起保存,并且应该使得无意中参考参数变得更加困难,例如,当有人在做维护时。它也避免了如何填充你可能没有值的参数(或值很昂贵),但不会在查询中使用。一般来说,性能和安全性不应该受到任何影响。如果代码被修改为允许SQL注入,则聪明(ab)用户可以访问_any_提供的参数,即使您不使用它们。 – HABO 2013-02-15 20:59:47