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" 现在一切正常:-)。
我的代码生成此错误时遇到问题:
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" 现在一切正常:-)。