System.AccessViolationException 仅通过 WiFi 连接出现在 MS Access 数据库中
System.AccessViolationException occurs with MS Access databases just over WiFi connection
我正在为我的公司开发一个桌面应用程序(实际上它只是一个原型),用于为生产部门提供简单的服务(工具和流程说明、存在记录、产品可追溯性等)。
我正在使用 VB.net 和 wpf;一些 MS Access 数据库是后端。它使用 Access 数据库引擎 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 [" & tblName & "] SET [" & UpdateColumn & "]=@UpdateColumn WHERE [" & SearchInColumn & "] = " & DQ & SearchBy & DQ
Else
CommandString = "UPDATE [" & tblName & "] SET [" & UpdateColumn & "]=@UpdateColumn WHERE [" & SearchInColumn & "] = " & 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 & NewLine & ex.Message & NewLine & "Err. Number " & Err.Number, "Database Error", MessageBoxButton.OK, MessageBoxImage.Error)
UpdateDatabaseRecord = Err.Number
End Try
End Function
有时应用程序会在主线程中使用该函数;有时它从计划任务运行它(每两分钟由 forms.timer 计时)。这个任务显然不在主线程中,但是代码已经成功使用了几个月,计算机通过 LAN 电缆直接连接到公司网络。最近,我在通过 wifi 连接到公司网络的笔记本电脑上尝试了我的应用程序,但我遇到了一个使我的应用程序崩溃的异常。我在那台笔记本电脑上安装了 VS 来调试代码,我发现在行“CommandUpdate.ExecuteNonQuery”上引发了 AccessViolationException。
我尝试 google 它,但似乎不应从托管代码中引发此异常。
该错误仅发生在通过 wifi 连接的笔记本电脑上。
另外,另一个函数从数据库中读取数据:有时我会在打开连接的行中遇到同样的错误(connection.open)。
我应该检查什么?
提前致谢。
ps "ConnectionSelector" 是一个简单的函数,它 returns 基于数据库编号的适当的 ConnectionString。
编辑 1 - 使用普通无线路由器直接从实际有线网络插入 LAN 电缆创建 WiFi 网络。 IP 地址会自动分配并且连接正常,因为该应用程序能够从数据库中获取数据。
我自己解决了这个问题,我在这里发布了我找到的解决方案:希望它能对以后的人有所帮助。
我决定简单地为数据库连接启用所有 OLEDB 服务。看起来连接池确实有助于稳定性和性能,尤其是当我被迫使用 wifi 网络时。如果需要,Google“OLEDB 服务”并寻求启用它们。
我正在为我的公司开发一个桌面应用程序(实际上它只是一个原型),用于为生产部门提供简单的服务(工具和流程说明、存在记录、产品可追溯性等)。 我正在使用 VB.net 和 wpf;一些 MS Access 数据库是后端。它使用 Access 数据库引擎 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 [" & tblName & "] SET [" & UpdateColumn & "]=@UpdateColumn WHERE [" & SearchInColumn & "] = " & DQ & SearchBy & DQ
Else
CommandString = "UPDATE [" & tblName & "] SET [" & UpdateColumn & "]=@UpdateColumn WHERE [" & SearchInColumn & "] = " & 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 & NewLine & ex.Message & NewLine & "Err. Number " & Err.Number, "Database Error", MessageBoxButton.OK, MessageBoxImage.Error)
UpdateDatabaseRecord = Err.Number
End Try
End Function
有时应用程序会在主线程中使用该函数;有时它从计划任务运行它(每两分钟由 forms.timer 计时)。这个任务显然不在主线程中,但是代码已经成功使用了几个月,计算机通过 LAN 电缆直接连接到公司网络。最近,我在通过 wifi 连接到公司网络的笔记本电脑上尝试了我的应用程序,但我遇到了一个使我的应用程序崩溃的异常。我在那台笔记本电脑上安装了 VS 来调试代码,我发现在行“CommandUpdate.ExecuteNonQuery”上引发了 AccessViolationException。 我尝试 google 它,但似乎不应从托管代码中引发此异常。 该错误仅发生在通过 wifi 连接的笔记本电脑上。 另外,另一个函数从数据库中读取数据:有时我会在打开连接的行中遇到同样的错误(connection.open)。
我应该检查什么?
提前致谢。
ps "ConnectionSelector" 是一个简单的函数,它 returns 基于数据库编号的适当的 ConnectionString。
编辑 1 - 使用普通无线路由器直接从实际有线网络插入 LAN 电缆创建 WiFi 网络。 IP 地址会自动分配并且连接正常,因为该应用程序能够从数据库中获取数据。
我自己解决了这个问题,我在这里发布了我找到的解决方案:希望它能对以后的人有所帮助。
我决定简单地为数据库连接启用所有 OLEDB 服务。看起来连接池确实有助于稳定性和性能,尤其是当我被迫使用 wifi 网络时。如果需要,Google“OLEDB 服务”并寻求启用它们。