Проблемы с обновлением базы данных с использованием vb. net, oledbdataadapter - PullRequest
0 голосов
/ 27 января 2020

После просмотра нескольких вопросов / ответов на Stackoverflow и других форумах я все еще теряюсь в том, почему не могу обновить базу данных Access из данных. Я пытаюсь взять данные из таблицы данных и вставить эти данные в таблицу доступа, если она пуста, и заменить таблицу, если в ней уже есть данные. Я могу успешно заменить таблицу, но данные из таблицы данных не добавляются.

Однако используемый мной метод не работает. Моя таблица данных поступает из связанного источника данных, и уровень доступа называется так:

ConnectedDB.UpdateTable(DBTable, bsDataSource.DataSource)

Где ConnectedDB - это класс уровня доступа, DBTable - строка, содержащая доступ имя таблицы, а bsDataSource - связанные данные. Как видите, я передал .Datasource, чтобы превратить его в таблицу данных.

Вот оригинальный (до 29 января) раздел моей работы по добавлению таблицы данных обратно в таблицу Access:

 Public Function UpdateTable(strTable As String, dgDataTable As DataTable) As Boolean
        Dim DS As New DataSet
        dgDataTable.TableName = strTable
        DS.Tables.Add(dgDataTable)
        Using OpenCon = New OleDb.OleDbConnection(strConnectionString)
            Using DataAdapter As New OleDbDataAdapter("SELECT * FROM " & strTable, OpenCon)
                Dim DBcmd As OleDbCommandBuilder = New OleDbCommandBuilder(DataAdapter)
                DBcmd.QuotePrefix = "["
                DBcmd.QuoteSuffix = "]"
                DataAdapter.UpdateCommand = DBcmd.GetUpdateCommand()
                Try
                    OpenCon.Open()
                    DataAdapter.Fill(DS.Tables(strTable))
                    If DataAdapter.Update(DS.Tables(strTable)) > 0 Then
                        Return True
                    Else Return False
                    End If
                Catch exo As Exception
                    MessageBox.Show(exo.Message)
                    Return False
                End Try
            End Using
        End Using
    End Function

Моя функция пытается обновить существующую таблицу Access с именем, представленным как strTable, с информацией в таблице данных, dgDataTable из таблицы данных. Каждый запуск достигает проверки обновления> 0 и возвращает false, что означает, что синтаксис должен работать (т. Е. Нет сообщений об ошибках). Я проследил таблицу, и в ней есть все необходимые данные (поэтому информация корректно передается из таблицы через команды обновления). Я играл с применением его в наборе данных, но я не уверен, что мне это действительно нужно.

Я отслеживал переменные с помощью метода обновления, и я думаю, что выяснил, почему он не будет обновляться, но я ' Я не уверен, что с этим делать. Этот запрос выглядит следующим образом:

UPDATE [RtoC] SET [R] = ?, [C] = ?, [Type] = ?, [Unknown] = ? WHERE (([R] = ?) AND ([C] = ?) AND ([Type] = ?) AND ((? = 1 AND [Unknown] IS NULL) OR ([Unknown] = ?)))

Имя таблицы доступа - Rto C с полями R, C, Type и unknown. Я думаю "?" не заполняются, в результате чего запрос просто не применяет данные обратно в Access. Однако я не уверен, как установить эти элементы.

РЕДАКТИРОВАТЬ 1/29/20: я использовал изменения кода I и документ jmcihinney ниже, и он вставляет строки в таблицу Access. Это изменение изменяет вопрос, чтобы он был более точным c о том, что я пытаюсь сделать, и как создается таблица данных. Надеюсь, это прояснит некоторые формулировки с моей стороны и послужит некоторой основой для изменения состояния строки.

Ответы [ 2 ]

0 голосов
/ 29 января 2020

Я предпринял еще одну попытку манипулирования базой данных, и, посмотрев ее, я нашел ответ, предоставленный jmcilhinney еще в 2014 году! [ Массовая вставка из таблицы данных для доступа к базе данных

В for each l oop по строкам моего набора данных я задаю это: row.SetAdded()

Если я Заполнял, я бы сделал что-то вроде: DataAdapter.AcceptChangesDuringFill = True Перед командой Fill.

Если этот метод не изменился или нет лучшего способа, я отмечу ссылку как ответ.

Спасибо, jmcilhinney .... дважды!

0 голосов
/ 28 января 2020

Проблема в том, что метод Fill этого адаптера данных вызывает AcceptChanges на DataTable после его заполнения, поэтому при вызове Update.

изменения не сохраняются. хотя звонить по номеру Fill там не должно быть, потому что вы не хотите получать какие-либо данные, просто сохраните изменения. У вас там много бессмысленного кода. Это должно выглядеть примерно так:

Public Function UpdateTable(strTable As String, dgDataTable As DataTable) As Boolean
    Using DataAdapter As New OleDbDataAdapter("SELECT * FROM " & strTable, strConnectionString)
        Dim DBcmd As OleDbCommandBuilder = New OleDbCommandBuilder(DataAdapter)

        DBcmd.QuotePrefix = "["
        DBcmd.QuoteSuffix = "]"

        Try
            Return DataAdapter.Update(dgDataTable) > 0
        Catch exo As Exception
            MessageBox.Show(exo.Message)
            Return False
        End Try
    End Using
End Function
...