Autor |
Beitrag |
ub60
      
Beiträge: 764
Erhaltene Danke: 127
|
Verfasst: Fr 30.11.07 18:07
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
Hält's aus hier
Beiträge: 9
|
Verfasst: 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 
      
Beiträge: 764
Erhaltene Danke: 127
|
Verfasst: 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
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
Hält's aus hier
Beiträge: 9
|
Verfasst: 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: www.dsdt.info/tutori...zeosfirebird/?page=5
|
|
jasocul
      
Beiträge: 6393
Erhaltene Danke: 147
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: 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 
      
Beiträge: 764
Erhaltene Danke: 127
|
Verfasst: 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
      
Beiträge: 6393
Erhaltene Danke: 147
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: Mi 05.12.07 11:17
Wo ist Dein StartTransaction? Ich denke, dass ist erforderlich, wenn Du ohne AutoCommit arbeitest.
|
|
ub60 
      
Beiträge: 764
Erhaltene Danke: 127
|
Verfasst: 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
      
Beiträge: 6393
Erhaltene Danke: 147
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: 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 
      
Beiträge: 764
Erhaltene Danke: 127
|
Verfasst: 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
|
|
|