C#MySQL绑定源抛出一个Evaluation异常

时间:2013-06-01 12:24:51

标签: c# mysql data-binding

我在C#中创建一个连接到MySQL数据库并列出结果的应用程序。 我添加了两个文本框,允许用户按文本框的textchanged事件上的用户ID和用户名/姓氏过滤数据。代码看起来像这样

        private void tbSearchStudents_TextChanged(object sender, EventArgs e)
        {
            BindingSource binding = new BindingSource();
            binding.DataSource = dataGridViewStudents.DataSource;
            this.tsProgressBar.Visible = true;
            this.tsProgressBar.Style = ProgressBarStyle.Marquee;
            binding.Filter = @"students.uid LIKE '%" + this.tbSearchId.Text + @"%' 
                               AND CONCAT_WS(' ' , students.name, students.surname) 
                               LIKE '%" +  this.tbSearchName.Text + "%'";
            this.dataGridViewStudents.DataSource = binding;
            this.tsProgressBar.Visible = false;
        }

然而,当我运行我的程序并尝试在其中任何一个文本框中输入内容时,我得到一个EvaluationException异常:
The expression contains undefined function call CONCAT_WS().

当我在添加名称/姓氏之前仅使用id文本框并仅使用students.uid LIKE '%" + this.tbSearchId.Text + @"%'时,一切正常。

发生了什么事?它接受LIKE表达式,但它无法识别CONCATCONCAT_WS函数?

1 个答案:

答案 0 :(得分:1)

因为CONCAT_WS是用于连接字符串的MySql函数,但它不是.NET Framework已知的函数,并且适用于BindingSource的Filter属性。在这种情况下,您不是要求MySql数据库引擎解析您的过滤器,您正在与.NET Framework交谈,您应该遵循其规则。

您需要使用+ operator应用于字符串,如DataColumn对象的Expression属性中所述(BindingSource.Filter属性遵循相同的规则)

binding.Filter = @"students.uid LIKE '%" + this.tbSearchId.Text + @"%' 
                   AND students.name + ' ' + students.surname) 
                   LIKE '%" +  this.tbSearchName.Text + "%'";

另外,请注意文本框中的单引号,如果有O'Hara这样的学生姓,则可能会收到另一种语法错误。为安全起见,添加一个

...
AND students.name + ' ' + students.surname) 
LIKE '%" +  this.tbSearchName.Text,Replace("'", "''") + "%'";
....