Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi MS Access, ADO: Einfuegen mehrerer Datensaetze (https://www.delphipraxis.net/114222-ms-access-ado-einfuegen-mehrerer-datensaetze.html)

Eidechsenlord 21. Mai 2008 16:37

Datenbank: MS Access • Version: 2000 • Zugriff über: TADOConnection

MS Access, ADO: Einfuegen mehrerer Datensaetze
 
Hallo,
es gibt die DB db.mdb (MS Access 2000), auf die ich ueber eine TADOConnection zugreife. Alles Prima. Der Schlauch, auf dem ich nun zu stehen komme, ist folgender:
Ich moechte mehrere Datensaetze auf einmal in eine Tabelle einfuegen, aber
Delphi-Quellcode:
 AdoCommand.Execute('INSERT INTO TestTable (IntCol, StrCol) VALUES (1, '''a''')');
laeszt mich immer nur einen Datensatz hinzufuegen. Ne Schleife drueber zu bauen geht natuerlich, dauert aber ganz schoen lange.
Auch sowas wie
Delphi-Quellcode:
for i := 1 to n do
  ADOTable.AppendRecord([1, 'a']);
end;
friszt ganz schoen Zeit.
Wie geht das?

VorschuszDank & Grusz,
Berni

marabu 21. Mai 2008 18:53

Re: MS Access, ADO: Einfuegen mehrerer Datensaetze
 
Herzlich willkommen in der Delphi-PRAXiS, Berni.

Deine einzige Chance mit JET SQL eine Massen-Einfügung hinzukriegen scheint mir INSERT INTO ... SELECT zu sein.

Wie liegen denn die einzufügenden Daten vor?

Beim satzweisen Einfügen können verknüpfte datensensitive Controls vorübergehend deaktiviert werden um das Einfügen mit Append/Post deutlich zu beschleunigen.

Freundliche Grüße

Bernhard Geyer 22. Mai 2008 08:21

Re: MS Access, ADO: Einfuegen mehrerer Datensaetze
 
Perparet parametrisierte INSERT-Anweisungen sollte auch bei MS Access verbesserungen bringen.

Eidechsenlord 22. Mai 2008 08:38

Re: MS Access, ADO: Einfuegen mehrerer Datensaetze
 
Hallo,

Zitat:

Zitat von marabu
Deine einzige Chance mit JET SQL eine Massen-Einfügung hinzukriegen scheint mir INSERT INTO ... SELECT zu sein.

Also quasi aus einer Tabelle in eine andere zu kopieren?

Zitat:

Zitat von marabu
Wie liegen denn die einzufügenden Daten vor?

Als Array(s), falls das die Frage beantwortet ...

Zitat:

Zitat von marabu
Beim satzweisen Einfügen können verknüpfte datensensitive Controls vorübergehend deaktiviert werden um das Einfügen mit Append/Post deutlich zu beschleunigen.

Wie meinst du das?

Dank & Grusz,
Berni

mkinzler 22. Mai 2008 10:50

Re: MS Access, ADO: Einfuegen mehrerer Datensaetze
 
Zitat:

Wie meinst du das?
Es kostet Zeit diese mit jedem Wert zu aktualisieren

marabu 22. Mai 2008 11:04

Re: MS Access, ADO: Einfuegen mehrerer Datensaetze
 
Hallo Berni,

zum Thema JET SQL und Bulk Input müsstest du selbst ein wenig recherchieren, aber wahrscheinlich flutscht es bereits so:

Delphi-Quellcode:
const
  SHSTR: String[11] = 'ShortString';

type
  TItem = array of TVarRec;

var
  items: array of TItem;

procedure TDemoForm.ButtonClick(Sender: TObject);
var
  i: Integer;
  item: TItem;
begin
{
  SetLength(items, 2);
  for i := Low(items) to High(items) do
  begin
    SetLength(item, 2);
    item[0].VType := vtInteger;
    item[0].VInteger := Random(10);
    item[1].VString := @SHSTR;
    items[i] := item;
  end;
}
  with ADODataSet do
  try
    DisableControls;
    for i := Low(items) to High(items) do
      InsertRecord(items[i]);
  finally
    EnableControls;
  end;
end;
Getippt und nicht getestet.

Freundliche Grüße

Eidechsenlord 22. Mai 2008 11:11

Re: MS Access, ADO: Einfuegen mehrerer Datensaetze
 
Hallo,
Zitat:

Zitat von mkinzler
Zitat:

Wie meinst du das?
Es kostet Zeit diese mit jedem Wert zu aktualisieren

Richtig, sorry.
Derartige Controls gibt es in diesem Fall nicht. Es geht hier um das Speichern verschiedener Einstellungen (identifiziert durch einen Integer) als String.
Haue ich jede Einstellung einzeln mittels
Delphi-Quellcode:
ADOConnection.Execute
oder
Delphi-Quellcode:
ADOTable.AppendRecord
in die DB, dauert's halt leider 'n Stueck.

Dank & Grusz,
Berni

Eidechsenlord 22. Mai 2008 13:35

Re: MS Access, ADO: Einfuegen mehrerer Datensaetze
 
Hallo,

Zitat:

Zitat von marabu
zum Thema JET SQL und Bulk Input müsstest du selbst ein wenig recherchieren, aber wahrscheinlich flutscht es bereits so:
Delphi-Quellcode:
    for i := Low(items) to High(items) do
      InsertRecord(items[i]);
Getippt und nicht getestet.

Abgetippt und getestet: Leider nicht. Hier wird ja wieder jeder Record einzeln (zwar in ner Schleife, aber dennoch) rangehaengt. Das dauert bei 200 Datensaetzen gefuehlte 2 Sekunden.
Dann werd ich wohl ein Lock-Flag setzen und das Fuellen der DB in nen Thread auslagern ...
M$ schlaegt bzgl JET SQL "INSERT INTO ... SELECT FROM ..." vor, aber ich kriegs leider grad auch nicht gebacken, eine Standalone-Tabelle im Speicher zu erzeugen, die ich vllt. schneller fuellen kann und aus der ich dann die Records rueberkopiere ...

Auf jeden Fall danke fuer Eure Muehen,

Berni

HiWieGehts 22. Mai 2008 15:34

Re: MS Access, ADO: Einfuegen mehrerer Datensaetze
 
Hallo,

2 Überlegungen zu deinem Problem:
1. woher kommen die Daten - wer schreibt diese in das Array? Ist es nicht möglich die Datensätze statt in das Array gleich in die DB zu schreiben? Dann fällt es ev. nicht auf, dass das Schreiben der Daten langsam ist.
2. wenn das nicht geht, probier die Daten zunächst in ein Clientdataset und von diesem in die Access-DB zu schreiben (ev. Provider oder so). Ich weiß nicht, ob das was bringt aber einen Versuch ist es Wert.

LG, HiWieGehts


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:32 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