【问题标题】:Append to a Select Command附加到选择命令
【发布时间】:2010-11-29 13:16:15
【问题描述】:

我有一个要过滤的 Gridview。我的 gridview 在更新面板中,而我的过滤器按钮不在。单击按钮时,我有以下内容

protected void bttnfilter_Click(object sender, ImageClickEventArgs e)
{
    if (TextBox1.Text != "")
    {
        SqlDataSource1.SelectCommand += " and field like '%' + @param + '%'";
        SqlConnection conn = new SqlConnection(SqlDataSource1.ConnectionString );
        SqlCommand cmd = new SqlCommand(SqlDataSource1.SelectCommand, conn);
        cmd.Parameters.Add(new SqlParameter("@param", TextBox1.Text));
    }

}

所以我添加到选择命令,但我得到一个错误。我该怎么办?我不想使用动态sql。

错误读取 'and' 附近的语法不正确

【问题讨论】:

  • “我遇到了一个错误”你遇到了什么错误?
  • 原来SelectCommand的值是多少?
  • SQLDataSource1.SelectCommand 的值是多少?你可以打印这个。
  • 尝试使用变量的实际值,看看会发生什么,这样您就可以知道它是否在您的 SELECT 语句中出错。

标签: c# asp.net sql vb.net visual-studio


【解决方案1】:

您很可能正在附加到没有WHERE 子句的查询:

SELECT  *
FROM    mytable
        AND field LIKE '%test%'

会给你这个错误。

让你查询存根如下:

SELECT  *
FROM    mytable
WHERE   1 = 1

,它将选择所有内容,除非您对其附加附加条件。

在你的情况下,这将给出:

SELECT  *
FROM    mytable
WHERE   1 = 1
        AND field LIKE '%test%'

,这是一个有效的查询。

我不想使用动态 sql。

正在使用它。

你最好把你的查询改写成这样:

SELECT  *
FROM    mytable
WHERE   @param IS NULL
UNION ALL
SELECT  *
FROM    mytable
WHERE   field LIKE '%' + @param + '%'

如果您的文本字段为空,则绑定NULL

【讨论】:

    【解决方案2】:

    您确定您的 SQL 语句中的最后一个子句是 WHERE 子句吗?如果没有 WHERE 子句,或者 WHERE (GROUP BY, ORDER BY) 之后有另一个子句,则会出现此错误。

    【讨论】:

    • 你是对的。这是一个命令。但我改变了它,它说它找不到标量变量@param。
    【解决方案3】:

    应该这样做

    private void bttnfilter_Click(object sender, ImageClickEventArgs e)
    {
        string filterText = TextBox1.Text.Trim().ToLower();
    
        if (!String.IsNullOrEmpty(filterText))
            SqlDataSource1.FilterExpression = 
                string.Format("field LIKE '%{0}%'",filterText);         
    }
    

    【讨论】:

    • 它说找不到我的列字段
    • @Eric - 这假定字段是数据库 table 中字段的名称。您需要将名称更改为相关字段的名称
    • 拉斯谢谢你。我把它作为 v.field。我将其更改为字段。就像你说的那样有效。 +1 也。谢谢
    • 拉斯。您能否向我解释一下其中的 string.Format 部分以及 {0} 的工作原理?我想更好地理解这一点。
    • {0} 是格式字符串中的占位符,用于表示格式字符串后的对象 args 中的第一个对象的 ToString() 表示。因此,string.Format("{0} {1} {2}", myObject1, myObject2, myObject3) 的输出将等同于 myObject1.ToString() + " " + myObject2.ToString() + " " + myObject3.ToString() 的输出。不是更容易阅读吗(与串联相比,我对它的性能不是 100%,也许知道的人可以回答这个问题?)
    【解决方案4】:

    可能缺少 where 子句,或者 SelectCommand 正在引用存储过程。

    【讨论】:

      猜你喜欢
      • 2018-03-02
      • 2017-08-22
      • 2017-03-30
      • 1970-01-01
      • 1970-01-01
      • 2012-07-28
      • 2013-04-09
      • 2010-10-31
      • 2017-12-14
      相关资源
      最近更新 更多