Nous n'avons pas toujours l'occasion d'installer les drivers de FirebirdSQL sur chaque serveur sur lequel nous intervenons.

Avec FirebirdSQL version Embeded (ici la 2.5.2 64bits) il est possible d'interconnecter d'autre base de données à travers celle utilisé par votre progiciel favori.

L'exemple ci dessous est un simple appel d'une Vue située sur un autre serveur que la machine utilisé et est fonctionnel sous Lazarus (toute version, ici 64bits) UIB pré installé dans la dernière version de CodeTyphon et FirebirdSQL 2.5.2 Embed renommé ici FB64.dll.

Cet approche est très souple pour vos développements en objets de gestion multi DB car vous bipassez une grosse partie des problèmes généralement rencontrés lors de vos interventions chez vos clients, notamment au niveau sécurité ( pas d'installation/configuration autre que dé zipper vos outils dans le dossier que l'administrateur système vous a alloué ).

var
cDeb, cOpen, cFin : cardinal;
Transaction: TUIBTransaction;
DataBase   : TUIBDataBase;
Query: TUIBQuery;
iRec : Integer;
begin
cDeb := GetTickCount;
try
try
  DataBase := TUIBDatabase.Create(nil);
  DataBase.DatabaseName := extractfilepath(application.ExeName)+'uib_manager.fb';
  DataBase.LibraryName := extractfilepath(application.ExeName)+'fb64.dll';; // fbembed.dll 64bits renommé
 
  Transaction := TUIBTransaction.Create(nil);
  Transaction.DataBase := DataBase;
 
  Query := TUIBQuery.Create(nil);
  Query.Transaction := Transaction;
  Query.FetchBlobs := false;
  Query.SQL.Text := '  execute block returns (                        '+
 ' NOM varchar(100)        '+
 ',CLIENTHOST varchar(255) '+
 ',USERNAME varchar(255)   '+
 ',LOGTIME TIMESTAMP       '+
 ',PROCESSINGTIME int      '+
 ',BYTESRECVD int          '+
 ',BYTESSENT int           '+
 ',SERVICESTATUS int       '+
 ',WIN32STATUS int         '+
 ',OPERATION varchar(255)  '+
 ',TARGET varchar(255)     '+
 ',PARAMETERS varchar(255) '+
 ',SERVICE varchar(50)     '+
 ',ID int                  '+
 ')                        '+
 ' as                                                                '+
 ' begin                                                             '+
 'for execute statement ''select * from site_inetlog_externe_now ''  '+
 'on external ''11.5.0.6:e:\fbdatas\inetlog.fb ''   '+
 'as USER ''SYSDBA'' PASSWORD ''masterkey''         '+
 'WITH COMMON TRANSACTION                           '+
 'into                                              '+
 '  :NOM,                                           '+
 '  :CLIENTHOST,                                    '+
 '  :USERNAME,                                      '+
 '  :LOGTIME,                                       '+
 '  :PROCESSINGTIME,                                '+
 '  :BYTESRECVD,                                    '+
 '  :BYTESSENT,                                     '+
 '  :SERVICESTATUS,                                 '+
 '  :WIN32STATUS,                                   '+
 '  :OPERATION,                                     '+
 '  :TARGET,                                        '+
 '  :PARAMETERS,                                    '+
 '  :SERVICE,                                       '+
 '  :ID                                             '+
 'do suspend;                                       '+
 'end;                                              ';
 
  Query.Open;
  cOpen := GetTickCount;
  iRec := 0;
 while not Query.EOF do
 begin
    inc(iRec);
    Query.Next;
 end;
 
 except
   on e:exception do begin
                       showmessage(e.Message);
 end;
 end;
 finally // faute à Faust :-)
  Query.Close(etmStayIn);
  Query.Destroy;
  Transaction.Destroy;
  database.Connected := false;
  database.CleanupInstance;
  database.free;
 end;
 
 cFin := GetTickCount;
 Showmessage(format('Exécution  : '+#13#10+ 'select : %.3d millisecondes '+#13#10+'lecture : %.3d millisecondes pour %d enregistrements',[cOpen-cDeb,cFin-cOpen,iRec]));
 

 

La perte de performance dû à la connexion au travers de votre base de donnée est de l'ordre de 11 à 16 millisecondes (tout dépends du matériel) qui est largement compensé par les performances de la version Embeded de FirebirdSQL en y utilisant le stockage de vos requêtes dans des tables temporaires.

J'utilise ce bout de code pour récupérer les logs de plusieurs serveurs IIS distant et ceci dans des Wan multi segments sans que les "admin" ne soit "perturbé"

View User Profile for Norbert Saint Georges
Envoié par Norbert Saint Georges lundi 21 janvier 2013 18:46:50 Categories: FirebirdSQL Lazarus UIB
Tetrasys Oy
Évaluer ce contenu Voix 37

Commentaires

Les commentaires sont fermés pour ce message.