AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Zugriff auf Access DB sehr langsam
Thema durchsuchen
Ansicht
Themen-Optionen

Zugriff auf Access DB sehr langsam

Ein Thema von der_karlheinz · begonnen am 13. Sep 2007 · letzter Beitrag vom 19. Sep 2007
Antwort Antwort
Seite 1 von 2  1 2      
der_karlheinz

Registriert seit: 13. Sep 2007
10 Beiträge
 
#1

Zugriff auf Access DB sehr langsam

  Alt 13. Sep 2007, 21:00
Datenbank: Access • Version: 2000 • Zugriff über: ADO
Hallöchen,

ich habe ein kleines Problem mit meiner Access DB, die an die 50000 Datensätze gesammelt hat.

Wenn ich versuche einen neuen Datensatz anzulegen, hängt das ganze Programm gute 1,5 Minuten,
bis das sich wieder was bewegt.

Mit steigenden Datensätzen, wirds schlimmer, aber 50000 Datensätze sollten doch für eine Datenbank nicht viel sein?

Hier mal mein Code:

Delphi-Quellcode:
procedure TTabelle.Timer1Timer(Sender: TObject);
begin
   DataModule1.ADOtable1.Append;
   DataModule1.ADOtable1.FielValues['Date'] := now;
   DataModule1.ADOtable1.FielValues['Time'] := now;
   DataModule1.ADOtable1.FielValues['TS'] := now;
   DataModule1.ADOtable1.FielValues['Wert1'] := strtoint(SDIAppForm.E_Wert1.Text);
   DataModule1.ADOtable1.FielValues['Wert2'] := strtoint(SDIAppForm.E_Wert2.Text);
   DataModule1.ADOtable1.FielValues['Wert3'] := strtoint(SDIAppForm.E_Wert3.Text);
   DataModule1.ADOtable1.FielValues['Wert4'] := strtoint(SDIAppForm.E_Wert4.Text);
   DataModule1.ADOtable1.FielValues['Wert5'] := strtoint(SDIAppForm.E_Wert5.Text);
   DataModule1.ADOtable1.FielValues['Wert6'] := strtoint(SDIAppForm.E_Wert6.Text);
   DataModule1.ADOtable1.FielValues['Wert7'] := strtoint(SDIAppForm.E_Wert7.Text);
   DataModule1.ADOtable1.FielValues['Wert8'] := strtoint(SDIAppForm.E_Wert8.Text);
   DataModule1.ADOtable1.FielValues['Wert9'] := strtoint(SDIAppForm.E_Wert9.Text);
   DataModule1.ADOtable1.FielValues['Wert10'] := strtoint(SDIAppForm.E_Wert10.Text);
   DataModule1.ADOtable1.Post;
end;

Die Eigenschaften von ADOConnection:
Attributes.xaCommitRetaining = False
Attributes.xaAbortRetaining = False
CommandTimeout = 30
Connected = True

ConnectionString = Provider=Microsoft.Jet.OLEDB.4.0;User ID =Admin;Data Source=C:\Test\db.mdb;Mode=ReadWrite;Extended Properties="";Jet OLEDB:System database="";Jet OLEDB:Registry Path:"";Jet OLEDBatabase Password="";Jet OLEDB:Engine Type=4;Jet OLEDBatabase Locking Mode=0;Jet OLEDB:Global Partial Bulk Ops=2;Jet OLEDB:Global Bulk Transactions=1;Jet OLEDB:New Database Password="";Jet OLEDB:Create System Database=False;Jet OLEDB:Encrypt Database=False;Jet OLEDBon't Copy Locale on Compact=False;Jet OLEDB:Compact Without Replica Repair=False;Jet OLEDB:SFP=FALSE

ConnectionTimout = 15
ConnectOptions = coConnectUnspecified
CursorLocation = clUseClient
DefaultDatabase =
IsolationLevel = ilCursorStability
KeepConnection = True
LoginPromt = False
Mode = cmReadWrite
Name = ADOConnection1
Provider = Microsoft.Jet.OLEDB.4.0
Tag = 0
___________________________________
Die Eigenschaften von DataSource1:

AutoEdit = True
DataSet = ADOTable1
Enabled = True
Name = DataSource1
Tag = 0
___________________________________
Die Eigenschaften von DataSource2:

AutoEdit = False
DataSet = ADOTable2
Enabled = True
Name = DataSource2
Tag = 0
__________________________________
Die Eigenschaften von ADOTable1

Active = True
AutoCalcFields = True
CacheSize = 1
CommandTimeout = 30
Connection = ADOConnection1
ConnectionString =
CursorLocation = clUseClient
CursorType = ctStatic
EnableBCD = True
Filter =
Filtered = False
IndexFieldNames=
IndexName=
LockType = ItOptimistic
MarshalOptions = moMarshalAll
MasterFields=
MasterSource=
MaxRecords=0
Name=ADOTable1
ReadOnly = False
TableDirect = False
TableName=Tabelle1
Tag=0
_______________________________
Die Eigenschaften von ADOTable2 unterscheiden sich von ADOTable1 nur in:

Name=ADOTable2
TableName=Tabelle2


Ich hoffe Ihr könnt mir helfen!

Mit freundlichem Gruß
der_karl
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

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

Re: Zugriff auf Access DB sehr langsam

  Alt 13. Sep 2007, 21:08
Führst du den Code in einem Timer aus?
Hast du schon mal mit einem AdoQuery versucht?
Markus Kinzler
  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: Zugriff auf Access DB sehr langsam

  Alt 13. Sep 2007, 21:22
Für Access: CursorLocation = cUserServer
Ansonsten hast du deine 50.000 Datensätze immer doppelt im Speicher.
Ansonsten solltest du mit INSERT-Statements arbeiten und TADODatasets statt TADOTable sowie nur benötigte Datensätze per Where-Bedingung abfragen.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
der_karlheinz

Registriert seit: 13. Sep 2007
10 Beiträge
 
#4

Re: Zugriff auf Access DB sehr langsam

  Alt 14. Sep 2007, 08:48
Hallo,

@mkinzler:
Ja, alle 3 Minuten wird die Prozedur durch ein OnTimer Ereignis aufgerufen,
da die Werte alle 3 Minuten automatisch in die Datenbank eingefügt werden sollen.
Ist das TADOQuery nicht eigentlich zur Abfrage einer Datenbank?

@Bernhard Geyer
Habe bei TADOConnection und beim TADOTable die Eigenschaft für die CursorLocation geändert, aber leider
wirds auch nicht schneller

Ich werds gleich mal mit TADODatasets versuchen, nur leider bekomm ich in der Hilfe nichts angezeigt (Text kann nicht angezeigt werden).


Mit freundlichem Gruß

der_karl
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

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

Re: Zugriff auf Access DB sehr langsam

  Alt 14. Sep 2007, 09:11
Zitat:
Ist das TADOQuery nicht eigentlich zur Abfrage einer Datenbank?
Nein, man kann damit SQL-Statements absetzen.
Neben SELECT ist auch INSERT + UPDATE möglich. Bei DML-Statements (INSERT, DELETE, UPDATE) ohne das Daten vom zurück an den Client geschrieben werden müssen.
Ich würde hierfür eine parametrisierte Abfrage nehmen

Insert into <Tabelle>(<feldliste>) values ( :feld1, :feld, ...); So müssen beim insert nur die Parameter (Feldwerte) Setzen.
Markus Kinzler
  Mit Zitat antworten Zitat
der_karlheinz

Registriert seit: 13. Sep 2007
10 Beiträge
 
#6

Re: Zugriff auf Access DB sehr langsam

  Alt 14. Sep 2007, 09:14
Hmm, das ganze scheint schon zu hängen, wenn ich die ADOConnection auf True setze,
dann hängt das ganze schon das erste mal,
hab mit TADODataSet mal folgendes probiert:

Delphi-Quellcode:
procedure TTabelle.Timer1Timer(Sender: TObject);
begin
   DataModule1.ADODataSet1.CommandText := 'INSERT INTO Ofen20 (Date) VALUES (' + DateToStr(now) + ')';
   DataModule1.ADODataSet1.Active := true;
   DataModule1.ADODataSet1.Post;
   DataModule1.ADODataSet1.Active := false;
end;
scheint aber noch der Wurm drin zu sein.
(Da ich TADODataSet1 ohne CommandText nicht auf Activ = True setzen kann, hab ichs so versucht,
sind ja mehr als 10 Werte/Datensatz)
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.270 Beiträge
 
Delphi 10.4 Sydney
 
#7

Re: Zugriff auf Access DB sehr langsam

  Alt 14. Sep 2007, 09:20
Hallo,

nimm eine ADOQuery.


Heiko
Heiko
  Mit Zitat antworten Zitat
der_karlheinz

Registriert seit: 13. Sep 2007
10 Beiträge
 
#8

Re: Zugriff auf Access DB sehr langsam

  Alt 14. Sep 2007, 09:22
So, versuche jetzt mein Glück mit der ADOQuery,...

@mkinzler:

Hab ich das richtig Versanden:

Insert into <Tabelle1>(<Date>,<Time>,<Wert1>) values ( :now, :now, :now, :(+StrToInt(Textfeld_Wert1)+),...); (Sorry, wegen der vielleicht blöden Frage, kämpfe nur gerade damit irgendwie die Hilfedatei angezeigt zu bekommen)

Meine Daten werden jetzt schonmal in der Tabelle angezeigt,
habe das ADOTable gegen ADOQuery getauscht, und bei der Eigenschaft SQL

select * from Tabelle1 eigegeben.

Soweit so gut, wie kann ich jetzt das SQL Statement (Insert...) abschicken?

Gruß
der_karl

*Schonmal einen großen Dank hier lass*
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

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

Re: Zugriff auf Access DB sehr langsam

  Alt 14. Sep 2007, 09:30
die <> bezeichneten Platzhalter. Statt der Typen musst du die Feldnamen angeben und satt den werten die Parameternamen:

Insert into Tabelle1( datum, von, bis, ...) values ( :datum, :von, :bis,...) Im Timer brauchst du das staement dann nicht mehr zu setzen, sondern nur die Feldwerte

AdoQuery1.Parameters.ParamByName( 'datum').value := ...; ...

und dann mit AdoQuery1.ExecSQL; die Abfrage ausführen.

Wobei du auch standardwerte ( Now) direkt bei der Definition der fFlder angeben kannst.
Markus Kinzler
  Mit Zitat antworten Zitat
der_karlheinz

Registriert seit: 13. Sep 2007
10 Beiträge
 
#10

Re: Zugriff auf Access DB sehr langsam

  Alt 14. Sep 2007, 09:38
Ahh habs verstanden.

Werd ich heut Nachmittag gleich ausprobieren.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 06:37 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