Как обновить таблицу данных, используя условие для данных в этой таблице данных?

#vb.net #foreach #datatable

#vb.net #foreach #datatable

Вопрос:

Я пытаюсь поместить данные в таблицу данных на основе значения столбца в этой таблице данных.

Я пытаюсь сделать это, заполнив ‘homeDataTable’ всеми данными. Затем добавьте строки из этой таблицы данных в ‘tempDataTable’, где значение столбца = 1. Затем я намерен установить homeDataTable = tempDataTable, так что теперь homeDataTable содержит только данные, в которых значение столбца = 1.

К сожалению, каждый раз, когда я пытаюсь это сделать, я сталкиваюсь с необработанным исключением, в котором говорится: «Тип значения не соответствует типу столбца, не удалось сохранить значение».

Кажется, я не могу получить свой для каждого цикла, который обрабатывает это, вот код, который у меня есть в настоящее время:

 Public Shared Function LoadHomeDataSet()

Dim dp As New DataProxy

'Fill homeDataTAble
homeDataTable = dp.GetScheduledTasks

Dim tempDataTable As New SettingsDataSet.ScheduledTasksDataTable 
Dim tr As DataRow

'Attempt to add data into tempDataTable where SST_ACTIVE = 1
For Each tr In homeDataTable

  tempDataTable.Rows.Add(homeDataTable.Select("SST_ACTIVE = 1"))

Next

'Refresh the DataTable in the Home page with the current Task List
homeDataTable = tempDataTable
  

К вашему сведению, homeDataTable — это общедоступная общая переменная, для которой задано следующее:

 Public Shared homeDataTable As SettingsDataSet.ScheduledTasksDataTable
  

Примечание — как вы можете видеть, это то же самое, что и tempDataTable .

Почему это не работает? Кто-нибудь может указать мне правильное направление? Я чувствую, что я действительно близок и просто пропускаю что-то глупое. Я использую Visual Studio Community 2017, версия 4.8.03752.

Комментарии:

1. Какова цель? Вы хотите фильтровать запланированные задачи с SST_ACTIVE = 1 помощью (чтобы вы могли просто применить фильтр) или вы хотите фактически удалить строки, где SST_ACTIVE <> 1 ? (почему этого не GetScheduledTasks() делается?) Если целью является представление , фильтр, вероятно, более эффективен. — LoadHomeDataSet() не имеет возвращаемого значения. Возможно, он должен возвращать DataTable.

2. @Jimi Я хочу удалить строки, где SST_ACTIVE = 1, из homeDataTable, но не могу изменить скрипт Get SQL для их ввода — мне нужно сделать это на уровне кода. Предполагается, что (позже), если SST_ACTIVE = 1, мое приложение выполнит команду SQL, сохраненную в той же строке.

3. homeDataTable = homeDataTable.Select("SST_ACTIVE = 1").CopyToDataTable() . В случае, если у вас нет метода, он находится в System.Data.DataSetExtensions.dll сборке (которая также предоставляет AsDataView() и AsEnumerable() ). — Ваша функция должна быть функцией.

4. Или просто homeDataTable = dp.GetScheduledTasks().Select("SST_ACTIVE = 1").CopyToDataTable()

5. Ну, проверьте, какой тип ScheduledTasksDataTable на самом деле. Похоже, это не тип с данными. У вас есть какие-то вещи Entity Framework, которые там происходят? Другие ORM-иш вещи? В любом случае, посмотрите, какие типы у вас там есть, и действуйте соответственно.

Ответ №1:

Следуя указаниям Джими, приведенным выше, я смог решить эту проблему с помощью следующего кода. Оказывается, не было необходимости в для каждого цикла:

 Dim dp As New DataProxy
Dim tempDataTable As DataTable

'Fill homeDataTAble
homeDataTable = dp.GetScheduledTasks
tempDataTable = homeDataTable.Select("SST_ACTIVE = 1").CopyToDataTable()
homeDataTable = tempDataTable