【问题标题】:Use DataView filtering return syntax error使用 DataView 过滤返回语法错误
【发布时间】:2019-07-09 16:52:06
【问题描述】:

我从存储过程接收数据,例如:

       var db = new SQLConnMgr();
       var dtJobs = db.GetTableBySQL(sp);

一旦我有数据,我将它分成两个数据列并插入到两个不同的数据表中,例如:

            DataColumn[] projectsColumns = dtJobs.Columns.Cast<DataColumn>()
    .Where(c => c.ColumnName == "Project Name" || c.ColumnName == "ProjectKey")
    .Select(c => new DataColumn(c.ColumnName, c.DataType))
    .ToArray();

            DataColumn[] designGroupColumns = dtJobs.Columns.Cast<DataColumn>()
  .Where(c => c.ColumnName == "DesignGroup Name" || c.ColumnName == "DesignGroupId")
  .Select(c => new DataColumn(c.ColumnName, c.DataType))
  .ToArray();

            this.Projects = new DataTable();
            this.Projects.Columns.AddRange(projectsColumns);
            this.DesignGroups = new DataTable();
            this.DesignGroups.Columns.AddRange(designGroupColumns);


            foreach (DataRow row in dtJobs.Rows)
            {
                DataRow aRow = Projects.Rows.Add();
                DataRow bRow = DesignGroups.Rows.Add();
                foreach (DataColumn project in projectsColumns)
                    aRow.SetField(project, row[project.ColumnName]);
                foreach (DataColumn designGroup in designGroupColumns)
                    bRow.SetField(designGroup, row[designGroup.ColumnName]);
            }

所以现在我有两个具有不同数据和列的数据表。现在我想在文本框更改事件中过滤项目Datatable。所以我这样做:

  private void txtSearchJobName_TextChanged(object sender, EventArgs e)
        {
            DataView dvJobs = this.Projects.DefaultView;
            dvJobs.RowFilter = "Project Name LIKE '%" + txtSearchJobName.Text + "%'";
        }

但是当我输入文本框时,它会返回语法错误异常

System.Data.SyntaxErrorException: '语法错误: 后面缺少操作数 '名称'运算符。'

当我尝试执行dvJobs.RowFilter 时会发生这种情况,我调试dvJobs DataView 并且它有我的项目名称列,我不知道我是否在语法上做错了什么。问候

【问题讨论】:

  • 更改为 [Project Name] LIKE .... 解析器被包含空格的列名弄糊涂了,所以你需要将你的名字括在方括号中跨度>

标签: c# winforms datatable


【解决方案1】:

将事件处理程序中的代码更改为

private void txtSearchJobName_TextChanged(object sender, EventArgs e)
{
    DataView dvJobs = this.Projects.DefaultView;
    dvJobs.RowFilter = "[Project Name] LIKE '%" + txtSearchJobName.Text + "%'";
}

解析器被包含空格的列名弄糊涂了,所以你需要用方括号括起来你的名字。

我建议将创建两个数据表的代码更改为更简单的代码

 DataTable dtProjects = dtJobs.DefaultView.ToTable(false, 
                               new string[] {"ProjectKey", "Project Name"});
 DataTable dtDesign  = dtJobs.DefaultView.ToTable(false, 
                               new string[] {"DesignGroup Name","DesignGroupId"});

这不仅会创建两个表,还会从原始表中复制数据。见DataView.ToTable

【讨论】:

    【解决方案2】:

    过滤器语法是:“ColumnName Operand Value”。

    试试:dvJobs.RowFilter = "Name LIKE '%" + txtSearchJobName.Text + "%'";

    示例和更多信息可以在这里找到:https://docs.microsoft.com/de-de/dotnet/api/system.data.datacolumn.expression?view=netframework-4.8

    【讨论】:

      猜你喜欢
      • 2014-04-19
      • 1970-01-01
      • 2011-08-25
      • 1970-01-01
      • 2019-05-13
      • 2014-11-15
      • 2021-10-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多