0

我正在为我的公司开发一个桌面应用程序(实际上它只是一个原型),用于为生产部门提供简单的服务(工具和流程说明、存在记录、产品可追溯性等)。我正在使用 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“。我试图用谷歌搜索它,但似乎不应从托管代码中引发此异常。该错误仅在通过 wifi 连接的笔记本电脑时发生。此外,另一个函数从数据库中读取数据:有时我会遇到同样的错误, 在打开连接的行 (connection.open)。

我应该检查什么?

提前致谢。

ps "ConnectionSelector" 是一个简单的函数,它根据数据库编号返回适当的 ConnectionString。

编辑 1 - 使用普通无线路由器直接从实际有线网络插入 LAN 电缆创建 WiFi 网络。IP 地址是自动分配的,并且连接正常,因为该应用程序能够从数据库中获取数据。

4

1 回答 1

0

我自己解决了这个问题,我在这里发布了我找到的解决方案:我希望它会在未来对某人有所帮助。

我解决了简单地为数据库连接启用所有 OLEDB 服务。看起来连接池确实有助于稳定性和性能,尤其是在我被迫使用 wifi 网络时。如果你愿意,谷歌“OLEDB 服务”并寻找启用它们。

于 2020-11-01T15:42:14.870 回答