以编程方式创建SQL参数

时间:2012-03-21 16:23:24

标签: c# sql winforms sqlparameters

对我来说另一个令人讨厌但可能是简单的事情。

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

例如:

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);

6 个答案:

答案 0 :(得分:2)

查看此问题的答案。应该适用于您的问题。

How to handle dynamic sql parameters

答案 1 :(得分: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 Query中,如果值为NULL,则以下将忽略fieldname2=@p_FieldName2

@p_FieldName2 IS NULL OR 

答案 2 :(得分: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;

答案 3 :(得分:0)

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

答案 4 :(得分: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行。你应该创建自己的对象来处理这个,尤其是,如果你必须在多个地方这样做。你只能在一个地方写一个函数,但我认为把它分成一个对象会更清晰。

答案 5 :(得分:-2)

为什么不使用像Linq这样的ORM到SQL / Enties,Nhibernate,......?

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