Creazione di un database utilizzando DBExpress in Delphi?
Domanda
Devo creare un database Firebird a livello di codice utilizzando DBExpress. L'ho fatto per SQL Server, collegandomi prima a Master, quindi passando lo script per Create a una query, ma con Firebird ho un piccolo problema con pollo e uova.
Soluzione
Ho ricevuto un buon consiglio da un collega che ha creato del codice per il progetto Freepascal. Non utilizza DB express, ma secondo lui è l'unico modo per creare un database con codice. Questo codice si basa sul manuale di InterBase e utilizza una chiamata dal dll gdslib / fbclient:
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;
Il trucco è la funzione isc_dsql_execute_immediate. Spero che questo codice ti aiuti. Ecco i collegamenti ai file sorgente di Freepascal da cui proviene questo codice:
Altri suggerimenti
Esegui uno script isql
isql-i createDB.sql
CreateDB.sql il file include il comando per creare il database come mostrato di seguito.
SET SQL DIALECT 3;
CREATE DATABASE 'C:\DATABASE\DB.FDB'
USER 'SYSDBA' PASSWORD 'masterkey'
PAGE_SIZE 4096
DEFAULT CHARACTER SET WIN1252;
QUIT;