使用DelphiXE10动态创建Firebird嵌入式数据库文件
最近在研究单机版数据库Firebird的嵌入式使用方法,想在程序中动态创建Firebird数据库。在网上搜了N遍,只找到一个不能正常使用的例子(本人DelphiXE10环境下测试的,其他版本没有测试),索性自己动手写了一个函数,闲话不多说,直接上源码:
unit U_Firebird;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, IBX.IBHeader, IBX.IB;
function FB_CreateDatabase(VendorLib, FBDatabase, FBUsername, FBPassword: string): Boolean;
implementation
function FB_CreateDatabase(VendorLib, FBDatabase, FBUsername, FBPassword: string): Boolean;
var //创建Firebird数据库:动态库文件名,数据库名,登录名,密码
dbCreateSql: AnsiString;
FileName: string;
StatusVector: TStatusVector; //引用 IBX.IB 单元
DBHandle: PPointer;
TRHandle: PPointer;
GDS32Lib: THandle;
errcode: integer;
isc_dsql_execute_immediate: Tisc_dsql_execute_immediate; //引用 IBX.IBHeader 单元
begin
Result := False;
dbCreateSql := AnsiString(Format('CREATE DATABASE ''%s'' user ''%s'' PASSWORD ''%s'' PAGE_SIZE 8192 DEFAULT CHARACTER SET NONE',
[FBDatabase, FBUsername, FBPassword]));
FileName := FBDatabase;
DeleteFile(FileName);
DeleteFile(FBDatabase);
DBHandle := nil;
TRHandle := nil;
FileName := VendorLib;
if FileName = '' then FileName := '.\FB32Embed.dll'; //在此设置默认动态连接库文件名
GDS32Lib := LoadLibrary(PWideChar(FileName));
try
isc_dsql_execute_immediate := GetProcAddress(GDS32Lib, 'isc_dsql_execute_immediate');
if not assigned(isc_dsql_execute_immediate) then raise exception.create('isc_dsql_execute_immediate = nil');
errcode := isc_dsql_execute_immediate(@statusVector, @DBHandle, @TRHandle, 0, PByte(dbCreateSql), 3, nil);
if errcode <> 0 then raise exception.create('isc_dsql_execute_immediate create database error. ' + 'error ' + inttostr(errcode));
TRHandle := nil;
DBHandle := nil;
Result := True;
finally
FreeLibrary(GDS32Lib);
end;
end;
end.
首次写博客,对这个博客编辑工具使用还不顺手,格式方面就这样吧!
如果转载请注明出处,如果有更好的可以进行交流:yangfeng_yu@163.com
2019.09.28