使用Delphi获取sqlite3.dll未找到错误

Nin*_*are 2 delphi sqlite delphi-xe3

sqlite3.dll在Delphi应用程序中找不到错误.我的电脑上已有sqlite3.dll文件E://sqlite-dll-win32-x86-3071700

我的来源如下

procedure TForm2.Button1Click(Sender: TObject);
var
    Results: TDataSet;
begin
    SQLConnection1.Params.Add('Database=E://empn.s3db');
    SQLConnection1.LibraryName := 'E://sqlite-dll-win32-x86-3071700/sqlite3.dll';
    try
        SQLConnection1.Connected := true;
        SQLMonitor1.Active := True;

        SQLConnection1.Execute('Selct * from usergroup', nil, Results)

    finally

    end;
end;
Run Code Online (Sandbox Code Playgroud)

正如上面提到的代码已经指出了库的路径

SQLConnection1.LibraryName := 'E://sqlite-dll-win32-x86-3071700/sqlite3.dll';
Run Code Online (Sandbox Code Playgroud)

但我仍然得到像sqlite3.dll找不到的错误.如何解决此错误?

JRL*_*JRL 5

小记

从Delphi XE3开始,LibraryName 已经过时了.

在较旧的Delphi版本中,LibraryName指示"与驱动程序关联的dbExpress库"(例如,用于Firebird的dbxfb.dll),而VendorLib指示"由数据库供应商提供的库以支持客户端使用数据库"(例如fbclient). Firebird的dll/fbembed.dll,相当于Sqlite的sqlite3.dll).


Embarcadero的Sqlite dbExpress驱动程序

在Windows上,此驱动程序使用sqlite3.dll的延迟加载.就像是:

function sqlite3_open_v2; external 'sqlite3.dll' delayed;
Run Code Online (Sandbox Code Playgroud)

所以dll加载LoadLibrary并且标准搜索策略适用于查找模块(首先是进程目录,然后是通常的路径列表).

但是,可以使用SetDllDirectory更改此状态.

所以你必须通过你的路径访问sqlite3.dll或尝试以下hack:

(请注意,这会干扰使用SetDllDirectory的其他代码;请参阅David Heffernan的评论)

SetDllDirectory('E:\sqlite-dll-win32-x86-3071700');
try
  SQLConnection1.Open;
finally
  SetDllDirectory(''); // restore default search order
end;
Run Code Online (Sandbox Code Playgroud)

警告:还要确保没有混合使用32位和64位模块(即32位exe和64位dll,反之亦然).