Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Schnelles schreiben in Access DB (https://www.delphipraxis.net/142322-schnelles-schreiben-access-db.html)

R2009 26. Okt 2009 10:02

Datenbank: MSaccess • Version: 2003 • Zugriff über: ADO

Schnelles schreiben in Access DB
 
Hi,

ich nutze eine ADOconnection die zu einer Access Testdatenbank verbunden ist.
Normal eingestellt: Read/Write.
An die Connection ist eine ADOtable angeflanscht.

Delphi-Quellcode:
  For n:=1 to 1000 do
    begin
      ADOTable1.Append;
      ADOTable1.FieldByName('Nummer').AsInteger:=n;
      ADOTable1.Post;
    end;
Wenn ich diesen Programmteil laufen lasse dauert es mehr als 6 Sekunden bis dieser Teil abgeschlossen ist. Bei 10000 dauerts 1:07
Hab den post auch schon aus der For Schleife rausgezogen es hat sich nichts geändert.
Gibt es (ausser BDE und DBexpress) noch andere Möglichkeiten?
Fremdkomponenten kommen nicht in Frage (kosten Geld).
Mach ich sonst irgendetwas falsch?

Grüsse
rainer

mkinzler 26. Okt 2009 10:03

Re: Schnelles schreiben in Access DB
 
Versuch mal
Delphi-Quellcode:
For n:=1 to 1000 do
    begin
      ADOTable1.Append;
      ADOTable1.FieldByName('Nummer').Value:=n;
    end;
ADOTable1.Post;

Bernhard Geyer 26. Okt 2009 10:05

Re: Schnelles schreiben in Access DB
 
Welche Curserlocation verwendest du?
Bei Access ist clUseServer angesagt.

R2009 26. Okt 2009 10:06

Re: Schnelles schreiben in Access DB
 
Hi mkinzler,

ich will ja nix sagen, aber:
Zitat:

Hab den post auch schon aus der For Schleife rausgezogen es hat sich nichts geändert.
Nutzt nichts.
Ich kann leider auch nicht von Access weg.

Grüsse
rainer

R2009 26. Okt 2009 10:08

Re: Schnelles schreiben in Access DB
 
Hi,
ich nutze: clUseClient
ich probiers aus.

Grüsse
Rainer

R2009 26. Okt 2009 10:13

Re: Schnelles schreiben in Access DB
 
Hi,
hab bei Tadoconnection und bei Tadotable cursorlocation auf clUseServer gesetzt,
jetzt funktioniert das!

In der Delphi Hilfe steht:
Zitat:

Mit CursorLocation können Sie festlegen, ob eine clientseitige oder eine serverseitige Cursor-Bibliothek verwendet wird. Der Wert wirkt sich aber nur auf Verbindungen aus, die nach der Zuweisung geöffnet werden. Der Standardwert ist clUseClient.

Ein Client-Cursor bietet mehr Flexibilität. Die gesamten Daten werden auf den lokalen Rechner abgerufen und hier bearbeitet. Dadurch können Aktionen durchgeführt werden (z. B. spezielle Sortier- und Filteroperationen), die vom Server möglicherweise nicht unterstützt werden. Da die SQL-Anweisungen auf dem Server ausgeführt werden, wird beim Einschränken der Ergebnismenge durch eine WHERE-Klausel nur eine Teilmenge der Daten an den lokalen Cursor übertragen.

Ein serverseitiger Cursor ist nicht so flexibel, kann aber bei sehr großen Ergebnismengen vorteilhaft (oder sogar notwendig) sein. Er muss verwendet werden, wenn die Größe der Ergebnismenge den verfügbaren Festplattenspeicher des Client-Systems überschreitet. Viele Server unterstützen außerdem nur Vorwärts-Cursor, bei denen der Satzzeiger in der Ergebnismenge nicht in Richtung Tabellenanfang bewegt werden kann.
So ganz versteh ich das nicht. Die Datenbank liegt doch hier auf meinem Rechner.
Kann mir das jemand mit kurzen Worten erklären!

Grüsse
Rainer

Bernhard Geyer 26. Okt 2009 10:45

Re: Schnelles schreiben in Access DB
 
Du hast mit Access ein Desktop-DB. Die Logik läuft alles in deinem Adressraum und die Daten liegen auch schon so vor das ein Clientseitiger Curser nur unnötige Speicherkopieraktionen bewirkt.

R2009 26. Okt 2009 11:12

Re: Schnelles schreiben in Access DB
 
Hi,
sorry aber ist mir immer noch zu lahm. Ich habe jetzt für einen Durchsatz von 100000 Integerzahlen einen Zeitbedarf von 57sec d.h.
der Rechner braucht 0,6 msec / Datensatz. Das kann doch nicht der Weisheit letzter Schluss sein. Wenn ich den post verlagere braucht er sogar noch länger.
Kann ich den Datenbankinhalt irgendwie im Speicher halten, sodass wenigstens die Plattenzugriffe reduziert werden?

Grüsse
Rainer

Bernhard Geyer 26. Okt 2009 11:20

Re: Schnelles schreiben in Access DB
 
Du könntest versuchen mit INSERTS-Statements direkt arbeiten. Diese dann prepared Anlegen und u.U. mehrere Inserts in einem Statement laufen lassen. Ob das jedoch bei Access viel bringt?

Wenn schau mal ob nicht evtl. ein Virenscanner die MDB-Dateien permanent checkt.

R2009 26. Okt 2009 11:36

Re: Schnelles schreiben in Access DB
 
Oh Mann,
unser Mcafee. Das könnte sein!

Danke Bernhard

Grüsse
Rainer


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