AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Access und ADO:Count DB-Einträge und Return des Ergebnisses
Thema durchsuchen
Ansicht
Themen-Optionen

Access und ADO:Count DB-Einträge und Return des Ergebnisses

Ein Thema von K-Asche · begonnen am 2. Mär 2006 · letzter Beitrag vom 2. Mär 2006
Antwort Antwort
K-Asche

Registriert seit: 16. Nov 2005
Ort: Greven
71 Beiträge
 
#1

Access und ADO:Count DB-Einträge und Return des Ergebnisses

  Alt 2. Mär 2006, 09:51
Datenbank: Access • Version: XP • Zugriff über: ADO
Hi@ all

ich möchte in einer Access - Tabelle die Einträge zählen.
Dazu gehe ich wie folgt vor.
Delphi-Quellcode:
Q := TADOQuery.Create(Self);
  Q.Connection := ADOConnection1;
  Q.SQL.Add('SELECT COUNT(*) FROM Verwaltung');
  Q.ExecSQL;
Wie bekomm ich jetzt die Rückgabe, also das Ergebnis von Count?

Gruß
Karsten
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#2

Re: Access und ADO:Count DB-Einträge und Return des Ergebnis

  Alt 2. Mär 2006, 10:01
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;
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.130 Beiträge
 
Delphi 10.3 Rio
 
#3

Re: Access und ADO:Count DB-Einträge und Return des Ergebnis

  Alt 2. Mär 2006, 10:05
Warum nimmst Du nicht:

Delphi-Quellcode:
 Q := TTable.create(self);
 Q.Connection := ADOConnection1;
 Count := Q.RecordCount;
 Q.Free;
Hinweis

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
  Mit Zitat antworten Zitat
K-Asche

Registriert seit: 16. Nov 2005
Ort: Greven
71 Beiträge
 
#4

Re: Access und ADO:Count DB-Einträge und Return des Ergebnis

  Alt 2. Mär 2006, 10:06
Werde ich mal ausprobieren.
Besten Dank Erst mal
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#5

Re: Access und ADO:Count DB-Einträge und Return des Ergebnis

  Alt 2. Mär 2006, 10:11
@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
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.130 Beiträge
 
Delphi 10.3 Rio
 
#6

Re: Access und ADO:Count DB-Einträge und Return des Ergebnis

  Alt 2. Mär 2006, 10:29
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
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#7

Re: Access und ADO:Count DB-Einträge und Return des Ergebnis

  Alt 2. Mär 2006, 10:41
Zitat von Mavarik:
Aber die ADOTable holt nicht alle Datensätze um die Anzahl zu ermitteln...!
Das hängt bei ADO von der CursorLocation ab. Bei clUseClient werden alle Datensätze zum Client transportiert.
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.
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.130 Beiträge
 
Delphi 10.3 Rio
 
#8

Re: Access und ADO:Count DB-Einträge und Return des Ergebnis

  Alt 2. Mär 2006, 10:42
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
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#9

Re: Access und ADO:Count DB-Einträge und Return des Ergebnis

  Alt 2. Mär 2006, 10:53
Zitat von Mavarik:
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!
Das wäre aber kein fairer Vergleich. Die Zeit zum Öffnen der ADOTable muss natürlich eingerechnet werden.
Ebenso muss die Datenbank frisch geöffnet worden sein, denn wenn die Daten mal im RAM (Cache) sind,
geht alles viel schneller.
Andreas
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#10

Re: Access und ADO:Count DB-Einträge und Return des Ergebnis

  Alt 2. Mär 2006, 12:03
Nee, isser wirklich nicht.

Wie wurde denn getestet? Etwa so?
Delphi-Quellcode:
...
  ADOTabel1.open;
  T := GetTickCount;
  For i:=1 to 20000000 do v := ADOTable1.RecordCount;
  ShowMessage (Format('Wow, wie schnell: %d ticks', [GetTickCount - t]));
...
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.

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 .
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  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 20:20 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