【问题标题】:An unhandled exception of type 'System.AccessViolationException' occurred vb.net 2013vb.net 2013 发生了“System.AccessViolationException”类型的未处理异常
【发布时间】:2016-08-28 04:24:02
【问题描述】:
Imports Microsoft.Office.Interop
Imports System.IO
Imports Access

Public Class Form1
Dim AccessApplication As Microsoft.Office.Interop.Access.Application

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

    AccessApplication = New Access.Application()

    If Not AccessApplication.Visible = True Then
        AccessApplication.Visible = True
    End If

    AccessApplication.OpenCurrentDatabase("C:\POS\POS.lib", False)

End Sub
End Class

我正在尝试从 vb.net 2013 打开“C:\POS\POS.lib”,但出现错误“System.AccessViolationException”,我尝试了很多方法来修复它但没有奏效: 出现错误就行了

  AccessApplication.OpenCurrentDatabase("C:\POS\POS.lib", False) 

这是完整的错误:

在 PosStartup.exe 中出现“System.AccessViolationException”类型的未处理异常

附加信息:试图读取或写入受保护的内存。这通常表明其他内存已损坏。

这是文件标志:

【问题讨论】:

  • 您确定POS.lib 文件是正确的MS Access 数据库吗?因为通常是 *.accdb 或 *.mdb 扩展名...
  • 出于特定目的,我将其从 .accdb 更改为 .lib,有什么方法可以打开 "C:\POS\POS.lib" 吗?
  • 您的数据库密码是否受保护?也许它已经在另一个应用程序中打开了?当您将其重命名回 .accdb 时,它会打开吗?
  • 对不起,它是.mde,重命名为POS.mde后,错误仍然出现!有什么建议吗?
  • 你的数据库文件有密码保护吗?

标签: vb.net ms-access


【解决方案1】:

找到原始文件扩展名,并在打开之前将文件重命名为具有此扩展名,并在关闭文件后将其重命名为具有“lib”扩展名。使用 System.Diagnostics.Process.Start 在新进程中启动 Access。系统根据文件扩展名知道打开Access:

If System.IO.File.Exists ("C:\POS\POS.lib") And Not System.IO.File.Exists Then ("C:\POS\POS.mdb") ' replace 'mdb' with the correct file extension
    System.IO.File.Move("C:\POS\POS.lib", "C:\POS\POS.mdb")' replace 'mdb' with the correct file extension
    System.Diagnostics.Process.Start("C:\POS\POS.mdb")' replace 'mdb' with the correct file extension
End If

【讨论】:

  • 谢谢,但 .lib .mde 和 .mdb 仍然有同样的错误!!
  • @Tony System.AccessViolationException 中的 Access 让我误以为错误是由 MS Access 引发的MS Access 问题。这完全是一个 .net 错误,从 CLR 托管应用程序访问非托管内存时引发。我的猜测:实际的 Access 应用程序分配内存供其使用,或用于执行时运行的代码。此内存不受 CLR 管理,并引发错误。我用谷歌找到了thisthis。请注意,与所有 Office 一样,Access 是 COM
  • @Tony,所以这个答案实际上完全没用......这是一个 hard-core .net 问题。
  • 嘿 Marlan,非常感谢您的帮助,但是还有其他方法(或代码)可以从 vb.net 打开访问文件吗?
【解决方案2】:

如果您不需要从 VB.net 应用程序管理 Access,请删除所有 Office.InteropAccess 命名空间对象,然后使用 System. Diagnostics.Process.Start 在新进程中启动 Access,并将文件作为参数发送给它:

System.Diagnostics.Process.Start ("Access.exe", "C:\POS\POS.lib")

【讨论】:

  • @Tony,请阅读herehere 了解此方法。基本上它应该像双击一样工作。
【解决方案3】:

Interop.DLL_Name.dll 重命名为 DLL_Name.dll 并将其引用到项目。将互操作设置为 true。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多