代码之家  ›  专栏  ›  技术社区  ›  Jhonny D. Cano -Leftware-

使用可能的空值为C参数化SQL查询的帮助

  •  0
  • Jhonny D. Cano -Leftware-  · 技术社区  · 15 年前

    我需要参数化这个查询的帮助。

    SELECT * 
    FROM greatTable 
    WHERE field1 = @field1
    AND field2 = @field2
    

    用户应该能够搜索这两个字段中的任何一个,并且用户还应该能够搜索字段2是否有空值。

    var query = "theQuery";
    var cm = new SqlCommand(cn, query);
    
    cm.AddParameter("@field1", "352515");
    cm.AddParameter("@field2", DBNull.Value);
    
    // my DataTable here is having 0 records
    var dt = GetTable(cm);
    

    编辑 ]

    1. 保持CommandText常量,以便重用Sql中的计划

      其中(field2=@field2或@field2为空)

    2. 根据用户引入的值动态更改CommandText。

      其中field2为空

    3 回复  |  直到 14 年前
        1
  •  3
  •   Espo    15 年前

    你可以用 AND (@field2 IS NULL OR field2 = @field2) 使查询返回所有行而不检查 field2 (以允许您从代码中传递DbNull。 完整的查询如下:

    SELECT * 
    FROM greatTable 
    WHERE field1 = @field1
    AND (@field2 IS NULL OR field2 = @field2)
    

    请注意,使用此方法时,可能会因为索引而影响性能。看一看 this article

        2
  •  0
  •   Zielyn    15 年前

    肮脏的方法: isnull(field2,0)=isnull(@param2,0)

        3
  •  0
  •   Oleg    15 年前

    问得好,但实际上我没有时间问这个问题。如果我用 AddParameter 然后我还在同一个代码片段中构造查询的字符串。所以如果我知道,我现在应该搜索“@field2”等于空,我决定是否构造

    string query = "SELECT * " +
        "FROM greatTable " +
        "WHERE field1 = @field1";
    

    string query = "SELECT * " +
        "FROM greatTable " +
        "WHERE field1 = @field1 AND field2 IS NULL";
    

    cm.AddParameter("@field1", "352515");
    

    所以我没有时间来讨论你所描述的问题。

    更新