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