¿Creando una base de datos usando DBExpress en Delphi?
Pregunta
Necesito crear una base de datos Firebird mediante programación utilizando DBExpress. He hecho esto para el servidor SQL, primero conectándome con Master, luego pasando el script para Crear a una consulta, pero con Firebird tengo un pequeño problema de gallina y huevo.
Solución
Recibí un buen consejo de un colega que creó un código para el proyecto Freepascal. No utiliza DB Express, pero según él es la única forma de crear una base de datos con código. Este código se basa en el manual de InterBase y utiliza una llamada de la 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;
El truco es la función isc_dsql_execute_immediate. Espero que este código te ayude. Aquí están los enlaces a los archivos fuente de Freepascal de donde proviene este código:
Unidad que contiene la función CreateDB
Unidad que contiene la llamada a la API isc_dsql_execute_immediate
Otros consejos
Ejecuta un script isql
isql-i createDB.sql
CreateDB.sql el archivo incluye el comando para crear la base de datos como se muestra a continuación.
SET SQL DIALECT 3;
CREATE DATABASE 'C:\DATABASE\DB.FDB'
USER 'SYSDBA' PASSWORD 'masterkey'
PAGE_SIZE 4096
DEFAULT CHARACTER SET WIN1252;
QUIT;