Обновить данные с помощью sqldataadapter.fill - новые данные не отображаются
У меня есть таймер, который работает в фоновом режиме, чтобы обновлять данные для объекта datagridview. Мой таймер вызывает sqldatadapter.fill для заполнения локального набора данных.
Если я перехожу на сервер sql и удаляю строку из моей таблицы, мой запрос на заполнение набора данных не отражает это изменение из базы данных.
Если я обновлю значение поля не первичного ключа в базе данных, и мой таймер запустится, изменения будут подобраны и показаны в моем обзоре данных.
Как мне настроить мой sqldataadapter, чтобы он обнаруживал, когда строки добавляются или удаляются каким-либо другим внутренним процессом?
Это в form_load
If ds Is Nothing Then
ds = New DataSet()
End If
Try
sqldataadapter = New SqlClient.SqlDataAdapter(SELECTQUERY, parentconnectionstring)
sqldataadapter.MissingSchemaAction = MissingSchemaAction.AddWithKey
sqlcommandbuilder = New SqlClient.SqlCommandBuilder(sqldataadapter)
sqldataadapter.Fill(ds)
mydata = ds.Tables(0).DefaultView
Catch ex As Exception
ExceptionHandler(ex)
End Try
If mydata.Table.Rows.Count > 0 Then
bindingsource.DataSource = mydata
dgvSystemWeightConfig.DataSource = bindingsource
UpdateLastUpdateTime()
End If
И это моя процедура обновления
Public Sub refreshdata()
disableupdatetimer()
Try
If dgvSystemWeightConfig.IsCurrentCellInEditMode Then
Debug.WriteLine("tried to refresh system weight data but user had a cell in edit mode")
Else
Debug.WriteLine("system weight - refreshing data")
sqldataadapter.Fill(ds, mydata.Table.TableName)
dgvSystemWeightConfig.Focus()
UpdateLastUpdateTime()
End If
Catch ex As Exception
ExceptionHandler(ex)
Finally
enableUpdateTimer()
End Try
End Sub
1 ответ
Не думайте, что SqlDataAdapter не имеет правильных записей. Очевидно, DataTable реализует INotifyPropertyChanged, но не реализует INotifyCollectionChanged. Привязать к ObservableCollection.
Отладка и рассчитывать на DS.
Бьюсь об заклад, источник указан правильно, а элемент управления пользовательского интерфейса просто не фиксирует изменения.
Чтобы пользовательский интерфейс мог подбирать вставки и удаления, у вас должен быть источник, который реализует INotifyCollectionChanged.
ObservableCollection реализует INotifyCollectionChanged.
DataTable делает много вещей, которые вам нужно заменить.
Потребуется класс или структура для хранения строк, и потребуется определить столбцы.
AutoGenerateColumns работает только с DataTable.