VB.NET 访问 - 试图读取或写入受保护的内存

VB.NET Access - Attempted to read or write protected memory

我的代码生成此错误时遇到问题:

System.AccessViolationException: 'Attempted to read or write protected memory. This is often an indication that other memory is corrupt.

这发生在行 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()

我没有发现文件位置的连接字符串有任何问题。我希望您更正一些数据库代码。恐怕它会产生同样的错误,但请尝试一下。

需要释放公开 .Dispose 方法的数据库对象,以便它们可以释放非托管对象。连接和命令属于这一类。 Using...End Using 块将关闭并处置这些对象,即使出现错误也是如此。

您可以将连接字符串直接传递给连接的构造函数。你的方法没有问题,它只是稍微缩短了代码。同样,可以向命令构造函数传递命令文本和连接。

Option Strict 会告诉你 .ExecuteScalar() returns and object and it cannot be implicitly converted to an Integer.我们确定它将是一个整数,所以只需使用 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

我将提供商更改为:

"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" 现在一切正常:-)。