rs1305 hat folgendes geschrieben : |
Leider bekomme ich den Fehler "eine Datenmenge die nur zum Lesen geöffnet ist, kann nicht geändert werden. |
Diese Fehlermeldung sagt doch bereits alles, was für die Fehlerbehebung notwendig ist: Du versuchst, die Datenmende eines Dataset in die Datenbank zu schreiben, obwohl das Dataset nur zum Schreiben geöffnet wurde. Das kann zwei Ursachen haben:
- Es handelt sich um eine unidirektionale Komponente, die entweder nur lesen oder nur schreiben kann, nicht aber beides. Mit anderen Worten: Datenmengen unidirektionaler Datenbank-Komponenten (das sind zumeist die etwas älteren) können entweder zum Lesen oder zum Schreiben geöffnet werden, nicht aber für beides gleichzeitig.
- Das Property ReadOnly des Datasets wurde gesetzt.
Wenn du mit einer unidirektionalen Datenmenge arbeitest, kannst du also nicht dieselbe Datenmenge wieder zurückschreiben. Daher empfehle ich, im Datenmodul entsprechende Methoden bereitzustellen, die diese Aufgaben erledigen:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28:
| Function TDatenModul.GetAdresseByName(Const Nachname,Vorname : String; Var Id : Integer; Var Strasse,PLZ,Ort : String) : Boolean; begin Try MyQuery.Active := False; MyQuery.SQL.Clear; MyQuery.SQL.Append('select * from ADRESSEN'); MyQuery.SQL.Append('where NACHNAME = ' + QuotedStr(Nachname)); MyQuery.SQL.Append('and VORNAME = ' + QuotedStr(Vorname)); MyQuery.Open; Result := MyQuery.RecordCount > 0; If Result Then Begin Id := MyQuery.FieldByName('STRASSE').AsInteger; Strasse := MyQuery.FieldByName('STRASSE').AsString; PLZ := MyQuery.FieldByName('PLZ').AsString; Ort := MyQuery.FieldByName('ORT').AsString; End Else Begin Id := -1; Strasse := ''; PLZ := ''; Ort := ''; End; Finally MyQuery.Active := False; MyQuery.SQL.Clear; End; end; |
Genauso erstellst du dir dann eine Methode, die das Dataset wieder zurückschreibt:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| Procedure TDatenModul.WriteAdresseToDB(Const Id : Integer; Nachname,Vorname,Strasse,PLZ,Ort : String); begin Try MyQuery.Active := False; MyQuery.SQL.Clear; MyQuery.SQL.Append('update ADRESSEN set'); MyQuery.SQL.Append('NACHNAME = ' + QuotedStr(Nachname) + ','); MyQuery.SQL.Append('VORNAME = ' + QuotedStr(Vorname) + ','); MyQuery.SQL.Append('STRASSE = ' + QuotedStr(Strasse) + ','); MyQuery.SQL.Append('PLZ = ' + QuotedStr(PLZ) + ','); MyQuery.SQL.Append('ORT = ' + QuotedStr(Ort)); MyQuery.SQL.Append('where ID = ' + IntToStr(Id)); MyQuery.ExecSQL; Finally MyQuery.SQL.Clear; End; end; |
Um das Erlernen wenigstens der grundlegendsten SQL-Befehle kommst du natürlich nicht herum, aber das macht einen Datenbank-Entwickler eben aus: er kennt sich (mehr oder weniger) auch in der entsprechenden Abfragesprache aus.
Code ist ungetestet, da nur schnell zur Veranschaulichung in den Editor getippt.