You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 07:39:21