![]() |
Datenbank: Firebird • Version: 2.1 • Zugriff über: SQLConnection
ClientDataSet - wie kann man Indizes verwenden?
Hallo!
Bin ich zu doof dafür, oder gibt es wirklich gar keine Möglichkeit, mit TClientDataSet auf die in der DB definierten Indizes zurückzugreifen? Zitat aus der Hilfe: Es gibt drei Möglichkeiten, einer Client-Datenmenge einen neuen Index hinzuzufügen: 1) Die Eigenschaft TCustomClientDataSet.IndexFieldNames verwenden ... Diese Indizes bleiben nicht erhalten, wenn Sie die Datenmenge schließen ... 2) TCustomClientDataSet.AddIndex aufrufen ... Mit AddIndex erstellte Indizes werden beim Schließen der Client-Datenmenge nicht beibehalten ... 3) Die Eigenschaft TCustomClientDataSet.IndexDefs verwenden ... Als dritte Möglichkeit können Sie einen Index zu dem Zeitpunkt erstellen, zu dem die Client-Datenmenge erzeugt wird ... ... Auf diese Weise erzeugte Indizes sind persistent und werden gespeichert, ... Sieht so aus, als käme nur Variante 3 in Frage. Aber merkwürdigerweise werden diejenigen Indizes, die bereits in der DB vorhanden sind, überhaupt nicht berücksichtigt. Heißt das nun, dass ich alle DB-Definitionen nicht mehr mit einem DB-Tool durchführen kann, sondern mit Delphi selber stricken muss? Das widerspricht ja schon ein bisschen dem Prinzip der Trennung von Daten und Programm, oder? Was käme denn statt ClientDataSet noch in Frage? Danke im Voraus Harald PS: ich verwende Turbo Delphi Explorer |
Re: ClientDataSet - wie kann man Indizes verwenden?
ich heb das noch mal nach oben ...
wie ist die Formulierung aus der Hilfe unter Punkt 3) nun wirklich zu verstehen?
Delphi-Quellcode:
3) Die Eigenschaft TCustomClientDataSet.IndexDefs verwenden
... Als dritte Möglichkeit können Sie einen Index zu dem Zeitpunkt erstellen, zu dem die Client-Datenmenge erzeugt wird ... ... Auf diese Weise erzeugte Indizes sind persistent und werden gespeichert, ... Ich hätte gedacht, dass "IndexDefs verwenden" heißt, man kann über die IndexDefs den passenden Index auswählen. So wie sonst eben auch. Geht aber nicht. Bedeutet im Klartext vermutlich auch, dass eine der wichtigsten Eigenschaften einer DB nicht genutzt werden kann. Oder habe ich nur etwas übersehen??? |
Re: ClientDataSet - wie kann man Indizes verwenden?
Nicht auswählen sondern erzeugen
|
Re: ClientDataSet - wie kann man Indizes verwenden?
wann erzeugen???
ich habe ne Datenbank, die im aktuellen Fall ca. 100000 Datensätze enthält, über die ich mehrere Indizes legen will (eben, weil es so viele sind). Das will ich genau einmal machen, aber wie? |
Re: ClientDataSet - wie kann man Indizes verwenden?
sorry, soll natürlich heißen:
nicht die Datenbank, sondern eine Tabelle aus der Datenbank enthält ca. 100000 Sätze. In anderen Fällen können es auch mal 500000 sein. Da will man die Indizes natürlich auf Dauer erhalten wissen. |
Re: ClientDataSet - wie kann man Indizes verwenden?
Delphi-Quellcode:
<ds>.IndexDef.Add()
|
Re: ClientDataSet - wie kann man Indizes verwenden?
IndexDefs.Add kenne ich schon, aber was ist denn der Unterschied zwischen einem selbst (also vom eigenen Programm) generierten und einem fremdgenerierten Index. Die Indizes sind ja schon da, aber warum sehe ich sie nicht??
|
Re: ClientDataSet - wie kann man Indizes verwenden?
Ich hab mal ne Datenbank mit Clientdataset erstellt, und man konnte die Spalten
sortieren , indem man oben auf den Spaltennamen geklickt hat. Das war dieser Code
Delphi-Quellcode:
procedure TForm1.DBGrid2TitleClick(Column: TColumn);
begin try ClientDataset2.IndexFieldNames := Column.FieldName; except ShowMessage('Das Feld kann nicht sortiert werden' + Column.FieldName); end; end; |
Re: ClientDataSet - wie kann man Indizes verwenden?
@Thomas:
richtig! das geht auch wunderbar, aber ab einer bestimmten Größe dauert es einfach zu lange, weil der Index nach jedem Programmstart wieder neu aufgebaut werden muss. Dauert bei 100000 Sätzen zwar immer noch "nur" ca. 5 Sekunden, aber das gilt für jeden Index. Hat man also mehrere Indizes zu verwalten und evtl. noch mehr Datensätze, dann wird es irgendwann einmal unzumutbar für den Benutzer. Deshalb gibt es ja auch normalerweise bei einer DB die Möglichkeit, einen Index nachträglich hinzuzufügen, um so Performance-Gewinne herauszuholen. Der beste Performance-Gewinn hilft aber nicht weiter, wenn man das immer wieder neu machen muss. :cry: Harald |
Re: ClientDataSet - wie kann man Indizes verwenden?
Da kenn ich mich leider nicht aus.
Vielleicht ne andere Datenbank nehmen, die für große Datenmengen besser geeignet ist. |
Re: ClientDataSet - wie kann man Indizes verwenden?
@Thomas F:
tja, genau da liegt das Problem! Interbase bzw. Firebird ist eigentlich sehr wohl für große Datenmengen geeignet, aber offenbar nicht in dieser Kombination. Trotzdem danke für deine Hilfe! |
Re: ClientDataSet - wie kann man Indizes verwenden?
Das hat aber nichts mit dem DBMS zu tun, sondern mit der TClienDataSet-Komponente
|
Re: ClientDataSet - wie kann man Indizes verwenden?
Deine Tabellen haben aber auch Schlüssel?
|
Re: ClientDataSet - wie kann man Indizes verwenden?
@mkinzler:
das sehe ich auch so ... TClientDataSet stellt scheinbar einfach nichts dergleichen zur Verfügung, oder ich habe es noch nicht herausgefunden, wo es versteckt liegt. Merkwürdig aber trotzdem der Hinweis mit den persistenten Indizes ... grummel Gibt es evtl. eine andere dataset-artige Komponente, mit der man das bewerkstelligen kann? Mein Problem ist einfach, dass ich weg will von der BDE, die nichts als Probleme bereitet und ja auch hoffnungslos veraltet ist. Firebird als DB scheint mir durchaus geeignet zu sein, aber wenn die Vorteile der Datenbank nicht genutzt werden können, ist es ja fast schon egal, welche DB ich verwende. |
Re: ClientDataSet - wie kann man Indizes verwenden?
@omata:
Mit Indizes meine ich eigentlich Schlüssel, klar habe ich die! Besser gesagt: ich will sie haben, aber es geht nicht! |
Re: ClientDataSet - wie kann man Indizes verwenden?
Vielleicht eine andere Komponente
|
Re: ClientDataSet - wie kann man Indizes verwenden?
Das verstehe ich jetzt nicht. Schlüssel oder Indizes was denn nun?
Ich verwendet Firebird locker mit >1000000 pro Tabelle und das ist richtig schnell. Ich verstehe deine Probleme nicht, was machst du da? |
Re: ClientDataSet - wie kann man Indizes verwenden?
@omata: Er greuft ja nicht direkt, sondern über ein ClientDataSet zu
|
Re: ClientDataSet - wie kann man Indizes verwenden?
@omata:
sehr gut, dann weißt du ja, was richtige Datenmengen sind. also: ich habe eine SQLConnection für die Firebird-DB und ein SQLDataSet für eine der Tabellen aus der DB. Dann einen DataSetProvider, der mit dem TSQLDataSet verbunden ist, und ein ClientDataSet, das auf den DataSetProvider zugreift. Die DB habe ich mit ISQL erstellt (inkl. Index-Definitionen), die Daten wurden mit einem anderen Programm aus einer anderen Datenbank importiert. Und jetzt will ich gerne mit meinem Programm einigermaßen elegant mit den Daten umgehen. Das heißt aber auch, dass ich ab und zu die Daten in einer anderen Sortierung haben will. Hierzu klicke ich in einem DBGrid einfach auf die Titelleiste und stelle den Index im OnTitleClick-Event um. Das geht auch einigermaßen flott, weil ich die verschiedenen Index-Definitionen per Hand zur Entwurfszeit eingetragen habe, aber eben immer erst ab der zweiten Verwendung. Nach jedem Programmstart muss er die Indizes offenbar nochmal neu aufbauen, was natürlich Zeit kostet. Standardmäßig scheint er nur den aktuell eingestellten Index aufzubauen, aber sobald ich einen anderen haben will, braucht er wieder so lange, bis es flutscht. Ist ein Index erst einmal aufgebaut, geht es wirklich sehr schnell, keine Frage, aber wieso schmeißt Delphi alles wieder weg beim Programmende? Und wieso sind die beim CREATE-DATABASE-Durchlauf nicht schon vorhanden und greifbar? Das verstehe ich nicht, gebe ich zu! Oder mache ich einfach irgendetwas völlig falsch? IndexDefs.Update hilft da übrigens auch nicht weiter |
Re: ClientDataSet - wie kann man Indizes verwenden?
@mkinzler:
wie kann ich denn direkt zugreifen?? |
Re: ClientDataSet - wie kann man Indizes verwenden?
Müssen den alle Datensätze angezeigt werden? Sortiere doch nicht in deinem Programm, also nicht im ClientDataSet sondern lass die Sortierung von der Datenbank durchführen. Und begrenze die Anzahl der Datensätze.
|
Re: ClientDataSet - wie kann man Indizes verwenden?
@omata:
das ist doch genau das Problem, das ich habe! ich würde diese Arbeit gerne von der Datenbank erledigen lassen, habe aber leider keinen Zugriff auf die Indizes. Die Datensätze begrenzen geht leider nicht immer, manchmal muss man in einer bestimmten Reihenfolge durchgehen, ob man sie anzeigt oder auch nicht. Und dazu brauche ich einen passenden Index, den ich genau einmal aufbauen lassen möchte. Danach soll die DB den Index verwalten. Mir ist schleierhaft, wie du das mit 1 Mio. Sätzen machst, ohne auf dieses Problem zu stoßen. Harald |
Re: ClientDataSet - wie kann man Indizes verwenden?
Warum TClienDataSet?
|
Re: ClientDataSet - wie kann man Indizes verwenden?
Zitat:
einfach, weil ich ganz naiv dachte, dass es eine gute Wahl ist ... insbesondere gefällt mir, dass ich die Datensätze zu definierten Zeitpunkten mit ApplyUpdates sichern kann, auch die Möglichkeit, SavePoints einzurichten, ist nicht schlecht, aber das könnte ich notfalls alles selber stricken, es wäre zumindest nicht so zeitintensiv wie die immer wieder stattfindende Index-Neuerstellung. Was für Komponenten kämen denn noch in Frage? Leider benutze ich nur Turbo Delphi Explorer, kann also keine Komponenten direkt installieren, aber zu Fuß scheint das ja trotzdem zu gehen. |
Re: ClientDataSet - wie kann man Indizes verwenden?
Disconnected DataSets werden auch von IBDAC, FIBPlus und Ado angeboten
|
Re: ClientDataSet - wie kann man Indizes verwenden?
was heißt "Diconnected"?
Bei ADO gab es irgendein anderes Problem, das sich nicht ausmerzen ließ, habe ich schon probiert, ich weiß allerdings nicht mehr genau, was das war. Ich glaube, man konnte einfach nicht so navigieren, wie ich mir das vorstellte. Und die anderen beiden? Darf man die einfach verwenden? Oder kosten die nicht doch ne ganze Stange Geld? Ich wollte es halt zunächst mal mit Bordmitteln lösen ... |
Re: ClientDataSet - wie kann man Indizes verwenden?
Disconnected bedeutet, dass man das DataSet von der Datenbank trennen kann. Die Daten werden dann lokal gecacht. Änderungen können nach der Wiederverbindung auf den Serverbestand übernommen werden
|
Re: ClientDataSet - wie kann man Indizes verwenden?
alles jedenfalls sehr mysteriös ...
die BDE ist zwar gnadenlos veraltet, aber die konnte das doch auch schon ... :? |
Re: ClientDataSet - wie kann man Indizes verwenden?
@mkinzler:
dachte ich mir fast ... das heißt, das damit dann auch sowas wie ApplyUpdates möglich ist, oder? die Frage hatte sich eigentlich erledigt, nachdem du den Schreibfehler ausgebessert hattest. |
Re: ClientDataSet - wie kann man Indizes verwenden?
um nicht missverstanden zu werden:
ich brauche keine Möglichkeit, mich von der DB zu trennen und danach wieder zu verbinden. Meine DB ist nur lokal vorhanden. Es erscheint mir nur sehr sympathisch, dass die Änderungen nicht gleich in der DB landen, sondern auch stufenweise (und nicht nur im Ganzen) rückgängig gemacht werden können. |
Re: ClientDataSet - wie kann man Indizes verwenden?
um noch mal auf den eigentlichen Kern des Problems zurückzukommen:
1) Wieso schafft es diese ClientDataSet-Komponente nicht, auf die bereits vorhandenen Indizes zuzugreifen? Gibt es da vielleicht einen Work-Around? 2) Wieso wird es in der Hilfe so beschrieben, dass es auch persistente Indizes gibt, die also nicht weggeworfen werden beim Programmende? Das scheint doch definitiv falsch zu sein, oder? |
Re: ClientDataSet - wie kann man Indizes verwenden?
ach so, fast hätte ich es vergessen: wie schaut es eigentlich mit Queries aus?
wie kann ich sowas nutzen? Fragen über Fragen ... |
Re: ClientDataSet - wie kann man Indizes verwenden?
Also bitte, Schlüssel und Indizes (das ist schon ein bisschen was anderes als ein Schlüssel) werden auf der Tabelle erzeugt, und zwar per SQL, ein DataSet ist eine Abfragekomponente. Die Datenbank inklusive Ihrer Tabellen solltest Du schon per SQL anlegen und ändern, am Besten bevor Du Dich ans programmiern machst.
Ein Link zum Einstieg (ist zwar auf Oracle bezogen, sollte aber helfen): ![]() Sherlock |
Re: ClientDataSet - wie kann man Indizes verwenden?
Ich hab in einem Buch über Datenbankprogrammierung ("Datenbankprogrammierung Delphi 5" M.Ebner)
folgendes gefunden: Zitat:"Im Zeitvergleich zu TTable und BDE schnitt ADO beim Öffnen ein wenig schlechter ab (etwa 280ms zu 240 ms), beim Aufruf des nächsten Datensatzes lagen die Zeiten gleich (etwa 11ms). Was jedoch deutlich länger dauert, ist das Öffnen von Datenmengen zu Entwurfszeit. Auch das Erzeugen von persistenten TField-Instanzen für alle Tabellenspalten wird zur Geduldsprobe." Scheint tatsächlich langsamer zu sein als mit BDE. |
Re: ClientDataSet - wie kann man Indizes verwenden?
OK, dann nach dem Ausflug ins 20. Jahrhundert zurück ins 21. Die BDE ist seit Jahren nicht mehr gepflegt worden, ADO hatte dann doch noch ein paar Jahre Zeit sich zu entwickeln und hat mittlerweile die BDE hinter sich gelassen.
;) Edith kann mkinzler unter mir nur zustimmen. Sherlock |
Re: ClientDataSet - wie kann man Indizes verwenden?
Wobei DBMS spzifische Komponenten natürlich noch besser sind
|
Re: ClientDataSet - wie kann man Indizes verwenden?
Zitat:
was ein Dataset ist, weiß ich sehr wohl, und wie man per SQL eine Datenbank anlegt, ebenfalls. Wenn du mal genauer nachliest, wirst du vielleicht feststellen, dass ich genau das gemacht habe bzw. machen will, und zwar, bevor ich mich ans Programmieren mache. Es ist aber offenbar so, dass ich auf die von mir auf der Tabelle erzeugten Indizes nicht ansprechen kann. Die Beschreibung, wie Oracle das intern organisiert, ist an dieser Stelle völlig uninteressant, da der Index einfach nicht erreichbar ist. Ich dachte eben, dass es vielleicht doch einen Work-Around geben könnte, an einen real existierenden Index ranzukommen, weil sonst ja ein ganz wesentlicher Teil der Datenbank-Intelligenz verloren geht. Da scheint aber leider niemand eine Lösung zu kennen. Schade! |
Re: ClientDataSet - wie kann man Indizes verwenden?
Ein Index funktioniert doch aber automatisch. Dafür ist er da. Du musst nach dem korrekten anlegen des Index nixhts mehr damit machen, die abfragen laufen dann ganz von alleine schneller. Und da liegt dann auch die wahre Intelligenz eines RDBMS, das Du nämlich eben nicht selber Indizes abfragen musst ;)
![]() Sherlock |
Re: ClientDataSet - wie kann man Indizes verwenden?
@Sherlock: Sein Problem scheint es zu sein das die Indizes des Provider-DataSets nicht automatisch in das ClientDataSet übernommen werden
|
Re: ClientDataSet - wie kann man Indizes verwenden?
Zitat:
Genau das hätte ich erwartet, aber es ist leider nicht so! Das scheint aber ein Problem der ClientDataSet-Komponente zu sein. Extern definierte Indizes sind einfach nicht greifbar, warum auch immer. Einfach mal ausprobieren: CREATE DATABASE xxx ... CREATE TABLE yyy ... CREATE INDEX zzz on yyy (spalte) ... (geht mit jedem SQL-Tool auf die eine oder andere Art und Weise) Danach neues Projekt erstellen, TSQLConnection, TSQLDataSet, TDataSetProvider, TClientDataSet anlegen und verfügbare Indizes über IndexDefs anzeigen. Da findet sich aber nichts außer DEFAULT_ORDER und CHANGEINDEX, und die haben eine völlig andere Bedeutung. Nun würde es mir ja nichts ausmachen, wenn ich das genau einmal aus meinem Programm herausmachen müsste, aber das ist eben auch nicht der Fall. Stattdessen erzeugt die Komponente bei jedem Öffnen den aktuell eingestellten Index wieder neu. Und das dauert einfach recht lange, wenn genügend Datensätze vorhanden sind ... ist ja klar! Bei 1000 oder 10000 Sätzen fällt das zunächst mal gar nicht auf ... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:09 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