Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Verschiedene Datenbank Querys in einer Funktion benutzen (https://www.delphipraxis.net/124931-verschiedene-datenbank-querys-einer-funktion-benutzen.html)

ASKtec 27. Nov 2008 13:36

Datenbank: MSSQL + mySQL • Zugriff über: ADO + mySQL direct

Verschiedene Datenbank Querys in einer Funktion benutzen
 
Hallo zusammen,

ich habe mal wieder eine Frage...

Ich habe eine Anwendung die Daten aus einer Datenbank auslesen und diese weiterverarbeiten soll. Die Datenbank kann sowohl eine MSSQL als auch eine mySQL-Datenbank sein. Ich benutze für den Zugriff auf MSSQL die ADO-Komponenten der Gruppe dbGo und für den Zugriff auf mySQL die SQL Komponenten aus der Gruppe dbExpress (inkl. mySQLdirect von CoreLab).

Nun habe ich allerdings heftig viel Quellcode im Programm, weil ich für jede Datenbankversion andere Komponenten benutze.

Kann ich irgendwie an eine Funktion die passende Query übergeben um die hälfte des Quellcodes einzusparen? Im Moment greife ich ja über Form1.ADOQuery1... oder über Form1.SQLQuery1... auf die entsprechenden Komponenten zu.

Ideal wäre es ja einen Funktionsaufruf ala

Delphi-Quellcode:
function machwasmitderDB(query: ?????):booelan;
    query.sql.add(.....)
Geht sowas mit den zwei verschiedenen Komponenten?

Danke für eure Hilfe

Andreas

Bernhard Geyer 27. Nov 2008 13:39

Re: Verschiedene Datenbank Querys in einer Funktion benutzen
 
Was du brauchst ist eine weiter Abstraktionsschicht. Entweder fertig wie es z.B. ECO, (N)Hibernate und Co. darstellen. Für Delphi.Win32 sollte es auch was geben aber hab keinen Link zur hand.

Ansonsten selbst "basteln" mit Hilfe des Bridge Pattern

ASKtec 27. Nov 2008 19:45

Re: Verschiedene Datenbank Querys in einer Funktion benutzen
 
Danke für die Antwort.... aber Du bist mir nicht böse, wenn ich das (noch) nicht verstehe? :?

Kann mir da bitte jemand etwas einfacher auf die Sprünge helfen?

Vielen Dank.
Andreas

Thomas Feichtner 27. Nov 2008 20:33

Re: Verschiedene Datenbank Querys in einer Funktion benutzen
 
Wir verwenden für solche fälle die Komponente TADQuery von Remobject
www.remobjects.com

mkinzler 27. Nov 2008 20:36

Re: Verschiedene Datenbank Querys in einer Funktion benutzen
 
Oder UniDAC und vielleicht noch Zeos. Dies ist aber alles nicht so flexibel wie Bridge Pattern oder ORM.

Sir Rufo 27. Nov 2008 21:07

Re: Verschiedene Datenbank Querys in einer Funktion benutzen
 
Oder für auf die Schnelle mit Boardmitteln war dein Ansatz ja gar nicht so schlecht.

Also 2 Klassen bauen, die sich auf der Schnittstellenseite zu deinem Programm absolut identisch verhalten müssen (klar ;) ) aber auf der DB-Seite natürlich je nach Dialekt reagieren sollen. Dabei sind reine SQL-Statements die keine Records liefern ja noch relativ harmlos. Allerdings wäre es wahrscheinlich besser nicht wirklich den Query (so wie in deinem Beispiel) als Parameter zu übergeben, sondern pro Funktionalität auch eine function/procedure (ähnlich den stored procedures) und dabei nur die Parameter übergeben.

Beispiel: Ein Datensatz soll gelöscht werden
Delphi-Quellcode:
// einmal für MSSQL
function TMSSQL.LoescheDatensatz( const RecordID : integer ) : boolean;
begin
  ...
end;

// und einmal für MYSQL
function TMYSQL.LoescheDatensatz( const RecordID : integer ) : boolean;
begin
  ...
end;
In dem Fall, dass du auch noch Daten haben möchtest, dann kannst du dir einfach das TDataset zurückgeben lassen:
Delphi-Quellcode:
// einmal für MSSQL
function TMSSQL.HoleDatensatz( const RecordID : integer; var Dataset : TDataset ) : boolean;
begin
  ...
end;

// und einmal für MYSQL
function TMYSQL.HoleDatensatz( const RecordID : integer; var Dataset : TDataset ) : boolean;
begin
  ...
end;
Eine komplette Abstraktion ist zwar insgesamt gesehen (vor allem bei wachsenden Projekten) besser (Pflege, Handhabung, Flexibilität, ...) aber man will ja klein anfangen und das hier ist dann nicht ganz soweit weg von dem, was du bis jetzt hast, aber schon etwas anders.

cu

Oliver

omata 27. Nov 2008 21:54

Re: Verschiedene Datenbank Querys in einer Funktion benutzen
 
Zitat:

Zitat von Sir Rufo
Delphi-Quellcode:
// einmal für MSSQL
function TMSSQL.HoleDatensatz( const RecordID : integer; var Dataset : TDataset ) : boolean;

// und einmal für MYSQL
function TMYSQL.HoleDatensatz( const RecordID : integer; var Dataset : TDataset ) : boolean;

Warum wird hier das Dataset als Referenzparameter übergeben?
Wenn ich soetwas benutze, dann erstelle ich doch das Dataset ausserhalb und übergebe es dann an "HoleDatensatz" ich übergebe also das Objekt und kann dann auf Diesem arbeiten.
Ein Zurückgeben des Objektzeigers ist hier wohl sehr unpassend.

Je nachdem, ob das übergebene Objekt exitiert, kann ich innerhalb von "HoleDatensatz" dann auch unterscheiden, ob es gewollt ist Daten zurückzugeben.

Blup 28. Nov 2008 07:09

Re: Verschiedene Datenbank Querys in einer Funktion benutzen
 
Zitat:

Zitat von omata
Warum wird hier das Dataset als Referenzparameter übergeben?
Wenn ich soetwas benutze, dann erstelle ich doch das Dataset ausserhalb und übergebe es dann an "HoleDatensatz" ich übergebe also das Objekt und kann dann auf Diesem arbeiten.
Ein Zurückgeben des Objektzeigers ist hier wohl sehr unpassend.

Je nachdem, ob das übergebene Objekt exitiert, kann ich innerhalb von "HoleDatensatz" dann auch unterscheiden, ob es gewollt ist Daten zurückzugeben.

Die tatsächliche Klasse des Dataset ist außerhalb der Klassen TMSSQL oder TMYSQL nicht bekannt.

omata 28. Nov 2008 09:33

Re: Verschiedene Datenbank Querys in einer Funktion benutzen
 
Das halte ich ja für ein Gerücht.

Wenn TDataSet nicht bekannt ist, wie willst du dann "HoleDatensatz" aufrufen?

Edit: Und gerade dann wenn das Objekt nur innerhalb der Klassen existiert und verwaltet wird, ist es wichtig, das Objekt nicht rauszureichen, sondern ein Neues zu übergeben und dann innerhalb von "HoleDatensatz" zu initialisieren. Oder den Zugriff auf das interne Dataset nur über Zugriffsmethoden zu zulassen.

Sir Rufo 28. Nov 2008 12:19

Re: Verschiedene Datenbank Querys in einer Funktion benutzen
 
@omata: yes, sir, you're right :mrgreen: war wohl im Eifer des Gefechts ...


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:23 Uhr.

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