#vb.net #ms-access #exception #aceoledb
#vb.net #ms-access #исключение #aceoledb
Вопрос:
Я разрабатываю настольное приложение для своей компании (на самом деле это всего лишь прототип) для предоставления простых услуг производственному отделу (инструкции по инструментам и процессам, записи присутствия, отслеживание продукта и т.д.). Я использую VB.net и wpf; некоторые базы данных MS Access являются серверной частью. Он использует Access Database Engine 2016.
У меня есть простая функция, используемая для обновления записей базы данных, вот она:
Public Function UpdateDatabaseRecord(DatabaseNumber As Integer, tblName As String, SearchInColumn As String, SearchBy As String, UpdateColumn As String, UpdateTo As String) As Integer
Try
Using ServerConnection As New OleDbConnection(ConnectionSelector(DatabaseNumber))
Dim CommandString As String
If SearchInColumn <> "ID" Then
CommandString = "UPDATE [" amp; tblName amp; "] SET [" amp; UpdateColumn amp; "]=@UpdateColumn WHERE [" amp; SearchInColumn amp; "] = " amp; DQ amp; SearchBy amp; DQ
Else
CommandString = "UPDATE [" amp; tblName amp; "] SET [" amp; UpdateColumn amp; "]=@UpdateColumn WHERE [" amp; SearchInColumn amp; "] = " amp; SearchBy
End If
Dim CommandUpdate As New OleDbCommand(CommandString, ServerConnection) With {.CommandTimeout = 10000}
With CommandUpdate.Parameters
.AddWithValue("@UpdateColumn", UpdateTo)
End With
ServerConnection.Open()
CommandUpdate.ExecuteNonQuery()
ServerConnection.Close()
End Using
UpdateDatabaseRecord = 0
SetCentralTimeStamp(DatabaseNumber, tblName)
Catch ex As Exception
Msg(Reflection.MethodBase.GetCurrentMethod.Name amp; NewLine amp; ex.Message amp; NewLine amp; "Err. Number " amp; Err.Number, "Database Error", MessageBoxButton.OK, MessageBoxImage.Error)
UpdateDatabaseRecord = Err.Number
End Try
End Function
Иногда приложение использует эту функцию в главном потоке; иногда оно запускает ее из запланированной задачи (с тактовой частотой forms.timer каждые две минуты). Очевидно, что эти задачи не входят в основной поток, но код успешно использовался в течение нескольких месяцев с компьютерами, напрямую подключенными к сети компании через кабель LAN. Недавно я попробовал свое приложение на ноутбуке, подключенном через Wi-Fi к сети компании, и я получаю исключение, которое приводит к сбою моего приложения. Я установил VS на этот ноутбук для отладки кода и обнаружил, что в строке «CommandUpdate возникает AccessViolationException.ExecuteNonQuery«.
Я попытался погуглить, но, похоже, это исключение не должно вызываться из управляемого кода.
Ошибка возникает только с ноутбуком, подключенным через WiFi.
Кроме того, другая функция считывает данные из баз данных: иногда я получаю ту же ошибку в ней, в строке, в которой открывается соединение (connection.open).
Что я должен проверить?
Заранее спасибо.
ps «ConnectionSelector» — это простая функция, которая возвращает соответствующую строку подключения на основе номера базы данных.
РЕДАКТИРОВАТЬ 1 — Сеть Wi-Fi создается при непосредственном подключении кабеля локальной сети к реальной проводной сети с использованием общего беспроводного маршрутизатора. IP-адреса назначаются автоматически, и соединение работает, поскольку приложение может получать данные из баз данных.
Комментарии:
1. Похоже, для меня это проблема сетевой инфраструктуры, если она работает безупречно при жестком подключении. Действительно ли Wi-Fi подключен к той же сети, что и кабельные соединения? Совпадают ли диапазоны IP-адресов?
2. Сеть Wi-Fi создается при непосредственном подключении кабеля локальной сети к реальной проводной сети с использованием общего беспроводного маршрутизатора. IP-адреса назначаются автоматически. Есть ли какие-либо настройки, которые я должен проверить с беспроводного маршрутизатора? Может ли это быть проблемой объединения?
3. Ваше соединение в конечном итоге разрешено для открытия ФАЙЛА. По сути, это НЕ подключение к сокетам tc / ip, а сохранение файла открытым по сети. Если в этом соединении есть один крошечный сбой? затем дескриптор файла теряется и, следовательно, so является надежным подключением к базе данных. Это может привести к повреждениям во время обновлений. Это очень похоже на сбой транспортера Star trek, и если поток данных прерывается или повреждается во время транспортировки, то молекулы человека не могут быть повторно собраны на другой стороне, или в этом случае состояние вашего файла и буферы теряются. Sql express для Wi-Fi — хорошая идея.
Ответ №1:
Я решил проблему сам и размещаю здесь найденное мной решение: я надеюсь, что это поможет кому-то в будущем.
Я решил просто включить все службы OLEDB для подключения к базе данных. Похоже, что объединение пулов соединений действительно помогает стабильности и производительности, особенно при использовании сети Wi-Fi, как я вынужден делать. Если вы хотите, найдите в Google «Службы OLEDB» и найдите, чтобы включить их все.