![]() |
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:
Geht sowas mit den zwei verschiedenen Komponenten?
function machwasmitderDB(query: ?????):booelan;
query.sql.add(.....) Danke für eure Hilfe Andreas |
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 ![]() |
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 |
Re: Verschiedene Datenbank Querys in einer Funktion benutzen
|
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.
|
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:
In dem Fall, dass du auch noch Daten haben möchtest, dann kannst du dir einfach das TDataset zurückgeben lassen:
// 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;
Delphi-Quellcode:
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.
// 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; cu Oliver |
Re: Verschiedene Datenbank Querys in einer Funktion benutzen
Zitat:
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. |
Re: Verschiedene Datenbank Querys in einer Funktion benutzen
Zitat:
|
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. |
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 06:21 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