PDA

Ver la Versión Completa : Crear Base de Datos con DbExpress


JosepGA
05-06-2007, 17:42:58
Hola a todos, es mi primer mensaje, pero espero que podais ayudarme,

trabajo con dbexpress y firebird 1.5, estoy creando una aplicación con un mantenimiento de empresas, y al crear una nueva empresa, necesito crear una base de datos del estilo GESTION-NºEMPRESA.FDB, lo he intentado con SQLConnection pero me devuelve el error "cannot prepare Create Database\Schema".

Me he quedado atascado, no se como crear la base de datos utilizando puramente dbexpress.

he buscado en los foros y no he encontrado una respuesta a algo similar.

Gracias a todos por la ayuda que me podais prestar.

rruz
06-06-2007, 04:10:37
Estimado JosePGA necesitaria el codigo que utilizas para crear la bdd para ver que esta fallando.

Saludos

jachguate
06-06-2007, 04:29:21
No utilizo DBeXpress... pero entiendo que el problema se da porque este motor está tratando de preparar el query antes de ejecutarlo, como si se tratase de una consulta. El error, por lo que puedo imaginar, no lo genera el propio DBX, sino ib/fb.

Es probable que haya un componente que no tenga este comportamiento, que haya una propiedad que lo condicione o bien que haya una forma distinta de invocar su ejecución (en otros motores puede ser ExecSQL, por ejemplo).

En fin, la idea es lanzar directamente la instrucción al motor, sin intentar prepararla.

Hasta luego.

;)

JosepGA
06-06-2007, 15:45:33
Gracias por vuestros comentarios, aqui os adjunto un ejemplo de como lo he intentado hacer ( tambien lo he realizado con parametros, pero me da el mismo mensaje de error ):

procedure CrearBaseDatos;
Var
SQLstmt : String;
Begin
SQLstmt := 'CREATE DATABASE ' + Chr( 39 ) + 'C:\BASE.FBD' + Chr( 39 );
SQLstmt := SQLstmt + ' PAGE_SIZE 8192';
SQLstmt := SQLstmt + ' USER ' + Chr( 39 ) + 'CODUSUARIO' + Chr( 39 );
SQLstmt := SQLstmt + ' PASSWORD ' + Chr( 39 ) + 'CLAVE' + Chr( 39 );
SQLstmt := SQLstmt + ' DEFAULT CHARACTER SET ISO8859_1';

SQLConexionGeneral.ExecuteDirect( SQLstmt );
End;

El problema es que no se como evitar que prepare el script, y no se como lo gestionan otros programadores que trabajan con dbexpress.

gracias por adelantado a vuestra colaboración

JosepGA
08-06-2007, 10:38:44
Gracias por vuestros comentarios, aqui os adjunto un ejemplo de como lo he intentado hacer ( tambien lo he realizado con parametros, pero me da el mismo mensaje de error ):

procedure CrearBaseDatos;
Var
SQLstmt : String;
Begin
SQLstmt := 'CREATE DATABASE ' + Chr( 39 ) + 'C:\BASE.FBD' + Chr( 39 );
SQLstmt := SQLstmt + ' PAGE_SIZE 8192';
SQLstmt := SQLstmt + ' USER ' + Chr( 39 ) + 'CODUSUARIO' + Chr( 39 );
SQLstmt := SQLstmt + ' PASSWORD ' + Chr( 39 ) + 'CLAVE' + Chr( 39 );
SQLstmt := SQLstmt + ' DEFAULT CHARACTER SET ISO8859_1';

SQLConexionGeneral.ExecuteDirect( SQLstmt );
End;

El problema es que no se como evitar que prepare el script, y no se como lo gestionan otros programadores que trabajan con dbexpress.

gracias por adelantado a vuestra colaboración


sigo atascado con el tema, nadie se ha encontrado con ese problema ?

rruz
09-06-2007, 01:58:35
Dbexpress no es capaz de preparar el comando, es una falencia del driver pero puedes usar lo siguiente.



function isc_dsql_execute_immediate(pstatus: plongint; var db_handle:plongint; var trans_handle: plongint; length: word; SQL: pchar; dialect:
word; pxsqlda: pointer): longint; stdcall; external 'GDS32.DLL';

Function CreateDataBase:Boolean;
var
StatusVector : TStatusVector;
nDBHandle, nTRHandle : plongint;
SQL : array[0..1024] of char;
nResult : integer;
begin
Result := False;
nDBHandle := 0;
nTRHandle := 0;
StrPCopy(SQL, 'CREATE DATABASE "localhost:c:\database\test.gdb"' +
'page_size 4096 user "SYSDBA" password "masterkey"');
nResult := isc_dsql_execute_immediate(@StatusVector, nDBHandle, nTRHandle,
0, SQL, 1, nil);
if nResult <> 0 then
begin
MessageDlg('Error al crear la base de datos', mtWarning, [mbOK], 0);
exit;
end;
Result := true;
end;




Saludos

JosepGA
12-06-2007, 12:10:13
Hola, gracias a todos por la ayuda, aunque al final lo he solucionado de otra forma, que es la siguiente:

como no podia atarme a que solo fuera firebird/interbase, he creado una base de datos base, es decir, al crear una empresa la copio con el nombre mas el codigo de la empresa, aunque tambien me ha dado dolores de cabeza, pues al intentar copia me daba error de que no podia encontrar el archivo origen cuando este estaba en una ruta de red, me he repasado los hilos del foro pertinente, y no encontraba la solución, al final me he dado cuenta de que la ruta que se debe indicar es una ruta de red de windows diferente a la que se indica en las bases de datos, ejemplo:

Base de datos: Servidor:\Aplicacion\NombreArchivo.FBD
Ruta para copias: \\Servidor\Disco C(C)\Aplicacion\NombreArchivo.FBD

Espero que os sirva de ayuda

Un saludo a todos