VB.NET 访问 - 试图读取或写入受保护的内存
Posted
技术标签:
【中文标题】VB.NET 访问 - 试图读取或写入受保护的内存【英文标题】:VB.NET Access - Attempted to read or write protected memory 【发布时间】:2019-12-19 01:09:02 【问题描述】:我的代码产生了这个错误:
System.AccessViolationException: '试图读或写保护 记忆。这通常表明其他内存已损坏。
这发生在My_CONNECTION.Open()
行。
知道如何解决这个问题吗?
我的代码:
vb.net
Dim My_USER As String = Environment.UserName
Dim My_CONNECTION As New OleDbConnection
Dim My_DATABASE As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\" & My_USER & "\AppData\Roaming\MYAPP\MYDTB.accdb;Persist Security Info=False;"
Dim My_COMMAND As New OleDbCommand
Dim My_READER As OleDbDataReader
Dim My_COUNT As Integer
'### Open connection ###
My_CONNECTION.ConnectionString = My_DATABASE
My_CONNECTION.Open()
'### SQL ###
With My_COMMAND
.CommandText = "SELECT COUNT(*) FROM MYDTB"
.CommandType = CommandType.Text
.Connection = My_CONNECTION
End With
My_COUNT = My_COMMAND.ExecuteScalar()
'### Close connection ###
My_CONNECTION.Close()
【问题讨论】:
有什么方法可以检查 dtb 是否正在使用另一个进程? 尝试将所有代码放入 Try Catch 块中。查看 InnerException,如果有的话。您可以尝试的另一件事是将数据库移动到另一个文件夹。 请开启 Option Strict。这是一个两部分的过程。首先对于当前项目 - 在解决方案资源管理器中双击我的项目。选择左侧的编译。在 Option Strict 下拉列表中选择 ON。未来项目的第二个 - 转到工具菜单 -> 选项 -> 项目和解决方案 -> VB 默认值。在 Option Strict 下拉列表中选择 ON。这将使您避免在运行时出现错误。 你的表名MYDTB和数据库的文件名一样吗? 这是为了公共帮助而改变的 :-) 【参考方案1】:我看不出你的文件位置的连接字符串有什么问题。我希望您更正一些数据库代码。恐怕它会产生同样的错误,但请尝试一下。
需要释放 .Dispose 方法的数据库对象,以便它们可以释放非托管对象。连接和命令属于这一类。 Using...End Using 块将关闭并处置这些对象,即使出现错误。
您可以将连接字符串直接传递给连接的构造函数。您的方式没有问题,它只是稍微缩短了代码。同样,命令构造函数可以传递命令文本和连接。
Option Strict 会告诉您 .ExecuteScalar()
返回和对象,并且它不能隐式转换为整数。我们确信它将是一个整数,所以只需使用CInt()
连接应在最后一刻打开并尽快关闭。 End Using 关闭连接。
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim My_USER As String = Environment.UserName
Dim My_COUNT As Integer
Using My_CONNECTION As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\" & My_USER & "\AppData\Roaming\MYAPP\MYDTB.accdb;Persist Security Info=False;")
Using My_COMMAND As New OleDbCommand("SELECT COUNT(*) FROM MYDTB", My_CONNECTION)
My_CONNECTION.Open()
My_COUNT = CInt(My_COMMAND.ExecuteScalar())
End Using
End Using
Label1.Text = My_COUNT.ToString
End Sub
【讨论】:
嗨,玛丽,我尝试了您的代码,但在读/写保护内存方面仍然存在问题。这可能是由多个连接到同一个数据库引起的吗?非常感谢 对不起,我担心会发生这种情况。这里有一堆答案***.com/questions/4074585/… 也许有 44 票赞成的答案会有所帮助。您不是唯一一个出现此错误的人! 还发现 "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=C:\DbTest\Test.accdb; OLE DB Services=-1" 似乎添加了 OLE DB Services = -1做这个把戏。我用谷歌搜索“试图连接到访问错误读/写受保护的内存”并且有很多链接可供查看。【参考方案2】:我将提供者更改为:
"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\DbTest\Test.accdb;Persist Security Info=False;"
到:
"Provider=Microsoft.ACE.OLEDB.12.0; Data Source=C:\DbTest\Test.accdb; OLE DB Services=-1"
仅添加:“OLE DB Services=-1”,现在一切正常 :-)。
【讨论】:
以上是关于VB.NET 访问 - 试图读取或写入受保护的内存的主要内容,如果未能解决你的问题,请参考以下文章
VB.net调用DLL,捕捉到AccessVioationException尝试读取或写入受保护的内存。这通常指示其他内存已损坏。
LinQ 试图读取或写入受保护的内存。这通常表明其他内存已损坏
System.accessviolationexception 试图读取或写入受保护的内存。这通常表明其他内存已损坏