问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何在程序中建立Firebird嵌入版数据库

发布网友 发布时间:2022-04-07 21:07

我来回答

1个回答

热心网友 时间:2022-04-07 22:36

unit Unit1;

//这是测试的代码
interface

 

uses

    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

    Dialogs, StdCtrls;

 

type

    TForm1 = class(TForm)

        Button1: TButton;

        procere Button1Click(Sender: TObject);

    private

        { Private declarations }

    public

        { Public declarations }

    end;

 

var

    Form1: TForm1;

 

implementation

 

{$R *.dfm}

 

type

    //复制自ibheader.pas

    ISC_STATUS = LongInt;

    PISC_STATUS = ^ISC_STATUS;

    TISC_DB_HANDLE = THandle;

    PISC_DB_HANDLE = ^TISC_DB_HANDLE;

    TISC_TR_HANDLE = THandle;

    PISC_TR_HANDLE = ^TISC_TR_HANDLE;

    TStatusVector = array[0..19] of ISC_STATUS;

    PStatusVector = ^TStatusVector;

    PShort = ^Short;

    PPChar = ^PChar;

    UShort = Word;

    PVoid = Pointer;

    ISC_LONG = LongInt;

    UISC_LONG = ULong;

    ISC_INT64 = Int64;

 

    UISC_STATUS = ULong;

    PISC_LONG = ^ISC_LONG;

    PUISC_LONG = ^UISC_LONG;

    PPISC_STATUS = ^PISC_STATUS;

    PUISC_STATUS = ^UISC_STATUS;

    TISC_BLOB_HANDLE = PVoid;

    PISC_BLOB_HANDLE = ^TISC_BLOB_HANDLE;

    TISC_STMT_HANDLE = PVoid;

    PISC_STMT_HANDLE = ^TISC_STMT_HANDLE;      

 

    { Declare the extended SQLDA }

    TXSQLVAR = record

        sqltype: Short; { datatype of field }

        sqlscale: Short; { scale factor }

        sqlsubtype: Short; { datatype subtype - BLOBs }

        { & text types only }

        sqllen: Short; { length of data area }

        sqldata: PChar; { address of data }

        sqlind: PSmallInt; { address of indicator }

        { variable }

        sqlname_length: Short; { length of sqlname field }

        { name of field, name length + space for NULL }

        sqlname: array[0..31] of Char;

        relname_length: Short; { length of relation name }

        { field's relation name + space for NULL }

        relname: array[0..31] of Char;

        ownname_length: Short; { length of owner name }

        { relation's owner name + space for NULL }

        ownname: array[0..31] of Char;

        aliasname_length: Short; { length of alias name }

        { relation's alias name + space for NULL }

        aliasname: array[0..31] of Char;

    end;

    PXSQLVAR = ^TXSQLVAR;

    TXSQLDA = record

        version: Short; { version of this XSQLDA }

        { XSQLDA name field }

        sqldaid: array[0..7] of Char;

        sqldabc: ISC_LONG; { length in bytes of SQLDA }

        sqln: Short; { number of fields allocated }

        sqld: Short; { actual number of fields }

        { first field address }

        sqlvar: array[0..0] of TXSQLVAR;

    end;

    PXSQLDA = ^TXSQLDA;

var

    isc_create_database: function(user_status: Pointer; file_length: Smallint;

        file_name: PChar; handle: Pointer; dpb_length: Smallint; dpb: PChar;

        db_type: Smallint): longint; stdcall;

 

    isc_detach_database: function(status_vector: PISC_STATUS;

        db_handle: PISC_DB_HANDLE): ISC_STATUS; stdcall;

 

    isc_dsql_execute_immediate: function(status_vector: PISC_STATUS;

        db_handle: PISC_DB_HANDLE;

        tran_handle: PISC_TR_HANDLE;

        length: Word;

        statement: PChar;

        dialect: Word;

        xsqlda: PXSQLDA): ISC_STATUS; stdcall;

 

procere TForm1.Button1Click(Sender: TObject);

var

    dbCreateSql: AnsiString;

    FileName: string;

    strCreateDatabaseSql: AnsiString;

    StatusVector: TStatusVector;

    StatusVector1: TStatusVector;

    DBHandle: PPointer;

    dbhandle1: PPointer;

    TRHandle: PPointer;

    GDS32Lib: cardinal;

    errcode: integer;

begin  

    dbCreateSql := AnsiString(Format('CREATE DATABASE ''%s'' user ''%s'' PASSWORD ''%s'' PAGE_SIZE 8192 DEFAULT CHARACTER SET GBK',

        ['test.fdb', 'sysdba', 'masterkey']));

    FileName := 'test1.fdb';

    DeleteFile(FileName);

    DeleteFile('test.fdb');

 

    DBHandle := nil;

    DBHandle1 := nil;

    TRHandle := nil;

 

    GDS32Lib := LoadLibrary('fbembed.dll');

 

    try

        isc_create_database := GetProcAddress(GDS32Lib, 'isc_create_database');

        if not assigned(isc_create_database) then

            raise exception.create('isc_create_database = nil');

 

        isc_detach_database := GetProcAddress(GDS32Lib, 'isc_detach_database');

        if not assigned(isc_detach_database) then

            raise exception.create('isc_detach_database = nil');

 

        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_create_database(@StatusVector, Length(FileName), PChar(FileName), @DBHandle1, 0, nil, 0);

        if errcode <> 0 then

            raise exception.create('isc_create_database create database error. ' +  'error ' + inttostr(errcode));

        errcode := isc_detach_database(@statusVector, @dbhandle1);

        if errcode <> 0 then

            raise exception.create('error ' + inttostr(errcode));

         DBHandle1 := nil;

 

        errcode := isc_dsql_execute_immediate(@statusVector, @DBHandle, @TRHandle, 0, PAnsiChar(dbCreateSql), 3, nil);

        if errcode <> 0 then

            raise exception.create('isc_dsql_execute_immediate create database error. ' +  'error ' + inttostr(errcode));

 

        errcode := isc_detach_database(@statusVector, @dbhandle);

        if errcode <> 0 then

            raise exception.create('error ' + inttostr(errcode));

        DBHandle := nil;         

    finally

        FreeLibrary(GDS32Lib);

    end;

    //MessageDlg('done', mtInformation, [mbok], 0);

end;

 

end.

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
有没有什么软件可以加到微信支付付款人? 有啥相亲软件聊天付费可以用微信支付的 昌南地铁线设哪些站 在北七定镇怎么去八达岭长城 北七家离南邵地铁站有多远 老人餐具消毒用什么材质的锅好 消毒餐具用什么材质 北京哪有夜校 北邮3G北邮3G课程 移动云计算工信部移动云计算教育培训中心 五一劳动节 文案怎么和 活动结合做自媒体 邀请公司同事来酒店过五一文案 安踏的价格贵吗 文案有哪几种类型? 安踏专卖店一般价格是多少 快五一了,开了个无为板鸭店,也可在店就餐,想搞个活动,希望高手帮我出个活动文案。 安踏为什么那么贵 安踏和耐克的不同与区别是什么? 中国银联投诉电话 安踏一般的价格为多少啊?贵不贵啊? 中国银联的电话为什么总是没人接? 安踏为什么这么贵 安踏的鞋子贵不贵?? 中国银联电话是多少? 阿迪耐克在美国的价格如何? 安踏的衣服贵不贵? 安踏在美国卖得怎么样了 安踏鞋贵吗? 中国银联给我打电话了没有接 为什么耐克比安踏贵 青岛 日语 工作 爱思助手刷机和itunes刷机效果一样吗 爱思助手刷机跟iTunes比,有没有后遗症 电脑开机自检后出现这种情况 后一直无法进入系统? 用itunes恢复固件和用爱思助手刷机有什么区别吗 电脑开机显示器一直卡在自检状态进不去桌面是怎么回事 电脑开机自检怎么回事,有时还停留在欢迎使用界面不进桌面 电脑一直在自检不能进入桌面怎么解决方法 电脑开机后停留在自检状态进不了系统怎么办? 开机总自检,不停的自检 根本显示不到桌面 电脑进不了系统,一直在自检.每次开机都得快速按回车才能进系统` 电脑开机后一直自检怎么办? 电脑开机一直自检,进不了系统 电脑一直重复自检,无法开机 电脑一开机就不断反复自检,进不了桌面,选安全模式就黑屏一阵之后自动关机,怎么办??!! - 信息提示 常年销冠SUV正式换代 第三代哈弗H6再度预订市场NO.1! 哈弗h6新款2021款第三代冰雪路面如遇刹不了车怎么办 老对手,新对决,新款长安CS75 PLUS对比新款哈弗H6 手上不小心沾上爱普生打印机通用墨水怎么办,怎么清洗呢