参数中的动态where子句
我目前正在尝试构建SqlCommand
的where子句。
类似的东西
myCommand.CommandText = "SELECT * " + "FROM TABLE1 " + "@whereClause"; //I build up the where clause with a StringBuilder myCommand.Parameters.AddWithValue("@whereClause" theClause.ToString());
但似乎这不可能。 我得到了例外:
SqlException’@whereClause’附近的语法不正确
我想做这样的事情的原因是因为我想避免X调用数据库,这样我就把排序和过滤留给了服务器。
反正有没有做类似的事情?
/ edit:where子句看起来像这样的WHERE (TABLE1.COL1 = 'the value' OR TABLE1.COL1 = 'another value' OR TABLE1.COL1 = 'this value' ... )
/编辑Finaly这是由于一个愚蠢的错字错误…我改为不使用参数化查询。 我会赞成那些帮助我的人的答案。 即使它没有修复我的(愚蠢的)错误,我也会标记为更接近修复我的情况的答案
您似乎正在尝试将整个WHERE子句添加为参数 – 这将无法正常工作!
所以假设你需要构建这样的东西
SELECT * from TABLE1 WHERE Field1=@Field1Value and Field2=@Field2Value
并假设
- 你有一个要包含在WHERE子句中的
List
字段 - 并且所有条款都是AND
- 和
WhereField
看起来像这样
public class WhereField { public string FieldName{get;set;} public object FieldValue{get;set;} public string ComparisonOperator{get;set;} }
然后你有这样的事情:
var whereClause = new StringBuilder(); foreach (var field in WhereFields) { whereClause.Append(field.FieldName) .Append(field.ComparisonOperator) .Append("@") .Append(field.FieldName).Append("Value") .Append (" AND "); //add the parameter as well: myCommand.Parameters.AddWithValue("",field.FieldName+"Value"); } //cleanly close the where clause whereClause.Append("1=1");
现在你可以执行了
myCommand.CommandText = "SELECT * " + "FROM TABLE1 WHERE " + whereClause.ToString();
您不能在子句(where)中使用参数,只允许在command.Parameters
使用参数。
要构建动态Where子句,必须根据条件和字符串连接构建查询,然后相应地添加参数。
就像是:
sb.Append("SELECT * FROM TABLE1 "); if (someCondition) { sb.Append("WHERE XColumn = @XColumn"); myCommand.Parameters.AddWithValue("@XColumn", "SomeValue"); } else { sb.Append("WHERE YColumn = @YColumn"); myCommand.Parameters.AddWithValue("@YColumn", "SomeOtherValue"); } myCommand.CommandText = sb.ToString();
可能是你需要的
myCommand.CommandText = "SELECT * " + "FROM TABLE1 WHERE " + "@whereClause";