Использовать фильтр DataView, возвращающий синтаксическую ошибку - PullRequest
0 голосов
/ 09 июля 2019

Я получаю данные из хранимой процедуры, например:

       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, и у меня есть столбец с именем проекта, я не знаю, что я ошибаюсь в синтаксисе.Привет

Ответы [ 2 ]

1 голос
/ 09 июля 2019

Измените код в обработчике событий на

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

Парсер сбит с толку именем столбца, содержащим пробел, поэтому необходимо заключить свое имя в квадратные скобки.

AКроме того, я бы порекомендовал изменить код, который создает две таблицы данных, на более простой

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

. Это не только создает две таблицы, но также копирует данные из исходной таблицы.См. DataView.ToTable

0 голосов
/ 09 июля 2019

Синтаксис фильтра: «Значение операнда столбца».

Try: dvJobs.RowFilter = "Имя LIKE '%" + txtSearchJobName.Text + "%'";

Примеры ибольше информации можно найти здесь: https://docs.microsoft.com/de-de/dotnet/api/system.data.datacolumn.expression?view=netframework-4.8

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...