1

DBExpressを使用してプログラムでFirebirdデータベースを作成する必要があります。SQLサーバーでこれを行ったのは、最初にマスターに接続してから、作成用のスクリプトをクエリに渡すことですが、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 に答える