簡體   English   中英

如何從 Visual Studio 將新記錄添加到 Access 數據庫。 (VB.NET)

[英]How to Add New Records to An Access Database from Visual Studio. (VB.NET)

免責聲明:我對編程很陌生,所以我的編碼技能充其量是低於標准的。

我的目標是讓我的 Visual Studio 2019 項目(名為 Detailing Error Log )根據選中的復選框將新記錄行添加到我的 Microsoft Access 數據庫表(名為 Database1 的 accdb 文件,名為 Data Collection 的表)中。 每當單擊“導入”按鈕時,我只想添加行,而不是刪除行。 然后將保存數據庫,並且取消選中我的 Visual Studio 項目中的復選框。 數據庫將用於存儲該數據,直到協調的 Visual Studio 程序使用它來計算特定月份內特定文本的出現次數。 從那里它將以圖表的形式顯示。

我已經使用 Excel 成功完成了這項工作,但是當文件變得太大時,會導致很大的延遲; 每當我運行調試器和刷新圖形時。 我知道很可能會有明顯的加載時間,但我希望將其最小化。

我的問題是我在 con.Open(): "System.InvalidOperationException: 'The '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

試試這個有正確的分號:

    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/

以這種方式構建連接字符串似乎是個好主意,但事實並非如此。 如果你想打破它,那么正確地這樣做:

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}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM