meine Anwendung verbindet sich mit der Datenbank mit folgendem Code:
Code: Alles auswählen
procedure TForm1.Btn_VerbindenClick(Sender: TObject);
begin
try
Statusbar1.SimpleText:='Verbindung zur Datenbank wird aufgebaut...';
SQLQuery1.Close;
// Verbindungseinstellungen für die Firebird-Datenbank
// Werden nur gebraucht wenn noch keine Verbindung besteht
if not IBConnection1.Connected then
begin
IBConnection1.HostName := 'localhost';
IBConnection1.DatabaseName := 'employee';
IBConnection1.Username := 'SYSDBA';
IBConnection1.Password := 'Key4DaBa';
SQLQuery1.SQL.Text:= 'select * from employee';
IBConnection1.Connected:= True;
SQLTransaction1.Active:= True;
SQLQuery1.Open;
{
Um zu verhindern, dass in das Indexfeld 'CUST_NO' falsche Werte eingegeben werden,
teilen wir Lazarus mit, das wir keine Eingaben in diesem Feld erwarten und
}
SQLQuery1.FieldByName('EMP_NO').Required:=false;
{
um dem Anwender nicht doch die Möglichkeit zu geben Werte in das
Indexfeld 'CUST_NO' einzugeben, blenden wir die Spalte im DBGrid komplett aus.
}
DBGrid1.Columns[0].Visible:=false;
//
Statusbar1.SimpleText:='Verbindung zur Datenbank wurde aufgebaut.';
end
else
Statusbar1.SimpleText:='Verbindung zur Datenbank ist bereits vorhanden.';
except
//We could use EDatabaseError which is a general database error, but we're dealing with Firebird/Interbase, so:
on E: EDatabaseError do
begin
MessageDlg('Fehler','Der Verbindungsauf zur Datenbank ist fehlgeschlagen Details: ' + E.Message,mtError,[mbOK],0);
end;
end;
end;
Die Daten werden auch im
Code: Alles auswählen
DBGrid
Aber, wenn ich die Änderungen übernehmen will bekomme ich eine Fehlermeldung das die Daten schreibgeschützt sein.
Wenn ich mittels "FlameRobin" auf die Tabelle zugreife, kann ich problemlos die Daten bearbeiten.
Hier mein Code fürs Speichern:
Code: Alles auswählen
procedure TForm1.SaveChanges;
// Saves edits done by user, if any.
begin
If SQLQuery1.State in [dsEdit, dsInsert] then
begin
try
if SQLTransaction1.Active then
// Only if we are within a started transaction;
// otherwise you get "Operation cannot be performed on an inactive dataset"
begin
SQLQuery1.ApplyUpdates; //Pass user-generated changes back to database...
SQLTransaction1.Commit; //... and commit them using the transaction.
//SQLTransaction1.Active now is false
Statusbar1.SimpleText:='Die Änderungen wurden übernommen.';
end;
except
on E: EDatabaseError do
begin
MessageDlg('Fehler', 'Das Speichern der Änderungen hat nicht funktioniert. Details: ' +
E.Message, mtError, [mbOK], 0);
end;
end;
end;
end;
Ich finde einfach nicht heraus, warum die Daten schreibgeschütz sind.
Wer kann helfen?
Gruß Heiko