Verständnisproblem DBEdit/DBGrid
Verständnisproblem DBEdit/DBGrid
Verständnisproblem DBEdit/DBGrid
Wie funktioniert der Update auf eine DB mittels DBGrid/DBEdit?
Auf einem Formular habe ich eine (Postgres) TPQConnection, eine TSQLTransaction, eine TSQLQuery (jeweils aus der SQLdb), TDBNavigator, eine TDatasource und ein TDBGid bzw. TDBEdit gezogen.
In der Connection alle Werte für die Postgres-DB eingetragen und mit der Transaction verbunden.
In der Transaction bei Database die Connection eingetragen
In der Query bei Database die Connection eingetragen, Datasource ist leer,
Falls ich dort meine Datasource eintrage gibt's 'Circular Datasource references are not allowed'.
Bei Transaction ist meine Transaction eingetragen.
Als SQL.Text ist ein einfacher Select Select name, vorname from testtab
Parsesql ist true, ReadOnly auf false
Bei UpdateMode alle Varianten ausprobiert.
In der Datasource ist als Dataset die SQLQuery eingetragen.
Im Navigator die Datasource auf meine Datasource gesetzt
Beim Start des Programms läuft alles bestens, ich sehe die Werte im DBGrid, die Navigation läuft korrekt, ich kann Felder editieren.
Die editierten Felder sind während des Programmlaufs auch weiter vorhanden, aber sie kommen partout nicht in meine Datenbank.
Ich habe SQLQuery1.ApplyUpdates; SQLTransaction1.Commit; aufgerufen, aber es nützt nichts, es kommen keine Werte in der DB an.
Mache ich zusätzlich einen Post (vor dem ApplyUpdates) bekomme ich die Fehlermeldung 'SQLQuery is not in edit or insert tate', aber meines Erachtens macht ja das Edit des DBGrid schon den Post, sodaß ich ihn nicht mehr machen muß (korrekt?).
Einen Primärkey hat die Tabelle auch (name Character(30)), oder MUSS der Primärkey numerisch sein?
Ich habe nirgends gefunden, dass man beim DBGrid einen UPDATE SQL selbst bauen muß...
Ist das richtig? Wird der vom System erstellt?
Wenn ja wo kann ich feststellen, wie der aussieht?
Oder wie wird vom DBGrid der Update in die Datenbank normalerweise gemacht?
Wenn ich UPDATE-SQLs schreibe und mit Execute ausführe und den Commit absetze, wird die
DB verändert, es ist also prinzipiell möglich mit der Connection-User-pwd-Kombination zu schreiben
Lazarus 0.9.26 / FPC 2.2.2 / winXP 32 / Postgres 8.3
Wie funktioniert der Update auf eine DB mittels DBGrid/DBEdit?
Auf einem Formular habe ich eine (Postgres) TPQConnection, eine TSQLTransaction, eine TSQLQuery (jeweils aus der SQLdb), TDBNavigator, eine TDatasource und ein TDBGid bzw. TDBEdit gezogen.
In der Connection alle Werte für die Postgres-DB eingetragen und mit der Transaction verbunden.
In der Transaction bei Database die Connection eingetragen
In der Query bei Database die Connection eingetragen, Datasource ist leer,
Falls ich dort meine Datasource eintrage gibt's 'Circular Datasource references are not allowed'.
Bei Transaction ist meine Transaction eingetragen.
Als SQL.Text ist ein einfacher Select Select name, vorname from testtab
Parsesql ist true, ReadOnly auf false
Bei UpdateMode alle Varianten ausprobiert.
In der Datasource ist als Dataset die SQLQuery eingetragen.
Im Navigator die Datasource auf meine Datasource gesetzt
Beim Start des Programms läuft alles bestens, ich sehe die Werte im DBGrid, die Navigation läuft korrekt, ich kann Felder editieren.
Die editierten Felder sind während des Programmlaufs auch weiter vorhanden, aber sie kommen partout nicht in meine Datenbank.
Ich habe SQLQuery1.ApplyUpdates; SQLTransaction1.Commit; aufgerufen, aber es nützt nichts, es kommen keine Werte in der DB an.
Mache ich zusätzlich einen Post (vor dem ApplyUpdates) bekomme ich die Fehlermeldung 'SQLQuery is not in edit or insert tate', aber meines Erachtens macht ja das Edit des DBGrid schon den Post, sodaß ich ihn nicht mehr machen muß (korrekt?).
Einen Primärkey hat die Tabelle auch (name Character(30)), oder MUSS der Primärkey numerisch sein?
Ich habe nirgends gefunden, dass man beim DBGrid einen UPDATE SQL selbst bauen muß...
Ist das richtig? Wird der vom System erstellt?
Wenn ja wo kann ich feststellen, wie der aussieht?
Oder wie wird vom DBGrid der Update in die Datenbank normalerweise gemacht?
Wenn ich UPDATE-SQLs schreibe und mit Execute ausführe und den Commit absetze, wird die
DB verändert, es ist also prinzipiell möglich mit der Connection-User-pwd-Kombination zu schreiben
Lazarus 0.9.26 / FPC 2.2.2 / winXP 32 / Postgres 8.3
-
- Beiträge: 131
- Registriert: Sa 5. Apr 2008, 17:57
- OS, Lazarus, FPC: Linux (Debian, Xubuntu), MacOS X, MS Win, Android, Web
- CPU-Target: 32Bit/64Bit
- Wohnort: Ulm
Re: Verständnisproblem DBEdit/DBGrid
Hallo,
wieder kann ich nur die Empfehlung ausprechen die Zeos Komponenten zu benutzen.
Gerade wegen der Transaktionssicherheit hatten wir diese gewählt. Es wohl zwar so, dass es inzwischen mit den anderen Komponenten auch funktionieren soll aber ich halte die Zeos Komponenten für deutlich ausgereifter.
Grundsätzlich sollte es aber möglich sein über ein zweite Query direkt via .ExecSQL ein "COMMIT" zu schicken.
Die Verbindung läuft ja übe die Connection, somit ist die Session für die DB die gleiche und es ist klar auf welche Transaktion es sich bezieht.
Es sollte ein Event "AfterPost" geben, bei Zeos ist dies bei der ZQuery verfügbar. Dahinter muss dann das "COMMIT" gefeuert werden.
Gruss,
Piper
wieder kann ich nur die Empfehlung ausprechen die Zeos Komponenten zu benutzen.
Gerade wegen der Transaktionssicherheit hatten wir diese gewählt. Es wohl zwar so, dass es inzwischen mit den anderen Komponenten auch funktionieren soll aber ich halte die Zeos Komponenten für deutlich ausgereifter.
Grundsätzlich sollte es aber möglich sein über ein zweite Query direkt via .ExecSQL ein "COMMIT" zu schicken.
Die Verbindung läuft ja übe die Connection, somit ist die Session für die DB die gleiche und es ist klar auf welche Transaktion es sich bezieht.
Es sollte ein Event "AfterPost" geben, bei Zeos ist dies bei der ZQuery verfügbar. Dahinter muss dann das "COMMIT" gefeuert werden.
Gruss,
Piper
-
- Lazarusforum e. V.
- Beiträge: 999
- Registriert: Do 17. Apr 2008, 01:59
- OS, Lazarus, FPC: Mint 21.1 Cinnamon / FPC 3.2.2/Lazarus 2.2.4
- CPU-Target: Intel i7-10750 64Bit
- Wohnort: Freiburg
Re: Verständnisproblem DBEdit/DBGrid
Hallo,
ganau das war heute auch mein Problem, allerdings funktioniert es bei mir inzwischen.
Ich habe das so gelöst:
P.S.: AfterPost gibt es auch bei SQLDB (bekomme ZEOS einfach nicht installiert)
Ich habe die beiden Zeilen
oben entfernt und ohne 'DataModule1' in AfterPost bei SQLQuery gesetzt - funktioniert auch.
ganau das war heute auch mein Problem, allerdings funktioniert es bei mir inzwischen.
Ich habe das so gelöst:
Code: Alles auswählen
procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);
begin
DataModule1.SQLQuery1.UpdateMode := upWhereChanged;
DataModule1.SQLQuery1.ApplyUpdates;
DataModule1.SQLTransaction1.Commit;
DataModule1.SQLQuery1.Close;
DataModule1.SQLTransaction1.Active:=false;
DataModule1.MySQL50Connection1.Connected:=false;
end;
Ich habe die beiden Zeilen
Code: Alles auswählen
DataModule1.SQLQuery1.ApplyUpdates;
DataModule1.SQLTransaction1.Commit;
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.
-
- 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: Verständnisproblem DBEdit/DBGrid
Einige Stichworte sind hier:tvfreak hat geschrieben:Verständnisproblem DBEdit/DBGrid
Wie funktioniert der Update auf eine DB mittels DBGrid/DBEdit?
http://www.lazarusforum.de/viewtopic.php?p=27855#p27855
Der post befehl geschieht vermutlich durch CheckBrowseMode beim Wechsel des record.Mache ich zusätzlich einen Post (vor dem ApplyUpdates) bekomme ich die Fehlermeldung 'SQLQuery is not in edit or insert tate', aber meines Erachtens macht ja das Edit des DBGrid schon den Post, sodaß ich ihn nicht mehr machen muß (korrekt?).
Nein.Einen Primärkey hat die Tabelle auch (name Character(30)), oder MUSS der Primärkey numerisch sein?
Ich habe nirgends gefunden, dass man beim DBGrid einen UPDATE SQL selbst bauen muß...
Ist das richtig? Wird der vom System erstellt?
Ja, falls möglich.
Wenn ja wo kann ich feststellen, wie der aussieht?
Breakpoint in packages/fcl-db/src/sqldb/sqldb.pp, function ModifiRecQuery, InsertRecQuery, DeleteRecQuery.
Martin
PS: Falls du es nicht kennst, MSEgui hat ebenfalls ausgereifte DB Komponenten. Für komfortable und einfache Anwendung tmsesqlquery.controller.options dso_autoapply, dso_autocommitret aktivieren.
Re: Verständnisproblem DBEdit/DBGrid
@MacWomble:
Mit ApplyUpdates und Commit habe ich es auch versucht, auch danach alles zu schliessen. Aber wie ich sehe hast du offensichtlich MYSQL50 benutzt. Ich allerdings Postgres. Bei mir hat es so nicht funktioniert. Habe auch noch etlich andere Möglichkeiten probiert, es kommt nichts automatisch vom GRID/DBEdit in die Postgres-Datenbank.
In einem Lazarus-DB-Tut hab ich unter Postgres folgendes gefunden
Falls es bei irgendwem doch funktioniert, lasst es mich wissen.
@mse:
Das Update-SQL Zusammensetzen lässt sich gut nachvollziehen, ich hab dabei einiges gelernt. 
MSE-GUI (hat das was mit dir 'mse' zu tun?) werd ich mir demnächst mal ansehen.
@piper62:
Ich wollte ursprünglich mit Lazarus und den Bordmitteln auskommen, hatte schon viel von Zeos gelesen, aber hatte keinen Mut (SVN-Client/vorher nie gehört
) es zu installieren. Siehe z.B. oben McWobble, der es wohl auch nicht installiert bekommen hat.
Hab mich dann aber doch drangemacht (Zip-download ohne SVNClient, auspacken zcomponent.lpk installieren, Lazarus neu compilieren lassen) und es war da.
Meine Postgres-DB verbunden, DBGrid, eine Query und alles funktioniert. Ich kann im Grid ändern, die Updates kommen an, oder auch nicht, wie gewünscht (je nach autocommit, applyupdates oder CachedUpdate). Bestens ...
Mein Fazit: Postgres und SQLdb mit DBGrid/Edit funktioniert nicht so, wie man es sich wünscht. Mit Zeos sofort Erfolg gehabt.
Danke für Eure Tips, Motivation und Hilfe. Jetzt geht's ans DB-Lazarus-GRid-Query-Transaktions- weiterforschen, weiterprobieren, weiterlernen.

Mit ApplyUpdates und Commit habe ich es auch versucht, auch danach alles zu schliessen. Aber wie ich sehe hast du offensichtlich MYSQL50 benutzt. Ich allerdings Postgres. Bei mir hat es so nicht funktioniert. Habe auch noch etlich andere Möglichkeiten probiert, es kommt nichts automatisch vom GRID/DBEdit in die Postgres-Datenbank.
In einem Lazarus-DB-Tut hab ich unter Postgres folgendes gefunden
Es scheint also auch bei anderen mit Postgres nicht so zu funktionieren, wie bei anderen DatenbankenTDBText and TDBEdit seem to work but (for me) they only _show_ _data_. To change contents in the database, I called the DB Engine direct

Falls es bei irgendwem doch funktioniert, lasst es mich wissen.
@mse:
Das hab ich gemacht, danke für den Hinweis, war sehr interessant.Breakpoint in packages/fcl-db/src/sqldb/sqldb.pp, function ModifiRecQuery, InsertRecQuery, DeleteRecQuery.


MSE-GUI (hat das was mit dir 'mse' zu tun?) werd ich mir demnächst mal ansehen.
@piper62:
Ich wollte ursprünglich mit Lazarus und den Bordmitteln auskommen, hatte schon viel von Zeos gelesen, aber hatte keinen Mut (SVN-Client/vorher nie gehört

Hab mich dann aber doch drangemacht (Zip-download ohne SVNClient, auspacken zcomponent.lpk installieren, Lazarus neu compilieren lassen) und es war da.
Meine Postgres-DB verbunden, DBGrid, eine Query und alles funktioniert. Ich kann im Grid ändern, die Updates kommen an, oder auch nicht, wie gewünscht (je nach autocommit, applyupdates oder CachedUpdate). Bestens ...




Mein Fazit: Postgres und SQLdb mit DBGrid/Edit funktioniert nicht so, wie man es sich wünscht. Mit Zeos sofort Erfolg gehabt.
Danke für Eure Tips, Motivation und Hilfe. Jetzt geht's ans DB-Lazarus-GRid-Query-Transaktions- weiterforschen, weiterprobieren, weiterlernen.


-
- 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: Verständnisproblem DBEdit/DBGrid
Ja, ich bin der Autor von MSEide+MSEgui.tvfreak hat geschrieben: MSE-GUI (hat das was mit dir 'mse' zu tun?)
Das ist seltsam, vermutlich ist da irgend etwas falsch in deiner Anwendung. Ich habe nie gehört, dass SQLDB mit PostgreSQL nicht funktionieren sollte. Die MSEgui Version jedenfalls wird erfolgreich in mehreren kommerziellen Projekten eingesetzt.Mein Fazit: Postgres und SQLdb mit DBGrid/Edit funktioniert nicht so, wie man es sich wünscht.
Martin
-
- Beiträge: 2
- Registriert: Do 27. Aug 2015, 09:04
- OS, Lazarus, FPC: Windows 10
- CPU-Target: 64 Bit
- Wohnort: Griesheim
Re: Verständnisproblem DBEdit/DBGrid/DBNavigator
Ich bin noch neu hier im Forum und möchte erstmal guten Tag sagen.
Mein Problem ist, dass ich von der Delphi-Schiene komme und von dort ziemlich "verwöhnt" bin.
Wenn ich dort eine einfache DB-Anwendung erstellen wollte, konnte ich das durch einfaches Komponenten wählen und
Einstellungen klicken erledigen. Danach lief die Applikation.
Das ist auch der Grund für mich dieses schon etwas ältere Thema noch einmal aufgreifen.
Was ich hier bisher vergebens gesucht habe, ist eine einfache, verständliche und vor Allem vollständige Anleitung
zum Erstellen einer einfachen DB-Anwendung. Mit z.B. MySQl, DBGrid, Datasource und vor Allem DBNavigator.
Welche Funktion hat ein Post-Button im DBNavigator, wenn er eigentlich nichts bewirkt. Ohne manuelle Verarbeitung mit
Transaktionssteuerung bekomme ich keine geänderten Daten in die Datenbank.
Vielleicht kann ja jemand meinen Verständnisknoten auflösen.
Danke vorab.
msdotz
Mein Problem ist, dass ich von der Delphi-Schiene komme und von dort ziemlich "verwöhnt" bin.
Wenn ich dort eine einfache DB-Anwendung erstellen wollte, konnte ich das durch einfaches Komponenten wählen und
Einstellungen klicken erledigen. Danach lief die Applikation.
Das ist auch der Grund für mich dieses schon etwas ältere Thema noch einmal aufgreifen.
Was ich hier bisher vergebens gesucht habe, ist eine einfache, verständliche und vor Allem vollständige Anleitung
zum Erstellen einer einfachen DB-Anwendung. Mit z.B. MySQl, DBGrid, Datasource und vor Allem DBNavigator.
Welche Funktion hat ein Post-Button im DBNavigator, wenn er eigentlich nichts bewirkt. Ohne manuelle Verarbeitung mit
Transaktionssteuerung bekomme ich keine geänderten Daten in die Datenbank.
Vielleicht kann ja jemand meinen Verständnisknoten auflösen.
Danke vorab.
msdotz
- af0815
- Lazarusforum e. V.
- Beiträge: 6780
- Registriert: So 7. Jan 2007, 10:20
- OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
- CPU-Target: 32Bit (64Bit)
- Wohnort: Burgenland
- Kontaktdaten:
Re: Verständnisproblem DBEdit/DBGrid
Vorschlagen würde ich mal
In der Lazarus wiki nachsehen
In der Lazinfos reinschauen.
Es ausprobieren und einenneuen Thread für die auftauchenden Fragen zu eröffnen.
Schau dir auch mal die Zeoskomponnenten an, die haben teilweiseden Komfort, den du von Delphi gewohnt warst.
Andreas
In der Lazarus wiki nachsehen
In der Lazinfos reinschauen.
Es ausprobieren und einenneuen Thread für die auftauchenden Fragen zu eröffnen.
Schau dir auch mal die Zeoskomponnenten an, die haben teilweiseden Komfort, den du von Delphi gewohnt warst.
Andreas
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).
-
- Beiträge: 2
- Registriert: Do 27. Aug 2015, 09:04
- OS, Lazarus, FPC: Windows 10
- CPU-Target: 64 Bit
- Wohnort: Griesheim
Re: Verständnisproblem DBEdit/DBGrid
Danke Andreas.
Ich schaue mal ob ich übers Wiki weiterkomme.
Güsse
Ernst
Ich schaue mal ob ich übers Wiki weiterkomme.
Güsse
Ernst
- af0815
- Lazarusforum e. V.
- Beiträge: 6780
- Registriert: So 7. Jan 2007, 10:20
- OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
- CPU-Target: 32Bit (64Bit)
- Wohnort: Burgenland
- Kontaktdaten:
Re: Verständnisproblem DBEdit/DBGrid
Zusätzlich kann man mal ins Lazarus Verzeichnis reinsehen, da gibt es unter 'examples' einige Beispiele. Zum Beispiel ist unter sqldbtutorial3 der Quellcode für http://wiki.lazarus.freepascal.org/SQLdb_Tutorial3 zu finden.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).