我在Delphi应用程序中收到sqlite3.dll
未找到错误。我的电脑上已经有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这样的错误找不到。如何解决此错误?
一个小音符
从DelphiXE3开始,LibraryName
已经过时。
在较旧的Delphi版本中,LibraryName表示"与驱动程序关联的dbExpress库"(例如,用于Firebird的dbxfb.dll),而VendorLib表示<em]"由数据库供应商提供的支持客户端使用数据库的库">(例如:用于Firebird的fbclient.dll/fb-embed.dll,相当于Sqlite的sqlite3.dll)。
Embarcadero的Sqlite dbExpress驱动程序
在Windows上,此驱动程序使用sqlite3.dll的延迟加载
function sqlite3_open_v2; external 'sqlite3.dll' delayed;
因此dll是用LoadLibrary加载的,并且应用标准搜索策略来查找模块(首先是进程目录,然后是常用路径列表)。
但是,可以使用SetDllDirectory更改此状态。
所以你必须让sqlite3.dll可以通过你的路径访问,或者尝试以下破解:
(注意这会干扰使用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,反之亦然)。
Delphi XE7中也出现了同样的错误,下载自https://www.sqlite.org/download.html,windows的二进制文件并将de sqlite3.def复制到您正在使用的系统文件(system32或SysWOW64)中。它似乎在DelphiXE7的安装中丢失了。
根据这篇Embarcadero博客文章,您需要采取的步骤是:
- 从下载SQLite客户端http://www.sqlite.org/download.html.
- 请确保您的应用程序可以找到sqlite3.dll
- 添加一个
TSQLConnection
实例,并将Driver
属性设置为Sqlite
在我看来,你好像还没有执行第三步。
关于步骤2,实现这一点的首选方法是将DLL放在与可执行文件相同的目录中。
@TLama、@David Heffernan、JRL和许多其他人,它最终与用于SQLite的Dotconnect一起实现了。我还没有尝试过TLama建议的用于SQLite的DBExpress驱动程序。我认为DBExpress驱动程序也会解决这个问题,因为dotconnect和DBExpress驱动都有类似的实用程序。
我在使用Delphi XE7时遇到了同样的问题。原来我下载了64位DLL,但应用程序是32位的。我将32位DLL复制到应用程序文件夹中,然后就可以连接了。有人(JRL)在上面说过。。。
警告:还要确保没有混合32位和64位模块(即32位exe和64位dll,反之亦然)