Verständnisproblem DBEdit/DBGrid

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Antworten
tvfreak
Beiträge: 2
Registriert: Fr 6. Mär 2009, 18:49

Verständnisproblem DBEdit/DBGrid

Beitrag von tvfreak »

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

piper62
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

Beitrag von piper62 »

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

MacWomble
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

Beitrag von MacWomble »

Hallo,

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;


P.S.: AfterPost gibt es auch bei SQLDB (bekomme ZEOS einfach nicht installiert)

Ich habe die beiden Zeilen

Code: Alles auswählen

DataModule1.SQLQuery1.ApplyUpdates;
DataModule1.SQLTransaction1.Commit;

oben entfernt und ohne 'DataModule1' in AfterPost bei SQLQuery gesetzt - funktioniert auch.
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.

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: Verständnisproblem DBEdit/DBGrid

Beitrag von mse »

tvfreak hat geschrieben:Verständnisproblem DBEdit/DBGrid
Wie funktioniert der Update auf eine DB mittels DBGrid/DBEdit?

Einige Stichworte sind hier:
http://www.lazarusforum.de/viewtopic.php?p=27855#p27855

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?).

Der post befehl geschieht vermutlich durch CheckBrowseMode beim Wechsel des record.
Einen Primärkey hat die Tabelle auch (name Character(30)), oder MUSS der Primärkey numerisch sein?

Nein.
[b]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.

tvfreak
Beiträge: 2
Registriert: Fr 6. Mär 2009, 18:49

Re: Verständnisproblem DBEdit/DBGrid

Beitrag von tvfreak »

@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
TDBText and TDBEdit seem to work but (for me) they only _show_ _data_. To change contents in the database, I called the DB Engine direct
Es scheint also auch bei anderen mit Postgres nicht so zu funktionieren, wie bei anderen Datenbanken :(
Falls es bei irgendwem doch funktioniert, lasst es mich wissen.

@mse:
Breakpoint in packages/fcl-db/src/sqldb/sqldb.pp, function ModifiRecQuery, InsertRecQuery, DeleteRecQuery.

Das hab ich gemacht, danke für den Hinweis, war sehr interessant. 8) 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 ... :D :D :D :D


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. 8) 8)

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: Verständnisproblem DBEdit/DBGrid

Beitrag von mse »

tvfreak hat geschrieben:MSE-GUI (hat das was mit dir 'mse' zu tun?)

Ja, ich bin der Autor von MSEide+MSEgui.
Mein Fazit: Postgres und SQLdb mit DBGrid/Edit funktioniert nicht so, wie man es sich wünscht.

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.

Martin

msdotz
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

Beitrag von msdotz »

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

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
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

Beitrag von af0815 »

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
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

msdotz
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

Beitrag von msdotz »

Danke Andreas.
Ich schaue mal ob ich übers Wiki weiterkomme.

Güsse

Ernst

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
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

Beitrag von af0815 »

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).

Antworten