Delphi Ado EdatabaseError从不同线程连接到访问数据库

发布于 2025-02-08 15:19:55 字数 1717 浏览 1 评论 0原文

我正在尝试使用在单独的线程上创建的tadoconnection打开与访问数据库的连接。打开连接时,data.win.adodb抛出了EdatabaseError“外部异常C06D007F”。我尝试进行搜索,并且只能找到添加呼叫以共同化/求解的示例,并且不确定我的代码还有什么问题。当未在ttask或tthread中执行时,相同的连接代码会成功。

更新:当我用32位编译测试应用程序时,该代码可以工作,但失败的64位失败。我在计算机上安装了32位和64位数据库引擎。我卸载了64位引擎,并用最新一个来自微软,错误消失了。

  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;  

I am attempting to open a connection to an Access database using a TADOConnection created on separate threads. On opening the connection an EDatabaseError 'External exception C06D007F' is thrown in Data.Win.ADODB. I tried searching and was only able to find examples adding calls to CoInitialize/CoUninitialize, and am not sure what else is wrong with my code. The same connection code succeeds when not executed in a TTask or TThread.

Update: The code works when I compile the test app with 32 bit, but fails with 64 bit. I have both Access 32 bit and 64 bit database engines installed on my computer. I uninstalled the 64 bit engine and reinstalled with the latest one from Microsoft and the errors went away.

  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;  

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文