我在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;
如上所述,代码已经通过
指出了库的路径SQLConnection1.LibraryName := 'E://sqlite-dll-win32-x86-3071700/sqlite3.dll';
但我仍然得到sqlite3.dll找不到的错误。如何解决此错误?
答案 0 :(得分:5)
从Delphi XE3开始,LibraryName
is obsolete。
在较旧的Delphi版本中,LibraryName表示“与驱动程序关联的dbExpress库”(例如dbxfb.dll for Firebird),而VendorLib表示 “由数据库供应商提供的库,以支持客户端使用数据库”(例如,对于Firebird的fbclient.dll / fbembed.dll,相当于Sqlite的sqlite3.dll)。
在Windows上,此驱动程序使用delayed loading sqlite3.dll。类似的东西:
function sqlite3_open_v2; external 'sqlite3.dll' delayed;
所以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;
警告:还要确保不要混用32位和64位模块(即32位exe和64位dll,反之亦然)。
答案 1 :(得分:1)
根据this Embarcadero blog article,您需要采取的步骤是:
TSQLConnection
个实例,并将Driver
属性设置为Sqlite
。在我看来,好像你没有执行第3步。
关于第2步,实现这一目标的首选方法是将DLL放在与可执行文件相同的目录中。
答案 2 :(得分:1)
@TLama,@ David Heffernan,JRL和其他许多人,最终用Dotconnect for SQLite解决了这个问题。我没有按照TLama的建议尝试DBExpress Driver For SQLite。我认为DBExpress Driver也可以解决问题,因为dotconnect和DBExpress驱动程序都有类似的功能。
答案 3 :(得分:1)
Delphi XE7中发生同样的错误, 从https://www.sqlite.org/download.html下载Windows的二进制文件 并在您正在使用的系统文件(system32或SysWOW64)中复制de sqlite3.def。 在Delphi XE7的安装中似乎缺少它。
答案 4 :(得分:1)
我在使用 Delphi XE7 时遇到了同样的问题。结果我下载了 64 位 DLL,但应用程序是 32 位的。我将 32 位 DLL 复制到应用程序文件夹,然后就可以连接了。上面有人 (JRL) 说了这个...
警告:还要确保您没有混合使用 32 位和 64 位模块(即 32 位 exe 和 64 位 dll,反之亦然)。