Entwickler-Ecke
Datenbanken - ZEOS MySQL - Problem mit Insert
ub60 - Fr 30.11.07 18:07
Titel: ZEOS MySQL - Problem mit Insert
Hallo Leute,
ich hab mir heute eine aktuelle Version der ZEOSLib installiert und folgendes probiert:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| begin ZConnection1.Connect; ZQuery1.SQL.Clear; ZQuery1.SQL.Add('CREATE TABLE schueler '); ZQuery1.SQL.Add('(Name VARCHAR(40), '); ZQuery1.SQL.Add( 'IDSchueler INTEGER, '); ZQuery1.SQL.Add( 'Klasse SMALLINT); '); ZQuery1.ExecSQL; ZQuery1.Close; ZConnection1.Disconnect; end; |
Das funktioniert wie gewünscht. Folgendes funktioniert aber nicht, obwohl es eigentlich "genau so" aussieht:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| begin ZConnection1.Connect; ZReadOnlyQuery1.SQL.Clear; ZReadOnlyQuery1.SQL.Add('INSERT INTO `schueler` '); ZReadOnlyQuery1.SQL.Add('(`Name`, `IDSchueler`, `Klasse`) '); ZReadOnlyQuery1.SQL.Add('VALUES '); ZReadOnlyQuery1.SQL.Add('(''Rudi'', ''100'', ''11'');'); ZReadOnlyQuery1.ExecSQL; ZReadOnlyQuery1.Close; ZConnection1.Disconnect; end; |
Mein Problem: keine Fehlermeldung, aber auch kein Datensatz in der Tabelle.
Statt der doppelten Hochkommas hab ich auch noch andere Sachen probiert.
Statt ZReadOnlyQuery1 hab ich auch ZQuery1 benutzt. Läuft beide male ohne Fehlermeldung, bringt aber kein Ergebnis in die Tabelle.
Hat jemand eine Idee, was ich falsch mache? Oder einen funktionierenden Code, wie ich mit INSERT Daten übergeben kann.
Mit InsertRecord usw. will ich es momentan nicht machen.
ub60
kuerbis2 - Di 04.12.07 18:47
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| begin ... ZReadOnlyQuery1.SQL.Add('INSERT INTO `schueler` '); ZReadOnlyQuery1.SQL.Add('(`Name`, `IDSchueler`, `Klasse`) '); ZReadOnlyQuery1.SQL.Add('VALUES '); ZReadOnlyQuery1.SQL.Add('(''Rudi'', ''100'', ''11'');'); ... |
1. Ist es Absicht, das Du dafür ein READONLY-Query nimmst?
2. das: ZReadOnlyQuery1.SQL.Add('(''Rudi'', ''100'', ''11'');');
ergibt: ('Rudi','100','11');
Deine Tabelle ist aber mit Integer & SMALLINT definiert
2. schreibtechnisch finde ich so so übersichtlicher:
Delphi-Quelltext
1: 2: 3: 4:
| ... ZQuery1.SQL.Add('INSERT INTO `schueler` (`Name`,`IDSchueler`,`Klasse`) VALUES '); ZQuery1.SQL.Add('("Rudi",100,11); '); |
das hat zusätzlich den Vorteil, das 'ne Schleife auch gut leserlich wird:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| ... ZQuery1.SQL.Add('INSERT INTO `schueler` (`Name`,`IDSchueler`,`Klasse`) VALUES '); nI := 1; while nI < nAnzahlSchueler do begin ZQuery1.SQL.Add('("'+cStrSchuelerName[nI]+'",'+IntToStr(nSchuelerID[nI])+','+IntToStr(nKlasse[nI])+')'); if nI < (nAnzahlSchueler-1) then ZQuery1.SQL.Add(','); end; ZQuery1.SQL.Add(';'); ZQuery1.SQLExec; ... |
hoffe, es hilft,
wenn ich diese blöden SQL-Hochkomma-Probleme habe, dann nehme ich immer MySQL-Admin (oder ein anderes SQL-Tool), mache eine Dummy-Datensatz und kupfer das SQL-Statement ab.
Gruss, Kuerbis2
ub60 - Di 04.12.07 21:33
Als erstes mal vielen Dank für die Anteilnahme. Das hat mich nochmal angeregt, nach meinem Fehler zu suchen.
Alle Deine Verbesserungen/Änderungen funktionierten bei mir auch nicht, deshalb hab ich nochmal alles überprüft.
Mein Fehler war:
Ich hatte
AutoCommit auf
False gesetzt. Dabei funktioniert zwar CREATE TABLE, aber kein INSERT INTO.
Da dieser Fehler ja mein Problem ausgelöst hat, mache ich mal keinen neuen Thread auf, sondern frage hier:
Kann mir jemand sagen, warum das so ist?
kuerbis2 hat folgendes geschrieben: |
1. Ist es Absicht, das Du dafür ein READONLY-Query nimmst?
|
Das war nur ein Akt der Verzweiflung, nachdem ZQuery nicht funktioniert hat :wink:
kuerbis2 hat folgendes geschrieben: |
2. das: ZReadOnlyQuery1.SQL.Add('(''Rudi'', ''100'', ''11'');');
ergibt: ('Rudi','100','11');
Deine Tabelle ist aber mit Integer & SMALLINT definiert
|
Da hast Du zwar recht, aber die Variante mit den Hochkommas funktioniert normalerweise auch.
Danke nochmal.
ub60
kuerbis2 - Mi 05.12.07 09:25
Das
Autocommit kann's eigentlich nicht sein, habe ich eben mal mit und mal ohne ausprobiert.
das braucht man nur, wenn man mit
ZQuery1.CachedUpdate :=
true arbeitet
Ich hatte gestern noch den Verdacht, das es evtl. an den Rechten liegt, dass ist auch immer ein beliebter Fehler von mir....
aber ich habe da nochmal etwas herrausgesucht:
Zitat: |
TZConnection
Die Komponente TZConnection ist die Kombination aus einer BDE-TDatabase ähnlichen Komponente und einer Komponente, die eine Transaktion steuert. Diese Kombination macht Sinn, denn Zugriffe auf Firebird Datenbanken werden immer im sog. Kontext einer laufenden Transaktion durchgeführt. In der ZEOS Library wird eine solche Transaktion beim Öffnen einer Verbindung (Methode Connect von TZConnection) zu einer Datenbank gestartet. Das bewirkt, dass jeder Datenbankzugriff automatisch im Kontext eben dieser Transaktion stattfindet. Dabei ist der sog. AutoCommit-Modus standardmäßig angeschaltet (True), was auch das Standardverhalten der BDE-Komponenten ist. Bei aktiviertem AutoCommit wird jedes einzelne SQL-Statement nach erfolgreicher Ausführung durch COMMIT bestätigt und die Änderungen in der Datenbank festgeschrieben. Soll dieses Verhalten ausgeschaltet werden und somit eine explizite Transaktion gestartet werden, in der man mehrere Datenbankzugriffe nacheinander durchführt, um diese als "Gruppe" durch COMMIT zu bestätigen, so muss die Methode StartTransaction aufgerufen werden. AutoCommit ist während einer expliziten Transaktion ausgeschaltet. Mit dem Aufruf der Methode Commit werden die Änderungen, die durch die Zugriffe in dieser Transaktion durchgeführt wurden, bestätigt. Der Aufruf der Methode Rollback macht diese Änderungen rückgängig. In beiden Fällen ist AutoCommit nach Methodenaufruf wieder eingeschaltet. Die explizite Transaktion ist beendet. |
zu finden hier:
http://www.dsdt.info/tutorials/zeosfirebird/?page=5
jasocul - Mi 05.12.07 09:43
kuerbis2 hat folgendes geschrieben: |
Das Autocommit kann's eigentlich nicht sein, habe ich eben mal mit und mal ohne ausprobiert. |
Ich arbeite zwar nicht mit den ZEOS-Komponenten, aber imho das kann sehr wohl sein. Ich denke, dass es dort noch eine Einstellung gibt, was mit den Daten bei einem Disconnect (in ZConnection?) passiert. Wenn dann Rollback eingestellt ist, werden die Daten nicht gespeichert.
ub60 - Mi 05.12.07 11:12
kuerbis2 hat folgendes geschrieben: |
Das Autocommit kann's eigentlich nicht sein, habe ich eben mal mit und mal ohne ausprobiert.
|
Ich habe es auch mehrfach probiert. Bei mir geht mit ausgeschaltetem AutoCommit gar nichts. Auch ein, wie in der Hilfe beschriebenes, anschließendes Commit hat nichts gebracht.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| ZConnection1.Connect; ZConnection1.AutoCommit:=False; ZQuery1.SQL.Clear; ZQuery1.SQL.Add('INSERT INTO ...'); ZQuery1.ExecSQL; ZQuery1.Close; ZConnection1.Commit; ZConnection1.Disconnect; |
Der angegebene Quelltext sollte laut Beschreibung funktionieren (??). Er geht aber nur, wenn ich AutoCommit in der zweiten Zeile auf True setze oder (was mir ganz merkwürdig erscheint) in der vorletzten Zeile wieder auf true setzte (Kommentarstriche entfernen).
Kann das jemand erklären?
ub60
jasocul - Mi 05.12.07 11:17
Wo ist Dein StartTransaction? Ich denke, dass ist erforderlich, wenn Du ohne AutoCommit arbeitest.
ub60 - Mi 05.12.07 11:23
jasocul hat folgendes geschrieben: |
Wo ist Dein StartTransaction? Ich denke, dass ist erforderlich, wenn Du ohne AutoCommit arbeitest. |
StartTransaction wird bei AutoCommit:=False automatisch aufgerufen (vermute ich). Wenn ich es dann manuell aufrufe, kommt nämlich eine Fehlermeldung, dass dies ein unerlaubter Befehl innerhalb einer Transaktion sei.
ub60
jasocul - Mi 05.12.07 11:34
Ich habe jetzt mal kurz die Doku zu ZEOS überflogen.
Du musst die entsprechenden vor dem Connect machen. Etwa so:
Delphi-Quelltext
1: 2: 3:
| ZConnection1.AutoCommit:=False; ZConnection1.Connect; ZConnection1.StartTransaction; |
Nach jedem Commit (oder Rollback) startet dann automatisch eine neue Transaktion, bis es zum Disconnect kommt.
Ich hoffe, dass ich das richtig gelesen habe.
ub60 - Mi 05.12.07 17:07
jasocul hat folgendes geschrieben: |
Ich habe jetzt mal kurz die Doku zu ZEOS überflogen.
Du musst die entsprechenden vor dem Connect machen. Etwa so:
Delphi-Quelltext 1: 2: 3:
| ZConnection1.AutoCommit:=False; ZConnection1.Connect; ZConnection1.StartTransaction; |
Nach jedem Commit (oder Rollback) startet dann automatisch eine neue Transaktion, bis es zum Disconnect kommt.
Ich hoffe, dass ich das richtig gelesen habe. |
Stimmt leider nur teilweise (siehe meinen letzten Beitrag).StartTransaction bringt eine Fehlermeldung.
Damit die ganze Sache so funktioniert, wie gewünscht, muss die Tabelle vom Typ
MyISAM sein.
Problem gelöst!
Danke für die Anregungen.
ub60
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!