[fpc-pascal] Is there a way to create a Firebird embedded database programmatically?
Tony Whyman
tony.whyman at mccallumwhyman.com
Wed Aug 3 12:05:20 CEST 2011
Actually, my preference for creating a database in a deployed
application is to first create it on my local system using isql with
input from a script and then to save it using gbak in a portable
format. The TIBRestoreService is then used to create the database from
the backup archive when your program fails to detect a local database copy.
The advantages of this approach are that:
- you only ever have one file to distribute
- backup/restore is very robust and quick
- you can readily add Blob data to your archive and distribute it as
part of the archive
- the initial database is consistent across all deployments
Scripts tend to be more useful when issuing patches to existing
databases. In this case, simply calling isql from your program and
pointing it at a patch script can be much easier than embedding SQL
execution in your program.
On 03/08/11 10:18, Reinier Olislagers wrote:
> On 3-8-2011 9:48, Tony Whyman wrote:
>> Reiner,
>>
>> You can certainly do this with IBX for Lazarus
>> (http://www.mwasoftware.co.uk). You will also find there some guidelines
>> on using the Firebird embedded library under both Windows and Linux that
>> are more general than just IBX.
>>
>> If you want to stick with SQLDB then there is a global variable
>> UseEmbeddedFirebird that you need to set to force use of the embedded
>> library.
>>
> Thanks for the suggestion, Tony. I did download and install IBX, but
> then I found bug report
> http://bugs.freepascal.org/view.php?id=13340
> with sample code for regular sqldb.
>
> Adapted this code*:
>
> (*Note: if you don't specify UseEmbeddedFirebird, you can rename
> fbembed.dll to fbclient.dll and get the same results - I'd wish somebody
> would implement the provided fix in issue
> http://bugs.freepascal.org/view.php?id=17664)
>
> //requires ibase60dyn in uses:
> UseEmbeddedFirebird:=true;
> IBConnection1.HostName := '';
> IBConnection1.DatabaseName := DatabaseFile; //
> IBConnection1.Username := 'SYSDBA';
> IBConnection1.Password := 'masterkey';
> IBConnection1.Charset := 'UTF8';
> IBConnection1.Dialect := 3;
> DBParams:=TStringList.Create;
> try
> DBParams.Add('PAGE_SIZE=16384');
> IBConnection1.Params := DBParams;
> finally
> DBParams.Free;
> end;
>
> if (FileExists(DatabaseFile)=false) then
> begin
> SQLTransaction1.Active:=false;
> IBConnection1.Transaction:=SQLTransaction1;
> IBConnection1.CreateDB; //Create the database file.
>
> IBConnection1.Open;
> SQLTransaction1.StartTransaction;
> IBConnection1.ExecuteDirect('CREATE TABLE Table1 (id VARCHAR(255),
> name VARCHAR(255));');
> SQLTransaction1.Commit;
> IBConnection1.Close;
> end;
>
> //Finally switch on connection
> IBConnection1.Connected := True;
> IBConnection1.KeepConnection := True;
> _______________________________________________
> fpc-pascal maillist - fpc-pascal at lists.freepascal.org
> http://lists.freepascal.org/mailman/listinfo/fpc-pascal
More information about the fpc-pascal
mailing list