0

我正在用 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不起作用?

4

1 回答 1

1

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

您需要按照 DataColumn 对象的Expression+ operator属性中的说明使用应用于字符串(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("'", "''") + "%'";
....
于 2013-06-01T12:33:25.143 回答