【问题标题】:Manipulate optional parameters in the WHERE clause操作 WHERE 子句中的可选参数
【发布时间】:2013-04-03 11:31:52
【问题描述】:

我正在处理一个网络表单,它接收一个字符串,该字符串包含一个带有 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 语句。

【问题讨论】:

    标签: c# asp.net sql sqlcommand


    【解决方案1】:

    将您的查询更改为最低限度:

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

    然后将其余的附加条件:

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

    【讨论】:

    • 谢谢,这是个好主意,但我不能更改查询然后追加,因为查询是通过我读取的 XML 文件接收的,而且由于复杂性,通常很难分解SQL 语句。
    • 您应该更新您的问题以显示这一点。我当时看到的唯一解决方案是分析接收到的查询并重建它的组件。
    【解决方案2】:

    你可以尝试使用case语句:

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

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

    【讨论】:

    • 谢谢,非常好的方法,但我无法修改收到的查询,因为该语句通常非常复杂,而且我无法精确找到插入 CASE STATEMENT 部分的每个位置。 ..
    • 收到后可以运行查询吗?将当前值保存在内存中,然后如果文本框中的值不为空,则用新值替换。如果文本框为空,则输入您之前提取的值。
    猜你喜欢
    • 2012-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多