VB.NET中OleDB出现未处理的AccessViolationException问题求助
解决Excel OLEDB读取时的“Attempted to read or write protected memory”错误
嘿,这个错误我之前帮人排查过不少,结合你的VB.NET代码来看,大概率和驱动兼容性、资源未正确释放或者文件格式不匹配有关,给你几个具体的排查和解决方向:
1. 先搞定OLEDB驱动的兼容性问题
你用的是Microsoft.ACE.OLEDB.12.0驱动,这里最容易踩坑的是系统位数和驱动位数不匹配:
- 如果你的操作系统是64位,但程序是32位编译的,必须安装32位的ACE驱动,同时在Visual Studio的项目属性里把“平台目标”设为
x86; - 要是程序是64位的,就装64位的ACE驱动。别搞混了,位数不匹配会直接触发底层内存访问错误。
2. 确保Excel文件没被占用
检查一下你要读取的Excel文件是不是正被Excel软件或者其他进程打开着——如果文件被锁定,OLEDB连接时很容易出现这种内存异常,先把文件关掉再试。
3. 用Using语句正确释放资源
你的代码里没有显式关闭数据库连接和释放适配器资源,长期运行容易导致内存泄漏,进而触发这个错误。修改代码,用Using自动管理资源:
Using cn As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" + textSelectFiles.Text + ";Extended Properties=Excel 8.0;") Using da As New OleDbDataAdapter("SELECT * FROM [" & ComboBox1.SelectedValue & "]", cn) Dim dt As New DataTable da.Fill(dt) ' 在这里处理DataTable里的数据 End Using End Using
Using块会在代码执行完后自动调用对象的Dispose方法,确保连接、适配器这些资源被彻底释放,避免内存损坏。
4. 检查Excel格式和SQL语句的正确性
- 确认
ComboBox1.SelectedValue的格式是否正确:Excel的表名需要带$后缀,比如Sheet1$,如果你的下拉选项里没有这个后缀,记得补上; - 如果你读取的是xlsx格式的文件,
Extended Properties应该改成Excel 12.0 Xml,而不是Excel 8.0(后者是针对旧版xls格式的),格式不匹配也会导致底层内存错误。
5. 排查系统级内存问题
偶尔这个错误也可能是系统内存不足或者其他进程的内存损坏导致的,试试重启电脑,关闭不必要的后台进程后再运行程序,说不定就能解决。
建议你先从驱动兼容性和资源释放这两点入手排查,这是最常见的解决方向。
内容的提问来源于stack exchange,提问作者Cremlic
相关产品推荐
相关产品推荐

