在WHERE子句中处理可选参数

时间:2013-04-11 10:03:23

标签: c# asp.net sql sqlcommand

我正在处理一个Web表单,该表单接收包含带有SQL参数的SQL查询语句的字符串。它为每个参数生成一个ASP.NET控件,然后将每个控件的值分配给SQL查询字符串的参数,SqlCommand将使用该参数填充DataAdapter

管理可选参数时遇到一些问题。

实施例

1)将字符串传递给页面:

string query = "SELECT * FROM Table WHERE Field1=@P1 AND field2=@P2";

2)为每个参数生成一个Web控件

TextBox P1 = new TextBox();
P1.ID = "P1";
...
TextBox P2 = new TextBox();
P2.ID = "P2";
...
PanelParameters.Controls.Add(P1);
PanelParameters.Controls.Add(P1);

3)点击后,将每个参数的值传递给SqlCommand作为参数:

SqlCommand cmd = new SqlCommand(query, conn);

cmd.Parameters.AddWithValue("@P1", P1.Text);

cmd.Parameters.AddWithValue("@P2", P2.Text);

4)就在这里,没关系!

但如果参数可选,我该如何管理呢?

如果P2是可选的,则用户无法编译它,在这种情况下我不想设置P2 = NULL(设置参数DbNull.Value的值),但我想要P2将从查询SQL中消失。

你能帮助我吗?

*更新* 我无法编辑我收到的查询,因为它包含非常复杂的SQL语句。

2 个答案:

答案 0 :(得分:5)

将查询更改为最小值:

string query="SELECT * FROM Table WHERE Field1=@P1

然后用条件附加其余部分:

if(P2.Text != "")
{
    cmd.Parameters.AddWithValue("@P2",P2.Text);
    query += " AND field2=@P2";
}

答案 1 :(得分:2)

您可以尝试使用案例陈述:

SELECT * FROM Table WHERE Field1=@P1 AND CASE WHEN field2= null OR field2= '' THEN field2 ELSE @P2 END

您仍然会发送参数,但如果它为null或为空,则会被忽略。