-2

我目前正在尝试构建一个SqlCommand.

类似的东西

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' ... )

/edit 最后这是由于一个愚蠢的拼写错误......在我更改为不使用参数化查询之后。我会赞成那些帮助我的答案。即使它没有修复我的(愚蠢的)错误,我也会将更接近修复我的情况标记为答案

4

3 回答 3

1

您不能将子句(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();
于 2013-10-01T14:04:16.907 回答
1

看来您正在尝试将整个 WHERE 子句添加为参数 - 这不起作用!

所以假设你需要构建这样的东西

SELECT * from TABLE1 WHERE Field1=@Field1Value and Field2=@Field2Value

并假设

  • 您有一个List<WhereField>字段要包含在 WHERE 子句中
  • 并且所有子句都被 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();
于 2013-10-01T14:11:06.037 回答
0

可能是你需要

myCommand.CommandText = "SELECT * " +
                        "FROM TABLE1 WHERE " + 
                        "@whereClause";
于 2013-10-01T14:04:48.033 回答