AGB  ·  Datenschutz  ·  Impressum  







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

Insert Optimierung

Ein Thema von Franzelchen · begonnen am 2. Mär 2012 · letzter Beitrag vom 4. Mär 2012
Antwort Antwort
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.378 Beiträge
 
Delphi 12 Athens
 
#1

AW: Insert Optimierung

  Alt 3. Mär 2012, 14:08
Du überschreibst ja auch immer wieder die Werte komplett, es gilt also immer nur die letzte Zuweiseung.

Fällt aber bestimmt auf, wen man mal nachsieht/debuggt, was für eine Query letzendlich ausgeführt wird.
Delphi-Quellcode:
ZQuery1.SQL.Text :=
    'INSERT INTO dat12006 (Begriff, Frage) VALUES(:v1, :v2);'#10
  + 'INSERT INTO dat12006 (Begriff, Frage) VALUES(:v3, :v4);'#10
  + 'INSERT INTO dat12006 (Begriff, Frage) VALUES(:v7, :v6);'#10
  + 'INSERT INTO dat12006 (Begriff, Frage) VALUES(:v7, :v8);'#10
  + 'INSERT INTO dat12006 (Begriff, Frage) VALUES(:v9, :v10);';

ZQuery1.SQL.Clear;
ZQuery1.SQL.Add('INSERT INTO dat12006 (Begriff, Frage) VALUES(:v1, :v2);';
ZQuery1.SQL.Add('INSERT INTO dat12006 (Begriff, Frage) VALUES(:v3, :v4);';
ZQuery1.SQL.Add('INSERT INTO dat12006 (Begriff, Frage) VALUES(:v7, :v6);';
ZQuery1.SQL.Add('INSERT INTO dat12006 (Begriff, Frage) VALUES(:v7, :v8);';
ZQuery1.SQL.Add('INSERT INTO dat12006 (Begriff, Frage) VALUES(:v9, :v10);';

with ZQuery1.SQL do begin
  Clear;
  Add('INSERT INTO dat12006 (Begriff, Frage) VALUES(:v1, :v2);';
  Add('INSERT INTO dat12006 (Begriff, Frage) VALUES(:v3, :v4);';
  Add('INSERT INTO dat12006 (Begriff, Frage) VALUES(:v7, :v6);';
  Add('INSERT INTO dat12006 (Begriff, Frage) VALUES(:v7, :v8);';
  Add('INSERT INTO dat12006 (Begriff, Frage) VALUES(:v9, :v10);';
end;
(die letzen beiden Queries lassen sich auch sehrt schön automatisch generieren)
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.876 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Insert Optimierung

  Alt 3. Mär 2012, 14:10
Wobei eine parametrisierte Anweisung schneller sein sollte als eine Skript mit der wiederholten Anweisung.

Bulk-Insert könnte man auch mit Hilfe einer externen Tabelle (Textdatei) versuchen.
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.378 Beiträge
 
Delphi 12 Athens
 
#3

AW: Insert Optimierung

  Alt 3. Mär 2012, 14:48
Man kann es kaum glauben, aber Programmieren hat tatsächlich etwas mit Mathematik zu tun.
Und wie schonmal erwähnt, fehlt noch der Rest.

Delphi-Quellcode:
procedure TForm1.InputDataset3Click(Sender: TObject);
const
  Anzahl = 30;
var
  StartZeit, StopZeit: TDateTime;
  i, i2: Integer;
begin
  StartZeit := Now;
  Screen.Cursor := crHourGlass;
  ZConnection.Database := 'c:\msql\firedb.fdb';

  ZQuery1.SQL.Clear;
  for i2 := 0 to Anzahl - 1 do
    ZQuery1.SQL.Add(Format('INSERT INTO dat12006 (Begriff, Frage) VALUES (:v%d, :v%d);', [i2 * 2, i2 * 2 + 1]));

  for i := 0 to SG1.RowCount div Anzahl - 1 do begin
    for i2 := 0 to Anzahl - 1 do begin
      ZQuery1.Params[i2 * 2 + 0].Value := SG1.Cells[0, i * Anzahl + i2];
      ZQuery1.Params[i2 * 2 + 1].Value := SG1.Cells[1, i * Anzahl + i2];
    end;
    ZQuery1.ExecSQL;
  end;

  //ZQuery1.SQL.Text := 'INSERT INTO dat12006 (Begriff, Frage) VALUES (:v0, :v1);';
  //for i := SG1.RowCount div Anzahl * Anzahl to SG1.RowCount - 1 do begin
  // ZQuery1.Params[0].Value := SG1.Cells[0, i];
  // ZQuery1.Params[1].Value := SG1.Cells[1, i];
  // ZQuery1.ExecSQL;
  //end;

  if SG1.RowCount mod Anzahl > 0 then begin
    ZQuery1.SQL.Clear;
    for i2 := 0 to SG1.RowCount mod Anzahl - 1 do
      ZQuery1.SQL.Add(Format('INSERT INTO dat12006 (Begriff, Frage) VALUES (:v%d, :v%d);', [i2 * 2, i2 * 2 + 1]));

    i := SG1.RowCount div Anzahl;
    for i2 := 0 to SG1.RowCount mod Anzahl - 1 do begin
      ZQuery1.Params[i2 * 2 + 0].Value := SG1.Cells[0, i * Anzahl + i2];
      ZQuery1.Params[i2 * 2 + 1].Value := SG1.Cells[1, i * Anzahl + i2];
    end;
    ZQuery1.ExecSQL;
  end;

  Screen.Cursor := crDefault;
  StopZeit := Now;
  Panel1.Caption :='SuchZeit : ' + FormatDateTime('nn:ss:zzz', StopZeit - StartZeit) ;
end;
PS: Mit einer ordentlichen Einrückung braucht man kaum noch kommentare, um die Zusammenhänge zu erkennen. (wie z.B. wozu das END gehört)
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu ( 3. Mär 2012 um 14:54 Uhr)
  Mit Zitat antworten Zitat
Franzelchen

Registriert seit: 22. Mär 2007
82 Beiträge
 
#4

AW: Insert Optimierung

  Alt 3. Mär 2012, 16:51
@ himitsu

Ich bedanke mich erst einmal für deine Hilfe, leider liefert die Einspielung deines Quelltextes folgende Fehlermeldung:
Code:
---------------------------
Benachrichtigung über Debugger-Exception
---------------------------
Im Projekt Project2.exe ist eine Exception der Klasse EZSQLException aufgetreten. Meldung: 'SQL Error: Dynamic SQL Error SQL error code = -104 Token unknown - line 1, column 54 INSERT. Error Code: -104. Invalid token The SQL: INSERT INTO dat12006 (Begriff, Frage) VALUES (?, ?); INSERT INTO dat12006 (Begriff, Frage) VALUES (?, ?); INSERT INTO dat12006 (Begriff, Frage) VALUES (?, ?); INSERT INTO dat12006 (Begriff, Frage) VALUES (?, ?); INSERT INTO dat12006 (Begriff, Frage) VALUES (?, ?); INSERT INTO dat12006 (Begriff, Frage) VALUES (?, ?); INSERT INTO dat12006 (Begriff, Frage) VALUES (?, ?); INSERT INTO dat12006 (Begriff, Frage) VALUES (?, ?); INSERT INTO dat12006 (Begriff, Frage) VALUES (?, ?); INSERT INTO dat12006 (Begriff, Frage) VALUES (?, ?); INSERT INTO dat12006 (Begriff, Frage) VALUES (?, ?); INSERT INTO dat12006 (Begriff, Frage) VALUES (?, ?); INSERT INTO dat12006 (Begriff, Frage) VALUES (?, ?); INSERT INTO dat12006 (Begriff, Frage) VALUES (?, ?); INSERT INTO dat12006 (Begriff, Frage) VALUES (?, ?); INSERT INTO dat12006 (Begriff, Frage) VALUES (?, ?); INSERT INTO dat12006 (Begriff, Frage) VALUES (?, ?); INSERT INTO dat12006 (Begriff, Frage) VALUES (?, ?); INSERT INTO dat12006 (Begriff, Frage) VALUES (?, ?); INSERT INTO dat12006 (Begriff, Frage) VALUES (?, ?); INSERT INTO dat12006 (Begriff, Frage) VALUES (?, ?); INSERT INTO dat12006 (Begriff, Frage) VALUES (?, ?); INSERT INTO dat12006 (Begriff, Frage) VALUES (?, ?); INSERT INTO dat12006 (Begriff, Frage) VALUES (?, ?); INSERT INTO dat12006 (Begriff, Frage) VALUES (?, ?); INSERT INTO dat12006 (Begriff, Frage) VALUES (?, ?); INSERT INTO dat12006 (Begriff, Frage) VALUES (?, ?); INSERT INTO dat12006 (Begriff, Frage) VALUES (?, ?); INSERT INTO dat12006 (Begriff, Frage) VALUES (?, ?); INSERT INTO dat12006 (Begriff, Frage) VALUES (?, ?);; '. Prozeß wurde angehalten. Mit Einzelne Anweisung oder Start fortsetzen.
---------------------------
OK  Hilfe  
---------------------------
Spalte 54 weist auf
Code:
VALUES (:v%d, :v%d);'
hin. Ich habe viel zuwenig Ahnung von SQL um mit Sicherheit sagen zu können, daß es an dem fehlenden Parameter v liegt ??
Code:
ZQuery1.Params[i2 * 2 + 0].Value := SG1.Cells[0, i * Anzahl + i2];
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.378 Beiträge
 
Delphi 12 Athens
 
#5

AW: Insert Optimierung

  Alt 3. Mär 2012, 16:58
An V vollte es nicht liegen.
Man kann entweder über den Namen den Wert eines Parameters setzen,
oder über den Index. (der erste Parameter im Statemant hat den Index 0)

Das ist also alles das Selbe, nur das nach einem Index nicht erst gesucht werden muß:
Delphi-Quellcode:
SQLQuery1.Params[0].Value
SQLQuery1.Params.Items[0].Value
SQLQuery1.Params.ParamByName('Name des ersten Parameters').Value
SQLQuery1.Params.ParamValues['Name des ersten Parameters']
ExecSQL sollte doch mehrere SQL-Statements verarbeiten können?


Mal aus Interesse:
Was passiert denn bei Anzahl = 1; ?
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu ( 3. Mär 2012 um 17:04 Uhr)
  Mit Zitat antworten Zitat
Franzelchen

Registriert seit: 22. Mär 2007
82 Beiträge
 
#6

AW: Insert Optimierung

  Alt 3. Mär 2012, 17:17
Bei Anzahl 30 werden 30 Insertbefehle in einem Rutsch ausgeführt (siehe Fehlermeldung 30x insert). Bei Anzahl 1 demzufolge nur 1 Insert.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.378 Beiträge
 
Delphi 12 Athens
 
#7

AW: Insert Optimierung

  Alt 3. Mär 2012, 17:30
Schon klar.

Ich meinte in Bezug auf das Funktionieren, bzw. die Fehlermeldung.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Franzelchen

Registriert seit: 22. Mär 2007
82 Beiträge
 
#8

AW: Insert Optimierung

  Alt 3. Mär 2012, 20:00
Ein TZQuery kann aber nur einfache Statements ausführen und kein Skript. Dafür gibt es TZSqlProcessor
1er Gedanke: Mist
2er Gedanke: gibt's Literatur, Anwendungsbeispiele etc.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.876 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: Insert Optimierung

  Alt 3. Mär 2012, 19:03
Ein TZQuery kann aber nur einfache Statements ausführen und kein Skript. Dafür gibt es TZSqlProcessor
Markus Kinzler
  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 08:22 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz