Einzelnen Beitrag anzeigen

Benutzerbild von Piro
Piro

Registriert seit: 14. Jul 2003
Ort: Flintbek
810 Beiträge
 
Delphi XE2 Professional
 
#1

Massendaten ständig aktualisieren

  Alt 4. Dez 2010, 22:22
Datenbank: MS SQL Express • Version: 2005 • Zugriff über: ADO
Moin zusammen,

in einem anderen Thread, den ich eröffnet habe, habe ich gelernt, dass ein INSERT besser und vorallem schneller als ein Append ist.

Jetzt habe ich aber ca. 100.000 Datensätze schon in der Datenbank, welche jeden Tag aktualisiert werden(hinzufügen oder ändern).

Für ein reines Hinzufügen verwende ich ein TADOCommand mit Prepared und Parameter. Geht verdammt schnell. Will ich nicht drauf verzichten.

Meine Situation:
1. Lese Daten aus einer Textdatei (ca. 100.000)
2. Abgleich gegen die bestehenden Daten -> wenn verhanden aktualisieren, wenn nicht hinzufügen

Folgenden Code habe ich bis jetzt.
Delphi-Quellcode:
...
if FileExists(filename) = True then
begin
  AssignFile(F, filename);
  Reset(F);

  SQLCommand_INSERT.CommandText := 'INSERT Into hostliste_data (ktr, znr, motor, snr, quelle, importdatum) ' +
                                                       'VALUES (:p0, :p1, :p2, :p3, :p4, :p5);';
  SQLCommand_INSERT.Prepared;

  while not EoF(F) do
  begin
    Readln(F, zeile);
    sl_zeile := Split(zeile,';', True);

    DSData.Close;
    DSData.CommandText := 'select * from hostliste_data where ktr = '+QuotedStr(sl_zeile[0])+' and ' +
                                                             'znr = '+QuotedStr(sl_zeile[1])+' and ' +
                                                             'snr = '+QuotedStr(sl_zeile[3])+' and ' +
                                                             'quelle = '+ QuotedStr(quelle);
    DSData.Open;
    id := DSData.FieldByName('id').AsString;

    if id <> 'then
    begin
      SQLCommand_UPDATE.CommandText := 'UPDATE hostliste_data ' +
                                         'SET ktr = '+QuotedStr(sl_zeile[0])+','+
                                             'znr = '+QuotedStr(sl_zeile[1])+', '+
                                         ...
                                       'WHERE id = ' + QuotedStr(id);
      SQLCommand_UPDATE.Prepared;
      SQLCommand_UPDATE.Execute;
    end
    else
    begin
      SQLCommand_INSERT.Parameters[0].Value := sl_zeile[0];
      SQLCommand_INSERT.Parameters[1].Value := sl_zeile[1];
      ...
      SQLCommand_INSERT.Execute;
    end;
end;
    ...
Das Update Befehl wird in diesem Fall ja ständig neu geparst im Gegenteil zum Insert. Ich bekomme die Daten für den Abgleich erst aus der Schleife, um die Datei zeilenweise zu lesen.
Kann ich mir eventuell das Query sparen und mit dem DSData (TADODataSet) weiter arbeiten im EditModus?

Für Idee, Vorschläge oder Verbesserungen wäre ich dankbar.
Vielen Dank im Voraus.
Sven

Geändert von Piro ( 4. Dez 2010 um 22:51 Uhr)
  Mit Zitat antworten Zitat