Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi TQuery function umstellen auf FibPlus (https://www.delphipraxis.net/137613-tquery-function-umstellen-auf-fibplus.html)

Eppos 24. Jul 2009 09:58

Datenbank: Firebird • Version: 1.5 • Zugriff über: BDE

TQuery function umstellen auf FibPlus
 
Hallo zusammen,

ich habe nun vor, ein paar Tests zu machen, mit FibPlus.

Da ich bisher noch mit der BDE arbeite und den Delphi DB Std. Komponenten.

Mich würde Interessieren, ob man Parallel mit FibPlus und den Delphi Std. Komponenten arbeiten kann,
also einmal Zugriff über TDatabase und einmal über FibPlus?!

Ich habe auch zwei Funktionen, und mich würde interessieren, wie das in FibPlus aussieht.

Delphi-Quellcode:
// Query öffnen
function GetOpenQuery( Sql : String ) : TQuery;
var myQuery : TQuery;
begin
  myQuery := TQuery.Create( Application );
  Result := myQuery;
  try
    myQuery.DatabaseName := 'Handel';
    myQuery.sql.Text := Sql;
    myQuery.Active := True;
    Result := myQuery;
  except
    myQuery.Free;
  end;
end;
Delphi-Quellcode:
// ExecQuery - Update/Insert/Delete
function ExecQuery( Sql : String ) : boolean;
var myQuery : TQuery;
begin
  Result := false;
  myQuery := TQuery.Create( Application );
  try
    myQuery.DatabaseName := 'Handel';
    myQuery.sql.Text := Sql;
    myQuery.ExecSQL;
    Result := true;
  except
    SLF(Sql);
  end;
  myQuery.Free;
end;

Vielen Dank

Eppos

hoika 27. Jul 2009 11:19

Re: TQuery function umstellen auf FibPlus
 
Hallo,

ich will auch die BDE ersetzen ... ;)

Zitat:

Mich würde Interessieren, ob man Parallel mit FibPlus und den Delphi Std. Komponenten arbeiten kann,
also einmal Zugriff über TDatabase und einmal über FibPlus?!
Ja, warum sollte das nicht gehen?
Du musst nur aufpassen, dass du nicht die gleiche Tabelle mit BDE und FIBPlus
zur gleichen Zeit bearbeitest (Transaktionskonflikt).

Nehmen wir mal an, TFBQuery heisst das Teil in FIBPlus.

Delphi-Quellcode:
function GetOpenQuery( Sql : String ) : TFBQuery;
var myQuery : TFBQuery;
begin
  myQuery := TFBQuery.Create( Application );
  Result := myQuery;
  try
   //  myQuery.DatabaseName := 'Handel';

    myQuery.Connection
    myQuery.Transaction // jaja, es gibt 2 davon, für Read und Write

    myQuery.sql.Text := Sql;
    myQuery.Active := True;
    Result := myQuery;
  except
    myQuery.Free;
    Result:= NIL; // das sollte hier noch dirnstehen
  end;
end;


Heiko

Eppos 27. Jul 2009 22:25

Re: TQuery function umstellen auf FibPlus
 
das Problem ist, das es kein "active" gibt und erhlich gesagt weiss ich nicht was sonst verwendet werden soll...?!?

Chemiker 27. Jul 2009 22:59

Re: TQuery function umstellen auf FibPlus
 
Hallo Eppos,

Das ist ein Beispiel um die Beispiel Datenbank von Firebird auf einem DBGrid anzuzeigen, die Dateinamen und der Path muss noch angepasst werden.


Delphi-Quellcode:
unit ufrmFIBPlusdynmischDemo;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DB, FIBDataSet, pFIBDataSet, FIBDatabase, pFIBDatabase, Grids,
  DBGrids, StdCtrls, ExtCtrls, FIBQuery, pFIBQuery, DBCtrls, pFIBProps,
  uXLSExcelDateiClass;

type
  TfrmFIBPlusDemo = class(TForm)
    DataSource1: TDataSource;
    DBNavigator1: TDBNavigator;
    Button1: TButton;
    DBGrid1: TDBGrid;
    Memo1: TMemo;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
    pFIBDataBase1: TpFIBDataBase;
    pFIBDataSet1: TpFIBDataSet;
    pFIBTransaction1: TpFIBTransaction;
  end;

var
  frmFIBPlusDemo: TfrmFIBPlusDemo;

implementation

{$R *.dfm}

procedure TfrmFIBPlusDemo.Button1Click(Sender: TObject);
var
  XLS: TXLS_DateiClass;
begin
  pFIBDataSet1.Close;
  pFIBDataSet1.SelectSQL.Text:= Memo1.Text;
  pFIBDataSet1.GenerateSQLs;
  pFIBDataSet1.Open;
end;

procedure TfrmFIBPlusDemo.FormCreate(Sender: TObject);
begin
  pFIBDataBase1:= TpFIBDataBase.Create(self);
  pFIBTransaction1:= TpFIBTransaction.Create(self);
  pFIBDataSet1:= TpFIBDataSet.Create(self);

  pFIBDataBase1.Name:= 'pFIBDataBase1';
  pFIBDataBase1.ConnectParams.UserName:= 'SYSDBA';
  pFIBDataBase1.ConnectParams.Password:= 'masterkey';
  pFIBDataBase1.AliasName:= 'Test';
  pFIBDataBase1.DBName:= 'D:\Eigene Dateien von Internet\Borland Studio-
      Projekte\FirebirdDatenbanken\FB2_0Datenbank\examples\empbuild\EMPLOYEE.FDB';
  pFIBDataBase1.LibraryName:='C:\Programme\Firebird\Firebird_2_0\bin\fbclient.dll';
  pFIBDataBase1.DefaultTransaction:= pFIBTransaction1;
  pFIBDataBase1.DefaultUpdateTransaction:= pFIBTransaction1;
  pFIBDataBase1.Connected:= TRUE;

  pFIBDataSet1.Name:= 'pFIBDataSet1';
  pFIBDataSet1.Database:=pFIBDataBase1;
  pFIBDataSet1.Transaction:= pFIBTransaction1;
  pFIBDataSet1.AutoCommit:= TRUE;
  pFIBDataSet1.AutoUpdateOptions.UpdateTableName:= 'EMPLOYEE';
  pFIBDataSet1.AutoUpdateOptions.AutoReWriteSqls:= TRUE;

  pFIBTransaction1.Name:= 'pFIBTransaction1';
  pFIBTransaction1.TPBMode:= tpbDefault;
  pFIBTransaction1.TimeoutAction:= TACommit;
  pFIBTransaction1.Active:= TRUE;

  DataSource1.DataSet:= pFIBDataSet1;
   
end;

procedure TfrmFIBPlusDemo.FormDestroy(Sender: TObject);
begin
  freeandNil(pFIBDataSet1);
  freeandNil(pFIBTransaction1);
  freeandNil(pFIBDataBase1);
end;
end.

Bis bald Chemiker

mkinzler 28. Jul 2009 06:41

Re: TQuery function umstellen auf FibPlus
 
Zitat:

das Problem ist, das es kein "active" gibt und erhlich gesagt weiss ich nicht was sonst verwendet werden soll...?!?
Delphi-Quellcode:
DataSet.Open;
vielleicht?

Eppos 28. Jul 2009 09:47

Re: TQuery function umstellen auf FibPlus
 
mit "open" geht es leider auch nicht. Ist eine read-only property.

Eppos 28. Jul 2009 10:06

Re: TQuery function umstellen auf FibPlus
 
habe es jetzt mit "execquery" versucht, und es hat geklappt, ich weiss aber nicht ob das so richtig ist?!?

hoika 28. Jul 2009 10:42

Re: TQuery function umstellen auf FibPlus
 
Hallo,

du musste ich doch mal in den Quellen nachsehen
und guck an, es ist tatsächlich ExecQuery.

Dass Open ist nur zum Lesen da (z.b. nach einem Select).
Bei der BDE war es eh komisch mit Open und ExecSQL.


Heiko

Eppos 28. Jul 2009 10:42

Re: TQuery function umstellen auf FibPlus
 
ich glaube ich kann das mit dieser Komponente nicht machen, was ich vorhabe.
Ich denke ich muss TpFibDataSet verwenden, weil TpFibQuery kann kein locate...?!?
Ich glaube ich stehe im Wald... :|

mkinzler 28. Jul 2009 11:43

Re: TQuery function umstellen auf FibPlus
 
TpFibQuery ist eh nur aus Kompatibilitätsgründen zur BDE vorhanden.

Eppos 28. Jul 2009 12:32

Re: TQuery function umstellen auf FibPlus
 
gibt es denn die Möglichkeit, aus der BDE den "SERVER NAME" (locahost:C:\Datenbanke.fdb) auszulesen?

hoika 28. Jul 2009 13:21

Re: TQuery function umstellen auf FibPlus
 
Hallo,

das geht, über die BDE ...
Also lass es gleich mal sein.

Definier dir eine Konfigurationsdatei (appname.conf),
greife auf sie lesend zu.

Server_Name = XXX


Heiko

Eppos 28. Jul 2009 16:15

Re: TQuery function umstellen auf FibPlus
 
Möchte ich zu einem späteren Zeitpunkt machen.
Solange ich aber parallel das ganze laufen lasse, möchte es auslesen aus der BDE.
Kannst du mir sagen wie ich das machen kann?

exilant 28. Jul 2009 17:06

Re: TQuery function umstellen auf FibPlus
 
Zitat:

Zitat von mkinzler
TpFibQuery ist eh nur aus Kompatibilitätsgründen zur BDE vorhanden.

Bist Du sicher? Was nimmst Du denn für irgendwelche insert/update Statements?
Obendrein ist TpFibQuery sehr leichtgewichtig und damit auch sehr schnell
beim (unidirektionalen) lesen von Datenmengen.

hoika 28. Jul 2009 17:09

Re: TQuery function umstellen auf FibPlus
 
Hallo,

Zitat:

Bist Du sicher? Was nimmst Du denn für irgendwelche insert/update Statements?
TXDataSet kann das auch.
Aber in der Tat ist die TXQuery schneller.


hier die Alias-Routine




Delphi-Quellcode:
uses
  SysUtils,

  DB, DBTables,
{ Pfad der Datenbank auf dem Server ermitteln
  der Servername selber wird NICHT übergeben }
function GetServerPath(const theAlias: String): String;
var
  AliasParams: TStringList;
  iCountParam: Integer;
  sCurParam : String;
begin
  Result:= '';

  try
    AliasParams:= TStringList.Create;

    try
      Session.GetAliasParams(theAlias, AliasParams);

      for iCountParam:=0 to AliasParams.Count-1 do
      begin
        sCurParam:= AliasParams[iCountParam];
        if Pos('SERVER NAME', sCurParam)=1 then
        begin
          Result:= Copy(sCurParam, Length('SERVER NAME')+2,
            Length(sCurParam));
        end;
      end;
    finally
      AliasParams.Free;
    end;
  except
    on E: Exception do
    begin
     {$IFDEF DEBUG}
      MBDebug(GetServerPath'+#13#10+E.message);
     {$ENDIF}
    end;
  end;
end; { GetServerPath }

Heiko

exilant 28. Jul 2009 17:19

Re: TQuery function umstellen auf FibPlus
 
Zitat:

Zitat von Eppos
Möchte ich zu einem späteren Zeitpunkt machen.
Solange ich aber parallel das ganze laufen lasse, möchte es auslesen aus der BDE.
Kannst du mir sagen wie ich das machen kann?

Mach Dir das leben nicht unnötig schwer: Erzeuge Dir eine Konfigurationsdatei mit der Du sowohl dynamisch einen BDE Alias erzeugen als auch einen Connectionstring für FibPlus aufbauen kannst. Das ist nicht schwer und macht die Anwendung leichter beherschbar. Du musst dann auf den Zielmaschienen nicht dauernd irgendwelchen Aliase anlegen.
Die BDE Alias - Konfigurationen finden sich IMO in der IDAPI32.CFG, nicht in der Registry.
Die IDAPI32.CFG ist eine Binärdatei. ob die überhaupt irgendwo dokumentiert ist weiss ich nicht.

Eppos 28. Jul 2009 17:22

Re: TQuery function umstellen auf FibPlus
 
was aber tun, wenn in TFibQuery kein Locate vorhanden ist?!? Doch TFibDatatset verwenden?

exilant 28. Jul 2009 17:25

Re: TQuery function umstellen auf FibPlus
 
Zitat:

Zitat von Eppos
was aber tun, wenn in TFibQuery kein Locate vorhanden ist?!? Doch TFibDatatset verwenden?

Ja klar. Wenn Du die Funktionen von TDataset benötigst must Du das TFibdataset verwenden. Im FibPlus Tutorial gibts jede Menge Infos dazu.

Eppos 28. Jul 2009 18:32

Re: TQuery function umstellen auf FibPlus
 
@hoika
Danke. Funktion funktioniert ;-)

@exilant
Wo finde ich das Tutorial?

hoika 28. Jul 2009 20:41

Re: TQuery function umstellen auf FibPlus
 
Hallo,

klar funktioniert die !!!
Nutze ich ja seit Jahren ;)
Ich werde die übrigens demnächst in eine DLL auslagern (BDE-Ersatz)

direkte Links zum DevGuide

devguide1
devguide2


Heiko

Eppos 31. Jul 2009 13:04

Re: TQuery function umstellen auf FibPlus
 
jetzt müsste ich natürlich noch wissen, wie meine execquery funktion aussieht.
Weil "dataset.execsql" gibt es nicht?!?

hoika 31. Jul 2009 13:10

Re: TQuery function umstellen auf FibPlus
 
Hallo,

waren wir nicht bei TfXXQuery (habs gerade nicht im Kopf).
Wieso jetzt DataSet ?

Egal: Weekend !!!


Heiko

Eppos 31. Jul 2009 13:13

Re: TQuery function umstellen auf FibPlus
 
das Problem war nur, das FibQuery kein Locate konnte...
Aber ich probiere es mal mit FibQuery...

alex517 31. Jul 2009 14:04

Re: TQuery function umstellen auf FibPlus
 
Nimm bitte FibDataSet und lass das FibQuery erstmal beiseite.
Im FibDataSet findest du das .Open, .Active, .Locate(), usw.


alex

exilant 31. Jul 2009 15:38

Re: TQuery function umstellen auf FibPlus
 
Zitat:

Zitat von Eppos
das Problem war nur, das FibQuery kein Locate konnte...
Aber ich probiere es mal mit FibQuery...

Wenn Du überwiegend mit Datengebundenen Komponenten (igitt) arbeiten willst dann benutze Fibdataset.
Ansonsten Fibquery.

Ich persönlich nutze seit Ewigkeiten keine datengebundenen Komponenten mehr.
Ich habe es mir abgewöhnt mit TDataset und seinen Nachfolgern zu arbeiten. Daher verwende ich fibdataset überhaupt nicht.
Die ganzen TDbXXXXX Komponenten verleiten leicht dazu, Geschäftslogik und UI über Gebühr zu mixen.
Das Problem von langlaufenden Transaktionen hat man dann nebenbei ebenfalls beseitigt.
Benötigte Datenstrukturen baue ich mir im Speicher auf. Es gibt so schöne Listen, Collections etc.....
Diese dann mit den UI Controls zu bearbeiten ist 1. Pfeilschnell und 2. hat man die volle Kontrolle.

Eppos 1. Aug 2009 08:36

Re: TQuery function umstellen auf FibPlus
 
ich habe jetzt eine Funktion geschrieben die wie folgt aussieht

Delphi-Quellcode:
function ExecFibQuery( Sql : String; Database : TFibDatabase ) : boolean;
var myQuery : TpFIBQuery;
begin
  myQuery := TpFIBQuery.Create( Application );
  Result := True;
  try
    myQuery.Database := Database;
    myQuery.SQL.Text := Sql;
    myQuery.ExecQuery;
    myQuery.Transaction.Commit;
    Result := True;
  except
    myQuery.Free;
    Result := False;
  end;
  myQuery.Free;
end;
Das Problem ist nur, wenn ich diese Funktion ausführe, werden
alle OpenQuerys geschlossen und zwar dann, wenn "myQuery.Transaction.Commit"
ausgeführt wird. Weiss jemand warum?

mkinzler 1. Aug 2009 08:46

Re: TQuery function umstellen auf FibPlus
 
Ja du hängst dich an eine laufende Transkation an und schliesst diese ab! das kann sehr negative Folgen haben. Führe deine Abfrage in einer eigenen Transaktion aus.

Eppos 1. Aug 2009 08:49

Re: TQuery function umstellen auf FibPlus
 
da ich aber meine Funktion in einer Unit ausgelagert habe, müsste ich also immer eine Transaction mit geben?

mkinzler 1. Aug 2009 08:50

Re: TQuery function umstellen auf FibPlus
 
Oder wie den Query dynamisch erstellen

Eppos 1. Aug 2009 09:29

Re: TQuery function umstellen auf FibPlus
 
das klappt jetzt mit der Transaction.
Was nur noch nicht funktioniert, ist der RecordCount,
der liefert immer 1 zurück und ich weiss nicht warum?!?

mkinzler 1. Aug 2009 09:43

Re: TQuery function umstellen auf FibPlus
 
Vielleicht implementieren die Komponenetn diese Eigenschaft nicht, oder es wird nur der erste gefetcht.

Eppos 1. Aug 2009 09:51

Re: TQuery function umstellen auf FibPlus
 
wie kann ich alle fetchen?

mkinzler 1. Aug 2009 09:53

Re: TQuery function umstellen auf FibPlus
 
Ich bin kein FIBPlus-Spezialist, gibt es etwas wie .FetchAll o.ä?

Eppos 1. Aug 2009 10:01

Re: TQuery function umstellen auf FibPlus
 
ja danke hat geklappt.
Ich habe es nach active=true eingebaut, ich denke das es dort richtig ist.

mkinzler 1. Aug 2009 10:02

Re: TQuery function umstellen auf FibPlus
 
Kommt darauf an. Auf jeden Fall vor dem Aufruf des RecordCounts.

Eppos 1. Aug 2009 10:08

Re: TQuery function umstellen auf FibPlus
 
ja, die funktion GetOpenQuery wird vorher aufegrufen und darin der fetchall.

mkinzler 1. Aug 2009 10:10

Re: TQuery function umstellen auf FibPlus
 
Die Frage ist hier ja eher, ist es sinnvoll immer alle gleich auf einmal zu fetchen?

Btw. Du kommst ja aus einem schönen Kaff :zwinker:

Eppos 1. Aug 2009 10:33

Re: TQuery function umstellen auf FibPlus
 
Meine Funktion GetOpenQuery muss immer alle Daten liefern. Da ich davon ausgehe,
dass diese Funktion mit einem SQL aufgerufen wird, der genau die Daten liefert
die gebraucht werden.

hoika 2. Aug 2009 18:32

Re: TQuery function umstellen auf FibPlus
 
Hallo,

die Frage ist, warum brauchst die RecordCount ?

if RecordCount>0 sollte ersetzt werden durch
if not Query.QueryIsEmpty


Heiko

Eppos 2. Aug 2009 21:12

Re: TQuery function umstellen auf FibPlus
 
Danke für die Info, ich brauche das in diesem Fall für eine Progressbar.
Ich habe aber auch den besagten Fall von dir.
Aber, warum sollte man QueryIsEmpty durch recordcount ersetzen?


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:12 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz