0

另一个对我来说很烦人的,但可能很简单。

我有许多可能的 where 子句用于基于用户输入的查询,我的问题是如何以编程方式添加这些子句?

例如:

wherequery = @"WHERE fieldname = @p_FieldName AND ";
if (txtValue.textLength > 0){
    wherequery += "fieldname2 = @p_FieldName2 AND ";
}
query = @"SELECT * FROM tabe" + wherequery;
sql = connection.CreateCommand();
sql.CommandText = query;

我将如何为此做参数?我尝试了 ArrayLists、Dictionaries 和其他一些方法,但找不到这样做的方法。理想情况下,我想做这样的事情:

SqlParameter[] sqlparams;
wherequery = @"WHERE fieldname = @p_FieldName AND ";
if (txtValue.textLength > 0){
    wherequery += "fieldname2 = @p_FieldName2 AND ";
    sqlparams.Parameters.Add("@p_FieldName2 ", SqlDbType.VarChar).Value = txtValue.text;
}
query = @"SELECT * FROM tabe" + wherequery;
sql = connection.CreateCommand();
sql.CommandText = query;
sql.Parameters.Add(sqlparams);
4

6 回答 6

2

看看这个问题的答案。应该适用于你的问题。

如何处理动态sql参数

于 2012-03-21T16:31:49.540 回答
1

不要以编程方式添加参数,而是将它们全部添加,但包括 NULL 条件。例如:

SELECT * FROM tabe
WHERE fieldname=@p_FieldName 
AND (@p_FieldName2 IS NULL OR fieldname2=@p_FieldName2)

sqlparams.Parameters.Add("@p_FieldName2 ", SqlDbType.VarChar).Value = null;
if (txtValue.textLength > 0){
    sqlparams.Parameters("@p_FieldName2").Value = txtValue;
}

这里,如果 的文本长度txtValue为 0,则@p_FieldName2参数设置为null

然后在 SQL 查询中,fieldname2=@p_FieldName2如果值为 NULL,则以下内容将忽略:

@p_FieldName2 IS NULL OR 
于 2012-03-21T16:28:01.850 回答
1

我对您的代码做了一些小改动,希望可以为您指明正确的方向:

    sql = connection.CreateCommand();    
    wherequery = @"WHERE fieldname = @p_FieldName ";
    sql.Parameters.Add(new SqlParameter("@p_FieldName ", "some value for fieldname"));

    if (txtValue.textLength > 0){
        wherequery += " AND fieldname2 = @p_FieldName2 ";
        sql.Parameters.Add(new SqlParameter("@p_FieldName2 ", txtValue.text));
    }
    query = @"SELECT * FROM tabe" + wherequery;

    sql.CommandText = query;
于 2012-03-21T16:32:28.917 回答
0

使用 aDictionary<string,object>其中字符串部分是键,对象部分是值。

于 2012-03-21T16:26:32.733 回答
0

如果您有一堆不同的可能字段要过滤,那么您就不会以一种或另一种方式对它们全部进行编码。

您可以创建一个类来处理字符串构建。我从工作中偷来了这个想法。=)

在伪代码中,它基本上看起来像这样:

Class WhereObj
{
  //whatever container you want to use to hold the params
  //you could also create a params class and have a list of param objects
  //it'd basically be a constructor and two properties

  private Params(,)

  Public void AddParam(fieldname, value)
  //adds param to Params

  Public string ToSQLString() 
  //loops params and builds string (use stringbuilder!)
  //ex: "where FirstName= 'Neo' and MatrixSequelsSucked = 'true'"
}

这应该是一个真正易于编码的类——可能不到 50 行。您绝对应该创建自己的对象来处理此问题,特别是如果您必须在多个地方执行此操作。如果它只在一个地方,你可以只写一个函数,但我认为将它分成一个对象会更简洁一些。

于 2012-03-21T17:26:54.977 回答
-2

为什么不使用像 Linq to SQL/Enties、Nhibernate 等 ORM ?

因为手动生成 SQL 语句有点过时了!

于 2012-03-21T16:27:42.363 回答