![]() |
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 |
Re: TQuery function umstellen auf FibPlus
Hallo,
ich will auch die BDE ersetzen ... ;) Zitat:
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 |
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...?!?
|
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:
end.
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; Bis bald Chemiker |
Re: TQuery function umstellen auf FibPlus
Zitat:
Delphi-Quellcode:
vielleicht?
DataSet.Open;
|
Re: TQuery function umstellen auf FibPlus
mit "open" geht es leider auch nicht. Ist eine read-only property.
|
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?!?
|
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 |
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... :| |
Re: TQuery function umstellen auf FibPlus
TpFibQuery ist eh nur aus Kompatibilitätsgründen zur BDE vorhanden.
|
Re: TQuery function umstellen auf FibPlus
gibt es denn die Möglichkeit, aus der BDE den "SERVER NAME" (locahost:C:\Datenbanke.fdb) auszulesen?
|
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 |
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? |
Re: TQuery function umstellen auf FibPlus
Zitat:
Obendrein ist TpFibQuery sehr leichtgewichtig und damit auch sehr schnell beim (unidirektionalen) lesen von Datenmengen. |
Re: TQuery function umstellen auf FibPlus
Hallo,
Zitat:
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 |
Re: TQuery function umstellen auf FibPlus
Zitat:
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. |
Re: TQuery function umstellen auf FibPlus
was aber tun, wenn in TFibQuery kein Locate vorhanden ist?!? Doch TFibDatatset verwenden?
|
Re: TQuery function umstellen auf FibPlus
Zitat:
|
Re: TQuery function umstellen auf FibPlus
@hoika
Danke. Funktion funktioniert ;-) @exilant Wo finde ich das Tutorial? |
Re: TQuery function umstellen auf FibPlus
|
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?!? |
Re: TQuery function umstellen auf FibPlus
Hallo,
waren wir nicht bei TfXXQuery (habs gerade nicht im Kopf). Wieso jetzt DataSet ? Egal: Weekend !!! Heiko |
Re: TQuery function umstellen auf FibPlus
das Problem war nur, das FibQuery kein Locate konnte...
Aber ich probiere es mal mit FibQuery... |
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 |
Re: TQuery function umstellen auf FibPlus
Zitat:
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. |
Re: TQuery function umstellen auf FibPlus
ich habe jetzt eine Funktion geschrieben die wie folgt aussieht
Delphi-Quellcode:
Das Problem ist nur, wenn ich diese Funktion ausführe, werden
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; alle OpenQuerys geschlossen und zwar dann, wenn "myQuery.Transaction.Commit" ausgeführt wird. Weiss jemand warum? |
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.
|
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?
|
Re: TQuery function umstellen auf FibPlus
Oder wie den Query dynamisch erstellen
|
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?!? |
Re: TQuery function umstellen auf FibPlus
Vielleicht implementieren die Komponenetn diese Eigenschaft nicht, oder es wird nur der erste gefetcht.
|
Re: TQuery function umstellen auf FibPlus
wie kann ich alle fetchen?
|
Re: TQuery function umstellen auf FibPlus
Ich bin kein FIBPlus-Spezialist, gibt es etwas wie .FetchAll o.ä?
|
Re: TQuery function umstellen auf FibPlus
ja danke hat geklappt.
Ich habe es nach active=true eingebaut, ich denke das es dort richtig ist. |
Re: TQuery function umstellen auf FibPlus
Kommt darauf an. Auf jeden Fall vor dem Aufruf des RecordCounts.
|
Re: TQuery function umstellen auf FibPlus
ja, die funktion GetOpenQuery wird vorher aufegrufen und darin der fetchall.
|
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: |
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. |
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 |
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 03:06 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz