Bei welchem Ereigniss ruft man Commit auf?

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Matze
Beiträge: 32
Registriert: Di 11. Jun 2013, 17:11

Bei welchem Ereigniss ruft man Commit auf?

Beitrag von Matze »

Hallo,

da ich nicht weiterkomme habe ich mich hier angemeldet. Ich kann keine Daten in eine MySQL Datenbank schreiben. Das muss, glaube ich, am Commit liegen? Soviel habe ich hier schon gelesen. Aber wo ruft man Commit auf? Im Moment sieht das bei mir so aus:

XAMPP mit MySQL 5.5.27 installiert und Datenbank erstellt.
Datenbank teilweise mit phpMyAdmin mit Daten gefüllt.

Lazarus 1.0.8 installiert
Projekt mit Hauptformular und DatenModul erstellt:
- im Hauptformular DBEdit Komponenten, ein DBGrid und ein DBNavigator
- im DatenModul MySQL55Connection > SQLTransaction > SQLQuery > Datasource
- in SQLQuery "SELECT * FROM `tabellenname`" eingetragen

Ich kann nun in der Entwicklungsumgebung sowie zur Laufzeit die Daten der MySQL Datenbank sehen und während der Laufzeit auch mit dem DBNavigator darin scrollen. Kann aber keine Veränderungen vornehmen.
Mache ich da irgendwo einen grundsätzlichen Fehler in der Anordnung?

Und ein zweites Problem ist, wenn ich versuche Felder des Typ INT zu editieren, erscheint die Meldung:
"SQLQuery:FieldID is requiered, but not supplied.
Muss ich da den Text aus dem DBEdit Feld erst un einen String umwandeln?

Ich habe mal mit Delphi 6 eine Datenbank erstellt, die auf eine Access Datei zugegriffen hat. Da hat das alles sehr gut funktioniert. Hat Lazarus denn die selben Möglichkeiten wie Delphi 6 Prof wenn es um Datenbanken geht oder muss man da sehr viel mehr Wissen mitbringen?

Gruss Matze

knight
Beiträge: 802
Registriert: Mi 13. Sep 2006, 22:30

Re: Bei welchem Ereigniss ruft man Commit auf?

Beitrag von knight »

Mit SELECT holst du Daten aus der Datenbank. Um Daten in eine Datenbank zu schreiben benötigst du andere Befehle (z.B. INSERT). Das ist unabhängig von der verwendeten Entwicklungsumgebung.

knight

hde
Beiträge: 556
Registriert: Mi 11. Aug 2010, 02:56

Re: Bei welchem Ereigniss ruft man Commit auf?

Beitrag von hde »

knight hat geschrieben:Mit SELECT holst du Daten aus der Datenbank. Um Daten in eine Datenbank zu schreiben benötigst du andere Befehle (z.B. INSERT). Das ist unabhängig von der verwendeten Entwicklungsumgebung.
das ist korrekt, aber wenn man in Delphi einen einfachen select über Query mit RequestLive=true hat und einen DB-Navigator nutzt wird ein notwendiger insert oder update automatisch generiert.
Geht grundsätzlich bei Lazarus genau so gut, aber ich setze ausschließlich ZEOS unter Lazarus (und Delphi) ein.
hde

gocher
Beiträge: 298
Registriert: Di 23. Nov 2010, 23:41
OS, Lazarus, FPC: Ubuntu/Win, Lazarus trunk, FPC trunk
CPU-Target: 32Bit/64Bit
Wohnort: Geldern
Kontaktdaten:

Re: Bei welchem Ereigniss ruft man Commit auf?

Beitrag von gocher »

Ich nutze diese Komponenten nicht aber ich würde die TSqlTransaction nicht nutzen, denn sonst muss der DBNavigator den Commit ausführen, nach dem Updaten der Daten. Wenn Du keine TSqlTransaction nutzt brauchst Du kein Commit und Update sollte der DBNavigator eigentlich schon standardmäßig mitbringen.
MfG Gocher
akt. Projekt: Webserver(HTTPS HTTP/2) mit integrierten CMS in Free Pascal - www.gocher.me

Matze
Beiträge: 32
Registriert: Di 11. Jun 2013, 17:11

Re: Bei welchem Ereigniss ruft man Commit auf?

Beitrag von Matze »

Danke für die Antworten.

Das man mit SELECT nur Daten anzeigen kann ist mir schon klar. Ich dachte nur eine SELECT Abfrage muss in der Query Komponente stehen, um in der Entwicklungsumgebung überhaupt Daten sehen zu können. Zur Laufzeit kann ich dann ja alle möglichen SQL Abfragen zuweisen, also auch INSERT. Nur dachte ich, dass der DBNavigator soetwas standardmässig erledigt.

Habe ich das jetzt richtig verstanden, ich benötige die TSqlTransaction Komponente gar nicht? Also einfach so:

DatenModul: MySQL55Connection --> SQLQuery --> Datasource
Hauptformular: DBNavigator, DBEdit, DBGrid

Matze

gocher
Beiträge: 298
Registriert: Di 23. Nov 2010, 23:41
OS, Lazarus, FPC: Ubuntu/Win, Lazarus trunk, FPC trunk
CPU-Target: 32Bit/64Bit
Wohnort: Geldern
Kontaktdaten:

Re: Bei welchem Ereigniss ruft man Commit auf?

Beitrag von gocher »

Also ich gehe davon aus das es so wie früher bei Delphi ist:
  • Dbf1.TableName := 'beispiel.db'; //TDbf
  • DataSource1.DataSet := Dbf1; //TDataSource
  • DBNavigator1.DataSource := DataSource1; //TDBNavigator
  • DBEdit1.DataSource := DataSource1;//TDBEdit
  • DBEdit1.DataField := 'TestFeld';
  • DBGrid1.DataSource := DataSource1; //TDBGrid
  • DBGrid1.Columns.item[0].FieldName := 'TestFeld';
Außerdem hat der TDBNavigator Events in den kannst Du Verarbeitungsschritte einklinken, aktuellere Erfahrungen habe ich nicht anzubieten, ich nutze wie bereits gesagt diese Komponenten nicht.
Mit Zeos sollte das auch gehen, da nimmst Du halt:
  • ZConnection1. ...; //TZConnection, Definition deiner Datenbank Verbindung
  • ZTable1.TableName := 'beispiel'; //TZTable
  • ZTable1.Connection := ZConnection1;
  • DataSource1.DataSet := ZTable1;
Transaktionen sind zumindest nicht bei allen Datenbanken erforderlich, es kann sein das einige Komponenten nur so funktionieren, beim Zugriff auf MySql nutze ich keine Transaktionen, aber ich nutze auch nicht die erwähnten Komponenten.
Zuletzt geändert von gocher am Mi 12. Jun 2013, 15:42, insgesamt 3-mal geändert.
MfG Gocher
akt. Projekt: Webserver(HTTPS HTTP/2) mit integrierten CMS in Free Pascal - www.gocher.me

hde
Beiträge: 556
Registriert: Mi 11. Aug 2010, 02:56

Re: Bei welchem Ereigniss ruft man Commit auf?

Beitrag von hde »

Matze hat geschrieben:Habe ich das jetzt richtig verstanden,
offenbar nicht so ganz :cry:

knight
Beiträge: 802
Registriert: Mi 13. Sep 2006, 22:30

Re: Bei welchem Ereigniss ruft man Commit auf?

Beitrag von knight »

hde hat geschrieben: das ist korrekt, aber wenn man in Delphi einen einfachen select über Query mit RequestLive=true hat und einen DB-Navigator nutzt wird ein notwendiger insert oder update automatisch generiert.
hde
Das kann funktionieren, muss es aber nicht, so daß ich grundsätzlich davon abraten würde.

knight

gocher
Beiträge: 298
Registriert: Di 23. Nov 2010, 23:41
OS, Lazarus, FPC: Ubuntu/Win, Lazarus trunk, FPC trunk
CPU-Target: 32Bit/64Bit
Wohnort: Geldern
Kontaktdaten:

Re: Bei welchem Ereigniss ruft man Commit auf?

Beitrag von gocher »

hde hat geschrieben: das ist korrekt, aber wenn man in Delphi einen einfachen select über Query mit RequestLive=true hat und einen DB-Navigator nutzt wird ein notwendiger insert oder update automatisch generiert.
hde
Ein solches Vorgehen würde ich wenn überhaupt nur für Desktop-Datenbanken anwenden, konkurrierende Zugriffe und so... ! Deshalb mein Beispiel mit einer Desktop-Datenbank!!!!
MfG Gocher
akt. Projekt: Webserver(HTTPS HTTP/2) mit integrierten CMS in Free Pascal - www.gocher.me

Matze
Beiträge: 32
Registriert: Di 11. Jun 2013, 17:11

Re: Bei welchem Ereigniss ruft man Commit auf?

Beitrag von Matze »

Also ich lasse jetzt den DBNavigator ganz weg und versuche einfach die SQL Befehle zur Laufzeit über die Query zuzuweisen. Mal sehen, ist ja nicht schlecht mehrere Möglichkeiten auszuprobieren. Die ZEOS Komponenten habe ich nicht installiert. Aber fast jeder schreibt, dass er die benutzt. Sind die soviel besser als die Lazarus Komponenten?

hde
Beiträge: 556
Registriert: Mi 11. Aug 2010, 02:56

Re: Bei welchem Ereigniss ruft man Commit auf?

Beitrag von hde »

Matze hat geschrieben:Also ich lasse jetzt den DBNavigator ganz weg
warum denn das? Wenn man weiß was man tut und was er macht ist er praktisch und gut
Matze hat geschrieben:Die ZEOS Komponenten habe ich nicht installiert. Aber fast jeder schreibt, dass er die benutzt. Sind die soviel besser als die Lazarus Komponenten?
sie sind flexibler und dank des Einsatzes von EgonHugeist professioneller und sicherer (Nochmals Dank an dich, Michael)
gocher hat geschrieben:Ein solches Vorgehen würde ich wenn überhaupt nur für Desktop-Datenbanken anwenden, konkurrierende Zugriffe und so... !
auch dabei kann man Satzsperren einbauen, falls nötig
hde

Matze
Beiträge: 32
Registriert: Di 11. Jun 2013, 17:11

Re: Bei welchem Ereigniss ruft man Commit auf?

Beitrag von Matze »

So nun geht gar nichts mehr. Ich habe ein update von Lazarus 1.0.8 auf 1.0.10 gemacht. Wenn ich nun die Eigenschaft Connected der MySQL55Connection auf True setze kommt die Meldung: Can not load default MySQL library ("libmysql.dll" or "libmysql.dll)
Das war nach der Installation der Version 1.0.8 auch so. Aber da habe ich die Datei libmysql.dll ins Projektverzeichnis kopiert und es lief. Geht jetzt aber nicht.
Sollte ich dazu lieber ein neues Thema aufmachen?

hde
Beiträge: 556
Registriert: Mi 11. Aug 2010, 02:56

Re: Bei welchem Ereigniss ruft man Commit auf?

Beitrag von hde »

Ich kann nur nochmals sagen: nimm Zeos, da kannst du angeben wo die DLL liegt.
hde

Matze
Beiträge: 32
Registriert: Di 11. Jun 2013, 17:11

Re: Bei welchem Ereigniss ruft man Commit auf?

Beitrag von Matze »

Der Fehler "Can not load default MySQL library ("libmysql.dll" or "libmysql.dll)" ist nun weg.
Ich habe beim update von Lazarus 1.0.8 auf 1.0.10 die 64 bit Version installiert statt der 32 bit Version.
Nun kann Lazarus wieder auf die Daten zugreifen.
Ich kann nur nochmals sagen: nimm Zeos, da kannst du angeben wo die DLL liegt.
hde
Würde ich ja, aber ich kann das ZEOS nicht benutzen weil ich nicht weiss wie man diesen SVN Client installiert bzw. wie man richtig damit umgeht.

Matze
Beiträge: 32
Registriert: Di 11. Jun 2013, 17:11

Re: Bei welchem Ereigniss ruft man Commit auf?

Beitrag von Matze »

So jetzt geht auch das schreiben in die DB :D
Diese beiden Zeilen müssen ausgeführt werden:
SQLQuery.ApplyUpdates;
SQLTransaction.Commit;

Dann werden die Änderungen dauerhaft übernommen und den DBNavigator kann ich auch benutzen.
Matze

Antworten