Thema: MySql und XE5

Einzelnen Beitrag anzeigen

nahpets
(Gast)

n/a Beiträge
 
#3

AW: MySql und XE5

  Alt 18. Dez 2016, 13: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