AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

MySql und XE5

Ein Thema von juelin · begonnen am 18. Dez 2016 · letzter Beitrag vom 18. Dez 2016
Antwort Antwort
juelin

Registriert seit: 9. Mai 2006
Ort: Mannheim
142 Beiträge
 
Delphi XE5 Professional
 
#1

MySql und XE5

  Alt 18. Dez 2016, 12:17
Datenbank: MySql • Version: 5.6.24 • Zugriff über: XE5
leider muß ich jetzt zum 3. mal posten, weil man mein Problem nicht versteht.
Ich habe jetzt extra ein Demoprogramm erstellt.
Ich benutze für den Datenbankzugriff DBExpress Komponeten SQLConnect, SQLDataSet und SQLQuery.
Im Programm wird 2 mal die Routine 'Laden' (in FormActivate) aufgerufen.
Der 1. Durchlauf funktioniert einwandfrei.
Beim 2. Durchlauf bekomme ich beim 1. Insert die Fehlermeldung "Systaxfehler in SQL-Syntax"
was natürlich nicht stimmen kann.
Anhänge anbei.
Wenn ich die For-Schleife in der Procedure Laden von 9000 auf 1 setzte, dann läuft alles ok.
Bin völlig hilflos.
Hat jemand das Problem schon ,al gehabt?
Für Hilfe wäre ich dankbar.
Gruß
Jürgen
Ihr dürft mich auch gerne anschreiben: juergen.linder@gmx.de
oder anrufen +49 (0)621 103461

Fehlermeldung:
---------------------------
Demo
---------------------------
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''0''' at line 1.
---------------------------
OK
---------------------------
Miniaturansicht angehängter Grafiken
datenbank.jpg  
Angehängte Dateien
Dateityp: rar Demo.rar (4,09 MB, 9x aufgerufen)
Jürgen Linder

Geändert von juelin (18. Dez 2016 um 21:41 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von blawen
blawen

Registriert seit: 1. Dez 2003
Ort: Luterbach (CH)
679 Beiträge
 
Delphi 12 Athens
 
#2

AW: MySql und XE5

  Alt 18. Dez 2016, 12:25
Bitte lade das komplette Demo-Projet hoch.
Dies macht die Fehler-Analyse einfacher.
Roland
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#3

AW: MySql und XE5

  Alt 18. Dez 2016, 14:11
Da ich gerade keine passende Delphiversion zum Testen habe, mach' bitte mal folgende Änderungen:

Überall, wo ExecSQL vorkommt:
Delphi-Quellcode:
try
  h2 := Form1.SQLDataSet1.ExecSQL(True); // bzw. False
except
  on e : Exception do begin
    JaNein := messagedlg(Form1.SQLDataSet1.CommandText + #13#13 + Format('h1 = %d, h2 = %d',[h1,h2]) + #13#13 + e.Message, mtError, [mbOk], 0);
        close;
  end;
end;
Stell' uns bitte die vollständige Fehlermeldung zur Verfügung, kannst Du per Strg+C und Strg+V hier im Editor einfügen, Screenshot muss daher nicht unbedingt sein.

Dieses Konstrukt finde ich nicht besonders gut, da der Typ der Spalten bekannt ist und sich im Laufe des Programmes nicht ändert, würd' ich statt
Delphi-Quellcode:
Form1.SQLDataSet1.ParamByName('Feld1').DataType:=ftInteger;
Form1.SQLDataSet1.ParamByName('Feld1').Value:=h1;
lieber dashier machen:
Delphi-Quellcode:
Form1.SQLDataSet1.ParamByName('Feld1').AsInteger := h1;
// bzw.
Form1.SQLDataSet1.ParamByName('Feld1').AsString := '';
Falls das zu keinen neuen Erkenntnissen führt, mal folgende Änderung machen:
Delphi-Quellcode:
Const
  csSQL = 'INSERT INTO Demo (Feld1, Feld2, Feld3, Feld4, Feld5, Feld6, Feld7, Feld8, Feld9) VALUES (%d, %d, %s, %s, %d, %d, %s, %s, %d)';
...
  // Statt der Parameterbefüllung
  Form1.SQLDataSet1.CommandText := Format(csSQL,[h1,0,QuotedStr('*'),QuotedStr('*'),0,0,QuotedStr('*'),QuotedStr('*'),0]);
  try
    h2:=Form1.SQLDataSet1.ExecSQL(False);
...
Sollte der Fehler dann verschwinden, wissen wir zumindest, dass er im Parameterumfeld zu suchen sein sollte.

Eventuell hilft aber auch ein
Delphi-Quellcode:
Form1.SQLDataSet1.Params.Clear;
Form1.SQLDataSet1.CommandText:='INSERT INTO Demo (Feld1, Feld2, Feld3, Feld4, Feld5, Feld6, Feld7, Feld8, Feld9) VALUES (:Feld1, :Feld2, :Feld3, :Feld4, :Feld5, :Feld6, :Feld7, :Feld8, :Feld9)';
Wobei in der Schleife 1 bis 9000 eigentlich das Befüllen der Parameter ausreichen sollte und CommandText nicht jeweils neu zugewiesen werden muss.

Ungefähr so:
Delphi-Quellcode:
  Form1.SQLDataSet1.CommandText:='INSERT INTO Demo (Feld1, Feld2, Feld3, Feld4, Feld5, Feld6, Feld7, Feld8, Feld9) VALUES (:Feld1, :Feld2, :Feld3, :Feld4, :Feld5, :Feld6, :Feld7, :Feld8, :Feld9)';
  Form1.SQLDataSet1.Prepared:=True;
  for h1:=1 to 9000 do
  begin
    if h2 = 1 then
    begin
      Form1.SQLDataSet1.ParamByName('Feld1').AsInteger:=h1;
      ...
      h2:=Form1.SQLDataSet1.ExecSQL(False);
      if h2 <> 1 then
      begin
        JaNein:=messagedlg('Fehler beim Anlegen Demo', mtError, [mbOk], 0);
        close;
      end;
    end;
  end;
  Form1.SQLDataSet1.Prepared:=False;
(Alles nur hingedaddelt und ungetestet.)
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#4

AW: MySql und XE5

  Alt 18. Dez 2016, 16:31
Ich hasse diese Fehlermeldung: Sie haben eine Fehler in der Nähe von
Code:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''0''' at line 1.
Da kommt irgendwerwiewowas durcheinander. Eine der Nullen bekommt noch ein ' geschenkt. Die Fehlermeldung enthält vor der 0 zwei ' und dahinter sind drei '.

Um festzustellen, welche 0 das ist, ändere bitte die Zuweisung:
Delphi-Quellcode:
      Form1.SQLDataSet1.ParamByName('Feld1').DataType:=ftInteger;
      Form1.SQLDataSet1.ParamByName('Feld1').Value:=h1;
      Form1.SQLDataSet1.ParamByName('Feld2').DataType:=ftInteger;
      Form1.SQLDataSet1.ParamByName('Feld2').Value:=h1 * 10000 + 2;
      Form1.SQLDataSet1.ParamByName('Feld3').DataType:=ftString;
      Form1.SQLDataSet1.ParamByName('Feld3').Value:='';
      Form1.SQLDataSet1.ParamByName('Feld4').DataType:=ftString;
      Form1.SQLDataSet1.ParamByName('Feld4').Value:='';
      Form1.SQLDataSet1.ParamByName('Feld5').DataType:=ftInteger;
      Form1.SQLDataSet1.ParamByName('Feld5').Value:=h1 * 10000 + 5;
      Form1.SQLDataSet1.ParamByName('Feld6').DataType:=ftInteger;
      Form1.SQLDataSet1.ParamByName('Feld6').Value:=h1 * 10000 + 6;
      Form1.SQLDataSet1.ParamByName('Feld7').DataType:=ftString;
      Form1.SQLDataSet1.ParamByName('Feld7').Value:='';
      Form1.SQLDataSet1.ParamByName('Feld8').DataType:=ftString;
      Form1.SQLDataSet1.ParamByName('Feld8').Value:='';
      Form1.SQLDataSet1.ParamByName('Feld9').DataType:=ftInteger;
      Form1.SQLDataSet1.ParamByName('Feld9').Value:=h1 * 10000 + 9;
Beim ersten (dem einzelnen) Insert gibst Du halt entsprechend die Werte 2, 5, 6 bzw. 9 statt der 0 an, dann können wir sehen, welche 0 zum Syntaxfehler führt. So ist das leider eher weihnachtliches Spekulatius.

Meiner Meinung nach bleibt jetzt nix anderes übrig, als die von mir vorgeschlagenen Änderungen einzeln durchzuprobieren. Anfangen würd' ich mit
Delphi-Quellcode:
Form1.SQLDataSet1.ParamByName('Feld1').AsInteger := h1;
// bzw.
Form1.SQLDataSet1.ParamByName('Feld1').AsString := '';
Value ist (soweit ich weiß) ein Variant und da kann es sein, dass was falsch interpretiert wird.
In Bezug auf Typsicherheit scheint mir die Methode mit .AsString, .AsInteger die sicherere zu sein.

Mach aber bitte auf jeden Fall vor die Zuweisung auf CommandText noch ein Form1.SQLDataSet1.Params.Clear; Eventuell wird dort (intern) was nicht richtig aufgeräumt.

Um das zu prüfen, könntest Du mal hinter der Zuweisung auf CommandText Form1.SQLDataSet1.Params.Count; ausgeben lassen. Wenn da was anderes als 9 rauskommt, liegt dort das Problem.

Bitte schau auch mal in diesen Thread Kleiner Geschwindigkeitstest von Insert.

Da werden unterschiedliche Varianten zur Ausführung von Inserts durchprobiert.
Eventuell kannst Du Dein Problem ja durch Umstellung der Befehle beheben oder zumindest genauer eingrenzen.

Z. B. CommandText-Zuweisung und Prepared := True bzw. False außerhalb der Schleife und in der Schleife nur noch die Wertezuweisung an die Parameter.
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#5

AW: MySql und XE5

  Alt 18. Dez 2016, 22:34
Einen hätt' ich da noch:

Wenn die Schleife quasi von 1 bis 9 läuft, aber bei 10 dann ein Problem macht, liegt die Vermutung nahe, dass hier ein Typproblem vorliegen könnte.

Eventuell mal folgende Änderung probieren:
Delphi-Quellcode:
Form1.SQLDataSet1.ParamByName('Feld1').DataType:=ftInteger;
Form1.SQLDataSet1.ParamByName('Feld1').Value:=1;
Form1.SQLDataSet1.ParamByName('Feld2').DataType:=ftInteger;
Form1.SQLDataSet1.ParamByName('Feld2').Value:=2;
Form1.SQLDataSet1.ParamByName('Feld3').DataType:=ftString;
Form1.SQLDataSet1.ParamByName('Feld3').Value:=Format('h1 = %d',[h1]);
Form1.SQLDataSet1.ParamByName('Feld4').DataType:=ftString;
Form1.SQLDataSet1.ParamByName('Feld4').Value:='4';
Form1.SQLDataSet1.ParamByName('Feld5').DataType:=ftInteger;
Form1.SQLDataSet1.ParamByName('Feld5').Value:=5;
Form1.SQLDataSet1.ParamByName('Feld6').DataType:=ftInteger;
Form1.SQLDataSet1.ParamByName('Feld6').Value:=6;
Form1.SQLDataSet1.ParamByName('Feld7').DataType:=ftString;
Form1.SQLDataSet1.ParamByName('Feld7').Value:='7';
Form1.SQLDataSet1.ParamByName('Feld8').DataType:=ftString;
Form1.SQLDataSet1.ParamByName('Feld8').Value:='8';
Form1.SQLDataSet1.ParamByName('Feld9').DataType:=ftInteger;
Form1.SQLDataSet1.ParamByName('Feld9').Value:=9;
Und bitte auf jeden Fall auch diese Variante testen:
Delphi-Quellcode:
Form1.SQLDataSet1.ParamByName('Feld1').AsInteger:=1;
Form1.SQLDataSet1.ParamByName('Feld2').AsInteger:=2;
Form1.SQLDataSet1.ParamByName('Feld3').AsString:=Format('h1 = %d',[h1]);
Form1.SQLDataSet1.ParamByName('Feld4').AsString:='4';
Form1.SQLDataSet1.ParamByName('Feld5').AsInteger:=5;
Form1.SQLDataSet1.ParamByName('Feld6').AsInteger:=6;
Form1.SQLDataSet1.ParamByName('Feld7').AsString:='7';
Form1.SQLDataSet1.ParamByName('Feld8').AsString:='8';
Form1.SQLDataSet1.ParamByName('Feld9').AsInteger:=9;
Sollte der Fehler dann immer noch da sein, bitte den aktuellen Quelltext der Methode Laden hier posten, dann muss da nochmal jemand anders drüber schauen, mir fehlen da die Ideen.

Wie lautet nach diesen Änderungen die "aktuelle" Fehlermeldung?
  Mit Zitat antworten Zitat
Antwort Antwort

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:06 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz