AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Verschiedene Datenbank Querys in einer Funktion benutzen

Verschiedene Datenbank Querys in einer Funktion benutzen

Ein Thema von ASKtec · begonnen am 27. Nov 2008 · letzter Beitrag vom 28. Nov 2008
Antwort Antwort
ASKtec

Registriert seit: 19. Okt 2007
38 Beiträge
 
#1

Verschiedene Datenbank Querys in einer Funktion benutzen

  Alt 27. Nov 2008, 13:36
Datenbank: MSSQL + mySQL • Zugriff über: ADO + mySQL direct
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
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.177 Beiträge
 
Delphi 10.4 Sydney
 
#2

Re: Verschiedene Datenbank Querys in einer Funktion benutzen

  Alt 27. Nov 2008, 13:39
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
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
ASKtec

Registriert seit: 19. Okt 2007
38 Beiträge
 
#3

Re: Verschiedene Datenbank Querys in einer Funktion benutzen

  Alt 27. Nov 2008, 19:45
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
  Mit Zitat antworten Zitat
Thomas Feichtner

Registriert seit: 30. Nov 2007
Ort: Rum
137 Beiträge
 
Delphi 10.4 Sydney
 
#4

Re: Verschiedene Datenbank Querys in einer Funktion benutzen

  Alt 27. Nov 2008, 20:33
Wir verwenden für solche fälle die Komponente TADQuery von Remobject
www.remobjects.com
mfg

Thomas Feichtner
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#5

Re: Verschiedene Datenbank Querys in einer Funktion benutzen

  Alt 27. Nov 2008, 20:36
Oder UniDAC und vielleicht noch Zeos. Dies ist aber alles nicht so flexibel wie Bridge Pattern oder ORM.
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

Re: Verschiedene Datenbank Querys in einer Funktion benutzen

  Alt 27. Nov 2008, 21:07
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
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#7

Re: Verschiedene Datenbank Querys in einer Funktion benutzen

  Alt 27. Nov 2008, 21:54
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.
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.445 Beiträge
 
Delphi 10.4 Sydney
 
#8

Re: Verschiedene Datenbank Querys in einer Funktion benutzen

  Alt 28. Nov 2008, 07:09
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.
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#9

Re: Verschiedene Datenbank Querys in einer Funktion benutzen

  Alt 28. Nov 2008, 09:33
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.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#10

Re: Verschiedene Datenbank Querys in einer Funktion benutzen

  Alt 28. Nov 2008, 12:19
@omata: yes, sir, you're right war wohl im Eifer des Gefechts ...
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:38 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