[英]How to Add New Records to An Access Database from Visual Studio. (VB.NET)
Disclaimer: I'm very new into programming, so my coding skills are subpar at best.免责声明:我对编程很陌生,所以我的编码技能充其量是低于标准的。
My goal is to have my Visual Studio 2019 project ( named Detailing Error Log ) add a new record row into my Microsoft Access Database table ( accdb file named Database1 , table named Data Collection) based on which checkboxes are checked.我的目标是让我的 Visual Studio 2019 项目(名为 Detailing Error Log )根据选中的复选框将新记录行添加到我的 Microsoft Access 数据库表(名为 Database1 的 accdb 文件,名为 Data Collection 的表)中。 I would only like rows to be added, not deleted, whenever the "Import" button is clicked.
每当单击“导入”按钮时,我只想添加行,而不是删除行。 The Database will then be saved and the checkboxes in my Visual Studio project unchecked.
然后将保存数据库,并且取消选中我的 Visual Studio 项目中的复选框。 The Database will be used to store that data until it is used by a coordinating visual studio program to count the occurrences of specific text within a specific month.
数据库将用于存储该数据,直到协调的 Visual Studio 程序使用它来计算特定月份内特定文本的出现次数。 From there it will be displayed in graphs.
从那里它将以图表的形式显示。
I had successfully accomplished this using Excel, however when the file became too large it caused a great deal of lag;我已经使用 Excel 成功完成了这项工作,但是当文件变得太大时,会导致很大的延迟; both whenever I ran the debugger and also when refreshing the graphs.
每当我运行调试器和刷新图形时。 I understand there will most likely be a noticeable loading time, but I would like it to be minimized.
我知道很可能会有明显的加载时间,但我希望将其最小化。
My problem is that I am getting this error at my con.Open(): "System.InvalidOperationException: 'The 'Microsoft.ACE.OLEDB.12.0Data Source = S:\software\System\DPD & DEL (KPI)\Database1.accdb' provider is not registered on the local machine."我的问题是我在 con.Open(): "System.InvalidOperationException: 'The 'Microsoft.ACE.OLEDB.12.0Data Source = S:\software\System\DPD & DEL (KPI)\Database1 .accdb' 提供程序未在本地计算机上注册。”
What does this error mean?这个错误是什么意思? This is also currently the only error thrown.
这也是目前唯一抛出的错误。
Here is my code for reference, thanks in advance for the help!这是我的代码供参考,在此先感谢您的帮助!
*NEATOL = "No Entry At Time Of Log" *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
Try this having the correct semicolons:试试这个有正确的分号:
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
Source: https://www.connectionstrings.com/access-2013/资料来源: https://www.connectionstrings.com/access-2013/
It might seem like a good idea to build your connection string that way but it's not.以这种方式构建连接字符串似乎是个好主意,但事实并非如此。 If you want to break it up then do so properly:
如果你想打破它,那么正确地这样做:
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
Doing it properly, you can't forget bits and pieces because there are no bits and pieces.做得好,你不能忘记点点滴滴,因为没有点点滴滴。 You just supply the values.
您只需提供值。 You also won't end up putting the
PersistSecurityInfo
value into a variable named dbSource
when it's nothing to do with the data source.当
PersistSecurityInfo
值与数据源无关时,您也不会最终将其放入名为dbSource
的变量中。 Pretending to separate your connection string components but not actually doing it properly is worse than not doing it at all.假装分离你的连接字符串组件但实际上没有正确地做它比根本不做更糟糕。
You can also simplify the code above somewhat like so:您还可以像这样简化上面的代码:
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
or, taking it a step further:或者,更进一步:
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.