Delphi多线程下TADOConnection连接Access报EDatabaseError异常
问题描述
在独立线程中创建TADOConnection实例连接Access数据库,执行Open连接操作时,Data.Win.ADODB模块抛出EDatabaseError类型错误,提示 "External exception C06D007F"。
初期检索资料仅找到「线程内需要添加CoInitialize/CoUninitialize调用」的解决方案,按方案调整代码后问题仍未解决,且完全相同的连接逻辑在非TTask/TThread的主线程环境下可正常运行。
排查过程
后续交叉测试定位到核心特征:
- 程序编译为32位版本时,代码可正常运行
- 程序编译为64位版本时,稳定复现上述连接错误
进一步排查本机运行环境,确认此前同时安装了32位和64位Access数据库引擎,卸载原有旧版64位引擎后,重新安装微软官方最新版本的Access数据库引擎,该异常问题彻底消失。
复现代码
const ConnectionString: string = 'Provider=Microsoft.ACE.OLEDB.16.0;Data Source="C:\Users\Public\Documents\TestDatabase.mdb"'; function TMainForm.CreateADOConnection(const AConnectionString: string): TADOConnection; begin Result := TADOConnection.Create(nil); Result.ConnectionString := AConnectionString; Result.LoginPrompt := False; end; procedure TMainForm.CreateDBConnections; var LTasks: array of ITask; begin SetLength(LTasks, 2); LTasks[0] := TTask.Create(procedure var LConn1: TADOConnection; begin CoInitialize(nil); try LConn1 := CreateADOConnection(ConnectionString); try LConn1.Open; LConn1.Close; finally LConn1.Free; end; finally CoUninitialize; end; end); LTasks[1] := TTask.Create( procedure var LConn2: TADOConnection; begin CoInitialize(nil); try LConn2 := CreateADOConnection(ConnectionString); try LConn2.Open; LConn2.Close; finally LConn2.Free; end; finally CoUninitialize; end; end); LTasks[0].Start; LTasks[1].Start; TTask.WaitForAll(LTasks); end;
内容的提问来源于stack exchange,提问作者Scott Kolby
相关产品推荐
相关产品推荐

