Einzelnen Beitrag anzeigen

marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#5

Re: Daten editieren mit TQuery

  Alt 25. Apr 2006, 22:36
Hallo Lombi,

was wahrscheinlich nicht jedem sofort klar ist - du möchtest eine Benutzerschnittstelle ohne die datensensitiven DB-Controls gestalten. Außerdem bemühst du dich um den Einsatz von Queries anstelle von Tables.

Ein Problem beim konkurrierenden Zugriff auf einen Datensatz ist stets die Konsistenzerhaltung. Zwei Sperrverfahren sind da weithin bekannt. Pessimistisches Sperren entspricht dem Vorgehen "Ressourcenbeschaffung - Operation - Ressourcenfreigabe", wie du es an vielen Stellen in deinem Programm anwendest. Bei Datenbanken (Okay - Paradox ist nicht wirklich ein RDBMS) ist dieses Verfahren allerdings verpönt, da es erfahrungsgemäß hohe Transaktionszahlen durch eine unnötig lange Lebensdauer der Sperren verhindert. Favorisiert wird mehr das Optimistische Sperrverfahren, bei dem man annimmt "es wird schon nicht schief gehen" und über einen timestamp stellt das RDBMS intern fest, ob doch etwas schief gegangen ist.

Wenn Markus dich auffordert, die Edit-Methode beim Auslesen zu meiden, dann sicher deswegen, weil auch er ein Anhänger des optimistischen Verfahrens ist. Bei Desktop-Datenbanken (wie Paradox, Access, dBase) ist aber auch der pessimistische Ansatz keine so große Sünde.

Dein SQL-Statement ist sicher nur ein Schnellschuss, in deiner Anwendung wirst du mit der Query oft genau einen einzigen Datensatz besorgen (WHERE ID = 4711). Deinen Bearbeitungsdialog solltest du so gestalten, dass er für INSERT und UPDATE verwendet werden kann. Wenn du ihm eine public Methode function Execute(ds: TDataSet): Boolean; spendierst wirst du dein Ziel wohl am schnellsten erreichen.

Deinen Konvertierungsfehler kannst du vielleicht so vermeiden:

Delphi-Quellcode:
TAdrListe.BtnEditClick(Sender: TObject); //Daten ändern
...
with FAdr do
begin
  QueryAdr.SQL.Text := Format('SELECT * FROM Adr WHERE ID = %d', [AktuellerSchluesselAusAdrListe]);
  QueryAdr.Open;
  EditName.Text := QueryAdr.FieldByName('Name').AsString;
  EditVorname.Text := QueryAdr.FieldByName('Vorname').AsString;
  // ...
  QueryAdr.Close;
end;
Verursacht wurde er wahrscheinlich durch einen NULL-Wert in einem der Felder.

Freundliche Grüße vom marabu
  Mit Zitat antworten Zitat