【问题标题】:Handling SqlCommand null parameters in a select query in asp.net在 asp.net 中的选择查询中处理 SqlCommand 空参数
【发布时间】:2011-07-05 08:04:32
【问题描述】:

我有这个示例代码:

string query = "select * from xy where id == @id and name == @name";
SqlCommand cmd = new SqlCommand(query);
if(txtUsername.Text.Length > 0)
{
cmd.Parameters.Add["@name", SqlDbType.VarChar);
cmd.Parameters["@name"].Value = txtUsername.Text;
}

现在如果 txtUsername

提前致谢。

【问题讨论】:

  • 这真的有效吗? txtUsername.Text > 0
  • @Attila 真的?你确定你没有错过.Length
  • 也许你忘了.Length,比较一个字符串和一个int ...
  • 当然我忘记了长度:D

标签: c# asp.net parameters sql-injection sqlcommand


【解决方案1】:
bool useName = !String.IsNullOrEmpty(txtUsername.Text);
StringBuilder query = new StringBuilder("select * from xy where id=@id");
if(useName) 
 query.Append(" AND name=@name");

SqlCommand cmd = new SqlCommand(query.ToString());
// add ID param
if(useName) {
  // add name param
}

【讨论】:

  • Tnx。您现在知道最后如何在 cmd 中获取查询并将其放入字符串中吗?我猜 string query2 = cmd.ToString() 不能解决问题:P
  • bool useName = String.IsNullOrEmpty(txtUsername.Text);应该是 bool useName = !String.IsNullOrEmpty(txtUsername.Text);
  • @Attila cmd.CommandText 持有 slq 语句。 string query2 = cmd.CommandText;
【解决方案2】:

您可以将查询更改为

"SELECT * FROM xy WHERE id = @id and (@name = '' OR name = @name");

当参数没有值时,可以避免弄乱你的查询。

【讨论】:

  • 我不知道你为什么会投票,这个解决方案是一个很好的解决方案
  • 这确实是一个非常酷的解决方案。但前提是查询优化器足够聪明,可以看到where 块有一个重言式,以防@name 为空。否则,此查询将产生两个字符串比较的开销。一如既往不要忘记检查 NULL 值
【解决方案3】:
SqlCommand cmd = new SqlCommand();
if(txtUsername.Text != string.Empty)
{
cmd.CommandText = "select * from xy where id = @id and name = @name";
cmd.Parameters.Add["@name", SqlDbType.VarChar);
cmd.Parameters["@name"].Value = txtUsername.Text;
}
else
{
cmd.CommandText = "select * from xy where id = @id";
}

【讨论】:

    【解决方案4】:

    看看 stringtemplate.org。 ST 允许各种文本构造,并且非常灵活。

    如果您的示例是唯一需要运行时构造的查询,那么 ST 就大材小用了。 但我目前正在从事一个有很多疑问的项目,ST 让我很高兴。您的所有查询都存储在一个文件中,而不是分散在许多 C# 类中,这一事实足以使过渡到 ST 是值得的。

    【讨论】:

      猜你喜欢
      • 2014-05-20
      • 1970-01-01
      • 1970-01-01
      • 2011-04-08
      • 2012-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多