Collections mit COM
Hallo Zusammen,
Ich habe eine Datenbank, einen COM+ Server (Serverschicht), einen COM+ Business Layer(Objektschicht) und eine Client Anwendung. Der Server übernimmt die Aufgabe, Daten von/in die Datebank zu schreiben bzw. zu lesen. Die Objektschicht hat die Aufgabe die gelesenen Daten zu verifizieren bzw, plausibilisieren und in Form einer Collection dem Client zur Verfügung zu stellen bzw. die vom Client erstellten Collections zur Speicherung an die Serverschicht zu übergeben. Meine Frage ist: Wie stelle ich es in Delphi am Besten an, die von der Serverschicht übermittelten ADO Recordsets in Collections zu konvertieren ? Beispiel.: Der Client fordert eine Übersicht aller Kunden an. Nun möchte ich eine Collection haben, die z.B. TCustomers heißt und aus einzelnen TCustomerItem(s) besteht. Jedes TCustomerItem enthält die gleichen Properties wie z.B. Plz, Strasse, Name, Nachname, usw. Frage: Wie würdet Ihr das entsprechende Interface dazu gestalten !? Gruß, Tom |
Re: Collections mit COM
Hoho, jetzt wirds lustig ;-) Gib mir mal ein wenig Zeit, ich muss mal schauen, ob ich schnell ein Beispiel zusammen bekomme ;-)
...:cat:... |
Re: Collections mit COM
Liste der Anhänge anzeigen (Anzahl: 1)
Also, ich mache es jetzt mal kurz. Dein Collection-Interface muss das Windows-Interface IEnumVariant unterstützen. Im Type-Library Editor musst Du für das Collection-Interface folgende Read-Only-Properties hinzfügen:
Die Interface-Klasse der Collection-List muss erweitert werden. Im gelieferten Beispiel wird aus
Delphi-Quellcode:
einfach
TCollectionList = class(TASPMTSObject, ICollectionList)
Delphi-Quellcode:
TBaseCollectionList kommt aus der mitgelieferten Unit uBaseCollection.
TCollectionList = class(TBaseCollectionList, ICollectionList, IEnumVariant)
Das Interface des Collection-Item wird in der Type-Library um die Eigenschaft Key erweitert, Type BSTR (WideString), ID auf 0 (Standardeigenschaft; ist optional, aber sinnvoll). Die Interface-Klasse des Collection-Item muss auch erweitert werden. Im gelieferten Beispiel wird aus
Delphi-Quellcode:
einfach
TCollectionItem = class(TASPMTSObject, ICollectionItem)
Delphi-Quellcode:
Das Interface IBaseCollectionItem kommt auch aus der mitgelieferten Unit uBaseCollection.
TCollectionItem = class(TASPMTSObject, ICollectionItem, IBaseCollectionItem)
Die Klasse TBaseCollectionList In dieser Klasse geschieht das eigentliche der Collection-Arbeit. Die eigentlichen Funktionen des Interfaces IEnumVariant werden hier gefüllt. Collections müssen, wenn diese durchlaufen werden sich selbst klonen, aber mit dem gleichen Daten wie das Original arbeiten. Dadurch werden diese thread-safe. Die mitgelieferte Basisklasse TBaseCollectionList tut genau das. Ich setze die Unit (unter steten Erweiterungen) seit Feb. 2000 ein. Inzwischen ist die Unit mehrere hundert Male erfolgreich implementiert. Ich hoffe es funktioniert auch bei Dir ohne Probleme. Einfach anschauen und testen. Eine kleine Bitte Wenn jemand Verbesserungen oder Vorschläge hat, sendet diese bitte an mich. Jetzt das Beispiel und viel Erfolg ;-) Bedenke, daß das Beispiel mit Delphi 7 erstellt ist und daher die Unit Variants benötigt. Wenn Dein Compiler älter ist (ich glaube bis v5) einfach die Unit aus der Uses-Klausel entfernen, die wurde erst später durch Borland eingeführt. ...:cat:... |
Re: Collections mit COM
P.S. Ich hoffe es ist kein Fehler im Server-Beispiel. Ich habe gerade keine Möglichkeit die Collection zu testen :wall: :mrgreen:
...:cat:... |
Re: Collections mit COM
Hallo Sakura,
Zunächst einmal recht herzlichen Dank für Deine prompte Unterstützung. Ich denke, Du hast verstanden worum es mir geht und mir gleich das entsprechende Beispiel dazu geliefert. Find ich echt lobenswert !!! Ich werde mir das Beispiel mal genauer anschauen und ein paar Tests damit durchführen. Gruß, Tom |
Re: Collections mit COM
Ich musste es gerade noch einmal hochladen, da mir ein Fehler unterlaufen war :oops:
...:cat:... |
Re: Collections mit COM
Hallo Sakura,
Danke nochmals, das ist genau das was ich brauche. Es scheint alles wunderbar zu funktionieren. Wie bereits erwähnt werde ich die DLL mal etwas genauer testen. Hast Du schon ähnliche Erfahrungen im Real-Life-Modus sammeln können !? Mich interessieren vor allem Daten über Geschwindigkeit und Zuverlässigkeit, die mann mit diesem Konzept erzielt. Meine Erfahrungen mit diesem Konzept beruhen sich lediglich auf VC++. Man munkelt ja darüber, das VC++ in jedem Falle immer etwas schneller ist als Delphi. PS: Nein ..., ich will keine Diskusion darüber führen, welche Sprache besser ist. Die Beste ist und bleibt Delphi !!! Gruß, Tom |
Re: Collections mit COM
Zitat:
Zitat:
Zitat:
Zitat:
Wenn Dir jemand mit einem Vergleich C++ vs. Delphi kommt, Kopf hoch. Wirkliche Vorteile kann C++ nur im tief mathematischen Bereich erzielen und natürlich in der Treiberprogrammierung ;-) ...:cat:... |
Re: Collections mit COM
Hallo Sakura,
Ich versuche schon seit einiger Zeit meine Kollegen davon zu überzeugen, das Delphi oder gar der C++ Builder um einiges wirtschaftlicher arbeitet als die Lösung von Microsoft. Mich korzt es regelrecht an, mit welchen Einschränkungen ich tagtäglich konfrontiert werde. In dem Glauben, Microsoft hätte einiges an seiner Programmiersprache C++ verbessert, habe ich mir das Visual Studio.Net zugelegt. Jedoch weit gefehlt. Außer ein paar Updates in der MFC ist dort nichts passiert. Will man nun einigermaßen komfortabel mit C++ von Microsoft arbeiten, beruht die Geschichte auf dem .NET Framework also Manageged C++. Also warum lassen sich meine Kollegen davon nur nicht überzeugen !? Aber, - Was der Bauer nicht kennt, daß ißt er nicht ! PS.: Du hast ein CopyRight auf die Unit UBaseCollection. Gibt es da einige Regeln von denen ich wissen müsste !? Gruß Tom |
Re: Collections mit COM
Hallo Sakura,
Könntest Du mir noch die Frage mit dem Copyright beantworten !?, dann kann ich hier abschließen. Natürlich kannst Du mir auch per Mail antworten unter vanveen@specialwork.de Gruß, Tom |
Re: Collections mit COM
Hiermit gebe ich den Code unter der MPL 1.1 frei. ( http://www.mozilla.org/MPL/MPL-1.1.html ) Kannst Du also frei einsetzen, dafür lehne ich jede Haftung ab. Das Recht der Source bleibt bei mir ;-) Weitergehende Änderungen, welche publik gemacht werden, müssen auch mir gegeben werden ;-) Geschäftliche Nutzung ohne Einschränkungen möglich, allerdings lehne ich jeglich Haftung ab. Dafür ist er frei ;-)
...:cat:... |
Re: Collections mit COM
Doppeltgemoppelt hält besser :mrgreen: Ich bin einfach müde. Egal, viel Spass und las mich wissen, wenn Du Verbesserungen hast.
...:cat:... |
Re: Collections mit COM
Ok, Danke und schlaf gut ... !
Exit Thread. |
Re: Collections mit COM
Ich habe gerade den entdeckt :lol:
http://www.entwickler-forum.de/webx?...Xp.1@.1dd04fba ...:cat:... |
Re: Collections mit COM
Hallo Sakura,
Was meinst Du zu dem Beitrag von Herrn Kosch !? PS: Du sollst keine Götter neben mir haben ... Naja, Das Entwicklerforum kannte ich bereits vor Delphi-Praxis. Gruß, Tom |
Re: Collections mit COM
Gegen Herrn Kosch ist nichts einzuwenden. Von ihm habe ich auch schon viel Hilfe bekommen. In diesem Fall war es seiner Meinung nach nicht sinnig eine COM-Collection zu nutzen. Na ja, ich habe Dir das Ding einfach mal gepostet - Du wirst (hoffentlich) wissen, ob es für Dich sinning ist, oder nicht ;-)
...:cat:... P.S.: Ich bin kein Gott, von daher verstößt Du auch nicht gegen dieses Prinzip :mrgreen: |
Re: Collections mit COM
Hallo Sakura,
Auch wenn ich eher zu Herrn Kosch's Vorschlag tendiere, gibt es etliche Anwendungsfälle, die datenbankunabhängig arbeiteten sollen, bei denen ich Kollektionen verwenden möchte. PS.: Mit Götter meinte ich eher die Foren Gruß, Tom |
Re: Collections mit COM
Zitat:
...:cat:... |
Re: Collections mit COM
Hercules, Zeus, usw. aber Sakura. Nie davon gehört !?
Gruß, Tom |
Re: Collections mit COM
:wall: Menno, nach über zwei Jahren Nutzung dieser Basisklasse ist jetzt ein Fehler ans Tageslicht gekommen :oops: :roll:
Ich habe ihn bereits gefunden und werde die Lösung in den nächsten Stunden (oder Morgen) hochladen. Der Fehler tritt nur auf, wenn die Instanz einer Collection durch mehrere Clients gleichzeitig enumeriert wird. Dann bekommen die Clients "wilde" Listen zurück. Es treten aber immerhin :?: keine Exceptions auf. Na ja, ich habe die Lösung bereits auf meinem Rechner und teste :coder: diese jetzt noch kräftig durch... Immerhin war die Lösung von Anfang an vorbereitet, nur nie implementiert. :twisted: Die Code-Änderungen nach aussen sind eher minimal. :bouncing4: ...:cat:... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:26 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