[gelöst] Zugriff auf Firebird DaBa nur ReadOnly - warum?

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Antworten
Benutzeravatar
kralle
Lazarusforum e. V.
Beiträge: 993
Registriert: Mi 17. Mär 2010, 14:50
OS, Lazarus, FPC: Linux Mint 20 , FPC 3.3.1 , Lazarus 2.1.0 -Win10 & XE7Pro
CPU-Target: 64Bit
Wohnort: Bremerhaven
Kontaktdaten:

[gelöst] Zugriff auf Firebird DaBa nur ReadOnly - warum?

Beitrag von kralle »

Moin,

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
angezeigt und ich kann dort auch Daten verändern.
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;     
 


Die Informationen habe ich von verschiedenen Internetseiten.
Ich finde einfach nicht heraus, warum die Daten schreibgeschütz sind.
Wer kann helfen?

Gruß Heiko
Dateianhänge
Die Fehlermeldung die ich bekomme. Ab "Details:" wichtig.
Die Fehlermeldung die ich bekomme. Ab "Details:" wichtig.
Das DBGrid nach erfolgreicher Verbindung mit der DaBa
Das DBGrid nach erfolgreicher Verbindung mit der DaBa
Der Aufbau meines Formulares
Der Aufbau meines Formulares
Zuletzt geändert von kralle am Fr 21. Jul 2017, 14:06, insgesamt 1-mal geändert.
OS: Manjaro Linux, Debian und Windows 10
FPC-Version: 3.2.2 , Lazarus 3.0
+ Delphi XE7SP1

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: Zugriff auf Firebird DaBa nur ReadOnly - warum?

Beitrag von mse »

kralle hat geschrieben:

Code: Alles auswählen

 
        SQLQuery1.SQL.Text:= 'select * from employee';
 


Hier bekommst du auch das "FULL_NAME"-Feld, nicht? "FULL_NAME" ist ein Funktions-Feld welches nicht beschrieben werden kann.
employee.png

Die Daten werden auch im

Code: Alles auswählen

DBGrid
angezeigt und ich kann dort auch Daten verändern.
Aber, wenn ich die Änderungen übernehmen will bekomme ich eine Fehlermeldung das die Daten schreibgeschützt sein.

In MSEgui würde man of_ininsert und of_inupdate der optionsfield property des "FULL_NAME"-Feldes deaktivieren, wie man das mit Lazarus macht weiss ich nicht.

Benutzeravatar
kralle
Lazarusforum e. V.
Beiträge: 993
Registriert: Mi 17. Mär 2010, 14:50
OS, Lazarus, FPC: Linux Mint 20 , FPC 3.3.1 , Lazarus 2.1.0 -Win10 & XE7Pro
CPU-Target: 64Bit
Wohnort: Bremerhaven
Kontaktdaten:

Re: Zugriff auf Firebird DaBa nur ReadOnly - warum?

Beitrag von kralle »

Moin,

mse hat geschrieben:
kralle hat geschrieben:

Code: Alles auswählen

 
        SQLQuery1.SQL.Text:= 'select * from employee';
 


Hier bekommst du auch das "FULL_NAME"-Feld, nicht? "FULL_NAME" ist ein Funktions-Feld welches nicht beschrieben werden kann.


Genau hier lag die Lösung.

Code: Alles auswählen

SQLQuery1.SQL.Text:= 'select EMP_NO, FIRST_NAME, LAST_NAME, PHONE_EXT, HIRE_DATE, DEPT_NO, JOB_CODE, JOB_GRADE, JOB_COUNTRY, SALARY from employee';

Ich muß nicht ALLE Felder abrufen, sondern nur die die beschreibbar sind und schon klappt das mit dem Ändern und sichern.

Die restlichen Sachen, werde ich dann auch noch hinbekommen.
Danke, für die Hilfe.

Gruß Heiko
OS: Manjaro Linux, Debian und Windows 10
FPC-Version: 3.2.2 , Lazarus 3.0
+ Delphi XE7SP1

Antworten