![]() |
Datenbank: Access • Version: 2000 • Zugriff über: ADO
Zugriff auf Access DB sehr langsam
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 OLEDB:Database Password="";Jet OLEDB:Engine Type=4;Jet OLEDB:Database 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 OLEDB:Don'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 |
Re: Zugriff auf Access DB sehr langsam
Führst du den Code in einem Timer aus?
Hast du schon mal mit einem AdoQuery versucht? |
Re: Zugriff auf Access DB sehr langsam
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. |
Re: Zugriff auf Access DB sehr langsam
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 |
Re: Zugriff auf Access DB sehr langsam
Zitat:
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
SQL-Code:
So müssen beim insert nur die Parameter (Feldwerte) Setzen.
Insert into <Tabelle>(<feldliste>) values ( :feld1, :feld, ...);
|
Re: Zugriff auf Access DB sehr langsam
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:
scheint aber noch der Wurm drin zu sein.
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; (Da ich TADODataSet1 ohne CommandText nicht auf Activ = True setzen kann, hab ichs so versucht, sind ja mehr als 10 Werte/Datensatz) |
Re: Zugriff auf Access DB sehr langsam
Hallo,
nimm eine ADOQuery. Heiko |
Re: Zugriff auf Access DB sehr langsam
So, versuche jetzt mein Glück mit der ADOQuery,...
@mkinzler: Hab ich das richtig Versanden:
SQL-Code:
(Sorry, wegen der vielleicht blöden Frage, kämpfe nur gerade damit irgendwie die Hilfedatei angezeigt zu bekommen)
Insert into <Tabelle1>(<Date>,<Time>,<Wert1>) values ( :now, :now, :now, :(+StrToInt(Textfeld_Wert1)+),...);
Meine Daten werden jetzt schonmal in der Tabelle angezeigt, habe das ADOTable gegen ADOQuery getauscht, und bei der Eigenschaft SQL
SQL-Code:
eigegeben.
select * from Tabelle1
Soweit so gut, wie kann ich jetzt das SQL Statement (Insert...) abschicken? Gruß der_karl *Schonmal einen großen Dank hier lass* |
Re: Zugriff auf Access DB sehr langsam
die <> bezeichneten Platzhalter. Statt der Typen musst du die Feldnamen angeben und satt den werten die Parameternamen:
SQL-Code:
Im Timer brauchst du das staement dann nicht mehr zu setzen, sondern nur die Feldwerte
Insert into Tabelle1( datum, von, bis, ...) values ( :datum, :von, :bis,...)
Delphi-Quellcode:
...
AdoQuery1.Parameters.ParamByName( 'datum').value := ...;
und dann mit
Delphi-Quellcode:
die Abfrage ausführen.
AdoQuery1.ExecSQL;
Wobei du auch standardwerte ( Now) direkt bei der Definition der fFlder angeben kannst. |
Re: Zugriff auf Access DB sehr langsam
Ahh :-D habs verstanden.
Werd ich heut Nachmittag gleich ausprobieren. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:20 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz