Обновить данные с помощью 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.

Другие вопросы по тегам