AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken DataSet und die Datenbanklogik
Thema durchsuchen
Ansicht
Themen-Optionen

DataSet und die Datenbanklogik

Offene Frage von "Moebius97"
Ein Thema von Moebius97 · begonnen am 2. Nov 2010 · letzter Beitrag vom 29. Dez 2011
Antwort Antwort
Seite 1 von 2  1 2      
Moebius97

Registriert seit: 1. Jul 2010
4 Beiträge
 
Delphi 2 Desktop
 
#1

DataSet und die Datenbanklogik

  Alt 2. Nov 2010, 07:50
Datenbank: Firebird • Version: 2.5 • Zugriff über: Interbase Express
Hallo allerseits,
wir hatten öfter schon das Thema, dass man an generierte IDs (AutoInc usw.) nicht ohne Weiteres in seiner Delphi-anwendung heran kommt, wenn neue Datensätze angelegt werden. Nachdem ich die entsprechenden Krücken eingebaut habe (eigene Abfrage eines Generators und dessen ID verwenden), wird mir jetzt eine Feldberechnung zu früh ausgeführt. Es handelt sich um ein per Firebird mit "computed by"-Ausdruck berechnetes Zeitstempelfeld. Ich hätte gerne ein Paar aus Komponenten und Datenbank, das mir solche Hacks erspart. Ich möchte die Datenbanklogik soweit wie möglich in die Datenbank verlagern und Komponenten, die das auch berücksichtigen.

Hintergrund: Es geht um ein Datenmodul, auf dem mehrere TIBTable-Komponenten kleben. Ich hänge in der "Haupttabelle" AfterInsert- und Afterscroll-Handler ein. In AfterInsert muss ein Datensatz in einer abhängigen Tabelle angelegt werden, der ein berechnetes Feld enthält (das für die Anzeige erstmal nicht gebraucht wird). Dort knallt es "0.0 ist kein gültiger Zeitstempel". AutoCalcfields abzuschalten, nützt übrigens nichts.

Hat jemand eine Empfehlung für ein "sauberes System"? Kann ich mit stabileren Komponenten auf eine Firebird-DB zugreifen? Oder sollte ich die DB doch wechseln?
  Mit Zitat antworten Zitat
Blup

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

AW: DataSet und die Datenbanklogik

  Alt 2. Nov 2010, 08:21
Das hört sich für mich erst mal nach ungüstiger Datenbank- und Anwendungsstruktur an.
Mit anderen Datenbanksystemen würden vermutlich ähnliche Probleme auftauchen.
Zeig uns doch mal die Struktur und die Abhängigkeiten beider Tabellen.
Tritt der Fehler beim Post in der Haupttabelle auf, weil dort ein Feld noch nicht belegt ist?
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 15. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#3

AW: DataSet und die Datenbanklogik

  Alt 2. Nov 2010, 08:22
...Nachdem ich die entsprechenden Krücken eingebaut habe (eigene Abfrage eines Generators und dessen ID verwenden)
Also du kannst froh sein, eine Datenbank zu benützen, die Generatoren kennt.
In anderen DBMS müsstest du den Generator künstlich nachbilden.
Einen Generator zu verwenden ist keine Krücke, sondern eigentlich sind AUTOINC-Felder die Krücke.
AUTOINC-Felder wiegen den Programmierer in der falschen Sicherheit, er müsse sich nicht um die Primärschlüsselfelder kümmern.
Sobald man aber abhängige Tabellen hat, entsteht das Problem, dass man den Wert des Feldes nicht kennt.

... Es handelt sich um ein per Firebird mit "computed by"-Ausdruck berechnetes Zeitstempelfeld. ... Ich möchte die Datenbanklogik soweit wie möglich in die Datenbank verlagern und Komponenten, die das auch berücksichtigen.
Es gibt 3 Haupt-Gründe weshalb man Logik in die Datenbank verlagert:
1.) Geschwindigkeit. Manche Dinge werden auf der Datenbank wesentlich schneller ausgeführt als über die Anwendung
2.) Mehrere verschiedene Anwendungen greifen auf die gleiche Datenbank zu
Durch Verlagerung von Logik in die Datenbank vermeidet man das Implementieren der Logik in mehreren Anwendungen.
Falls unbekannte neue Anwendungen auf die Datenbank zugreifen profitieren diese automatisch
3.) Schutz der Datenbank vor inkonsistenten Daten; Erzwingung von Integritätsregeln

Ich vermute mal, dass in deinem Fall keiner der Gründe zutrifft und dass du nur deshalb das "computed by"-Feld verwendest um deine Anwendung etwas zu vereinfachen.
Man müsste jetzt die genaue Tabellenstruktur und das gewünschte Ergebnis kennen, aber mit einer SQL-Query oder einem CalculatedField (lokal im Dataset berechnet) kommst du auch ans Ziel.
  Mit Zitat antworten Zitat
exilant

Registriert seit: 28. Jul 2006
134 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: DataSet und die Datenbanklogik

  Alt 2. Nov 2010, 09:01
....Hat jemand eine Empfehlung für ein "sauberes System"? Kann ich mit stabileren Komponenten auf eine Firebird-DB zugreifen? Oder sollte ich die DB doch wechseln?
Vergiss Tdataset und seine hässlichen (TTable-) Kinder. Das ganze Dataset Geraffel führt nur zu einer üblen Verquickung von Anwendungslogik und GUI Programmierung. Firebird unterstützt INSERT/RETURNING. Mit den ZEOS oder (noch besser FIBPLUS) Komponenten kommst Du problemlos an die im Trigger vergebenen Generator Werte. Die DB musst Du dazu sicher nicht wechseln.
Zusammengefasst: verwende nicht TDataset, verwende keine datengebundenen Komponenten, verwende Zugriffskomponenten die aktuelle Firebird Versionen unterstützen, beherzige das MVC Modell.
Anything, carried to the extreme, becomes insanity. (Exilant)
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#5

AW: DataSet und die Datenbanklogik

  Alt 2. Nov 2010, 09:41
Im grossen und ganzen stimmt das so schon. Nur was soll das :

Vergiss Tdataset und seine hässlichen (TTable-) Kinder.
Die TTable-Kinder soll er wirklich vergessen, aber was hat das mit TDataSet zu tun ? Das ist die gemeinsame Grundlage. Bei TTable siehts jetzt so aus : erben tut das von TDBDataSet, das von TBDEDataset und letztendlich von TDataset. Das TDataSet kann man sowieso nicht einfach so benutzen, sondern nur die entsprechenden Ableitungen. Was soll man denn überhaupt benutzen, wenn nicht von TDataSet abgeleitete Komponenten ? Z.B. das : TpFIBDataSet Welche Alternative gibt es denn dazu ? Und wo kommt das her ? Richtig von TDataset bzw. bei Delphi 10+ von TWideDataset.

Das TDataSet ist deshalb so wichtig, um die Kompatibilität zu wahren. Wer sich nicht mal daran hält, der wird auf mittlere Sicht Schiffbruch erleiden. Siehe IBObjects. Lange nichts mehr davon gehört (Zeos nicht auch ? ). Aber im Endeffekt trotzdem logisch. Die TdataSet-Inkompatibilität hat dafür gesorgt, dass es sehr sehr viel Arbeit gibt. Mir wärs auch zu blöd das Rad jedesmal neu zu erfinden (z.B. TMyDbGrid + Co.) und noch an jede neue Delphi-Version anzupassen.
Gruß
Hansa

Geändert von Hansa ( 2. Nov 2010 um 09:43 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von nachti1505
nachti1505

Registriert seit: 7. Apr 2007
188 Beiträge
 
Delphi 7 Enterprise
 
#6

AW: DataSet und die Datenbanklogik

  Alt 2. Nov 2010, 09:52
Für Anfänger besteht hier aber ganz schnell die Gefahr (wie oben beschrieben), dass durch die Kette TDataset->TDataSource->TDBGrid ganz schnell MVC verlassen wird. Und das später wieder gerade zu biegen... na ja, ich weiß was das bringen kann!
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#7

AW: DataSet und die Datenbanklogik

  Alt 2. Nov 2010, 10:13
dass durch die Kette TDataset->TDataSource->TDBGrid ganz schnell...
Das ist zumindest keine Vererbungs-Kette, wie von mir beschrieben. Siehe hier : TDataSource = class(TComponent) Das sind lediglich Properties, die zugewiesen werden können und sonst nichts. Vererbt wird da nichts.
Gruß
Hansa
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

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

AW: DataSet und die Datenbanklogik

  Alt 2. Nov 2010, 10:17
Zudem ist die Richtung falsch.
Markus Kinzler
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#9

AW: DataSet und die Datenbanklogik

  Alt 2. Nov 2010, 10:43
Zudem ist die Richtung falsch.
Kommt aber auch drauf an, in welcher Richtung man liest. Habe mir allerdings nochmals die Ausgangsfrage durchgelesen. Da werden TIBTables benutzt ? Wieso steht dann im Titel was von DataSet ? Wie bereits gesagt : das ist ein nicht zu unterschätzender Knackpunkt. Dann noch zu den Events und IBX, rückgelieferter ID usw.: habe da ein ungutes Gefühl. Zumindest letzteres war definitiv zur Zeit des Auseinanderlaufens von Interbase und Firebird noch nicht da. Ob das mit den Interbase (also IBX)-Komponenten richtig geht ? Ich wäre sehr sehr vorsichtig mit allem, was im Zusammenhang mit Firebird, in Interbase 6.0 noch nicht ging !!
Gruß
Hansa
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

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

AW: DataSet und die Datenbanklogik

  Alt 2. Nov 2010, 10:46
Das Grid weist aber auf die DataSource und diese auf das DataSet
Markus Kinzler
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 23:55 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