Autor Beitrag
ShadowThief
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 278



BeitragVerfasst: Fr 18.07.03 07:55 
wie kann ich in einem TClientDataSet positionieren.

also ich mache z. B.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
ClientDataSet.IndexFieldNames := 'id';
ClientDataSet.SetRange([4], [4]);

// jetzt hab ich den Satz mit der id = 4

ClientDataSet.CancelRange;

so funktioniert es zwar, aber zwischen SetRange und CancelRange ist die Datenmenge bis auf den einen Satz sozusagen ausgeblendet, weg halt.

und das ist für mich ein problem. ich würde lieber etwas in dieser art ausführen
ausblenden Delphi-Quelltext
1:
2:
ClientDataSet.IndexFieldNames := 'id';
ClientDataSet.Positionier_mir_mal_auf_folgenden_index([4]);

hab aber weder bei google-groups, hier, noch in der OH irgendwas gefunden, dass danach aussieht.

vielen dank.
shadow.

Moderiert von user profile iconTino: Delphi-Tags hinzugefügt; unnötige Absätze entfernt.
Neuromancer
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 42

WinNT 4.0 SP6a, WIN 2k Prof SP3, Win XP Prof SP1
D5 Ent, D6 Ent
BeitragVerfasst: Fr 18.07.03 09:35 
Hier findest du ausführliche und sehr kompetente Informationen zum Thema TClientDataSet allgemein.
Und hier zu deinem speziellen Problem.

Gruß

Übrigens: ein TADODataSet kann alles, was ein TClientDataSet auch kann. Nur mit dem einen Unterschied: ADO ist um mehr als das Doppelte schneller.


Zuletzt bearbeitet von Neuromancer am Fr 18.07.03 10:12, insgesamt 1-mal bearbeitet
ShadowThief Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 278



BeitragVerfasst: Fr 18.07.03 09:42 
vielen dank, das was ich suchte ist das hier bdn.borland.com/arti...0,1410,29176,00.html

ClientDataSet.FindNearest.
geil, das hab ich gebraucht, vielen dank.

shadow.
Udontknow
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: Mo 21.07.03 14:45 
@Neuromancer:

Wieso ist ein AdoDataset schneller?
Immerhin arbeite ich bei einem Clientdataset clientseitig...

Cu,
Udontknow
Neuromancer
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 42

WinNT 4.0 SP6a, WIN 2k Prof SP3, Win XP Prof SP1
D5 Ent, D6 Ent
BeitragVerfasst: Mo 21.07.03 14:59 
Beide Datasets arbeiten mit ihrer eigenen Client-Cursor-Engine. Die ADO-Engine steht aber unter dem Hut von M$, während TClientDataSet ein Borland-Eigenbau ist.
Und (ausnahmsweise!) hat hier Microsoft mal seine Hausaufgaben gemacht.

Lass dich nicht aufs Glatteis führen, wenn du mit ADO gegen einen SQL-Server arbeitest. Bei den meisten Operationen arbeitet das DataSet hier nämlich genauso auf dem Client (und nicht unmittelbar gegen den Server, wie man zunächst meinen könnte). Einstellen kannst du das mit der CursorLocation.

Wenn du anstatt den Wrappers ADOExpress/dbGo die nativen ADO-Komponenten benutzst und diese früh bindest, dann sieht TClientDataSet sogar noch älter aus.

Gruß
Udontknow
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: Mo 21.07.03 15:15 
Hmmm, der hauptvorteil von TClientdatasets liegt für micht aber eher darin, daß ich sogar ganz ohne einen DBServer arbeiten kann, und filtern und sortieren kann, wie es mir beliebt, und das alles eben komplett auf Clientseite. Sozusagen eine Desktop-DB-Variante.

Geht das auch mit ADO? Damit habe ich mich noch nicht so sehr beschäftigt.

Cu, :)
Udontknow
Neuromancer
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 42

WinNT 4.0 SP6a, WIN 2k Prof SP3, Win XP Prof SP1
D5 Ent, D6 Ent
BeitragVerfasst: Mo 21.07.03 16:45 
Udontknow hat folgendes geschrieben:
Geht das auch mit ADO?


Ja, wie gesagt, das ADODataSet beherrscht alles, was TClientDataSet auch kann (zumindest ist mir nichts anderes bekannt). Bis auf wenige kleine Ausnahmen (speichern als XML-File, hier muss der Weg über SaveToFile genommen werden) ist eigentlich alles identisch.
Man geht also genau den gleichen Weg: persistente Felder erstellen -> DataSet erzeugen usw.
Und auch Nested DataSets stellen mit dem ADODataSet kein Problem dar.

Du brauchst auch für ADO keinen Server/Provider. Der Hauptvorteil des ClientDataSets bleibt auch bei ADO erhalten: Falls du dich irgendwann mal anders entscheidest, und doch eine "echte" Datenbank dahinterhängen willst, dann geht das auch mit ADO.

Gruß
Neuromancer
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 42

WinNT 4.0 SP6a, WIN 2k Prof SP3, Win XP Prof SP1
D5 Ent, D6 Ent
BeitragVerfasst: Di 22.07.03 09:56 
Vielleicht sollte ich zu dem oberen noch was sagen.

Stell dir vor, du arbeitest mit ADO gegen einen beliebigen SQL-Server und du startest eine Query.
Jetzt liegt es an dir, wie du dein ADO-DataSet konfiguriert hast. Die Standardeinstellung für die CursorLocation ist clUseClient. Öffnest du die Query, dann holt ADO alle Datensätze und legt sie auf dem Client ab. Du arbeitest jetzt quasi auf einer Desktopdatenbank, obwohl du doch eigentlich gegen einen Server arbeitest. Fast alle Operationen, die du jetzt ausführst, wie zum Beispiel .Next, .First, .Last, .FieldByName usw. werden von der so genannten Client-Cursor-Engine übernommen. Erst bei einem .Post wird der Server wieder angesprochen.
Und genau diese Client-Cursor-Engine ist es auch, die ins Spiel kommt, wenn du das ADODataSet als ClientDataSet missbrauchst, die Methodik der Datenmanipulation ist hier nämlich genau die gleiche, außer, dass bei einem .Post dann eben lokal und nicht gegen den Server gespeichert wird.

Käme mal auf einen Versuch an, aber ich denke, dass es genauso gut möglich sein müsste, ein DataSet von einem Server zu laden, um es anschließend lokal auf dem Rechner mit SaveToFile zu speichern. Das wäre natürlich klasse für Notebooks. Du lädst morgens ein paar Daten vom Server (z.B. Kundendaten) aufs Notebook, stiefelst zum Kunden, änderst lokal deine Daten auf dem Notebook, connectest abends wieder auf den Server und spielst die veränderten Daten rüber. Fertig.

Gruß
Udontknow
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: Di 22.07.03 13:40 
In der Hinsicht wäre es dann ja wie ein Clientdataset. Ich muss mal schauen, ob sich das mit der Geschwindigkeit tatsächlich so darstellt...

Wir benutzen eben Clientdatasets zwecks Multi-Tier-Entwicklung. Der Zwischenschritt mit dem Appserver ist für das LoadBalancing unabdingbar. Das AdoDataset wird wohl kaum die Möglichkeit haben, sich mit einem RemoteServer (ich spreche hier von der Eigenschaft der Socket Connection) zu verbinden.

Cu, :)
Udontknow
Neuromancer
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 42

WinNT 4.0 SP6a, WIN 2k Prof SP3, Win XP Prof SP1
D5 Ent, D6 Ent
BeitragVerfasst: Di 22.07.03 15:21 
Jepp, wäre mal interessant, was du herausfindest.
Ich kann hier lediglich die Messungen spiegeln, die Andreas Kosch in seinem Buch "ADO und Delphi" ermittelt hat. Selbst bin ich noch nicht zum Messen gekommen.

Zeit für das Einfügen und Speichern von 50.000 Datensätzen
ausblenden Quelltext
1:
2:
TClientDataSet: Einfügen: 15.630 Ticks, Speichern:  250 Ticks
TADODataSet:    Einfügen:  6.840 Ticks, Speichern: 1250 Ticks

In der Größe der resultierenden Datenmenge liegen beide bei ca. 3 MB. ADO genehmigt sich lediglich ca. 50kB mehr

Gruß