Как добавить новые записи в базу данных Access из Visual Studio. (ВБ.NET)

Отказ от ответственности: я очень новичок в программировании, поэтому мои навыки кодирования в лучшем случае не на должном уровне.

Моя цель состоит в том, чтобы мой проект Visual Studio 2019 (с именем Detailing Error Log) добавил новую строку записи в мою таблицу базы данных Microsoft Access (файл accdb с именем Database1, таблица с именем Data Collection) на основе того, какие флажки отмечены. Я бы хотел, чтобы строки добавлялись, а не удалялись, всякий раз, когда нажимается кнопка «Импорт». Затем база данных будет сохранена, а флажки в моем проекте Visual Studio сняты. База данных будет использоваться для хранения этих данных до тех пор, пока она не будет использована координирующей программой Visual Studio для подсчета появления определенного текста в течение определенного месяца. Оттуда он будет отображаться на графиках.

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

Моя проблема в том, что я получаю эту ошибку в своем con.Open(): «System.InvalidOperationException: «Microsoft.ACE.OLEDB.12.0Data Source = S:\software\System\DPD & DEL (KPI)\Database1 Поставщик .accdb не зарегистрирован на локальном компьютере».

Что означает эта ошибка? Это также в настоящее время единственная ошибка.

Вот мой код для справки, заранее спасибо за помощь!

*NEATOL = "Нет записи во время регистрации"

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

        Dim dbProvider As String
        Dim dbSource As String
        Dim sql As String
        Dim inc As Integer
        Dim MaxRows As Integer
        Dim con As New OleDb.OleDbConnection

        dbProvider = "PROVIDER=Microsoft.ACE.OLEDB.12.0"
        dbSource = "Data Source = S:\software\Melton System\DPD & DEL (KPI)\Database1.accdb; Persist Security Info = False"
        con.ConnectionString = dbProvider & dbSource
        con.Open()
    End Sub

    Private Sub InputInformation(sender As System.Object, e As System.EventArgs) Handles ImporttBUT.Click
        Dim con As New OleDb.OleDbConnection
        Dim ds As New DataSet
        Dim da As OleDb.OleDbDataAdapter
        Dim cb As New OleDbCommandBuilder()
        Dim dsnewrow As DataRow
        dsnewrow = ds.Tables("Data Collection").NewRow()
        dsnewrow.Item("M/Y OF LOG") = Me.MonthList2021.SelectedItem
        dsnewrow.Item("TIME OF LOG") = DateTime.Now.ToString("MM/dd/yyyy HH:mm:ss")
        dsnewrow.Item("USER") = UserName
        dsnewrow.Item("STOCK NUMBER") = Me.StockNumberTXTB.Text
        If MissedPartCHKB.Checked = True Then
            dsnewrow.Item("MISSED PART") = Me.MissedPartCHKB.Text
        ElseIf MissedPartCHKB.Checked = False Then
            dsnewrow.Item("MISSED PART") = "NEATOL"
        End If
        If NotInEpicorCHKB.Checked = True Then
            dsnewrow.Item("NOT IN EPICOR") = Me.NotInEpicorCHKB.Text
        ElseIf NotInEpicorCHKB.Checked = False Then
            dsnewrow.Item("NOT IN EPICOR") = "NEATOL"
        End If
        If MissedBuyoutCHKB.Checked = True Then
            dsnewrow.Item("MISSED BUYOUT") = Me.MissedBuyoutCHKB.Text
        ElseIf MissedBuyoutCHKB.Checked = False Then
            dsnewrow.Item("MISSED BUYOUT") = "NEATOL"
        End If
        If NonStockCHKB.Checked = True Then
            dsnewrow.Item("MISSED NON STOCK ITEM") = Me.NonStockCHKB.Text
        ElseIf NonStockCHKB.Checked = False Then
            dsnewrow.Item("MISSED NON STOCK ITEM") = "NEATOL"
        End If
        If MissedSTKItemCHKB.Checked = True Then
            dsnewrow.Item("MISSED STOCK ITEM") = Me.MissedSTKItemCHKB.Text
        ElseIf MissedSTKItemCHKB.Checked = False Then
            dsnewrow.Item("MISSED STOCK ITEM") = "NEATOL"
        End If
        If MissedAutomatedPartCHKB.Checked = True Then
            dsnewrow.Item("MISSED AUTOMATED") = Me.MissedAutomatedPartCHKB.Text
        ElseIf MissedAutomatedPartCHKB.Checked = False Then
            dsnewrow.Item("MISSED AUTOMATED") = "NEATOL"
        End If
        If MissingPrintAfterQTYCHKB.Checked = True Then
            dsnewrow.Item("MISSING PRINTS AFTER QUANTITY") = Me.MissingPrintAfterQTYCHKB.Text
        ElseIf MissingPrintAfterQTYCHKB.Checked = False Then
            dsnewrow.Item("MISSING PRINTS AFTER QUANTITY") = "NEATOL"
        End If
        If MissedPrintsNOTSentChadCHKB.Checked = True Then
            dsnewrow.Item("MISSED PRINT NOT SENT TO CHAD") = Me.MissedPrintsNOTSentChadCHKB.Text
        ElseIf MissedPrintsNOTSentChadCHKB.Checked = False Then
            dsnewrow.Item("MISSED PRINT NOT SENT TO CHAD") = "NEATOL"
        End If
        If OtherCHKB.Checked = True Then
            dsnewrow.Item("OTHER") = Me.OtherTXTB.Text
        ElseIf OtherCHKB.Checked = False Then
            dsnewrow.Item("OTHER") = "NEATOL"
        End If
        If AddedMissingDimCHKB.Checked = True Then
            dsnewrow.Item("ADDED MISSING DIMENSION") = Me.AddedMissingDimCHKB.Text
        ElseIf AddedMissingDimCHKB.Checked = False Then
            dsnewrow.Item("ADDED MISSING DIMENSION") = "NEATOL"
        End If
        If FixedDimensionCHKB.Checked = True Then
            dsnewrow.Item("FIXED DIMENSION") = Me.FixedDimensionCHKB.Text
        ElseIf FixedDimensionCHKB.Checked = False Then
            dsnewrow.Item("FIXED DIMENSION") = "NEATOL"
        End If
        ds.Tables("Counting").Rows.Add(dsnewrow)
        da.Update(ds, "Counting")
        MsgBox("Entry succesfully added to database.")

        MissedPartCHKB.Checked = False

        MissedAutomatedPartCHKB.Checked = False

        NotInEpicorCHKB.Checked = False

        NonStockCHKB.Checked = False

        MissedSTKItemCHKB.Checked = False

        MissedBuyoutCHKB.Checked = False

        MissedPrintsNOTSentChadCHKB.Checked = False

        MissingPrintAfterQTYCHKB.Checked = False

        AddedMissingDimCHKB.Checked = False

        FixedDimensionCHKB.Checked = False

        OtherCHKB.Checked = False

        OtherTXTB.Text = ""
        
      End Sub

У вас установлен/зарегистрирован этот провайдер "PROVIDER=Microsoft.ACE.OLEDB.12.0" на вашем локальном компьютере?

Andrew Mortimer 14.12.2020 15:05

Этот ответ касается отсутствующего провайдера: stackoverflow.com/questions/6649363/…

Andrew Mortimer 14.12.2020 15:09

@AndrewMortimer Спасибо за ответ! Я просмотрю этот пост и вернусь к вам, решил ли он мою проблему.

user14823575 14.12.2020 15:16

@AndrewMortimer Я установил файл, который согласуется с моей 64-битной версией, но ошибка все еще есть. Я пошел посмотреть свои настройки в диспетчере IIS, но он перенаправил меня в папку, а не в интерфейс. Возможно, у меня нет доступа к диспетчеру IIS. Любые идеи о том, как обойти это?

user14823575 14.12.2020 15:37

Посмотрите также 2-й и 3-й ответы в этой ссылке. Кажется, это связано с конфигурацией сборки и другими изменениями для вашей среды.

Andrew Mortimer 14.12.2020 15:43

@AndrewMortimer Большое спасибо за помощь, проблема решена!

user14823575 14.12.2020 16:04
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
6
163
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Попробуйте это с правильными точками с запятой:

    dbProvider = "PROVIDER=Microsoft.ACE.OLEDB.12.0;"
    dbSource = "Data Source=S:\software\Melton System\DPD & DEL (KPI)\Database1.accdb; Persist Security Info=False"
    con.ConnectionString = dbProvider & dbSource

Источник: https://www.connectionstrings.com/access-2013/

Боже милостивый, это сработало. Действительно нужно немного больше изучить правильное использование точки с запятой; огромное спасибо за помощь!

user14823575 14.12.2020 16:03
Ответ принят как подходящий

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

Dim builder As New OleDbConnectionStringBuilder

builder.Provider = "Microsoft.ACE.OLEDB.12.0"
builder.DataSource = "S:\software\Melton System\DPD & DEL (KPI)\Database1.accdb"
builder.PersistSecurityInfo = False

Using connection As New OleDbConnection(builder.ConnectionString)
    '...
End Using

Делая это правильно, вы не сможете забыть об кусочках, потому что обрывков не существует. Вы просто указываете значения. Вы также не в конечном итоге поместите значение PersistSecurityInfo в переменную с именем dbSource, если это не имеет ничего общего с источником данных. Делать вид, что разделяете компоненты строки подключения, но на самом деле не делать этого должным образом, хуже, чем не делать этого вообще.

Вы также можете упростить приведенный выше код примерно так:

Dim builder As New OleDbConnectionStringBuilder

With builder
    .Provider = "Microsoft.ACE.OLEDB.12.0"
    .DataSource = "S:\software\Melton System\DPD & DEL (KPI)\Database1.accdb"
    .PersistSecurityInfo = False
End With

или, сделав еще один шаг:

Dim builder As New OleDbConnectionStringBuilder With {.Provider = "Microsoft.ACE.OLEDB.12.0",
                                                      .DataSource = "S:\software\Melton System\DPD & DEL (KPI)\Database1.accdb",
                                                      .PersistSecurityInfo = False}

Спасибо, это было большим подспорьем!

user14823575 14.12.2020 16:33

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