AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi MS Access, ADO: Einfuegen mehrerer Datensaetze
Thema durchsuchen
Ansicht
Themen-Optionen

MS Access, ADO: Einfuegen mehrerer Datensaetze

Ein Thema von Eidechsenlord · begonnen am 21. Mai 2008 · letzter Beitrag vom 22. Mai 2008
Antwort Antwort
Eidechsenlord

Registriert seit: 18. Feb 2008
6 Beiträge
 
#1

MS Access, ADO: Einfuegen mehrerer Datensaetze

  Alt 21. Mai 2008, 16:37
Datenbank: MS Access • Version: 2000 • Zugriff über: TADOConnection
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
 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
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#2

Re: MS Access, ADO: Einfuegen mehrerer Datensaetze

  Alt 21. Mai 2008, 18:53
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
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.171 Beiträge
 
Delphi 10.4 Sydney
 
#3

Re: MS Access, ADO: Einfuegen mehrerer Datensaetze

  Alt 22. Mai 2008, 08:21
Perparet parametrisierte INSERT-Anweisungen sollte auch bei MS Access verbesserungen bringen.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Eidechsenlord

Registriert seit: 18. Feb 2008
6 Beiträge
 
#4

Re: MS Access, ADO: Einfuegen mehrerer Datensaetze

  Alt 22. Mai 2008, 08:38
Hallo,

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 von marabu:
Wie liegen denn die einzufügenden Daten vor?
Als Array(s), falls das die Frage beantwortet ...

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
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

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

Re: MS Access, ADO: Einfuegen mehrerer Datensaetze

  Alt 22. Mai 2008, 10:50
Zitat:
Wie meinst du das?
Es kostet Zeit diese mit jedem Wert zu aktualisieren
Markus Kinzler
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#6

Re: MS Access, ADO: Einfuegen mehrerer Datensaetze

  Alt 22. Mai 2008, 11:04
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
  Mit Zitat antworten Zitat
Eidechsenlord

Registriert seit: 18. Feb 2008
6 Beiträge
 
#7

Re: MS Access, ADO: Einfuegen mehrerer Datensaetze

  Alt 22. Mai 2008, 11:11
Hallo,
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 ADOConnection.Execute oder ADOTable.AppendRecord in die DB, dauert's halt leider 'n Stueck.

Dank & Grusz,
Berni
  Mit Zitat antworten Zitat
Eidechsenlord

Registriert seit: 18. Feb 2008
6 Beiträge
 
#8

Re: MS Access, ADO: Einfuegen mehrerer Datensaetze

  Alt 22. Mai 2008, 13:35
Hallo,

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
  Mit Zitat antworten Zitat
HiWieGehts

Registriert seit: 19. Aug 2005
101 Beiträge
 
Delphi 10.4 Sydney
 
#9

Re: MS Access, ADO: Einfuegen mehrerer Datensaetze

  Alt 22. Mai 2008, 15:34
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
  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 09:46 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