![]() |
Datenbank: Access • Version: XP • Zugriff über: ADO
Access und ADO:Count DB-Einträge und Return des Ergebnisses
Hi@ all
ich möchte in einer Access - Tabelle die Einträge zählen. Dazu gehe ich wie folgt vor.
Delphi-Quellcode:
Wie bekomm ich jetzt die Rückgabe, also das Ergebnis von Count?
Q := TADOQuery.Create(Self);
Q.Connection := ADOConnection1; Q.SQL.Add('SELECT COUNT(*) FROM Verwaltung'); Q.ExecSQL; Gruß Karsten |
Re: Access und ADO:Count DB-Einträge und Return des Ergebnis
Delphi-Quellcode:
Q := TADOQuery.Create(nil);
try Q.Connection := ADOConnection1; Q.SQL.Text := 'SELECT COUNT(*) AS Anzahl FROM Verwaltung'; // nicht .Add() sondern .Text := Q.Open; // Alternative 1 Result := Q.Fields[0].AsInteger; // Alternative 2 Result := Q.FieldByName('Anzahl').AsInteger; finally Q.Free; end; |
Re: Access und ADO:Count DB-Einträge und Return des Ergebnis
Warum nimmst Du nicht:
Delphi-Quellcode:
Hinweis
Q := TTable.create(self);
Q.Connection := ADOConnection1; Count := Q.RecordCount; Q.Free; Die angegebene Anzahl der Datensätze kann kleiner sein als die Gesamtzahl der Datensätze in der Tabelle. Dies ist der Fall, wenn die abgerufenen Datensätze eine bedingte Teilmenge der Tabelle sind. Ich kann mir einfach nicht merken, ob die Tabelle offen oder geschlossen sein muss... mfg Frank :coder: |
Re: Access und ADO:Count DB-Einträge und Return des Ergebnis
Werde ich mal ausprobieren.
Besten Dank Erst mal |
Re: Access und ADO:Count DB-Einträge und Return des Ergebnis
@Mavarik: Dein Vorschlag hat leider eine sehr schlechte Performance.
Stell dir vor, die Tabelle hat sehr viele Felder und 50000 Datensätze. TTable (müsste eigentlich TADOTable sein) würde nun diese ganzen Datensätze abrufen obwohl die einzig benötigte Information die Anzahl der Datensätze ist. Bei wenigen Datensätzen fällt das Problem nicht auf; aber später in der Praxis wird die Datenbank immer grösser und irgendwann muss man Minutenlang auf ein Ergebniss warten :-( |
Re: Access und ADO:Count DB-Einträge und Return des Ergebnis
Das kann niemals so sein...
OK Muss natürlich TADOTable sein! Aber die ADOTable holt nicht alle Datensätze um die Anzahl zu ermitteln...! Frank :coder: |
Re: Access und ADO:Count DB-Einträge und Return des Ergebnis
Zitat:
Bei clUseServer werden Datensätze nur auf Anfrage des Clients geliefert. Die Belastung mit den vielen Daten wird somit nur dem Server untergeschoben. Der Ms SQL Server hat so unter Umständen schwer zu kämpfen, denn die Abfrage wird eben serverseitig ausgeführt. Die Jet-Engine (Access) ist ein Sonderfall, da Server und Client der gleiche Rechner ist. Bei clUseClient findet eine bremsende Doppelpufferung statt. Nichtsdestotrotz bewirkt ein Aufruf von TADOTable.RecordCount in der Jet-Engine ein "Full Table Scan", während "SELECT Count(*) FROM ..." um ein mehrfaches Effizienter ausgeführt wird. |
Re: Access und ADO:Count DB-Einträge und Return des Ergebnis
Ach ja und die ADOTable muss offen sein!
Bei mir benötigen 200.000 Aufrufe auf 2 verschidene Datenbanken... Einmal 120.000 Datensätze und einmal 70.800 Datensätze ca. 77 Millisekunden! Xeon 2,6 GHz Frank :coder: |
Re: Access und ADO:Count DB-Einträge und Return des Ergebnis
Zitat:
Ebenso muss die Datenbank frisch geöffnet worden sein, denn wenn die Daten mal im RAM (Cache) sind, geht alles viel schneller. |
Re: Access und ADO:Count DB-Einträge und Return des Ergebnis
Nee, isser wirklich nicht.
Wie wurde denn getestet? Etwa so?
Delphi-Quellcode:
Da Recordcount nur bei einer geöffneten Tabelle funktioniert, muss ja wohl logischerweise die Tabelle irgendwie geöffnet sein. Ergo muss man das mitberücksichtigen, ausgenommen, Du willst wissen, wie viele Records deine geöffnete Tabelle hat, dann natürlich nicht. Is ja logisch.
...
ADOTabel1.open; T := GetTickCount; For i:=1 to 20000000 do v := ADOTable1.RecordCount; ShowMessage (Format('Wow, wie schnell: %d ticks', [GetTickCount - t])); ... Wenn ich das mit Access mache (13.000 Records), ist das Verhältnis zwischen Recordcount und 'select count (*)' etwa 2:1, der Aufruf via Recordcount dauert also etwa doppelt so lange. Dabei hatte ich zum Testen die Tabelle vorher geöffnet, insofern war sie schon im Cache. Bei einem SQL-Server sieht die Sache irgendwie ein klein wenig anders aus: 100:1 (Recordcount ggü. Select count (*)) bei serverseitigem und 10:1 bei clientseitigem Cursor. Is ja auch logisch, weil der Server im anderen Zimmer steht. Das sind 5 Meter + Wand (Beton). Das dauert :mrgreen: . |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:45 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 by Thomas Breitkreuz