Delphi Ado EdatabaseError从不同线程连接到访问数据库
我正在尝试使用在单独的线程上创建的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 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论