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