对我来说另一个令人讨厌但可能是简单的事情。
我有很多可能的基于用户输入的查询子句,我的问题是如何以编程方式添加这些?
例如:
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);
答案 0 :(得分:2)
查看此问题的答案。应该适用于您的问题。
答案 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语句有点过时了!