Отказ от ответственности: я очень новичок в программировании, поэтому мои навыки кодирования в лучшем случае не на должном уровне.
Моя цель состоит в том, чтобы мой проект 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
Этот ответ касается отсутствующего провайдера: stackoverflow.com/questions/6649363/…
@AndrewMortimer Спасибо за ответ! Я просмотрю этот пост и вернусь к вам, решил ли он мою проблему.
@AndrewMortimer Я установил файл, который согласуется с моей 64-битной версией, но ошибка все еще есть. Я пошел посмотреть свои настройки в диспетчере IIS, но он перенаправил меня в папку, а не в интерфейс. Возможно, у меня нет доступа к диспетчеру IIS. Любые идеи о том, как обойти это?
Посмотрите также 2-й и 3-й ответы в этой ссылке. Кажется, это связано с конфигурацией сборки и другими изменениями для вашей среды.
@AndrewMortimer Большое спасибо за помощь, проблема решена!





Попробуйте это с правильными точками с запятой:
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}
Спасибо, это было большим подспорьем!
У вас установлен/зарегистрирован этот провайдер "PROVIDER=Microsoft.ACE.OLEDB.12.0" на вашем локальном компьютере?