https://wiki.freepascal.org/Firebird_embedded
什么是 Firebird EmbeddedFirebird Embedded 是 Firebird 数据库做事器的分外版本。它许可您在没有专用数据库做事器的情形下运行程序。相反,您将一个库 (DLL/.so/.dylib) 添加到您的运用程序中并让您的运用程序利用该库访问您的 Firebird .fdb 数据库文件。这类似于 Microsoft Access 和 LibreOffice Base 等程序的事情办法。
优点在许多架构上运行(Linux、macOS、Windows、FreeBSD、Solaris)无需单独的做事器设置,降落繁芜性您可以轻松地从嵌入式切换到完全的客户端/做事器 - 无需变动一行代码(连接字符串除外)。与 sqlite 比较,这可能是一个不错的上风。缺陷仅单用户访问分发时须要与您的程序一起分发一些库(除非您可以静态链接它们)安装在 Windows 上,Firebird 嵌入式和常规 Firebird 客户端库是不同的文件。Firebird Embedded 始终可以用作常规客户端,使其成为您安装中的合理选择。
Windows
下载并解压缩 Firebird 嵌入式套件。确保 .dll 和 .manifest 文件是:
在您的项目目录和可实行输出目录(天生 .exe 的位置)或在 PATH 中的目录中(不是系统目录)(如果您不想连续复制 dll,则很有用)请把稳,位数必须匹配:如果您为 64 位编译程序,则必须利用 64 位嵌入式版本,如果您正在编写 32 位程序,则必须利用 32。还要确保将 .dlls 和 .manifest 文件放置在您的项目输出(可实行)目录中,并将它们与您的运用程序以及容许证文件一起分发。
作为指示,Firebird 2.5 的最低必要文件是:
fbembed.dllfirebird.msgib_util.dllicudt30.dllicuin30.dllicuuc30.dllIDPLicense.txtIPLicense.txtMicrosoft.VC80.CRT.manifestmsvcp80.dllmsvcr80.dll
Linux
对付 Debian,可能与 Ubuntu 类似:
获取库文件以及符号链接:例如 /usr/lib/x86_64-linux-gnu/libfbembed.so 链接到 /user/lib/x86_64-linux-gnu/libfbembed.so.bla.xy
aptitude install libfbembed2.5 firebird-dev
至少对付 Firebird 2.5+:不要指定用户名或密码,由于这将逼迫查找 security.fdb,如果无法访问系统范围的 security.fdb,则可能会失落败。请在 Firebird 2.5+ 上指定角色 RDB$ADMIN,由于这该当让您完备掌握数据库文件。
将这些文件放在您的项目目录中(要做:测试是否都须要):
firebird/libfbembed.so (or perhaps libfbembed.so.2.5)firebird.conffirebird/security.fdb #perhaps not necessaryfirebird/intl/fbintlfirebird/udf/fbudf.so
对付 Firebird 3,您将须要:
firebird/libfbclient.soplugins/libEngine12.so
您须要变动插件目录变量。如果你不能这样做,你须要将 libEngine 放到它的原始目录中。
已经在 firebird.conf 中设置了这个(要做:检讨这是否都须要)
RootDirectory=./firebird #replace with your directoryDatabaseAccess = Full #probably usefulExternalFileAccess = Full #probably usefulUdfAccess = Full #probably useful#disable#TempDirectories = /tmp #=> didn39;t fix /tmp/firebird lock issues#TempDirectories = ~/tmp #=> didn't fix /tmp/firebird lock issues
运用程序启动前须要设置两个环境变量。假设运用程序安装在 /home/pascaldev/embed 中:
# tell dynamic loader where to find embedded lib:LD_LIBRARY_PATH=/home/pascaldev/embed/firebird# tell server where to find files (messages, config etc)FIREBIRD=. #or use absolute path: /home/pascaldev/embed
如果您碰着缺点,例如
EIBDatabaseError/ : DoInternalConnect : -Can't access lock files' directory /tmp/firebird
您可能有其他用户拥有的迂腐锁定文件删除 /tmp/firebird 目录有效,但问题是它将在您自己确当地权限下重新创建
连接到 Firebird 做事器如前所述,嵌入式 Firebird 可以像普通的 Firebird 客户端一样事情。因此,利用嵌入式 Firebird 库而不是客户端/做事器 Firebird 库可以帮助您的运用程序更加灵巧。
把稳:至少在 Firebird 嵌入式 2.5.3 和 FPC 2.6.4 中存在一个缺点,在关闭与远程做事器的连接时会崩溃。此缺点已在 FPC 中继中修复。
利用一旦您在精确的路径中拥有了精确的 Firebird 嵌入式库(见上文),您须要指定您连接到嵌入式而不是客户端做事器环境。将 IBConnection 工具的主机名属性留空。别的属性的事情办法与客户端/做事器版原形似,例如 DatabaseName 是您的 .fdb 文件的完全路径,如果它与 fbembed.dll 位于同一目录中,则只是数据库名称。此外,旧版本的 FPC(FPC 2.6.2+ 当然不须要这个)可能须要您将UseEmbeddedFirebird属性设置为 true。SQLDB 单元中不存在该属性,但您须要将 ibase60dyn 添加到您的 uses 子句中。
创建数据库利用 Firebird ISQL您可以利用 Firebird isql 运用程序创建数据库(例如,在常规 Firebird(客户端)包中供应)。在 Windows 上,此可实行文件应与 fbembed.dll 位于同一目录中。把稳:isql 须要 fbclient 库,而不是 fbembed;您可以复制并重命名 fbembed,例如 Windows 上的 fbclient.dll,以办理此问题。运行isql,然后实行:
create database 'employee.fdb' user 'SYSDBA' password 'masterkey' page_size 16384 default character set UTF8;exit;
删除数据库基本上意味着删除文件,但您也可以运行: isql
connect 'employee.fdb' user 'sysdba' password 'masterkey';drop database;commit;exit;
以编程办法创建数据库
您还可以在程序中创建数据库。下面创建测试数据库部分中的程序显示了如何检测丢失的数据库并动态创建它们。在初始化表单(FormShow 事宜)时,可以在 Lazarus 运用程序中调用类似的过程。
创建表、视图、触发器等工具...在 Firebird 和 Firebird 嵌入式中创建工具,与大多数事情一样是相同的。
手动创建数据库isql
create database 'test.fdb' user 'SYSDBA' password 'masterkey' page_size 16384 default character set UTF8;exit;
以编程办法创建数据库
您可以以编程办法创建数据库。下面的示例创建了一个本地的嵌入式数据库,但可以轻松地将其变动为远程数据库(调度主机名和必要时的路径):
program firebirdembeddedtest;{$mode objfpc}{$H+}uses {$IFDEF UNIX}{$IFDEF UseCThreads} cthreads, {$ENDIF}{$ENDIF} Classes, SysUtils, sqldb, IBConnection {for Firebird};const // Name for the database. Be sure to specify the same name in your database.ini DatabaseFile = 'test.fdb'; //Sensible name for a test database, right?var Fire: TIBConnection;begin //Connection to Firebird database // The next line is needed for quite old FPC versions // Newer versions will first look for fbembed.dll in the application directory automatically //UseEmbeddedFirebird:=true; // Using embedded (and fbembed.dll) or regular client/server (fbclient.dll), requires ibase60dyn in uses Fire:=TIBConnection.Create(nil); try Fire.HostName := ''; //must be empty for embedded Firebird; must be filled for client/server Firebird Fire.DatabaseName := DatabaseFile; //(path and) filename // Username and password do not matter for authentication, but you do get authorizations in the database // based on the name (and optionally role) you give. Fire.Username := 'SYSDBA'; Fire.Password := 'masterkey'; //default password for SYSDBA Fire.Charset := 'UTF8'; //Send and receive string data in UTF8 encoding Fire.Dialect := 3; //Nobody uses 1 or 2 anymore. Fire.Params.Add('PAGE_SIZE=16384'); //I like a large page size (used when creating a database). Useful for larger indexes=>larger possible column sizes // Find out if there is a database in the application directory. // If not, create it. Note: this may fail if you don't have enough permissions. // If you use client/server, you obviously don't need this part of the code. if (FileExists(DatabaseFile)=false) then begin writeln('File '+DatabaseFile+' does not exist.'); writeln('Creating a Firebird embedded database...'); // Create the database as it doesn't exist try Fire.CreateDB; //Create the database file. except on E: Exception do begin writeln('ERROR creating database. Probably problems loading embedded library:'); writeln('- not all files present'); writeln('- wrong architecture (e.g. 32 bit instead of 64 bit)'); writeln('Exception message:'); writeln(E.ClassName+'/'+E.Message); end; end; Fire.Close; end; finally Fire.Free; end; end.
5.2 利用 FireBird Embedded 进行数据库开拓
1.在 Lazarus 环境下创建一个运用
2.将 FireBird Embedded 数据库解压缩到某个目录,我采取的是:
Firebird-2.5.9.27139-0_x64_embed.zip
解压缩后的文件如下图所示:
3.将如下文件复制到 Lazarus 运用所在目录
fbembed.dllfirebird.msgib_util.dllicudt30.dllicuin30.dllicuuc30.dllIDPLicense.txtIPLicense.txtMicrosoft.VC80.CRT.manifestmsvcp80.dllmsvcr80.dll
4.将同版本号的 FireBird C/S 版本的 isql.exe 文件复制到Lazarus 运用所在目录,我采取的是:
Firebird-2.5.9.27139-0_x64.zip
5.复制 fbembed.dll 文件并重命名为 fbclient.dll
6.在 cmd 命令提示符下实行:
> cd <Lazarus 运用所在目录>> isqlUse CONNECT or CREATE DATABASE to specify a databaseSQL>
解释 FireBird Embedded 安装成功
7.通过 SQL 命令创建数据库
SQL> create database 'test.fdb' user 'SYSDBA' password 'admin' page_size 16384 default character set UTF8;SQL>
8.创建数据表
SQL> create table d_students1 (CON> student_id varchar(64) primary key,CON> name varchar(16),CON> sex varchar(8),CON> birthday date,CON> department_id integer,CON> total_score decimal(9,1)CON> );
9.插入数据
SQL> INSERT INTO d_students1CON> (student_id, name, sex, birthday, department_id, total_score)CON> VALUES('x-20210001', 'ZhangSan', 'Man', '2000-05-06', 1, 520);SQL> INSERT INTO d_students1CON> (student_id, name, sex, birthday, department_id, total_score)CON> VALUES('x-20210002', 'LiSi', 'Man', '2000-03-09', 1, 539);SQL> INSERT INTO d_students1CON> (student_id, name, sex, birthday, department_id, total_score)CON> VALUES('x-20210003', 'ZhouWu', 'Woman', '2001-09-10', 2, 528);SQL> INSERT INTO d_students1CON> (student_id, name, sex, birthday, department_id, total_score)CON> VALUES('x-20210004', 'ZhaoLiu', 'Woman', '2000-08-28', 1, 517);SQL> INSERT INTO d_students1CON> (student_id, name, sex, birthday, department_id, total_score)CON> VALUES('x-20210005', 'JiangQi', 'Woman', '2000-07-06', 2, 547);SQL> INSERT INTO d_students1CON> (student_id, name, sex, birthday, department_id, total_score)CON> VALUES('x-20210006', 'HeBa', 'Man', '2000-11-01', 2, 533);
数据中没有利用中文,缘故原由是利用 UTF8 字符集创建数据库,而 Windows 的命令提示符利用默认的字符集 GBK,相互之间不兼容。
5.3 在运用程序中显示数据运用程序中利用的组件:
TIBConnectionTSQLTransactionTSQLQueryTDataSourceTDBGrid在窗体上拖放以上组件,如下图所示:
组件属性设置如下:
组件
属性
值
IBConnection1
DatabaseName
E:\workspace_of_lazarus\laz1104\TEST.FDB
UserName
sysdba
Password
admin
Transaction
SQLTransaction1
Connected
True
KeepConnection
True
LoginPrompt
False
SQLTransaction1
Database
IBConnection1
Active
True
SQLQuery1
Database
IBConnection1
Transaction
SQLTransaction1
SQL
select from d_students1
Active
True
DataSource1
DataSet
SQLQuery1
DBGrid1
DataSource
DataSource1
Align
alClient
Options
dgRowSelect=True
【备注】
当设置 IBConnection1 的 Connected 属性为 True,可能会涌现不能正常连接数据库的情形,缘故原由是没有利用 fbembed.dll 库连接,如果本机上同时安装了 FireBird C/S 版,则可能会利用 C/S 版的类库进行连接,此时关闭 Lazarus,打开命令行工具,实行如下命令:
set PATH=<Lazarus运用程序所在目录> 本例为:E:\workspace_of_lazarus\laz1104cd <Lazarus安装目录>lazarus
Lazarus 启动后再去连接数据库,即设置 IBConnection1 的 Connected 属性为 True。
按下 F9,运行程序,效果如下图所示: