Member 13039327 Ответов: 3

Объект dataadapter.обновление выкидывает ошибку; rwuser datacollumn в объект DataTable экземпляр для sourcecollumn rwuser не спроста


Дорогие все,

Я пытаюсь обновить набор данных с помощью нескольких таблиц. Однако всякий раз, когда я хочу обновить, первая таблица, которую я хочу обновить, выдает ошибку, что collumn не существует в этой таблице. Это действительно до конца, но collumn только спроста в последней таблице я хочу, чтобы обновить. Я действительно пытался поменять местами (поставить последний первый и все), но все равно он продолжает давать мне ту же ошибку с тем же именем столбца.

Всегда отсутствует collumn rwUser..за исключением того, что в таблице с rwUser внутри это будет сделано правильно.

Ниже моего кода у меня есть, а также все таблицы и строки, которые у меня есть.

База данных, которую я создал с помощью Access 2016, является aacdb. И я использую Visual Basic 2017

база данных;

Слова, начинающиеся с ТБ, - это таблицы.

The Tables / rows I have;
•	tbAuthorizations
o	AuthorizationID
o	rwAuthorization (this to be used as sourch for table tbUsersAuthorizations / rwSetUser, rwSetData, rwSetSettings, rwSetReports
•	tbLocalDataFolder
o	LocalDataBaseID
o	rwDatabase
o	rwLocation
•	tbServerDataFolder
o	ServerDatabaseID
o	rwDatabase
o	rwLocation
•	tbUserAuthorizations
o	UserAuthorizationID
o	rwAuthUser = Lookup / relation of tbUsers – rwUserID
o	rwSetUser = Lookup / relation of tbAuthorizations - AuthorizationID
o	rwSetData = Lookup / relation of tbAuthorizations - AuthorizationID
o	rwIncludeFixData
o	rwSetSettings = Lookup / relation of tbAuthorizations - AuthorizationID
o	rwSetReports = Lookup / relation of tbAuthorizations – AuthorizationID
•	tbUsers
o	UserID
o	rwUser (this to be used as sourch for table tbUsersAuthorizations – rwUser)
o	rwInlogName
o	rwPassword
o	rwSercretQuestion
o	rwSecretAnswer
o	rwEmail
o	rwComputerName
o	rwWindowsUser
o	rwPasswordLogin
o	rwHoldOnStart
o	rwRememberName
o	rwRememberPassword


Что я уже пробовал:

Public 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("UsersDB").NewRow()
            dsNewRow.Item("rwUser") = txtNaam.Text
            dsNewRow.Item("rwInlogName") = TxtGeboorteplaats.Text
            ds.Tables("UsersDB").Rows.Add(dsNewRow)
            da.Update(ds, "UsersDB")

            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") = txtNaam.Text
            dsNewRow.Item("rwSetUser") = TxtGeboorteplaats.Text
            ds.Tables("UserAuthDB").Rows.Add(dsNewRow)
            da.Update(ds, "UserAuthDB") ''exception error; DataCollumn rwUser in DataTable UserAuthDB for SourceCollumn rwUser doesn't excist

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

    End Sub

End Class

Richard MacCutchan

В этом нет никакого смысла. Почему вы пытаетесь использовать имя столбца, которого не существует?

3 Ответов

Рейтинг:
2

Member 13039327

Привет Ричард,

Я использую отладчик, и каждый раз, когда он попадает в da.update, он идет в этой ошибке.

Если я удалю tbUsers int he da/ds, то ошибка будет заключаться в том, что rwAuthUser отсутствует в таблице. Но потом, когда я только обновляю tbUserAuthorizations, все идет хорошо.

И вышеприведенный код - это все, что у меня есть. Таким образом, кажется, что команда da.update не подходит для базы данных с несколькими таблицами, или мне нужно иметь что-то дополнительное внутри.

Но я постараюсь посмотреть. В любом случае спасибо за ваши ответы


Рейтинг:
2

Member 13039327

Дорогие все,

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

Теперь у меня смешанная ДС.таблиц с помощью запроса на вставку. ДС.таблиц/уже был обновлен в приведенном выше коде. Но я столкнулся с проблемой с 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


Рейтинг:
0

Member 13039327

Привет Ричард

Вот в чем проблема. Почему VB вызывает эту строку? Я знаю, что он говорит столбец в исключении, но я предполагаю, что он обращается к строке.Но внутри кода я не обращаюсь к этой строке, только в обновлении для tbUser, где есть такая строка.

Я не пользуюсь этой колонкой, никогда не пользовался. Единственная таблица, в которой есть строка с именем rwUser, - это таблица tbUsers. И если я использую только tbUsers для обновления, то никаких проблем нет. Так почему же на самом деле VB дает мне ошибку в других таблицах, в которых действительно нет rwUser внутри.

И если в коде что-то не так, то, пожалуйста, дайте мне знать, где я пытаюсь использовать этот столбец во всех таблицах, кроме tbUsers.

Но VB говорит, что это не исключается в таблицах LocalDB, tbServerDB и tbUserAuthorizations.

С уважением,
Ганс


Richard MacCutchan

            dsNewRow = ds.Tables("UserAuthDB").NewRow()
            dsNewRow.Item("rwUser") = txtNaam.Text


rwUser не существует в этой таблице.

Member 13039327

Привет Ричард,

Прости, но это была моя ошибка. Я действительно пытался изменить строку в access to rwAuthUser и изменил ее также в VB. Но забудьте настроить в приведенном выше коде. Но это все равно не меняет проблемы.

Я даже пытался обновить только tbLocalDataFolder (LocalDB) и tbServerDataFolder (ServerDB), но я продолжаю получать ошибку. Кроме того, когда я только пытаюсь обновить tbLocalDataFolder (LocalDB), возникает ошибка. Это также происходит, когда я пытаюсь обновить другую таблицу. За исключением tbUsers (UsersDB). Ибо с tbUsers он действительно обновит БД
Кажется, что где-то он смешивает ряды или что-то в этом роде. Или что он проверяет все строки и хочет обновить их все в таблице

Richard MacCutchan

Извините, но вам нужно будет использовать свой отладчик, чтобы проверить фактический код по мере его выполнения. Невозможно догадаться, что происходит.