1

我需要使用 DBExpress 以编程方式创建一个 Firebird 数据库。我已经为 SQL 服务器做到了这一点,首先连接到 Master,然后将 Create 脚本传递给查询,但是使用 Firebird 我有一点鸡和蛋的问题。

4

2 回答 2

3

我从一位为 Freepascal 项目创建了一些代码的同事那里得到了一个很好的提示。它不使用 DB express,但据他说,这是使用代码创建数据库的唯一方法。此代码基于 InterBase 手册,并使用来自 gdslib / fbclient dll 的调用:

procedure TIBConnection.CreateDB;

var ASQLDatabaseHandle,
    ASQLTransactionHandle : pointer;
    CreateSQL : String;
    pagesize : String;
begin
  CheckDisConnected;
  {$IfDef LinkDynamically}
    InitialiseIBase60;
  {$EndIf}
  ASQLDatabaseHandle := nil;
  ASQLTransactionHandle := nil;
  CreateSQL := 'CREATE DATABASE ';
  if HostName <> '' then
    CreateSQL := CreateSQL + ''''+ HostName+':'+DatabaseName + ''''
  else
    CreateSQL := CreateSQL + '''' + DatabaseName + '''';

  if UserName <> '' then
    CreateSQL := CreateSQL + ' USER ''' + Username + '''';
  if Password <> '' then
    CreateSQL := CreateSQL + ' PASSWORD ''' + Password + '''';
  pagesize := params.Values['PAGE_SIZE'];
  if pagesize <> '' then
    CreateSQL := CreateSQL + ' PAGE_SIZE '+pagesize;

  if isc_dsql_execute_immediate(@FStatus[0],@ASQLDatabaseHandle,@ASQLTransactionHandle,length(CreateSQL),@CreateSQL[1],Dialect,nil) <> 0 then
    CheckError('CreateDB', FStatus);

  if isc_detach_database(@FStatus[0], @ASQLDatabaseHandle) <> 0 then
    CheckError('CreateDB', FStatus);

  {$IfDef LinkDynamically}
    ReleaseIBase60;
  {$EndIf}
end;

诀窍是 isc_dsql_execute_immediate 函数。我希望这段代码可以帮助你。以下是此代码来源的 Freepascal 源文件的链接:

包含 CreateDB 函数的单元

包含 API 调用 isc_dsql_execute_immediate 的单元

于 2009-01-08T11:00:36.300 回答
1

运行脚本 isql

isql -i createDB.sql

CreateDB.sql 文件包含创建数据库的命令,如下所示。

SET SQL DIALECT 3;
CREATE DATABASE 'C:\DATABASE\DB.FDB'
USER 'SYSDBA' PASSWORD 'masterkey'
PAGE_SIZE 4096
DEFAULT CHARACTER SET WIN1252;
QUIT;
于 2011-10-12T14:30:19.593 回答