我在项目中使用参数化查询来防止SQL注入,我遇到了一个有趣的查询方案。我有一个查询,有时会有比其他更多的参数,即where子句更改。在以下两个代码块之间是否存在性能或其他方面的差异?这段代码在一个对象里面,所以"变量"是属性,两种方法都可以访问。
在这个中我只在条件满足时才添加参数。
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();
}
根据测试我做了其中任何一个都可以。我个人更喜欢第二个,因为我觉得它更干净,更容易阅读,但我想知道是否有一些性能/安全性原因我不应该添加不使用的参数并且可能正在使用为null /空字符串。
答案 0 :(得分:1)
我想我会根据HABO的评论选择一个,因为在我的情况下,熊的回答并不真正有效。