Dataadapter.update с множественной таблицей выдает ошибку исключения, что столбца нет в таблице - PullRequest
0 голосов
/ 01 декабря 2018

У меня есть база данных, созданная в MS Access 2016 с несколькими таблицами.Теперь я хочу обновить таблицы, но каждый раз, когда я получаю сообщение об ошибке, таблица не может найти столбец.Но упомянутая колонка всегда находится в другой таблице.Если я удаляю обновление для упомянутой таблицы столбца, ему будет присвоено имя другого столбца, которого у него нет.

Я работаю с Visual Basic 2017, обновленным до сегодняшнего дня.

Моя база данных выглядит так;все таблицы начинаются с tb, все остальные - строки. У меня есть таблицы / строки;

tbAuthorizations

  • AuthorizationID
  • rwAuthorization (это будет использоваться в качестве источника для таблицы tbUsersAuthorizations / rwSetUser, rwSetData, rwSetSettings, rwSetReports

tbLocalDataFolder

  • LocalDataBaseID
  • rwLocation

tbServerDataFolder

  • ServerDatabaseID
  • rwDatabase
  • rwLocation

tbUserAuthorizations

  • UserAuthorizationID
  • rwAuthUser = Поиск / отношение tbUsers - rwUserID
  • rwSetUser = Поиск / отношениеtbAuthorizations - AuthorizationID
  • rwSetData = Поиск / отношение tbAuthorizations - AuthorizationID
  • rwIncludeFixData
  • rwSetSettings = Поиск / отношение tbAuthorizations - AuthorizationID
  • rwSetReports = Поиск / отношение tbAuthorizations - AuthorizationID

tbUsers

  • UserID
  • rwUser (используется в качестве источника дляtable tbUsersAuthorizations - rwUser)
  • rwInlogName
  • rwPassword
  • rwSercretQuestion
  • rwSecretAnswer
  • rwEmail
  • 1080w
  • rwWindowsUser
  • rwPasswordLogin
  • rwHoldOnStart
  • rwRememberName
  • rwRememberPassword

Мой полный код выглядит ниже, где яупомянул, где я получил ошибку исключения.В качестве примера я попытался обновить все и постоянно получаю сообщение об ошибке rwUser.Но если я удалю таблицу, в которой находится rwUser, я получу ту же ошибку, но только с отсутствующим именем другого столбца.

Если я использую только обновление таблицы с этим столбцом, он будет обновлен.Но только с несколькими таблицами я получаю ошибки.Как будто он не разделяет столбцы и имена строк в адаптере или наборе и т. П.

blic Class Form1


    Dim con As New OleDb.OleDbConnection
    Dim dbProvider As String
    Dim dbSource As String
    Dim dbFolder As String
    Dim dbName As String

    Dim ds As New DataSet
    Dim da As OleDb.OleDbDataAdapter
    Dim sql As String

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

        dbProvider = "PROVIDER=MICROSOFT.ACE.OLEDB.12.0;"
        dbName = "D:\SystemSettings.accdb"
        dbSource = "DATA SOURCE = " & dbName
        con.ConnectionString = dbProvider & dbSource
        con.Open()

        da = New OleDb.OleDbDataAdapter("SELECT * FROM tbAuthorizations", con)
        da.Fill(ds, "AuthDB")
        da.SelectCommand.CommandText = "SELECT * FROM tbLocalDataFolder"
        da.Fill(ds, "LocalDB")
        da.SelectCommand.CommandText = "SELECT * FROM tbServerDataFolder"
        da.Fill(ds, "ServerDB")
        da.SelectCommand.CommandText = "SELECT * FROM tbUserAuthorizations"
        da.Fill(ds, "UserAuthDB")
        da.SelectCommand.CommandText = "SELECT * FROM tbUsers"
        da.Fill(ds, "UsersDB")

        con.Close()

    End Sub
    Private Sub BtnUpdate_Click(sender As Object, e As EventArgs) Handles btnUpdate.Click
        Dim cb As New OleDb.OleDbCommandBuilder(da)
        Dim dsNewRow As DataRow
        Try
            dsNewRow = ds.Tables("AuthDB").NewRow()
            dsNewRow.Item("rwAuthorization") = txtNaam.Text
            ds.Tables("AuthDB").Rows.Add(dsNewRow)
            da.Update(ds, "AuthDB") 'exception error; DataCollumn rwUser in DataTable AuthDB for SourceCollumn rwUser doesn't excist

            dsNewRow = ds.Tables("LocalDB").NewRow()
            dsNewRow.Item("rwDatabase") = txtNaam.Text
            dsNewRow.Item("rwLocation") = TxtGeboorteplaats.Text
            ds.Tables("LocalDB").Rows.Add(dsNewRow)
            da.Update(ds, "LocalDB") ''exception error; DataCollumn rwUser in DataTable LocalDB for SourceCollumn rwUser doesn't excist

            dsNewRow = ds.Tables("ServerDB").NewRow()
            dsNewRow.Item("rwDatabase") = txtNaam.Text
            dsNewRow.Item("rwLocation") = TxtGeboorteplaats.Text
            ds.Tables("ServerDB").Rows.Add(dsNewRow)
            da.Update(ds, "ServerDB") ''exception error; DataCollumn rwUser in DataTable ServerDB for SourceCollumn rwUser doesn't excist

            dsNewRow = ds.Tables("UserAuthDB").NewRow()
            dsNewRow.Item("rwAuthUser") = 1
            dsNewRow.Item("rwSetUser") = 1
            ds.Tables("UserAuthDB").Rows.Add(dsNewRow)
            da.Update(ds, "UserAuthDB") ''exception error; DataCollumn rwUser in DataTable UserAuthDB for SourceCollumn rwUser doesn't excist

            dsNewRow = ds.Tables("UsersDB").NewRow()
            dsNewRow.Item("rwUser") = txtNaam.Text
            dsNewRow.Item("rwInlogName") = TxtGeboorteplaats.Text
            ds.Tables("UsersDB").Rows.Add(dsNewRow)
            da.Update(ds, "UsersDB") ''No exception error

        Catch ex As Exception
            Dim s As String
            s = ex.StackTrace
        End Try

    End Sub

End Class

Изменен код на;

Дорогие все,

Я нашел способ заставить его работать, но не уверен, что в итоге это не создаст проблем, таких как разница между столбцом / строкой между DS и базой данных.Если тогда набор данных, Dataadapter и база данных синхронизированы.

Теперь я объединил ds.tables с запросом на вставку.ds.tables уже был обновлен в приведенном выше коде.Но у меня проблема с da.update, и для этого da.update я хочу использовать запрос, поэтому у меня есть

Private Sub BtnUpdate_Click(sender As Object, e As EventArgs) Handles btnUpdate.Click
    Dim cb As New OleDb.OleDbCommandBuilder(da)
    Dim dsNewRow As DataRow
    Dim query As String
    Dim i As Integer
    Try

        dsNewRow = ds.Tables("UsersDB").NewRow()
        dsNewRow.Item("rwUser") = txtNaam.Text
        dsNewRow.Item("rwInlogName") = TxtGeboorteplaats.Text
        ds.Tables("UsersDB").Rows.Add(dsNewRow)
        query = "INSERT INTO tbLocalDataFolder (rwDatabase,rwLocation) VALUES ('" & txtNaam.Text & "','" & TxtGeboorteplaats.Text & "')"
        executquery(query, con)

        dsNewRow.Item("rwDatabase") = txtNaam.Text
        dsNewRow.Item("rwLocation") = TxtGeboorteplaats.Text
        ds.Tables("LocalDB").Rows.Add(dsNewRow)
        query = "INSERT INTO tbLocalDataFolder (rwDatabase,rwLocation) VALUES ('" & txtNaam.Text & "','" & TxtGeboorteplaats.Text & "')"
        executquery(query, con)

    Catch ex As Exception
        Dim s As String
        s = ex.StackTrace
    End Try

End Sub
Public Sub executquery(query As String, connec As OleDb.OleDbConnection)
    Dim commandOleDb As New OleDb.OleDbCommand(query, connec)
    con.Open()
    commandOleDb.ExecuteNonQuery()
    con.Close()
End Sub
...