Hallo,
irgendwie hab' ich den Eindruck, dass es hier im Kreis geht.
Ein ClientDataSet holt sich einmal die Daten aus der Datenbank und hält sie lokal vor. Ihm ist es sch...egal, was für ein Index auf der Datenbank liegt und wenn dort 50 Indizes sind, ist ihm das auch egal. Er verwaltet die Daten auf dem Client (wie sein Name sagt).
Wird ein Index benutzt, so muss der auf dem Client zuerst einmal erstellt werden, das passiert dann, wenn er das erste mal benutzt wird (was ja weiter oben durch die Beschreibung der Verhaltensweise des Programmes/ClientDataSets bestätigt wurde).
Zitat von
Delphi 7-Hilfe:
TClientDataSet
Beschreibung
Das Objekt TClientDataSet repräsentiert eine Datenmenge im Arbeitsspeicher. Sie kann folgendermaßen eingesetzt werden:
Als voll funktionsfähige, dateibasierte Stand-alone-Datenmenge in einschichtigen Datenbankanwendungen. In dieser Form stellt die Client-Datenmenge die in einer bestimmten Datei auf der Festplatte des Benutzers gespeicherten Daten dar.
Als lokaler Speicherpuffer der Datensätze einer anderen Datenmenge. Die andere (Quell-) Datenmenge kann sich in demselben Formular oder Datenmodul wie die Client-Datenmenge befinden (beispielsweise bei Client-Datenmengen, die die Unterstützung für die Navigation und Bearbeitung von Daten aus einer unidirektionalen Datenmenge bereitstellen). Wenn die Client-Datenmenge den Client-Bereich einer mehrschichtigen Datenbankanwendung unterstützt, kann sich die Quelldatenmenge auch auf einem separaten System befinden.
Hinweis: Die beiden oben beschriebenen Funktionen schließen sich nicht gegenseitig aus. Eine Anwendung kann für den Offline-Betrieb mithilfe des "Aktenkofferprinzips" entworfen werden. Im Online-Betrieb kommuniziert die Anwendung über das TClientDataSet-Objekt mit dem der Quelldatenmenge zugeordneten Datenbank-Server. Wenn ein Benutzer offline arbeitet, schreibt die Client-Datenmenge eine Momentaufnahme des Datenbestandes auf die lokale Festplatte. Die Client-Datenmenge wird dann wie eine dateibasierte Datenmenge in einer einschichtigen Anwendung verwendet.
Wenn eine Client-Datenmenge Daten aus einer anderen Datenmenge repräsentiert, erfolgt die Kommunikation mit dieser Datenmenge über einen Datenmengen-Provider. Die Client-Datenmenge kommuniziert mit diesem Provider über die IAppServer-Schnittstelle. Wenn sich der Provider in demselben Formular oder Datenmodul wie die Client-Datenmenge befindet, wird die IAppServer-Schnittstelle vom einem verborgenen Objekt automatisch implementiert. Wenn die Client-Anwendung dagegen Teil einer mehrschichtigen Anwendung ist, übergibt die Client-Datenmenge alle Aufrufe für den Provider über eine IAppServer-Schnittstelle des Remote-Datenmoduls.
Zitat von
Delphi 7-Hilfe:
Client-Datenmengen
Client-Datenmengen sind spezialisierte Datenmengen, die alle ihre Daten im Speicher vorhalten. Die Funktionen zur Bearbeitung der von ihnen im Speicher vorgehaltenen Daten werden durch MIDASLIB.DCU oder
MIDAS.DLL bereitgestellt. Das Format, in dem die Client-Datenmengen ihre Daten ablegen, ist in sich abgeschlossen und einfach zu transportieren, wodurch Client-Datenmengen Folgendes ermöglichen:
Aus dedizierten Dateien lesen und in diese schreiben und auf diese Weise als dateibasierte Datenmenge dienen. Eigenschaften und Methoden, die diesen Mechanismus unterstützen, sind unter Eine Client-Datenmenge mit dateibasierten Daten verwenden beschrieben.
Aktualisierungen für Daten von einem Datenbankserver zwischenspeichern. Die Funktionsmerkmale von Client-Datenmengen, die zwischengespeicherte Aktualisierungen unterstützen, sind unter Mithilfe einer Client-Datenmenge Aktualisierungen zwischenspeichern beschrieben.
Die Daten im Client-Teil einer mehrschichtigen Anwendung repräsentieren. Damit der Client-Datenmenge dieses Verhalten möglich ist, muss sie mit einem externen Provider zusammenarbeiten, wie unter Eine Client-Datenmenge mit einem Provider verwenden beschrieben. Weitere Informationen zu mehrschichtigen Datenbankanwendungen finden Sie unter Mehrschichtige Anwendungen erstellen.
Die Daten von einer anderen Quelle als einer Datenmenge repräsentieren. Weil eine Client-Datenmenge die Daten von einem externen Provider bezieht, können spezialisierte Provider eine Vielzahl von Informationsquellen für Client-Datenmengen bereitstellen. Beispielsweise können Sie einen
XML-Provider verwenden, um einer Client-Datenmenge zu ermöglichen, die Informationen aus einem
XML-Dokument zu repräsentieren.
Gleichgültig, ob Sie Client-Datenmengen für dateibasierte Daten, zwischengespeicherte Aktualisierungen, Daten von externen Providern (wie beispielsweise bei der Arbeit mit einem
XML-Dokument oder in einer mehrschichtigen Anwendung) oder eine Kombination dieser Ansätze wie beispielsweise in einer “Aktenkoffermodell”-Anwendung einsetzen – in allen diesen Fällen können Sie den großen Funktionsbereich nutzen, den Client-Datenmengen für die Arbeit mit Daten bereitstellen.
Zitat von
globetrotter77:
Ich stelle nur fest, dass merkwürdige Phänomene auftreten, die überdeutlich zeigen, dass die vorhandenen Indizes bei der Abfrage NICHT genutzt werden.
Auch, wenn es keiner glauben will!
Nein, natürlich werden die Indizes der Datenbank nicht genutzt, die Datenmenge wird im ClientDataSet ja auch losgelöst von der Datenbank verwaltet. Wie soll der ClientDataSet denn 'nen Index der Datenbank verwenden, wenn Client die Daten im
eigenen Arbeitsspeicher verwaltet? Wie soll denn ein Index der Datenbank sinnvoll genutzt werden, wenn der Client die Daten selbständig in seinem Arbeitsspeicher verändern kann? Soll die Datenbank dann für Dich 'nen zusätzlichen Index verwalten, der auf Deine Daten im Arbeitsspeicher passt, während andere Nutzer der Datenbank den Index für die in der Datenbank enthaltenen Daten nutzen?
Wenn Du die Daten bewusst seperat von der Datenbank benutzt, kannst Du von der Datenbank nicht erwarten, dass sie Dir die mit der Verwaltung der Daten verbundene Arbeit abnimmt.
Im ClientDataSet kannst Du die Daten auch noch nach Herzenslust verwalten, wenn der Server längst geplatzt ist, durch Stromausfall untätig wird, Du die Netzverbindung Deines Rechners mit der Axt durchhaust...