RAD Studio für .NET Copyright© 2008 CodeGear™. Alle Rechte vorbehalten. RAD Studio für .NET Inhalt Konzepte Datenbankanwendungen mit ADO.NET entwickeln 1 3 Überblick über AdoDbx Client 6 VCL für .NET-Datenbanktechnologien 7 Überblick zum BDP-Verbindungs-Pooling 9 Überblick zu dbExpress-Komponenten 10 Überblick zu dbGo-Komponenten 11 AdoDbx.NET-Datentypen 12 Überblick zu ADO.NET 15 BDP-Migration: Überblick 18 Blackfish SQL - Überblick 21 ADO.NET-Komponentendesigner 23 Deployment von Datenbankanwendungen für das .NET Framework 27 Datenprovider für Microsoft .NET 28 Überblick zu Stored Procedures 31 dbExpress-Framework 32 dbExpress Framework-Kompatibilität 34 Einführung in InterBase Express 35 Anwendungen mit nicht verwaltetem Code entwickeln 41 COM Interop in verwalteten Anwendungen 41 DrInterop verwenden 46 Deployment von COM Interop-Anwendungen 47 Platform Invoke mit Delphi für .NET verwenden 48 Interfaces für virtuelle Bibliotheken 56 Modellierung Code-Visualisierung - Überblick 58 58 Berichte für .NET-Anwendungen entwickeln 60 Rave Reports in RAD Studio verwenden 60 Anwendungen mit VCL.NET-Komponenten entwickeln 62 Änderungen aufgrund der Unterstützung von 64-Bit .NET 2.0 63 Portieren von VCL-Anwendungen nach RAD Studio 64 VCL-Anwendungen portieren 75 Überblick zu VCL für .NET 77 Web-Service-Clients portieren 80 iii RAD Studio für .NET Webanwendungen mit ASP.NET entwickeln Überblick zu ASP.NET 85 Überblick zu CodeGear DB Web Controls 88 DB Web Controls in Haupt-/Detail-Anwendungen verwenden 90 Überblick zur Navigations-API der DB Web Controls 92 Überblick zum DB Web Control-Experten 93 XML-Dateien und DB Web Controls verwenden 99 Mit DataView-Objekten arbeiten 101 Deployment von ASP.NET-Anwendungen 102 WebDataLink-Interfaces verwenden 103 Web-Services mit ASP.NET entwickeln 105 Überblick zu den ASP.NET-Web-Services 106 Protokoll-Stack von Web-Services 108 ASP.NET-Web-Services-Support 110 Anleitungen Datenbankanleitungen iv 83 113 114 Neue Verbindung in Daten-Explorer einfügen 116 Anleitung zum Hinzufügen eines Dialogfelds zur Fehlerbehebung zu einer BDP-Anwendung. 116 Datenbank im Daten-Explorer durchsuchen 118 Verbinden mit AdoDbx Client 119 Datenbank-Projekte mit dem Daten-Explorer erstellen 120 Tabellenzuordnungen erstellen 120 SQL im Daten-Explorer ausführen 122 Fehler in Tabellenzuordnungen behandeln 123 Daten zwischen Datenbanken migrieren 124 Verbindungen im Daten-Explorer bearbeiten 125 Datenbankverbindungen bearbeiten 126 Eine Datenbankanwendung für die Auflösung in mehrere Tabellen erstellen 132 Parameterübergabe in einer Datenbankanwendung 134 Datenadapter-Vorschau verwenden 136 Anweisungstext-Editor verwenden 137 Designer für Datenadapter verwenden 138 Verbindungseditor verwenden 139 Standarddatenmengen verwenden 140 Typisierte Datenmengen verwenden 143 Herstellen einer Verbindung zu einer Datenbank mit dem dbExpress Treiber-Framework 145 Eine verteilte Datenbankanwendung erstellen 147 RAD Studio für .NET Interoperative Anwendungen – Anleitungen 150 Hinzufügen einer J2EE-Referenz 150 Referenzen zu einem COM-Server hinzufügen 150 Anleitungen für die Modellierung 152 Code-Visualisierungsdiagramme als Grafik exportieren 152 Importieren und Exportieren eines Modells mit XMI Metadata Interchange (XMI) 153 Verwenden des Modellansichtfensters und des Code-Visualisierungsdiagramms 154 Verwenden des Übersichtsfensters 155 VCL für .NET – Anleitungen 157 VCL-Formularanwendungen mit Grafiken erstellen 161 ADO.NET-Datenbankanwendungen mit VCL.NET-Formularen erstellen 161 VCL-Formularanwendung erstellen 163 Aktionen in einer VCL-Formularanwendung erstellen 163 VCL-Formularanwendung "Hello World" erstellen 165 Mit dem Aktionsmanager Aktionen in einer VCL-Formularanwendung erstellen 166 dbExpress.NET-Datenbankanwendungen mit VCL-Formularen erstellen 167 Anwendungen mit XML-Komponenten erstellen 169 Ausführen von Änderungen, die wegen der Unterstützung von 64-Bit .NET 2.0 erforderlich sind 171 Eine neue VCL.NET-Komponente erstellen 174 Bitmap-Grafik in einer VCL-Formularanwendung anzeigen 175 Rechtecke und Ellipsen in einer VCL-Formularanwendung zeichnen 176 Abgerundete Rechtecke in einer VCL-Formularanwendung zeichnen 177 Gerade Linien in einer VCL-Formularanwendung zeichnen 177 Bitmap-Grafik in ein Steuerelement einer VCL-Formularanwendung einfügen 178 .NET-Steuerelemente in VCL.NET importieren 180 ASP.NET – Anleitungen 182 ASP.NET-Anwendungen erstellen 186 ASP.NET-Datenbankanwendung erstellen 187 ASP.NET-Anwendung mit Datenbanksteuerelementen entwickeln, Teil 1 189 ASP.NET-Anwendung mit Datenbanksteuerelementen entwickeln, Teil 2 191 ASP.NET-Anwendung mit Datenbanksteuerelementen entwickeln, Teil 3 192 ASP.NET-Anwendung "Hello World" erstellen 193 Erstellen einer ASP.NET Sitemap 194 Aktenkoffermodell-Anwendung mit DB Web Controls erstellen 198 Anwendung mit DB Web Controls erstellen 199 HTML-Elemente in Server Controls konvertieren 200 XML-Datei für DB Web Controls erstellen 201 v RAD Studio für .NET Metadaten für eine Datenmenge erstellen 203 Virtuelle Verzeichnisse erstellen 204 Aggregatwerte mit der DBWebAggregateControl-Komponente hinzufügen 204 ASP.NET-Anwendungen debuggen und aktualisieren 205 Deployment einer ASP.NET-Anwendung mit Blackfish SQL an ein System ohne RAD Studio 206 HTTP-Meldungen in ASP.NET erzeugen 207 Spalten in DBWebGrid-Objekten binden 207 Berechtigungen für die Nutzung von XML-Dateien festlegen 208 Fehlerbehebung in ASP.NET-Anwendungen 209 Den DB Web Control-Experten verwenden 211 Den ASP.NET-Deploymentmanager verwenden 212 Mit dem HTML-Tag-Editor arbeiten 215 ASP.NET User Controls verwenden 216 Web-Services-Anleitungen Auf die ASP.NET-Web-Services-Anwendung "Hello World" zugreifen 218 Webreferenzen in ASP.NET-Projekte einfügen 220 ASP.NET-Web-Services-Anwendung "Hello World" erstellen 222 Web-Services-Client-Anwendung von Delphi für Win32 nach Delphi für .NET portieren 223 Index vi 218 a 1 RAD Studio für .NET 1 1 Konzepte Themen Name Beschreibung Datenbankanwendungen mit ADO.NET entwickeln ( see page 3) Anwendungen mit nicht verwaltetem Code entwickeln ( Modellierung ( see page 41) ADO.NET ist ein kohärentes Programmiermodell, das den Datenzugriff innerhalb des .NET Framework bereitstellt. Neben der Unterstützung für MS SQL, Oracle und OLE DB-Verbindungskomponenten, die bereits im .NET Framework verankert ist, enthält RAD Studio Datenprovider für .NET (AdoDbxClient-Provider). AdoDbx ermöglicht einen Zugriff auf MS SQL, Oracle, DB2 und Interbase. Mit den AdoDbx-Komponentendesignern wird die Generierung und Konfiguration von AdoDbx-Komponenten vereinfacht. Sie können problemlos neue VCL-Formularanwendungen für das .NET Framework erstellen oder vorhandene Win32-VCL-Formularanwendungen zum .NET Framework migrieren, da die konventionellen Delphi-Datenbanktechnologien wie dbExpress und dbGo in RAD Studio weiterhin unterstützt werden. Dieser Abschnitt gibt einen Überblick über die Verwendung von RAD... more ( see page 3) RAD Studio stellt Funktionen zur Unterstützung von nicht verwaltetem Quelltext in .NET bereit. Sollen vorhandene COM- oder ActiveX-Komponenten im .NET Framework verwendet werden, können Sie bei der Erstellung Ihrer Anwendungen auf die .NET COM Interop-Funktionen in RAD Studio zurückgreifen. see page 58) Berichte für .NET-Anwendungen entwickeln ( see page 60) Anwendungen mit VCL.NET-Komponenten entwickeln ( Webanwendungen mit ASP.NET entwickeln ( see page 62) see page 83) RAD Studio wird mit Rave Reports von Nevrona geliefert. Mit Hilfe dieser Tools können Sie Berichte für Ihre Anwendungen erstellen und Lösungen für die Berichterstellung entwickeln, die von den Benutzern Ihrer Anwendung genutzt und angepasst werden können. VCL.NET ist eine erweiterte Sammlung der VCL-Komponenten, die dazu dienen, komplexe Anwendungen in Delphi schnell und einfach zu erstellen. VCL.NET bietet Ihnen die Möglichkeit, Ihre Delphi VCL-Anwendungen und -Komponenten Benutzern des Microsoft .NET Framework zur Verfügung zu stellen. Mit RAD Studio können Sie auf alle Vorteile des .NET Framework zugreifen und sich gleichzeitig der benutzerfreundlichen und leistungsstarken komponentengesteuerten Entwicklungsumgebung von Delphi bedienen. Mit RAD Studio lassen sich folgende Anwendungstypen erstellen: Sie können VCL.NET-Formularanwendungen erstellen, die sich auf dem .NET Framework ausführen lassen, aber dennoch die VCL.NET-Komponenten und -Steuerelemente verwenden. Sie können .NET-Anwendungen erstellen, die das zugrunde liegende .NET Framework und... more ( see page 62) ASP.NET ist das Programmiermodell für das Erstellen von Webanwendungen auf der Basis des .NET Framework. Dieser Abschnitt erläutert den konzeptionellen Hintergrund für das Erstellen von ASP.NET-Anwendungen in RAD Studio. Neben der Unterstützung der Datenzugriffskomponenten im .NET Framework enthält RAD Studio DB Web Controls. Die DB Web Controls verwenden die .NET Framework-Provider und die Borland-Datenprovider für .NET (BDP.NET) um die Entwicklung von Webanwendungen zu beschleunigen. 1 RAD Studio für .NET Web-Services mit ASP.NET entwickeln ( 1 2 see page 105) 1 Web-Services sind eine programmierbare Entität, die eine bestimmte Funktionalität bereitstellt, zum Beispiel eine Anwendungslogik. Auf Web-Services kann von jedem beliebigen System mit Hilfe der Internetstandards (z.B. XML und HTTP) zugegriffen werden. Bei Anwendungen, die mit ASP.NET-Web-Services erstellt wurden, kann es sich entweder um eigenständige Anwendungen handeln oder um Teilkomponenten einer größeren Webanwendung. Mit Hilfe des XML-basierten Messaging können diese Anwendungen für eine beliebige Anzahl verteilter Systeme Anwendungskomponenten bereitstellen. RAD Studio enthält verschiedene Methoden, die Sie beim Erstellen, Deployment und Verwenden von ASP.NET-Web-Services-Anwendungen unterstützen. Weitere grundlegende Informationen über Web-Services finden Sie in der Dokumentation zum Microsoft .NET SDK. 1.1 Datenbankanwendungen mit ADO.NET RAD Studio für .NET 1.1 Datenbankanwendungen mit ADO.NET entwickeln ADO.NET ist ein kohärentes Programmiermodell, das den Datenzugriff innerhalb des .NET Framework bereitstellt. Neben der Unterstützung für MS SQL, Oracle und OLE DB-Verbindungskomponenten, die bereits im .NET Framework verankert ist, enthält RAD Studio Datenprovider für .NET (AdoDbxClient-Provider). AdoDbx ermöglicht einen Zugriff auf MS SQL, Oracle, DB2 und Interbase. Mit den AdoDbx-Komponentendesignern wird die Generierung und Konfiguration von AdoDbx-Komponenten vereinfacht. Sie können problemlos neue VCL-Formularanwendungen für das .NET Framework erstellen oder vorhandene Win32-VCL-Formularanwendungen zum .NET Framework migrieren, da die konventionellen Delphi-Datenbanktechnologien wie dbExpress und dbGo in RAD Studio weiterhin unterstützt werden. Dieser Abschnitt gibt einen Überblick über die Verwendung von RAD Studio mit der ADO.NET-Architektur und die VCL für .NET-Datenbanktechnologien. Themen Name Überblick über AdoDbx Client ( Beschreibung see page 6) AdoDbx Client implementiert einen ADO.NET 2.0-Provider für alle Treiber von dbExpress Version 4. Dieser Provider unterstützt die neueren erweiterten Metadaten von dbExpress 4. Alle mit Delphi ausgelieferten dbExpress-Treiber implementieren die neueren erweiterten Meatdaten. AdoDbx Client ist eine Implementierung der ADO.NET 2.0-Provider-Klassen. ADO.NET Provider ist eine Gruppe von Klassen, die Datenbankdienste für .NET bereitstellen. Sie ermöglichen den Zugriff auf relationale Datenbanken, XML und Anwendungsdaten. Sie können mit ADO.NET Frontend-Datenbankanwendungen genauso wie mehrschichtige Geschäftsanwendungen erstellen. Weitere Informationen finden Sie unter .NET Framework Developer's Guide ADO.NET in der Microsoft-Dokumentation. Im Folgenden finden Sie die Hauptklassen der AdoDbx Client-ADO.NET-Implementierung. • TAdoDbxCommand. Repräsentiert eine SQL-Anweisung oder... more ( see page 6) VCL für .NET-Datenbanktechnologien ( see page 7) In den meisten Fällen stellt der AdoDbxClient-Provider die ideale Lösung dar, um in einer .NET-Anwendung die Verbindung zur Datenbank zu implementieren. Zur Erstellung neuer VCL-Formulare-Anwendungen für das .NET Framework oder zum Migrieren vorhandener Win32-VCL-Formulare-Anwendungen in das .NET Framework unterstützt RAD Studio aber weiterhin die Datenbanktechnologien von Delphi. RAD Studio ermöglicht die Migration von Delphi-Datenbanktechnologien für Win32-Clients auf das .NET Framework. Sie können also nicht nur neue Datenbankanwendungen mit ADO.NET erstellen, sondern auch vorhandene migrieren. RAD Studio unterstützt die folgenden Datenbanktechnologien von Delphi: • dbExpress.NET • DataSnap .NET Client (DCOM) • IBX.NET (InterBase für .NET) • ADO.NET • dbGo 3 1 RAD Studio für .NET AdoDbx.NET-Datentypen ( see page 12) 1.1 Datenbankanwendungen mit ADO.NET AdoDbx Client-Datentypen entsprechen logischen .NET-Typen. Je nach Datenbanktyp bilden die AdoDbx Client-Datentypen die nativen Datentypen ab. Sofern verfügbar, sorgt AdoDbx Client für: • Eine konsistente Datentypzuordnung zwischen den Datenbanken. • Eine Zuordnung logischer Datentypen zu nativen .NET-Typen. Überblick zu ADO.NET ( see page 15) 1 BDP-Migration: Überblick ( see page 18) ADO.NET ist die .NET-Programmierumgebung für das Erstellen von Datenbankanwendungen, die auf nativen Datenbankformaten oder auf XML basieren. ADO.NET dient als Backend-Datenspeicher für alle Microsoft .NET-Programmiermodelle, einschließlich Web Forms und Web Services. Sie verwenden ADO.NET, um die Daten im .NET Framework zu verwalten. Anmerkung: BDP.NET basiert auf ADO.NET 1.1. AdoDbx Client basiert auf .NET 2.0. Mit den Borland-Datenprovidern für .NET (BDP.NET) und AdoDbx Client lässt sich die ADO.NET-Entwicklung beschleunigen. Wenn Ihnen die Konzepte des Rapid Application Development (RAD) und der objektorientierten Programmierung (OOP) mit Eigenschaften, Methoden und Ereignissen bereits bekannt sind, werden Sie keine größeren Probleme mit dem ADO.NET-Modell zum Erstellen... more ( see page 15) BDP (Borland Daten-Provider) ist veraltet und Sie sollten BDP nicht für neue Entwicklungen verwenden. Verwenden Sie stattdessen AdoDbx Client. Dieses Thema beschreibt die Unterschiede und Äquivalenzen zwischen BDP und AdoDbx Client. Auswirkungen der Abschaffung von BDP: • BDP wird in einem künftigen Release aus dem Produkt entfernt. • Es wird keine Weiterentwicklung von BDP und nur ein minimaler QS-Aufwand vorgenommen werden. Es werden nur kritische Fehler behoben werden. • Es wird keine weitere Dokumentation bereitgestellt, obwohl die Dokumentation noch nicht entfernt wird. BDP basierte auf ADO.NET 1.1. Viele der abweichenden Features von BDP, wie z.B. die Provider-Unabhängigkeit und erweiterte Metadaten, wurden zu ADO.NET... more ( see page 18) 4 1.1 Datenbankanwendungen mit ADO.NET Blackfish SQL - Überblick ( RAD Studio für .NET see page 21) Design und Implementierung von Blackfish SQL sind auf Leistung, Skalierbarkeit, einfache Verwendung und strenge Kompatibilität mit Industriestandards ausgerichtet. Blackfish SQL hat folgende Eigenschaften: • Kompatibilität mit Industriestandards • Unterstützung von SQL-92 • Unicode-Speicherung von Zeichendaten • Unicode-basierende Sortierfolge für Sortierung und Indizierung • dbExpress 4-Treiber für Win32-Delphi und -C++ • ADO.NET 2.0-Provider für .NET • JDBC für Java 1 • JavaBean-Datenzugriffskomponenten für Java • Verteilte XA/JTATransaktionen für Java • Hohe Leistung und Skalierbarkeit für Anwendungen mit anspruchsvoller Transaktionsverarbeitung (OLTP) und Entscheidungsunterstützung (DSS) • Stored Procedures und Trigger für Delphi, C# und VB.NET unter Windows • Stored Procedures und Trigger für Java • Keine Administration erforderlich; Deployment in Form einer einzigen Assembly oder Jar-Datei • Inkrementelles... more ( ADO.NET-Komponentendesigner ( see page 23) Deployment von Datenbankanwendungen für das .NET Framework ( 27) Datenprovider für Microsoft .NET ( see page 28) see page 21) Fast alle verteilten Anwendungen müssen in der Lage sein, Informationen in Datenbanken zu lesen und zu aktualisieren. Je nachdem, welche Anwendung Sie mit ADO.NET entwickeln, werden verschiedene Anforderungen an die Arbeit mit den Daten gestellt. Es kann zum Beispiel sein, dass Sie eine einfache Anwendung entwickeln möchten, die lediglich Daten in einem Formular anzeigt. Oder Sie möchten eine Anwendung entwickeln, die es ermöglicht, Daten mit einem anderen Unternehmen auszutauschen. In jedem Fall ist es unumgänglich, die grundlegenden Konzepte zur Arbeit mit Daten in ADO.NET zu kennen. Mit diesen Designern können Sie unter Verwendung serverspezifischer Schemaobjekte von Datenbanken, wie Tabellen, Ansichten... more ( see page 23) see page Wenn Sie Datenbankanwendungen mit RAD Studio weitergeben, kopieren Sie die Assemblierungen und Treiber-DLLs, die zur Laufzeit erforderlich sind, in ein Verzeichnis für das Deployment. Im Folgenden werden die Namen dieser Assemblierungen und DLLs aufgeführt und der jeweilige Speicherort angegeben. Zusätzlich zur Unterstützung der .NET Framework-Provider sind in RAD Studio AdoDbxClient-Provider für Microsoft .NET enthalten. AdoDbx Client ist eine Implementierung des .NET-Providers und stellt Verbindungen zu verschiedenen bekannten Datenbanken her. In diesem Thema wird Folgendes behandelt: • Datenprovider-Architektur • Vorteile von AdoDbx Client • AdoDbx Client und ADO.NET-Komponenten • Unterstützte AdoDbx Client-Provider • AdoDbx Client-Datentypen • AdoDbx Client-Interfaces 5 Überblick über AdoDbx Client Überblick zu Stored Procedures ( dbExpress-Framework ( RAD Studio für .NET see page 31) see page 32) Einführung in InterBase Express ( Alle relationalen Datenbanken verfügen über bestimmte gemeinsame Funktionsmerkmale, die es den Anwendungen ermöglichen, Daten zu speichern und zu bearbeiten. Stored Procedures sind eigenständige Programme, die jeweils in einer datenbanksystemspezifischen Sprache geschrieben wurden. In der Regel dienen sie zur Bearbeitung häufig auftretender datenbankbezogener Aufgaben und sind besonders bei der Verarbeitung von großen Datensatzmengen oder bei Verwendung von Zusammenfassungs- oder mathematischen Funktionen hilfreich. Stored Procedures werden normalerweise auf dem Datenbankserver gespeichert. Stored Procedures werden ähnlich aufgerufen wie SQL-Anweisungen. Das Bearbeiten und Erstellen von Stored Procedures in RAD Studio erfolgt daher mit den Verfahren, die auch für SQL-Anweisungstext verwendet werden. Mit Hilfe von... more ( see page 31) Das dbExpress-Framework (DBX-Framework) ist eine Menge abstrakter Klassen, die in der Unit DBXCommon bereitgestellt sind.. Anwendungen können mit dem Framework über verschiedene Wege in Verbindung treten: Sie können das Framework direkt oder die dbExpress VCL-Komponenten, die sich in der oberen Schicht des Framework befinden, für native und verwaltete Anwendungen einsetzen. Obwohl viele Anwendungen mit dbExpress-Treibern über die dbExpress VCL-Komponenten in Verbindung treten, bietet das DBX-Framework eine bequeme, einfachere Option für die Kommunikation mit einem Datenbanktreiber. Sie können auch für dbExpress einen Datenbanktreiber erstellen, indem Sie die abstrakten DBXCommon-Basisklassen des Framework erweitern. Das DBX-Framework stellt die gebräuchlichste Datenbanktreiberfunktionalität für eine "mengenorientierte"... more ( see page 32) 1 dbExpress Framework-Kompatibilität ( 1.1 Datenbankanwendungen mit ADO.NET see page 34) see page 35) Teile der dbExpress-Software, die vor dem Erscheinen des dbExpress-Treiber-Framework (DBX-Treiber-Framework) entwickelt wurden, mussten für die Zusammenarbeit mit dem DBX-Treiber-Framework verändert werden. Dies hat zu einigen Kompatibilitätsproblemen geführt. InterBase Express (IBX) besteht aus Komponenten, mit denen auf die Daten von InterBase-Datenbanken zugegriffen werden kann. Die InterBase-Verwaltungskomponenten, für die InterBase 6 erforderlich ist, werden nach den InterBase-Datenzugriffskomponenten beschrieben. 1.1.1 Überblick über AdoDbx Client AdoDbx Client implementiert einen ADO.NET 2.0-Provider für alle Treiber von dbExpress Version 4. Dieser Provider unterstützt die neueren erweiterten Metadaten von dbExpress 4. Alle mit Delphi ausgelieferten dbExpress-Treiber implementieren die neueren erweiterten Meatdaten. AdoDbx Client ist eine Implementierung der ADO.NET 2.0-Provider-Klassen. ADO.NET Provider ist eine Gruppe von Klassen, die Datenbankdienste für .NET bereitstellen. Sie ermöglichen den Zugriff auf relationale Datenbanken, XML und Anwendungsdaten. Sie können mit ADO.NET Frontend-Datenbankanwendungen genauso wie mehrschichtige Geschäftsanwendungen erstellen. Weitere Informationen finden Sie unter .NET Framework Developer's Guide ADO.NET in der Microsoft-Dokumentation. Im Folgenden finden Sie die Hauptklassen der AdoDbx Client-ADO.NET-Implementierung. • TAdoDbxCommand. Repräsentiert eine SQL-Anweisung oder Stored Procedure, die mit einer Datenquelle ausgeführt wird. • TAdoDbxCommandBuilder. Erzeugt Einzeltabellenbefehle als Teil der Funktionsweise des TAdoDbxDataAdapter. • TAdoDbxConnection. Repräsentiert ein Verbindung mit einer Datenbank. • TAdoDbxDataAdapter. Fungiert als eine Brücke zwischen einer Datenmenge und der zugrunde liegenden Datenbank. • TAdoDbxDataReader. Klasse nur zum Vorwärts-Lesen von Zeilen in einer Datenquelle. • TAdoDbxParameter. Repräsentiert einen Parameter, der von einem Befehl übernommen oder an einen Befehl übergeben wird. • TAdoDbxParameterCollection. Stellt TAdoDbxParameter in einem .NET-Kollektionsobjekt zusammen, das gelesen und bearbeitet werden kann. 6 1.1 Datenbankanwendungen mit ADO.NET RAD Studio für .NET VCL für .NET-Datenbanktechnologien • TAdoDbxProviderFactory. Basisklasse für eine Implementierung von Datenquellenklassen eines Providers. • TAdoDbxTransaction. Ein Gruppe von Befehlen für eine Verbindung, die übergeben oder zurückgesetzt werden kann. Siehe auch Überblick zu ADO.NET ( see page 15) .NET Framework Developer's Guide ADO.NET (MSDN) Verbinden mit AdoDbx Client ( see page 119) Deployment von AdoDbx Client TAdoDbxCommand TAdoDbxCommandBuilder 1 TAdoDbxConnection TAdoDbxDataAdapter TAdoDbxDataReader TAdoDbxParameter TAdoDbxParameterCollection TAdoDbxProviderFactory TAdoDbxTransaction 1.1.2 VCL für .NET-Datenbanktechnologien In den meisten Fällen stellt der AdoDbxClient-Provider die ideale Lösung dar, um in einer .NET-Anwendung die Verbindung zur Datenbank zu implementieren. Zur Erstellung neuer VCL-Formulare-Anwendungen für das .NET Framework oder zum Migrieren vorhandener Win32-VCL-Formulare-Anwendungen in das .NET Framework unterstützt RAD Studio aber weiterhin die Datenbanktechnologien von Delphi. RAD Studio ermöglicht die Migration von Delphi-Datenbanktechnologien für Win32-Clients auf das .NET Framework. Sie können also nicht nur neue Datenbankanwendungen mit ADO.NET erstellen, sondern auch vorhandene migrieren. RAD Studio unterstützt die folgenden Datenbanktechnologien von Delphi: • dbExpress.NET • DataSnap .NET Client (DCOM) • IBX.NET (InterBase für .NET) • ADO.NET • dbGo .NET-Anwendungen mit dbExpress.NET erstellen RAD Studio unterstützt eine .NET-Version von dbExpress. Diese Gruppe von Komponenten bietet in etwa die Funktionalität von dbExpress für Win32, wurde aber für die Ausführung in VCL-Formulare im .NET Framework aktualisiert. Wie die früheren Versionen des Produkts unterstützt auch dbExpress für .NET unidirektionale Datenmengen und die Erstellung kompakter Client-Anwendungen. .NET-Anwendungen mit dem DataSnap .NET-Client (DCOM) erstellen In dreischichtigen Anwendungen unterstützt RAD Studio den Datenbankzugriff über den DataSnap-Client (DCOM). 7 VCL für .NET-Datenbanktechnologien RAD Studio für .NET 1.1 Datenbankanwendungen mit ADO.NET .NET-Anwendungen mit IBX.NET erstellen RAD Studio ermöglicht den Zugriff auf InterBase-Datenbanken über InterBase Express-Steuerelemente. Außerdem kann über den BDP.NET-Standarddatenadapter und die ADO.NET-Provider des .NET Framework auf diesen Datenbanktyp zugegriffen werden. Mit Hilfe von IBX.NET-Steuerelementen können Sie eine Verbindung zu einer InterBase-Datenbank aufbauen und auf Tabellen zugreifen usw. NET-Anwendungen mit dem AdoDbxClient-Provider erstellen AdoDbx ist Datenzugriffsmechanismus, der von mehreren Anwendungen gemeinsam genutzt werden kann. AdoDbx definiert eine leistungsfähige Bibliothek von API-Aufrufen, mit denen Daten erstellt, neu strukturiert, von lokalen und externen Datenbankservern abgerufen, aktualisiert und auf andere Weise bearbeitet werden können. Ado stellt eine einheitliche Schnittstelle für den Zugriff auf eine Vielzahl von Datenbankservern zur Verfügung. 1 In RAD Studio-Datenbankanwendungen kann auf BDE-basierte Datenbanken wie Paradox und dBase zugegriffen werden. .NET-Anwendungen mit dbGo erstellen RAD Studio unterstützt eine .NET-Version von dbGo. Diese Gruppe von Komponenten bietet in etwa die Funktionalität von dbGo für Win32, wurde aber für die Ausführung in VCL-Formulare im .NET Framework aktualisiert. dbGo für .NET unterstützt dasselbe leistungsstarke und logische Objektmodell wie die früheren Versionen des Produkts. Themen Name Überblick zum BDP-Verbindungs-Pooling ( Beschreibung see page 9) Verbindungen können aus einem Verbindungs-Pool ausgewählt werden. Dies führt zu kürzeren Verbindungszeiten. Bei Verwendung von BDP werden alle Verbindungen vom BDP-Pool-Manager verwaltet. Dies ist auch dann der Fall, wenn Sie das Pooling für Ihre Verbindung nicht aktiviert haben. Sie können für jede Verbindung das Pooling aktivieren oder deaktivieren, die minimale und maximale Pool-Größe festlegen, die Vergrößerung des Pools bei Verbindungsanforderungen aktivieren und deaktivieren und einen Zeitüberschreitungswert bzw. eine Lebensdauer in Sekunden vorgeben. Wie die obige Abbildung zeigt, erstellt der BDP-Pool-Manager für jeden eindeutigen Verbindungsstring einen eigenen Pool. Die folgenden Verbindungsoptionen stehen zur Verfügung: 8 1.1 Datenbankanwendungen mit ADO.NET Überblick zu dbExpress-Komponenten ( Überblick zu dbGo-Komponenten ( see page 10) see page 11) RAD Studio für .NET VCL für .NET-Datenbanktechnologien dbExpress setzt sich aus mehreren "schlanken" Datenbanktreibern zusammen, die schnellen Zugriff auf SQL-Datenbankserver bieten. dbExpress stellt für jede unterstützte Datenbank einen Treiber zur Verfügung, der die serverspezifische Software an eine Menge einheitlicher dbExpress-Interfaces anpasst. Wenn Sie eine Datenbankanwendung weitergeben, die dbExpress verwendet, müssen Sie evtl. eine DLL (den serverspezifischen Treiber) in die von Ihnen erstellten Anwendungsdateien aufnehmen. Zum Beispiel ist DbxClient ein 100%iger Delphi-Treiber und benötigt keine DLL. dbExpress ermöglicht Ihnen den schnellen Zugriff auf Datenbanken unter Verwendung unidirektionaler Datenmengen. Unidirektionale Datenmengen sind auf schnellen, unaufwendigen Zugriff auf Datenbankinformation ausgelegt, wobei nur ein minimaler Zusatzaufwand entsteht. Wie andere Datenmengen... more ( see page 10) dbGo ist ein leistungsstarkes und logisches Objektmodell, mit dem Daten aus einer Vielzahl von Datenquellen über Microsoft ADO-Schnittstellen abgerufen, bearbeitet und aktualisiert werden können. Meist wird dbGo eingesetzt, um Abfragen für Tabellen einer relationalen Datenbank zu stellen, die Ergebnisse abzurufen und in einer Anwendung anzuzeigen und Benutzern die Möglichkeit zu geben, Änderungen an den Daten vorzunehmen und zu speichern. Die ADO-Schicht einer ADO-Anwendung basiert auf der neuesten Version von Microsoft ADO, einem OLE DB-Provider bzw. ODBC-Treiber für den Zugriff auf einen Datenspeicher, spezifischer Client-Software für das verwendete Datenbanksystem (bei SQL-Datenbanken), einem Back-End-System für Datenbanken, auf das die Anwendung zugreifen kann... more ( see page 11) 1.1.2.1 Überblick zum BDP-Verbindungs-Pooling Verbindungen können aus einem Verbindungs-Pool ausgewählt werden. Dies führt zu kürzeren Verbindungszeiten. Bei Verwendung von BDP werden alle Verbindungen vom BDP-Pool-Manager verwaltet. Dies ist auch dann der Fall, wenn Sie das Pooling für Ihre Verbindung nicht aktiviert haben. Sie können für jede Verbindung das Pooling aktivieren oder deaktivieren, die minimale und maximale Pool-Größe festlegen, die Vergrößerung des Pools bei Verbindungsanforderungen aktivieren und deaktivieren und einen Zeitüberschreitungswert bzw. eine Lebensdauer in Sekunden vorgeben. Wie die obige Abbildung zeigt, erstellt der BDP-Pool-Manager für jeden eindeutigen Verbindungsstring einen eigenen Pool. Die folgenden Verbindungsoptionen stehen zur Verfügung: Option Beschreibung MinPoolSize Die Mindestanzahl der Verbindungen, die im Verbindungs-Pool verwaltet werden. MaxPoolSize Die maximale Anzahl der Verbindungen, die im Verbindungs-Pool verwaltet werden können. Die Vorgabewert ist 100. Wenn GrowOnDemand auf False gesetzt und MaxPoolSize erreicht ist, führt jede weitere Verbindungsanforderung zu einer Exception. 9 1 VCL für .NET-Datenbanktechnologien GrowOnDemand RAD Studio für .NET 1.1 Datenbankanwendungen mit ADO.NET Legt fest, ob der Pool vergrößert wird, wenn MaxPoolSize erreicht ist und eine weitere Verbindungsanforderung eingeht. Verbindungen, für die GrowOnDemand auf True gesetzt ist, werden dem Pool nicht wieder zugeführt, sondern von BdpConnection.Close() freigegeben. ConnectionLifetime Die Lebensdauer einer Verbindung, für die das Pooling aktiviert ist. Wenn eine Verbindung wieder dem Pool zugeführt wird, erfolgt eine Überprüfung der Lebensdauer. Ist diese abgelaufen, wird die (Timeout) Verbindung nicht wieder in den Pool aufgenommen, sondern freigegeben. ConnectionLifetime wird in Sekunden angegeben. Voreingestellt ist der Wert 0. 1 1.1.2.2 Überblick zu dbExpress-Komponenten dbExpress setzt sich aus mehreren "schlanken" Datenbanktreibern zusammen, die schnellen Zugriff auf SQL-Datenbankserver bieten. dbExpress stellt für jede unterstützte Datenbank einen Treiber zur Verfügung, der die serverspezifische Software an eine Menge einheitlicher dbExpress-Interfaces anpasst. Wenn Sie eine Datenbankanwendung weitergeben, die dbExpress verwendet, müssen Sie evtl. eine DLL (den serverspezifischen Treiber) in die von Ihnen erstellten Anwendungsdateien aufnehmen. Zum Beispiel ist DbxClient ein 100%iger Delphi-Treiber und benötigt keine DLL. dbExpress ermöglicht Ihnen den schnellen Zugriff auf Datenbanken unter Verwendung unidirektionaler Datenmengen. Unidirektionale Datenmengen sind auf schnellen, unaufwendigen Zugriff auf Datenbankinformation ausgelegt, wobei nur ein minimaler Zusatzaufwand entsteht. Wie andere Datenmengen können sie einen SQL-Befehl an den Datenbankserver senden und, falls der Befehl mehrere Datensätze zurückgibt, einen Reader für den Zugriff auf diese Datensätze entgegennehmen. Unidirektionale Datenmengen können nur einen unidirektionalen Reader entgegennehmen. Sie nehmen keine Zwischenspeicherung der Daten vor, wodurch sie schneller und weniger ressourcenaufwendig als andere Datenmengentypen werden. Weil sie jedoch die Datensätze nicht zwischenspeichern, sind unidirektionale Datenmengen weniger flexibel als andere Datenmengen. dbExpress-Verbindungen, -Tabellen, -Ansichten und -Stored Procedures, die in einer Datenstrukturansicht angezeigt werden, lassen sich per Drag&Drop in native und verwaltete VCL-Formulare platzieren. Verbindungsstrings In dbExpress 4 werden alle Verbindungseigenschaften, auch ConnectionString, beim Verbinden an den Treiber übergeben. Mit Hilfe der Eigenschaft ConnectionString können in dbExpress alle Datenbankoptionen und Verbindungsinformationen (Datenbankname, Benutzername, Passwort) in einem einzelnen Verbindungsstring übergeben werden. Verbindungsstrings ermöglichen es außerdem, neue Eigenschaften für Treiber durch die Änderung eines Interface zu implementieren. Sie können die Eigenschaften für die aktuelle Verbindung in der Datei dbxconnections.ini laden, indem Sie mit der rechten Maustaste auf die Verbindung klicken und den entsprechenden Menübefehl wählen. Dadurch wird ein Parametereintrag generiert (Parameters['ConnectionString']), der alle Verbindungseigenschaften in der INI-Datei enthält. Sie können auf diese Weise der Datei dbxconnections.ini neue Eigenschaften hinzufügen, ohne den gesamten String manuell einzugeben. Das Kontextmenü für SqlConnection enthält einen Befehl zum Löschen des Verbindungsstrings. Der Befehl steht zur Verfügung, wenn die Eigenschaft ConnectionString zugewiesen ist. dbExpress-Komponenten Der dbExpress-Abschnitt der Tool-Palette Datenbankinformationen zugreifen: Komponente enthält die folgenden Komponenten, die mittels Funktion TSQLConnection Diese Komponente kapselt eine dbExpress-Verbindung zu einem Datenbankserver. 10 dbExpress auf 1.1 Datenbankanwendungen mit ADO.NET RAD Studio für .NET VCL für .NET-Datenbanktechnologien TSQLDataSet Diese Komponente wird verwendet, um alle über dbExpress verfügbaren Daten darzustellen oder um Befehle an eine Datenbank zu senden, auf die über dbExpress zugegriffen wird. TSQLQuery Hierbei handelt es sich um eine Abfrage-Datenmenge, die eine SQL-Anweisung kapselt und es Anwendungen ermöglicht, auf die Ergebnis-Datenmenge zuzugreifen. TSQLTable Dies ist eine Tabellen-Datenmenge, die alle Zeilen und Spalten einer einzelnen Datenbanktabelle darstellt. TSQLStoredProc Diese Komponente ist eine auf Stored Procedures basierende Datenmenge, die eine auf einem Datenbankserver definierte Stored Procedure ausführt. TSQLMonitor Diese Komponente fängt die zwischen einer SQL-Verbindungskomponente und einem Datenbankserver gesendeten Informationen ab und speichert diese in einer Stringliste. TSimpleDataSet Hierbei handelt es sich um eine Client-Datenmenge, die interne Objekte des Typs TSQLDataSet und TDataSetProvider verwendet, um Daten abzurufen und Aktualisierungen einzutragen. Siehe auch Überblick zu VCL für .NET ( see page 77) VCL-Anwendungen portieren ( see page 75) Deployment von Datenbankanwendungen für das .NET Framework dbExpress.NET-Datenbankanwendungen mit VCL-Formularen erstellen ( see page 167) 1.1.2.3 Überblick zu dbGo-Komponenten dbGo ist ein leistungsstarkes und logisches Objektmodell, mit dem Daten aus einer Vielzahl von Datenquellen über Microsoft ADO-Schnittstellen abgerufen, bearbeitet und aktualisiert werden können. Meist wird dbGo eingesetzt, um Abfragen für Tabellen einer relationalen Datenbank zu stellen, die Ergebnisse abzurufen und in einer Anwendung anzuzeigen und Benutzern die Möglichkeit zu geben, Änderungen an den Daten vorzunehmen und zu speichern. Die ADO-Schicht einer ADO-Anwendung basiert auf der neuesten Version von Microsoft ADO, einem OLE DB-Provider bzw. ODBC-Treiber für den Zugriff auf einen Datenspeicher, spezifischer Client-Software für das verwendete Datenbanksystem (bei SQL-Datenbanken), einem Back-End-System für Datenbanken, auf das die Anwendung zugreifen kann (bei SQL-Datenbanken), sowie einer Datenbank. Diese Elemente müssen für die ADO-Anwendung ohne Einschränkung verfügbar sein, damit diese voll funktionsfähig ist. Microsoft Data Access Components (MDAC) 2.1 und höher enthält diese erforderlichen Elemente. RAD Studio unterstützt MDAC 2.8. Der dbGo-Abschnitt der Tool-Palette enthält die folgenden Komponenten, die über dbGo auf Datenbankinformationen zugreifen: Komponente Funktion TADOConnection Diese Komponente kapselt eine dbGo-Verbindung zu einem Datenbankserver. TADODataSet Diese Komponente wird verwendet, um alle über dbGo verfügbaren Daten darzustellen oder um Befehle an eine Datenbank zu senden, auf die über dbGo zugegriffen wird. TADOQuery Hierbei handelt es sich um eine Abfrage-Datenmenge, die eine SQL-Anweisung kapselt und es Anwendungen ermöglicht, auf die resultierenden Datensätze (sofern vorhanden) in einem ADO-Datenspeicher zuzugreifen. TADOTable Dies ist eine Tabellen-Datenmenge, die alle Zeilen und Spalten einer einzelnen Datenbanktabelle darstellt. TADOStoredProc Diese Komponente ist eine auf Stored Procedures basierende Datenmenge, die eine auf einem Datenbankserver definierte Stored Procedure ausführt. TADOCommand Diese Komponente repräsentiert ein ADO-Befehlsobjekt, mit dem Anweisungen für einen Datenspeicher ausgeführt werden können, auf den über einen ADO-Provider zugegriffen wird. 11 1 AdoDbx.NET-Datentypen TADODataSet RAD Studio für .NET 1.1 Datenbankanwendungen mit ADO.NET Diese Komponente repräsentiert eine Datenmenge, die von einem ADO-Datenspeicher abgerufen wurde. TRDSConnection Diese Komponente stellt die Funktionalität des RDS DataSpace-Objekts bereit. Siehe auch Überblick zu VCL für .NET ( see page 77) VCL-Anwendungen portieren ( see page 75) Deployment von Datenbankanwendungen für das .NET Framework ADO.NET-Datenbankanwendungen mit VCL-Formularen erstellen ( see page 161) 1 1.1.3 AdoDbx.NET-Datentypen AdoDbx Client-Datentypen entsprechen logischen .NET-Typen. Je nach Datenbanktyp bilden die AdoDbx Client-Datentypen die nativen Datentypen ab. Sofern verfügbar, sorgt AdoDbx Client für: • Eine konsistente Datentypzuordnung zwischen den Datenbanken. • Eine Zuordnung logischer Datentypen zu nativen .NET-Typen. AdoDbx und das .NET Framework Die Klasse DataSet in ADO.NET verwendet die Datentypen des .NET Framework. Die AdoDbx Client-Datentypen ordnen die .NET-Datentypen für unterstützte Datenbanken logisch zu. Sie können zur Entwurfszeit mit den logischen AdoDbx Client-Typen arbeiten, die dann den entsprechenden nativen Typen zugeordnet werden. Datentypen Das .NET Framework enthält ein breites Spektrum logischer Datentypen. AdoDbx Client erbt logische Datentypen und sorgt intern für eine den unterstützten Datenbanken entsprechende Zuordnung der Datentypen. AdoDbx Client unterstützt die Zuordnung logischer Datentypen für DB2, InterBase, MS SQL, MSDE und Oracle. DB2 AdoDbx Client unterstützt folgende DB2-Typzuordnungen. 12 DB2-Typ Bdp-Typ Bdp-Untertyp System-Typ CHAR String stFixed String VARCHAR String NV String SMALLINT Int16 NV Int16 BIGINT Int64 NV Int64 INTEGER Int32 NV Int32 DOUBLE Double NV Double FLOAT Float NV Single REAL Float NV Single DATE Date NV DateTime TIME Time NV DateTime TIMESTAMP Datetime NV DateTime NUMERIC Decimal NV Decimal 1.1 Datenbankanwendungen mit ADO.NET RAD Studio für .NET AdoDbx.NET-Datentypen DECIMAL Decimal NV Decimal BLOB Blob stBinary Byte[] CLOB Blob stMemo Char[] InterBase AdoDbx Client unterstützt folgende InterBase-Typzuordnungen. InterBase-Typ Bdp-Typ Bdp-Untertyp System-Typ CHAR String stFixed String VARCHAR String NV String SMALLINT Int16 NV Int16 INTEGER Int32 NV Int32 FLOAT Float NV Single DOUBLE Double NV Double BLOB Sub_Type 0 Blob stBinary Byte[] BLOB Sub_Type 1 Blob stMemo Char[] TIMESTAMP Datetime NV DateTime 1 MS SQL und MSDE AdoDbx Client unterstützt folgende Typzuordnungen für MS SQL und MSDE. MSSQL-Typ Bdp-Typ Bdp-Untertyp System-Typ BIGINT Int64 NV Int64 INT Int32 NV Int32 SMALLINT Int16 NV Int16 TINYINT Int16 NV Int16 BIT Boolean NV Boolean DECIMAL Decimal NV Decimal NUMERIC Decimal NV Decimal MONEY Decimal NV Decimal SMALLMONEY Decimal NV Decimal FLOAT Double NV Double REAL Float NV Single DATETIME DateTime NV DateTime SMALLDATETIME DateTime NV DateTime CHAR String stFixed String VARCHAR String NV String TEXT Blob stMemo Char[] BINARY VarBytes NV Byte[] VARBINARY VarBytes NV Byte[] IMAGE Blob stBinary Byte[] 13 AdoDbx.NET-Datentypen RAD Studio für .NET 1.1 Datenbankanwendungen mit ADO.NET TIMESTAMP VarBytes NV Byte[] UNIQUEIDENTIFIER Guid NV Guid Oracle AdoDbx Client unterstützt die folgenden Oracle-Typzuordnungen. 1 Oracle-Typ Bdp-Typ Bdp-Untertyp System-Typ CHAR String stFixed String NCHAR String stFixed String VARCHAR String NV String NVARCHAR String NV String VARCHAR2 String NV String NVARCHAR2 String NV String NUMBER Decimal NV Decimal DATE Date NV DateTime BLOB Blob stHBinary Byte[] CLOB Blob stHMemo Char[] LONG Blob stMemo Char[] LONG RAW Blob stBinary Byte[] BFILE Blob stBFile Char[] ROWID String NV String Sybase AdoDbx Client unterstützt folgende Sybase-Typzuordnungen. 14 Sybase-Typ Bdp-Typ Bdp-Untertyp System-Typ CHAR String stFixed String VARCHAR String NV String INT Int32 NV Int32 SMALLINT Int16 NV Int16 TINYINT Int16 NV Int16 DOUBLE PRECISION Float NV Single FLOAT Float NV Single REAL Float NV Single NUMERIC Decimal NV Decimal DECIMAL Decimal NV Decimal SMALLMONEY Decimal NV Decimal MONEY Decimal NV Decimal SMALLDATETIME DateTime NV DateTime DATETIME DateTime NV DateTime IMAGE Blob stBinary Byte[] 1.1 Datenbankanwendungen mit ADO.NET RAD Studio für .NET Überblick zu ADO.NET TEXT Blob stMemo Char[] BIT Boolean NV Boolean TIMESTAMP VarBytes NV Byte[] BINARY Bytes NV Byte[] VARBINARY VarBytes NV Byte[] SYSNAME String NV String Siehe auch Überblick zu ADO.NET ( see page 15) 1 1.1.4 Überblick zu ADO.NET ADO.NET ist die .NET-Programmierumgebung für das Erstellen von Datenbankanwendungen, die auf nativen Datenbankformaten oder auf XML basieren. ADO.NET dient als Backend-Datenspeicher für alle Microsoft .NET-Programmiermodelle, einschließlich Web Forms und Web Services. Sie verwenden ADO.NET, um die Daten im .NET Framework zu verwalten. Anmerkung: BDP.NET basiert auf ADO.NET 1.1. AdoDbx Client basiert auf .NET 2.0. Mit den Borland-Datenprovidern für .NET (BDP.NET) und AdoDbx Client lässt sich die ADO.NET-Entwicklung beschleunigen. Wenn Ihnen die Konzepte des Rapid Application Development (RAD) und der objektorientierten Programmierung (OOP) mit Eigenschaften, Methoden und Ereignissen bereits bekannt sind, werden Sie keine größeren Probleme mit dem ADO.NET-Modell zum Erstellen von Anwendungen haben. Für traditionelle Datenbankentwickler stehen auch in ADO.NET die bekannten Konzepte von Tabellen, Zeilen und Spalten mit relationaler Navigation bereit. XML-Programmierer werden es vermutlich vorziehen, mit denselben Daten mittels Knoten, über-, gleich- und untergeordneten Elementen umzugehen. Dieses Thema beschreibt die wichtigsten Komponenten der ADO.NET-Architektur, die Integration von ADO.NET in andere Programmiermodelle des .NET Framework sowie die Leistungsmerkmale, die RAD Studio für die Unterstützung von ADO.NET bereitstellt. Folgende Bereiche werden behandelt: • Die Architektur von ADO.NET • ADO.NET-Benutzeroberflächen • BDP.NET-Namespace Die Architektur von ADO.NET Die beiden wichtigsten Komponenten der ADO.NET-Architektur sind der Datenprovider und die Datenmenge. Die Datenquelle 15 Überblick zu ADO.NET RAD Studio für .NET 1.1 Datenbankanwendungen mit ADO.NET repräsentiert die eigentliche Datenbank oder XML-Datei, der Datenprovider stellt die Verbindungen her und übergibt die Befehle und die Datenmenge (Objekt DataSet) stellt eine oder mehrere Datenquellen im Arbeitsspeicher dar. Weitere Informationen über das allgemeine Modell ADO.NET finden Sie in der Dokumentation des Microsoft .NET Framework SDK. Die Datenquelle Bei der Datenquelle muss es sich entweder um eine lokal oder extern vorliegende Datenbank oder um eine XML-Datei handeln. In der traditionellen Datenbankprogrammierung arbeitet der Entwickler üblicherweise direkt mit der Datenquelle und muss dabei mit den komplexen und oft unterschiedlichen Oberflächen einzelner Hersteller umgehen. Mit ADO.NET arbeitet der Datenbankentwickler immer mit demselben Satz von Komponenten, mit dessen Hilfe er auf die Datenquelle zugreift und Befehle an sie übergibt. 1 Die Datenprovider Die Datenprovider-Komponenten stellen eine Verbindung zur Datenbank oder den XML-Dateien her und halten dabei einzelne Implementierungsdetails im Hintergrund. Die Provider können Verbindungen zu einer oder mehreren Datenquellen herstellen, Befehle weitergeben und Daten in der Datenmenge bereitstellen. Das .NET Framework enthält Provider für MS SQL, OLE DB und Oracle. Neben den .NET-Providern stehen in diesem Produkt AdoDbx Client and BDP.NET zur Verfügung. Diese bieten die Möglichkeit, unter Verwendung einer konsistenten Programmierumgebung Verbindungen zu verschiedenen Standarddatenbanken herzustellen. Weitere Informationen finden Sie im Thema zu Borland-Datenprovidern für Microsoft .NET. Die Datenmenge Das Objekt DataSet bewahrt eine bestimmte Datenmenge, zum Beispiel Tabellen und Beziehungen aus einer oder mehreren Datenquellen, im Arbeitsspeicher. Das DataSet-Objekt ist also eine Art temporärer Arbeitsbereich oder virtueller Notizblock für die Bearbeitung von Daten. ADO.NET-Anwendungen manipulieren Datentabellen zunächst im Arbeitsspeicher und nicht in der eigentlichen Datenbank. Das DataSet-Objekt stellt - über direkte Verbindungen zu physischen Datenbanken hinaus - zusätzliche Flexibilität bereit. Ähnlich wie das von vielen Datenbanksystemen unterstützte Datenmengenobjekt kann auch das DataSet-Objekt mehrere DataTable-Objekte enthalten, die Tabellen oder Ansichten aus einer beliebigen Zahl von Datenquellen repräsentieren. Das DataSet-Objekt arbeitet asynchron in einem nicht mit den Datenbanken verbundenen Modus. Erst zu einem späteren Zeitpunkt werden dann die Befehle zur Aktualisierung der Datenquelle via Datenprovider übergeben. RAD Studio unterstützt zwei Arten von Datenmengen (DataSet-Objekten): Standarddatenmengen und typisierte Datenmengen. Eine Standarddatenmenge erhalten Sie, wenn Sie das DataSet-Objekt implizit definieren. Die Datenmenge basiert in diesem Fall auf dem Layout der Spalten in der Datenquelle, das zur Laufzeit entsprechend der Select-Anweisung geliefert wird. Typisierte Datenmengen bieten umfassendere Steuerungsmöglichkeiten bezüglich des Layouts der Daten, die von der Datenquelle abgerufen werden. Eine typisierte Datenmenge ist von einer DataSet-Klasse abgeleitet. Der Zugriff auf Tabellen und Spalten erfolgt bei typisierten Datenmengen nicht mit Hilfe entsprechender Methoden, sondern direkt über den Namen. Typisierte Datenmengen haben gegenüber Standarddatenmengen verschiedene Vorteile, etwa eine bessere Lesbarkeit, umfassendere Funktionen zur Code-Vervollständigung und die Möglichkeit, Datentypen zu erzwingen. Die Elemente typisierter Datenmengen werden bereits zur Compilierzeit und nicht erst zur Laufzeit auf Typübereinstimmung überprüft. Wenn Sie eine typisierte Datenmenge erstellen, werden einige neue Objekte erzeugt, auf die Sie über die Projektverwaltung zugreifen können. Hierzu gehören zwei Dateien, die entsprechend der Datenmenge benannt sind. Eine dieser Dateien ist eine XML-Datei mit der Erweiterung .xsd, die andere enthält Quelltext in der verwendeten Sprache. Alle Daten der Datenmenge, einschließlich der Tabellen- und Spaltendaten aus der Datenbankverbindung, werden in der .xsd-Datei gespeichert. Die Quelltextdatei wird basierend auf den XML-Daten in der .xsd-Datei erzeugt. Sie können die Struktur einer typisierten Datenmenge ändern, indem Sie Elemente in der .xsd-Datei modifizieren. Die Quelltextdatei wird dann beim Compilieren basierend auf den geänderten XML-Daten neu erstellt. Weitere Informationen zu Datenmengen finden Sie in der Dokumentation des Microsoft .NET Framework SDK. 16 1.1 Datenbankanwendungen mit ADO.NET RAD Studio für .NET BDP-Migration: Überblick ADO.NET-Benutzeroberflächen Der Datenzugriff über ADO.NET ist für alle Programmiermodelle in .NET verfügbar. Web Forms Die Web Forms in ASP.NET bieten eine komfortable Oberfläche für den Zugriff auf Datenbanken über das Web. ASP.NET verwendet ADO.NET, um die Funktionen des Datenzugriffs auszuführen. .NET, AdoDbx Client- und BDP.NET-Verbindungskomponenten vereinfachen das Zusammenspiel von Web Forms und ADO.NET. DB Web Controls unterstützen sowohl ADO.NET- als auch AdoDbx Client- und BDP.NET-Komponenten. Die Entwicklung von Webanwendungen wird dadurch wesentlich beschleunigt. Windows Forms 1 Windows Forms werden nicht mehr unterstützt. AdoDbx Client Namespace Die AdoDbx Client-Klassen sind unter dem Namespace Borland.Data.AdoDbxClientProvider zu finden. BDP.NET-Namespace Die BDP.NET-Klassen sind unter den Namespaces Borland.Data zu finden. BDP.NET-Namespace Namespace Beschreibung Borland.Data.Common Enthält Objekte, die allen Borland-Datenprovidern gemeinsam sind, einschließlich der Klassen Error und Exceptions, Datentypaufzählungen, Provideroptionen und Interfaces für die Entwicklung eigener Command-, Connection- und Cursor-Klassen. Borland.Data.Provider Enthält die wichtigsten BDP.NET-Klassen, wie BdpCommand, BdpConnection, BdpDataAdapter und andere Klassen, die Möglichkeiten zur Interaktion mit externen Datenquellen wie Oracle-, DB2-, Interbase- und MS SQL Server-Datenbanken bereitstellen. Borland.Data.Schema Enthält Interfaces für die Entwicklung eigener Klassen zur Manipulation von Datenbankschemen sowie verschiedene Typen und Enumeratoren zur Definition von Metadaten. Siehe auch Deployment von Anwendungen ASP.NET-Datenbankanwendung erstellen ( see page 187) ASP.NET-Anwendung mit Datenbanksteuerelementen erstellen 1 ( see page 189) ASP.NET-Anwendung mit Datenbanksteuerelementen erstellen 2 ( see page 191) ASP.NET-Anwendung mit Datenbanksteuerelementen erstellen 3 ( see page 192) ASP.NET-Datenbankanwendung erstellen ( Datenprovider für Microsoft .NET ( AdoDbx.NET-Datentypen ( see page 187) see page 28) see page 12) ADO.NET-Komponentendesigner ( see page 23) Typisierte Datenmengen verwenden ( Tabellenzuordnungen erstellen ( see page 143) see page 120) .NET Framework Developer's Guide ADO.NET (MSDN) 17 BDP-Migration: Überblick RAD Studio für .NET 1.1 Datenbankanwendungen mit ADO.NET 1.1.5 BDP-Migration: Überblick BDP (Borland Daten-Provider) ist veraltet und Sie sollten BDP nicht für neue Entwicklungen verwenden. Verwenden Sie stattdessen AdoDbx Client. Dieses Thema beschreibt die Unterschiede und Äquivalenzen zwischen BDP und AdoDbx Client. Auswirkungen der Abschaffung von BDP: • BDP wird in einem künftigen Release aus dem Produkt entfernt. • Es wird keine Weiterentwicklung von BDP und nur ein minimaler QS-Aufwand vorgenommen werden. Es werden nur kritische Fehler behoben werden. 1 • Es wird keine weitere Dokumentation bereitgestellt, obwohl die Dokumentation noch nicht entfernt wird. BDP basierte auf ADO.NET 1.1. Viele der abweichenden Features von BDP, wie z.B. die Provider-Unabhängigkeit und erweiterte Metadaten, wurden zu ADO.NET 2 mit unterschiedlichen Methoden hinzugefügt, die mit BDP nicht kompatibel sind. Außerdem verwendet ADO.NET 2 abstrakte Basisklassen und nicht mehr die ADO.NET 1.1-Interfaces. All dies machte eine Erweiterung von BDP auf ADO.NET 2.0 unmöglich. AdoDbx Client basiert auf ADO.NET 2.0 und stellt fast alle BDP-Funktionen bereit. BDP besteht aus drei Namespaces: BDP-Namespace Beschreibung Borland.Data.Common Enthält Objekte, die allen Borland-Datenprovidern gemeinsam sind, einschließlich der Klassen Error und Exceptions, Datentypaufzählungen, Provider-Optionen und Interfaces für die Entwicklung eigener Command-, Connection- und Cursor-Klassen. Borland.Data.Provider Enthält die wichtigsten BDP.NET-Klassen, wie BdpCommand, BdpConnection, BdpDataAdapter, BdpDataReader und andere Klassen, die Möglichkeiten zur Interaktion mit externen Datenquellen wie Oracle-, DB2-, Interbase- und MS SQL Server-Datenbanken bereitstellen. Borland.Data.Schema Enthält Interfaces für die Entwicklung eigener Klassen zur Manipulation von Datenbankschemen sowie verschiedene Typen und Enumeratoren zur Definition von Metadaten. Dieses Dokument beschreibt die Migration für alle drei Namespaces. Migration von Borland.Data.Provider Zwei Klassen in diesem Namespace stellen Daten-Remoting bereit und sind nicht veraltet, so dass keine Migration erforderlich ist: • DataHub • DataSync Korrespondierende Klassen in BDP und AdoDbx Client Die meisten BDP-Klassen in diesem Namespace sind Implementierungen der ADO.NET-Klassen. Diese Klassen sind auch in AdoDbx Client implementiert. Der meiste Quelltext, der diese Klassen verwendet, muss mit geringem Aufwand nach AdoDbx Client konvertiert werden. Die folgende Tabelle zeigt die Zuordnungen von Klassen in ADO.NET, BDP und AdoDbx Client: 18 ADO.NET BDP.NET ADODbx Client DbCommand BdpCommand TAdoDbxCommand DbCommandBuilder BdpCommandBuilder TAdoDbxCommandBuilder 1.1 Datenbankanwendungen mit ADO.NET RAD Studio für .NET BDP-Migration: Überblick DbConnection BdpConnection TAdoDbxConnection DbDataAdapter BdpDataAdapter TAdoDbxDataAdapter DbDataReader BdpDataReader TAdoDbxDataReader DbTransaction BdpTransaction TAdoDbxTransaction Die Konvertierung von BDP-Klassen in dieser Gruppe ist ziemlich einfach. Sehen Sie in der Dokumentation nach, ob die Methode, die Sie verwendet haben, in der korrespondierenden AdoDbx Client-Klasse unterstützt wird. Falls ja, müssen Sie wahrscheinlich gar nichts tun. Wenn die Methode nicht unterstützt wird, müssen Sie Ihren Quelltext ändern und die Methoden verwenden, die von AdoDbx Client oder von ADO.NET unterstützt werden. Die Klasse BdpDataReader greift beispielsweise auf Datenbankdatensätze zu. Die meisten Datenzugriffsmethoden dieser Klasse haben korrespondierende TAdoDbxDataReader.Methoden, wie im ISQLCursor-Abschnitt beschrieben. Mit BdpDataReader.GetSchemaTable können Cursor-Metadaten als Datentabelle abgerufen werden. Eine Beschreibung des Zugriffs auf Metadaten für AdoDbx Client finden Sie im Abschnitt ISQLExtendedMetaData und ISQLMetaData. BDP-Klassen ohne korrespondierende AdoDbx Client-Klassen Die Klasse BdpCopyTable hat in AdoDbx Client keine korrespondierende Klasse, daher ist dieses Feature in AdoDbx Client nicht verfügbar. Migration von Borland.Data.Common Dieser Namespace hat sieben Klassen und drei Interfaces. BdpConnectionString Die Klasse TAdoDbxConnection verfügt über die Eigenschaft ConnectionString. Diese Klasse unterstützt auch das Verbindungs-Pooling. BdpError und BdpErrorCollection Alle Fehler werden in AdoDbx Client in der Klasse TAdoDbxException als Exceptions behandelt, daher sind diese Klassen nicht erforderlich. BdpException, BdpParameter und BdpParameterCollection Diese Klassen sind Implementierungen der ADO.NET-Klassen. Diese Klassen sind auch in AdoDbx Client implementiert. Der meiste Quelltext, der diese Klassen verwendet, muss mit geringem Aufwand nach AdoDbx Client konvertiert werden. Die Konvertierung von BDP-Klassen in dieser Gruppe ist ziemlich einfach. Sehen Sie in der Dokumentation nach, ob die Methode, die Sie verwendet haben, in der korrespondierenden AdoDbx Client-Klasse unterstützt wird. Falls ja, müssen Sie wahrscheinlich gar nichts tun. Wenn die Methode nicht unterstützt wird, müssen Sie Ihren Quelltext ändern und die Methoden verwenden, die von AdoDbx Client oder von ADO.NET unterstützt werden. Die folgende Tabelle zeigt die Zuordnungen von Klassen in ADO.NET, BDP und AdoDbx Client: ADO.NET BDP.NET ADODbx Client DbException BdpException TAdoDbxException DbParameter BdpParameter TAdoDbxParameter DbParameterCollection BdpParameterCollection TAdoDbxParameterCollection 19 1 BDP-Migration: Überblick RAD Studio für .NET 1.1 Datenbankanwendungen mit ADO.NET DbResolver DbResolver ist eine Implementierung des ISQLResolver-Interface in dem Namespace Borland.Data.Schema (wird weiter unten in diesem Thema beschrieben). ISQLCommand, IAQLConnection und ISQLCursor Diese Interfaces werden hauptsächlich von Treiberentwicklern verwendet, und es gibt kein AdoDbx Client-Äquivalent. Sie müssen den Treiber erneut unter Verwendung des dbExpress-Frameworks schreiben. Migration von Borland.Data.Schema Diese Namespace enthält fünf Interfaces. 1 ISQLDataSource Die Methode GetProviders gibt eine Liste der Daten-Provider zurück. Ähnliches führt die Methode TAdoDbxProviderFactory.CreateDataSourceEnumerator aus, die einen Enumerator für alle Provider erstellt. Für die Methoden GetConnections und GetDbObjectTypes gibt es in AdoDbx Client keine Äquivalente. ISQLExtendedMetaData und ISQLMetaData Mit der Methode GetSchema in TAdoDbxConnection ermitteln Sie eine Metadatenkollektion. Der Parameter Name von GetSchema legt die Art der zu ermittelnden Metadaten fest. Die von DbConnection.GetSchema unterstützten Standardnamen werden in AdoDbx Client unterstützt. Zusätzlich können Sie eine der Namenskonstanten in der Klasse TDBXMetaDataCollectionName festlegen, um eine bestimmte Metadatenkollektion zu erhalten. Mit der korrespondierenden Klasse im Namespace DBXMetaDataNames lassen sich dann die für diese Metadatenkollektion gewünschten Spalteninformationen ermitteln. Um beispielsweise den Quelltext für Prozeduren in einer Datenbank zu ermitteln, verwenden Sie die Konstante ProcedureSources. Dadurch erhalten Sie eine Datentabelle mit Quelltextinformationen zu den Prozeduren. Über die DBXMetaDataNames-Klassen TDBXProcedureSourcesColumns und TDBXProcedureSourcesIndex mit der zurückgegebenen Datentabelle greifen Sie auf die Quelltextinformationen zu den Prozeduren per Namen oder Ordinalzahl zu. ISQLResolver Diese Klasse löst SQL-Anweisungen auf. Das nächste Analog ist die Klasse TAdoDbxDataAdapter für ISQLResolver-Methoden. Die folgende Tabelle zeigt die Eigenschaften, die mit Methoden korrespondieren. ISQLResolver TAdoDbxDataAdapter Methode GetDeleteSQL Eigenschaft DeleteCommand Methode GetInsertSQL Eigenschaft InsertCommand GetSelectSQL Eigenschaft SelectCommand GetUpdateSQL Eigenschaft UpdateCommand Das nächste Analog für ISQLResolver-Eigenschaften sind die Eigenschaften, die TAdoDbxCommandBuilder von der ADO.NET-Klasse DbCommandBuilder und einer TAdoDbxDataReader-Eigenschaft erbt. 20 ISQLResolver ADODbx Client Eigenschaft QuotePrefix Eigenschaft TAdoDbxCommandBuilder.QuotePrefix Eigenschaft QuoteSuffix Eigenschaft TAdoDbxCommandBuilder.QuoteSuffix Eigenschaft Row Eigenschaft TAdoDbxDataReader.Item 1.1 Datenbankanwendungen mit ADO.NET RAD Studio für .NET Blackfish SQL - Überblick ISQLSchemaCreate Dieses Interface ermöglicht das Erstellen eines Datenbankschemas in Ihrem eigenen Provider. Der AdoDbx Client stellt dieses Feature nicht bereit. Siehe auch Überblick zu ADO.NET ( see page 15) .NET Framework Developer's Guide ADO.NET (MSDN) TAdoDbxCommand TAdoDbxCommandBuilder 1 TAdoDbxConnection TAdoDbxDataAdapter TAdoDbxDataReader TAdoDbxException TAdoDbxParameter TAdoDbxParameterCollection TAdoDbxProviderFactory TAdoDbxTransaction TDBXMetaDataCollectionName 1.1.6 Blackfish SQL - Überblick Design und Implementierung von Blackfish SQL sind auf Leistung, Skalierbarkeit, einfache Verwendung und strenge Kompatibilität mit Industriestandards ausgerichtet. Blackfish SQL hat folgende Eigenschaften: • Kompatibilität mit Industriestandards • Unterstützung von SQL-92 • Unicode-Speicherung von Zeichendaten • Unicode-basierende Sortierfolge für Sortierung und Indizierung • dbExpress 4-Treiber für Win32-Delphi und -C++ • ADO.NET 2.0-Provider für .NET • JDBC für Java • JavaBean-Datenzugriffskomponenten für Java • Verteilte XA/JTATransaktionen für Java • Hohe Leistung und Skalierbarkeit für Anwendungen mit anspruchsvoller Transaktionsverarbeitung (OLTP) und Entscheidungsunterstützung (DSS) • Stored Procedures und Trigger für Delphi, C# und VB.NET unter Windows • Stored Procedures und Trigger für Java • Keine Administration erforderlich; Deployment in Form einer einzigen Assembly oder Jar-Datei 21 Blackfish SQL - Überblick RAD Studio für .NET 1.1 Datenbankanwendungen mit ADO.NET • Inkrementelles Backup und Failover der Datenbank Blackfish SQL-DataStore Blackfish SQL ist der Name sowohl des Produkts, als auch der zugehörigen Tools und des Dateiformats. Zu diesem Produkt gehört ein Package, das die Klasse DataStore sowie weitere Klassen enthält, deren Namen die Bezeichnung "DataStore" enthalten. ish Blackfish SQL für Windows und Blackfish SQL für Java sind äußerst kompatibel miteinander. Die Dateiformate von Blackfish SQL für Windows und Blackfish SQL für Java sind binär-kompatibel. Darüber hinaus sind auch die Datenbank-Clients und die -Server austauschbar. Windows-Clients können mit Java-Servern eine Verbindung herstellen, und Java-Clients mit Windows-Servern. Da die Blackfish SQL für Windows-Implementierung neuer als die für Java ist, werden einige der in Blackfish SQL für Java vorhandenen Funktionen noch nicht unterstützt. Die folgenden Funktionen werden nicht unterstützt: • ISQL SQL-Befehlszeileninterpreter 1 • Verfügbarkeitsfunktionen, darunter inkrementelles Backup und Failover • Grafische Bearbeitung administrativer Aufgaben • Zugriff auf Datei- und Objekt-Streams • Nachverfolgung und Auflösung von Einfüge-, Aktualisierungs- und Löschoperationen der untersten Ebene • Zugriff auf das Blackfish SQL-Dateisystemverzeichnis Blackfish SQL-Connectivity Dieser Abschnitt bietet eine Übersicht über die für Blackfish SQL für Windows und Blackfish SQL für Java verfügbaren Treiber. Hinweise, wie mit diesen Treibern eine Verbindung zu einer Blackfish SQL-Datenbank hergestellt werden kann, finden Sie im , Blackfish SQL Developer's Guide. Blackfish SQL für Windows-Connectivity Blackfish SQL für Windows stellt folgende Treiber bereit: • DBXClient: Dies ist ein Win32-dbExpress 4-Treiber, mit dessen Hilfe Delphi- und C++ Anwendungen unter Win32 eine Verbindung zu einem Remote-Server von Blackfish SQL für Windows oder Blackfish SQL für Java herstellen können. • Lokaler ADO.NET 2.0-Provider: Dies ist ein vollständig in verwaltetem Code geschriebener Treiber, mit dessen Hilfe .NET-Anwendungen eine Verbindung zu einem lokalen Server von Blackfish SQL für Windows herstellen können. Der lokale ADO.NET-Treiber wird, um die Leistung zu erhöhen, im gleichen Prozess ausgeführt wie der BlackFishSQL-Datenbank-Kernel. • Remote-ADO.NET 2.0-Provider: Dies ist ein vollständig in verwaltetem Code geschriebener Treiber, mit dessen Hilfe .NET-Anwendungen eine Verbindung zu einem Remote-Server von Blackfish SQL für Windows oder Blackfish SQL herstellen können. Blackfish SQL für Java-Connectivity Blackfish SQL für Java stellt folgende JDBC-Treiber bereit: • Lokaler JDBC-Treiber : Dies ist ein vollständig in verwaltetem Code geschriebener Treiber, mit dessen Hilfe Java-Anwendungen eine Verbindung zu einem lokalen Server von Blackfish SQL für Java herstellen können. Der lokale JDBC-Treiber wird, um die Leistung zu erhöhen, im gleichen Prozess ausgeführt wie der BlackFishSQL-Datenbank-Kernel. • Remote-JDBC-Treiber: Dies ist ein vollständig in verwaltetem Code geschriebener Treiber, mit dessen Hilfe Java-Anwendungen eine Verbindung zu einem Remote-Server von Blackfish SQL für Windows oder Blackfish SQL für Java herstellen können. Siehe auch Blackfish SQL Developer's Guide ConnectionProperties 22 1.1 Datenbankanwendungen mit ADO.NET RAD Studio für .NET ADO.NET-Komponentendesigner DataStoreErrorCode 1.1.7 ADO.NET-Komponentendesigner Fast alle verteilten Anwendungen müssen in der Lage sein, Informationen in Datenbanken zu lesen und zu aktualisieren. Je nachdem, welche Anwendung Sie mit ADO.NET entwickeln, werden verschiedene Anforderungen an die Arbeit mit den Daten gestellt. Es kann zum Beispiel sein, dass Sie eine einfache Anwendung entwickeln möchten, die lediglich Daten in einem Formular anzeigt. Oder Sie möchten eine Anwendung entwickeln, die es ermöglicht, Daten mit einem anderen Unternehmen auszutauschen. In jedem Fall ist es unumgänglich, die grundlegenden Konzepte zur Arbeit mit Daten in ADO.NET zu kennen. Mit diesen Designern können Sie unter Verwendung serverspezifischer Schemaobjekte von Datenbanken, wie Tabellen, Ansichten und Indizes, effizient auf Daten zugreifen, Daten bereitstellen und Daten bearbeiten. Auf diese Weise lassen sich Verbindungen zu den meisten gängigen Standarddatenbanken einrichten und konsistente und zuverlässige Operationen mit den Daten ausführen. In diesem Thema wird Folgendes behandelt: • Aufgabenbereiche der Komponentendesigner • Verbindungseditor • Anweisungstext-Editor • Das Dialogfeld für Stored Procedures • Datenmenge erzeugen • Datenadapter konfigurieren • Daten-Explorer Aufgabenbereiche der Komponentendesigner Die wichtigsten Designer und Tools für Datenbankkomponenten sind: • Der Verbindungseditor, mit dem eine Live-Verbindung zur Datenquelle hergestellt werden kann. • Der Anweisungstext-Editor zur Eingabe von Text für Anweisungskomponenten. • Der Designer Datenadapter konfigurieren, mit dem Anweisungen für Datenadapter definiert werden. • Das Dialogfeld für Stored Procedures, in dem Werte für die Eingabe- oder Eingabe-/Ausgabeparameter für Befehlskomponenten angezeigt und definiert werden. • Der Designer Datenmenge erzeugen für die Erstellung benutzerdefinierter Datenmengen. • Der Daten-Explorer, mit dem serverspezifische Schemaobjekte in Datenbanken durchsucht und Daten aus Datenquellen in 23 1 ADO.NET-Komponentendesigner RAD Studio für .NET 1.1 Datenbankanwendungen mit ADO.NET ein Delphi für .NET-Projekt per Drag&Drop eingelesen werden können. Verbindungseditor Der Verbindungseditor dient zur Verwaltung von Verbindungsstrings und datenbankspezifischer Verbindungsoptionen. Mit dem Verbindungseditor können Sie Datenbankverbindungen hinzufügen, entfernen, löschen, umbenennen und testen. Änderungen der Verbindungsinformationen werden in der Datei ADoDbxConnections.xml gespeichert. Auf diese Informationen kann beim Erstellen eines neuen Verbindungsobjekts zugegriffen werden. Nach der Auswahl einer Verbindung erzeugt der Verbindungseditor den Verbindungsstring und die erforderlichen Verbindungsoptionen und weist diese der Eigenschaft ConnectionString bzw. ConnectionOptions zu. Zum Anzeigen des Dialogfelds Verbindungseditor ziehen Sie die Komponente TAdoDbxConnection aus der Tool-Palette in das Formular und klicken auf das Designer Verb der Komponente am unteren Rand des Objektinspektors. 1 Anweisungstext-Editor Im Anweisungstext-Editor geben Sie den Anweisungstext für Befehlskomponenten ein, die über die Eigenschaft CommandText verfügen. In dem mehrzeiligen Bearbeitungsfeld des Editors können Sie Anweisungen manuell bearbeiten oder den Anweisungstext durch die Auswahl von Tabellen und Spalten generieren. Um das Dialogfeld Anweisungstext-Editor zu öffnen, ziehen Sie die Komponente TAdoDbxCommand aus der Tool-Palette in das Formular und klicken auf das Designer Verb der Komponente am unteren Rand des Objektinspektors. Der Anweisungstext-Editor ist ein einfacher SQL-Builder, mit dem SQL-Anweisungen für eine einzelne Tabelle erstellt werden können. Die Datenbankobjekte werden über die Eigenschaft SchemaName in der ISQLSchemaCreate-Komponente gefiltert, d.h. es werden nur Tabellen verwendet, die Teil des Schemas sind. Ist keine SchemaName-Eigenschaft angegeben, werden alle Objekte angezeigt, die für den aktuell angemeldeten Benutzer verfügbar sind. Die Einstellung QuoteObjects der Eigenschaft ConnectionOptions bestimmt, ob die Objekte in das datenbankspezifische Anführungszeichen eingeschlossen werden. Dies ist beispielsweise bei Datenbanken wichtig, in denen die Tabellennamen Leerzeichen enthalten können. Um die Listenfelder für die Tabellen und Spalten mit Elementen zu füllen und SQL-Anweisungen zu erstellen, muss zuvor eine Live-TAdoDbxConnection definiert worden sein. Andernfalls können die Daten nicht abgerufen werden. Der Anweisungstext-Editor unterstützt die Auswahl von Tabellen- und Spaltennamen aus entsprechenden Listen. Nach der Auswahl erzeugt der Editor eine SQL-Anweisung. Er verwendet hierzu eine Instanz der Klasse TAdoDbxCommandBuilder. Bei der Erstellung optimierter SQL-Anweisungen generiert der Editor die WHERE-Klausel für SELECT-, UPDATE- und DELETE-Anweisungen basierend auf Indexinformationen. Ansonsten wird die WHERE-Klausel mit Hilfe von Nicht-BLOB-Spalten und durchsuchbaren Spalten erzeugt. Nach der Erstellung wird die SQL-Anweisung der Eigenschaft TAdoDbxCommand. CommandText zugewiesen. Das Dialogfeld für Stored Procedures Im Dialogfeld für Stored Procedures können Sie Eingabe- und Eingabe-/Ausgabeparameter für eine Stored Procedure anzeigen und eingeben sowie die Stored Procedure ausführen. Um das Dialogfeld für Stored Procedures zu öffnen, ziehen Sie eine TAdoDbxCommand-Komponente aus der Tool-Palette in das Formular, setzen die Eigenschaft CommandType der TAdoDbxCommand-Komponente auf StoredProcedure und klicken auf das Designer Verb Anweisungstext-Editor am unteren Rand des Objektinspektors. Das Dialogfeld für Stored Procedures enthält eine Auswahlliste mit den verfügbaren Stored Procedures. Der Inhalt dieser Liste hängt von der TAdoDbxConnection-Komponente ab, die in der Eigenschaft Connection der TAdoDbxCommand-Komponente angegeben ist. Nach Auswahl einer Stored Procedure werden im Dialogfeld die zugehörigen Parameter eingeblendet. Für den ausgewählten Parameter werden die Parameter-Metadaten angezeigt. Sie können Werte für die Eingabe- oder Eingabe-/Ausgabeparameter festlegen und die Stored Procedure ausführen. Wenn die Stored Procedure Ergebnisse liefert (Ausgabeparameter, Eingabe-/Ausgabeparameter, Rückgabewerte, Cursor usw.), werden diese in einem Datengitter im unteren Teil des Dialogfelds angezeigt. Nachdem die Eigenschaften CommandText und Parameters für die TAdoDbxCommand-Komponente festgelegt wurden, kann die Stored Procedure zur Laufzeit durch einen Aufruf von ExecuteReader oder ExecuteNonQuery ausgeführt werden. 24 1.1 Datenbankanwendungen mit ADO.NET RAD Studio für .NET ADO.NET-Komponentendesigner Datenmenge erzeugen Mit dem Designer Datenmenge erzeugen können Sie eine Datenmenge (DataSet) generieren. Wenn Sie mit diesem Designer arbeiten, haben Sie folgende Vorteile: strikte Typisierung, sauberer Quelltext und die Möglichkeit, die Code-Vervollständigung zu verwenden. Eine Datenmenge wird zunächst von der Basisklasse DataSet abgeleitet und verwendet dann die Informationen in einer XML-Schemadatei (.xsd-Datei), um eine neue Klasse zu generieren. Die Informationen aus dem Schema (Tabellen, Spalten usw.) werden generiert und in das neue DataSet-Objekt compiliert. Um dieses Dialogfeld zu öffnen, ziehen Sie eine TAdoDbxDataAdapter-Komponente aus der Tool-Palette in das Formular und klicken auf das Designer Verb der Komponente am unteren Rand des Objektinspektors. Wenn diese Komponente nicht angezeigt wird, wählen Sie Komponenten Installierte .NET-Komponenten, um sie der Tool-Palette hinzuzufügen. Datenadapter konfigurieren Mit dem Designer Datenadapter konfigurieren können Sie SELECT-, INSERT-, UPDATE- und DELETE-Anweisungen erstellen. Nachdem die SQL-Anweisungen generiert wurden, erzeugt der Designer Datenadapter konfigurieren neue TAdoDbxCommand-Objekte und fügt sie den Eigenschaften SelectCommand, DeleteCommand, InsertCommand und UpdateCommand des TAdoDbxDataAdapter-Objekts hinzu. Nach der Erstellung einer SQL SELECT-Anweisung können Sie sich Daten in der Vorschau ansehen und eine neue Datenmenge (DataSet) erzeugen. Es ist auch möglich, eine neues DataTable-Objekt mit einer vorhandenen Datenmenge zu füllen. Neue DataSet-Objekte werden automatisch dem Designer-Host hinzugefügt. Es besteht die Möglichkeit, typisierte DataSet-Objekte zu erstellen. Die Datenadapter sind ein integraler Bestandteil der von ADO.NET verwalteten Provider. Adapter werden im Wesentlichen dazu verwendet, den Datenaustausch zwischen einer Datenquelle und einer Datenmenge auszuführen. Dies impliziert die folgenden beiden Vorgänge: Das Einlesen von Daten aus einer Datenbank in ein DataSet-Objekt und das Zurückschreiben der geänderten Daten aus dem DataSet-Objekt in die Datenbank. Ein Datenadapter transferiert Daten zwischen einer beliebigen Quelle und Datenadapter konfigurieren einem DataSet-Objekt. Um das Dialogfeld zu öffnen, ziehen Sie eine TAdoDbxDataAdapter-Komponente aus der Tool-Palette in das Formular und klicken auf das Designer Verb der Komponente am unteren Rand des Objektinspektors. Daten-Explorer Der Daten-Explorer ist ein hierarchischer Datenbank-Browser mit Bearbeitungsfunktionen. Der Daten-Explorer ist in die IDE integriert, kann aber auch als eigenständiges Programm ausgeführt werden. Um in der IDE auf den Daten-Explorer zuzugreifen, wählen Sie Ansicht Daten-Explorer. Mit Hilfe der Kontextmenüs des Daten-Explorers können Sie folgende Aufgaben ausführen: • Datenbankverbindungen verwalten – Sie können neue Verbindungen hinzufügen oder vorhandene Verbindungen ändern, löschen oder umbenennen. • Datenbankstruktur und Daten durchsuchen – Erweitern und öffnen Sie Browser-Knoten, um nach serverspezifischen Schemaobjekten, z.B. nach Tabellen, Ansichten, Definitionen für Stored Procedures und Indizes, zu suchen. • Tabellen hinzufügen und bearbeiten – Sie können die Datenstrukturen für eine neue Tabelle festlegen oder in einer vorhandenen Tabelle Spalten hinzufügen und entfernen bzw. die Informationen in den Spalten ändern. • Parameter für Stored Procedures anzeigen und testen – Sie können Werte für die Eingabe- oder Eingabe-/Ausgabeparameter festlegen und die Stored Procedure ausführen. • Daten migrieren – Das Schema und die Daten einer oder mehrerer Tabellen kann von einem Provider zu einem anderen übertragen werden. • Schemaobjekte per Drag&Drop in Formulare einfügen, um die Anwendungsentwicklung zu vereinfachen – Sie können Tabellen und Stored Procedures in das Anwendungsformular für das .NET Framework ziehen, um Verbindungskomponenten hinzuzufügen und Verbindungsstrings automatisch zu erzeugen. Der Daten-Explorer unterstützt Verbindungen zu verschiedenen Standarddatenbanken und kann erweitert werden, um Verbindungen zu anderen gebräuchlichen Datenbanken einzurichten. Der Daten-Explorer verwendet das Interface ISQLDataSource, um eine Liste der verfügbaren Provider, Datenbankverbindungen und unterstützten Schemaobjekte 25 1 Deployment von Datenbankanwendungen RAD Studio für .NET 1.1 Datenbankanwendungen mit ADO.NET zusammenzustellen. Die Liste der verfügbaren Provider wird in der Datei TAdoDbxDataSources.xml gespeichert, die Liste der verfügbaren Verbindungen in der Datei TAdoDbxConnections.xml. Nach Auswahl eines Providers werden mit dem Interface ISQLMetadata Metadaten abgerufen und die Datenbankobjekte in einem schreibgeschützten Baumdiagramm angezeigt. In der aktuellen Implementierung stellt der Daten-Explorer eine Liste der Tabellen, Ansichten und Stored Procedures für alle AdoDbx Client-unterstützten Datenbanken bereit. Sie können mit dem Daten-Explorer neue Tabellen erstellen, vorhandene Tabellen ändern und leeren, Daten aus mehreren Tabellen von einem Provider zu einem anderen migrieren und einzelne Tabellen von einer ADO-unterstützten Datenbank zu einer anderen übertragen. Bei allen diesen Operationen greift der Daten-Explorer auf die ISQLSchemaCreate-Implementierung des Providers zu. Der Daten-Explorer lässt sich auch dazu verwenden, Daten aus einer Datenquelle in ein beliebiges RAD Studio-Projekt für das .NET Framework einzubinden. Wenn Sie eine Tabelle in ein Formular ziehen, werden der Anwendung eine TAdoDbxConnection- und eine TAdoDbxDataAdapter-Komponente hinzugefügt, und die TAdoDbxDataAdapter-Komponente wird automatisch für die Tabelle konfiguriert. Wird eine Stored Procedure in ein Formular gezogen, werden der Anwendung eine TAdoDbxConnection- und eine TAdoDbxCommand-Komponente hinzugefügt, und die Eigenschaft CommandType des TAdoDbxCommand wird auf StoredProcedure gesetzt. 1 Siehe auch Überblick zu ADO.NET ( see page 15) AdoDbx.NET-Datentypen ( see page 12) Anweisungstext-Editor verwenden ( Verbindungseditor verwenden ( see page 137) see page 139) Designer für Datenadapter verwenden ( Datenadapter-Vorschau verwenden ( see page 138) see page 136) Designer "Datenmenge erzeugen" verwenden ( Daten zwischen Datenbanken migrieren ( Tabellenzuordnungen erstellen ( see page 143) see page 124) see page 120) 1.1.8 Deployment von Datenbankanwendungen für das .NET Framework Wenn Sie Datenbankanwendungen mit RAD Studio weitergeben, kopieren Sie die Assemblierungen und Treiber-DLLs, die zur Laufzeit erforderlich sind, in ein Verzeichnis für das Deployment. Im Folgenden werden die Namen dieser Assemblierungen und DLLs aufgeführt und der jeweilige Speicherort angegeben. ADO.NET 2.0-Anwendungs-Deployment Siehe die Quelltextdatei Borland.Data.AdoDbxClientProvider.pas. Deployment von BDP.NET-Anwendungen Spezielle Laufzeit-Assemblierungen für Datenbanken werden an den folgenden Speicherort kopiert: 26 Verwaltete Assemblierungen Daten-Provider Speicherort Borland.Data.Common.dll Alle GAC Borland.Data.Provider.dll Alle GAC Borland.Data.DB2.dll DB2 GAC Borland.Data.Interbase.dll Interbase GAC 1.1 Datenbankanwendungen mit ADO.NET RAD Studio für .NET Deployment von Datenbankanwendungen Borland.Data.Mssql.dll MS SQL/MSDE GAC Borland.Data.Oracle.dll Oracle GAC Borland.Data.Msacc.dll MS Access GAC Borland.Data.Sybase.dll Sybase GAC Anmerkung: Bei der Weitergabe von verteilten Datenbankanwendungen, die BDP.NET-Remoting-Komponenten wie DataHub, DataSync, RemoteConnection und RemoteServer verwenden, müssen Sie Borland.Data.DataSync.dll im GAC installieren. Nicht verwaltete Datenbanktreiber-DLLs werden an den folgenden Speicherort kopiert: DLLs Daten-Provider Speicherort bdpint20.dll Interbase Suchpfad bdpdb220.dll DB2 Suchpfad bdpmss20.dll MS SQL/MSDE Suchpfad bdpora20.dll Oracle Suchpfad bdpmsa20.dll MS Access Suchpfad bdpsyb20.dll Sybase Suchpfad 1 Deployment von dbExpress-Anwendungen für .NET Spezielle Laufzeit-Assemblierungen für Datenbanken werden an den folgenden Speicherort kopiert: Verwaltete Assemblierungen Daten-Provider Speicherort Borland.VclDbExpress.dll Alle GAC Borland.VclDbCtrls.dll Alle GAC Borland.VclDbxCds.dll Wird von Datenbankanwendungen verlangt, die GAC mit Client-Datenmengen arbeiten. Borland.Common.Driver.dll Alle GAC Zugehörige dbExpress.NET-Treiber und DataSnap-DLLs können mit der Anwendung weitergegeben werden. Nicht verwaltete Datenbanktreiber-DLLs werden an den folgenden Speicherort kopiert: DLLs Daten-Provider Speicherort dbxINT30.dll InterBase 2007, 7.5.1, 7.1*, 7.0*, 6.5* Suchpfad dbxASA30.dll Adaptive Sybase Anywhere 9, 8* Suchpfad dbxDB230.dll DB2 UDB 8.x, 7.x* Suchpfad dbxINF30.dll Informix 9.x Suchpfad dbxMSS30.dll MSSQL 2005, 2000 Suchpfad dbxMYSA30.dll MySQL 4.0.24 Suchpfad dbxMYS30.dll MySQL 5.0.27, 4.1.22* Suchpfad dbxora30.dll Oracle 10g, 9.2.0*, 9.1.0* Suchpfad dbxASE30.dll Sybase 12.5 Suchpfad Midas.dll Wird von Datenbankanwendungen Client-Datenmengen arbeiten. verlangt, die mit Suchpfad Anmerkung: * Der Treiber ist für diese Datenbankversion nicht vollständig zertifiziert. 27 Datenprovider für Microsoft .NET RAD Studio für .NET 1.1 Datenbankanwendungen mit ADO.NET Deployment von dbGo-Anwendungen für .NET Laufzeit-Assemblierungen und Datenbanktreiber für dbGo-Komponenten, die in VCL.NET-Anwendungen verwendet werden, müssen nicht weitergegeben werden. Für die Ausführung von Anwendungen mit dbGo-Komponenten außerhalb der IDE ist Microsoft Data Access Components (MDAC) Version 2.1 oder höher erforderlich. Dies gilt sowohl für Win32-VCL-Anwendungen als auch für VCL.NET-Anwendungen. RAD Studio unterstützt MDAC 2.8. Deployment von BDE für .NET-Anwendungen Beim Deployment von BDE-Anwendungen müssen Sie auch die BDE mit weitergeben. Dies vergrößert zwar den Umfang der Anwendung und macht das Deployment komplizierter, hat aber den Vorteil, dass die BDE auch von anderen BDE-Anwendungen genutzt werden kann und eine umfassende Unterstützung von Datenbankoperationen bietet. Obwohl Sie die API der BDE direkt in der Anwendung verwenden können, wird diese Funktionalität fast vollständig von den Komponenten im Abschnitt BDE der Tool-Palette übernommen. 1 Siehe auch Borland – Übersicht zum Deployment von Anwendungen Microsoft – Übersicht zum Deployment von Anwendungen 1.1.9 Datenprovider für Microsoft .NET Zusätzlich zur Unterstützung der .NET Framework-Provider sind in RAD Studio AdoDbxClient-Provider für Microsoft .NET enthalten. AdoDbx Client ist eine Implementierung des .NET-Providers und stellt Verbindungen zu verschiedenen bekannten Datenbanken her. In diesem Thema wird Folgendes behandelt: • Datenprovider-Architektur • Vorteile von AdoDbx Client • AdoDbx Client und ADO.NET-Komponenten • Unterstützte AdoDbx Client-Provider • AdoDbx Client-Datentypen • AdoDbx Client-Interfaces Datenprovider-Architektur RAD Studio unterstützt die Provider des .NET Framework sowie die Provider von AdoDbx Client. 28 1.1 Datenbankanwendungen mit ADO.NET RAD Studio für .NET Datenprovider für Microsoft .NET 1 AdoDbx.NET bietet eine leistungsstarke Architektur für den Zugriff auf Datenquellen ohne COM Interop-Schicht. Hierzu gehören verschiedene Interfaces für die Integration von Datenquellen anderer Hersteller. Sie können diese Interfaces für Ihre eigene Datenbank implementieren und auf diese Weise Entwurfszeit-Tools und Tools für den Laufzeitdatenzugriff in die CodeGear-IDE integrieren. Von AdoDbx.NET verwaltete Komponenten kommunizieren mit diesen Interfaces, um die grundlegende Funktionalität für den Datenzugriff bereitzustellen. Durch die Implementierung dieser Interfaces werden datenbankspezifische, native Client-Bibliotheken mittels Platform Invoke-Services (P/Invoke) gekapselt. Je nach Verfügbarkeit verwalteter Datenbank-Clients können Sie unter AdoDbx.NET einen voll verwalteten Provider implementieren. Die datenbankspezifische Implementierung wird in einer Assemblierung gekapselt, deren voller Name als Teil des Verbindungsstrings an die AdoDbxConnection-Komponente übergeben wird. Wenn die Eigenschaft ConnectionString einen entsprechenden Assemblierungseintrag enthält, lädt AdoDbx.NET den datenbankspezifischen Provider dynamisch und verwendet die Implementierung für ISQLConnection, ISQLCommand und ISQLCursor. Um die Datenbank zu wechseln, müssen Sie lediglich über die Eigenschaft ConnectionString auf den entsprechenden Provider verweisen. Vorteile von AdoDbx.NET AdoDbx.NET bietet verschiedene Vorteile: • Ein einheitliches Programmiermodell für verschiedene Datenbankplattformen. • Eine leistungsstarke Architektur für den Datenzugriff. • Eine offene Architektur, die weitere Datenbanken problemlos unterstützt. • Portierbarer Code, der einmal geschrieben werden muss und dann für alle unterstützten Datenbanken einsetzbar ist. • Eine konsistente Datentypzuordnung zwischen den verschiedenen Datenbanken (sofern verfügbar). • Eine Zuordnung logischer Datentypen zu nativen .NET-Typen. • Anders als bei OLE DB ist keine COM Interop-Schicht erforderlich. • Während der Anwendungswicklung können Daten "live" angezeigt werden. • Erweiterung von ADO.NET um Interfaces für Metadaten-Services, Schemaerstellung und Datenmigration. • Schnellere Entwicklung von Datenbankanwendungen durch einen umfangreichen Satz von Komponentendesignern und Tools. RAD Studio erweitert die Unterstützung von .NET auf zusätzliche Datenbankplattformen und sorgt für eine konsistente Verbindungsarchitektur sowie eine verlässliche Datentypzuordnung. AdoDbx.NET und ADO.NET-Komponenten Mit Hilfe eines DataSet-Objekts werden eine oder mehrere Datentabellen (DataTable-Objekte) im Arbeitsspeicher verwaltet. Jede Datentabelle in einem DataSet-Objekt besteht aus Datenspalten (DataColumn-Objekten) und Datenzeilen (DataRows-Objekten). Das DataSet-Objekt wird basierend auf einer SQL-Abfrage erstellt, die Sie an den Provider übergeben. 29 Datenprovider für Microsoft .NET RAD Studio für .NET 1.1 Datenbankanwendungen mit ADO.NET Die Navigation in einem DataSet-Objekt erfolgt auf die gleiche Weise wie in einer Standardtabelle einer relationalen Datenbank. AdoDbx.NET-Provider kapseln zwar Implementierungsdetails für jeden Datenbanktyp, Sie können Ihre SQL-Anweisungen aber nach Bedarf anpassen und Ergebnismengen beliebig verarbeiten. Zu AdoDbx.NET gehören verschiedene Komponenten, die Sie zur Entwurfszeit in ein Windows Form oder Web Form einfügen können. Außerdem stehen verschiedene Designer bereit, die die Erstellung von Datenverbindungen, Datenmengen, Beziehungen und weiteren Elementen vereinfachen. Die folgenden Komponenten sind sehr hilfreich, wenn Sie einen eigenen datenbankspezifischen Provider implementieren möchten: • AdoDbxConnection — Richtet eine Datenbankverbindung ein. • AdoDbxCommand — Stellt Methoden und Eigenschaften für die Ausführung von SQL-Anweisungen und Stored Procedures bereit. 1 • AdoDbxDataReader — Ruft Daten ab. • AdoDbxParameter — Sorgt für die Laufzeitbindung der Parameter. • AdoDbxTransaction — Unterstützt die Steuerung von Transaktionen. • AdoDbxDataAdapter — Sorgt für die Bereitstellung und Auflösung von Daten. • ISQLMetaData — Ruft Metadaten ab. • ISQLSchemaCreate — Stellt Methoden zum Erstellen, Entfernen und Ändern von Datenbankobjekten bereit. Klicken Sie auf den Link einer Komponente, um weitere Informationen anzuzeigen. Alternativ können Sie in der API-Referenz dieser Hilfe nach der entsprechenden Dokumentation suchen. Unterstützte AdoDbx.NET-Provider AdoDbx.NET bietet Provider für die wichtigsten Standarddatenbanken. Sie sind in der folgenden Tabelle zusammen mit ihren Namespaces aufgeführt. Datenbank Namespace InterBase Borland.Data.Interbase Oracle Borland.Data.Oracle IBM DB2 Borland.Data.Db2 Microsoft SQL Server Borland.Data.Mssql Microsoft Access Borland.Data.Msacc Sybase Borland.Data.Sybase Die Komponenten, Metadaten-Zugriffstools und Designer von AdoDbx.NET sind in den folgenden Namespaces definiert: • Borland.Data.AdoDbxClientProvider • Borland.Data.Common • Borland.Data.Schema • Borland.Data.Design AdoDbx.NET-Datentypen AdoDbx.NET bildet SQL-Datentypen auf Datentypen des .NET Framework ab. Sie müssen sich deshalb nicht mit einem datenbankspezifischen Typsystem befassen. Bei der Weiterentwicklung des Produkts wurde größter Wert auf eine konsistente Typzuordnung für die einzelnen Datenbanktypen gelegt, sodass derselbe Quelltext für verschiedene Datenbanken verwendet werden kann. Eine ähnliche Wirkung erreichen Sie bei den Datenprovidern des .NET Framework, indem Sie direkt auf deren Interfaces zugreifen und untypisierte Vorfahren verwenden. Die Verwendung streng typisierter Zugriffsfunktionen wirkt sich nachteilig auf die Portierbarkeit der Anwendung aus. AdoDbx.NET unterstützt keine datenbankspezifischen typisierten 30 1.1 Datenbankanwendungen mit ADO.NET RAD Studio für .NET Überblick zu Stored Procedures Zugriffsfunktionen. Weitere Informationen finden Sie unter dem Thema "AdoDbx.NET-Datentypen". AdoDbx.NET-Interfaces Sie können AdoDbx.NET so erweitern, dass es andere DBMS unterstützt. Dazu implementieren Sie einen Teilbereich des .NET-Provider-Interface. Die Funktionalität, die für die Implementierung von Datenprovidern erforderlich ist, ist mit AdoDbx.NET weitestgehend verallgemeinert. Das .NET Framework ermöglicht es, für jede Datenquelle einzelne Datenprovider zu erstellen. CodeGear hat diese Aufgabe noch weiter vereinfacht und die diesbezüglichen Möglichkeiten vereinheitlicht. Anstatt einzelne Provider mit den zugehörigen Objekten DataAdapter, DataReader und Connection sowie weiteren erforderlichen Objekten zu erstellen, können Sie eine Sammlung von AdoDbx.NET-Interfaces implementieren, um eigene Plug-Ins für Datenquellen in den AdoDbx-Client-Provider einzubinden. Das Erstellen von Plug-Ins ist einfacher, als komplett neue Datenprovider zu entwickeln. Sie erstellen dazu eine Assemblierung, die den Namespace des gewählten Providers enthält, sowie jene Klassen, die die providerspezifische Funktionalität kapseln. In den Interfaces des AdoDbx-Client-Provider ist bereits ein Großteil der Funktionalität definiert, die zum Verbinden mit Datenquellen, zum Ausführen von Befehlen für Datenquellen und zum Einlesen von Daten aus Datenquellen erforderlich ist. Siehe auch Überblick zu ADO.NET ( see page 15) AdoDbx.NET-Komponentendesigner ( AdoDbx.NET-Datentypen ( see page 23) see page 12) 1.1.10 Überblick zu Stored Procedures Alle relationalen Datenbanken verfügen über bestimmte gemeinsame Funktionsmerkmale, die es den Anwendungen ermöglichen, Daten zu speichern und zu bearbeiten. Stored Procedures sind eigenständige Programme, die jeweils in einer datenbanksystemspezifischen Sprache geschrieben wurden. In der Regel dienen sie zur Bearbeitung häufig auftretender datenbankbezogener Aufgaben und sind besonders bei der Verarbeitung von großen Datensatzmengen oder bei Verwendung von Zusammenfassungs- oder mathematischen Funktionen hilfreich. Stored Procedures werden normalerweise auf dem Datenbankserver gespeichert. Stored Procedures werden ähnlich aufgerufen wie SQL-Anweisungen. Das Bearbeiten und Erstellen von Stored Procedures in RAD Studio erfolgt daher mit den Verfahren, die auch für SQL-Anweisungstext verwendet werden. Mit Hilfe von Stored Procedures können Sie Ihre Datenbankanwendungen hinsichtlich Ausführungsgeschwindigkeit, Sicherheit und Zuverlässigkeit verbessern. • Ausführungsgeschwindigkeit – Stored Procedures erhöhen die Ausführungsgeschwindigkeit, da sie die größere Verarbeitungsleistung und -geschwindigkeit des Servers nutzen. Die Netzwerkbelastung wird verringert, weil Prozesse auf den Server verlagert werden. Darüber hinaus werden compilierte SQL-Anweisungen in einer Stored Procedure normalerweise schneller ausgeführt als normaler SQL-Anweisungstext. • Sicherheit – Stored Procedures fungieren als zusätzliche Schicht zwischen den Clients und der Datenbank und erhöhen so die Sicherheit der Daten. Den einzelnen Benutzern wird keine Zugriffsberechtigung für die Datenbank gewährt, sondern sie führen Stored Procedures unabhängig von den zugrunde liegenden Tabellenzugriffsberechtigungen aus. • Zuverlässigkeit – Stored Procedures unterstützen die Zentralisierung des Programmcodes und erleichtern so das Auffinden und Beheben von Problemen. Außerdem kann die datenbankbezogene Geschäftslogik mit Hilfe von Stored Procedures in die Datenbank integriert werden. Sie steht dadurch auf allen Clients zur Verfügung, unabhängig von der Sprache, mit der diese programmiert wurden. Bei Verwendung von AdoDbx Client können Sie während der Anwendungsentwicklung mit dem Anweisungstext-Editor und dem Daten-Explorer die Parameter Ihrer Stored Procedures anzeigen, Eingabeparameter festlegen und Stored Procedures ausführen. 31 1 dbExpress-Framework RAD Studio für .NET 1.1 Datenbankanwendungen mit ADO.NET Siehe auch ADO.NET-Komponentendesigner ( Provider für Microsoft .NET ( see page 23) see page 28) 1.1.11 dbExpress-Framework Das dbExpress-Framework (DBX-Framework) ist eine Menge abstrakter Klassen, die in der Unit DBXCommon bereitgestellt sind.. Anwendungen können mit dem Framework über verschiedene Wege in Verbindung treten: Sie können das Framework direkt oder die dbExpress VCL-Komponenten, die sich in der oberen Schicht des Framework befinden, für native und verwaltete Anwendungen einsetzen. 1 Obwohl viele Anwendungen mit dbExpress-Treibern über die dbExpress VCL-Komponenten in Verbindung treten, bietet das DBX-Framework eine bequeme, einfachere Option für die Kommunikation mit einem Datenbanktreiber. Sie können auch für dbExpress einen Datenbanktreiber erstellen, indem Sie die abstrakten DBXCommon-Basisklassen des Framework erweitern. Das DBX-Framework stellt die gebräuchlichste Datenbanktreiberfunktionalität für eine "mengenorientierte" Datenbankanwendung bereit, bietet aber ein einfaches Interface. Im Folgenden finden Sie einige Schlüsselfunktionen des DBX-Framework: • Das Treibe-Framework ist vollständig in Delphi geschrieben und ermöglicht, dass Treiber ebenfalls in Delphi geschrieben werden. • Es verwendet einen streng typisierten Datenzugriff anstelle von Zeigern. Das Framework verwendet z.B. String-Typen anstatt Zeiger auf Strings. • Das Treibe-Framework verwendet einen einzigen Quelltext Das bedeutet, dass eine einzige Kopie des Quelltextes entweder mit den nativen DCC32- oder den verwalteten DCCIL-Compilern compiliert werden kann. • Das Framework hat nur abstrakte Basisklassen, die für Treiber, Verbindungen, Befehle, Reader usw. verwendet werden. • Das Framework verwendet eine auf Exception basierte Fehlerbehandlung anstelle der Rückgabe von Fehlercodes. Leistungsmerkmale Es gibt zwei Treiberkategorien, die die Klassen in DBXCommon erweitern: DBXDynaLink und DBXDirect. Diese Treiber unterscheiden sich in der Art und Weise, wie sie geladen werden und in den Leistungsmerkmalen, die Sie für eine Anwendung bereitstellen. Dies wird weiter unten detaillierter beschrieben. Sie können das DBX-Framework auch erweitern, um Delegattreiber zu schreiben, die eine Extra-Schicht zwischen der Anwendung und dem eigentlichen Treiber bereitstellen. Delegattreiber sind beim Verbindungs-Pooling, beim Erstellen von Treiberprofilen, bei der Ablaufverfolgung und beim Auditing hilfreich. Eine weitere mögliche Anwendung der Treiberdelegation ist das Erstellen eines Thread-sicheren Treiberdelegaten. Ein solcher Delegat könnte einen Thread-synchronisierten Zugriff auf alle public Methoden bereitstellen. Absolute Thread-Sicherheit bleibt den Anwendungen überlassen, die dbExpress verwenden. Gewisse Thread-Sicherheitsbelange werden aber vom dbExpress-Framework ausgezeichnet gehandhabt. Zu den Thread-sicheren Operationen von dbExpress zählen das Laden und Entladen von Treiber und die Verbindungserstellung. Wie weiter oben erwähnt, kann ein Delegattreiber erstellt werden, um das gesamte public Interface von dbExpress bei Bedarf Thread-sicher zu machen. Ein dbExpress 4-Treiber kann Treiber, die als Delphi-Packages erstellt wurden, statisch oder dynamisch linken. Der einfachste Weg ein Treiber-Package zu linken ist, es einfach in den "uses"-Klausel aufzunehmen. Der Treiberlader lädt auch Packages, die in einer config- oder ini-Datei angegeben sind, mit der Methode LoadPackage. Dies ermöglicht das dynamische Laden von Treibern, die in keiner uses-Klausel in den Units der Anwendung angegeben sind. Beachten Sie bitte, dass die Methode LoadPackage nur für Anwendungen eingesetzt werden kann, die für die Verwendung von Packages vorgesehen sind. 32 1.1 Datenbankanwendungen mit ADO.NET RAD Studio für .NET dbExpress Framework-Kompatibilität Entwickler von dbExpress 4-Treibern sollten den Abschnitt "initialization" der Units DBXDynalink und DBXTrace im mit dbExpress ausgelieferten Quelltext studieren. Diese Abschnitte registrieren sich selbst mit einer Singleton-Unit namens ClassRegistry. ClassRegistry wird von den dbExpress 4-Treiberladern zum Instantiieren der Treiberladeklassen anhand des Namens (ein String) verwendet. ClassRegistry ist ein einfacher, schmaler Mechanismus zum Registrieren und Instantiieren einer Klasse über ihren Namen. DBXDynalink-Treiber DBXDynalink wird für vorhandene dbExpress 3-Treiber und für neue Treiber verwendet. Es wird als natives Delphi-Package oder als verwaltete .NET-Assemblierung compiliert. DBXDynalink lädt native dbExpress-Treiber, die ein primitiveres "natives" Interface namens DBXExports implementieren. Das Interface DBXExports ist eine kleine Sammlung von "linearen" Exportmethoden. Der Quelltext von DBXExports ist in dbExpress enthalten. DBXExports stellt eine strenger typisierte API als das COM-basierte Interface von dbExpress 3 bereit. Daher können Methoden zu zukünftigen Produktgenerationen hinzugefügt werden, ohne dass die Kompatibilität mit älteren Implementierungen des DBXExports-Interface verloren geht. DBXAdapter ist ein dbExpress 4-konformer Treiber, der das DBXExports-Interface an das ältere dbExpress 3 COM-Interface adaptiert. Neuere native Treiber können durch direktes Implementieren von DBXExports geschrieben werden. Weil das DBXExports-Interface für die Implementierung über eine native Sprache (Delphi oder C++) entwickelt wurde, verwendet es eine primitivere Fehlerbehandlung, die nicht auf Exceptions basiert. DBXDynalink ordnet Fehlercodes einer DBXCommon-Exception zu. Die Unit DBXDynalink enthält einen dbExpress 4-Treiber. Dieser Treiber delegiert an Nicht-Delphi-Treiber, die das lineare Export-Interface DBXDynalinkExport implementieren. DBXTrace ist ein Delegattreiber für die Ablaufverfolgung. Die DbExpress-VCL verwendet DBXCommon, DBXDynalink und DbxTrace als "Standardtreiber". Dies kann jedoch für statisch gelinkte Anwendungen geändert werden, ohne dass der dbExpress VCL-Quelltext (SQLExpr.pas) bearbeitet werden muss. SQLExpr.pas verwendet die Unit DBXDefaultDrivers. Die Unit DBXDefaultDrivers enthält nur eine uses-Klausel. Die uses-Klausel in DBXDefaultDrivers enthält DBXCommon, DBXDynalink und DBXTrace. DBXCommon muss immer verwendet werden. Eine statisch gelinkte Anwendung kann aber DBXTrace entfernen und DBXDynalink durch einen anderen Treiber ersetzen. DBXDirect-Treiber Ein DBXDirect-Treiber ist ein beliebiger Treiber, der durch Erweiterung der abstrakten DBXCommon-Basisklassen implementiert wird. Diese Klassen sind für native Implementierungen in Delphi geschrieben. Für verwaltete Implementierungen können Sie in jeder CLR-kompatiblen Sprache, wie z.B. Delphi, C# oder Visual Basic.NET, geschrieben werden. Strenggenommen sind alle DBX-Framework-Treiber eine Form von DBXDirect-Treiber. DBXDynalink und DBXRemote stellen jedoch eine "indirektere" Bindung an Treiberimplementierungen bereit. Siehe auch Kompatibilität mit dem dbExpress Datenbanktreiber-Framework ( see page 34) dbExpress-Datenbankanwendungen weitergeben 1.1.12 dbExpress Framework-Kompatibilität Teile der dbExpress-Software, die vor dem Erscheinen des dbExpress-Treiber-Framework (DBX-Treiber-Framework) entwickelt wurden, mussten für die Zusammenarbeit mit dem DBX-Treiber-Framework verändert werden. Dies hat zu einigen Kompatibilitätsproblemen geführt. Allgemein dbExpress 2.5-Treiber können nicht mit dem DBX-Framework verwendet werden. 33 1 Einführung in InterBase Express RAD Studio für .NET 1.1 Datenbankanwendungen mit ADO.NET Das dbExpress-Framework bietet keine 100% Kompatibilität mit dbExpress 3. dbExpress 3-Treiber können mit dem DBX-Framework verwendet werden. Der Treiberlademechanismus des DBX-Framework erkennt dbExpress 3-Treiber automatisch und passt mithilfe des DBXAdapter-Treibers (dbxadapter30.dll) einen dbExpress 3-Treiber an einen dbExpress 4-Treiber an. Im Folgenden finden Sie eine Liste der bekannten Kompatibilitätsprobleme: • Statische Treiberbindung. dbExpress-Treiber können nicht statisch in eine ausführbare Datei gelinkt werden. • SqlExpr.TSQLConnection stellte eine geschützten Zugriff auf das Connection-Member bereit, das nur in der nativen Version von SqlExpr.pas den Typ TISQLConnection hatte. Diese wurde in der verwalteten Version wegen der Komplexität weggelassen, mit der PInvoke in der verwalteten Version der dbExpress VCL verwendet wurde. SqlExpr.TSQLConnection stellt nun stattdessen einen geschützten Zugriff auf TDBXConnection bereit. Auf diese geschützte Verbindung können native und verwaltete Anwendungen zugreifen. 1 • Das Ereignis für die Ablaufüberwachung ist leicht verändert, weil es auf dem DBX-Treiber-Framework basiert. • Der DBXAdapter-Treiber kann dbExpress 3-Treiber an dbExpress 4 anpassen, aber keine dbExpress 2.5-Treiber. VCL-Probleme Die meisten Anwendungen, die dbExpress VCL-Komponenten verwenden, können mit dieser Modifikation arbeiten. Es gibt jedoch einige lokalisierte Änderungen an VCL-Komponenten, weil die VCL jetzt mit dem mehr objektorientierten DBX-Treiber-Framework anstatt mit dem C-ähnlichen COM-basierten dbExpress 3-Treiber-Interface interagiert. Außerdem wurde die API für zwei VCL-Komponenten leicht verändert: TSQLConnection und TSQLDataSet. Es wurden auch einige Datenstrukturen verändert. In Folgenden finden Sie eine Zusammenfassung der API-Änderungen. Anmerkung: Wegen der API-Änderungen müssen Sie die mit dem Produkt ausgelieferte Unit SqlExpr.pas neu compilieren. Die Unit DBXpress wird nicht mehr verwendet. • TSQLConnection. Anstatt der Methode Commit wird nun die neue Methode CommitFreeAndNil verwendet. Anstatt der Methode Rollback werden nun die neuen Methoden RollbackFreeAndNil und RollbackIncompleteFreeAndNil verwendet. Die Methode SetTraceCallbackEvent wurde durch SetTraceEvent ersetzt. Anstatt der Methode StartTransaction wird nun die neue Methode BeginTransaction verwendet. Die Eigenschaft MetaData enthält eine Instanz der neuen Klasse TDBXDatabaseMetaData anstelle von TISQLMetaData. Die Eigenschaft SQLConnection wurde durch DBXConnection ersetzt, die eine Instanz der neuen Klasse TDBXConnection enthält. Die Eigenschaft TraceCallbackEvent enthält nun ein TDBXTraceEvent. • TSQLDataSet. Die neue Eigenschaft DbxCommandType wurde hinzugefügt. Sie enthält einen der Konstanten-Strings aus der Klasse TDBXCommandTypes. • Datenstrukturen. TTransactionItem wurde durch die neue Klasse TDBXTransaction ersetzt. TSQLDriverOption, TSQLConnectionOption, TSQLCommandOption, TSQLCursorOption, TSQLMetaDataOption und TSQLObjectType sind veraltet. TSTMTParamType wurde durch die Klasse TDBXParameterDirections ersetzt. TSQLTraceFlag wurde durch TDBXTraceFlags ersetzt. SQLTRACEDesc wurde durch TDBXTraceInfo ersetzt. Siehe auch dbExpress-Framework Deployment des dbExpress-Framework 1.1.13 Einführung in InterBase Express InterBase Express (IBX) besteht aus Komponenten, mit denen auf die Daten von InterBase-Datenbanken zugegriffen werden kann. Die InterBase-Verwaltungskomponenten, für die InterBase 6 erforderlich ist, werden nach den InterBase-Datenzugriffskomponenten beschrieben. 34 1.1 Datenbankanwendungen mit ADO.NET RAD Studio für .NET Einführung in InterBase Express IBX-Komponenten Die folgenden Komponenten befinden sich auf der Registerkarte InterBase der Komponentenpalette. Symbol Komponentenname Beschreibung TIBTable Eine Datenmengenkomponente, die eine Datenbanktabelle kapselt. TIBQuery Mit dieser Komponente ausgeführt werden. TIBStoredProc Diese Komponente kapselt eine Stored Procedure auf einem Datenbankserver. TIBDatabase Diese Komponente kapselt eine InterBase-Datenbankverbindung. TIBTransaction Diese Komponente ermöglicht die Transaktionssteuerung bei einer oder mehreren Datenbankverbindungen in einer Datenbankanwendung. TIBUpdateSQL Diese Komponente stellt ein Objekt für die Aktualisierung von schreibgeschützten Datenmengen bereit, wenn das Zwischenspeichern von Aktualisierungen aktiviert ist. TIBDataSet Diese Komponente führt InterBase-SQL-Anweisungen aus. TIBSQL Mit dieser Komponente kann eine InterBase-SQL-Anweisung mit minimalem Overhead ausgeführt werden. TIBDatabaseInfo Dieses Komponente dient zum Abrufen von Informationen über die verknüpfte Datenbank. TIBSQLMonitor Mit dieser Komponente können die an den InterBase-Server übergebenen dynamischen SQL-Anweisungen überwacht werden. TIBExtract Diese Komponente ruft Metadaten von einem InterBase-Server ab. TIBCustomDataSet Dies ist die Basisklasse für alle Datenmengen, die mit InterBase Express abgerufene Daten repräsentieren. kann eine InterBase-SQL-Anweisung Trotz ähnlicher Namen bestehen gewisse Unterschiede zwischen BDE- und IBX-Komponenten. In den folgenden Abschnitten werden diese Unterschiede erläutert. Die Migration von BDE- zu IBX-Anwendungen ist mit einem gewissen Aufwand verbunden. Sie müssen die BDE-Komponenten durch entsprechende IBX-Komponenten ersetzen und danach die Anwendung neu compilieren. Der zusätzliche Migrationsaufwand wird jedoch durch die höhere Ausführungsgeschwindigkeit und den Zugriff auf die leistungsstarken InterBase-Funktionen ausgeglichen. IBDatabase Mit der TIBDatabase-Komponente werden Verbindungen zu Datenbanken eingerichtet, die eine gleichzeitige Abwicklung mehrerer Transaktionen unterstützen. Im Gegensatz zur BDE verfügt IBX über eine gesonderte Transaktionskomponente, die eine getrennte Verwaltung von Transaktionen und Datenbankverbindungen ermöglicht. So richten Sie eine Datenbankverbindung ein: 1. Ziehen Sie eine IBDatabase-Komponente in ein Formular oder Datenmodul. 2. Legen Sie die Eigenschaft DatabaseName fest. Bei lokalen Verbindungen ist dies das Laufwerk, die Pfadangabe und der Dateiname der Datenbankdatei. Setzen Sie die Eigenschaft Connected auf True. 3. Geben Sie eine gültigen Benutzernamen und ein Passwort ein, und klicken Sie auf OK, um die Verbindung zur Datenbank herzustellen. Warnung: Benutzername und Passwort können in der Eigenschaft Params der IBDatabase-Komponente gespeichert werden. Setzen Sie dazu die Eigenschaft LoginPrompt nach dem Anmelden auf False. Wenn Sie sich beispielsweise als 35 1 Einführung in InterBase Express RAD Studio für .NET 1.1 Datenbankanwendungen mit ADO.NET Systemadministrator anmelden und LoginPrompt auf False setzen, könnte die Eigenschaft Params Folgendes enthalten: user_name=sysdba password=masterkey IBTransaction Im Gegensatz zur Borland Database Engine steuert IBX Transaktionen mit einer speziellen Komponente namens TIBTransaction. Damit haben Sie die Möglichkeit, Transaktionen und Datenbankverbindungen getrennt zu verwalten und den Zweiphasen-Mechanismus von InterBase für das Eintragen zu verwenden (Transaktionen können mehrere Verbindungen umfassen). Außerdem können mehrere gleichzeitige Transaktionen über eine Verbindung ausgeführt werden. Verwenden Sie für einen Transaktionskontext, in dem möglicherweise mehrere Datenbankverbindungen genutzt werden, eine IBTransaction-Komponente. In der Regel kann aber das Modell "Eine Datenbank/Eine Transaktion" verwendet werden. 1 So richten Sie eine Transaktion ein: 1. Richten Sie eine IBDatabase-Verbindung wie oben beschrieben ein. 2. Ziehen Sie eine IBTransaction-Komponente in das Formular oder Datenmodul. 3. Weisen Sie der Eigenschaft DefaultDatabase den Namen der IBDatabase-Komponente zu. 4. Setzen Sie die Eigenschaft Active auf True, um die Transaktion zu starten. IBX-Datenmengenkomponenten Sie haben die Wahl zwischen verschiedenen IBX-Datenmengenkomponenten, die jeweils auf einen bestimmten Einsatzzweck zugeschnitten sind: IBTable Mit Hilfe einer TIBTable-Komponente können Sie eine Live-Datenmenge für eine Tabelle oder Ansicht einrichten, ohne SQL-Anweisungen eingeben zu müssen. IBTable-Komponenten lassen sich sehr einfach konfigurieren: 1. Ziehen Sie eine IBTable-Komponente in das Formular oder Datenmodul. 2. Bestimmen Sie die zugehörigen Datenbank- und Transaktionskomponenten. 3. Wählen Sie in der Dropdown-Liste mit den Tabellennamen den Namen der Beziehung aus. 4. Setzen Sie dann die Eigenschaft Active auf True. IBQuery Mit Hilfe einer TIBQuery-Komponente können Sie eine InterBase-DSQL-Anweisung ausführen, die Ergebnismenge auf bestimmte Spalten und Zeilen beschränken, Aggregatfunktionen verwenden und mehrere Tabellen miteinander verbinden. IBQuery-Komponenten stellen eine schreibgeschützte Datenmenge bereit und fügen sich ideal in die Client-/Server-Umgebung von InterBase ein. So richten Sie eine IBQuery-Komponente ein: 1. Richten Sie eine IBDatabase-Verbindung wie oben beschrieben ein. 2. Richten Sie eine IBTransaction-Verbindung wie oben beschrieben ein. 3. Ziehen Sie eine IBQuery-Komponente in das Formular oder Datenmodul. 4. Bestimmen Sie die zugehörigen Datenbank- und Transaktionskomponenten. 5. Geben Sie im Stringlisten-Editor eine gültige SQL-Anweisung für die Eigenschaft SQL der IBQuery-Komponente ein. 6. Setzen Sie die Eigenschaft Active auf True. IBDataSet Mit Hilfe einer TIBDataSet-Komponente können Sie eine InterBase-DSQL-Anweisung ausführen, die Ergebnismenge auf bestimmte Spalten und Zeilen beschränken, Aggregatfunktionen verwenden und mehrere Tabellen miteinander verbinden. IBDataSet-Komponenten funktionieren ähnlich wie IBQuery-Komponenten, unterstützen aber Live-Datenmengen auch ohne 36 1.1 Datenbankanwendungen mit ADO.NET RAD Studio für .NET Einführung in InterBase Express Verwendung einer IBUpdateSQL-Komponente. Mit den folgenden Schritten erhalten Sie eine Live-Datenmenge für die Tabelle COUNTRY in employee.gdb: 1. Richten Sie eine IBDatabase-Verbindung wie oben beschrieben ein. 2. Bestimmen Sie die zugehörigen Datenbank- und Transaktionskomponenten. 3. Ziehen Sie eine IBDataSet-Komponente in das Formular oder Datenmodul. 4. Geben Sie SQL-Anweisungen für die folgenden Eigenschaften ein: SelectSQL, RefreshSQL, ModifySQL, DeleteSQL, InsertSQL. Beispiele für SQL-Anweisungen finden Sie in der folgenden Tabelle. 5. Setzen Sie dann die Eigenschaft Active auf True. Beispiele für SQL-Anweisungen Eigenschaft SQL-Anweisung SelectSQL SELECT Country, Currency FROM Country RefreshSQL SELECT Country, Currency FROM Country WHERE Country = :Country ModifySQL UPDATE Country SET Country = :Country, Currency = :Currency WHERE Country = :Old_Country DeleteSQL DELETE FROM Country WHERE Country = :Old_Country InsertSQL INSERT INTO Country (Country, Currency) VALUES (:Country, :Currency) 1 Anmerkung: Im Dialekt 3 wird bei Parametern und Feldern, die an Funktionen übergeben werden, zwischen Groß- und Kleinschreibung unterschieden. Beispielsweise liefert die Anweisung FieldByName(EmpNo) im Dialekt 3 kein Ergebnis, wenn das Feld "EMPNO" lautet. IBStoredProc TIBStoredProc-Komponenten werden für ausführbare InterBase-Prozeduren verwendet. Diese liefern maximal eine Zeile mit Daten. Verwenden Sie für Stored Procedures, die mehrere Datenzeilen zurückgeben, und für "Select"-Prozeduren entweder eine IBQuery- oder eine IBDataSet-Komponente. IBSQL Verwenden Sie TIBSQL-Komponenten für kompakte Datenoperationen, die schnell ausgeführt werden. Hierzu gehört beispielsweise die Datendefinition und das Übertragen von Daten von einer Datenbank in eine andere. Folgendermaßen können Sie mit einer IBSQL-Komponente den nächsten Wert von einem Generator abrufen: 1. Richten Sie eine IBDatabase-Verbindung wie oben beschrieben ein. 2. Ziehen Sie eine IBSQL-Komponente in das Formular oder Datenmodul, und weisen Sie ihrer Database-Eigenschaft den Namen der Datenbank zu. 3. Verfassen Sie im Stringlisten-Editor eine SQL-Anweisung für die Eigenschaft SQL, z.B.: SELECT GEN_ID(MyGenerator, 1) FROM RDB$DATABASE IBUpdateSQL TIBUpdateSQL-Komponenten werden verwendet, um schreibgeschützte Datenmengen zu aktualisieren. Sie können beispielsweise die Ausgabe einer IBQuery-Komponente mit Hilfe einer IBUpdateSQL-Komponente aktualisieren: 1. Richten Sie eine IBQuery-Komponente wie oben beschrieben ein. 2. Ziehen Sie eine IBUpdateSQL-Komponente in das Formular oder Datenmodul. 37 Einführung in InterBase Express RAD Studio für .NET 1.1 Datenbankanwendungen mit ADO.NET 3. Geben Sie SQL-Anweisungen für die folgenden Eigenschaften ein: DeleteSQL, InsertSQL, ModifySQL und RefreshSQL. 4. Weisen Sie der Eigenschaft UpdateObject der IBQuery-Komponente den Namen der IBUpdateSQL-Komponente zu. 5. Setzen Sie die Eigenschaft Active der IBQuery-Komponente auf True. TIBSQLMonitor Verwenden Sie eine TIBSQLMonitor-Komponente zur Entwicklung von Diagnose-Tools, mit denen die Kommunikation zwischen der Anwendung und dem InterBase-Server überwacht wird. Wenn die TraceFlag-Eigenschaften einer IBDatabase-Komponente aktiviert sind, können aktive IBSQLMonitor-Komponenten die Aktivitäten der Verbindung protokollieren und die Ausgabe an eine Datei oder ein Steuerelement senden. Sie können beispielsweise eine separate Anwendung erstellen, die über eine IBSQLMonitor-Komponente und ein Memofeld verfügt. Starten Sie diese Sekundäranwendung, und aktivieren Sie für die Primäranwendung die TraceFlag-Eigenschaften der IBDatabase-Komponente. Führen Sie danach in der Primäranwendung einige Aktionen aus, und beobachten Sie, wie das Memofeld der Sekundäranwendung mit Daten gefüllt wird. 1 IBDatabaseInfo Mit Hilfe einer TIBDatabaseInfo-Komponente können Sie Informationen über eine Datenbank abrufen (z.B. das Sweep-Intervall, die ODS-Version und die Namen der Benutzer, die gegenwärtig auf die Datenbank zugreifen). Folgendermaßen richten Sie eine IBDatabaseInfo-Komponente für die Anzeige der Benutzer ein, die aktuell mit der Datenbank verbunden sind: 1. Richten Sie eine IBDatabase-Verbindung wie oben beschrieben ein. 2. Ziehen Sie eine IBDatabaseInfo-Komponente in das Formular oder Datenmodul, und weisen Sie ihrer Database-Eigenschaft den Namen der Datenbank zu. 3. Fügen Sie eine Memo-Komponente in das Formular ein. 4. Ziehen Sie eine Timer-Komponente in das Formular, und legen Sie das Intervall fest. 5. Doppelklicken Sie auf das Feld für das OnTimer-Ereignis des Timers, und geben Sie folgenden (oder einen ähnlichen) Code ein: Memo1.Text := IBDatabaseInfo.UserNames.Text; // Memo1->Text = IBDatabaseInfo->UserNames->Text; // Delphi-Beispiel C++ Beispiel IBEvents Mit Hilfe einer IBEvents-Komponente kann eine Anwendung Ereignisse eines InterBase-Servers empfangen und asynchron behandeln. So richten Sie eine IBEvents-Komponente ein: 1. Richten Sie eine IBDatabase-Verbindung wie oben beschrieben ein. 2. Ziehen Sie eine IBEvents-Komponente in das Formular oder Datenmodul, und weisen Sie ihrer Database-Eigenschaft den Namen der Datenbank zu. 3. Definieren Sie im Stringlisten-Editor Ereignisse für die Eigenschaft Events, z.B.: IBEvents.Events.Add('EVENT_NAME'); (für Delphi) oder IBEvents->Events->Add("EVENT_NAME"); (für C++). 4. Setzen Sie die dann Eigenschaft Registered auf True. InterBase-Verwaltungskomponenten Wenn InterBase 6 installiert ist, können Sie mit den Komponenten von InterBase 6 Administration die leistungsstarken API-Aufrufe von InterBase Services verwenden. Die Registerkarte InterBase Admin der IDE enthält folgende Komponenten: TIBConfigService TIBBackupService TIBRestoreService 38 1.1 Datenbankanwendungen mit ADO.NET RAD Studio für .NET Einführung in InterBase Express TIBValidationService TIBStatisticalService TIBLogService TIBSecurityService TIBLicensingService TIBServerProperties TIBInstall TIBUnInstall 1 Anmerkung: Diese Funktionen stehen nur zur Verfügung, wenn InterBase 6 installiert ist. IBConfigService Verwenden Sie TIBConfigService-Objekte zur Konfiguration von Datenbankparametern wie Seitenpuffer, Asynchron-Modus, Reservespeicher oder Sweep-Intervall. IBBackupService Mit Hilfe eines TIBBackupService-Objekts können Sie die Datenbank sichern. IBBackupService-Objekte ermöglichen die Angabe verschiedener Parameter. Sie können beispielsweise einen Blockierungsfaktor, den Namen der Sicherungsdatei und verschiedene Sicherungsoptionen angeben. IBRestoreService TIBRestoreService-Objekte werden zur Wiederherstellung von Datenbanken eingesetzt. Sie können verschiedene Parameter angeben, z.B. Seitenpuffer, Seitengröße und Wiederherstellungsoptionen. IBValidationService Mit Hilfe eines TIBValidationService-Objekts können Sie eine Datenbank validieren und Datenbanktransaktionen abstimmen. Das IBValidationService-Objekt unterstützt die Angabe einer Standardaktion für die Transaktion, die Rückgabe von Informationen zum Status der Transaktion und weitere Optionen zur Datenbankvalidierung. IBStatisticalService TIBStatisticalService-Objekte dienen zur Anzeige von Datenbankinformationen wie Datenseiten, Datenbankprotokoll, Header-Seiten, Indexseiten und Systembeziehungen. IBLogService TIBLogService-Objekte werden zur Erstellung von Protokolldateien eingesetzt. IBSecurityService TIBSecurityService-Objekte dienen zur Verwaltung des Benutzerzugriffs auf den InterBase-Server. Sie können mit Hilfe eines IBSecurityService-Objekts Benutzerkonten erstellen, ändern und löschen, alle Benutzer anzeigen und (mit SQL-Rollen) Arbeitsgruppen einrichten. IBLicensingService TIBLicensingService-Komponenten werden verwendet, um Software-Aktivierungszertifikate für InterBase hinzuzufügen oder zu entfernen. IBServerProperties Mit Hilfe einer TIBServerProperties-Komponente können Informationen zum Datenbankserver abgerufen werden 39 Einführung in InterBase Express RAD Studio für .NET 1.1 Datenbankanwendungen mit ADO.NET (Konfigurationsparameter, Versions- und Lizenzinformationen usw.). IBInstall TIBInstall-Komponenten dienen zum Einrichten von InterBase-Installationen. Sie können das Quell- und das Zielverzeichnis für die Installation sowie die zu installierenden Komponenten festlegen. IBUnInstall Ein TIBUnInstall-Objekt wird zur Konfiguration einer Deinstallationskomponente eingesetzt. 1 40 1.2 Anwendungen mit nicht verwaltetem RAD Studio für .NET COM Interop in verwalteten Anwendungen 1.2 Anwendungen mit nicht verwaltetem Code entwickeln RAD Studio stellt Funktionen zur Unterstützung von nicht verwaltetem Quelltext in .NET bereit. Sollen vorhandene COM- oder ActiveX-Komponenten im .NET Framework verwendet werden, können Sie bei der Erstellung Ihrer Anwendungen auf die .NET COM Interop-Funktionen in RAD Studio zurückgreifen. 1 Themen Name Beschreibung COM Interop in verwalteten Anwendungen ( DrInterop verwenden ( see page 41) see page 46) Das Befehlszeilenprogramm drinterop überprüft eine Assemblierung und generiert Diagnosemeldungen, die bei der Vorbereitung der Assemblierung für die Verwendung mit COM/Interop hilfreich sind. Das Programm drinterop befindet sich im Unterverzeichnis bin des Installationsverzeichnisses. Es wird mit folgendem Befehl aufgerufen: Deployment von COM Interop-Anwendungen ( Platform Invoke mit Delphi für .NET verwenden ( Interfaces für virtuelle Bibliotheken ( COM Interop ist ein .NET-Service, der ein nahtloses Zusammenspiel zwischen verwaltetem und nicht verwaltetem Code ermöglicht. Der Service COM Interop ist mit einer zweiseitig befahrbaren Brücke vergleichbar: Das heißt, Sie können sowohl vorhandene COM-Server und ActiveX-Elemente in neue .NET-Anwendungen integrieren, als auch .NET-Komponenten in vorhandene, nicht verwaltete Anwendungen übernehmen. In der RAD Studio-IDE stehen Tools zur Verfügung, die Sie bei der Integration vorhandener COM-Server und ActiveX-Elemente in verwaltete Anwendungen unterstützen. In der IDE lassen sich Referenzen zu nicht verwalteten DLLs in Ihr Projekt einfügen. Dann können Sie, wie bei verwalteten Assemblierungen, nach den darin enthaltenen Typen suchen. ActiveX-Elemente lassen sich... more ( see page 41) see page 47) see page 48) see page 56) Bei der Arbeit mit nicht verwalteten Komponenten gilt es, zwei Punkte nicht aus den Augen zu verlieren: Erstens, beachten Sie grundsätzlich, dass eine Interop-Assemblierung kein wirklicher Ersatz für den COM-Server ist, sondern sein Stellvertreter oder Proxy. Die von tlbimp und RAD Studio generierten Interop-Assemblierungen transformieren den nicht verwalteten Code einer Komponente in keinster Weise in verwalteten Code. Alle Dateien, die für eine Komponente in einer nicht verwalteten Deployment-Umgebung erforderlich sind, müssen zusätzlich zu den Interop-Assemblierungen auch in einer verwalteten Umgebung weitergegeben werden. Zweitens bieten die Interop Services des .NET Framework keine Umgehungsmöglichkeit für die Registrierung des COM-Servers auf dem Computer... more ( see page 47) In diesem Thema werden die grundlegenden Techniken zur Verwendung nicht verwalteter APIs erläutert. Außerdem wird auf einige der üblichen Fehlerquellen hingewiesen. Eine Schnellübersicht für die Übersetzung von Delphi-Datentypen wird ebenfalls angeboten. Dieses Thema kann nicht die gesamten Grundlagen von Platform Invoke oder des Marshaling von Daten beschreiben. In den Links am Ende dieses Themas finden Sie weitere Informationen zu Platform Invoke und Marshaling. Zum besseren Verständnis dieses Dokuments sollten Sie wissen, was Attribute sind und wie sie verwendet werden. In mehreren Beispielen wird die Win32-API benutzt. Detaillierte Informationen zu den erwähnten API-Funktionen finden Sie in der Dokumentation zum Windows Platform... more ( see page 48) In diesem Thema wird erläutert, wie Sie das Delphi-Feature Interfaces für virtuelle Bibliotheken verwenden. Interfaces für virtuelle Bibliotheken ermöglicht es, nicht verwalteten Code ohne Verwendung das Attributs DllImport zur Laufzeit zu suchen, zu laden und aufzurufen. 1.2.1 COM Interop in verwalteten Anwendungen COM Interop ist ein .NET-Service, der ein nahtloses Zusammenspiel zwischen verwaltetem und nicht verwaltetem Code ermöglicht. Der Service COM Interop ist mit einer zweiseitig befahrbaren Brücke vergleichbar: Das heißt, Sie können sowohl 41 COM Interop in verwalteten Anwendungen RAD Studio für .NET 1.2 Anwendungen mit nicht verwaltetem vorhandene COM-Server und ActiveX-Elemente in neue .NET-Anwendungen integrieren, als auch .NET-Komponenten in vorhandene, nicht verwaltete Anwendungen übernehmen. In der RAD Studio-IDE stehen Tools zur Verfügung, die Sie bei der Integration vorhandener COM-Server und ActiveX-Elemente in verwaltete Anwendungen unterstützen. In der IDE lassen sich Referenzen zu nicht verwalteten DLLs in Ihr Projekt einfügen. Dann können Sie, wie bei verwalteten Assemblierungen, nach den darin enthaltenen Typen suchen. ActiveX-Elemente lassen sich der Tool-Palette hinzufügen und von dort wie jede andere .NET-Komponente in Formulare einfügen. In dieser Übersicht werden folgende Themen erläutert: • Einführung in die Terminologie von COM Interop. Wenn Ihnen diese Konzepte bereits bekannt sind, können Sie direkt mit den Abschnitten zu den IDE-Features und Tools von RAD Studio für COM Interop fortfahren. • Relevante Tools des .NET Framework SDK für die Arbeit mit COM Interop. 1 • Verwendung von COM Interop-Assemblierungen in der IDE. Überblick zu COM Interop Die nahtlose Zusammenarbeit wird durch Stellvertreterobjekte namens Runtime Callable Wrappers (RCW) ermöglicht. Ein RCW bildet eine eigene Kommunikationsschicht zwischen Ihrer verwalteten Anwendung und dem aktuell nicht verwalteten COM-Server. Terminologie von COM Interop Das .NET Framework besteht aus zahlreichen Fachbegriffen und Akronymen. Dieser Abschnitt soll dabei helfen, die Terminologie in den Dokumentationen zu COM Interop zu verstehen. Metadaten Der Begriff "Metadaten" bezeichnet im Zusammenhang mit .NET und COM im Wesentlichen Typinformationen. In COM können Typinformationen auf verschiedene Arten gespeichert sein. Zum Beispiel ist eine Headerdatei in C++ ein sprachspezifischer Container für Typinformationen. Eine Typbibliothek ist ebenfalls ein Container für Typinformationen. Da Bibliotheken jedoch ein Binärformat aufweisen, sind sie in Bezug auf die Programmiersprache neutral. Anders als bei der COM-Entwicklung, bei der keine Typbibliotheken erforderlich sind, müssen für alle .NET-Assemblierungen sprachneutrale Metadaten bereitgestellt werden. Jede Assemblierung ist selbstbeschreibend, d.h. ihre Metadaten enthalten die kompletten Typinformationen, einschließlich der private deklarierten Typen und Klassenelemente. Benutzerdefinierte Attribute Entwickler zeichnen Programmentitäten (wie Klassen und ihre Methoden) häufig mit beschreibenden Attributen aus, wie zum Beispiel static, private, protected und public. Im .NET-Framework können Sie jede Entität, einschließlich Klassen, Eigenschaften, Methoden und Assemblierungen, mit einem selbst definierten Attribut und eigener Bedeutung auszeichnen. Benutzerdefinierte Attribute werden im Quelltext formuliert und vom Compiler verarbeitet. Am Ende des Build-Vorgangs werden benutzerdefinierte Attribute wie alle anderen Metadaten an die Output-Assemblierung ausgegeben. Reflexion Es ist ein charakteristisches Merkmal des .NET Framework, dass Typinformationen während der Compilierung nicht verloren gehen. Stattdessen werden alle Metadaten, einschließlich benutzerdefinierter Attribute, vom Compiler in die endgültige Output-Assemblierung ausgegeben. Die Metadaten stehen durch die .NET Reflexions-Services zur Laufzeit zur Verfügung. Das .NET Framework SDK enthält ein Reflexions-Tool namens ildasm. Damit können Entwickler jede .NET-Assemblierung öffnen 42 1.2 Anwendungen mit nicht verwaltetem RAD Studio für .NET COM Interop in verwalteten Anwendungen und die darin deklarierten Typen inspizieren. Reflexions-Tools bieten Programmierern die Möglichkeit, eine direkte Darstellung des IL-Codes, der vom Compiler generiert wird, zu erzeugen. In der IDE von RAD Studio ist ein eigenes integriertes Reflexions-Tool enthalten: der Metadaten-Explorer wird angezeigt, sobald Sie eine .NET-Assemblierung öffnen. Globaler Assemblierungs-Cache In COM können Komponenten an eine beliebige Position auf dem Computer des Benutzers weitergegeben werden. Ein Installationsscript der Komponente zeichnet deren Position in der Systemregistrierung auf. Befehlszeilen-Tools wie regsvr32 und tregsvr können COM-Komponenten auch in die Registrierung einfügen oder daraus entfernen. Die Registrierung der Komponenten ist in der COM-Programmierung erforderlich, auch wenn die Komponenten nicht von mehreren Anwendungen gemeinsam genutzt werden sollen. Das Modell der .NET-Programmierung sieht eine drastische Vereinfachung des Deployment von Anwendungen und Komponenten vor. Das Deployment von nicht gemeinsam genutzten Komponenten erfolgt auf der .NET-Plattform direkt im lokalen Installationsverzeichnis der Anwendung, und es ist keine Registrierung erforderlich. Eine nicht gemeinsam genutzte Komponente kann alternativ auch in das Verzeichnis weitergegeben werden, in dem sich die Konfigurationsdatei der Anwendung befindet. Auch hierfür ist beim Deployment keine Registrierung erforderlich. Gemeinsame Komponenten werden an einer bestimmten Position, dem so genannten Globalen Assemblierungs-Cache (GAC) installiert. Der GAC ist eine Weiterentwicklung der Systemregistrierung (auch wenn es sich dabei um einen vollkommen getrennten Mechanismus handelt, der in keinster Weise mit der Registrierung verbunden ist). Der GAC befindet sich im Dateisystem im Ordner \WINDOWS\ASSEMBLY. Das .NET Framework unterstützt das simultane Deployment verschiedener Versionen derselben Komponente. Wenn Sie den Globalen Assemblierungs-Cache im Windows Explorer öffnen, sehen Sie den Inhalt des GAC durch eine spezielle Oberflächenerweiterung. In dieser Darstellungsform werden alle im GAC installierten Assemblierungen mit ihren Versions-, Kultur- und öffentlichen Schlüsselinformationen aufgeführt. Es gibt drei Möglichkeiten, eine .NET-Komponente im GAC zu installieren. Sie können dazu das Befehlszeilen-Tool des Framework SDK mit dem Namen gacutil verwenden, das nachstehend erläutert wird. Die zweite Möglichkeit eine Komponente im GAC zu installieren besteht darin, den Ordner \WINDOWS\ASSEMBLY im Windows Explorer zu öffnen und dann die Assemblierung direkt mit der Maus in das Verzeichnis zu ziehen. Und drittens können Sie dazu das .NET-Tool zur Verwaltung der Konfiguration verwenden, das in der Systemsteuerung von Windows zur Verfügung steht. Starke Namen Das Konzept der starken Namen ist dem des 128-Bit-GUID (Globally Unique Identifier) in der COM-Programmierung sehr ähnlich. Ein GUID ist ein Name, der weltweit garantiert einmalig ist. Jede .NET-Assemblierung hat einen Basisnamen, der aus einem Text, einer Versionsnummer und Kulturinformationen (sofern vorhanden) besteht. Bei gemeinsam genutzten, im GAC installierten Assemblierungen reicht der Basisname alleine nicht aus, um die einmalige Benennung einer Assemblierung zu garantieren. Um einen weltweit einmaligen Namen zu erzeugen, wird eine Verschlüsselungstechnik mit öffentlichen und privaten Komponenten dazu benutzt, eine digitale Signatur zu erstellen. Diese Signatur wird der Assemblierung dann entweder mit dem .NET Framework SDK Assembly Linker (al.exe) oder über Assemblierungsattribute im Quelltext zugewiesen. Runtime Callable Wrappers (zur Laufzeit aufrufbare Wrapper) und COM Callable Wrapper (unter COM aufrufbare Wrapper) Der Zugriff auf eine Komponente, ob .NET-Komponente oder COM-Server, ist sehr transparent. Das heißt, wenn Sie einen COM-Server in einer .NET-Anwendung verwenden, wird dieser ähnlich jeder anderen .NET-Komponente dargestellt. Genauso wird auch jede .NET-Komponente in einer nicht verwalteten Anwendung mit Hilfe von COM Interop so dargestellt wie ein COM-Server. Diese Transparenz wird durch Proxies oder Wrapper-Objekte hinter den Kulissen erzeugt. Wenn Sie in einer verwalteten Anwendung ein COM-Objekt verwenden, erstellt die allgemeine Laufzeitumgebung (CLR) einen RCW (Runtime Callable Wrapper), der als Schnittstelle zwischen verwaltetem und nicht verwaltetem Code dient. Die gesamte komplexe Aufgabe des Daten-Marshaling und der Referenzzählung wird von dem RCW gehandhabt. Der RCW greift dafür nicht einmal auf die Interfaces IUnknown und IDispatch zurück. Wenn Sie eine .NET-Komponente in einer nicht verwalteten Anwendung benutzen, erzeugt das System einen Stellvertreter, den so genannten COM Callable Wrapper (CCW). 43 1 COM Interop in verwalteten Anwendungen RAD Studio für .NET 1.2 Anwendungen mit nicht verwaltetem Primäre Interop-Assemblierung Sobald im Modell der COM-Programmierung einem Typ ein GUID zugewiesen ist, bezieht sich dieser immer auf jenen speziellen Typ, unabhängig davon, wo der Typ auftritt. Zum Beispiel: Ein allgemeines Interface kann in vielen verschiedenen Typbibliotheken definiert sein, aber jede einzelne Typbibliothek würde das Interface mit demselben GUID definieren, weshalb die Duplizierung kein Problem ist. Wenn Sie jedoch COM-Interop-Assemblierungen für diese einzelnen Typbibliotheken erstellen, würde für jede Typbibliothek eine neue und eindeutige Assemblierung angelegt. Jede dieser einzelnen Assemblierungen würde dann (sofern es die allgemeine Laufzeitumgebung betrifft) eindeutige Typen enthalten. In diesem Fall wirkt sich also die starke Identität und die selbstbeschreibende Natur der .NET-Assemblierungen negativ aus. Dies führt zu einem GAC, der mit Interop-Assemblierungen überfüllt ist, die alle RCWs für dieselbe Typbibliothek enthalten. Besonders negativ für die allgemeine Laufzeitumgebung ist dabei, dass jede Assemblierung eindeutige und inkompatible Typen enthält, denn jeder Typ hat einen anderen starken Namen. 1 Um diese Auswüchse von Assemblierungen sowie die potenziellen Inkompatibilitäten von Typen zu vermeiden, steht im Framework die Möglichkeit zur Verfügung, eine Assemblierung als primäre Interop-Assemblierung für eine Typbibliothek zu definieren. Eine primäre Interop-Assemblierung ist immer mit einem starken Namen signiert, wofür der ursprüngliche Hersteller der Typbibliothek zuständig ist. COM Interop-Tools im .NET Framework SDK Die Funktionalität der Tools des .NET Framework SDK ist zum Teil in der Entwicklungsumgebung zu finden. Dieser Abschnitt soll keine komplette Referenz für diese Tools darstellen, sondern eher als Ausgangspunkt für weitere Erkundungen des .NET Framework SDK dienen und Ihnen die Funktionsweise der COM-Interop-Technologie in der IDE näher bringen. Import und Export von Typbibliotheken Tlbimp ist ein Befehlszeilen-Tool mit dessen Hilfe sich .NET-Assemblierungen aus einer Typbibliothek erstellen lassen. Tlbimp verwendet entweder direkt eine Typbibliothek oder eine nicht verwaltete DLL, die eine Typbibliothek als eingebettete Ressource enthält. Beachten Sie, dass die mit dem Tool tlbimp erstellte Assemblierung nur den Quelltext für den RCW, nicht aber für das ursprüngliche COM-Objekt selbst enthält. Aus diesem Grund müssen das Deployment und die Registrierung des COM-Objekts dennoch auf dem Computer des Endanwenders erfolgen. Die Assemblierung enthält auch diejenigen Typen, die in der Typbibliothek als Metadaten beschrieben sind. Das Tool Tlbimp bietet zusätzlich einen Befehlszeilenschalter für das Erstellen einer primären Interop-Assemblierung. Das .NET Framework SDK enthält ein weiteres Befehlszeilen-Tool mit dem Namen tlbexp, mit dessen Hilfe sich aus einer .NET-Assemblierung eine Typbibliothek erstellen lässt. Eine solchermaßen exportierte Typbibliothek ließe sich dazu verwenden, eine .NET-Komponente als COM-Server zur Verwendung in einer nicht verwalteten Anwendung bereitzustellen. ActiveX-Elementbibliotheken importieren Das Befehlszeilen-Tool Aximp generiert eine ActiveX-Element-Wrapper-Assemblierung. Diese Assemblierung ist notwendig, damit das ActiveX-Element in einem Windows Form verwendet werden kann. Dazu ist ein spezielles Utility erforderlich, denn in ein Windows Form können nur Steuerelemente eingefügt werden, die von der Klasse System.Windows.Forms.Control abgeleitet sind, und das Utility tlbimp erstellt keinen von dieser Klasse abgeleiteten Wrapper. Das Tool aximp erstellt beides, sowohl die Interop-Assemblierung (wie bei tlbimp umfasst dies auch die abhängigen Assemblierungen) als auch die ActiveX-Wrapper-Assemblierung. Ebenso wie tlbimp verfügt auch aximp über Befehlszeilenschalter, um die Assemblierungen mit einem starken Namen zu versehen. Anders als tlbimp kann das Tool aximp jedoch keine primäre Interop-Assemblierung generieren. Starke Namen generieren Wenn Sie eine .NET-Komponente an den GAC weitergeben, müssen Sie der Assemblierung einen starken Namensschlüssel zuweisen. Dies lässt sich mit dem Befehlszeilen-Tool sn des .NET Framework SDK ausführen. Einer Assemblierung kann mit einer der drei folgenden Möglichkeiten ein starker Name zugewiesen werden: 44 1.2 Anwendungen mit nicht verwaltetem RAD Studio für .NET COM Interop in verwalteten Anwendungen • Sie geben die Schlüsseldatei des starken Namens in der Befehlszeile des Assemblierungs-Linker (al) an. • Sie kennzeichnen die Assemblierung mit dem Attribut AssemblyKeyFile. • Sie verwenden eine Technik, die als "verzögertes Signieren" bezeichnet wird. Beim verzögerten Signieren wird die Assemblierung zum Zeitpunkt des Build mit dem öffentlichen Teil der Schlüsseldatei signiert. Vor der Auslieferung der Assemblierung verwenden Sie dann das Tool sn dazu, die Assemblierung mit dem privaten Schlüssel zu signieren. Deployment einer .NET-Komponente in den globalen Assemblierungs-Cache Das Utility gacutil des .NET Framework SDK ist ein Befehlszeilenprogramm, das sich zum Installieren, Entfernen und Anzeigen von Komponenten im GAC verwenden lässt. Der Befehl gacutil kann sowohl von Installationsscripts als auch von Batchdateien genutzt werden. Mit dem Befehl gacutil installieren und entfernen Sie gemeinsam genutzte Assemblierungen mit und ohne Referenzzählung. Es empfiehlt sich, die Befehlsschalter für das Auslassen der Referenzzählung nur während der Entwicklung zu verwenden. Installationsscripts, die gacutil für die Installation gemeinsamer Komponenten verwenden, sollten grundsätzlich den Befehlszeilenschalter für eine Referenzzählung enthalten. COM Interop-Assemblierungen in der IDE verwenden Die gesamte Funktionalität, die durch die Befehlszeilen-Tools des .NET Framework SDK zur Verfügung steht, wird im Grunde von der Klassenbibliothek des .NET Framework selbst bereitgestellt. Die IDE von RAD Studio nutzt die Klassen des .NET Framework auch für die Funktionen der Interoperabilität (Interop). Dabei gehen die Möglichkeiten der IDE weit über jene der Befehlszeilen-Tools hinaus und vereinfachen zusätzlich das Zusammenspiel mit nicht verwalteten Komponenten. Typbibliotheken und Interop-Assemblierungen In der IDE lassen sich Interop-Assemblierungen in der Projektverwaltung erstellen. Wenn Sie in ein Projekt eine Referenz zu einer DLL einfügen, können Sie aus den registrierten Typbibliotheken und den nicht verwalteten DLLs auswählen oder nach einer nicht registrierten Komponente suchen. Die IDE erstellt für jede importierte Typbibliothek oder DLL eine eigene Interop-Assemblierung. Diese Assemblierungen tragen den Namen Interop.LibraryName.DLL, wobei LibraryName der Name der Typbibliothek ist. Der Name der Bibliothek wird in der Bibliotheksanweisung im IDL-Quelltext angegeben, weshalb sich der Dateiname der generierten Assemblierung von dem der ursprünglichen DLL oder Typbibliothek unterscheiden kann. Jede Interop-Assemblierung (und alle zugehörigen Assemblierungen) werden als referenzierte Assemblierungen in das Projekt eingefügt. Die in der Interop-Assemblierung enthaltenen Typen werden in einen Namespace eingefügt, der denselben Namen wie die Typbibliothek hat. Auch dieser wird wiederum von der Bibliotheksanweisung im IDL-Quelltext abgeleitet. Wenn die referenzierte Assemblierung eine primäre Interop-Assemblierung besitzt, erkennt die IDE dies und erstellt keine neue Interop-Assemblierung. In diesem Fall fügt die IDE eine Referenz zu der betreffenden primären Interop-Assemblierung in den GAC ein. Die Assemblierung wird dann nicht in das lokale Projektverzeichnis kopiert. ActiveX-Elemente importieren Wenn Sie ein ActiveX-Element in Ihrer verwalteten Anwendung verwenden möchten, müssen Sie dieses zunächst in die Tool-Palette einfügen. Dadurch wird sowohl eine Interop-Assemblierung als auch eine ActiveX-Assemblierung mit einer Wrapperklasse erstellt, die von System.Windows.Forms.AxHost abgeleitet ist. Die ActiveX-Wrapper-Assemblierung erhält den Namen AXINTEROP.LibraryName.DLL, wobei LibraryName der Name der Typbibliothek ist. Wenn Sie das ActiveX-Element dann von der Tool-Palette in das Windows Form ziehen, werden automatisch die Referenzen zu beiden Assemblierungen in das Projekt eingefügt. Sobald es sich im Formular befindet, kann das ActiveX-Element wie jede andere .NET-Komponente behandelt werden. Sie können das Element markieren und dessen Eigenschaften und Ereignisbehandlungsroutinen im Objektinspektor setzen. Der ActiveX-Element-Wrapper stellt die Eigenschaften der Klasse Windows.Forms.Control bereit, während die Eigenschaften, die von dem betreffenden ActiveX-Element bereitgestellt werden, in der Kategorie Sonstiges im Objektinspektor zu finden sind. 45 1 DrInterop verwenden RAD Studio für .NET 1.2 Anwendungen mit nicht verwaltetem Interop-Assemblierungen und die Projektverwaltung Interop-Assemblierungen (einschließlich ActiveX-Element-Wrapper-Assemblierungen), die von der IDE generiert wurden, werden in einem separaten Ordner namens COMImports unterhalb des Projektordners aufbewahrt. Für jede generierte Assemblierung ist die Eigenschaft Lokal kopieren gesetzt. Dies bedeutet, dass die Assemblierung beim Build eines Projekts in den Ordner kopiert wird, in dem sich das endgültige Build des Projekts befindet. Lediglich die primären Interop-Assemblierungen betrifft dies nicht, denn ihr Deployment findet im GAC statt. Wenn Sie eine Referenz zu einer primären Interop-Assemblierung hinzufügen, kopiert die IDE die Assemblierung nicht in den Ordner COMImports. Die Assemblierung wird zwar in der Projektverwaltung angezeigt, aber wenn Sie mit der rechten Maustaste darauf klicken, sehen Sie, dass die Einstellung Lokal kopieren nicht aktiv ist. Die Liste der referenzierten Assemblierungen (einschließlich derjenigen, die keine Interop-Assemblierungen sind) ist ein Attribut des Projekts. Existiert der Ordner COMImports (oder eine der darin enthaltenen Interop-Assemblierungen) nicht, wenn Sie ein Projekt öffnen, versucht die IDE diesen neu zu erstellen. Wenn die IDE eine Interop-Assemblierung nicht erstellen kann, ist diese zwar dennoch als referenzierte Assemblierung in der Projektverwaltung aufgeführt, doch sie wird besonders hervorgehoben, damit Sie wissen, dass die Assemblierung aktuell nicht auf dem Computer vorhanden bzw. nicht registriert ist. 1 Siehe auch Referenzen zu einem COM-Server hinzufügen ( see page 150) ActiveX-Steuerelemente zur Tool-Palette hinzufügen Platform Invoke mit Delphi verwenden ( Interfaces für virtuelle Bibliotheken ( see page 48) see page 56) 1.2.2 DrInterop verwenden Das Befehlszeilenprogramm drinterop überprüft eine Assemblierung und generiert Diagnosemeldungen, die bei der Vorbereitung der Assemblierung für die Verwendung mit COM/Interop hilfreich sind. Das Programm drinterop befindet sich im Unterverzeichnis bin des Installationsverzeichnisses. Es wird mit folgendem Befehl aufgerufen: drinterop assembly Meldung Ursache Assembly ComVisible attribute is true when it Das Attribut [assembly:ComVisible(bool)] ist auf True gesetzt should be false. (Das Assemblierungsattribut oder nicht vorhanden. ComVisible ist True, muss aber False sein.) Assemblierungen sollten vor COM verborgen werden, um Probleme mit der Registrierung zu vermeiden. Setzen Sie das Attribut ComVisible auf False, und stellen Sie Klassen und Interfaces selektiv bereit. Assembly, class, or interface is exposed to COM but Das Attribut ComVisible für die Assemblierung, die Klasse oder das does not contain the Guid attribute. (Assemblierung, Interface ist auf True gesetzt, es ist aber kein Guid-Attribut Klasse oder Interface ist für COM bereitgestellt, enthält vorhanden. aber kein Guid-Attribut.) 46 1.2 Anwendungen mit nicht verwaltetem RAD Studio für .NET Platform Invoke mit Delphi für .NET A type library should be generated and registered for Diese Meldung wird erzeugt, wenn eine erforderliche Typbibliothek assembly. (Für die Assemblierung muss eine nicht in demselben Verzeichnis wie die Assemblierung vorhanden ist. Typbibliothek generiert und registriert werden.) Assembly does not contain the TypeLibVersion Das Attribut [assembly: TypeLibVersion(x,y)] ist in der attribute. (Die Assemblierung enthält kein Assemblierung nicht vorhanden. TypeLibVersion-Attribut.) Die Versionsnummern für Typbibliotheken werden standardmäßig aus den ersten beiden Stellen der Assemblierungsversion erzeugt. Durch die Verwendung des Attributs TypeLibVersion lassen sich Konflikte vermeiden, wenn die beiden ersten Stellen der Versionsnummern zweier Assemblierungen identisch sind. Reduce registry size by adding attribute [ClassInterface(ClassInterfaceType.None)] to class. (Registrierungsgröße durch Hinzufügen des Attributs [ClassInterface(ClassInterfaceType.None)] zur Klasse verringern.) Die Klasse enthält kein ClassInterface-Attribut. Standardmäßig wird für jede Klasse ein entsprechendes Interface erzeugt, wobei dem Klassennamen ein Unterstrich vorangestellt wird. Dem Interface sind keine Methoden zugeordnet. Sie können die Größe der Registrierung verringern, indem Sie der Klasse das Attribut [ClassInterface(ClassInterfaceType.None)] zuweisen. Anmerkung: Wenn keine der oben aufgeführten Bedingungen vorliegt, gibt das Programm drinterop keine Meldungen aus. 1.2.3 Deployment von COM Interop-Anwendungen Bei der Arbeit mit nicht verwalteten Komponenten gilt es, zwei Punkte nicht aus den Augen zu verlieren: Erstens, beachten Sie grundsätzlich, dass eine Interop-Assemblierung kein wirklicher Ersatz für den COM-Server ist, sondern sein Stellvertreter oder Proxy. Die von tlbimp und RAD Studio generierten Interop-Assemblierungen transformieren den nicht verwalteten Code einer Komponente in keinster Weise in verwalteten Code. Alle Dateien, die für eine Komponente in einer nicht verwalteten Deployment-Umgebung erforderlich sind, müssen zusätzlich zu den Interop-Assemblierungen auch in einer verwalteten Umgebung weitergegeben werden. Zweitens bieten die Interop Services des .NET Framework keine Umgehungsmöglichkeit für die Registrierung des COM-Servers auf dem Computer des Endanwenders. Beachten Sie, dass eine Registrierung auch während der Entwicklung einer verwalteten Anwendung erforderlich ist. Das Deployment einer Interop-Assemblierung erfolgt, ebenso wie bei jeder anderen .NET-Assemblierung, zusammen mit der verwalteten ausführbaren Datei im Installationsordner oder im GAC. Erfolgt das Deployment einer Interop-Assemblierung im GAC, müssen Sie ihr während der Entwicklung einen starken Namen geben. Das Deployment primärer Interop-Assemblierungen erfolgt grundsätzlich im GAC. Doch dies bedeutet nicht umgekehrt, dass es sich durch das Deployment einer Assemblierung im GAC bereits automatisch um eine primäre Interop-Assemblierung handelt. Um eine Interop-Assemblierung als primäre Interop-Assemblierung auszuzeichnen, müssen Sie die Befehlszeilenoption /primary des Utilitys tlbimp verwenden. Die IDE verfügt aktuell über keine integrierte Funktion zum Erstellen primärer Interop-Assemblierungen. Das Deployment nicht verwalteter COM-Server lässt sich auf dem Computer des Endanwenders an einer beliebigen Position vornehmen. Doch wie bereits erwähnt, müssen Sie die nicht verwalteten Komponenten bei der Installation der Anwendung nach wie vor registrieren. Siehe auch CodeGear – Übersicht zum Deployment von Anwendungen Microsoft – Übersicht zum Deployment von Anwendungen 47 1 Platform Invoke mit Delphi für .NET RAD Studio für .NET 1.2 Anwendungen mit nicht verwaltetem 1.2.4 Platform Invoke mit Delphi für .NET verwenden In diesem Thema werden die grundlegenden Techniken zur Verwendung nicht verwalteter APIs erläutert. Außerdem wird auf einige der üblichen Fehlerquellen hingewiesen. Eine Schnellübersicht für die Übersetzung von Delphi-Datentypen wird ebenfalls angeboten. Dieses Thema kann nicht die gesamten Grundlagen von Platform Invoke oder des Marshaling von Daten beschreiben. In den Links am Ende dieses Themas finden Sie weitere Informationen zu Platform Invoke und Marshaling. Zum besseren Verständnis dieses Dokuments sollten Sie wissen, was Attribute sind und wie sie verwendet werden. In mehreren Beispielen wird die Win32-API benutzt. Detaillierte Informationen zu den erwähnten API-Funktionen finden Sie in der Dokumentation zum Windows Platform SDK. 1 Dieser Abschnitt behandelt die folgenden Themen: • Nicht verwaltete Funktionen aufrufen • Strukturen • Callback-Funktionen • Objektreferenzen übergeben • COM-Interfaces verwenden Nicht verwaltete Funktionen aufrufen Beim Aufruf nicht verwalteter Funktionen, muss eine verwaltete Deklaration der Funktion erstellt werden, die die nicht verwalteten Typen repräsentiert. In vielen Fällen verwenden Funktionen Zeiger auf Daten, die Variablentypen sein können. Ein Beispiel für eine solche Funktion ist die Win32-API-Funktion SystemParametersInfo, die wie folgt deklariert wird: BOOL SystemParametersInfo( UINT uiAction, // Abzurufender oder zu setzender Systemparameter UINT uiParam, // Abhängig von der auszuführenden Aktion PVOID pvParam, // Abhängig von der auszuführenden Aktion UINT fWinIni // Benutzerprofil-Aktualisierungsoption ); Je nach dem Wert von uiAction kann pvParam eine von Dutzenden verschiedener Strukturen oder auch einfacher Datentypen sein. Da es keine Möglichkeit gibt, dies mit einer einzigen Deklaration darzustellen, müssen mehrere überladene Versionen der Funktion deklariert werden (siehe Borland.Vcl.Windows.pas), wobei jede Überladung einen bestimmten Fall abdeckt. Der Parameter pvParam kann auch die generische Deklaration IntPtr erhalten. Damit wird die Aufgabe des Marshaling an die aufrufende Funktion übergeben. Der integrierte Marshaler übernimmt dies dann nicht. Beachten Sie, dass die Datentypen, die in einer verwalteten Deklaration einer nicht verwalteten Funktion verwendet werden, jenen Typen entsprechen müssen, die der Marshaler unterstützt. Andernfalls muss der Aufrufer die Parameter als IntPtr deklarieren und ist dann für das Marshaling der Daten verantwortlich. Datentypen Die meisten Datentypen müssen nicht verändert werden, mit Ausnahme der Zeiger- und String-Typen. Die folgende Tabelle führt häufig verwendete Datentypen auf und zeigt, wie diese für verwalteten Code übersetzt werden: Nicht verwalteter Datentyp 48 Verwalteter Datentyp Eingabeparameter Ausgabeparameter Zeiger auf String (PChar) String StringBuilder Untypisierter Parameter/Puffer TBytes TBytes Zeiger auf Struktur (PRect) const TRect var TRect 1.2 Anwendungen mit nicht verwaltetem RAD Studio für .NET Platform Invoke mit Delphi für .NET Zeiger auf einfachen Typ (PByte) const Byte var Byte Zeiger auf Array (PInteger) Integer-Array Integer-Array Zeiger auf Zeigertyp (^PInteger) IntPtr IntPtr IntPtr kann auch alle Zeiger- und String-Typen darstellen. In diesem Fall muss das Marshaling der Daten mit Hilfe der Klasse Marshal manuell ausgeführt werden. Wenn Sie mit Funktionen arbeiten, die einen Textpuffer empfangen, bietet die Klasse StringBuilder die einfachste Lösung. Das folgende Beispiel zeigt, wie die Klasse StringBuilder dazu verwendet wird, einen Textpuffer zu empfangen. function GetText(Window: HWND; BufSize: Integer = 1024): string; var Buffer: StringBuilder; begin Buffer := StringBuilder.Create(BufSize); GetWindowText(Window, Buffer, Buffer.Capacity); Result := Buffer.ToString; end; 1 Die Klasse StringBuilder wird automatisch in einen nicht verwalteten Puffer und wieder zurück übertragen. In einigen Fällen kann es sich als unpraktikabel oder unmöglich erweisen, die Klasse StringBuilder zu verwenden. Das folgende Beispiel zeigt, wie sich das Marshaling zum Senden und Empfangen von Strings mit SendMessage ausführen lässt: procedure SetText(Window: HWND; Text: string); var Buffer: IntPtr; begin Buffer := Marshal.StringToHGlobalAuto(Text); try Result := SendMessage(Window, WM_SETTEXT, 0, Buffer); finally Marshal.FreeHGlobal(Buffer); end; end; Ein nicht verwalteter Puffer ist zugewiesen, und der String durch den Aufruf von StringToHGlobalAuto hineinkopiert worden. Der Puffer muss freigegeben werden, wenn er nicht mehr benötigt wird. Um einen Zeiger an eine Struktur zu übertragen, verwenden Sie das Marshaling. Mit der Methode StructureToPtr wird der Inhalt der Struktur in den nicht verwalteten Speicherpuffer kopiert. Das folgende Beispiel zeigt, wie ein Textpuffer empfangen wird und die Daten in einen String übertragen werden: function GetText(Window: HWND; BufSize: Integer = 1024): string; var Buffer: IntPtr; begin Buffer := Marshal.AllocHGlobal(BufSize * Marshal.SystemDefaultCharSize); try SendMessage(Window, WM_GETTEXT, BufSize, Buffer); Result := Marshal.PtrToStringAuto(Buffer); finally Marshal.FreeHGlobal(Buffer); end; end; Es muss sichergestellt sein, dass der Puffer groß genug ist, und dass er bei Verwendung der Methode SystemDefaultCharSize die BufSize-Zeichen auf jedem System garantiert enthalten kann. Anspruchsvollere Techniken Bei der Arbeit mit nicht verwalteten APIs ist es üblich, Parameter entweder als Zeiger auf etwas oder als NULL zu übergeben. Da die verwalteten API-Übersetzungen keine Zeigertypen verwenden, kann es notwendig werden, eine zusätzliche überladene 49 Platform Invoke mit Delphi für .NET RAD Studio für .NET 1.2 Anwendungen mit nicht verwaltetem Version der Funktion mit dem Parameter zu erstellen, der sich als NULL oder IntPtr deklarieren lässt. Spezialfälle Es gibt Fälle, in denen die Klasse StringBuilder und auch die Klasse Marshal die Daten, die an die nicht verwaltete Funktion übergeben werden sollen, nicht korrekt behandeln kann. Ein solcher Fall tritt beispielsweise ein, wenn der String, den Sie übergeben oder empfangen möchten, mehrere Strings enthält, die durch NULL-Zeichen getrennt sind. Da der Standard-Marshaler bereits die erste NULL als Ende des Strings interpretiert, werden die Daten abgeschnitten (dies gilt auch für die Methoden StringToHGlobalXXX und PtrToStringXXX). In dieser Situation lässt sich TBytes verwenden (mit Hilfe der Funktionen PlatformStringOf und PlatformBytesOf in Borland.Delphi.System wird das Byte-Array zu/von einem String konvertiert.) Beachten Sie, dass diese Zusatzfunktionen keine terminierenden NULL-Zeichen hinzufügen oder entfernen. Wenn Sie mit COM-Interfaces arbeiten, hat die Aufzählung des Typs UnmanagedType (dieser wird von der Klasse MarshalAsAttribute verwendet) den Wert LPStruct. Dies gilt nur in Kombination mit der Klasse System.Guid, die den Marshaler dazu bringt, die Parameter in eine Win32-GUID-Struktur zu konvertieren. Die Funktion CoCreateInstance wird in Delphi 7 wie folgt deklariert: 1 function CoCreateInstance([MarshalAs(UnmanagedType.LPStruct)] clsid: TCLSID; [MarshalAs(UnmanagedType.IUnknown)] unkOuter: TObject; dwClsContext: Longint; [MarshalAs(UnmanagedType.LPStruct)] iid: TIID; [MarshalAs(UnmanagedType.Interface)] out pv ): HResult; Dies ist gegenwärtig die einzige dokumentierte Verwendung von UnmanagedType.LPStruct. Strukturen Der größte Unterschied zwischen dem Aufruf nicht verwalteter Funktionen und der Übergabe von Strukturen an nicht verwaltete Funktionen besteht darin, dass der Standard-Marshaler bei der Arbeit mit Strukturen einigen wesentlichen Beschränkungen unterliegt. Dynamische Arrays, Arrays von Strukturen und die Klasse StringBuilder lassen sich nicht in Strukturen verwenden. In diesen Fällen ist IntPtr erforderlich (obwohl in manchen Fällen auch string mit verschiedenen Marshaling-Attributen für Strings verwendet werden kann). Datentypen Die folgende Tabelle führt häufig verwendete Datentypen auf und zeigt, wie diese für verwalteten Code "übersetzt" werden: Nicht verwalteter Datentyp Verwalteter Datentyp Eingabeparameter Ausgabeparameter Zeiger auf String (PChar) String IntPtr Zeichenarray (array[a..b] of Char) String String Werttyp-Array (array[a..b] of Byte) array[a..b] of Byte array[a..b] Byte Dynamisches Array (array[0..0] of type) IntPtr IntPtr Struktur-Array (array[1..2] of TRect) IntPtr aufgeschlüsselt Zeiger auf Struktur (PRect) IntPtr IntPtr Zeiger auf einfachen Typ (PByte) IntPtr IntPtr Zeiger auf Array (PInteger) IntPtr IntPtr Zeiger auf Zeigertyp (^PInteger) IntPtr IntPtr oder IntPtr aufgeschlüsselt of oder Wenn Sie in Strukturen mit Arrays und Strings arbeiten, wird das Attribut MarshalAs dazu verwendet, dem Standard-Marshaler zusätzliche Informationen über den Datentyp bereitzustellen. In Delphi 7 wird ein Record wie folgt deklariert: 50 1.2 Anwendungen mit nicht verwaltetem RAD Studio für .NET Platform Invoke mit Delphi für .NET type TMyRecord = record IntBuffer: array[0..31] of Integer; CharBuffer: array[0..127] of Char; lpszInput: LPTSTR; lpszOutput: LPTSTR; end; In RAD Studio würde er hingegen so deklariert: type [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] TMyRecord = record [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)] IntBuffer: array[0..31] of Integer; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)] CharBuffer: string; [MarshalAs(UnmanagedType.LPTStr)] lpszInput: string; lpszOutput: IntPtr; end; 1 Die oben dargestellten Deklarationen gehen davon aus, dass die Strings plattformabhängige TChars enthalten (wie gewöhnlich von der Win32-API verwendet). Damit der Text in lpszOutput empfangen werden kann, muss die Methode Marshal.AllocHGlobal aufgerufen werden, bevor die Struktur an eine API-Funktion übergeben wird. Eine Struktur kann wiederum Strukturen enthalten, aber keine Zeiger auf Strukturen. In diesem Fall muss ein IntPtr deklariert und die Methode Marshal.StructureToPtr dazu verwendet werden, die Daten von der verwalteten Struktur in den nicht verwalteten Speicher zu verschieben. Beachten Sie, dass StructureToPtr den erforderlichen Speicherplatz nicht automatisch zuweist (dies muss separat erfolgen). Stellen Sie sicher, dass Sie Marshal.SizeOf verwenden, um den erforderlichen Speicherplatz zu ermitteln, da der Delphi-Operator SizeOf das Attribut MarshalAs nicht erkennt (im vorhergehenden Beispiel wäre CharBuffer mit dem Delphi-Operator SizeOf 4 Byte, obwohl es in Wirklichkeit 128 Byte in einem Single-Byte-System belegen würde). Die folgenden Beispiele zeigen, wie Botschaften gesendet werden, die Zeiger an eine Struktur übergeben: procedure SetRect(Handle: HWND; const Rect: TRect); var Buffer: IntPtr; begin Buffer := Marshal.AllocHGlobal(Marshal.SizeOf(TypeOf(TRect))); try Marshal.StructureToPtr(TObject(Rect), Buffer, False); SendMessage(Handle, EM_SETRECT, 0, Buffer); finally Marshal.DestroyStructure(Buffer, TypeOf(TRect)); end; end; procedure GetRect(Handle: HWND; var Rect: TRect); var Buffer: IntPtr; begin Buffer := Marshal.AllocHGlobal(Marshal.SizeOf(TypeOf(TRect))); try SendMessage(Handle, EM_GETRECT, 0, Buffer); Rect := TRect(Marshal.PtrToStructure(Buffer, TypeOf(TRect))); finally Marshal.DestroyStructure(Buffer, TypeOf(TRect)); end; end; Wenn die Struktur Felder enthält, für die die Marshal-Schicht weitere Puffer freigeben muss, ist es wichtig anstelle der Methode FreeHGlobal die Methode DestroyStructure aufzurufen (detaillierte Informationen hierzu finden Sie in der Dokumentation zu DestroyStructure). 51 Platform Invoke mit Delphi für .NET RAD Studio für .NET 1.2 Anwendungen mit nicht verwaltetem Weiterführende Themen Bei der Arbeit mit nicht verwalteten APIs kann es erforderlich sein, ein Byte-Array in eine Struktur zu konvertieren (oder eines bzw. mehrere Felder aus einer Struktur abzurufen, die sich in einem Byte-Array befindet) oder umgekehrt. Die Klasse Marshal enthält zwar eine Methode, um den Offset des angegebenen Feldes abzurufen, diese ist aber extrem langsam. Deshalb sollte ihre Verwendung auf Sonderfälle beschränkt werden. Interne Geschwindigkeitstests haben ergeben, dass es bei einer Struktur mit acht oder neun numerischen Feldern deutlich schneller ist, einen nicht verwalteten Speicherblock zu reservieren, das Byte-Array in den nicht verwalteten Speicher zu kopieren und dann die Methode PtrToStructure aufzurufen, anstatt die Position nur eines Feldes mit der Methode Marshal.OffsetOf ausfindig zu machen und die Daten dann mit der Klasse BitConverter zu konvertieren. Borland.Vcl.WinUtils enthält Hilfefunktionen zur wechselseitigen Konvertierung zwischen Byte-Arrays und Strukturen (siehe StructureToBytes und BytesToStructure). 1 Spezialfälle Es gibt Situationen, in denen eine benutzerdefinierte Verarbeitung erforderlich ist, zum Beispiel das Senden von Botschaften mit einem Zeiger auf ein Integer-Array. In diesem Fall stellt die Klasse Marshal Methoden zum direkten Kopieren der Daten in den nicht verwalteten Puffer an den angegebenen Offsets bereit (auf diese Weise können Sie nach der Pufferzuweisung einen benutzerdefinierten Array-Datentyp erstellen). Das folgende Beispiel zeigt, wie Sie eine Botschaft senden, in der LParam einen Zeiger auf einen Integer-Array darstellt. function SendArrayMessage(Handle: HWND; Msg: UINT; WParam: WPARAM; LParam: TIntegerDynArray): LRESULT; var Buffer: IntPtr; begin Buffer := Marshal.AllocHGlobal(Length(LParam) * SizeOf(Integer)); try Marshal.Copy(LParam, 0, Buffer, Length(LParam)); Result := SendMessage(Handle, Msg, WParam, Buffer); finally Marshal.FreeHGlobal(Buffer); end; end; Callback-Funktionen Wenn ein Funktionszeiger für eine verwaltete Funktion an eine nicht verwaltete API übergeben werden soll, muss eine Referenz zum Delegate verwaltet werden, andernfalls gelangt dieser in die Garbage Collection. Wenn Sie einen Zeiger direkt an eine verwaltete Funktion übergeben, wird ein temporärer Delegate erstellt. Sobald dieser den Gültigkeitsbereich verlässt (im nachstehenden Beispiel am Ende von MyFunction) wird er der Garbage Collection überlassen. Beachten Sie den nachstehenden Code für Delphi 7: function MyFunction: Integer; begin ... RegisterCallback(@MyCallback); ... end; Damit dies auch in einer verwalteten Umgebung funktioniert, muss der Code wie folgt geändert werden: const MyCallbackDelegate: TFNMyCallback = @MyCallback; function MyFunction: Integer; begin ... RegisterCallback(MyCallbackDelegate); ... end; Damit ist sichergestellt, dass der Callback solange erfolgen kann wie MyCallbackDelegate sich innerhalb des 52 1.2 Anwendungen mit nicht verwaltetem RAD Studio für .NET Platform Invoke mit Delphi für .NET Gültigkeitsbereichs befindet. Datentypen Für Callbacks gelten dieselben Regeln wie für alle anderen nicht verwalteten API-Funktionen. Spezialfälle Alle Parameter, die in einem asynchronen Prozess verwendet werden, müssen als IntPtr deklariert werden. Der Marshaler gibt nach der Rückkehr vom Funktionsaufruf soviel Speicher frei, wie er den nicht verwalteten Typen zugewiesen hat. Bei der Verwendung von IntPtr liegt es in Ihrer Verantwortung, den zugewiesenen Speicher wieder freizugeben. Objektreferenzen übergeben Wenn Sie mit der Windows-API arbeiten, werden Objektreferenzen gelegentlich vorübergehend an die API übergeben. Dort werden sie gespeichert und später, meist zusammen mit einem bestimmten Ereignis, zurück an die Anwendung zur Verarbeitung übergeben. Dies kann auch mit .NET ausgeführt werden, aber es ist eine besondere Sorgfalt erforderlich, um sicherzustellen, dass eine Referenz auf alle Objekte behalten wird (andernfalls werden sie von der Garbage Collection eingesammelt). Datentypen Nicht verwaltete Datentypen Zeiger (Objektreferenz, Benutzerdaten) Verwalteter Datentyp Daten zur Verfügung stellen Daten empfangen GCHandle GCHandle Die Klasse GCHandle sorgt dafür, dass Objektreferenzen an nicht verwalteten Code übergeben werden und stellt sicher, dass keine automatische Speicherfreigabe über die Garbage Collection erfolgt. Die Klasse GCHandle muss zugewiesen und später, wenn sie nicht mehr benötigt wird, wieder freigegeben werden. Es gibt verschiedene Typen von GCHandle, wobei GCHandleType.Normal dann am sinnvollsten ist, wenn ein nicht verwalteter Client die einzige Referenz enthält. Nach der Zuweisung übergeben Sie GCHandle an eine API-Funktion und wandeln sie in den Typ IntPtr um (wahlweise und abhängig von der nicht verwalteten Deklaration ist auch eine weitere Umwandlung in LongInt möglich). Der Typ IntPtr kann später jederzeit an eine GCHandle-Klasse zurück überführt werden. Beachten Sie, dass vor dem Zugriff auf die Eigenschaft Target die Methode IsAllocated aufgerufen werden muss. Siehe dazu das nachstehende Beispiel: procedure MyProcedure; var Ptr: IntPtr; Handle: GCHandle; begin ... if Ptr <> nil then begin Handle := GCHandle(Ptr); if Handle.IsAllocated then DoSomething(Handle.Target); end; ... end; Anspruchsvollere Techniken Der Einsatz einer GCHandle-Klasse ist zwar relativ einfach, bringt aber Performance-Einbußen mit sich. Es besteht auch die Gefahr von Ressourcenlecks, wenn die Handles nicht korrekt freigegeben wurden. Wenn Objektreferenzen im verwaltetem Code aufbewahrt werden, ist es möglich, anstelle einer Objektreferenz auch einen einmaligen Index, zum Beispiel den von der 53 1 Platform Invoke mit Delphi für .NET RAD Studio für .NET 1.2 Anwendungen mit nicht verwaltetem Methode GetHashCode zurückgegebenen Hash-Code, an die nicht verwaltete API zu übergeben. Eine Hash-Tabelle kann auf der verwalteten Seite gepflegt werden, um das Abrufen von Objektinstanzen auf der Basis des Hash-Werts zu vereinfachen, falls dies erforderlich ist. Ein Beispiel für diese Technik finden Sie in der Klasse TTreeNodes (in Borland.Vcl.ComCtrls). COM-Interfaces verwenden Für COM-Interfaces ist ein ähnlicher Ansatz erforderlich wie bei der Verwendung nicht verwalteter APIs. Das Interface muss mit Hilfe von benutzerdefinierten Attributen deklariert werden, um den Interface-Typ und den GUID anzugeben. Im nächsten Schritt werden dann die Methoden deklariert, wobei derselbe Ansatz wie bei nicht verwalteten APIs benutzt wird. Das folgende Beispiel verwendet das Interface IAutoComplete, das in Delphi 7 wie folgt deklariert wird: IAutoComplete = interface(IUnknown) ['{00bb2762-6a77-11d0-a535-00c04fd7d062}'] function Init(hwndEdit: HWND; punkACL: IUnknown; pwszRegKeyPath: LPCWSTR; pwszQuickComplete: LPCWSTR): HRESULT; stdcall; function Enable(fEnable: BOOL): HRESULT; stdcall; end; 1 In RAD Studio hingegen erfolgt die Deklaration auf diese Weise: [ComImport, GuidAttribute('00BB2762-6A77-11D0-A535-00C04FD7D062'), InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)] IAutoComplete = interface function Init(hwndEdit: HWND; punkACL: IEnumString; pwszRegKeyPath: IntPtr; pwszQuickComplete: IntPtr): HRESULT; function Enable(fEnable: BOOL): HRESULT; end; Beachten Sie die benutzerdefinierten Attribute, die zur Beschreibung des GUID und des Interface-Typs verwendet werden. Ferner ist es wichtig, die Klasse ComImportAttribute zu verwenden. Beachten Sie beim Import von COM-Interfaces, dass die Methoden IUnknown/IDispatch nicht implementiert werden müssen und dass eine Vererbung nicht unterstützt wird. Datentypen Für die meisten Datentypen gelten dieselben Regeln wie für nicht verwaltete Funktionen. Folgendes ist jedoch zusätzlich zu beachten: Nicht verwalteter Datentyp Verwalteter Datentyp Daten zur Verfügung stellen Daten empfangen GUID System.Guid System.Guid IUnknown TObject TObject IDispatch TObject TObject Interface TObject TObject Variant TObject TObject SafeArray (des Typs) Array von <Typ> Array von <Typ> BSTR String String Die Verwendung des benutzerdefinierten Attributs MarshalAsAttribute ist für manche der oben aufgeführten Verwendungszwecke von TObject erforderlich, um den genauen, nicht verwalteten Typ anzugeben (zum Beispiel UnmanagedType.IUnknown, UnmanagedType.IDispatch oder UnmanagedType.Interface). Dies gilt auch für manche Arraytypen. Ein Beispiel für die explizite Angabe eines nicht verwalteten Typs ist die Methode Next des Interface IEnumString. Die Win32-API deklariert Next wie folgt: HRESULT Next( ULONG celt, LPOLESTR * rgelt, ULONG * pceltFetched 54 1.2 Anwendungen mit nicht verwaltetem RAD Studio für .NET Platform Invoke mit Delphi für .NET ); In RAD Studio lautet die Deklaration hingegen wie folgt: function Next(celt: Longint; [out, MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.LPWStr, SizeParamIndex = 0)] rgelt: array of string; out pceltFetched: Longint ): Integer; Anspruchsvollere Techniken Bei der Arbeit mit SafeArrays konvertiert die Marshal-Schicht zum Beispiel ein Array aus Bytes in den entsprechenden SafeArray-Typ. Die Marshal-Schicht ist gegenüber unverträglichen Typen beim Konvertieren von SafeArrays sehr "aufmerksam". Wenn der Typ des SafeArray nicht genau dem Typ des verwalteten Array entspricht, wird eine Exception ausgelöst. Einige der Win32-SafeArray-APIs setzen den Typ des SafeArray bei der Erstellung des Arrays nicht korrekt. Das führt in der Marshal-Schicht bei einer Verwendung aus .NET zu einer fehlerhaften Zuweisung. Es gibt dafür nur zwei Lösungsmöglichkeiten: Entweder muss sichergestellt sein, dass das SafeArray korrekt erstellt wurde, oder die automatische Konvertierung der Marshal-Schicht muss umgangen werden. Letzteres kann riskant sein (aber auch die einzige Alternative, wenn Sie nicht die Möglichkeit haben, den COM-Server, der die Daten liefert, entsprechend zu ändern). Beachten Sie folgende Deklaration: function AS_GetRecords(const ProviderName: WideString; Count: Integer; out RecsOut: Integer; Options: Integer; const CommandText: WideString; var Params: OleVariant; var OwnerData: OleVariant): OleVariant; Wenn es sich bei dem Rückgabewert immer um ein SafeArray handelt (dessen Typ nicht korrekt beschrieben ist), das in ein variantes Array verpackt ist, lässt sich die Deklaration wie folgt ändern: type TSafeByteArrayData = packed record VType: Word; Reserved1: Word; Reserved2: Word; Reserved3: Word; VArray: IntPtr; { Dies ist ein Zeiger auf das aktuelle SafeArray } end; function AS_GetRecords(const ProviderName: WideString; Count: Integer; out RecsOut: Integer; Options: Integer; const CommandText: WideString; var Params: OleVariant; var OwnerData: OleVariant): TSafeByteArrayData; Angenommen Sie wissen, dass ein OleVariant-Objekt ein Record ist, dann kann in Delphi 7 der Record TSafeByteArrayData von TVarData extrahiert werden (ähnlich dem Fall, in dem der Datentyp varArray ist). Der Record bietet Zugriff auf den Rohzeiger auf das SafeArray, von dem sich die Daten extrahieren lassen. Wird anstelle eines OleVariant-Objekts jedoch eine Struktur verwendet, versucht die Marshal-Schicht nicht, den Datentyp des Arrays zu interpretieren. Das Extrahieren der Daten aus dem SafeArray bedeutet aber einen zusätzlichen Aufwand. Spezialfälle Beim Erstellen einer Instanz empfiehlt es sich zwar, Activator.CreateInstance zu verwenden, doch besteht dadurch keine komplette Kompatibilität zu CoCreateInstanceEx. Bei der Arbeit mit externen Servern versucht CreateInstance grundsätzlich, den Server lokal aufzurufen, ehe der Aufruf des Servers auf dem Remote-Computer erfolgt. Gegenwärtig besteht die einzige bekannte Lösung dieses Problems in der Verwendung von CoCreateInstanceEx. Da keine Vererbung unterstützt wird, muss ein Nachkommen-Interface die Vorfahrmethoden deklarieren. Nachstehend sehen Sie das Interface IAutoComplete2, das IAutoComplete erweitert. [ComImport, GuidAttribute('EAC04BC0-3791-11d2-BB95-0060977B464C'), InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)] IAutoComplete2 = interface(IAutoComplete) 55 1 Interfaces für virtuelle Bibliotheken RAD Studio für .NET 1.2 Anwendungen mit nicht verwaltetem // IAutoComplete-Methoden function Init(hwndEdit: HWND; punkACL: IEnumString; pwszRegKeyPath: IntPtr; pwszQuickComplete: IntPtr): HRESULT; function Enable(fEnable: BOOL): HRESULT; // function SetOptions(dwFlag: DWORD): HRESULT; function GetOptions(var dwFlag: DWORD): HRESULT; end; Siehe auch Marshaling von Daten mit Platform Invoke COM Interop in verwalteten Anwendungen ( Interfaces für virtuelle Bibliotheken ( see page 41) see page 56) 1 1.2.5 Interfaces für virtuelle Bibliotheken In diesem Thema wird erläutert, wie Sie das Delphi-Feature Interfaces für virtuelle Bibliotheken verwenden. Interfaces für virtuelle Bibliotheken ermöglicht es, nicht verwalteten Code ohne Verwendung das Attributs DllImport zur Laufzeit zu suchen, zu laden und aufzurufen. Standard PInvoke Um aus verwaltetem Code eine nicht verwaltete Funktion aufzurufen, benötigen Sie einen .NET-Service namens Platform Invoke (Kurzform: PInvoke). Damit dieser Service genutzt werden kann, müssen Sie im Quelltext für jede nicht verwaltete Funktion, die Sie aufrufen möchten, einen Prototyp deklarieren. Dies kann innerhalb einer vorhandenen .NET-Klasse erfolgen, Sie können für die Prototypen aber auch eine neue Klasse erstellen. Jede Prototyp-Deklaration für nicht verwalteten Code muss mit dem Attribut DllImport gekennzeichnet werden. Im DllImport-Attribut wird der Name der DLL angegeben, in der sich die nicht verwaltete Funktion befindet. Da der nicht verwaltete Prototyp während der Compilierung mit dem DllImport-Attribut gekennzeichnet ist, lassen sich DLLs und ihre exportierten, nicht verwalteten Funktionen nur schwer dynamisch bestimmen. Außerdem tritt ein Laufzeitfehler auf, wenn die nicht verwaltete Funktion nicht aus der im DllImport-Attribut bezeichneten DLL exportiert wurde. Um einen Laufzeitfehler zu verhindern, müssten Sie mit LoadLibrary die benötigte DLL laden und mit einem GetProcAddress-Aufruf sicherstellen, dass die nicht verwaltete Funktion vorhanden ist. Selbst dann wäre aber ein direkter Aufruf der Funktion mit dem von GetProcAddress zurückgegebenen Zeiger nicht möglich. Sie müssten den Zeiger stattdessen an eine Funktion in einer anderen, nicht verwalteten DLL übergeben und den Aufruf mit dieser Funktion durchführen. Interfaces für virtuelle Bibliotheken verwenden Interfaces für virtuelle Bibliotheken benötigt für den Aufruf von nicht verwaltetem Code ebenfalls den Platform Invoke-Service. Anstatt jedoch das DllImport-Attribut zu verwenden, erzeugt Interfaces für virtuelle Bibliotheken zur Laufzeit mit den Methoden des .NET-Namespace System.Reflection.Emit ein Interface zur nicht verwalteten DLL. Für die Verwendung von Interfaces für virtuelle Bibliotheken sind drei Schritte erforderlich: • Fügen Sie Borland.Vcl.Win32 zur uses-Klausel hinzu. • Deklarieren Sie ein Interface mit den exportierten, nicht verwalteten Funktionen, die aufgerufen werden sollen. • Stellen Sie durch einen Aufruf der Funktion Supports sicher, dass die nicht verwaltete DLL vorhanden ist und dass die Funktionen in der Interface-Deklaration tatsächlich exportiert wurden. Wenn die Supports-Funktion True zurückgibt, unterstützt die DLL alle Funktionen in der Interface-Deklaration, d.h. die Funktionen können problemlos aufgerufen werden. Innerhalb der Interface-Deklaration muss das DllImport-Attribut nicht für die Prototypen verwendet werden. Angenommen, die DLL MyFunctions.dll enthält die folgenden exportierten Funktionen: 56 1.2 Anwendungen mit nicht verwaltetem RAD Studio für .NET Interfaces für virtuelle Bibliotheken function AFunction : Boolean; function AnotherFunction : Boolean; Um diese Funktionen in verwalteten Code aufzurufen, fügen Sie die Unit Borland.Vcl.Win32 zur uses-Klausel hinzu und deklarieren ein Interface in Delphi: uses Borland.Vcl.Win32, ...; ... type IMyFunctions = interface ['Your GUID'] // Nicht unbedingt erforderlich, aber bewährte Programmierpraxis function AFunction : Boolean; function AnotherFunction : Boolean; end; Die Signatur der Supports-Funktion lautet: 1 function Supports(ModuleName: string; Source: System.Type; var Instance) : Boolean; Zum Aufrufen der nicht verwalteten Funktionen rufen Sie zunächst Supports auf, um die DLL zu laden, und erzeugen dann ein Interface für die DLL: var MyFunctions : IMyFunctions; begin if Supports("MyFunctions.dll", IMyFunctions, MyFunctions) then if MyFunctions.AFunction then begin ... end; end; end; Für Interfaces für virtuelle Bibliotheken gelten die üblichen Einschränkungen bezüglich kompatibler programmeigener Parametertypen und ihrer Zuordnung zu .NET-Typen. Außerdem müssen alle nicht verwalteten Funktionen die Aufrufkonvention stdcall verwenden. Siehe auch COM Interop in verwalteten Anwendungen ( Platform Invoke mit Delphi verwenden ( see page 41) see page 48) 57 Code-Visualisierung - Überblick RAD Studio für .NET 1.3 Modellierung 1.3 Modellierung Themen Name Code-Visualisierung - Überblick ( Beschreibung see page 58) Die Funktion der Code-Visualisierung ist sowohl in der Enterprise- als auch in der Architect-Version von RAD Studio enthalten. Alle weiteren Modellierungstools sind dagegen nur in der Architect-Version von RAD Studio verfügbar. Entsprechende Informationen gelten deshalb nur für diese Version. 1 1.3.1 Code-Visualisierung - Überblick Die Funktion der Code-Visualisierung ist sowohl in der Enterprise- als auch in der Architect-Version von RAD Studio enthalten. Alle weiteren Modellierungstools sind dagegen nur in der Architect-Version von RAD Studio verfügbar. Entsprechende Informationen gelten deshalb nur für diese Version. Code-Visualisierung und statische UML-Strukturdiagramme Das Diagramm Code-Visualisierung von RAD Studio bietet eine grafische Echtzeitdarstellung des Quelltexts. Wenn Sie also Änderungen am Quelltext vornehmen, werden diese automatisch auch in die grafische Abbildung im Diagramm übernommen. Das Diagramm Code-Visualisierung entspricht der statischen Struktur von UML-Diagrammen. Die strukturelle Ansicht eines Projekts konzentriert sich auf UML-Packages, Datentypen wie Klassen und Interfaces sowie deren Attribute, Eigenschaften und Operationen. Ein Diagramm mit statischer Struktur zeigt ferner auch die Beziehungen an, die zwischen diesen Einheiten bestehen. Dieser Abschnitt erläutert die Beziehung zwischen Quelltext und dem Diagramm Code-Visualisierung. Anmerkung: Die Code-Visualisierung und die integrierten UML-Modellierungstools sind zwei getrennte Leistungsmerkmale von RAD Studio. Code-Visualisierung bezieht sich auf die Fähigkeit, einen bestimmten Quelltext auszuwählen und die Deklarationen in diesem Quelltext in die UML-Notation umzusetzen. Das resultierende "Live-Diagramm" enthält immer den aktuellen Status des Quelltexts. Es ist aber nicht möglich, über das Diagramm Code-Visualisierung Änderungen vorzunehmen. Im Gegensatz dazu kann mit den modellgesteuerten UML-Tools von RAD Studio die Anwendung über die Diagrammoberfläche entwickelt werden. Obwohl beide Produktleistungsmerkmale auf den CodeGear Together-Technologien basieren, verwenden Sie unterschiedliche Hintergrundmechanisme zum Erstellen und Manipulieren des Diagramms. Die integrierte Oberfläche zum Entwerfen von Modellen basiert außerdem auf den Entwurfszeitfunktionen des ECO-Framework (Enterprise Core Objects) von CodeGear. Dieses Thema befasst sich nur mit der Code-Visualisierung. Weitere Informationen über das Erstellen von Anwendungen mit dem ECO-Framework und über die Verwendung der Experten und Modellierungstools mit ECO-fähigen Anwendungen finden Sie in der ECO-Online-Hilfe. Erläuterungen zur Beziehung zwischen Quelltext und Code-Visualisierung Die in RAD Studio enthaltenen Tools zur Code-Visualisierung verwenden für die grafische Abbildung der im Quelltext deklarierten Elemente die UML-Notation und die UML-Konventionen. Das Diagramm Code-Visualisierung zeigt die logischen Beziehungen - in der UML-Terminologie als statische Struktur bezeichnet - der Klassen, Interfaces und anderer in einem Projekt definierten Typen an. Dazu werden bestimmte Quelltext-Konstrukte (zum Beispiel Klassendeklarationen und Interface-Implementierungen) in ihre UML-Gegenstücke umgewandelt, die sich dann in einem Diagramm anzeigen lassen. Top-Level-Organisation: Projekte, UML-Packages und .NET-Namespaces Die Code-Visualisierung wird durch zwei verschiedene Bereiche in der IDE möglich: Dem Fenster Modellansicht und dem Diagramm zur Code-Visualisierung. Das Fenster Modellansicht zeigt die logische Struktur eines Projekts in hierarchisch 58 1.3 Modellierung RAD Studio für .NET Code-Visualisierung - Überblick gegliederter Form an und hebt sich dadurch von der Projektverwaltung ab, deren Darstellungsform auf Dateien beschränkt ist. Jedes Projekt in einer Projektgruppe ist im Fenster Modellansicht ein Top-Level-Knoten. In den einzelnen Knoten der Projektstruktur finden Sie die UML-Packages verschachtelt. Jedes UML-Package entspricht der Deklaration eines .NET-Namespace in Ihrem Quelltext (.NET-Namespaces können mehrere Quelldateien umfassen). Das UML-Package lässt sich erweitern, um die darin deklarierten Typen einzublenden. Vererbung und Interface-Implementierung Die Beziehung, die entsteht, wenn eine Klasse von einer Superklasse erbt, wird in der UML-Terminologie als Generalisierung bezeichnet. Ermittelt die IDE eine Vererbungsbeziehung im Quelltext, erstellt sie im Fenster Modellansicht einen Generalisierungs-Link im Knoten der untergeordneten Klasse. Im Diagramm Code-Visualisierung wird der Generalisierungs-Link in der Standard-UML-Notation in Form einer einfachen Linie und einem ungefüllten Pfeil dargestellt, der auf die Superklasse zeigt. Der UML-Begriff für eine Interface-Implementierung ist Realisierung. Ähnlich wie im Fall der Vererbung erstellt die IDE einen Realisierungs-Link, wenn sie eine Klassendeklaration ermittelt, die ein Interface implementiert. Der Realisierungs-Link wird im Fenster Modellansicht in der Implementor-Klasse und im Diagramm in Form einer gepunkteten Linie mit einem ungefüllten Pfeil dargestellt, der auf das Interface zeigt. Für jedes von einer Klasse implementierte Interface wird ein solcher Realisierungs-Link erstellt. Assoziationen In UML ist eine Assoziation ein Navigationslink, der erzeugt wird, wenn eine Klasse eine Referenz auf eine andere Klasse enthält (zum Beispiel: ein Attribut oder eine Eigenschaft). Die Code-Visualisierung erstellt nur dann Assoziations-Links, wenn eine Klasse ein Attribut oder eine Eigenschaft enthält, bei der es sich nicht um einen primitiven Datentyp handelt. Im Diagramm besteht der Assoziations-Link zwischen der Klasse, die das nicht primitive Element enthält, und dem Datentyp dieses Elements. Klassenelemente: Attribute, Operationen, Eigenschaften und verschachtelte Typen Durch die Code-Visualisierung werden auch Deklarationen von Klassen- und Interface-Elementen ihren UML-Äquivalenten zugeordnet. Im Diagramm Code-Visualisierung werden Elemente in vier verschiedene Kategorien unterteilt: • Felder: Enthält Felddeklarationen. Typ und optionale Standardwertzuweisung werden im Diagramm angezeigt. • Methoden: Enthält Methodendeklarationen. Sichtbarkeit, Bereich und Rückgabewert werden im Diagramm angezeigt. • Eigenschaften: Enthält Delphi-Eigenschaftsdeklarationen. Der Typ der Eigenschaft wird angezeigt. • Klassen: Enthält verschachtelte Klassentypdeklarationen. Zur Darstellung der UML-Deklaration von Attributen, Operationen und Eigenschaften wird die Standard-UML-Syntax verwendet. Jede der vier Kategorien kann unabhängig von den anderen ein- und ausgeblendet werden. Siehe auch UML-Features in Delphi für .NET (nur Architect SKU) Überblick über die integrierten Modellierungstools (nur Architect SKU) Importieren und Exportieren eines Modells mit XMI (nur Architect SKU) ( see page 153) Verwenden des Modellansichtfensters und des Code-Visualisierungsdiagramms ( Verwenden des Übersichtsfensters ( see page 154) see page 155) 59 1 Rave Reports in RAD Studio verwenden RAD Studio für .NET 1.4 Berichte für .NET-Anwendungen 1.4 Berichte für .NET-Anwendungen entwickeln RAD Studio wird mit Rave Reports von Nevrona geliefert. Mit Hilfe dieser Tools können Sie Berichte für Ihre Anwendungen erstellen und Lösungen für die Berichterstellung entwickeln, die von den Benutzern Ihrer Anwendung genutzt und angepasst werden können. Themen Name Rave Reports in RAD Studio verwenden ( 1 Beschreibung see page 60) Die Entwicklungsumgebung von RAD Studio unterstützt die Integration von Berichtobjekten in Ihre Anwendungen. Diese Integration ermöglicht es, einen Bericht mit dem Designer von Rave Reports zu erstellen oder ActiveX-Komponenten von Rave Reports direkt im RAD Studio-Designer in Web Forms zu platzieren. Die Benutzer Ihrer Anwendung können ihre eigenen Berichte erstellen und anzeigen oder bereits vorhandene Berichte öffnen. Die Integration von Rave Reports in RAD Studio bietet folgende Möglichkeiten: • Neue Berichtobjekte in Projekte einfügen • Rave Reports ActiveX-Objekte zu Web Forms hinzufügen 1.4.1 Rave Reports in RAD Studio verwenden Die Entwicklungsumgebung von RAD Studio unterstützt die Integration von Berichtobjekten in Ihre Anwendungen. Diese Integration ermöglicht es, einen Bericht mit dem Designer von Rave Reports zu erstellen oder ActiveX-Komponenten von Rave Reports direkt im RAD Studio-Designer in Web Forms zu platzieren. Die Benutzer Ihrer Anwendung können ihre eigenen Berichte erstellen und anzeigen oder bereits vorhandene Berichte öffnen. Die Integration von Rave Reports in RAD Studio bietet folgende Möglichkeiten: • Neue Berichtobjekte in Projekte einfügen • Rave Reports ActiveX-Objekte zu Web Forms hinzufügen Neue Berichte in RAD Studio erstellen Berichte von Rave Reports lassen sich in RAD Studio ebenso einfügen wie jede andere Komponente von Drittanbietern. Ein Bericht wird als eigenständiges Rave Reports-Objekt gespeichert. Auf einen Bericht kann aus anderen Anwendungen Bezug genommen werden, wenn diese einen Bericht aufrufen oder generieren müssen. Wenn Sie eine neue Anwendung erstellen, können Sie das Berichtobjekt integrieren, indem Sie eine Referenz darauf in die Projektverwaltung einfügen. Rave Reports bietet auch die Möglichkeit, ein Berichtobjekt mit einer Datenquelle zu verknüpfen. Dadurch lässt sich ein Bericht dynamisch auf der Basis der aktuellen Daten in der Datenbank erstellen. ActiveX-Komponenten von Rave Reports verwenden Sie können ActiveX-Objekte von Rave Reports in Ihre Anwendungen einfügen. Die Tool-Palette von RAD Studio enthält eine Liste der verfügbaren ActiveX-Objekte. Ziehen Sie die gewünschten Objekte zur Entwurfszeit einfach in ein Windows Form oder Web Form. Setzen Sie die erforderlichen Eigenschaften, und ändern Sie den Quelltext nach Bedarf im Quelltext-Editor. Unter Umständen ist es erforderlich, die .NET-Komponenten zurückzusetzen und die ActiveX-Komponenten im Dialogfeld Installierte .NET-Komponenten auszuwählen. Siehe auch Berichte entwerfen 60 1.5 Anwendungen mit RAD Studio für .NET 1.5 Anwendungen mit VCL.NET-Komponenten entwickeln VCL.NET ist eine erweiterte Sammlung der VCL-Komponenten, die dazu dienen, komplexe Anwendungen in Delphi schnell und einfach zu erstellen. VCL.NET bietet Ihnen die Möglichkeit, Ihre Delphi VCL-Anwendungen und -Komponenten Benutzern des Microsoft .NET Framework zur Verfügung zu stellen. Mit RAD Studio können Sie auf alle Vorteile des .NET Framework zugreifen und sich gleichzeitig der benutzerfreundlichen und leistungsstarken komponentengesteuerten Entwicklungsumgebung von Delphi bedienen. Mit RAD Studio lassen sich folgende Anwendungstypen erstellen: Sie können VCL.NET-Formularanwendungen erstellen, die sich auf dem .NET Framework ausführen lassen, aber dennoch die VCL.NET-Komponenten und -Steuerelemente verwenden. Sie können .NET-Anwendungen erstellen, die das zugrunde liegende .NET Framework und die .NET-Steuerelemente nutzen, während RAD Studio die Codebehind-Logik bereitstellt. Sie können leistungsstarke ASP.NET-Anwendungen erstellen, die das zugrunde liegende .NET Framework, die ASP.NET-Steuerelemente und RAD Studio-Codebehind-Logik verwenden. Die folgenden Themen bieten weiterführende Informationen zu den Vorteilen von VCL.NET in RAD Studio. Themen Name Beschreibung Änderungen aufgrund der Unterstützung von 64-Bit .NET 2.0 ( Portieren von VCL-Anwendungen nach RAD Studio ( VCL-Anwendungen portieren ( see page 75) see page 63) see page 64) Für die Unterstützung von 64-Bit .NET 2.0 waren einige Änderungen erforderlich. Wegen dieser Änderungen könnten kleinere Quelltextänderungen erforderlich werden, damit vorhandene Anwendungen korrekt arbeiten. Detaillierte Informationen zu den einzelnen Änderungen finden Sie unter Ausführen von Änderungen ( see page 171). Bei der Entwicklung der VCL für RAD Studio wurde großer Wert auf die Abwärtskompatibilität gelegt. Dennoch sind einige Unterschiede in der Funktionsweise von VCL-Anwendungen zu berücksichtigen, die durch die verwaltete Umgebung von .NET bedingt sind. In vorliegenden Dokument werden die meisten dieser Unterschiede beschrieben und einige Maßnahmen erläutert, die beim Portieren einer VCL-Anwendung in die .NET-Umgebung ergriffen werden sollten. Die Neuerungen in Delphi selbst sind nicht Gegenstand dieses Dokuments. Hier wird lediglich erläutert, wie vorhandener Delphi-Code der neuen RAD Studio-Sprache und dem VCL-Framework zugeordnet wird. Das Dokument enthält Links zu speziellen Themen in der Delphi-Sprachreferenz, in denen die neuen Leistungsmerkmale... more ( see page 64) Bei der Portierung von VCL-Anwendungen von Delphi 7 nach RAD Studio gibt es einige Punkte zu bedenken. Neben grundlegenden Sprachelementen, die ersetzt oder geändert werden müssen, gibt es einige Strategien, denen Sie folgen sollten, um sicherzustellen, dass Ihre Anwendungen komplett und stabil portiert werden. Dieses Thema befasst sich mit folgenden Bereichen: • Allgemeine sprachspezifische Probleme • Packages umbenennen • Neue Funktionen der Programmiersprache • Web-Service-Client-Anwendungen portieren 61 1 Änderungen aufgrund der Unterstützung Überblick zu VCL für .NET ( see page 77) Web-Service-Clients portieren ( see page 80) 1 RAD Studio für .NET 1.5 Anwendungen mit VCL für .NET ist die Programmierumgebung für die Erstellung von RAD Studio-Anwendungen mit VCL-Komponenten. Mit Hilfe von RAD Studio und VCL für .NET können Benutzer beim Schreiben neuer Anwendungen die Leistungsstärke von Delphi weiterhin nutzen und Win32-Anwendungen in das .NET Framework migrieren. Diese Technologien erleichtern Delphi-Entwicklern den Wechsel zu .NET und vereinfachen die Portierung vorhandener Delphi-Anwendungen. RAD Studio unterstützt die Microsoft .NET Framework-Entwicklung mit der Sprache Delphi und VCL für .NET-Steuerelementen. RAD Studio-ASP.NET unterstützt außerdem die Entwicklung von Web Forms- und SOAP-/XML-Web-Services-Anwendungen. VCL für .NET umfasst einen Großteil der gebräuchlichsten Klassen der VCL für Win32. Das .NET Framework ist für... more ( see page 77) RAD Studio-Web-Services verwenden das .NET Framework als Service-Schicht. Web-Service-Client-Anwendungen, die mit Delphi 7 oder einer früheren Version erstellt wurden, müssen folglich geändert werden, wenn sie das .NET Framework verwenden sollen. In diesem Thema wird Folgendes behandelt: • Vorhandene Anwendungen ändern und ergänzen • Hinweise zur Implementierung 1.5.1 Änderungen aufgrund der Unterstützung von 64-Bit .NET 2.0 Für die Unterstützung von 64-Bit .NET 2.0 waren einige Änderungen erforderlich. Wegen dieser Änderungen könnten kleinere Quelltextänderungen erforderlich werden, damit vorhandene Anwendungen korrekt arbeiten. Detaillierte Informationen zu den einzelnen Änderungen finden Sie unter Ausführen von Änderungen ( see page 171). Änderungen zur Unterstützung von 64-Bit Dieses Thema beschreibt, wie vorhandene VCL.NET-Anwendungen geändert werden sollten, damit sie mit den zur Unterstützung von 64-Bit .NET 2.0 vorgenommenen Änderungen korrekt arbeiten. Zur Unterstützung von einzelnen ausführbaren Single Source-Dateien für 32- und 64-Bit-Plattformen wurden Handle-Typen von LongWord in IntPtr geändert. IntPtr ist ein Integer-Typ, der die Größe eines Zeigers auf der zugrunde liegenden Plattform angibt, die in .NET als eine Struktur implementiert ist. IntPtr unterstützt keine Zuweisungen, Vergleiche und arithmetische Operationen, die häufig mit Handles in der VCL ausgeführt werden. Zur Bereitstellung der Abwärtskompatibilität wurde ein Record-Hilfstyp angelegt, der häufig verwendete Operationen durch das Überladen von Operatoren unterstützt. Für den überwiegenden Teil Ihres Quelltextes sind keine Modifikationen erforderlich, um ihn auf beiden (x86 und x64) Plattformen auszuführen, aber es gibt einige Fälle, für die kleinere Änderungen nötig sind.. Warnung: Diese Modifikationen sind wegen der Änderungen zur Unterstützung von 64-Bit-Systemen erforderlich. Sie müssen für Anwendungen vorgenommen werden, die sowohl auf 32-Bit- als auch auf 64-Bit-Systemen ausgeführt werden sollen. Geänderte Quelltext-Pattern Die folgenden Bereiche von Quelltext-Pattern müssen evtl. geändert werden: • Case-Anweisungen • Typumwandlungen von Aufzählungen • Verwendung von Handles mit Mengen • Array-Indizierungen • Annahme einer bestimmten Handle-Größe 62 1.5 Anwendungen mit RAD Studio für .NET Portieren von VCL-Anwendungen nach Windows API-Deklarationen Es wurde eine Reihe von Deklarationen geändert, um einzelne ausführbare Dateien für x86- und x64-Plattformen korrekt zu unterstützen. In den meisten Fällen wurde der Typ eines Funktionsparameters oder Strukturfeldes geändert. Der Compiler stellt Informationen über einfache Korrekturmöglichkeiten von betroffenem Quelltext bereit. Zu den Änderungen, bei denen die Korrektur weniger offensichtlich ist, zählen Callback-Funktionen und Modifikationen an Variant-Records. Eine Liste der fraglichen Callbacks und Records finden Sie in dem Thema Ausführen von Änderungen ( see page 171). Modifizierte Callback-Funktionen Bei ein paar wenigen Callback-Funktionen wurden die Parameter geändert, daher muss jedes Vorkommen dieser Funktionen geändert werden. 1 Modifizierte Variant-Records Variant-Records sind in Delphi.NET als Records mit expliziten Feld-Layouts implementiert (im Gegensatz zu sequenziellen Layouts, die der Standard im.NET Framework sind). Dadurch können mehrere Felder am selben Feld-Offset “überlagert” werden, was zu inkorrekten Deklarationen auf 64-Bit-Plattformen führt, wenn die Struktur Felder mit variabler Größe (wie z.B. IntPtr) enthält. Variant-Records mit solchen Feldern wurden so geändert, dass sie nur noch einen “varianten” Fall enthalten. Die übrigen Felder wurden in Eigenschaften geändert, um die Abwärtskompatibilität beizubehalten. In den meisten Fällen ist der Quelltext von diesen Änderungen nicht betroffen. Wenn Sie jedoch ein Feld als einen var-Parameter übergeben, der jetzt als einen Eigenschaft deklariert ist, müssen Sie den Quelltext verändern. Siehe auch Ausführen von Änderungen ( see page 171) 1.5.2 Portieren von VCL-Anwendungen nach RAD Studio Bei der Entwicklung der VCL für RAD Studio wurde großer Wert auf die Abwärtskompatibilität gelegt. Dennoch sind einige Unterschiede in der Funktionsweise von VCL-Anwendungen zu berücksichtigen, die durch die verwaltete Umgebung von .NET bedingt sind. In vorliegenden Dokument werden die meisten dieser Unterschiede beschrieben und einige Maßnahmen erläutert, die beim Portieren einer VCL-Anwendung in die .NET-Umgebung ergriffen werden sollten. Die Neuerungen in Delphi selbst sind nicht Gegenstand dieses Dokuments. Hier wird lediglich erläutert, wie vorhandener Delphi-Code der neuen RAD Studio-Sprache und dem VCL-Framework zugeordnet wird. Das Dokument enthält Links zu speziellen Themen in der Delphi-Sprachreferenz, in denen die neuen Leistungsmerkmale der Sprache detailliert beschrieben sind. In diesem Thema werden folgende Bereiche erläutert: • Migrieren von Zeigertypen • Migrieren von Char- und String-Typen • Erstellen und Freigeben von Objekten • Aufrufen der Win32-API • Migrieren von Varianten • Arbeiten mit Ressourcen • Das Ereignis OnCompare Zeigertypen migrieren Zeigertypen sind nicht CLS-kompatibel und gelten im Kontext der allgemeinen .NET-Laufzeitumgebung (.NET Common 63 Portieren von VCL-Anwendungen nach RAD Studio für .NET 1.5 Anwendungen mit Language Runtime) nicht als sicher. Aus diesem Grund wurden die Zeiger bei der Migration der VCL eliminiert und durch entsprechende Alternativen, wie dynamische Arrays, Indizes in Arrays oder Strings, Klassenreferenzen usw. ersetzt. Wenn Sie eine VCL-Anwendung portieren, müssen Sie zunächst feststellen, wo Zeiger verwendet werden, und diese nach Bedarf ersetzen. Untypisierte Zeiger Untypisierte Zeiger gelten als unsicherer Code. Wenn der Quelltext untypisierte Zeiger enthält, schlägt seine Überprüfung durch das .NET-Dienstprogramm PEVerify fehl. Code, der sich nicht auf Typsicherheit prüfen lässt, kann aber in einer sicheren Umgebung (etwa auf einem Webserver, einem SQL-Datenbankserver, einem Web-Browser-Client oder einem Computer mit strengen Sicherheitsrichtlinien) nicht ausgeführt werden. In der VCL wurden untypisierte Zeiger durch strenger typisierte Werte ersetzt. An Stellen, an denen üblicherweise untypisierte Zeiger verwendet wurden, finden Sie nun TObject-Objekte. Beispielsweise sind die Elemente der Klasse TList jetzt vom Typ TObject und nicht mehr vom Typ Pointer. Jeder Typ kann in ein Objekt konvertiert, und ein TObject kann in jeden anderen Typ umgewandelt werden (sogar Werttypen wie Integer, Double usw.). Bei der Umwandlung von TObject in einen anderen Typ wird ein Laufzeitfehler generiert, wenn das Objekt keine Instanz des Typs ist, in den es konvertiert wird. Die Semantik für diese Umwandlung entspricht also derjenigen des Operators as. 1 In einigen Fällen wurde der Typ Pointer durch einen präziseren Typ ersetzt. Beispielsweise gibt die Funktion ClassInfo für TObject einen Wert vom Typ Type und nicht einen untypisierten Zeiger zurück. Untypisierte Zeiger für Parameter, deren Typ sich in Abhängigkeit vom Kontext ändert, wurden durch Überladen der Routine und Verwendung von var-Parametern mit geeigneten Typen ersetzt. Untypisierte Zeiger, die in API-Aufrufen für nicht verwaltetem Code (wie in Aufrufen der Windows-API oder einer Datenzugriffsschicht wie der BDE) Anwendung finden, werden durch System.IntPtr ersetzt. So wird beispielsweise dem Typ TBookmark, der in der Unit Db definiert ist, nun der Typ IntPtr zugewiesen. Code, in dem mit Hilfe des Adressoperators (@) ein Wert in einen untypisierten Zeiger umgewandelt wird, muss geändert werden. Wenn der untypisierte Zeiger durch den Typ TObject ersetzt wurde, müssen Sie normalerweise nur den Operator @ entfernen. Bei Werttypen müssen Sie unter Umständen den Operator @ durch eine Typumwandlung zu TObject ersetzen, um den Wert "abzugrenzen". Der Code var P: Pointer; I: Integer; begin I := 5; P := @I; könnte wie folgt konvertiert werden: var P: TObject; I: Integer; begin I := 5; P := TObject(I); Wenn der untypisierte Zeiger zu IntPtr geändert wurde, müssen Sie mit Hilfe der Klasse Marshal nicht verwalteten Speicher zuweisen und dort einen Wert speichern, anstatt den Operator @ zu verwenden. Der Code var P: Pointer; R: TRect; begin R := Rect(0, 0, 100, 100); P := @R; CallSomeAPI(P); könnte wie folgt konvertiert werden: var P: IntPtr; 64 1.5 Anwendungen mit RAD Studio für .NET Portieren von VCL-Anwendungen nach R: TRect; begin R := Rect(0, 0, 100, 100); P := Marshal.AllocHGlobal(Marshal.SizeOf(TypeOf(TRect))); try Marshal.StructureToPtr(TObject(R), P, False); CallSomeAPI(P); finally Marshal.FreeHGlobal(P); end; Anmerkung: Nicht verwalteter Speicher, den Sie mit Hilfe der Klasse Marshal zugewiesen haben, muss explizit freigegeben werden. Der Garbage Collector von .NET führt keine Bereinigung von nicht verwaltetem Speicher durch. Prozedurzeiger Eine spezielle Form von untypisierten Zeigern sind die Prozedurzeiger. In verwaltetem Code werden Prozedurzeiger durch .NET-Delegates ersetzt, die strenger typisiert sind. Deklarationen von prozeduralen Typen entsprechen in RAD Studio Delegate-Deklarationen. Mit dem Operator @ können Sie einen Delegate für eine Methode oder eine globale Routine bereitstellen. Der entsprechende Code sieht in etwa so aus, wie Code zur Bereitstellung eines prozeduralen Zeigers auf der Win32-Plattform. Aus diesem Grund sind für die Portierung oft keine Änderungen erforderlich. Sie müssen aber beachten, dass Sie bei Verwendung des @-Operators keinen Zeiger, sondern einen neuen Delegate erhalten. Wenn Sie zum Beispiel einen Prozedurzeiger mit dem Operator @ an eine nicht verwaltete API übergeben, wie in Handle := SetTimer(0, 0, 1, @TimerProc); ist die einzige Referenz auf den Delegate diejenige, die im API-Aufruf übergeben wurde, da der Delegate ad hoc erzeugt wird. Das bedeutet, dass der Garbage Collector den Delegate nach der Rückkehr des API-Aufrufs löscht. Wenn der nicht verwaltete Code wie im vorliegenden Fall die Prozedur nach der Rückkehr des API-Aufrufs aufruft, tritt eine Laufzeit-Exception auf, da der Delegate nicht mehr vorhanden ist. Sie können diese Situation umgehen, indem Sie den Delegate einer globalen Variable zuweisen und diese an die nicht verwaltete API übergeben. Wird ein Prozedurzeiger über einen Aufruf der Windows-API-Funktion GetProcAddress bereitgestellt, wird er als IntPtr zurückgegeben. Dieser Wert ist kein Delegate. Er kann nicht in einen Delegate umgewandelt und aufgerufen werden. Für die Übersetzung eines derartigen Codes wird normalerweise mit Platform Invoke eine nicht verwaltete API aufgerufen wird. Mit der Funktion GetProcAddress lässt sich feststellen, ob die API verfügbar ist, damit bei der Verwendung von Platform Invoke keine Laufzeit-Exception auftritt. Der Code type TAnimateWindowProc = function(hWnd: HWND; dwTime: DWORD; dwFlags: DWORD): BOOL; stdcall; var AnimateWindowProc: TAnimateWindowProc = nil; UserHandle: HMODULE; begin UserHandle := GetModuleHandle('USER32'); if UserHandle <> 0 then @AnimateWindowProc := GetProcAddress(UserHandle, 'AnimateWindow'); ... if AnimateWindowProc <> nil then AnimateWindowProc(Handle, 100, AW_BLEND or AW_SLIDE); würde für die .NET-Plattform folgendermaßen konvertiert: [DllImport('user32.dll', CharSet = CharSet.Ansi, SetLastError = True, EntryPoint = 'AnimateWindow')] function AnimateWindow(hWnd: HWND; dwTime: DWORD; dwFlags: DWORD): BOOL; external; var UserHandle: HMODULE; CanAnimate: Boolean; begin UserHandle := GetModuleHandle('USER32'); if UserHandle <> 0 then 65 1 Portieren von VCL-Anwendungen nach RAD Studio für .NET 1.5 Anwendungen mit CanAnimate := GetProcAddress(UserHandle, 'AnimateWindow') <> nil else CanAnimate := False; ... if CanAnimate then AnimateWindow(Handle, 100, AW_BLEND or AW_SLIDE); Anmerkung: Das obige .NET-Beispiel zeigt noch eine späte Bindung mit der AnimateWindow-API. Beim Laden dieses Codes wird keine Exception ausgelöst, wenn die DLL oder die Funktion nicht verfügbar ist. Der Funktionsaufruf wird nur bei der ersten Ausführung des Codes aufgelöst. String-Zeiger Code mit dem Typ PChar wird in folgenden Situationen verwendet: 1 • Der Typ referenziert einen nullterminierten String (speziell bei Verwendung mit einem Windows-API-Aufruf oder mit einer älteren RTL-Funktion). • Der Typ dient zum Navigieren durch einen String, wenn dessen Wert verarbeitet wird. • Der Typ referenziert einen Byte-Block (in Delphi für Win32 umfasst der Typ Char ein Byte, auf der .NET-Plattform besteht er aus zwei Bytes). Im ersten Fall können Sie den Typ PChar in der Regel durch den Typ string ersetzen. Bei Windows-API-Aufrufen verwenden die verwalteten Versionen der APIs nun einen String oder die Klasse StringBuilder anstelle eines PChar-Typs, wobei die Umwandlungen implizit auf der Marshaling-Schicht durchgeführt werden. Beachten Sie, dass viele RTL-Funktionen, die den Typ PChar unterstützt haben, aus der RTL entfernt wurden. Sie müssen diese Funktionen nun durch die entsprechenden Versionen vom Typ string ersetzen. Die folgende Tabelle enthält die Funktionen der SysUtils-Units, die entfernt wurden, weil sie auf dem Typ PChar basierten, sowie die entsprechenden Versionen des Typs string: PChar-Version String-Version AnsiExtractQuotedStr AnsiDequotedStr oder DequotedStr AnsiLastChar, AnsiStrLastChar (Verwendung des Indexoperators und der String-Länge) AnsiStrComp, StrComp CompareStr, AnsiCompareStr, WideCompareStr AnsiStrIComp, StrIComp CompareText, AnsiCompareText, WideCompareText AnsiStrLComp, StrLComp System.String.Compare (StartsStr) AnsiStrLIComp, StrLIComp System.String.Compare (StartsText) AnsiStrLower, StrLower AnsiLowerCase, WideLowerCase, AnsiStrUpper, StrUpper UpCase, AnsiUpperCase, WideUpperCase AnsiStrPos, StrPos, AnsiStrScan, StrScan Pos AnsiStrRScan, StrRScan LastDelimiter StrLen Length StrEnd, StrECopy (keine Entsprechung vorhanden) StrMove, StrCopy, StrLCopy, StrPCopy, StrPLCopy Copy StrCat, StrLCat Operator +, Verkettung StrFmt Format, FmtStr StrLFmt FormatBuf FloatToText FloatToStrF FloatToTextFmt FormatFloat TextToFloat FloatToStr Wenn ein PChar-Typ zur Navigation durch einen String verwendet wird, müssen Sie den Code neu schreiben und PChar durch 66 1.5 Anwendungen mit RAD Studio für .NET Portieren von VCL-Anwendungen nach einen Integer-Typ ersetzen, der als Index für den String fungiert. Dabei müssen Sie feststellen können, wann das Ende des Strings erreicht ist. Bei Verwendung des Typs PChar befindet sich am Ende des Strings ein Null-Zeichen, an dem der Code das String-Ende erkennt. Da Sie nun mit String und Index arbeiten, ist kein Null-Zeichen vorhanden. Sie müssen deshalb das Ende des Strings anhand der String-Länge feststellen. Vor dem Lesen eines Zeichens muss sichergestellt werden, dass der Index nicht hinter dem String-Ende steht, da ansonsten ein Laufzeitfehler auftritt. Anmerkung: String-Daten können nicht geädert werden. Deshalb ist es nicht möglich, mit Hilfe eines PChar -Typs ein Zeichen in einen vorhandenen String einzufügen. Mit Hilfe einer String-Indizierung (z.B. s[5]) ist dies jedoch möglich. Wird ein PChar-Typ zur Referenzierung eines Byte-Blocks verwendet, wird er entweder durch einen IntPtr-Typ oder ein dynamisches Array von Bytes (TBytes) ersetzt. Wenn ein Austausch gegen einen IntPtr-Typ durchgeführt wurde, treten dieselben Probleme wie beim Ersetzen eines untypisierten Zeigers auf. Bei einem Austausch gegen TBytes müssen Sie unter Umständen PChar-Werte durch einen Index im Byte-Array ersetzen, wenn in Byte-Blöcken navigiert werden soll. Dies ähnelt in etwa dem Ersetzen von PChar durch Integerwerte zum Navigieren in Strings. Der Unterschied besteht jedoch darin, dass Indizes in TBytes auf 0, Indizes in Strings jedoch auf 1 basieren. Strings in Streams schreiben In Delphi für Win32 treffen Sie häufig auf Code folgender Art: S1 := 'Dies ist ein Test-String'; Stream.WriteBuffer(S1[1], Length(S1)); Auf der Win32-Plattform wird aufgrund dieses Codes der gesamte String in den Stream geschrieben. Derselbe Code führt auf der .NET-Plattform aber zu einem ganz anderen Ergebnis. Auf der .NET-Plattform erzeugt der Compiler einen Aufruf der mit Char überladenen Version von WriteBuffer. Als Folge davon wird nur ein Zeichen (S1[1]) in den Stream geschrieben. Andere Zeigertypen Aus der VCL wurden noch weitere typisierte Zeiger entfernt. Sie wurden in der Regel durch den Typ ersetzt, auf den sie ursprünglich gezeigt haben. Wenn der Zeigertyp der Parameter für einen Prozeduraufruf war, wird er in einen var-Parameter umgewandelt, sodass immer noch eine Referenz anstatt einer Kopie des Arguments übergeben wird. In bestimmten Fällen ist es sinnvoll, einen Werttyp in einen Klassentyp zu konvertieren, damit der Code eine Objektreferenz anstelle eines typisierten Zeigers übergibt. Char- und String-Typen migrieren In RAD Studio wird der Typ string dem String-Typ von .NET zugeordnet. Sie können ungehindert auf die Elemente der Klasse String zugreifen und zu diesem Zweck einen string-Typ von Delphi verwenden. Sehen Sie sich dazu das folgende Beispiel an: var S: string; begin S := 'Dies ist ein String'; // Die Umwandlung ist nicht erforderlich. // S := System.String(S).PadRight(25); // Direkter Zugriff auf die Elemente der String-Klasse S := S.PadRight(25); S := ('Dies ist ein neuer String').PadRight(25); ANSI-Strings und Wide-Strings Der größte Unterschied zwischen Delphi- und RAD Studio-Strings besteht darin, dass der String-Typ nun ein Unicode Wide-String und nicht kein AnsiString ist. Dies vereinfacht den Code für bestimmte Sprachen, da Sie sich nicht mehr um Multibyte-Zeichensätze kümmern müssen. Dennoch muss der Code bei der Übernahme auf die Char-Größe überprüft werden, 67 1 Portieren von VCL-Anwendungen nach RAD Studio für .NET 1.5 Anwendungen mit da es sich nun nicht mehr um Ein-Byte-Zeichen sondern um Zwei-Byte-Zeichen handelt. Sie können weiterhin Strings mit Ein-Byte-Zeichen verwenden, müssen diese aber nun als AnsiString anstatt als string deklarieren. Der Compiler führt eine Konvertierung zwischen diesen Strings durch, wenn Sie eine explizite Typumwandlung verwenden oder wenn Sie die Strings implizit umwandeln, indem Sie sie einer Variablen oder einem Parameter des jeweils anderen Typs zuweisen. Wenn Ihr Code Aufrufe für AnsiXXX-Routinen zur Bearbeitung von Strings enthält, kann es sinnvoll sein, diese in die entsprechende Wide String-Version zu konvertieren. Die AnsiXXX-Routinen besitzen Varianten, die den Wide-Versionen entsprechen, und die überladenen Routinen akzeptieren Wide Strings als Parameter. Aus diesem Grund muss keine implizite Umwandlung in Wide- und Ein-Byte-Strings (und umgekehrt) durchgeführt werden. Anmerkung: Bei der Umwandlung von Wide-Zeichen in Ein-Byte-Zeichen können Informationen verloren gehen. Deshalb sollten Sie diese Umwandlung vermeiden. 1 String-Operationen Gemäß der CLR-Werttyp-Semantik geben Operationen mit Strings eine Kopie des Strings zurück, anstatt den vorhandenen String zu ändern. Aufgrund des Mehraufwands für das Kopieren kann Code etwas von seiner Effizienz verlieren. Sehen Sie sich das folgende Beispiel an: var S: string; begin S := 'Dies ist ein String'; S[3] := 'a'; S[4] := 't'; Nach einer Compilierung auf der Win32-Plattform ist für Zeichenersetzungen nur ein Byte Speicherplatz pro Änderung erforderlich. In RAD Studio besteht das Ergebnis jeder Ersetzung in einer Kopie des gesamten Strings. Aus diesem Grund sollten Sie bei der Änderung von String-Werten eine StringBuilder-Instanz verwenden. StringBuilder weist nicht verwalteten Speicher zu und verarbeitet den String erwartungsgemäß. Nach Abschluss des Vorgangs können Sie das Ergebnis durch den Aufruf der Methode ToString in einen String umwandeln. Anmerkung: Die Konvertierung von StringBuilder in einen string -Typ ist eine einfache Operation. Die String-Daten werden nicht noch einmal kopiert. Nicht initialisierte Strings In RAD Studio hat ein nicht initialisierter String den Wert nil. Der Compiler berücksichtigt diese Tatsache, wenn Sie einen nicht initialisierten String mit einem leeren String vergleichen. Für die Code-Zeile if S <> '' then ... führt der Compiler beispielsweise den Vergleich durch und behandelt den nicht initialisierten String als leeren String. Bei anderen String-Operationen wird ein nicht initialisierter String nicht automatisch als leerer String behandelt (darin besteht ein Unterschied zu Code, der auf der Win32-Plattform compiliert wurde). Dies kann zu einer Laufzeit-Exception aufgrund eines leeren Objekts führen. Typumwandlungen Anders als bei Delphi für Win32 besteht in RAD Studio kein Unterschied zwischen einer expliziten Typumwandlung und dem Operator as. In beiden Fällen ist die Umwandlung nur dann erfolgreich, wenn die zu konvertierende Variable eine Instanz des Typs ist, in den sie umgewandelt werden soll. Dies bedeutet, dass Code, der vorher problemlos ausgeführt wurde (durch Umwandlungen zwischen nicht kompatiblen Datentypen), nun unter Umständen eine Laufzeit-Exception generiert. Botschafts-Cracker Die meisten Probleme im Zusammenhang mit der Typumwandlung treten bei Botschafts-Cracker-Typen auf. In der VCL für Win32 enthielt die Unit Messages verschiedene Record-Typen, mit denen die Parameter einer Windows-Botschaft repräsentiert werden. Diese Records hatten alle dieselbe Größe, und ihre Felder waren für das Extrahieren der Informationen aus der 68 1.5 Anwendungen mit RAD Studio für .NET Portieren von VCL-Anwendungen nach Windows-Botschaft ausgelegt. So konnten Sie Botschaftsparameter, die beispielsweise als TMessage-Typ vorlagen, in den Typ TWMMouse konvertieren, und anschließend die gewünschten Informationen extrahieren. Dieses Vorgehen funktionierte problemlos, da die beiden Typen dieselbe Größe hatten und eine explizite Umwandlung keine Exception erzeugte, wenn der Typ mit der Umwandlung wieder rückinterpretiert wurde. In .NET ist eine derartige Rückinterpretation einer Umwandlung nicht erlaubt, und derselbe Code würde deshalb in RAD Studio eine Exception aufgrund einer unzulässigen Umwandlung generieren. Um diese Situation zu umgehen, sind die Botschafts-Cracker-Typen in RAD Studio keine Records sondern Klassen. Anstatt den TMessage-Wert in einen anderen Typ wie TWMMouse umzuwandeln, müssen Sie den anderen Typ instantiieren und den Originaltyp TMessage als Parameter übergeben. Anstelle von procedure MyFunction(Msg: TMessage); var MouseMsg: TWMMouse; begin if Msg.Msg = WM_MOUSE then with Msg as TWMMouse do ... end; 1 würden Sie etwa folgenden Code verwenden: procedure MyFunction(Msg: TMessage); var MouseMsg: TWMMouse; begin if Msg.Msg = WM_MOUSE then with TWMMouse.Create(Msg) do ... end; Für eine Umwandlung in die andere Richtung (von einem spezialisierten Botschaftstyp in den Typ TMessage) steht die neue Funktion UnwrapMessage zur Verfügung, die in der Unit Messages deklariert ist. Auf Protected-Elemente einer Klasse in anderen Units zugreifen Eine andere Technik, die nun als unzulässige Typumwandlung gilt, ist der Zugriff auf die Protected-Elemente einer Klasse, die in einer anderen Unit deklariert ist. In Delphi für Win32 können Sie einen Nachkommen der Klasse deklarieren, auf deren Elemente Sie zugreifen möchten: type TPeekAtWinControl = class(TWinControl); Dann können Sie durch Umwandlung eines beliebigen TWinControl-Nachkommens in TPeekAtWinControl auf die Protected-Methoden der Klasse TWinControl zugreifen, da TPeekAtWinControl in derselben Unit definiert ist. In RAD Studio kann diese Technik normalerweise nicht erfolgreich angewendet werden, da der TWinControl-Nachkomme keine Instanz von TPeekAtWinControl ist. Durch die unzulässige Umwandlung wird zur Laufzeit eine Exception ausgelöst. Da diese Technik in Win32-Umgebungen häufig verwendet wird, erkennt der Compiler dieses Muster und lässt die Umwandlung zu. Der Compiler hat aber keine Informationen darüber, in welche Assemblierung eine Unit eingebunden wird, wenn er den Quelltext compiliert. Wenn die Units in Assemblierungen eingebunden werden, tritt zur Laufzeit eine Typ-Exception auf. Probleme beim Überschreiten von Assemblierungsgrenzen lassen sich durch Interfaces vermeiden, die den Zugriff auf die fraglichen Protected-Elemente ermöglichen. Einige Klassen der VCL (TControl, TWinControl, TCustomForm) verwenden nun diese Technik. Sie werden deshalb zusätzliche Interfaces für den Zugriff auf Protected-Elemente vorfinden (IControl, IWinControl, IMDIForm). Objekte erstellen und freigeben Eine Beschreibung spezieller Probleme bei der Programmierung in Delphi auf der speicherverwalteten Plattform .NET finden Sie im Thema Speicherverwaltung auf der .NET-Plattform. Aufgrund der Unterschiede bei der Instantiierung und Freigabe von Objekten steht für RAD Studio-Klassen keine 69 Portieren von VCL-Anwendungen nach RAD Studio für .NET 1.5 Anwendungen mit BeforeDestruction- oder AfterConstruction-Methode zur Verfügung. Alle Klassen, die diese Methoden überschreiben, müssen neu geschrieben werden. Die Tatsache, dass diese Methoden und die Eigenschaft OldCreateOrder in der VCL auf der .NET-Plattform nicht vorhanden sind, hat Auswirkungen auf Formulare und Datenmodule, die darauf angewiesen sind, dass OldCreateOrder den Wert False hat. Die Ereignisse OnCreate und OnDestroy reagieren nun so, als wäre die Eigenschaft OldCreateOrder auf den Wert True gesetzt. Diese Ereignisse werden jetzt nur vom Konstruktor oder vom Destruktor aufgerufen. Anmerkung: Da das Ereignis OnDestroy von einem Destruktor aufgerufen wird, ist nicht sichergestellt, dass dieser Aufruf tatsächlich erfolgt. Wird in der Anwendung nicht die Methode Free aufgerufen, erfolgt auch kein Aufruf des Objekt-Destruktors (auch dann nicht, wenn eine Garbage Collection stattfindet). Mit der nicht verwalteten Win32-API arbeiten 1 Die VCL ist vom Grundsatz her für eine Zusammenarbeit mit der Windows-API konzipiert. Dieses Zusammenspiel ist ähnlich geregelt wie bei Systems.Windows.Forms: Die VCL ist eine verwaltete API, die Aufrufe an die Windows-API tätigt und dabei ein Marshaling zwischen den verwalteten Strukturen der VCL und den nicht verwalteten Typen der Windows-API ausführt. Einige Units, allen voran die RTL, wurden portiert, sodass sie sich am Beginn der CLR und nicht der Windows-API befinden. Diese Units sind flexibler, da sie in jeder .NET-Umgebung funktionieren. Dies gilt auch für Umgebungen, die das Windows-Betriebssystem nicht unterstützen (Compact Framework, Mono usw.). Units, die das Windows-Betriebssystem benötigen, sind mit der Direktive platform gekennzeichnet. In Units, die nicht mit der Direktive platform markiert sind, sind die einzelnen Methoden oder Klassen, für die Windows erforderlich ist, mit dieser Direktive gekennzeichnet. Windows-Abhängigkeiten isolieren Um eine relative Plattformunabhängigkeit in RTL-Units zu erreichen, wurden einige Methodenfunktionen, die auf Windows basieren, in die Unit WinUtils verlagert. Zusätzlich wurden einige Klassen so geändert, dass sie eher auf CLR als auf Windows basieren. TObject, Exception, TPersistent und TComponent sind Klassen zugeordnet, die in .NET Framework implementiert sind. Auf diese Weise können sie relativ problemlos in andere .NET-Anwendungen integriert werden. Da die entsprechenden CLR-Klassen (System.Object, System.Exception, System.Marshal und System.Component) nicht alle von der VCL benötigten Methoden enthalten, werden die fehlenden Methoden über Delphi-Deklarationen von unterstützenden Klassen zur Verfügung gestellt. Dieser Mechanismus ist in den meisten Fällen transparent. Es gibt jedoch einige wenige Klassen, für die Sie kleinere Änderungen im Code vornehmen müssen. Bei TComponent ist beispielsweise FComponentState nun eine Eigenschaft von TComponentHelper und nicht mehr ein Feld von TComponent. Das bedeutet, dass Sie die Methoden Include und Exclude für FComponentState nicht verwenden können, da diese bei Übergabe einer Eigenschaft mit einer Kopie des Eigenschaftswerts arbeiten, wodurch FComponentState nicht geändert wird. Der Code Exclude(FComponentState, csUpdating); muss deshalb folgendermaßen neu geschrieben werden: FComponentState := FComponentState – [csUpdating]; TThread wurde ebenfalls geändert und dem CLR-Thread-Objekt zugeordnet. Das heißt, dass das Thread-Handle nun kein Ordinaltyp mehr ist, sondern eine Referenz auf das zugrunde liegende CLR-Thread-Objekt darstellt. Das bedeutet weiterhin, dass TThread keine ThreadID mehr unterstützt, da das CLR-Thread-Objekt die entsprechende Unterstützung nicht bereitstellt. Wenn eine Thread-Klasse eine ThreadID benötigt, sollten Sie diese von TWin32Thread ableiten. Die Win32-API aufrufen Viele Windows-APIs wurden geändert und verfügen nun über eine verwaltete Schnittstelle. Oft wurden Parametertypen geändert, vor allem, um Zeiger zu eliminieren. PChar-Typen wurde durch string- oder StringBuilder-Typen ersetzt. Wenn Ihre Anwendung eine Windows-API aufruft, erfolgt ein Aufruf für eine nicht verwaltete DLL. Aus diesem Grund müssen die Parameterwerte durch Marshaling in nicht verwalteten Speicher eingefügt werden, in dem Windows sie verarbeiten kann. Die Ergebnisse werden danach mittels Marshaling wieder in verwalteten Speicher transferiert. In den meisten Fällen wird das 70 1.5 Anwendungen mit RAD Studio für .NET Portieren von VCL-Anwendungen nach Marshaling automatisch durchgeführt, basierend auf den Attributen, die den API- oder Typdeklarationen hinzugefügt wurden. Es gibt jedoch auch Situationen, in denen ein explizites Marshaling erforderlich ist. Dies betrifft vor allem den Umgang mit Zeigern auf eine Struktur. Verwenden Sie zu diesem Marshaling die Klasse System.Marshal. Eine weitere Klasse, die beim Marshaling von Daten in und aus nicht verwaltetem Speicher sehr hilfreich ist, ist BitConverter. Beispielsweise enthält die Klasse Marshal keine Methode, mit der ein Double-Wert gelesen oder geschrieben werden kann. Dafür ist aber das Lesen und Schreiben von Int64-Werten möglich, die dieselbe Größe haben. Mit der Klasse BitConverter können letztere in und aus Double-Werten umgewandelt werden: // Double in nicht verwalteten Speicher kopieren: Mem := Marshal.AllocHGlobal(SizeOf(Int64)); Marshal.WriteInt64(Mem, BitConverter.DoubleToInt64Bits(DoubleVariable)); ... // Double aus nicht verwaltetem Speicher kopieren: DoubleVariable := BitConverter.Int64BitsToDouble(Marshal.ReadInt64(Mem)); Bei Verwendung der Marshal-Klasse dürfen Sie nicht vergessen, dass nicht verwalteter Speicher explizit freigegeben werden muss. Die Freigabe erfolgt nicht automatisch durch den Garbage Collector. Mit Windows-Botschaften arbeiten Eine Änderung bei der Zusammenarbeit von RAD Studio-Anwendungen und Windows betrifft die Funktionsweise von Botschaftsbehandlungsroutinen. Deklaration und Verwendung von Botschaftsbehandlungsroutinen sind größtenteils identisch, die Botschafts-Cracker-Typen wurden aber von Records in Klassen geändert. Typumwandlungen zwischen Botschafts-Cracker-Typen sind nun nicht mehr möglich. Die meisten Änderungen wurden bereits im Abschnitt über Typumwandlungen erläutert. Im Folgenden finden Sie noch einige zusätzliche Punkte, die beachtet werden müssen. • Beim Portieren von Code, der eine Botschaft sendet, reicht es nun nicht mehr aus, den Botschafts-Cracker auf dem Stack zu deklarieren, die Felder auszufüllen und ihn in einem Aufruf von SendMessage zu übergeben. Sie müssen zusätzlich einen Aufruf zur Erstellung des Botschafts-Crackers hinzufügen, da es sich bei ihm nun um eine Klasse handelt. • Innerhalb einer Botschaftsbehandlungsroutine können Sie mit dem Schlüsselwort inherited weiterhin eine geerbte Botschaftsbehandlungsroutine aufrufen. Dabei müssen Sie jetzt jedoch sicherstellen, dass der Botschafts-Cracker-Typ mit demjenigen in der geerbten Botschaftsbehandlungsroutine identisch ist. Übernimmt die geerbte Botschaftsbehandlungsroutine beispielsweise einen Parameter vom Typ TWMMouse und benötigt Ihre Botschaftsbehandlungsroutine nur TMessage, wird zur Laufzeit eine Exception aufgrund einer ungültigen Umwandlung ausgelöst, wenn Sie Ihre Botschaftsbehandlungsroutine für die Verwendung von TMessage deklarieren und die geerbte Routine aufrufen. Aus diesem Grund müssen Sie beim Aufruf der geerbten Botschaftsbehandlungsroutine sicherstellen, dass der Botschaftsparameter mit dem der geerbten Routine übereinstimmt. • Wenn eine Botschaft Parameter hat, die als Zeiger auf Records (oder ganz allgemein als Zeiger auf eine beliebe Komponente) fungieren, hat der entsprechende Botschafts-Cracker Eigenschaften, die diese Records repräsentieren. Wichtig dabei ist die Tatsache, dass es sich um Eigenschaften und nicht um Felder handelt. Deshalb können Sie zwar die Felder des Record direkt aus der Eigenschaft laden, wenn die Behandlungsroutine aber Feldwerte ändern muss, können Sie keine direkten Zuweisungen an die Felder des Record durchführen. Stattdessen müssen Sie den Record in eine lokale Variable kopieren, die Änderungen vornehmen und das Ergebnis wieder der Eigenschaft zuweisen. Die Verwendung von Windows-Botschaften ist in RAD Studio etwas aufwändiger, da neben der Arbeitsbelastung durch die Botschaftswarteschlange noch zusätzlich das Marshaling von Werten in und aus nicht verwaltetem Speicher hinzukommt. Der Mehraufwand ist vor allem dann spürbar, wenn ein Parameter einen Zeiger darstellt (eine Objektreferenz oder einen Zeiger auf eine Struktur). Diese Parameter werden letzten Endes in WPARAM oder LPARAM umgewandelt. Dazu wird der Typ IntPtr verwendet, der als Handle für einen Block mit nicht verwaltetem Speicher agiert, in dem sich eine Kopie der Struktur befindet. Objektreferenzen werden mit Hilfe der Klasse GCHandle umgewandelt. In den meisten Fällen wird das Marshaling dieser Parameter (in und aus dem Typ IntPtr) von den vordefinierten Botschafts-Cracker-Typen durchgeführt. Wenn Sie jedoch eigene Botschaften definieren, müssen Sie das Marshaling eventuell selbst ausführen. Die in der Unit Controls definierten Botschafts-Cracker-Klassen demonstrieren, wie das Marshaling zu erfolgen hat. Die VCL definiert und verwendet verschiedene private-Botschaftstypen. Die meisten dieser Botschaftstypen befinden sich in der Unit Controls und besitzen Bezeichner der Form CM_XXX oder CN_XXX. Aufgrund des zusätzlichen Aufwands durch das Marshaling von Botschaften wurden einige der CM_XXX-Botschaftstypen geändert oder eliminiert und durch einen Mechanismus ersetzt, der in der .NET-Umgebung weniger aufwändig ist. In der folgenden Tabelle sind die Botschaftstypen aufgeführt, die geändert wurden. Außerdem wird kurz beschrieben, wie die entsprechende Aufgabe in RAD Studio durchgeführt wird: 71 1 Portieren von VCL-Anwendungen nach 1 RAD Studio für .NET 1.5 Anwendungen mit Botschaftstyp Änderung CM_FOCUSCHANGED Ersetzt durch eine Protected-Methode (FocusChanged) für TWinControl. Botschaftsbehandlungsroutinen werden durch eine Variante der Methode FocusChanged ersetzt. Anstatt Botschaften zu senden, wird FocusChanged unter Verwendung des IWinControl-Interface aufgerufen. CM_MOUSEENTER Die Bedeutung von LPARAM hat sich geändert. Früher übergab LPARAM eine Objektreferenz auf das untergeordnete Steuerelement, in das die Maus bewegt wurde. Nun übergibt LPARAM den Index des untergeordneten Steuerelements in der Liste FWinControls oder FControls. CM_MOUSELEAVE Die Bedeutung von LPARAM hat sich geändert. Früher übergab LPARAM eine Objektreferenz auf das untergeordnete Steuerelement, aus dem die Maus bewegt wurde. Nun übergibt LPARAM den Index des untergeordneten Steuerelements in der Liste FWinControls oder FControls. CM_BUTTONPRESSED Ersetzt durch eine Protected-Methode (ButtonPressed) für TSpeedButton. Diese Botschaft wurde nur von TSpeedButton verwendet. Die Botschaftsbehandlungsroutine CMButtonPressed wurde durch ButtonPressed ersetzt, die direkt aufgerufen wird. CM_WINDOWHOOK Veraltet. TApplication.HookMainWindow und TApplication.UnhookMainWindow public-Methoden, die direkt aufgerufen werden können. sind CM_CONTROLLISTCHANGE Ersetzt durch eine Protected-Methode (ControlListChange) für TWinControl. Botschaftsbehandlungsroutinen werden durch eine Variante der Methode ControlListChange ersetzt. CM_GETDATALINK Ersetzt durch eine Protected-Methode (GetDataLink) für verschiedene datensensitive Steuerelemente. Der Aufruf erfolgt über das neue Interface IDataControl. Bei der Erstellung eigener datensensitiver Steuerelemente (die nicht von einer in DBCtrls vorhandenen Klasse abgeleitet sind) muss IDataControl implementiert werden, wenn das Steuerelement in einer DBCGrid-Klasse eingesetzt werden soll. CM_CONTROLCHANGE Ersetzt durch eine Protected-Methode (GetDataLink) für verschiedene datensensitive Steuerelemente. Der Aufruf erfolgt über das neue Interface IDataControl. Bei der Erstellung eigener datensensitiver Steuerelemente (die nicht von einer in DBCtrls vorhandenen Klasse abgeleitet sind) muss IDataControl implementiert werden, wenn das Steuerelement in einer DBCGrid-Klasse eingesetzt werden soll. CM_CHANGED Die Bedeutung von LPARAM hat sich geändert. Früher übergab LPARAM eine Objektreferenz, nun wird ein Hash-Code für das geänderte Objekt übergeben. CM_DOCKCLIENT Ersetzt durch eine Protected-Methode (DockClient) für TWinControl. Botschaftsbehandlungsroutinen werden durch eine Variante der Methode DockClient ersetzt. CM_UNDOCKCLIENT Ersetzt durch eine Protected-Methode (UndockClient) für TWinControl. Botschaftsbehandlungsroutinen werden durch eine Variante der Methode UndockClient ersetzt. CM_FLOAT Ersetzt durch eine Protected-Methode (FloatControl) für TWinControl. Botschaftsbehandlungsroutinen werden durch eine Variante der Methode FloatControl ersetzt. CM_ACTIONUPDATE Veraltet. TApplication.DispatchAction ist nun public und wird anstatt über eine Botschaft direkt aufgerufen. CM_ACTIONEXECUTE Veraltet. TApplication.DispatchAction ist nun public und wird anstatt über eine Botschaft direkt aufgerufen. Änderungen am Threading-Modell Damit Windows-API-Aufrufe auf bestimmten Betriebssystemen ordnungsgemäß funktionieren, muss manchmal das Single Threaded Apartment-Modell (STA) verwendet werden. Beispielsweise funktionieren in einigen Versionen von Windows 98 die Dialogfelder zum Öffnen und Speichern nur dann, wenn die RAD Studio-Anwendung auf dem Single Threaded 72 1.5 Anwendungen mit RAD Studio für .NET Portieren von VCL-Anwendungen nach Apartment-Modell basiert. Für alle Bereiche der VCL, die COM verwenden, ist dieses Modell erforderlich. Das Threading-Modell wird bei der ersten Ausführung des Prozesses eingerichtet. Wenn Sie eine ausführbare Datei erstellen, ist die Einrichtung sehr einfach: Fügen Sie das Attribut [STAThread] in die Zeile ein, die unmittelbar vor der Anweisung begin in der dpr-Datei steht. Bei der Erstellung einer DLL kann das Threading-Modell nicht auf diese Weise aktiviert werden. Sie können aber die Prozedur CheckThreadingModel in der Unit SysUtils aufrufen, um eine Exception auszulösen, wenn die Anwendung eine Methode aufruft, für die ein bestimmtes Threading-Modell erforderlich ist. Diese Einschränkung ist in .NET bekannt. Microsoft Visual Studio fügt standardmäßig das Attribut STAThreadAttribute in die von ihm erzeugten Anwendungen ein. Migrieren von Varianten Der Typ Variant spielt in RAD Studio eine andere Rolle als in Win32. Der Win32-Compiler ordnet den Typ Variant dem Record-Typ zu, den COM für Varianten verwendet. In RAD Studio ist dieser Typ allgemeinerer Natur. Jedes Objekt (in RAD Studio ist dies jeder Typ) kann nach entsprechender Bearbeitung als Variante agieren. So könnten Sie in RAD Studio einer Variante beispielsweise ein Steuerelement zuweisen. Der Delphi-Typ Variant ist eine Sprachnotation, die nicht mit CLS kompatibel ist. Wenn Sie in RAD Studio-Code Varianten verwenden, die nach außen sichtbar sind, werden diese nur als System.Object zugeordnet. Aus diesem Grund steht für Code in anderen Sprachen nicht die Flexibilität bei der Typumwandlung zur Verfügung, wie sie von Delphi-Varianten unterstützt wird. Änderungen an TVarRec Wenn Ihr Code Varianten verwendet, besteht durchaus die Möglichkeit, dass er trotzdem ausgeführt werden kann. Da Varianten jedoch nicht mehr auf dem Typ TVarRec basieren, muss Code neu geschrieben werden, der mittels einer Win32-Variante auf den zugrunde liegenden TVarRec-Record zugreift. Anmerkung: Fast alle Funktionen der Unit Variants sind in RAD Studio implementiert. Wenn Sie den VarType einer Variante abrufen müssen, können Sie dies tun, wobei der Code weiterhin in plattform-portierbarer Form erhalten bleibt. Änderungen bei OLE-Varianten Die COM Interop-Schicht führt automatisch ein Marshaling von Objekten (und somit auch von Varianten) durch. Sie können RAD Studio-Varianten deshalb zusammen mit COM verwenden. Wenn Sie RAD Studio-Varianten mit COM nutzen, sollten Sie der Variante aber nur COM-kompatible Typen zuweisen. In Delphi für Win32 erzwingt der Compiler COM-Restriktionen für Daten, die einem OleVariant zugewiesen werden können. In RAD Studio ist OleVariant einfach ein Synonym für Variante. Es wird nicht dafür gesorgt, dass der Variantenwert ein COM-kompatibler Typ ist. Änderungen bei benutzerdefinierten Varianten Benutzerdefinierte Varianten verhalten sich in RAD Studio völlig anders als in Delphi. Da Varianten Objekte sind, müssen Sie nichts unternehmen, um eine benutzerdefinierte Variante zu erstellen – jede Klasse, die Sie definieren, ist bereits ein Variant-Typ. Damit benutzerdefinierte Varianten auch erwartungsgemäß funktionieren, sollten Sie folgende CLR-Interfaces implementieren: IComparable, IConvertible und ICloneable. Der Delphi-Compiler kann mit Hilfe dieser Interfaces Variant-Operationen implementieren. Dennoch lassen sich andere Variant-Typen (auch bei Verwendung dieser Interfaces) nur mit Hilfe einer FromObject-Methode in eine benutzerdefinierte Variante (Klasse) umwandeln: class function FromObject(AObject: System.Object): TObject; static; FromObject übernimmt ein beliebiges Quellobjekt (die Variante, die in den benutzerdefinierten Klassentyp umgewandelt werden soll) und gibt die entsprechende Instanz als TObject zurück. Arbeiten mit Ressourcen RAD Studio kann Windows-Ressourcen (res-Dateien) in Ihre Assemblierungen linken. Das bedeutet, dass Sie bei der ersten Migration einer Anwendung die Deklaration und die Verwendung der Ressourcen nicht ändern müssen (der Code funktioniert 73 1 VCL-Anwendungen portieren RAD Studio für .NET 1.5 Anwendungen mit weiterhin). In einigen Fällen hätten Sie Änderungen aber wahrscheinlich sowieso vorgenommen. Wenn Sie beispielsweise benutzerdefinierte Cursor verwenden, ist es einfacher, mit der Funktion LoadCursor der Windows-API den Cursor zu TScreen.Cursors hinzuzufügen, als die Klasse Cursor zu verwenden und dann ein Handle auf den zugrunde liegenden Cursor abzurufen. Für Ressourcen, die nicht Windows-spezifisch sind (wie Bitmaps, Symbole und Strings) werden Sie möglicherweise doch auf eine .NET-Ressourcendatei zurückgreifen. Ressourcenstrings Wenn Sie das Schlüsselwort resourcestring verwenden, erstellt RAD Studio die Stringressourcen als .NET- und nicht als Windows-Ressourcen. Die Erstellung erfolgt automatisch. Sie dürfen nur nicht vergessen, dass der Typ PResStringRec nicht mehr verwendet werden kann. 1 Bitmaps Mit Hilfe der Klasse ResourceWriter können Sie Bitmaps in .NET-Ressourcen umwandeln. Die dabei angelegte resources-Datei kann mit Ihrer RAD Studio-Anwendung verknüpft oder als Satellite-Assemblierung weitergegeben werden. Damit die umgewandelten Bitmaps verwendet werden können, verfügt die Methode LoadFromResourceName über neue Varianten für die Arbeit mit .NET-Ressourcen (die alte Version von LoadFromResourceName und Methode LoadFromResourceID werden nicht mehr unterstützt). Wenn sich Ihre Bitmaps beispielsweise in einer resources-Datei namens MyResources.en-US.resources befinden, können Sie die Bitmaps wie folgt laden: MyBitmap.LoadFromResourceName('MyFirstBitmap', 'MyResources', System.Assembly.GetCallingAssembly); In diesem Beispiel wird davon ausgegangen, dass die Ressourcen in der Assemblierung compiliert sind, die den Methodenaufruf mit dieser Zeile enthält. Wenn die Ressourcen in eine andere Assemblierung compiliert wurden, können Sie entweder System.Assembly.GetAssembly verwenden und dabei einen Typ angeben, der in der entsprechenden Assemblierung definiert ist, oder mit System.Assembly.GetExecutingAssembly die Assemblierung ermitteln, die aktuell ausgeführt wird. Änderungen an TTreeView.OnCompare Die Signatur für das Ereignis OnCompare in der Klasse TTreeView wurde in der VCL für .NET geändert. Vorhandener Code verursacht eine Exception zur Laufzeit, wenn die Ereignisbehandlungsroutine aufgerufen wird. In Delphi 7 lautete die Signatur: TTVCompareEvent = procedure(Sender: TObject; Node1, Node2: TTreeNode; Data: Integer; var Compare: Integer) of object; In Delphi für .NET lautet die Signatur: TTCompareEvent = procedure(Sender: TObject; Node1, Node2: TTreeNode; Data: TTag; var Compare: Integer) of object; Siehe auch Web-Services nach Delphi für .NET portieren ( Platform Invoke mit Delphi für .NET verwenden ( see page 80) see page 48) 1.5.3 VCL-Anwendungen portieren Bei der Portierung von VCL-Anwendungen von Delphi 7 nach RAD Studio gibt es einige Punkte zu bedenken. Neben grundlegenden Sprachelementen, die ersetzt oder geändert werden müssen, gibt es einige Strategien, denen Sie folgen sollten, um sicherzustellen, dass Ihre Anwendungen komplett und stabil portiert werden. Dieses Thema befasst sich mit folgenden Bereichen: 74 1.5 Anwendungen mit RAD Studio für .NET VCL-Anwendungen portieren • Allgemeine sprachspezifische Probleme • Packages umbenennen • Neue Funktionen der Programmiersprache • Web-Service-Client-Anwendungen portieren Allgemeine sprachspezifische Probleme Beim Portieren von Delphi 7-Anwendungen nach RAD Studio müssen spezielle Eigenschaften des .NET Framework beachtet werden. Im .NET Framework gelten Zeiger beispielsweise als unsicher, weshalb Anwendungen, die Zeiger verwenden, nicht in die Kategorie verwalteter Code fallen. Um in diesem Punkt eine Kompatibilität zum .NET Framework zu erreichen, müssen Sie Ihre Anwendungen anpassen und die Verwendung von Zeigern, des Typs pChar und anderer sprachspezifischer Elemente vermeiden oder umgehen. Darüber hinaus gibt es bezüglich der Win32-API einige kritische Punkte bei der Verwendung von Crackern, der Migration von Char-Datentypen und anderem. Packages umbenennen Beim Portieren eines Delphi 7-Package nach RAD Studio müssen die Packages in der Liste "Erfordert" umbenannt werden. In der folgenden Tabelle sind die alten und neuen Package-Namen aufgeführt. Alter Name Neuer Name rtl Borland.Delphi und Borland.VclRtl vcl Borland.Vcl vclx Borland.VclX dbrtl Borland.VclDbRtl bdertl Borland.VclBdeRtl vcldb Borland.VclDbCtrls dbexpress Borland.VclDbExpress dbxcds Borland.VclDbxCds dsnap Borland.VclDSnap dsnapcon Borland.VclDSnapCon vclactnband Borland.VclActnBand Borland.VclActnBand-Packages werden nun durch Auswahl von Komponenten Installierte .NET-Komponenten NET VCL-Komponenten installiert. Neue Funktionen der Programmiersprache In die Programmiersprache Delphi sind einige neue Funktionen eingefügt worden, um die Programmierkonzepte und -funktionen der .NET-Plattform und der CLS (Common Language Specification) abzudecken: • Unterteilung von Code in Namespaces • Neue Sichtbarkeitsbezeichner für Klassenelemente • Klassenstatische Methoden, Eigenschaften und Felder • Klassenkonstruktoren • Verschachtelte Typdeklarationen in Klassen • Versiegelte (sealed) Klassen • Finale virtuelleMethoden • Überladene Operatoren in Klassen 75 1 Überblick zu VCL für .NET RAD Studio für .NET 1.5 Anwendungen mit • .NET-Attribute • Unterstützende Klassen (Syntax) Die Programmierung in der Speicher freigebenden Umgebung von .NET (Garbage Collection) wirft bei der Zuweisung und Freigabe von Objekten einige neue Probleme auf. Diese Probleme werden im Abschnitt Speicherverwaltung auf der .NET-Plattform erläutert. Web-Service-Client-Anwendungen portieren Das .NET Framework sorgt auch bei der Behandlung von Web-Services und Web-Service-Clients für eine veränderte Architektur. Ihre vorhandenen Web-Service-Client-Anwendungen müssen deshalb geändert werden, damit sie im .NET Framework ausführbar sind. RAD Studio unterstützt die RIO-Komponenten nicht, sondern verwendet für die Verwaltung von Web-Service-Client-Anwendungen einen klareren Ansatz. Sie müssen die RIO-Komponenten entfernen und die Zugriffsmethode auf WSDL-Dokumente ändern. 1 Siehe auch Überblick zu VCL.NET ( see page 77) Sprachspezifische bei der Portierung von VCL-Anwendungen nach Delphi für .NET ( Platform Invoke mit Delphi 2005 verwenden ( Web-Services nach Delphi für .NET portieren ( see page 64) see page 48) see page 80) Web-Services-Client-Anwendung von Delphi für Win32 nach Delphi für .NET portieren ( see page 223) 1.5.4 Überblick zu VCL für .NET VCL für .NET ist die Programmierumgebung für die Erstellung von RAD Studio-Anwendungen mit VCL-Komponenten. Mit Hilfe von RAD Studio und VCL für .NET können Benutzer beim Schreiben neuer Anwendungen die Leistungsstärke von Delphi weiterhin nutzen und Win32-Anwendungen in das .NET Framework migrieren. Diese Technologien erleichtern Delphi-Entwicklern den Wechsel zu .NET und vereinfachen die Portierung vorhandener Delphi-Anwendungen. RAD Studio unterstützt die Microsoft .NET Framework-Entwicklung mit der Sprache Delphi und VCL für .NET-Steuerelementen. RAD Studio-ASP.NET unterstützt außerdem die Entwicklung von Web Forms- und SOAP-/XML-Web-Services-Anwendungen. VCL für .NET umfasst einen Großteil der gebräuchlichsten Klassen der VCL für Win32. Das .NET Framework ist für die Verwendung .NET-konformer Sprachen konzipiert. In vielen Fällen kann daher Delphi-Quelltext, der auf Klassen und Funktionen der Win32-VCL basiert, relativ problemlos auf die .NET-Umgebung portiert werden. Häufig sind vor der erneuten Compilierung in .NET nur geringfügige Änderungen erforderlich. Manchmal ist die erneute Compilierung sogar ohne jede Änderung möglich. VCL für .NET ist eine Untermenge der VCL und unterstützt deshalb viele der vorhandenen VCL-Klassen. Quelltext mit direkten Aufrufen der Win32-API muss jedoch geändert werden. Für Win32-VCL-Steuerelemente von Fremdherstellern müssen entsprechende .NET-Versionen verfügbar sein. Dieser Abschnitt bietet eine Einführung in folgende Themen: • Architektur von VCL für .NET • VCL für .NET und das .NET Framework • Komponenten von VCL für .NET • Borland.VCL-Namespace • Delphi-Anwendungen nach RAD Studio portieren • .NET-Komponenten für die Verwendung in VCL für .NET-Anwendungen importieren 76 1.5 Anwendungen mit RAD Studio für .NET Überblick zu VCL für .NET Architektur von VCL für .NET 1 VCL ist ein Satz visueller Komponenten für die Erstellung von Windows-Anwendungen in Delphi. VCL für .NET enthält identische Komponenten, die jedoch für die Verwendung im .NET Framework aktualisiert wurden. VCL für .NET und das .NET Framework existieren in RAD Studio nebeneinander. Beide stellen Komponenten und Funktionen bereit, mit denen Sie .NET-Anwendungen erstellen können: • VCL für .NET enthält Komponenten für die Erstellung von VCL-Formularanwendungen, die .NET-fähige Delphi-Formulare sind. • VCL für .NET stellt nicht-visuelle, .NET-fähige VCL-Komponenten für den Zugriff auf Datenbanken bereit. Außerdem kann über ADO.NET- und BDP.NET-Provider auf Datenbanken zugegriffen werden. • .NET ermöglicht die Erstellung von .NET Web Forms- und Konsolenanwendungen unter Verwendung von .NET-Komponenten und basierend auf Delphi-Code. Sie können VCL-Formularanwendungen mit den VCL für .NET-Komponenten entwickeln. ASP.NET-Web-Forms-Anwendungen lassen sich entweder mit VCL für .NET- oder mit .NET-Komponenten erzeugen. VCL für .NET und das .NET Framework Das .NET Framework stellt eine Bibliothek mit Komponenten, Klassen und Low-Level-Funktionen bereit und übernimmt den überwiegenden Teil der allgemeinen Funktionalität, von der Anzeige der Schaltflächen bis hin zu Remote-Funktionen, und zwar unabhängig von der Programmiersprache, die für die Implementierung verwendet wird. VCL für .NET und das .NET Framework stehen hinsichtlich ihrer Funktionalität auf derselben Stufe. Ebenso wie das .NET Framework stellt auch VCL für .NET Bibliotheken mit Komponenten, Steuerelementen, Klassen und Low-Level-Funktionen für die Erstellung von Web Forms- und Konsolenanwendungen zur Verfügung, die auf der aktuellen Windows .NET Framework-Plattform ausgeführt werden können. VCL für .NET ist kein Ersatz für das .NET Framework. Zur Verwendung von VCL für .NET ist immer noch die .NET-Laufzeitumgebung erforderlich. Sie können aber komplette Anwendungen mit VCL für .NET-Komponenten erstellen, die sich auf der .NET-Plattform ausführen lassen. Es ist möglich, RAD Studio-Anwendungen ohne Verwendung von VCL für .NET zu entwickeln, indem Sie Web Forms- und Konsolenanwendungen in RAD Studio-Code erstellen. Sie können mit RAD Studio leistungsstarke .NET-Anwendungen mit Hilfe von .NET-Komponenten erzeugen oder VCL für .NET-Komponenten nutzen, die aus der Delphi-VCL migriert wurden. Vorhandene Delphi-VCL-Anwendungen, die unter Windows XP ausgeführt werden sollen, lassen sich problemlos unter Verwendung von RAD Studio portieren. Komponenten von VCL für .NET VCL für .NET besteht aus einem Satz von visuellen und nicht-visuellen Komponenten und basiert auf dem Konzept der visuellen Erstellung von Anwendungen, um den manuellen Codier-Aufwand möglichst gering zu halten. 77 Überblick zu VCL für .NET RAD Studio für .NET 1.5 Anwendungen mit Visuelle Komponenten RAD Studio bietet zahlreiche visuelle Komponenten (Steuerelemente), die Sie bei der Erstellung Ihrer Anwendungen nutzen können. Neben gängigen Steuerelementen wie Schaltflächen, Eingabefeldern, Optionsfeldern und Kontrollkästchen stehen z.B. auch Gitter, Bildlaufleisten, Kalenderobjekte und ein leistungsstarker Menü-Designer zur Verfügung. Diese Steuerelemente werden in RAD Studio aber anders dargestellt als in Frameworks, etwa dem .NET Framework. Die IDEs anderer Sprachen (wie C# oder Java) unterstützen in der Regel eine codebasierte Darstellung von Formularen und anderen visuellen Komponenten. Hierzu gehören physische Definitionen (wie Größe, Höhe und andere Eigenschaften) sowie Konstruktoren und Destruktoren für diese Komponenten. Der Quelltext-Editor von RAD Studio enthält jedoch keine Code-Darstellung der visuellen Komponenten. RAD Studio ist ein ressourcenbezogenes System, bei dem die Codebehind-Darstellung primär mittels Ereignisbehandlungsroutinen erfolgt, in die Sie die Programmlogik integrieren. Visuelle Komponenten werden in Textdateien deklariert und definiert, die die Namenserweiterung .dfm (Delphi-Formulare) bzw. .nfm (RAD Studio-Formulare) haben. Die Dateien mit der Erweiterung .nfm werden von RAD Studio angelegt, wenn Sie Ihre VCL-Formulare im Formular-Designer erstellen, und in der Ressourcenliste der Projektverwaltung des Projekts angezeigt. 1 Nicht-visuelle Komponenten Nicht-visuelle Komponenten werden zur Implementierung von Funktionen verwendet, deren visuelle Darstellung nicht erforderlich ist. So können Sie zum Beispiel den Zugriff auf Datenbanken und Datenmengen mittels nicht-visueller BDP.NET-Komponenten implementieren. Diese Komponenten, die zur Laufzeit nicht sichtbar sind, werden zur Entwurfszeit durch Komponenten der Tool-Palette dargestellt. VCL für .NET stellt eine Vielzahl nicht-visueller Komponenten für den Datenzugriff, für Serverfunktionen usw. bereit. Borland.VCL-Namespace VCL für .NET-Klassen sind unter dem Namespace Borland.Vcl zu finden, datenbankbezogene Klassen unter dem Namespace Borland.Vcl.DB und Klassen der Laufzeitbibliothek unter dem Namespace Borland.Vcl.Rtl. Unit-Dateien wurden in entsprechenden Borland.Vcl-Namespaces zusammengefasst. In einigen Fällen wurden Units verlagert. Es wurden aber aussagekräftige Bezeichnungen für die Namespaces verwendet, damit Sie die gewünschte Funktionalität problemlos auffinden können. Das Unterverzeichnis c:\Programme\CodeGear\RAD Studio-Objekte. Studio\5.0\Source enthält Quelltextdateien für alle RAD Delphi-Anwendungen nach RAD Studio portieren Bei Bedarf können Sie Anwendungen, die mit einer früheren Version von Delphi geschrieben wurden, nach .NET portieren. In den meisten Fällen ist die Migration einfacher als die komplette Neuerstellung der Anwendung. Da RAD Studio die Vorteile der strukturellen Elemente das .NET Framework nutzt, müssen Sie einige Aufgaben manuell durchführen, um eine lauffähige Anwendung zu erhalten. Beispielsweise unterstützt das .NET Framework in sicherem Code keine Zeiger. Folglich müssen Instanzen von pChar oder Zeigervariablen in einen entsprechenden .NET-Typ konvertiert werden. Viele Delphi-Objekte wurden bereits an diese Typrestriktionen angepasst. Ihr Code könnte aber noch Referenzen auf Zeiger oder nicht unterstützte Typen enthalten. Weitere Informationen finden Sie in der Sprachreferenz dieses Hilfesystems. .NET-Komponenten für die Verwendung in VCL für .NET-Anwendungen importieren RAD Studio enthält den .NET-Import-Experten, der Sie dabei unterstützt, .NET-Steuerelemente in VCL für .NET-Units und -Packages zu importieren. Sie können zum Beispiel alle .NET-Komponenten, etwa diejenigen aus der System.Windows.Forms-Assemblierung, in ActiveX-Wrapper einfügen und diese mit VCL für .NET-Anwendungen weitergeben. Nach dem Import der gewünschten .NET-Komponenten können Sie der Tool-Palette eine Package-Datei hinzufügen, in der die Units für jede Komponente enthalten sind. Es ist auch möglich, einzelne Unit-Dateien anzuzeigen und zu ändern. Diese Dateien sind als Referenzmaterial sehr hilfreich, wenn Sie eigene Komponenten erstellen. 78 1.5 Anwendungen mit RAD Studio für .NET Web-Service-Clients portieren Siehe auch Sprachreferenz VCL-Anwendungen portieren ( Daten-Provider für .NET ( see page 75) see page 28) .NET-Steuerelemente in VCL für .NET importieren ( see page 180) Deployment von Anwendungen VCL für .NET-Formularanwendung erstellen ( see page 163) 1 1.5.5 Web-Service-Clients portieren RAD Studio-Web-Services verwenden das .NET Framework als Service-Schicht. Web-Service-Client-Anwendungen, die mit Delphi 7 oder einer früheren Version erstellt wurden, müssen folglich geändert werden, wenn sie das .NET Framework verwenden sollen. In diesem Thema wird Folgendes behandelt: • Vorhandene Anwendungen ändern und ergänzen • Hinweise zur Implementierung Vorhandene Anwendungen ändern und ergänzen Nehmen Sie die folgenden Änderungen und Ergänzungen an Ihren Anwendungen vor: • Entfernen Sie RIO-Komponenten. Sie werden im .NET Framework nicht mehr funktionieren. Bevor Sie Komponenten löschen, sollten Sie jedoch die Eigenschaftsinformationen für diese Komponenten, z.B. URLs, sichern. • Entfernen Sie SOAP-Units von Delphi 7 aus der uses-Klausel. Außerdem muss die uses-Referenz auf die Interface-Proxy-Unit entfernt werden, die durch den Delphi 7 WSDL-Import generiert wurde. • Fügen Sie eine Webreferenz hinzu. Verwenden Sie hierzu den Befehl Webreferenz hinzufügen im Kontextmenü der Projektverwaltung. Hinweise zur Implementierung Die folgenden Hinweise beziehen sich auf Probleme, die beim Portieren von Web-Service-Client-Anwendungen auftreten können. Web-Service-Server-Interoperabilität Die SOAP-Implementierungen von Delphi 7 und .NET weisen geringfügige Unterschiede auf. Auf dem Server müssen verschiedene Optionen (Eigenschaft TSOAPDomConv.Options) eingestellt werden, damit mehrere Clients erfolgreich ausgeführt werden können. Folgende Optionen müssen eingestellt sein, damit beide Client-Anwendungen die SOAP-Packages verarbeiten und die korrekte Codierung übertragen: [soTryAllSchema, soRootRefNodesToBody, soUTF8InHeader, soUTF8EncodeXML] Exceptions behandeln Die folgende Tabelle führt auf, welche Exceptions sich in Delphi 7 und dem .NET Framework entsprechen: Exception in Delphi 7 Exception im .NET Framework ERemotableException System.Web.Services.Protocols. SoapException 79 Web-Service-Clients portieren ESOAPHTTPException RAD Studio für .NET 1.5 Anwendungen mit System.Net.WebException Faultcodes In Delphi 7 gibt die Eigenschaft ERemotableException.FaultCode vollständige Namen, wie zum Beispiel SOAP-ENV:Client.Login zurück. Sie müssen den Code dann mit der Funktion ExtractLocalName extrahieren. Die .NET Framework-Klasse SoapException enthält die Eigenschaft SoapException.Code.Name unmittelbar. SOAP-Pakete überwachen In Delphi 7 enthält die Komponente THTTPRIO die Ereignisse OnBeforeExecute und OnAfterExecute, mit deren Hilfe Sie Anfragen und Antworten überwachen können. Eine ähnliche Funktionalität lässt sich mit der Klasse SoapExtension des .NET Framework implementieren. Im Folgenden sehen Sie ein Fragment eines Beispiels, das diese Funktionalität implementiert. Das vollständige Beispiel finden Sie in der CodeCentral von Borland. Der Link hierzu ist in der Link-Liste am Ende dieses Themas enthalten. 1 uses System.Xml, System.Web.Services, System.Web.Services.Protocols, System.IO; type TSoapMessageEvent = procedure (Sender: TObject; const Xml: string) of object; TSoapMonitor = class(TObject) private FOnRequest: TSoapMessageEvent; FOnResponse: TSoapMessageEvent; protected procedure DoRequest(const Xml: string); procedure DoResponse(const Xml: string); public class function FormatXmlData(const Xml: string): string; static; property OnRequest: TSoapMessageEvent add FOnRequest remove FOnRequest; property OnResponse: TSoapMessageEvent add FOnResponse remove FOnResponse; end; . . . { TSoapMonitor } procedure TSoapMonitor.DoRequest(const Xml: string); begin if Assigned(FOnRequest) then FOnRequest(Self, Xml); end; procedure TSoapMonitor.DoResponse(const Xml: string); begin if Assigned(FOnResponse) then FOnResponse(Self, Xml); end; class function TSoapMonitor.FormatXmlData(const Xml: string): string; var Doc: XmlDocument; Sw: StringWriter; Xw: XmlTextWriter; begin Doc := XmlDocument.Create; Doc.LoadXml(Xml); Sw := StringWriter.Create; 80 1.5 Anwendungen mit RAD Studio für .NET Web-Service-Clients portieren Xw := XmlTextWriter.Create(sw); Xw.Formatting := Formatting.Indented; Xw.Indentation := 2; Xw.IndentChar := ' '; doc.Save(xw); Result := sw.ToString; Xw.Close; Sw.Close; end; Mit SOAP-Headern arbeiten In Delphi 7 muss vor dem Aufruf einer Methode der Header gesendet werden. Das Header-Objekt wird nach dem Methodenaufruf freigegeben. Im .NET Framework besteht die Header-Klasse nach dem Aufruf einer Methode so lange fort, bis mit new eine neue Instanz zugewiesen oder die Header-Klasse durch die Zuweisung von nil entfernt wird. SOAP-Anlagen Das .NET Framework unterstützt keine MIME-Anlagen. Delphi 7 SOAP unterstützt keine DIME-Anlagen. Siehe auch Überblick zu den ASP.NET-Web-Services ( see page 106) Web-Services-Client-Anwendung von Delphi für Win32 nach Delphi für .NET portieren ( see page 223) CodeCentral-Beispiel zur Überwachung von SOAP-Paketen 81 1 RAD Studio für .NET 1.6 Webanwendungen mit ASP.NET 1.6 Webanwendungen mit ASP.NET entwickeln ASP.NET ist das Programmiermodell für das Erstellen von Webanwendungen auf der Basis des .NET Framework. Dieser Abschnitt erläutert den konzeptionellen Hintergrund für das Erstellen von ASP.NET-Anwendungen in RAD Studio. Neben der Unterstützung der Datenzugriffskomponenten im .NET Framework enthält RAD Studio DB Web Controls. Die DB Web Controls verwenden die .NET Framework-Provider und die Borland-Datenprovider für .NET (BDP.NET) um die Entwicklung von Webanwendungen zu beschleunigen. 1 Themen Name Überblick zu ASP.NET ( Beschreibung see page 85) ASP.NET ist die .NET-Programmierumgebung für die Erstellung von Anwendungen in HTML, die sich im Web ausführen lassen. Dieses Thema enthält grundlegende Informationen zu den wichtigsten Komponenten der ASP.NET-Architektur und erläutert, wie ASP.NET mit anderen Programmiermodellen des .NET Framework kooperiert. Folgende Bereiche werden behandelt: • Architektur von ASP.NET • Web Forms • Datenzugriff • Web-Services • Entwurfszeitfunktionen • Unterstützte Webserver • Beispielanwendungen Überblick zu CodeGear DB Web Controls ( see page 88) Anmerkung: DB Web Controls (Namespace Borland.Data.Web) sind seit 2007 veraltet. Sie sollten statt dessen die Standard-Websteuerelemente verwenden. CodeGear DB Web Controls vereinfachen die Datenbankentwicklung mit BDP.NET- und .NET Framework-Datenzugriffskomponenten. DB Web Controls stellen leistungsstarke Steuerelemente wie datensensitive Gitter, Navigatoren, Kalender, Kombinationsfelder usw. bereit, die Sie in Ihre Anwendungen integrieren können. Dieser Abschnitt bietet eine Einführung in folgende Themen: • Architektur von DB Web Controls • Vorteile der datensensitiven Komponenten • Unterstützte Datenzugriffskomponenten • DB Web Controls Namespace • Deployment von ASP.NET-Anwendungen mit DB Web Controls DB Web Controls in Haupt-/Detail-Anwendungen verwenden ( see page 90) Anmerkung: DB Web Controls (Namespace Borland.Data.Web) sind seit 2007 veraltet. Sie sollten statt dessen die Standard-Websteuerelemente verwenden. DB Web Controls unterstützen die Erstellung echter Haupt-/Detail-Anwendungen mit den Controls DBWebDataSource, DBWebGrid und DBWebNavigator Für Haupt-/Detail-Anwendungen müssen diese Controls einen Mechanismus bereitstellen, mit dem mehrstufige Operationen implementiert werden können. Dieses Thema enthält Informationen zu folgenden Bereichen: • Mehrstufige Löschvorgänge definieren • Mehrstufige Aktualisierungen definieren 82 1.6 Webanwendungen mit ASP.NET RAD Studio für .NET Überblick zur Navigations-API der DB Web Controls ( Überblick zum DB Web Control-Experten ( see page 92) see page 93) Anmerkung: DB Web Controls (Namespace Borland.Data.Web) sind seit 2007 veraltet. Sie sollten statt dessen die Standard-Websteuerelemente verwenden. In der Regel kann das Standardsteuerelement DBWebNavigator verwendet werden, um Navigationsfunktionen für eine Anwendung bereitzustellen. Es gibt aber Situationen, in denen eine weitergehende Kontrolle über die Navigationsmöglichkeiten erforderlich ist. Die DB Web Controls stellen nun eine API für die Feinabstimmung der Navigation bereit. Sie können mit Hilfe dieser API zum Beispiel eine Schaltfläche für die direkte Navigation erstellen, anstatt das DBWebNavigator-Steuerelement zu verwenden. Es ist zwar möglich, Schaltflächen von DBWebNavigator zu verbergen, die Position der Steuerelemente auf dem Formular kann aber nicht geändert... more ( see page 92) Anmerkung: DB Web Controls (Namespace Borland.Data.Web) sind seit 2007 veraltet. Sie sollten statt dessen die Standard-Websteuerelemente verwenden. CodeGear DB Web Controls sind datensensitive Web-Komponenten. Mit Hilfe von DB Web Controls können Sie datensensitive Funktionen in Standard-Web Controls kapseln. Dies hat den Vorteil, dass die Datenbindung durch das Control selbst erfolgt und kein Aufruf der Methode DataBind erforderlich ist. Die Erstellung von DB Web Controls basiert auf folgenden Grundkonzepten: • ASP.NET Control-Lebenszyklus (Control Execution Lifecycle, CEL) • Datenbindung • Überschreiben von ASP.NET-Methoden • Implementieren von Borland DB Web-Interfaces • Wichtige Änderungen am Quelltext XML-Dateien und DB Web Controls verwenden ( see page 99) Anmerkung: DB Web Controls (Namespace Borland.Data.Web) sind seit 2007 veraltet. Sie sollten statt dessen die Standard-Websteuerelemente verwenden. Die DBWebDataSource-Komponente bietet die Möglichkeit, XML- und XSD-Dateien zu erstellen und als Datenquelle für eine ASP.NET-Anwendung zu verwenden. Normalerweise verwenden Sie diese Dateitypen im Zusammenhang mit DB Web Controls lediglich, um einen Prototyp der Anwendung zu erhalten. Sie können aber während der Design- und Entwicklungsphase des Projekts XML-Dateien als Datenquelle nutzen, um den (eventuell kostspieligen) Zugriff auf Datenbankressourcen zu umgehen. In diesem Thema werden folgende Bereiche behandelt: • XML-Dateien als Datenquellen • Empfohlene Workflow-Strategie • Authentifizierung und Zwischenspeicherung Mit DataView-Objekten arbeiten ( see page 101) Anmerkung: DB Web Controls (Namespace Borland.Data.Web) sind seit 2007 veraltet. Sie sollten statt dessen die Standard-Websteuerelemente verwenden. DataView-Objekte (Datenansichten) ermöglichen es Ihnen, ein DataTable-Objekt unter Verwendung der Eigenschaft RowFilter zu filtern oder die Anordnung der Daten zu ändern. Die DataView-Komponenten befindet sich unter dem Bereich Datenkomponenten der Tool-Palette. In diesem Thema wird Folgendes behandelt: • Laufzeiteigenschaften • Haupt/Detail-Beziehungen • Die Methode ClearSessionChanges • Einschränkungen für DataView-Objekte 83 1 Überblick zu ASP.NET RAD Studio für .NET Deployment von ASP.NET-Anwendungen ( see page 102) 1.6 Webanwendungen mit ASP.NET Dieses Thema enthält Informationen über: • Anforderungen an den Webserver • Vorbereiten der Weitergabe • Der ASP.NET-Deploymentmanager von RAD Studio Weitere Informationen über das Deployment enthält die Datei deploy.htm im Verzeichnis C:\Programme\CodeGear\RAD Studio\5.0. WebDataLink-Interfaces verwenden ( see page 103) 1 Anmerkung: DB Web Controls (Namespace Borland.Data.Web) sind seit 2007 veraltet. Sie sollten statt dessen die Standard-Websteuerelemente verwenden. DB Web Controls unterscheiden sich von herkömmlichen Web Controls vor allem dadurch, dass sie die Datenbindung automatisch durchführen. Während des Entwurfs müssen Sie zwar weiterhin die Verbindungen zwischen Datenquellen und Controls konfigurieren, zur Laufzeit erfolgt die Datenbindung jedoch automatisch, d.h. es muss kein entsprechender Befehl in den Quelltext aufgenommen werden. Wenn Sie ein DB Web Control mit Hilfe des DB Web Control-Experten erweitern, implementieren Sie verschiedene Interfaces, die die Funktionalität für die Datenbindung bereitstellen. Diese Interfaces werden im vorliegenden Thema beschrieben. • IDBWebDataLink • IDBWebColumnLink:... more ( see page 103) 1.6.1 Überblick zu ASP.NET ASP.NET ist die .NET-Programmierumgebung für die Erstellung von Anwendungen in HTML, die sich im Web ausführen lassen. Dieses Thema enthält grundlegende Informationen zu den wichtigsten Komponenten der ASP.NET-Architektur und erläutert, wie ASP.NET mit anderen Programmiermodellen des .NET Framework kooperiert. Folgende Bereiche werden behandelt: • Architektur von ASP.NET • Web Forms • Datenzugriff • Web-Services • Entwurfszeitfunktionen • Unterstützte Webserver • Beispielanwendungen Architektur von ASP.NET Die wesentlichen Bestandteile der Architektur von ASP.NET sind Web Forms, die Server Controls von ASP.NET, die Dateien mit der Codebehind-Logik und die compilierten DLL-Dateien. Web Forms-Seiten enthalten HTML-Elemente, Text und Server Controls. Codebehind-Dateien enthalten die Anwendungslogik für die Forms-Seite. Compilierte DLL-Dateien übergeben 84 1.6 Webanwendungen mit ASP.NET RAD Studio für .NET Überblick zu ASP.NET dynamisches HTML an den Webserver. CodeGear bietet verschiedene Tools, um die Entwicklung unter ASP.NET zu vereinfachen. Wenn Sie mit dem Konzept des Rapid Application Development (RAD) bereits vertraut sind und die objektorientierte Programmierung (OOP) mit Eigenschaften, Methoden und Ereignissen kennen, werden Sie sich auch schnell in das ASP.NET-Modell einarbeiten, auf dessen Basis sich Webanwendungen erstellen lassen. Web Forms, Server Controls und HTML-Elemente Mit Web Forms definieren Sie die Benutzeroberfläche für Ihre Webanwendung. Ein Web Form besteht aus einer Auszeichnungsdatei (.aspx) für die visuelle Darstellung und einer Codebehind-Datei (.pas oder .cs) mit der Programmlogik. Die Codebehind-Datei wird in eine .dll-Datei compiliert und mit der .aspx-Datei an den Server weitergegeben. Zur Laufzeit wird die .aspx-Datei compiliert und mit der Codebehind-Datei (.dll) gelinkt. Dadurch ist es möglich, die .aspx-Datei zu ändern, ohne die Codebehind-Datei erneut zu compilieren. Die Web Forms .aspx-Datei enthält ASP.NET-Server Controls und statische HTML-Elemente. Server Controls werden im Quelltext deklariert. Der programmseitige Zugriff auf Server Controls erfolgt über Eigenschaften, Methoden und Ereignisbehandlungsroutinen. Server Controls werden auf dem Webserver ausgeführt und sorgen für das Rendern der HTML-Elemente, die an den Client gesendet werden. HTML-Elemente sind statische, client-seitige Controls. Standardmäßig ist kein programmseitiger Zugriff auf HTML-Elemente möglich. Sie eignen sich jedoch sehr gut für statischen Text und statische Bilder in einem Web Form. Datenzugriff Web Forms können auf Daten über ADO.NET zugreifen. Eine ASP.NET-Anwendung kann mit einer ADO.NET-Datenquelle über die im .NET-Framework enthaltenen Datenkomponenten, die AdoDbx Client-, die Blackfish SQL-,oder die Borland Data Provider- (BDP.NET) Komponenten verbunden werden. Web-Services Web-Services stellen Anwendungskomponenten für zahlreiche verteilte Systeme zur Verfügung, deren Messaging auf XML basiert. Web-Services können sehr einfach sein, z.B. eine XML-Botschaft zur Aktualisierung von Werten in einer externen Anwendung, aber auch sehr komplex und als integraler Bestandteil einer anspruchsvollen ASP.NET- oder ADO.NET-Anwendung fungieren. Web-Services und ASP.NET verwenden dieselbe allgemeine .NET-Infrastruktur, wodurch eine problemlose Integration möglich ist. Unterstützte Webserver RAD Studio unterstützt zwei Server für die Entwicklung von ASP.NET-Anwendungen: Internet Information Services 6.0 (IIS) und Cassini. Sie können IIS und Cassini auf demselben Computer betreiben, sofern sie für unterschiedliche Ports konfiguriert sind. • Der leistungsstarke, skalierbare Webserver IIS ist Bestandteil von Windows Server 2003. Sie können Ihre Anwendung an Computer weitergeben, auf denen IIS ausgeführt wird. • Cassini ist ein Webserver, der während des Entwicklungsprozesses verwendet wird, der aber nicht für das Deployment von Anwendungen gedacht ist. Es ist einfacher zu verwenden als IIS, weil es keine Konfiguration gibt. Cassini wurde von Microsoft entwickelt und steht samt Quelltext zum kostenlosen Herunterladen zur Verfügung. RAD Studio wird mit einer leicht angepassten Version von Cassini ausgeliefert. Cassini ist in den ASP.NET-Support von CodeGear integriert. Wenn Sie mit der Erstellung einer ASP.NET-Anwendung beginnen, werden Sie von RAD Studio zur Angabe des Webservers und des Speicherorts für die Anwendung aufgefordert. Sie können den Standardserver und das Standardverzeichnis für neue Anwendungen verwenden oder zum Cassini-Server (und dem entsprechenden Port) wechseln. Wählen Sie hierzu Tools Optionen ASP.NET. Entwurfszeitfunktionen RAD Studio verfügt über zahlreiche Entwurfszeitfunktionen, die Sie bei der Entwicklung von Web Forms und HTML- bzw. CSS-Dateien unterstützen. 85 1 Überblick zu ASP.NET RAD Studio für .NET 1.6 Webanwendungen mit ASP.NET HTML- und CSS-Dateien bearbeiten Sie können bei der Bearbeitung von HTML- und CSS-Dateien viele Leistungsmerkmale des Quelltext-Editors nutzen. Die Code-Vervollständigung (STRG+LEERTASTE) und die Syntaxhervorhebung sind sowohl für HTML- als auch für CSS-Dateien verfügbar. Während der Bearbeitung einer HTML-Datei können Sie die Fehlermarkierung aktivieren. Ungültiger HTML-Code wird dann mit einer roten Wellenlinie unterstrichen. Wenn Sie den Mauszeiger auf den betreffenden Code bewegen, wird die wahrscheinliche Fehlerursache in einem Hinweisfenster angezeigt. Wenn Sie eine HTML-Seite anzeigen, rückt die interne HTML-Formatierfunktion den HTML-Code ein, damit er einfacher zu lesen ist. Sie können stattdessen auch das Standardformatierungs-Tool HTML Tidy von www.w3c.org verwenden. Wählen Sie Bearbeiten HTML Tidy, um die Datei mit HTML Tidy zu formatieren und auf Fehler zu überprüfen. Es ist auch möglich, anstelle der internen Formatierung HTML Tidy als Standardformatierungsfunktion zu nutzen. Sie können Tags definieren, die HTML Tidy normalerweise als ungültig kennzeichnet, z.B. Tags mit dem Präfix asp:. Um auf die Optionen von HTML Tidy zuzugreifen, wählen Sie Tools Optionen HTML Tidy-Optionen. 1 Die Strukturansicht zeigt die HTML-Tags der aktiven HTML-Seite in einem hierarchisch gegliederten Baumdiagramm. Sie erleichtert die Navigation in großen Dateien. Wenn Sie auf einen Knoten im Baumdiagramm doppelklicken, wird der Cursor auf das entsprechende Tag in der HTML-Datei gesetzt. Fluss-Layout und Gitter-Layout Während des Web Form-Entwurfs können Sie im Designer entweder das Gitter-Layout oder das Fluss-Layout verwenden. Im Gitter-Layout sind die Controls entsprechend ihrer absoluten Position angeordnet und können durch Ziehen mit der Maus anders platziert werden. Zur einfacheren Positionierung der Controls kann ein Gitter angezeigt werden. Wenn Sie ein Control aus der Tool-Palette in das Web Form ziehen bzw. zuerst in der Tool-Palette auf das Control und dann in das Web Form klicken, wird das Control an seiner absoluten Position in das Formular eingefügt. Im Fluss-Layout-Modus sind die Controls im Web Form von oben nach unten angeordnet. Ihre Position kann mit den Pfeiltasten geändert werden. Wenn Sie in der Tool-Palette auf ein Control doppelklicken, wird es entsprechend des Fluss-Layouts in das Web Form eingefügt. Um das Layout eines bestimmten Control zu ändern, verwenden Sie die Schaltfläche Absolutes Layout HTML-Design am oberen Rand des Designers. in der Symbolleiste Um das Layout für neue Dateien, die mit RAD Studio erstellt werden, dauerhaft zu ändern, bearbeiten Sie die Template-Datei page.aspx. Sie befindet sich standardmäßig in CodeGear\RAD Studio\5.0\ObjRepos\DelphiDotNet. Beispielanwendungen RAD Studio enthält verschiedene ASP.NET-Beispielanwendungen im Verzeichnis Demos. Viele dieser Anwendungen beinhalten eine readme-Datei mit einer Beschreibung der Anwendung und einer Liste der Anforderungen. Treffen Sie folgende Vorkehrungen, bevor Sie eine Beispielanwendung in der IDE öffnen: • Prüfen Sie, ob das Verzeichnis der Anwendung eine readme-Datei enthält, und folgen Sie den Installationsanweisungen. • Erstellen Sie ein virtuelles Verzeichnis für die Beispielanwendung, um zur Laufzeit Fehlermeldungen des Browser bezüglich fehlender Ressourcen zu vermeiden (siehe den Link zur entsprechenden Anleitung am Ende dieses Themas). Siehe auch Überblick zu ADO.NET ( see page 15) Überblick zu Web-Services ( see page 106) ASP.NET-Anwendungen erstellen ( DB Web Controls für ASP.NET ( see page 186) see page 88) Deployment von ASP.NET-Anwendungen ( 86 see page 102) 1.6 Webanwendungen mit ASP.NET RAD Studio für .NET Virtuelles Verzeichnis für Demo-Anwendungen erstellen ( Überblick zu CodeGear DB Web Controls see page 204) Der Namespace System.Web .NET Framework Developer's Guide ASP.NET Web Applications (MSDN) 1.6.2 Überblick zu CodeGear DB Web Controls Anmerkung: DB Web Controls (Namespace Borland.Data.Web) sind seit 2007 veraltet. Sie sollten statt dessen die Standard-Websteuerelemente verwenden. CodeGear DB Web Controls vereinfachen die Datenbankentwicklung mit BDP.NETund .NET Framework-Datenzugriffskomponenten. DB Web Controls stellen leistungsstarke Steuerelemente wie datensensitive Gitter, Navigatoren, Kalender, Kombinationsfelder usw. bereit, die Sie in Ihre Anwendungen integrieren können. Dieser Abschnitt bietet eine Einführung in folgende Themen: • Architektur von DB Web Controls • Vorteile der datensensitiven Komponenten • Unterstützte Datenzugriffskomponenten • DB Web Controls Namespace • Deployment von ASP.NET-Anwendungen mit DB Web Controls Architektur von DB Web Controls DB Web Controls sind visuelle und nicht-visuelle Komponenten, die Drag&Drop-Funktionen und einen leistungsstarken Mechanismus für das Abrufen von Daten bereitstellen. Die Entwicklung von ASP.NET-Anwendungen wird dadurch wesentlich beschleunigt. Die meisten DB Web Controls sind GUI-Web-Steuerelemente, die in ASP.NET-Anwendungen häufig benötigt werden. Ein Beispiel hierfür ist die Komponente DBWebDataSource, die als datensensitives Verbindungsglied zwischen den visuellen Steuerelementen und der zugrunde liegenden Datenquelle fungiert. DBWebDataSource übermittelt die von der Quelle abgerufenen Daten an die Anzeigesteuerelemente des ASP.NET-Formulars. Die DBWebDataSource-Komponente kann sowohl .NET Framework ADO.NET-Komponenten als auch BDP.NET-Komponenten referenzieren, etwa die im Speicher befindliche Datenmenge, die entweder von einem ADO.NET-Adapter (wie SQLDataAdapter) oder von einem BDP.NET-Adapter (wie BDPDataAdapter) generiert wird. Über die DBWebDataSource-Komponente kann auch eine Verbindung zu anderen Datenquellen wie Textdateien, Arrays und Kollektionen hergestellt werden. Vorteile von datensensitiven Komponenten Während der Entwicklung einer ASP.NET-Anwendung mit Steuerelementen, die Daten aus einer zugrunde liegenden Datenquelle (z.B. einer Datenbank) anzeigen, müssen Sie die Bindung zwischen der Datenquelle und den Steuerelementen manuell konfigurieren. Für jedes Steuerelement, das mit der Datenquelle verbunden wird, müssen Syntax und Parameter bereitgestellt werden. Die Verwendung von DB Web Controls hat den Vorteil, dass nur eine DBWebDataSource-Komponente mit der Datenquelle verknüpft werden muss. Danach werden alle DB Web Controls auf der ASP.NET-Seite, die die DBWebDataSource-Komponente referenzieren, automatisch an die Quelle gebunden. Es ist kein weiterer Code für die Datenbindung erforderlich. DB Web Controls bieten gegenüber anderen Standard-Web Controls verschiedene Vorteile: • Der Aufruf der Methode WebControl.DataBind kann entfallen. Normalerweise muss ein derartiger Aufruf für jedes ASP.NET Control auf dem Web Form vorhanden sein (in der Page_Load-Routine), da das Steuerelement sonst zur Laufzeit nicht angezeigt wird. • Sie ermöglichen eine Anzeige der Daten zur Entwurfszeit. • Änderungen werden automatisch in die Datenmenge (DataSet) eingetragen. ASP.NET Controls erfordern hierfür speziellen 87 1 Überblick zu CodeGear DB Web Controls RAD Studio für .NET 1.6 Webanwendungen mit ASP.NET Code. • Sie behalten ihre aktuelle Zeilenposition bei. • Der Änderungs- und Zeilenstatus wird automatisch verwaltet. Clients an unterschiedlichen Standorten können daher ohne Berücksichtigung des Serverstatus unabhängig voneinander bedient werden. Neben diesen Vorteilen allgemeiner Art bieten DB Web Controls noch weitere, spezielle Vorzüge: • Die Klasse DBWebDataSource verwaltet eine sortierte Liste der Änderungen. Dadurch kann der Benutzer Änderungen in der Reihenfolge zurücknehmen, in der sie erfolgt sind. • Die DBWebNavigator-Komponente bietet Navigationsfunktionen für Gitter und Mehrfachsteuerelemente und kann auf Standard-Web Controls erweitert werden. • Die DBWebDataGrid-Komponente bietet integrierte Funktionen zur Bildlaufsteuerung (per Seitennummer oder Symbol), für das Hinzufügen von Bearbeitet- und Gelöscht-Spalten uvm. Sie müssen diese Funktionen für Ihre Gitter-Steuerelemente nun nicht mehr selbst programmieren. 1 Unterstützte Datenzugriffskomponenten DB Web Controls sind kompatibel mit Datenzugriffskomponenten von .NET Framework ADO.NET und CodeGear BDP.NET. Jede Datenquelle, auf die über einen dieser Provider zugegriffen werden kann, lässt sich als Datenlieferant für DB Web Controls verwenden. Außerdem können zahlreiche DB Web Controls (wie viele andere .NET Web Controls) Objekte wie Arrays, Kollektionen und Dateien als Datenquellen nutzen. DB Web Controls Namespace Der Namespace von DB Web Controls ist Borland.Data.Web. Mittels Reflexion lässt sich viel über die Struktur des Namespace und der Controls lernen. Sie können den Namespace zu Ihrem Projekt hinzufügen und ihn anschließend im Quelltext-Editor öffnen. Dadurch gelangen Sie in den Reflexions-Editor mit einer hierarchischen Ansicht aller Controls und ihrer Elemente. 88 Steuerelement Beschreibung DBWebDataSource Fungiert als Bindeglied zwischen der Datenquelle und den DB Web Controls. DBWebAggregateControl Ein Textfeld-Steuerelement, in dem Aggregatwerte für eine Spalte angezeigt werden. DBWebCalendar Ein Kalender-Steuerelement. DBWebCheckBox Ein Kontrollkästchen. DBWebDropDownList Ein Kombinationsfeld. DBWebGrid Ein Datengitter. DBWebImage Ein Bild-Steuerelement. DBWebLabel Eine Beschriftung. DBWebLabeledTextBox Ein Textfeld mit Beschriftung. DBWebListBox Ein Listenfeld. DBWebMemo Ein Memofeld. DBWebNavigationExtender Eine nicht-visuelle Komponente, mit der Standard-Web Control-Schaltflächen als Navigationssteuerelemente definiert werden können. DBWebNavigator Eine Navigationsleiste. DBWebRadioButtonList Eine Optionsfeldgruppe. DBWebSound Ein Audio-Steuerelement, das das Standard-Mediengerät des Systems nutzt. DBWebTextBox Ein Textfeld. DBWebVideo Ein Video-Steuerelement, das das Standard-Mediengerät des Systems nutzt. 1.6 Webanwendungen mit ASP.NET RAD Studio für .NET DB Web Controls in Deployment von ASP.NET-Anwendungen mit DB Web Controls Wenn die Erstellung eines ASP.NET-Projekts mit DB Web Controls abgeschlossen ist, können Sie das Deployment wie gewohnt durchführen. Es gibt keine besonderen Einschränkungen, die beachtet werden müssen. Siehe auch Daten-Provider für .NET ( see page 28) Anwendung mit DB Web Controls erstellen ( ASP.NET-Anwendungen erstellen ( see page 199) see page 186) XML-Dateien und DB Web Controls verwenden ( Mit DataView-Objekten arbeiten ( WebDataLink-Interfaces ( see page 99) see page 101) 1 see page 103) Deployment von ASP.NET-Anwendungen ( see page 102) 1.6.3 DB Web Controls in Haupt-/Detail-Anwendungen verwenden Anmerkung: DB Web Controls (Namespace Borland.Data.Web) sind seit 2007 veraltet. Sie sollten statt dessen die Standard-Websteuerelemente verwenden. DB Web Controls unterstützen die Erstellung echter Haupt-/Detail-Anwendungen mit den Controls DBWebDataSource, DBWebGrid und DBWebNavigator Für Haupt-/Detail-Anwendungen müssen diese Controls einen Mechanismus bereitstellen, mit dem mehrstufige Operationen implementiert werden können. Dieses Thema enthält Informationen zu folgenden Bereichen: • Mehrstufige Löschvorgänge definieren • Mehrstufige Aktualisierungen definieren Mehrstufige Löschvorgänge In einer Haupt-/Detail-Anwendung wird normalerweise das Ereignis OnApplyChanges verwendet, um Änderungen an der Datenmenge an den Server zu übergeben. Die Aktualisierungsmethode des Haupt-Datenadapters (in BDP.NET die AutoUpdate-Ereignisbehandlungsroutine) muss vor derjenigen des Detail-Datenadapters aufgerufen werden. Andernfalls würde das Einfügen von Detailzeilen fehlschlagen, solange die Hauptzeile noch nicht eingefügt ist. Wird die Hauptzeile vor der Detailzeile gelöscht, gibt der Server möglicherweise einen Fehler zurück. Das Control DBWebDataSource besitzt eine neue Eigenschaft namens CascadingDeletes. Mit ihr kann festgelegt werden, wie der Server Zeilen in Haupt-/Detail-Anwendungen löscht. Die Eigenschaft CascadingDeletes kann auf die folgenden Werte gesetzt werden: • NoMasterDelete (Voreinstellung) • ServerCascadeDelete • ServerNoForeignKey Anmerkung: Wenn DB Web Controls mit einem DataTable-Objekt verbunden werden, das in einer Beziehung als Detailtabelle fungiert, entspricht die maximale Anzahl der Control-Zeilen der Zahl der Zeilen, die von der aktuellen übergeordneten Zeile der Haupttabelle gesteuert werden. 89 DB Web Controls in RAD Studio für .NET 1.6 Webanwendungen mit ASP.NET NoMasterDelete Diese Einstellung verhindert das Löschen einer Hauptzeile, die Detailzeilen enthält. Verwenden Sie diese Einstellung, wenn der Server eine Fremdschlüsselbeschränkung zwischen Haupt- und Detailtabellen erzwingt, aber keine mehrstufigen Löschvorgänge verwaltet. Folgende Aktionen sind erforderlich: 1. Löschen der Detailzeilen. 2. Eintragen der Änderungen mittels eines entsprechenden Ereignisses (z.B. BdpDataAdapter. AutoUpdate). 3. Löschen der Hauptzeile. 4. Aufrufen der Behandlungsroutine für das Ereignis (z.B. BdpDataAdapter. AutoUpdate). Dies ist der Vorgabewert für die Eigenschaft CascadingDeletes. 1 ServerCascadeDelete Bei dieser Einstellung kann die Hauptzeile gelöscht werden. Verwenden Sie diesen Wert, wenn der Server mehrstufige Löschvorgänge automatisch verwaltet. Wenn eine Hauptzeile gelöscht wird, werden die Detailzeilen automatisch aus der Ansicht entfernt. Vor dem Eintragen der Änderung kann die Löschung der übergeordneten Zeile rückgängig gemacht werden. Die Detailzeilen werden dann wieder angezeigt. Unterstützt der Server keine automatische Verwaltung mehrstufiger Löschvorgänge, kann beim Übertragen der Änderungen an den Server ein Fehler auftreten. ServerNoForeignKey Bei dieser Einstellung werden beim Löschen einer Hauptzeile alle Detailzeilen automatisch gelöscht. Weisen Sie diesen Wert zu, wenn keine Fremdschlüsselbeschränkungen zwischen den Haupt-/Detailtabellen auf dem Server existieren. Wie bei der Einstellung ServerCascadeDelete werden die Detailzeilen nicht mehr angezeigt, wenn eine Hauptzeile gelöscht wird. Vor dem Eintragen der Änderung kann die Löschung der Hauptzeile rückgängig gemacht werden. Die Detailzeilen werden dann wieder angezeigt. Wenn Sie diese Einstellung verwenden und Fremdschlüsselbeschränkungen zwischen Haupt- und Detailtabellen vorhanden sind, gibt der Server beim Versuch, die Haupttabelle zu löschen, einen Fehler aus. Mehrstufige Aktualisierungen In einer Haupt-/Detail-Anwendung wird normalerweise das Ereignis OnApplyChanges verwendet, um Änderungen an der Datenmenge an den Server zu übergeben. Die Aktualisierungsmethode des Haupt-Datenadapters (in BDP.NET die AutoUpdate-Ereignisbehandlungsroutine) muss vor derjenigen des Detail-Datenadapters aufgerufen werden. Andernfalls würde das Einfügen von Detailzeilen fehlschlagen, solange die Hauptzeile noch nicht eingefügt ist. Wird die Hauptzeile vor der Detailzeile gelöscht, gibt der Server möglicherweise einen Fehler zurück. Das Control DBWebDataSource besitzt eine neue Eigenschaft namens CascadingUpdates. Mit ihr kann festgelegt werden, wie der Server Fremdschlüsselwerte in Haupt-/Detail-Anwendungen aktualisiert. Die Eigenschaft CascadingUpdates kann auf die folgenden Werte gesetzt werden: • NoMasterUpdate (Voreinstellung) • ServerCascadeUpdate • ServerNoForeignKey Anmerkung: Wenn DB Web Controls mit einem DataTable-Objekt verbunden werden, das in einer Beziehung als Detailtabelle fungiert, entspricht die maximale Anzahl der Control-Zeilen der Zahl der Zeilen, die von der aktuellen übergeordneten Zeile der Haupttabelle gesteuert werden. NoMasterUpdate Bei dieser Einstellung sind keine Änderungen am Fremdschlüsselwert einer Hauptzeile möglich, wenn diese Detailzeilen besitzt. Dies ist der Vorgabewert für die Eigenschaft CascadingUpdates. 90 1.6 Webanwendungen mit ASP.NET RAD Studio für .NET Überblick zur Navigations-API der DB Web ServerCascadeUpdate Bei dieser Einstellung kann der Fremdschlüsselwert der Hauptzeile geändert werden. Verwenden Sie diese Einstellung, wenn der Server mehrstufige Aktualisierungen automatisch verwaltet. Bei einer Änderung des Fremdschlüsselwerts der Hauptzeile werden die Schlüsselwerte der Detailzeilen automatisch angepasst. Vor dem Eintragen der Änderung kann die Änderung an der Hauptzeile rückgängig gemacht werden. Alle Änderungen an den Schlüsselwerten der Detailzeilen werden dann ebenfalls rückgängig gemacht. Unterstützt der Server keine automatische Verwaltung mehrstufiger Aktualisierungen, kann beim Übertragen der Änderungen an den Server ein Fehler auftreten. ServerNoForeignKey Bei dieser Einstellung kann der Fremdschlüsselwert der Hauptzeile ebenfalls geändert werden. Sie ist für Fälle vorgesehen, in denen zwischen Haupt- und Detailtabellen auf den Server kein Fremdschlüssel existiert. Siehe auch Mit DataView-Objekten arbeiten ( see page 101) Anwendungen mit DBWeb Controls erstellen ( see page 199) 1.6.4 Überblick zur Navigations-API der DB Web Controls Anmerkung: DB Web Controls (Namespace Borland.Data.Web) sind seit 2007 veraltet. Sie sollten statt dessen die Standard-Websteuerelemente verwenden. In der Regel kann das Standardsteuerelement DBWebNavigator verwendet werden, um Navigationsfunktionen für eine Anwendung bereitzustellen. Es gibt aber Situationen, in denen eine weitergehende Kontrolle über die Navigationsmöglichkeiten erforderlich ist. Die DB Web Controls stellen nun eine API für die Feinabstimmung der Navigation bereit. Sie können mit Hilfe dieser API zum Beispiel eine Schaltfläche für die direkte Navigation erstellen, anstatt das DBWebNavigator-Steuerelement zu verwenden. Es ist zwar möglich, Schaltflächen von DBWebNavigator zu verbergen, die Position der Steuerelemente auf dem Formular kann aber nicht geändert werden. Wenn Sie zum Beispiel bei DBWebNavigator alle Schaltflächen außer Zurück und Weiter verbergen, werden diese weiterhin nebeneinander angezeigt. Um ihre Position im Formular zu ändern, können Sie die Methoden der Navigations-API oder das DBWebNavigationExtender-Steuerelement verwenden. Mit beiden Verfahren können Sie die Web Controls-Standardschaltflächen in Steuerelemente für die Navigation konvertieren. Zur Bereitstellung dieser Möglichkeiten implementiert DBWebDataSource neue IDBDataSource-Methoden, die jeweils eine bestimmte Navigationsaufgabe übernehmen. Der Aufruf dieser Methoden werden erfolgt in einer Behandlungsroutine für das Ereignis Form_Load. Es ist nicht erforderlich, Klickereignisse zu implementieren. Die folgenden Methoden stehen zur Verfügung: • RegisterNextControl • RegisterPreviousControl • RegisterFirstControl • RegisterLastControl • RegisterInsertControl • RegisterDeleteControl • RegisterUpdateControl • RegisterCancelControl • RegisterUndoControl 91 1 Überblick zum DB Web Control-Experten RAD Studio für .NET 1.6 Webanwendungen mit ASP.NET • RegisterUndoAllControl • RegisterApplyControl • RegisterRefreshControl • RegisterGoToControl Siehe auch CodeGear DBWeb Controls ( see page 88) Anwendung mit DBWeb Controls erstellen ( 1 see page 199) 1.6.5 Überblick zum DB Web Control-Experten Anmerkung: DB Web Controls (Namespace Borland.Data.Web) sind seit 2007 veraltet. Sie sollten statt dessen die Standard-Websteuerelemente verwenden. CodeGear DB Web Controls sind datensensitive Web-Komponenten. Mit Hilfe von DB Web Controls können Sie datensensitive Funktionen in Standard-Web Controls kapseln. Dies hat den Vorteil, dass die Datenbindung durch das Control selbst erfolgt und kein Aufruf der Methode DataBind erforderlich ist. Die Erstellung von DB Web Controls basiert auf folgenden Grundkonzepten: • ASP.NET Control-Lebenszyklus (Control Execution Lifecycle, CEL) • Datenbindung • Überschreiben von ASP.NET-Methoden • Implementieren von Borland DB Web-Interfaces • Wichtige Änderungen am Quelltext Der ASP.NET Control-Lebenszyklus (CEL) Jedesmal, wenn eine ASP.NET Web Forms-Seite angezeigt wird, läuft ein Prozess ab, der von Microsoft als "Control Execution Lifecycle", kurz CEL, bezeichnet wird. Er umfasst folgende Schritte, die jeweils von einer Methode repräsentiert werden: 1. Initialisieren 2. Anzeigestatus laden 3. Postback-Informationen verarbeiten 4. Laden 5. Änderungen der Postback-Informationen senden 6. Postback-Ereignisse behandeln 7. Seitenaufbau vorbereiten 8. Zustand speichern 9. Seite aufbauen 10. Seite freigeben 11. Entladen Sie können für jeden dieser Schritte Programmlogik hinzufügen, indem Sie die entsprechenden Methoden, etwa Page_Load oder OnInit, mit Quelltext ergänzen. Das Überschreiben der Methode Render (für den Seitenaufbau) ist fast immer erforderlich. 92 1.6 Webanwendungen mit ASP.NET RAD Studio für .NET Überblick zum DB Web Control-Experten Datenbindung In ASP.NET kann eine Bindung zu unterschiedlichen Datenquellen hergestellt werden (z.B. zu Datenbanken, Text- und XML-Dateien, Arrays und Kollektionen). In RAD Studio bieten Controls eine einfache, eigenschaftsbasierte Schnittstelle zu Datenquellen. Sie können ein Control im Objektinspektor an eine Datenquelle binden, die das Projekt anhand eines BDP.NET-Control, eines SQL-Client-Control oder eines anderen Daten- bzw. Datei-Control identifizieren kann. Die verschiedenen Arten von Daten-Controls stellen jeweils unterschiedliche Anforderungen an die Datenbindung. Kollektionen (Listenfelder, Datengitter oder Listenansichten) müssen beispielsweise an eine Datenquelle gebunden werden, die das ICollection-Interface implementiert. Bei anderen Controls, wie Schaltflächen und Eingabefeldern, ist dies nicht erforderlich. Wenn Sie mit Web Controls programmieren, müssen Sie den Code für die Datenbindung selbst hinzufügen. Für die Instanz eines Datengitters könnte die entsprechende Anweisung wie folgt aussehen: 1 dataGrid1.DataBind(); Bei DB Web Controls ist dies nicht mehr erforderlich, da diese die Datenbindung automatisch vornehmen. Die DBWebDataSource-Komponente fungiert als Verbindungsglied zwischen der Datenquelle und dem DB Web Control. Sie erzeugt und verwaltet die Datenbindung zwischen der Datenquelle und dem Control. Sie können den Code für die Instantiierung eines DB Web Control und die Durchführung der Datenbindung auch manuell hinzufügen. Erforderlich ist dies aber nicht. Sie können Komponenten in ein Web Form einfügen und die gewünschten Verbindungen aus den Eigenschaftslisten des Objektinspektors auswählen. Anmerkung: Wenn Sie ein neues DB Web Control erstellen oder ein vorhandenes erweitern, müssen Sie eventuell Code für die Bindung bestimmter Eigenschaften hinzufügen. Überschreiben von ASP.NET-Methoden Render (bzw. RenderContents) ist die Methode, die fast immer überschrieben werden muss. Diese Methode sorgt für die Anzeige der Controls auf der Webseite. Wenn Sie die Methode Render nach ihrer Definition an eine Instanz der Klasse HtmlTextWriter übergeben, wird ihr Inhalt im HTML-Format an die ASP.NET-Seite gesendet. Die Methode Write der Klasse HtmlTextWriter schreibt einen String von HTML-Zeichen auf eine Web Forms-Seite. Nachstehend sehen Sie die Deklaration des Control in der vom DB Web Control-Experten erzeugten Datei. Es handelt sich dabei um ein sehr kurzes Codefragment. /// TWebControl1 ist von der WebControl-Klasse von System.Web.UI.WebControls abgeleitet. TWebControl1 = class(System.Web.UI.WebControls.WebControl) Wenn Sie eigene Controls erstellen oder vorhandene erweitern, müssen Sie die Methode Render überschreiben, um das Control anzuzeigen. Render sorgt dafür, dass die Ausgabe an eine Instanz der Klasse HtmlTextWriter gesendet wird. HtmlTextWriter sendet eine Folge von HTML-Zeichen an die Web Forms-Seite. Die HTML-Zeichen stellen das Control in HTML dar. Ein Datengitter wird auf einer Web Forms-Seite beispielsweise als HTML-Tabelle dargestellt. Jedes Control besitzt seine eigene HTML-Darstellung. Wenn Sie ein Control erweitern, müssen Sie die HTML-Ausgabe modifizieren, damit das neue Control richtig dargestellt wird. /// /// /// /// In den folgenden Zeilen wird die Methode Render deklariert. Output ist eine Instanz der Klasse HtmlTextWriter. HtmlTextWriter ist die Klasse, die HTML-Zeichen an die ASP.NET Web Forms-Seite sendet. strict protected procedure Render(Output: HtmlTextWriter); override; implementation {$REGION 'Control.Render override'} /// Im Anschluss sehen Sie die überschriebene Render-Methode. /// Sie können zusätzliche Logik zu dieser Prozedur hinzufügen, 93 Überblick zum DB Web Control-Experten RAD Studio für .NET 1.6 Webanwendungen mit ASP.NET /// um das Verhalten des Control zu steuern. Die vorliegende Methode schreibt lediglich /// eine Folge von HTML-Zeichen, die /// TWebControl1 definieren. procedure TWebControl1.Render(Output: HtmlTextWriter); begin Output.Write(Text); end; Der vorangehende Code muss auch dann implementiert werden, wenn die Funktionalität eines Standard-Web Control erweitert werden soll. Um ein DB Web Controls mit zusätzlicher Funktionalität zu versehen, müssen Sie weitere Anpassungen an diesem Code vornehmen. Implementieren von Borland DB Web-Interfaces Wenn Sie den DB Web Control-Experten starten, erzeugt dieser automatisch eine Datei mit dem Codegerüst, dass Sie für die Erweiterung eines DB Web Control benötigen. Die Datei ist ähnlich strukturiert wie die Datei, die Sie bei der Erweiterung eines Standard-Web Control erzeugen. Der DB Web Control-Experte fügt jedoch Implementierungen für spezielle DB Web-Interfaces hinzu, die den automatischen Zugriff auf eine Datenquelle, Tabellen, Spalten und die entsprechenden Eigenschaften ermöglichen. Da DB Web Controls einen großen Teil der Postback-Verarbeitung und Datenbindung automatisch durchführen, müssen Sie verschiedene Interfaces implementieren, um die betreffende Funktionalität für Ihre Controls bereitzustellen. 1 Wichtige Änderungen am Quelltext Wenn Sie eine neue DB Web Control-Bibliothek erstellen, generiert der DB Web Control-Experte automatisch eine Template-Datei. Diese enthält die wichtigsten Elemente, die Sie im Projekt benötigten, um ein Control zu erstellen oder zu erweitern. Sie müssen zusätzlich die folgenden Elemente hinzufügen oder ändern: • Geben Sie bei Bedarf über das Attribut ToolboxBitmap ein eigenes Symbol für die Tool-Palette an. • Bearbeiten Sie die Control-Deklaration, und geben Sie das Control an, das Sie ableiten möchten. • Deklarieren Sie die Render-Methode. • Implementieren Sie das IDBWebDataLink-Interface. • Implementieren Sie bei Bedarf die Interfaces IDBWebColumnLink und IDBWebLookupColumnLink. • Ändern oder erweitern Sie die Methode Render. • Ändern Sie bei Bedarf die Registrierung verborgener Felder. • Weisen Sie gegebenenfalls bestimmten Eigenschaften eine Datenbindung zu. Ändern des Attributs ToolboxBitmap Wenn Sie über ein Bitmap-Symbol für die Anzeige in der Tool-Palette verfügen, geben Sie den Pfad zu diesem Symbol in der DB Web Control-Bibliotheksdatei im Attribut ToolboxBitmap an. Der entsprechende Code könnte wie folgt aussehen: [ToolboxBitmap(typeof(WebControl1)] ['WebControl1.bmp')] Stellen Sie sicher, dass die Bitmap-Datei für das Projekt zur Verfügung steht. Ändern der Control-Deklaration Sie können den Vorfahr expliziter angeben. Für eine erweiterte Version des DBWebGrid-Control könnte der Code folgendermaßen aussehen: MyDataGrid = class(Borland.Data.Web.DBWebGrid, IPostBackDataHandler, IDBWebDataLink) 94 1.6 Webanwendungen mit ASP.NET RAD Studio für .NET Überblick zum DB Web Control-Experten Deklarieren der Render-Methode Das Control kann entweder vom Namespace Control oder vom Namespace WebControls abgeleitet werden. WebControls selbst ist auch vom Namespace Control abgeleitet. In WebControls sind jedoch alle Standard-Web Controls definiert, sodass Sie Ihr Control von diesem Namespace ableiten müssen, wenn Sie die Funktionalität eines Web Control (z.B. eines Textfelds oder Datengitters) erweitern möchten. Durch die Ableitung von WebControls stehen Ihnen alle Eigenschaften zur Verfügung, die das Erscheinungsbild des Control bestimmen. Controls, die über eine Benutzeroberfläche verfügen, werden in der Regel von System.Web.UI.WebControls abgeleitet. In der DB Web Control-Bibliotheksdatei muss dann die Methode RenderContents überschrieben werden. Wenn Sie ein Control vom Namespace Control ableiten, müssen Sie die Definition für die Benutzeroberfläche in der überschriebenen Render-Methode bereitstellen. Controls, die über eine Benutzeroberfläche verfügen, werden normalerweise von System.Web.UI.Control abgeleitet. In der DB Web Control-Bibliotheksdatei wird dann die Methode Render überschrieben. Implementieren des IDBWebDataLink-Interface Über dieses Interface wird auf eine Datenquelle zugegriffen. Es muss für jedes DB Web Control implementiert werden, das Sie erweitern. Die Implementierung wird in der DB Web Control-Bibliotheksdatei bereitgestellt. Ändern oder erweitern der Render-Methode In der Methode Render bzw. RenderContents (je nach Namespace) können Sie die Eigenschaften der Basisklasse überschreiben. Der folgende Code wird automatisch zur DB Web Control-Bibliotheksdatei hinzugefügt: procedure TWebControl1.Render(Output: HtmlTextWriter); begin Output.Write(Text); end; Diese Methode übergibt die Definition Ihres Control an eine Instanz von HtmlTextWriter mit dem Namen Output. Die Eigenschaft Text enthält den anzuzeigenden HTML-Text. Der entsprechende Quelltext innerhalb der Methode könnte wie folgt aussehen: procedure TWebControl1.Render(Output: HtmlTextWriter); begin Output.WriteFullBeginTag("html"); Output.WriteLine(); Output.WriteFullBeginTag("body"); Output.WriteLine(); Output.WriteEndTag("body"); Output.WriteLine(); Output.WriteEndTag("html"); Output.WriteLine(); end; Das Ergebnis ist eine ASP.NET-Webseite mit folgendem HTML-Code: <html> <body> </body> </html> Die Arbeit lässt sich durch die Verwendung der Eigenschaft Text wesentlich vereinfachen. Nachdem Sie Ihr Control und seine Eigenschaften definiert haben, können Sie die gesamte Struktur zusammen mit verschiedenen HTML-Tags an die Eigenschaft Text übergeben. Danach können sämtliche Aktionen für das Control über die Text-Eigenschaft gesteuert werden. Sie definieren die Eigenschaften des Control und übergeben sie mittels einer Text-Eigenschaft, welche die Control-Definition enthält, an die HtmlTextWriter-Komponente. Sehen Sie sich den Quelltext einiger vorhandener DB Web Controls an. Nachstehend sehen Sie 95 1 Überblick zum DB Web Control-Experten RAD Studio für .NET 1.6 Webanwendungen mit ASP.NET z.B. die Definition der Eigenschaft Text für das DBWebNavigator-Control. protected string Text{ get { // Neue Instanz von StringWriter erstellen. StringWriter sw = new StringWriter(); // Neue Instanz von HtmlTextWriter erstellen. HtmlTextWriter tw = new HtmlTextWriter(sw); // DataBind-Prozedur aufrufen. DataBind(); // AddButtons-Prozedur aufrufen. AddButtons(); 1 // SetButtonsWidth-Prozedur aufrufen. SetButtonsWidth(); // Stil für Panel-Komponente hinzufügen. ClassUtils.AddStyleToWebControl(FPanel, this.Style); // HTML-Start-Tag für ein Panel-Control rendern. FPanel.RenderBeginTag(tw); // HtmlTextWriter.Write-Methode aufrufen und die Tabellen// und Tabellenzeilen-Tags an die Web Forms-Seite übergeben tw.Write("<table><tr>"); // Wenn ButtonType den Wert ButtonIcons hat, Schaltflächen iterativ erstellen und // an die Web Forms-Seite übergeben: if( ButtonType == NavigatorButtonType.ButtonIcons ) { for( int i = 0; i < IconNavButtons.Count; i++ ) { // Start-Tag für Tabellenzelle schreiben. tw.Write("<td>"); // Bildschaltfläche instantiieren. ImageButton b = (IconNavButtons[i] as ImageButton); // Schaltfläche auf der Webseite anzeigen. b.RenderControl(tw); // End-Tag für Tabellenzelle schreiben. tw.Write("</td>"); } } else // Wenn ButtonType nicht den Wert ButtonIcons hat, Schaltflächen iterativ erstellen und // Standard-Navigationsschaltflächen auf der Web Forms-Seite anzeigen: { for( int i = 0; i < NavButtons.Count; i++ ) { // Start-Tag für Tabellenzelle schreiben. tw.Write("<td>"); 96 1.6 Webanwendungen mit ASP.NET RAD Studio für .NET Überblick zum DB Web Control-Experten // Eine Schaltfläche instantiieren. Button b = (NavButtons[i] as Button); // Schaltfläche auf der Webseite anzeigen. b.RenderControl(tw); // End-Tag für Tabellenzelle schreiben. tw.Write("</td>"); } } // End-Tags für Zeile und Tabelle schreiben. tw.Write("</tr></table>"); // End-Tag für Panel-Komponente rendern. FPanel.RenderEndTag(tw); return sw.ToString(); } } 1 Ändern der Registrierung verborgener Felder Die DB Web Control-Bibliotheksdatei enthält einen Aufruf zum Registrieren eines verborgenen Feldes, das den Schlüssel für ein Lesen-Schreiben-Control enthält. Wenn Sie ein schreibgeschütztes Control erstellen, können Sie diesen Aufruf entfernen oder auskommentieren. Der Aufruf in der Bibliotheksdatei sieht folgendermaßen aus: Page.RegisterHiddenField(DBWebDataSource.IdentPrefix + DBWebConst.Splitter + IDataLink.TableName, self.ID); Zuweisen der Datenbindung für bestimmte Eigenschaften Wenn zusätzlich zur Eigenschaft Text weitere Eigenschaften mit einer Datenbindung versehen werden sollen, fügen Sie den entsprechenden Code an derselben Stelle wie bei der Text-Eigenschaft hinzu. Normalerweise enthält die Methode PreRender einen Aufruf von DataBind. Die DataBind-Prozedur selbst sieht in etwa so aus wie im folgenden Beispiel (es stammt aus dem Quelltext für das DBWebLabeledTextBox-Control). In diesem Codebeispiel werden verschiedene Eigenschaften gesetzt, nachdem überprüft wurde, ob FColumnLink (aus dem IDBWebDataColumnLink-Interface) mit einer Datenquelle verbunden ist. public override void DataBind() { try { FTextBox.ReadOnly = FReadOnly; FTextBox.ID = this.ID; base.DataBind(); ClassUtils.SetBehaviorProperties(FPanel, this); ClassUtils.SetOuterAppearanceProperties(FPanel, this); ClassUtils.SetSizeProperties(FPanel, this); if( !ClassUtils.IsEmpty(FLabel.Text) ) { ClassUtils.SetInnerAppearanceProperties(FLabel, this); SetProportionalSize(); SetLabelFont(); FTextBox.Text = null; } // Wenn eine Datenquelle vorhanden ist... if( IColumnLink.DBDataSource != null ) { // ...und Daten mit ihr verbunden sind... 97 XML-Dateien und DB Web Controls RAD Studio für .NET 1.6 Webanwendungen mit ASP.NET if( FColumnLink.IsDataBound ) { // Eigenschaften für Verhalten zuweisen. ClassUtils.SetBehaviorProperties(FTextBox, this); // Eigenschaften für Aussehen zuweisen. ClassUtils.SetAppearanceProperties(FTextBox, this); // Eigenschaften für Größe zuweisen. ClassUtils.SetSizeProperties(FTextBox, this); object o = IColumnLink.DBDataSource.GetColumnValue(Page, IColumnLink.TableName, IColumnLink.ColumnName); // Haben Seiten-, Tabellen- und Spaltenname einen Wert ungleich Null, // sind verbundene Daten vorhanden. // In diesem Fall String-Darstellungen der Namen // im Textfeld anzeigen. if( o != null ) 1 FTextBox.Text = Convert.ToString(o); else // Andernfalls Textfeld leeren und das Feld und // seine Eigenschaften an angegebene Spalte binden. FTextBox.Text = ""; FTextBox.DataBind(); } } Siehe auch Überblick zu CodeGear DB Web Controls ( WebDataLink-Interfaces verwenden ( see page 88) see page 103) Den DB Web Control-Experten verwenden ( see page 211) 1.6.6 XML-Dateien und DB Web Controls verwenden Anmerkung: DB Web Controls (Namespace Borland.Data.Web) sind seit 2007 veraltet. Sie sollten statt dessen die Standard-Websteuerelemente verwenden. Die DBWebDataSource-Komponente bietet die Möglichkeit, XML- und XSD-Dateien zu erstellen und als Datenquelle für eine ASP.NET-Anwendung zu verwenden. Normalerweise verwenden Sie diese Dateitypen im Zusammenhang mit DB Web Controls lediglich, um einen Prototyp der Anwendung zu erhalten. Sie können aber während der Design- und Entwicklungsphase des Projekts XML-Dateien als Datenquelle nutzen, um den (eventuell kostspieligen) Zugriff auf Datenbankressourcen zu umgehen. In diesem Thema werden folgende Bereiche behandelt: • XML-Dateien als Datenquellen • Empfohlene Workflow-Strategie • Authentifizierung und Zwischenspeicherung XML-Dateien als Datenquellen XML-Dateien werden von vielen Anwendungen als Datenquellen genutzt. Dies gilt insbesondere für ASP.NET-Anwendungen. Vor allem wenn die Sicherheit keine herausragende Rolle spielt und die Daten daher als Text über HTTP gesendet werden 98 1.6 Webanwendungen mit ASP.NET RAD Studio für .NET XML-Dateien und DB Web Controls können, stellen XML-Dateien ein einfache Lösung dar. Die Dateien enthalten lediglich Text und sind daher einfach zu lesen. Die Beschreibung der Daten erfolgt mittels XML-Tags, sodass sich Datenstrukturen problemlos erkennen und verarbeiten lassen. Trotz ihrer vielen Vorzüge gegenüber anderen, komplexeren Datenstrukturen haben XML-Dateien aber auch einige Nachteile. Da die Sicherheit nicht in ausreichendem Maß gewährleistet ist, sollten wichtige Daten (wie Kreditkarten- oder PIN-Nummern) nicht per XML-Dateien über das Internet übertragen werden. Ein weiterer Nachteil ist, dass XML-Datensätze im Gegensatz zu Datensätzen aus Datenbanken keine Steuerung des parallelen Zugriffs ermöglichen. Trotz dieser Nachteile eignen sich XML-Dateien aufgrund ihrer selbstbeschreibenden Struktur und ihres kompakten Datenformats ideal als Datenquellen für ASP.NET-Anwendungen. Das DBWebDataSource-Control wurde so konzipiert, dass neben anderen Ressourcen auch XML-Dateien als Datenquelle verwendet werden können. Dabei sind keine besonderen Anforderungen zu beachten, sondern es können die gewohnten Treiber und Kommunikationsschichten von RAD Studio genutzt werden. Die Verwendung von XML-Dateien als Datenquelle gestaltet sich somit völlig problemlos. 1 Empfohlene Workflow-Strategie Die Erstellung der XML-Datei für die Anwendung erfolgt mit dem DBWebDataSource-Control. Danach muss die Datei mit einem DataSet-Objekt verbunden werden. Der Vorgang läuft folgendermaßen ab: • Erstellen Sie eine ASP.NET-Anwendung mit einer Verbindung zur Zieldatenbank. Verweisen Sie dann mit Hilfe von DB Web Controls auf eine nicht vorhandene XML-Datei. Bei diesem Vorgang muss ein DBWebDataSource-Control verwendet werden. Wenn die Anwendung ausgeführt wird, übernimmt das DataSet-Objekt die Ergebnismenge von der Zieldatenbank bzw. dem DBWebDataSource-Control und füllt die XML-Datei mit Tag-Daten, die die Datenmenge darstellen. • Nun können Datenadapter und Datenverbindung eliminiert werden. Beibehalten werden lediglich ein DataSet-Objekt, das DBWebDataSource-Control und die Referenz auf die XML-Datei. Die DB Web Controls rufen ihre Daten dann nicht von der Datenbank, sondern von der XML-Datei und dem DataSet-Objekt ab. Weitere Informationen erhalten Sie über die Links zu den Anleitungen, in denen die Erstellung von XML-Dateien und ihre Verwendung mit DB Web Controls beschrieben wird. Authentifizierung und Zwischenspeicherung DB Web Controls unterstützen das automatische Lesen einer XML-Datei durch die DBWebDataSource-Komponente zur Entwurfs- und zur Laufzeit. Die DBWebDataSource-Komponente besitzt Eigenschaften für die Zwischenspeicherung von XML-Daten. Wenn Sie die XML-Zwischenspeicherung verwenden, werden die Daten der XML-Datei beim Laden einer Datenquelle automatisch in das DataSet-Objekt eingelesen. Wenn Sie in Ihrer Anwendung keine Benutzerauthentifizierung implementieren, werden Sie dieses Leistungsmerkmal wahrscheinlich nur bei der Erstellung von Prototypen verwenden. Das Fehlen einer Benutzerauthentifizierung kann zu Zugriffsproblemen führen, wenn mehrere Benutzer gleichzeitig auf dieselbe XML-Datei zugreifen. Wenn mehrere Clients die Anwendung verwenden, wird die XML-Datei aufgrund der Aktionen verschiedener Benutzer ständig überschrieben. Um dies zu verhindern, können Sie der Serveranwendung Programmlogik hinzufügen, die Zeilenaktualisierungen überprüft und die Clients gegebenenfalls auf einen Konflikt hinweist. Dies entspricht in etwa den Sperren auf Tabellen- oder Zeilenebene, die von einem Datenbanksystem gesetzt werden. Da eine XML-Datei eine Textdatei ist, lässt sich aber ein derartiger Kontrollmechanismus nur mit einigem Aufwand implementieren. Sie können das Problem umgehen, indem Sie durch Zuweisung der Eigenschaft UseUniqueFileName eine Benutzerauthentifizierung implementieren. Diese Eigenschaft veranlasst, dass das DBWebDataSource-Control für jeden Client, der auf die in der XMLFileName-Eigenschaft des DBWebDataSource-Control angegebene XML-Datei zugreift, eine eigene XML-Datei mit einem eindeutigen Namen erstellt. Auf diese Weise lassen sich Datenkollisionen in Mehrbenutzeranwendungen vermeiden. Dieses Verfahren hat allerdings den Nachteil, dass die einzelnen Client-XML-Dateien unterschiedliche Daten enthalten, die von der Serveranwendung (durch entsprechende Programmlogik) zusammengeführt werden müssen. Wenn die Eigenschaft XMLFileName in Lese-Schreib-Anwendungen verwendet wird, benötigen alle Web-Clients Schreibzugriff auf die XML-Dateien, in denen sie Daten speichern. Auf Clients, die keinen Schreibzugriff haben, tritt beim Versuch, die XML-Datei zu aktualisieren, ein Zugriffsfehler auf. Sie müssen daher allen Clients, die die Anwendung nutzen, Schreibrechte gewähren. 99 Mit DataView-Objekten arbeiten RAD Studio für .NET 1.6 Webanwendungen mit ASP.NET Siehe auch Überblick zu CodeGear DB Web Controls ( DB Web-XML-Datei erstellen ( see page 88) see page 201) Aktenkoffermodell-Anwendung mit DB Web Controls erstellen ( see page 198) 1.6.7 Mit DataView-Objekten arbeiten 1 Anmerkung: DB Web Controls (Namespace Borland.Data.Web) sind seit 2007 veraltet. Sie sollten statt dessen die Standard-Websteuerelemente verwenden. DataView-Objekte (Datenansichten) ermöglichen es Ihnen, ein DataTable-Objekt unter Verwendung der Eigenschaft RowFilter zu filtern oder die Anordnung der Daten zu ändern. Die DataView-Komponenten befindet sich unter dem Bereich Datenkomponenten der Tool-Palette. In diesem Thema wird Folgendes behandelt: • Laufzeiteigenschaften • Haupt/Detail-Beziehungen • Die Methode ClearSessionChanges • Einschränkungen für DataView-Objekte Laufzeiteigenschaften Zur Entwurfszeit wird ein DBWeb Control, das ein DataView-Objekt referenziert, automatisch aktualisiert, wenn sich eine DataView-Eigenschaft ändert, die die Anzeige der Zeilen in der Datenansicht steuert. Wird eine DataView-Eigenschaft zur Laufzeit geändert, muss die Änderung bereits in Kraft sein, bevor DB Web Controls dargestellt werden. Wenn Sie beispielsweise zur Definition des Filters ein Listenfeld (ListBox) verwenden, müssen Sie folgende Aktionen ausführen: • Setzen Sie die AutoPostback-Eigenschaft des Listenfeldes auf True. • Fügen Sie Code für die Page_Load-Ereignisbehandlungsroutine hinzu, um den Zuweisung der Eigenschaft RowFilter zu steuern. • Fügen Sie der Page_Load-Ereignisbehandlungsroutine Code hinzu, der nach der Änderung von RowFilter die Methode ClearSessionChanges aufruft. Angenommen, ein Formular enthält zwei Tabellen. Sie binden ein ASP.NET-Listenfeld an eine der Tabellen, die Nachschlagewerte enthält. Diese Werte fungieren als Filter für die zweite Tabelle, deren Werte in einem DBWebGrid-Objekt angezeigt werden. Sie müssten in diesem Fall die Eigenschaft AutoPostback für das Listenfeld auf True setzen, den Wert von RowFilter in einer Behandlungsroutine für Page_Load zuweisen und nach der Änderung von RowFilter die Methode ClearSessionChanges aufrufen. Tip: Wenn Sie für die Eigenschaft AutoRefresh die Standardeinstellung False beibehalten, werden zwischengespeicherte Daten unter Umständen nicht gelöscht. Das WorldTravel-Demo in \Demos\DBWeb zeigt die korrekte Vorgehensweise. Haupt/Detail-Beziehungen Ein DataView-Objekt kann durch Hinzufügen eines Zeilenfilters als Haupttabelle einer Haupt/Detail-Beziehung verwendet werden. Dazu definieren Sie eine Haupt/Detail-Beziehung mit zwei oder mehr DataTable-Objekten in einem einzelnen DataSet-Objekt und verbinden das DataView-Objekt mit dem DataTable-Objekt, das die Hauptdatentabelle darstellt. Wenn das DBWebDataSource-Objekt die Verbindung zum DataView-Objekt herstellt, können die DB Web Controls entweder die übergeordnete Tabelle (also das DataView-Objekt) oder die Detailtabelle auswählen. Die Methode ClearSessionChanges Die Methode ClearSessionChanges setzt das DBWebDataSource-Objekt davon in Kenntnis, dass die Datenmenge (DataSet) geändert wurde und die Informationen zu Zeilen, Spalten und geänderten Daten nicht mehr gültig sind. Alle anstehenden 100 1.6 Webanwendungen mit ASP.NET RAD Studio für .NET Deployment von ASP.NET-Anwendungen Änderungen werden gelöscht. Wenn Sie versuchen, diese Methode in einer Behandlungsroutine für das Klickereignis einer DBWebNavigator-Schaltfläche aufzurufen, funktioniert die DBWebNavigator-Schaltfläche nicht. Einschränkungen für DataView-Objekte Bei der Arbeit mit Datenansichten sind verschiedene Einschränkungen zu beachten: • Eingefügte Zeilen verhalten sich in einem DataView-Objekt anders als in einem DataTable-Objekt. • In ein DataView-Objekt können nicht mehrere leere Datensätze eingefügt werden. Deshalb muss eine Zeile nach dem Einfügen erst mit Daten gefüllt werden, bevor eine weitere Zeile eingefügt werden kann. • Wird eine eingefügte Zeile gelöscht, wird sie aus der Datenansicht entfernt und kann nicht mit der Rückgängig-Funktion wiederhergestellt werden. • Enthält eine eingefügte Zeile einen einzelnen Wert, der nicht Null ist, und wird dieser Wert auf Null gesetzt, kann die Zeile eventuell gelöscht werden. Eine Wiederherstellung ist dann nicht möglich. 1 • DB Web Controls bieten keine vollständige Unterstützung für die Eigenschaft Sort von DataView-Objekten. Bei der Verarbeitung eines Sortierfeldes können die Werte für die in der Eigenschaft Sort angegebenen Felder nicht geändert werden. Die Taste EINFG ist daher für das DBWebNavigator-Objekt deaktiviert. Siehe auch Daten-Provider für .NET ( see page 28) ASP.NET-Anwendungen erstellen ( see page 186) 1.6.8 Deployment von ASP.NET-Anwendungen Dieses Thema enthält Informationen über: • Anforderungen an den Webserver • Vorbereiten der Weitergabe • Der ASP.NET-Deploymentmanager von RAD Studio Weitere Informationen über das Deployment enthält die Datei deploy.htm im Verzeichnis C:\Programme\CodeGear\RAD Studio\5.0. Anforderungen an den Webserver Der Webserver, an den die Anwendung weitergegeben werden soll, muss folgende Voraussetzungen erfüllen: • Auf dem Webserver muss Internet Information Services (IIS) 6.0 installiert und betriebsbereit sein. • Auf dem Webserver muss das .NET Framework installiert sein. • Auf dem Webserver muss ASP.NET aktiviert sein. • Das ASP.NET-Konto auf dem Webserver muss mit den richtigen Berechtigungen konfiguriert sein. Informationen zum Installieren von IIS finden Sie in der Dokumentation des Windows-Betriebssystems. Informationen zu den anderen oben beschriebenen Aufgaben erhalten Sie über den Link zu den Anforderungen der ASP.NET-Plattform am Ende dieses Themas. Vorbereiten der Weitergabe Vor dem Deployment der Anwendung sollten Sie das Debuggen deaktivieren und die Anwendung neu compilieren, da sie dadurch kompakter und effizienter wird: • Bei einer Delphi ASP.NET- oder C#-Anwendung deaktivieren Sie das Debuggen in der zugehörigen web.config-Datei. Weitere Informationen erhalten Sie über den Link zur Verwendung des Deploymentmanagers am Ende dieses Themas. • Bei einer C#-Anwendung wählen Sie Projekt Optionen, ändern die Einstellungen Fehlersuche/Ausgabe zu Ausgabe und 101 WebDataLink-Interfaces verwenden RAD Studio für .NET 1.6 Webanwendungen mit ASP.NET compilieren die Anwendung erneut. Der ASP.NET-Deploymentmanager von RAD Studio Sie könnten zwar auch mit dem Befehlszeilen-Tool XCOPY das gesamte Projektverzeichnis auf einen Webserver kopieren, für das Deployment wird aber nur ein Teil dieser Dateien benötigt. Hierzu gehören z.B. die Dateien mit der Erweiterung .aspx, .config und .dll. Delphi-spezifische Dateien wie .bdsproj-, .dcuil- und .pas-Dateien sind dagegen nicht erforderlich. Zu RAD Studio gehört der ASP.NET-Deploymentmanager, der Sie beim Deployment Ihrer ASP.NET-Anwendungen unterstützt. Mit seiner Hilfe können Sie das Deployment auf einem externen Computer (mittels einer Freigabe oder einer FTP-Verbindung) oder auf Ihrem lokalen Computer durchführen. 1 Wenn Sie für Ihr Projekt einen Deploymentmanager bereitstellen, wird eine XML-Datei (.bdsdeploy) in das Projektverzeichnis eingefügt, und in der IDE wird eine eigene Registerkarte für das Deployment angezeigt. Auf dieser Registerkarte geben Sie die erforderlichen Informationen für das Ziel und die Verbindung ein. Sie können bei Bedarf die Liste der zu kopierenden Dateien modifizieren. Der Deploymentmanager kopiert die Dateien dann zum angegebenen Ziel. Siehe auch Anforderungen der ASP.NET-Plattform Überblick zum Deployment von Anwendungen Den ASP.NET-Deploymentmanager verwenden ( see page 212) 1.6.9 WebDataLink-Interfaces verwenden Anmerkung: DB Web Controls (Namespace Borland.Data.Web) sind seit 2007 veraltet. Sie sollten statt dessen die Standard-Websteuerelemente verwenden. DB Web Controls unterscheiden sich von herkömmlichen Web Controls vor allem dadurch, dass sie die Datenbindung automatisch durchführen. Während des Entwurfs müssen Sie zwar weiterhin die Verbindungen zwischen Datenquellen und Controls konfigurieren, zur Laufzeit erfolgt die Datenbindung jedoch automatisch, d.h. es muss kein entsprechender Befehl in den Quelltext aufgenommen werden. Wenn Sie ein DB Web Control mit Hilfe des DB Web Control-Experten erweitern, implementieren Sie verschiedene Interfaces, die die Funktionalität für die Datenbindung bereitstellen. Diese Interfaces werden im vorliegenden Thema beschrieben. • IDBWebDataLink • IDBWebColumnLink: IDBWebDataLink • IDBWebLookupColumnLink: IDBWebColumnLink IDBWebDataLink Dieses Interface wird von allen DB Web Controls implementiert. Es definiert eine Datenquelle und eine Datentabelle und ermöglicht es Ihnen, Daten aus einer Vielzahl verschiedener Ressourcen wie Datenbanken, Textdateien, Arrays und Kollektionen abzurufen. Sie implementieren dieses Interface für Controls, die nur Daten auf Tabellenebene abrufen. IDBWebColumnLink:IDBWebDataLink Dieses Interface wird von DB Web Controls für die Anzeige von Spalten implementiert. Hierzu gehören z.B.DBWebImage, DBWebTextBox und DBWebCalendar. Das Interface definiert einen Spaltennamen, mit dem ein Spalten-Control verbunden werden kann. Zusammen mit dem Interface IDBWebDataLink ermöglicht es den Zugriff auf Standardtabellen- und -spaltendaten. IDBWebLookupColumnLink:IDBWebColumnLink Dieses Interface wird von DB Web Controls für Nachschlagezwecke implementiert (z.B. von DBWebListBox, DBWebRadioGroup und DBWebDropDownList). Es definiert einen Tabellennamen (TableName) in einem DataSet-Objekt, einen Spaltennamen 102 1.6 Webanwendungen mit ASP.NET RAD Studio für .NET WebDataLink-Interfaces verwenden (ColumnName), der die Tabelle der anzuzeigenden Daten repräsentiert, sowie die Spalte für die Werte, die bei Auswahl eines Werts in das mit dem Control verbundenen ColumnName-Feld eingefügt werden. Per Vorgabe ist ColumnName mit DataTextField identisch. Controls für Nachschlagezwecke besitzen zusätzlich zu einer Texteigenschaft (normalerweise das Element, das im Control, z.B. einer Liste, angezeigt wird) auch eine Werteigenschaft. Die Werteigenschaft kann mit der Texteigenschaft identisch sein, aber auch völlig andere Daten (etwa eine ID) enthalten. So könnten Sie z.B. in einer Liste bzw. Dropdown-Liste Produktnamen anzeigen, die Werte für die angezeigten Elemente aber auf die zugehörigen Produktnummern setzen. Wenn der Benutzer einen Produktnamen auswählt, wird an die Anwendung nicht der Name, sondern die Produktnummer übergeben. Dieses Verfahren hat den Vorteil, dass bei der Verarbeitung keine Konflikte aufgrund ähnlicher Namen auftreten können. Siehe auch DB Web Controls ( see page 88) Anwendung mit DB Web Controls erstellen ( ASP.NET-Anwendungen erstellen ( 1 see page 199) see page 186) 103 Überblick zu den ASP.NET-Web-Services RAD Studio für .NET 1.7 Web-Services mit ASP.NET entwickeln 1.7 Web-Services mit ASP.NET entwickeln 1 Web-Services sind eine programmierbare Entität, die eine bestimmte Funktionalität bereitstellt, zum Beispiel eine Anwendungslogik. Auf Web-Services kann von jedem beliebigen System mit Hilfe der Internetstandards (z.B. XML und HTTP) zugegriffen werden. Bei Anwendungen, die mit ASP.NET-Web-Services erstellt wurden, kann es sich entweder um eigenständige Anwendungen handeln oder um Teilkomponenten einer größeren Webanwendung. Mit Hilfe des XML-basierten Messaging können diese Anwendungen für eine beliebige Anzahl verteilter Systeme Anwendungskomponenten bereitstellen. RAD Studio enthält verschiedene Methoden, die Sie beim Erstellen, Deployment und Verwenden von ASP.NET-Web-Services-Anwendungen unterstützen. Weitere grundlegende Informationen über Web-Services finden Sie in der Dokumentation zum Microsoft .NET SDK. Themen Name Beschreibung Überblick zu den ASP.NET-Web-Services ( Protokoll-Stack von Web-Services ( ASP.NET-Web-Services-Support ( see page 106) see page 108) see page 110) Web-Services ist eine Internet-basierte Integrationstechnik, die es ermöglicht, Anwendungen unabhängig von ihrer Plattform oder Programmiersprache miteinander zu verbinden und Informationen auszutauschen. Web-Services sind in das ASP.NET-Modell integriert, das für das .NET Framework verwendet wird. Im Gegensatz zu den traditionellen Windows-Anwendungen enthalten ASP.NET-Web-Services-Anwendungen Objekte und Methoden, die mit Hilfe einfacher Messaging-Protokoll-Stacks über das Web bereitgestellt werden. Jeder Client kann eine Web-Services-Anwendung über HTTP mit einer Webmethode aufrufen. Wie jede andere Methode, auf die sich über eine einfache Windows Forms-Anwendung zugreifen lässt, so enthalten auch Webmethoden eine definierte Funktionalität. Der wesentliche Unterschied besteht darin, dass auf Webmethoden über einen Web-Browser zugegriffen wird.... more ( see page 106) Um die Infrastruktur von Web-Services zu verstehen, benötigen Sie Vorkenntnisse in XML (Extensible Markup Language), SOAP (Simple Object Access Protocol), WSDL (Web Services Description Language) und UDDI (Universal Description, Discovery, and Integration). Da die Infrastruktur bereits besteht, können Sie als Entwickler von XML-Web-Services die vorhandene Technologie der Standard-Web-Protokolle wie XML und HTTP nutzen. CodeGear bietet eine Möglichkeit zum Erstellen, Deployment und Verwenden von Web-Services, bei der die Backend-Verarbeitung kein Problem darstellt, d.h. Sie können sich auf den Entwurf Ihrer Services konzentrieren. In diesem Thema wird erläutert, welche Rolle Protokoll-Stacks für die Funktionalität von Web-Services spielen. Dabei wird auf folgende Aspekte... more ( see page 108) ASP.NET-Web-Services unterstützen VCL.NET-Formulare, .NET Windows Forms und ASP.NET Web Forms. Mit Hilfe dieser Formulare lassen sich Client-Anwendungen erstellen, die auf Web-Services-Anwendungen zugreifen. Mit der Funktion Webreferenz hinzufügen können Sie diesen Client-Anwendungen dann die erforderliche ASP.NET-Web-Services-Anwendung hinzufügen. Mit dem UDDI-Browser lassen sich Web-Services-Anwendungen lokalisieren. RAD Studio stellt einige einfache Tools zur Entwicklung und für das Deployment von ASP.NET-Web-Services bereit. Ferner unterstützt RAD Studio den Import von WSDL-Dokumenten, die eine bestimmte Web-Services-Anwendung beschreiben und ihre Funktionalität der Client-Anwendung mitteilen. Sie können die Beispiel-WebMethod von RAD Studio dazu verwenden, eine ASP.NET-Web-Services-Anwendung zu erstellen und darauf zuzugreifen. In diesem Thema wird Folgendes behandelt: • ASP.NET-Web-Services-Client-Support... more ( page 110) 104 see 1.7 Web-Services mit ASP.NET entwickeln RAD Studio für .NET Überblick zu den ASP.NET-Web-Services 1.7.1 Überblick zu den ASP.NET-Web-Services Web-Services ist eine Internet-basierte Integrationstechnik, die es ermöglicht, Anwendungen unabhängig von ihrer Plattform oder Programmiersprache miteinander zu verbinden und Informationen auszutauschen. Web-Services sind in das ASP.NET-Modell integriert, das für das .NET Framework verwendet wird. Im Gegensatz zu den traditionellen Windows-Anwendungen enthalten ASP.NET-Web-Services-Anwendungen Objekte und Methoden, die mit Hilfe einfacher Messaging-Protokoll-Stacks über das Web bereitgestellt werden. Jeder Client kann eine Web-Services-Anwendung über HTTP mit einer Webmethode aufrufen. Wie jede andere Methode, auf die sich über eine einfache Windows Forms-Anwendung zugreifen lässt, so enthalten auch Webmethoden eine definierte Funktionalität. Der wesentliche Unterschied besteht darin, dass auf Webmethoden über einen Web-Browser zugegriffen wird. Weitere grundlegende Informationen über Web-Services finden Sie in der Dokumentation zum Microsoft .NET Framework SDK. CodeGear bietet Tools für die Entwicklung und den Zugriff auf ASP.NET-Web-Services an, die verschiedene Techniken verwenden. Da es sich um modulare Objekte handelt, lassen sich Web-Services ohne zusätzlichen Code erneut verwenden. Die folgenden Themen bieten eine kurze Einführung in die Architektur von ASP.NET-Web-Services, in die Grundlagen der Kommunikation von Web-Services und einen Überblick über die Dateien, die zur Erstellung von ASP.NET-Web-Services erforderlich sind. Folgende Bereiche werden behandelt: • Architektur von ASP.NET-Web-Services • Voraussetzungen für die Arbeit mit Web-Services • Szenarien für Web-Services • Dateien von ASP.NET-Web-Services Architektur von ASP.NET-Web-Services Zu den wichtigsten Komponenten der Architektur von ASP.NET-Web-Services gehören eine Client-Anwendung, eine ASP.NET-Web-Services-Anwendung, verschiedene andere Dateien, zum Beispiel Quelltextdateien in der Programmiersprache, sowie .asmx-Dateien und compilierte .dll-Dateien. Und schließlich ist ein Webserver notwendig, der sowohl die ASP.NET-Web-Services-Anwendung als auch den Client beherbergt. Wahlweise ließe sich auch ein Datenbankserver zum Speichern und Zugreifen auf die Daten des ASP.NET-Web-Services hinzuziehen. Voraussetzungen für die Arbeit mit Web-Services Bevor Sie damit beginnen, eine Web-Services-Anwendung zu entwickeln, sollten Sie mit den folgenden Konzepten vertraut sein: • XML (Extensive Markup Language) XML ist eine benutzerdefinierte, auch von Menschen lesbare Auszeichnungssprache zur Strukturierung von Daten. Alle Daten, Datenmengen oder Dokumente, die Sie an Web-Services übermitteln oder von diesen empfangen möchten, sind in XML formatiert. • SOAP (Simple Object Access Protocol) SOAP ist das Standard-Nachrichtenprotokoll, das zur Kommunikation zwischen den Web-Services und ihren Clients verwendet wird. SOAP verwendet XML zur Formatierung seiner Nachrichten und enthält 105 1 Überblick zu den ASP.NET-Web-Services RAD Studio für .NET 1.7 Web-Services mit ASP.NET entwickeln die Parameter oder Rückgabewerte, die von den Servern oder Clients benötigt werden. • WSDL (Web Services Description Language) WSDL ist eine Beschreibungssprache für Web-Services. Ein Web-Service kann in verschiedenen Implementierungssprachen definiert werden. Jeder Web-Service muss jedoch eine Beschreibung seines Interface veröffentlichen, damit die Clients damit in Interaktion treten können. Das WSDL-Dokument sollte zumindest die erforderlichen Parameter beschreiben, die ein Client enthalten muss, sowie das Ergebnis, das der Client erwartungsgemäß empfangen kann. Die Ergebnisbeschreibung besteht üblicherweise aus dem Rückgabedatentyp. • UDDI (Universal Description Discovery and Integration) UDDI beruht auf einer Initiative der Industrie und ist ein Standard-Webverzeichnis, auf dessen Basis Unternehmen Web-Services veröffentlichen können, die von anderen Unternehmen genutzt werden. Das UDDI-Verzeichnis enthält Links und Beschreibungen zu verschiedenen Web-Services. Sie können den UDDI-Browser in der IDE dazu verwenden, Web-Services zu suchen, WSDL-Dokumente herunterzuladen und zusätzliche Informationen über Web-Services und die Unternehmen einzuholen, die sie bereitstellen. Szenarien für Web-Services 1 Die aktuellen Web-Services enthalten Informationsquellen, die sich auf einfache Weise in Anwendungen integrieren lassen, zum Beispiel Aktienkurse, Wettervorhersagen und Sportergebnisse. Mit zunehmender Nachfrage nach einem Zugriff auf Geschäftslogiken über das Web entwickeln die Unternehmen Möglichkeiten für ihre Kunden, mit Hilfe von Anwendungen bestimmte Informationen zu analysieren und einzuholen. Eine Bank kann beispielsweise einen Web-Service bereitstellen, der Finanzdaten für einen Kunden (Aktienportfolio, Bankkonten, Außenstände usw.) zusammenstellt und aktualisiert. Der Kunde kann auf diese Informationen über ein Tabellenblatt, eine Website oder ein anderes digitales Gerät zugreifen, und muss sie nicht manuell zusammenstellen. Zwar steht ein Großteil dieser Informationen bereits heute im Web bereit, doch ein Web-Service kann den Zugriff und die Zusammenführung dieser Daten vereinfachen und dafür eine verlässlichere Umgebung zur Verfügung stellen. Web-Services lassen sich in folgenden Bereichen als Lösung verwenden: • Anwendungsintegration im Unternehmen (Enterprise Application Integration = EAI) Mit einem Web-Service könnten mehrere Geschäftspartner Bestandsdaten, Bestellinformationen oder andere Finanzdaten austauschen, ohne dabei Einblick in die genaue Datenstruktur des jeweiligen Partners zu erhalten. Viele CRM- (Customer Relationship Management) oder andere Frontend-Anwendungen speichern beispielsweise Kundendaten in einem Format ab, das nicht ganz kompatibel mit den Backend-ERP-Systemen ist, die die Finanz- oder Bestandsinformationen speichern (ERP = Enterprise Resource Planning). Doch eine Vertriebsorganisation möchte seine CRM-Lösung eventuell dazu nutzen, Bestellungen in Echtzeit mit den aktuellsten Bestandinformationen aus dem ERP-System abzugleichen. Hierfür könnte ein Web-Service eine Lösung sein, denn damit lassen sich CRM-Anfragen für ERP-Speicher transformieren und umgekehrt, ERP-Antworten in CRM-Bestätigungen. • Business-to-Business (B2B) Integration Ähnlich der EAI-Lösung könnte auch eine B2B-Lösung Nutzen aus der Fähigkeit von Web-Services ziehen, Daten für große Bestellungen im Cache aufzubewahren. B2B-Transaktionen bestehen, anders als Business-to-Consumer (B2C)-Transaktionen, häufig aus Transaktionen mit einem so hohen Volumen, das sich auf der Ebene von B2C-Transaktionen verbieten würde. Ein Kunde bestellt z.B. vielleicht eine Schachtel Stifte aus einem Online-Schreibwarenladen, aber ein Unternehmen würde pro Monat tausend Schachteln für verschiedene Lieferadressen bestellen. Die Größenordnung und Komplexität von B2B-Transaktionen erfordert die Einbindung eines Web-Service, um die Transaktionen schnell und verlässlich auf einfache Weise ausführen zu können. • Business-to-Consumer (B2C) Integration B2C-Web-Services verwalten üblicherweise webbasierte Transaktionen. Ein Web-Service zum Nachschlagen von Postleitzahlen erspart es z.B. Unternehmen, die diesen Service auf ihrer Website anbieten möchten, dafür eine eigene Anwendung zu erstellen. Einige kommerzielle Websites verwenden beispielsweise auch Web-Services für Währungskonvertierungen, wenn sie internationale Bestellungen ermöglichen möchten. • Mobile Geräte (Smart Client-Anwendungen) Da es im Wesen mobiler Endgeräte liegt, Speicherplatz nur für die wichtigsten Systemfunktionen bereitzustellen und Internetverbindungen mit drahtlosen Kommunikationsprotokollen herzustellen, können Web-Services eine entscheidende Rolle dabei spielen, leistungsstarke Anwendungen mit den wesentlichen Informationen für mobile Endgeräte zur Verfügung zu stellen. Durch Web-Services wird es den Benutzern mobiler Endgeräte möglich, verschiedenste Aufgaben mit einer minimalen Dateneingabe am Gerät auszuführen und eine konzentrierte Anzeige der Abfrageergebnisse zu erhalten. Die gesamte Verarbeitung kann dabei auf einem externen Web-Service stattfinden, wodurch sich die Menge der Datenübertragungen zum mobilen Endgerät selbst reduzieren lässt. • Verteilte und Peer-to-Peer-Anwendungen Web-Services können für bestimmte verteilte Anwendungen und Peer-to-Peer-Anwendungen eine wichtige Rolle spielen. Bei einer Datenverteilung über ein unkontrolliertes Netzwerk (zum Beispiel das Internet) und nicht über ein LAN- oder Unternehmensnetzwerk, lassen sich Web-Services einsetzen, denn diese erfordern keine Instandhaltung und bieten daher eine größere Leistungsstärke, insbesondere wenn kein eindeutiges Anfrage/Antwort-Verhalten erforderlich ist. Für Anwendungen, die ein strenges Anfrage/Antwort-Verhalten und hohe 106 1.7 Web-Services mit ASP.NET entwickeln RAD Studio für .NET Protokoll-Stack von Web-Services Sicherheitsstandards erfordern, sollten Sie ältere, besser kontrollierte Modelle wie COM oder .NET in Betracht ziehen. Dateien von ASP.NET-Web-Services Wenn Sie Anwendungen mit ASP.NET-Web-Services erstellen, werden bestimmte Dateien automatisch generiert. Diese Dateien ermöglichen es ASP.NET-Web-Services, ihre Dienste über einen Webserver zu erbringen. In der folgenden Tabelle sind diese Dateien beschrieben. Datei Beschreibung .asmx Wenn Sie eine ASP.NET-Web-Services-Anwendung erstellen, wird automatisch eine Textdatei mit der Erweiterung .asmx erzeugt. Die erforderliche Web-Services-Direktive wird direkt am Anfang dieser Datei platziert, um die URL-Adresse des Web-Services und seine Implementierung miteinander in Beziehung zu setzen. In die .asmx-Datei fügen Sie die Logik des Web-Services in die Methoden ein, die für die Client-Anwendung sichtbar sind. Die .asmx-Datei dient als Basis-URL für jene Clients, die den XML-Web-Service aufrufen. Diese Datei wird für das Deployment zusammen mit anderen Dateien in eine Assemblierung compiliert. Codebehind Wenn Sie eine ASP.NET-Web-Service-Anwendung erstellen, wird eine Codebehind-Datei mit einer sprachspezifischen Dateiendung erstellt. Sie fügen die Web-Services-Logik in die öffentliche Methode (public) ein, um die Anfragen und Antworten von Web-Services zu verarbeiten. Compilierte Die DLL-Dateien von Web-Services erbringen dynamische Dienste auf dem Webserver. DLL-Dateien .wsdl Diese Datei wird generiert, sobald Sie auf die Funktion Webreferenz hinzufügen klicken, um die Web-Services in Ihre Client-Anwendung einzubinden. Sie beschreibt das für den Client verfügbare Interface zu Web-Services. .map Diese Datei ermittelt Web-Services, die für einen bestimmten Server bereitgestellt wurden. Sie enthält außerdem Links zu anderen Ressourcen, die den Web-Service beschreiben. Siehe auch Protokoll-Stack von Web-Services ( ASP.NET-Web-Services-Support ( see page 108) see page 110) ASP.NET-Web-Services-Anwendung "Hello World" erstellen ( see page 222) Auf die ASP.NET-Web-Services-Anwendung "Hello World" zugreifen ( see page 218) Microsoft Übersicht zu Web-Services 1.7.2 Protokoll-Stack von Web-Services Um die Infrastruktur von Web-Services zu verstehen, benötigen Sie Vorkenntnisse in XML (Extensible Markup Language), SOAP (Simple Object Access Protocol), WSDL (Web Services Description Language) und UDDI (Universal Description, Discovery, and Integration). Da die Infrastruktur bereits besteht, können Sie als Entwickler von XML-Web-Services die vorhandene Technologie der Standard-Web-Protokolle wie XML und HTTP nutzen. CodeGear bietet eine Möglichkeit zum Erstellen, Deployment und Verwenden von Web-Services, bei der die Backend-Verarbeitung kein Problem darstellt, d.h. Sie können sich auf den Entwurf Ihrer Services konzentrieren. In diesem Thema wird erläutert, welche Rolle Protokoll-Stacks für die Funktionalität von Web-Services spielen. Dabei wird auf folgende Aspekte eingegangen: • Wie Web-Services über das Web auf ihre Services zugreifen und diese bereitstellen • Wie XML Informationen über SOAP und HTTP übermittelt • Wie ein Client ein Web-Service-Angebot identifiziert 107 1 Protokoll-Stack von Web-Services RAD Studio für .NET 1.7 Web-Services mit ASP.NET entwickeln • Wie Web-Services gefunden werden, und wie auf sie zugegriffen wird Schichten des Protokoll-Stacks von Web-Services Web-Services bestehen aus Internet-Protokollen und -Standards, die den Datenaustausch zwischen Anwendungen regeln. Der Protokoll-Stack von Web-Services definiert die Schichtung der Internetprotokolle (Regeln), die beim Entwickeln, Auffinden und Implementieren von Web-Services zur Anwendung kommen. 1 Die wichtigsten Komponenten (Schichten) des Protokoll-Stacks eines Web-Service sind: • Transportschicht: Dient zum Transport von Nachrichten zwischen Anwendungen. • XML-Messaging-Schicht: Sorgt für die Codierung von Nachrichten in XML, die sowohl vom Client als auch vom Server verstanden wird. • WSDL-Schicht: Beschreibt den bereitgestellten Service. • UDDI-Schicht: Eine Registrierung, in der die Services zentral verwaltet werden. Transportschicht Die Transportschicht ist die erste Komponente im Stack und für die Übertragung von XML-Nachrichten zwischen Anwendungen verantwortlich. Das am häufigsten verwendete Transportprotokoll ist das Standardprotokoll HTTP. Andere, weit verbreitete Web-Protokolle sind SMTP und FTP. XML-Messaging Die Messaging-Schicht im Protokoll-Stack basiert auf einem XML-Modell. Bei der Entwicklung von Web-Services-Anwendungen wird meist XML verwendet, weshalb dies die Grundlage für alle Web-Services ist. XML ist nur ein möglicher Standard, der für die Konvertierung von Web-Services zwischen verschiedenen Technologiedomänen in Frage kommt. Im Web finden Sie viele Informationsquellen, die das XML-Messaging beschreiben. Weitere Informationen erhalten Sie auf der Website des World Wide Web Consortium (W3C) zum Messaging, die in der untenstehenden Linkliste zu finden ist. Die Spezifikation des XML-Messaging ist ein weit abgestecktes Feld, auf dem die verschiedenen, speziellen Protokolle definiert sind. Zu den bekannteren Standards gehört SOAP. Es ist einer der wichtigsten Standards bei der Kommunikation zwischen Web-Services über ein Netzwerk. Während XML die Mittel für eine Kommunikation über das Web mit einem XML-Dokument bereitstellt, das Informationen von zwei getrennten Systemen abfragen oder beantworten kann, dient SOAP zur effektiven Kommunikation innerhalb eines Netzwerks, indem es Absender und Empfänger von XML-Dokumenten mit einem allgemeinen Datentransferprotokoll unterstützt. Im Web finden Sie viele Informationsquellen, die SOAP beschreiben. Weitere Informationen erhalten Sie auf der W3C-Website zu SOAP, die in der untenstehenden Linkliste zu finden ist. WSDL-Schicht Diese Schicht ermöglicht es, ein öffentliches Interface für einen Web-Service festzulegen. Sie enthält Informationen zu den verfügbaren Funktionen, Datentypinformationen für das XML-Messaging, Bindungsinformationen über das verwendete Transportprotokoll und die Speicherposition eines bestimmten Web-Service. Eine Client-Anwendung, die von einem Service wissen möchte, welche Daten sie empfangen wird, ob der Service Ergebnisse liefert oder nicht, und welchen Transport der Service unterstützt, verwendet dazu ein WSDL-Dokument. Web-Services müssen beschrieben und dem potenziellen Kunden angekündigt werden, damit dieser sie verwenden kann. WSDL sieht ein 108 1.7 Web-Services mit ASP.NET entwickeln RAD Studio für .NET ASP.NET-Web-Services-Support allgemeingültiges Format für die Beschreibung und Veröffentlichung dieser Informationen zum Web-Service vor. Üblicherweise wird WSDL zusammen mit SOAP verwendet und die WSDL-Spezifikation enthält eine SOAP-Bindung. Mit der CodeGear-Funktion Webreferenz hinzufügen erhalten Sie das WSDL-Dokument für Ihren Web-Service. Das WSDL-Dokument oder die Proxy-Datei wird zum Client kopiert und von diesem zum Aufruf des Servers verwendet. Die Proxy-Datei trägt den Namen References.* und hat eine Erweiterung, die der jeweiligen Programmiersprache entspricht. Weitere Informationen erhalten Sie auf der W3C-Website zu WSDL, die in der untenstehenden Linkliste zu finden ist. UDDI-Schicht Diese Schicht ermöglicht es, Web-Services im Web zu veröffentlichen und zu finden. Sie können sich diese Schicht wie die weißen und gelben Seiten eines Telefonbuchs vorstellen. Die weißen Seiten der Web-Services enthalten allgemeine Informationen zu bestimmten Unternehmen, zum Beispiel Firmenname, Adresse, Telefonnummer usw. Die gelben Seiten enthalten eine Klassifizierung und beschreiben die angebotenen Dienste genauer, hier werden beispielsweise Industriebranchen und Produkte aufgeführt. Das Protokoll, das Sie zur Veröffentlichung Ihrer Web-Services verwenden, hat den Namen UDDI. Die UDDI-Business-Registrierung bietet jedem die Möglichkeit, in den vorhandenen UDDI-Daten zu recherchieren und ermöglicht es Firmen, sich selbst und ihre Dienste dort zu registrieren. Mit RAD Studio werden Ihre Informationen automatisch in der Registrierung oder in einem verteilten Verzeichnis für Business- und Web-Services veröffentlicht. Siehe auch Überblick zu den ASP.NET-Web-Services ( ASP.NET-Web-Services-Support ( see page 106) see page 110) ASP.NET-Web-Services-Anwendung "Hello World" erstellen ( see page 222) Auf die ASP.NET-Web-Services-Anwendung "Hello World" zugreifen ( see page 218) SOAP XML-Messaging WSDL 1.7.3 ASP.NET-Web-Services-Support ASP.NET-Web-Services unterstützen VCL.NET-Formulare, .NET Windows Forms und ASP.NET Web Forms. Mit Hilfe dieser Formulare lassen sich Client-Anwendungen erstellen, die auf Web-Services-Anwendungen zugreifen. Mit der Funktion Webreferenz hinzufügen können Sie diesen Client-Anwendungen dann die erforderliche ASP.NET-Web-Services-Anwendung hinzufügen. Mit dem UDDI-Browser lassen sich Web-Services-Anwendungen lokalisieren. RAD Studio stellt einige einfache Tools zur Entwicklung und für das Deployment von ASP.NET-Web-Services bereit. Ferner unterstützt RAD Studio den Import von WSDL-Dokumenten, die eine bestimmte Web-Services-Anwendung beschreiben und ihre Funktionalität der Client-Anwendung mitteilen. Sie können die Beispiel-WebMethod von RAD Studio dazu verwenden, eine ASP.NET-Web-Services-Anwendung zu erstellen und darauf zuzugreifen. In diesem Thema wird Folgendes behandelt: • ASP.NET-Web-Services-Client-Support • ASP.NET-Web-Services-Server-Support • ASP.NET-Web-Services-Namespaces 109 1 ASP.NET-Web-Services-Support RAD Studio für .NET 1.7 Web-Services mit ASP.NET entwickeln ASP.NET-Web-Services-Client-Support Sie können eine Web-Services-Anwendung erstellen, die im Wesentlichen nichts anderes als ein Provider oder eine Serveranwendung ist. Diese Anwendung befindet sich auf einem Webserver, und jeder Client, der die Architektur dieser Anwendung versteht, kann darauf zugreifen. Wenn Sie selbst eine Web-Services-Anwendung nutzen möchten, müssen Sie eine Client-Anwendung erstellen. In RAD Studio stehen verschiedene Tools zum Erstellen von Client-Anwendungen zur Auswahl: • Windows Forms • Web Forms • Webreferenzen 1 Windows Forms contra ASP.NET Web Forms Um festzustellen, welcher Form-Typ (Windows Form oder ASP.NET Web Form) sich am besten für Ihre Client-Anwendung eignet, sollten Sie bedenken, auf welche Art von Service Sie zugreifen möchten. In den meisten Fällen diktiert der gewählte Service bereits den Anwendungstyp, den Sie dafür erstellen sollten. Wenn Sie eine reichhaltige Anwendung benötigen, die komplexe Inhalte auf einer Client-Workstation verarbeiten kann oder die eine Web-Services-Anwendung als Unterstützung für eine reichhaltige Client-Anwendung über ein sicheres Netzwerk nutzt, sollten Sie eine Windows Forms-Anwendung in Betracht ziehen. Wenn Sie eine schlanke Client-Anwendung benötigen, die einfache Datenbearbeitung leistet oder die Anforderungen eines einzigen Zwecks erfüllen soll, sollten Sie eine ASP.NET Web Forms-Anwendung in Betracht ziehen. Web Forms sind plattformunabhängige Interfaces, die in einem Web-Browser angezeigt werden können und Web-Services-Anwendungen über ein einfaches Protokoll wie HTTP aufrufen. Sie können eine ASP.NET-Web-Services-Anwendung auch als Konsolenanwendung erstellen, auf die über ein Konsolenfenster oder eine andere Web-Services-Anwendung (mit oder ohne Client) zugegriffen werden kann. Webreferenz hinzufügen Sie können in Ihre Client-Anwendung eine Webreferenz für den Zugriff auf Web-Services einfügen. Eine Webreferenz bezieht sich entweder auf ein WSDL-Dokument oder ein XML-Schema, das in die Client-Anwendung importiert wird. Das WSDL-Dokument oder das XML-Schema beschreibt einen Web-Service. Wenn eines dieser Dokumente importiert ist, generiert RAD Studio alle Interfaces und Klassendefinitionen, die für den Aufruf des Web-Service erforderlich sind. Klicken Sie in der Projektverwaltung mit der rechten Maustaste auf den Knoten WebService, und wählen Sie im Kontextmenü Webreferenz hinzufügen. Ein UDDI-Browser wird angezeigt. Um den Web-Service in Ihre Client-Anwendung einzufügen, müssen Sie das WSDL-Dokument des Web-Service mit dem Browser ansteuern. ASP.NET-Web-Services-Server-Support Die ASP.NET-Web-Services-Anwendung, die Sie in RAD Studio erstellen, ermöglicht den programmseitigen Zugriff auf die Anwendungslogik eines oder mehrerer Web-Services. Sie bestimmen, welche Services bereitgestellt werden und wie sie zu verwenden sind, und definieren die Infrastruktur, die die Anfragen und Antworten übermittelt und verarbeitet. Bei der Erstellung einer ASP-NET-Web-Services-Anwendung legen Sie im Dialogfeld Neue ASP.NET-Anwendung den Namen und den Speicherort für die Anwendung fest. Die für das Deployment benötigten Dateien werden automatisch erstellt. Wenn Sie die Anwendungseinstellungen definieren, erzeugt RAD Studio eine .asmx-Datei, die als Basis-URL für diejenigen Clients dient, die die ASP.NET-Web-Services-Anwendung aufrufen. ASP.NET-Web-Services-Namespaces Weitere Informationen zum Namespace System.Web.Services finden Sie im Microsoft .NET Framework SDK. Siehe auch Überblick zu den ASP.NET-Web-Services ( Protokoll-Stack von Web-Services ( 110 see page 106) see page 108) 1.7 Web-Services mit ASP.NET entwickeln RAD Studio für .NET ASP.NET-Web-Services-Anwendung "Hello World" erstellen ( ASP.NET-Web-Services-Support see page 222) Auf die ASP.NET-Web-Services-Anwendung "Hello World" zugreifen ( see page 218) 1 111 2 RAD Studio für .NET 2 Anleitungen Dieser Abschnitt enthält Anleitungen zu verschiedenen Bereichen der Entwicklung mit RAD Studio. Themen Name Datenbankanleitungen ( Beschreibung see page 114) Interoperative Anwendungen – Anleitungen ( Anleitungen für die Modellierung ( VCL für .NET – Anleitungen ( ASP.NET – Anleitungen ( Web-Services-Anleitungen ( Dieser Abschnitt enthält Anleitungen zur Entwicklung von Datenbankanwendungen. see page 150) see page 152) see page 157) see page 182) see page 218) Dieser Abschnitt enthält Anleitungen zur Erstellung von interoperativen Anwendungen. Dieser Abschnitt enthält Anleitungen zum Modellieren von Anwendungen. Dieser Abschnitt enthält Anleitungen zur Entwicklung von VCL.NET-Anwendungen. Dieser Abschnitt enthält Anleitungen zur Entwicklung von ASP.NET Web Forms-Anwendungen. Dieser Abschnitt enthält Anleitungen zur Entwicklung und Verwendung von Web-Services. 2 113 RAD Studio für .NET 2.1 Datenbankanleitungen 2.1 Datenbankanleitungen Dieser Abschnitt enthält Anleitungen zur Entwicklung von Datenbankanwendungen. Themen Name Beschreibung Neue Verbindung in Daten-Explorer einfügen ( see page 116) In den Daten-Explorer lassen sich neue Verbindungen einfügen, die so lange erhalten bleiben, bis das Verbindungsobjekt entfernt wird. Anleitung zum Hinzufügen eines Dialogfelds zur Fehlerbehebung zu einer BDP-Anwendung. ( see page 116) Sie können Ihre BDP-Anwendungen so modifizieren, dass bei Auftreten eines Aktualisierungskonflikts ein Dialogfeld zur Behebung von BDP-Fehlern geöffnet wird. Solche Konflikte können vorkommen, wenn mehrere Personen zum selben Zeitpunkt versuchen, dieselbe Zeile einer Datenbanktabelle zu aktualisieren. Datenbank im Daten-Explorer durchsuchen ( Wenn eine Live-Verbindung besteht, können Sie mit dem Daten-Explorer Objekte in einer Datenbank zu suchen. Verbinden mit AdoDbx Client ( see page 118) see page 119) Es gibt verschiedene Möglichkeiten, um eine Datenbankverbindung mit AdoDbx Client herzustellen. Datenbank-Projekte mit dem Daten-Explorer erstellen ( Tabellenzuordnungen erstellen ( see page 120) see page 120) SQL im Daten-Explorer ausführen ( see page 122) Fehler in Tabellenzuordnungen behandeln ( Daten zwischen Datenbanken migrieren ( see page 123) see page 124) 2 Verbindungen im Daten-Explorer bearbeiten ( Datenbankverbindungen bearbeiten ( 114 see page 125) see page 126) Sie können Daten aus dem Daten-Explorer per Drag&Drop in jedes beliebige Formular ziehen (beispielsweise in Windows Forms oder Web Forms bzw. in Global.asax-Dateien), um Datenmengen zu füllen und ein Datenbankprojekt schnell zu erstellen. Mit dieser Methode können Sie Datenbankkomponenten automatisch in ein Projekt einbinden und müssen keine Verbindungsstrings bereitstellen, was bei der manuellen Eingabe von Strings zu Fehlern führen kann. Mit Hilfe der Eigenschaft TableMappings können Sie die Spalten einer Datenquelle den Spalten einer Datenmengenkomponente im Arbeitsspeicher zuordnen. Auf diese Weise können Sie den Spalten der Datenmenge andere, aussagekräftigere Namen zuweisen. Es ist zudem möglich, eine Spalte einer Datenbanktabelle in der Datenmenge einer anderen Spalte zuzuordnen, als der, die standardmäßig ausgewählt wird. Die Eigenschaft TableMappings ermöglicht es Ihnen auch, eine Datenmenge zu erzeugen, die weniger oder mehr Spalten enthält, als aus dem Datenbankschema abgerufen werden. Sie können SQL in einem eigenen SQL-Fenster eingeben, bearbeiten und ausführen. Das SQL-Fenster steht im Daten-Explorer zur Verfügung. Jede Art von Vergleich zwischen einer Datenquelle und einer Arbeitsspeicherrepräsentation von Daten ist fehleranfällig. Fehler können auftreten, wenn die Datenquelle und die zugehörige Datenmenge nicht über die gleiche Anzahl von Spalten verfügen oder wenn die Spaltentypen der Datenquelle nicht mit den Spaltentypen der Datenmenge übereinstimmen. Zudem können andere interne Fehler auftreten, die sich zur Entwurfszeit nicht unterbinden lassen. Sie können mit den Eigenschaften MissingMappingAction und MissingSchemaAction auf Fehler in Tabellenzuordnungsoperationen reagieren. Mit Hilfe der Eigenschaft MissingMappingAction können Sie festlegen, wie der Datenadapter reagieren soll, wenn eine Zuordnung fehlt. Verwenden Sie die Eigenschaft MissingSchemaAction, um zu bestimmen, wie der Adapter reagieren... more ( see page 123) Mit dem Daten-Explorer lassen sich Daten zwischen Datenbanken (und sogar Providern) schnell und einfach migrieren. Sie können mit dem Daten-Explorer eine Tabelle in einer Datenbank kopieren und diese dann in eine andere Datenbank einfügen. Dabei werden sowohl die Struktur als auch die Daten der Tabelle(n) migriert. Die Datenmigration wird von der Klasse BdpCopyTable unterstützt, die zur Entwurfszeit als Komponente in der Tool-Palette zur Verfügung steht. Mit dieser Komponente können Sie Daten programmgesteuert migrieren. Anmerkung: Die Klasse BdpCopyTable kopiert keine fremden Schlüssel oder abhängigen Objekte. Sie können Verbindungen im Daten-Explorer in vielerlei Hinsicht ändern. Die grundlegenden Elemente eines Verbindungsstrings sind meist für alle Datenbanktypen gleich. Allerdings gilt für jeden Datenbanktyp eine leicht veränderte Syntax des Verbindungsstrings. In diesem Abschnitt werden diese Unterschiede beschrieben. 2.1 Datenbankanleitungen RAD Studio für .NET Eine Datenbankanwendung für die Auflösung in mehrere Tabellen erstellen ( see page 132) RAD Studio unterstützt die Auflösung in mehrere Tabellen mit BDP.NET. Zur Bereitstellung und Auflösung einer .NET-Datenmenge aus mehreren heterogenen Datenquellen dienen speziell die beiden Komponenten DataSync und DataHub. Zusätzlich unterstützen diese Komponenten die Anzeige von Live-Daten zur Entwurfszeit und stellen Haupt-/Detaildaten bereit und lösen sie auf, indem optimales SQL für die Auflösung in BDP-Datenquellen generiert wird. Die DataHub-Komponente dient als Bindeglied zwischen einer DataSet- und einer DataSync-Komponente. Der DataPort-Eigenschaft einer DataHub-Komponente kann eine beliebige Implementierung von IDataProvider zugewiesen werden. DataSync implementiert eine IDataProvider-Komponente und verfügt über eine Providers-Sammlung mit .NET-Daten-Providern, die IDbDataAdapter implementieren. Die Methode GetData für DataSync iteriert durch... more ( see page 132) Parameterübergabe in einer Datenbankanwendung ( Die folgende Anleitung beschreibt eine einfache Anwendung, die es Ihnen ermöglicht, zur Laufzeit einen Parameterwert an eine Datenmenge zu übergeben. Parameter ermöglichen die Erstellung von Anwendungen, bei denen zur Entwurfszeit nicht bekannt ist, welche Daten der Benutzer zur Laufzeit im Einzelnen eingeben wird. Im folgenden Beispiel wird unterstellt, dass Sie bereits die Interbase-Beispieldatenbank EMPLOYEE.GDB eingerichtet und eine entsprechende Verbindung definiert haben. In diesem Beispiel wird zur Veranschaulichung die Standardverbindungskomponente IBConn1 mit dem Standardspeicherort verwendet. Ihre Datenbank befindet sich möglicherweise in einem anderen Verzeichnis. Datenadapter-Vorschau verwenden ( Anweisungstext-Editor verwenden ( see page 136) see page 137) Designer für Datenadapter verwenden ( Verbindungseditor verwenden ( see page 138) see page 139) Standarddatenmengen verwenden ( Typisierte Datenmengen verwenden ( see page 134) see page 140) see page 143) CodeGear RAD Studio enthält ein Tool, das die Kommunikation zwischen Datenquelle und Datenmenge ermöglicht. Sie können in der Datenadapter-Vorschau angeben, welche Daten aus der Datenmenge übertragen werden sollen - entweder in Form von SQL-Anweisungen oder Stored Procedures, die zur Eingabe in die Datenbank oder zum Lesen aus der Datenbank aufgerufen werden. Um ein DataSet-Objekt zu erstellen, muss im BdpDataAdapter-Objekt mindestens SQL-Select-Anweisung für die Eigenschaft CommandText definiert sein. Sobald diese Anweisung eingegeben wurde, wird sie als Wert der Eigenschaft CommandText des BdpCommand-Objekts für die BdpDataAdapter-Komponente verwendet. Sie können diese Select-Anweisung eintippen oder den Anweisungstext-Editor zum Erstellen dieser Anweisung (sowie von Update-, Insert- und Delete-Anweisungen) mit Hilfe einfacher Zeigenund Klicken-Operationen benutzen. Wenn Sie den Anweisungstext-Editor verwenden und eine Verbindung zu einer aktiven Datenquelle besteht, dann werden die Namen der Tabellen und Spalten in diesem Editor angezeigt. Sie können Einträge aus Listenfeldern auswählen, um die Anweisung aufzubauen. Wenn Sie die BdpDataAdapter-Komponente mit dem... more ( see page 137) Der Datenadapter muss mindestens eine SQL-Select-Anweisung mit der Anweisungseigenschaft SELECT enthalten. Sie können diese Anweisung entweder selbst eingeben oder den Designer Datenadapter dazu verwenden, die Select-Anweisung zusammen mit den Update-, Insert- und Delete-Anweisungen zu erstellen. Der BdpCommandBuilder erstellt die Update-, Insert- und Delete-Anweisungen auf der Basis der von Ihnen ausgewählten Tabellen und Spalten. Der Designer Datenadapter verwendet eine Live-Verbindung, um die Metadaten abzurufen, auf deren Basis sich die geeigneten SQL-Anweisungen erstellen lassen. Mit den SQL-Anweisungen werden diejenigen Daten bearbeitet, die Sie aus der Datenmenge zurück in die Datenbank übertragen möchten. Jedes Verbindungsobjekt kann mehrere benannte Verbindungen unterstützen. Dabei kann es sich um Verbindungen zu mehreren Datenbanken oder Datenbanktypen handeln. Das Standardobjekt DataSet ist eine Arbeitsspeicher-Repräsentation von Tabellen oder Ansichten, die von einer verbundenen Datenquelle abgerufen werden. Wegen der Art und Weise, in der die zugrunde liegende Datenstruktur programmiert ist, werden zur Laufzeit nur die Spaltennamen der Datenquelle angezeigt. Wenn Sie eine Datenmenge generieren, werden die Daten aus allen Spalten abgerufen, die Sie in der Select-Anweisung im Dialogfeld Daten-Adapter-Konfiguration angegeben haben. Sie können die Spalten beschränken, indem Sie die Select-Anweisung ändern und eine neue Datenmenge erzeugen. Typisierte Datenmengen weisen bestimmte Vorteile gegenüber Standarddatenmengen auf. Erstens werden sie von einer XML-Hierarchie der Zieldatenbanktabelle abgeleitet. Die XML-Datei, die die Beschreibung der Datenmenge enthält, ermöglicht die Bereitstellung von Funktionen zur Code-Vervollständigung, die beim Einsatz von Standarddatenmengen nicht verfügbar sind. Die strenge Typisierung der Methoden, Eigenschaften und Ereignissen der Datenmenge lässt eine Typüberprüfung während der Compilierung zu und führt in manchen Anwendungen zu einem besseren Leistungsverhalten. 115 2 Anleitung zum Hinzufügen eines RAD Studio für .NET 2.1 Datenbankanleitungen Herstellen einer Verbindung zu einer Datenbank mit dem dbExpress Treiber-Framework ( see page 145) Diese Anleitung zeigt Ihnen, wie Sie mit dem dbExpress-Treiber-Framework eine Verbindung zu einer Datenbank herstellen und deren Datensätze lesen können. In dem Beispielcode enthalten die .ini-Dateien von dbExpress alle Informationen über die spezielle Datenbankverbindung, wie z.B. den Treiber, den Benutzernamen, das Passwort usw. Eine verteilte Datenbankanwendung erstellen ( Daten-Remoting bildet eine wichtige Grundlage für die Entwicklung verteilter Datenbankanwendungen. Die .NET-Remoting-Technologie ist ein flexibles und erweiterbares Framework für die Kommunikation zwischen einzelnen Prozessen. Das .NET-Remoting ermöglicht eine Interaktion mit Objekten, die sich in unterschiedlichen Anwendungsdomänen befinden oder die zu verschiedenen Prozessen auf einem Computer oder auf mehreren Computern in einem Netzwerk gehören. Mit Hilfe der Komponenten RemoteServer und RemoteConnection kann eine Client-/Server-Anwendung, in der DataHub- und DataSync-Komponenten verwendet werden, problemlos in eine mehrschichtige Datenmengen-Remoting-Anwendung migriert werden. RemoteServer implementiert das Interface IDataService und stellt sich selbst als SAO (Singleton Server Activated Object) zur Verfügung. Auf der Client-Seite wird über die... more ( see page 147) see page 147) 2.1.1 Neue Verbindung in Daten-Explorer einfügen In den Daten-Explorer lassen sich neue Verbindungen einfügen, die so lange erhalten bleiben, bis das Verbindungsobjekt entfernt wird. So fügen Sie eine neue Verbindung hinzu: 1. Wählen Sie Ansicht Daten-Explorer. Das Dialogfeld Daten-Explorer wird angezeigt. 2. Wählen Sie in der hierarchischen Liste einen Provider aus. 3. Klicken Sie mit der rechten Maustaste, um ein Kontextmenü einzublenden. 4. Wählen Sie Neue Verbindung hinzufügen. Daraufhin wird das Dialogfeld Neue Verbindung hinzufügen angezeigt. 5. Geben Sie den Namen der neuen Verbindung ein. 6. Klicken Sie auf OK. Tip: Wenn Sie die Einstellungen für die neue Verbindung ändern möchten, klicken Sie mit der rechten Maustaste auf die neue Verbindung und wechseln zu Verbindung bearbeiten . Das Dialogfeld Verbindungseditor wird geöffnet. Legen Sie hier die Einstellungen für die Verbindung fest, und klicken Sie auf OK. Siehe auch BDP.NET-Komponentendesigner ( 2 see page 23) Datenbank im Daten-Explorer durchsuchen ( SQL im Daten-Explorer ausführen ( see page 118) see page 122) Verbindungen im Daten-Explorer bearbeiten ( see page 125) 2.1.2 Anleitung zum Hinzufügen eines Dialogfelds zur Fehlerbehebung zu einer BDP-Anwendung. Sie können Ihre BDP-Anwendungen so modifizieren, dass bei Auftreten eines Aktualisierungskonflikts ein Dialogfeld zur Behebung von BDP-Fehlern geöffnet wird. Solche Konflikte können vorkommen, wenn mehrere Personen zum selben Zeitpunkt 116 2.1 Datenbankanleitungen RAD Studio für .NET Anleitung zum Hinzufügen eines versuchen, dieselbe Zeile einer Datenbanktabelle zu aktualisieren. So fügen Sie ein Dialogfeld zur Behebung von BDP-Fehlern hinzu: 1. Fügen Sie dem vorhandenen WinForm eine BDPDataAdapter-Komponente hinzu. 2. Aktivieren Sie im Fenster des Objektinspektors die Registerkarte Ereignisse. 3. Doppelklicken Sie in den Inhaltsbereich der leeren Pulldown-Liste neben dem Ereignis OnUpdateError. Die erste Ebene der Pulldown-Liste wird daraufhin gefüllt. Außerdem wird der Quelltext für die Methodendefinition und -implementierung für BdpDataAdapter erzeugt. 4. Fügen Sie die unten in Fettschrift gekennzeichneten Zeilen zur Ereignisbehandlung in die Methodenimplementierung ein (im folgenden Beispiel wird die Programmiersprache C# verwendet). private void bdpDataAdapter1_OnUpdateError(object sender, Borland.Data.Common.BdpUpdateErrorEventArgs e) { Borland.Data.Common.ReconcileErrorForm f = new Borland.Data.Provider.ReconcileErrorForm( e ); f.ShowDialog(); } 5. Speichern Sie die Änderungen im WinForm. Nun wird das Dialogfeld zur Behebung von BDP-Fehlern geöffnet, wenn ein Benutzer Daten in einer Datenbankzeile ändert, die zur selben Zeit von einem anderen Benutzer bearbeitet wird. Die Funktionsweise des Dialogfelds wird im Folgenden beschrieben. Im oberen Bereich des neuen Dialogfelds zur Fehlerbehebung werden vier Spalten angezeigt, im unteren Bereich stehen sechs Optionsfelder zu Wahl. Die folgende Tabelle enthält eine Beschreibung der Spalten. Spalte Beschreibung Spaltenname Die Namen der Tabellenspalten, in denen ein Fehler aufgetreten ist. Aktuelle Zeile Der Inhalt der Zeile, die das Problem verursacht. Originalzeile Der Inhalt der Zeile, bevor die konfliktverursachenden Daten eingegeben wurden. Server-Zeile Die letzte auf dem Server gespeicherte Aktualisierung. (Entspricht dem Inhalt der Zeile auf dem Server.) Mit Hilfe der drei Optionsfelder im linken unteren Bereich des Fensters können Sie angeben, wie die Verarbeitung nach der Fehlerbehebung fortgesetzt werden soll. Sie können nur eine dieser Optionen auswählen: Optionsfeld Aktualisierung Primärschlüssel versuchen Aktuelle überspringen fortsetzen Aktualisierungen abbrechen Beschreibung mit Der Fehler wird behoben, und die Aktualisierung wird mit Hilfe des Primärschlüssels erneut erneut versucht. Wenn die Datenzeile des Servers nicht gefunden wird, ist diese Option deaktiviert. Zeile Die Änderungen in der aktuellen Zeile werden nicht übernommen, aber für die übrigen Zeilen wird und eine Aktualisierung durchgeführt. Die letzten Änderungen werden nicht übernommen. Der Fehler wird behoben, aber es werden keine weiteren Aktualisierungsversuche durchgeführt. Mit Hilfe der drei Optionsfelder unten rechts im Fenster können Sie angeben, welche Daten in die Datenbank geschrieben werden sollen. Sie können nur eine dieser Optionen auswählen: Optionsfeld Beschreibung Originalwerte verwenden Die Daten aus der Spalte Originalzeile (siehe oben) werden in die Zeile eingefügt, die den Konflikt verursacht hat. 117 2 Datenbank im Daten-Explorer durchsuchen Server-Werte verwenden Aktuelle verwenden RAD Studio für .NET 2.1 Datenbankanleitungen Die Daten aus der Spalte Server-Zeile (siehe oben) werden in die Zeile eingefügt, die den Konflikt verursacht hat. Werte Die Daten aus der Spalte Aktuelle Zeile (siehe oben) werden in die Zeile eingefügt, die den Konflikt verursacht hat. Siehe auch ADO.NET-Komponentendesigner ( see page 23) Datenbank im Daten-Explorer durchsuchen ( SQL im Daten-Explorer ausführen ( see page 118) see page 122) Verbindungen im Daten-Explorer bearbeiten ( see page 125) 2.1.3 Datenbank im Daten-Explorer durchsuchen Wenn eine Live-Verbindung besteht, können Sie mit dem Daten-Explorer Objekte in einer Datenbank zu suchen. So suchen Sie Objekte in einer Datenbank: 1. Wählen Sie Ansicht Daten-Explorer. 2. Erweitern Sie einen Provider-Knoten, um die Liste der verfügbaren Verbindungen anzuzeigen. 3. Erweitern Sie einen Verbindungsknoten, um die Liste der Datenbankobjekte (Tabellen, Ansichten und Prozeduren) anzuzeigen. Anmerkung: Wenn Sie aufgrund einer fehlenden Live-Verbindung eine Fehlermeldung erhalten, sollten Sie Ihren Provider aktualisieren und/oder die Verbindung ändern. So rufen Sie Daten aus der Datenbank ab: 1. Erweitern Sie die Verbindung im Daten-Explorer. 2. Doppelklicken Sie auf einen Tabellen- oder Ansichtsnamen, um Daten abzurufen. Diese Operation gibt im Quelltext-Editor eine Ergebnismenge auf einer Registerseite des Daten-Explorers zurück. Tip: Sie können auch im Daten-Explorer eine Tabelle auswählen und mit der rechten Maustaste darauf klicken, um ein Popup-Menü mit dem Befehl Daten aus Tabelle abrufen einzublenden. So führen Sie eine Stored Procedure aus: 2 1. Wählen Sie Ansicht Daten-Explorer. 2. Erweitern Sie die Verbindung im Daten-Explorer, und suchen Sie die Stored Procedure. 3. Doppelklicken Sie auf die Stored Procedure, um deren Parameter anzuzeigen. Die Parameter werden in einer separaten Seite der Designoberfläche angezeigt. 4. Bearbeiten Sie die Eingabeparameter nach Bedarf. 5. Klicken Sie in der oberen linken Ecke der Seite auf die Schaltfläche Ausführen, um die Prozedur auszuführen. Das Ergebnis wird in einem Datengitter angezeigt. Tip: Alternativ können Sie im Daten-Explorer mit der rechten Maustaste auf eine Prozedur klicken und im Kontextmenü den Befehl Ausführen wählen. 118 2.1 Datenbankanleitungen RAD Studio für .NET Datenbank-Projekte mit dem Siehe auch ADO.NET-Komponentendesigner ( see page 23) Neue Verbindung in den Daten-Explorer einfügen ( SQL im Daten-Explorer ausführen ( see page 116) see page 122) Verbindungen im Daten-Explorer bearbeiten ( see page 125) 2.1.4 Verbinden mit AdoDbx Client Es gibt verschiedene Möglichkeiten, um eine Datenbankverbindung mit AdoDbx Client herzustellen. So stellen Sie eine Verbindung über die Datei dbxconnections.ini her: 1. Die im Beispielcode angeführte Eigenschaft ConnectionName ist der Name einer Verbindung in der Datei dbxconnections.ini. 2. Verwenden Sie für die Verbindung den folgenden Delphi-Code: uses System.Data.Common ... var Factory: System.Data.Common.DbProviderFactory; Connection: System.Data.Common.DbConnection; begin Factory := System.Data.Common.DbProviderFactories.GetFactory('Borland.Data.AdoDbxClient'); Connection := Factory.CreateConnection(); Connection.ConnectionString := 'ConnectionName=IBConnection'; Connection.Open; end So stellen Sie eine Verbindung über die Datei System.Configuration her: 1. Dazu müssen allerdings die Eigenschaftseinstellungen in den Dateien dbxconnections.ini und dbxdriver.ini für die Datenbank, zu der Sie eine Verbindung herstellen wollen, in die Datei machine.config migriert werden. Hier ein Beispiel für den Verbindungsstring, der in den Abschnitt <connectionStrings> der Datei machine.config einzufügen ist: 2. Verwenden Sie für die Verbindung den folgenden Delphi-Code: var Factory: System.Data.Common.DbProviderFactory; Connection: System.Data.Common.DbConnection; Config: System.Configuration.Configuration; ConnectSection: System.Configuration.ConnectionStringsSection; CurrentSettings: System.Configuration.ConnectionStringSettings; begin Factory := System.Data.Common.DbProviderFactories.GetFactory('Borland.Data.AdoDbxClient'); Connection := Factory.CreateConnection(); Config:= System.Configuration.ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); ConnectSection:= Config.ConnectionStrings; CurrentSettings:= ConnectSection.ConnectionStrings['IBConnection']; Connection.ConnectionString:= CurrentSettings.ConnectionString; Connection.Open; end; 2 Siehe auch AdoDbx-Client - Übersicht ( see page 6) Deployment des AdoDbx-Clients 119 Tabellenzuordnungen erstellen RAD Studio für .NET 2.1 Datenbankanleitungen 2.1.5 Datenbank-Projekte mit dem Daten-Explorer erstellen Sie können Daten aus dem Daten-Explorer per Drag&Drop in jedes beliebige Formular ziehen (beispielsweise in Windows Forms oder Web Forms bzw. in Global.asax-Dateien), um Datenmengen zu füllen und ein Datenbankprojekt schnell zu erstellen. Mit dieser Methode können Sie Datenbankkomponenten automatisch in ein Projekt einbinden und müssen keine Verbindungsstrings bereitstellen, was bei der manuellen Eingabe von Strings zu Fehlern führen kann. So erstellen Sie ein Datenbankprojekt mit dem Daten-Explorer: 1. Stellen Sie sicher, dass eine Live-Verbindung zu einer Datenbank besteht. 2. Wählen Sie im Menü Ansicht die Option Daten-Explorer. 3. Wählen Sie Datei Neu Weitere, und markieren Sie ein Delphi für .NET-Projekt. Normalerweise handelt es sich dabei um ein Windows Form, ein VCL-Formular oder eine ASP.NET-Anwendung. 4. Erweitern Sie die Daten-Explorerstruktur, und wechseln Sie zur Ebene Tabelle oder Ansicht. Wenn die Verbindung zur Datenbank aktiv ist, verschwindet das kleine rote x, sobald der Verbindungsknoten für die Datenbank erweitert wird. Wenn die Verbindung nicht aktiv ist, muss der Verbindungsstring eventuell geändert werden. 5. Markieren Sie mit dem Cursor eine der in der Liste aufgeführten Tabellen. 6. Ziehen Sie das Tabellenobjekt in das Formular. In der Komponentenablage werden ein AdoDbxConnection- und ein AdoDbxDataAdapter-Objekt angezeigt. 7. Legen Sie für jede Datenbankkomponente die geeigneten Datenbankeigenschaften fest. Setzen Sie beispielsweise die Eigenschaft Active auf True, wenn während des Entwurfs Daten in der Komponente sichtbar sein sollen. Anmerkung: Die DataGrid-Komponente wird nicht automatisch angezeigt. Stellen Sie deshalb bei Bedarf sicher, dass eine DataGrid-Komponente im Formular vorhanden ist, damit die Daten korrekt angezeigt werden. Siehe auch ADO.NET-Komponentendesigner ( see page 23) Datenbank im Daten-Explorer durchsuchen ( SQL im Daten-Explorer ausführen ( see page 118) see page 122) Verbindungen im Daten-Explorer bearbeiten ( see page 125) 2.1.6 Tabellenzuordnungen erstellen 2 Mit Hilfe der Eigenschaft TableMappings können Sie die Spalten einer Datenquelle den Spalten einer Datenmengenkomponente im Arbeitsspeicher zuordnen. Auf diese Weise können Sie den Spalten der Datenmenge andere, aussagekräftigere Namen zuweisen. Es ist zudem möglich, eine Spalte einer Datenbanktabelle in der Datenmenge einer anderen Spalte zuzuordnen, als der, die standardmäßig ausgewählt wird. Die Eigenschaft TableMappings ermöglicht es Ihnen auch, eine Datenmenge zu erzeugen, die weniger oder mehr Spalten enthält, als aus dem Datenbankschema abgerufen werden. So erstellen Sie eine Tabellenzuordnung: 1. Erstellen Sie eine Anwendung. 2. Fügen Sie Datenbankkomponenten hinzu, und konfigurieren Sie diese. 3. Legen Sie die Tabellenzuordnungen im Dialogfeld Tabellenzuordnungen fest. Anmerkung: In der folgenden Anleitung wird davon ausgegangen, dass Sie BDP.NET-Datenbankkomponenten benutzen. 120 2.1 Datenbankanleitungen RAD Studio für .NET Tabellenzuordnungen erstellen So erstellen Sie eine Anwendung: 1. Wählen Sie Datei Neu Windows Forms-Anwendung (für Delphi für .NET oder C#). 2. Klicken Sie auf die Registerkarte Daten-Explorer, um die Datenquellen anzuzeigen. 3. Erweitern Sie die Liste, und suchen Sie eine aktive Datenquelle. 4. Ziehen Sie einen Tabellennamen in das Windows Form, um der Anwendung eine Datenquelle hinzuzufügen. Die Komponentenablage sollte jetzt zwei Objekte enthalten: ein BdpDataAdapter-Objekt und ein BdpConnection-Objekt. Weitere Informationen zum Erstellen von Datenbankanwendungen finden Sie in den zusätzlichen Themen zu ADO.NET und Datenbanken in diesem Hilfesystem. So konfigurieren Sie die Datenbankkomponenten: 1. Markieren Sie das BdpDataAdapter-Symbol in der Komponentenablage. 2. Klicken Sie auf das Designer Verb Daten-Adapter konfigurieren, um das Dialogfeld Datenadapter-Konfiguration zu öffnen. 3. Aktivieren Sie die Registerkarte DataSet. 4. Klicken Sie auf das Optionsfeld Neues DataSet. 5. Klicken Sie auf OK. Daraufhin wird eine neue DataSet-Komponente erzeugt, die durch ein entsprechendes Symbol in der Komponentenablage repräsentiert wird. So legen Sie Tabellenzuordnungen fest: 1. Markieren Sie das BdpDataAdapter-Symbol in der Komponentenablage. 2. Doppelklicken Sie im Objektinspektor auf das Feld Auflistung neben der Eigenschaft TableMappings. Daraufhin wird das Dialogfeld Tabellenzuordnungen angezeigt. 3. Wenn Sie eine vorhandene Datenmenge als Vorlage für die Spaltenzuordnung verwenden möchten, aktivieren Sie das Kontrollkästchen Anhand der Datenmenge Tabellen-/Spaltennamen vorschlagen. Dadurch wird eine Liste mit Spaltennamen einer vorhandenen Datenmenge angezeigt, die auf dem Schema dieser Datenmenge basiert. Die Spaltennamen werden bei Auswahl dieser Option mit keinem Objekt verknüpft. 4. Wenn Sie das Kontrollkästchen Anhand der Datenmenge Tabellen-/Spaltennamen vorschlagen aktiviert haben, können Sie die Datenmenge in der Dropdown-Liste Datenmenge auswählen. 5. Wählen Sie die Quelltabelle in der Dropdown-Liste Quelltabelle aus. Falls die Datenquelle mehrere Tabellen umfasst, werden deren Namen in der Dropdown-Liste angezeigt. 6. Wenn Sie eine Datenmenge verwenden, um Tabellen- und Spaltennamen vorzuschlagen, und diese Datenmenge mehrere Tabellen enthält, können Sie die gewünschte Tabelle in der Dropdown-Liste Datenmengentabelle auswählen. Die Spaltennamen der Quelltabelle und der Datenmenge sollten in der Tabelle Spaltenzuordnungen angezeigt werden. Die Anzeige repräsentiert standardmäßig die Zuordnung zwischen den Spalten der Quelltabelle und der Datenmenge; mit anderen Worten, der Datenadapter liest Daten aus der Spalte, die auf der linken Seite der angezeigten Tabelle verzeichnet ist, und speichert die Daten in der Datenmengenspalte, die im zugehörigen Feld auf der rechten Seite der Tabelle genannt ist. Sie können die Namen auf beiden Seiten ändern, indem Sie neue Namen eintippen oder andere Tabellen auswählen. Auf diese Weise können Sie abgefragte Dateien auch Datenmengenspalten speichern, die nicht standardmäßig in der Datenmenge angelegt werden. 7. Wenn Sie eine Zuordnung ändern möchten, geben Sie in die Spalte für die Datenmengentabelle neben der gewünschten Quelltabellenspalte einen anderen Namen ein. Die Daten aus der Spalte der Quelltabelle werden daraufhin in der angegebenen neuen Datenmengenspalte gespeichert. Anmerkung: Wenn Sie die Spaltennamen zurücksetzen möchten, sodass die Datenmengenspalten den Spalten der Datenquelle entsprechen, klicken Sie auf die Schaltfläche Zurücksetzen . 121 2 Fehler in Tabellenzuordnungen behandeln RAD Studio für .NET 2.1 Datenbankanleitungen So löschen Sie eine Zuordnung: 1. Markieren Sie die Tabellenzeile, die Sie löschen möchten. 2. Klicken Sie auf Löschen. Die betreffende Spalte wird daraufhin in der Abfrage der Quelltabelle übergangen, und die zugehörige Datenmengenspalte bleibt leer. Siehe auch Überblick zu ADO.NET ( see page 15) ADO.NET-Komponentendesigner ( see page 23) Fehler in Tabellenzuordnungen behandeln ( see page 123) 2.1.7 SQL im Daten-Explorer ausführen Sie können SQL in einem eigenen SQL-Fenster eingeben, bearbeiten und ausführen. Das SQL-Fenster steht im Daten-Explorer zur Verfügung. So öffnen Sie ein SQL-Fenster: 1. Wählen Sie Ansicht Daten-Explorer. 2. Wählen Sie eine Verbindung aus. 3. Klicken Sie mit der rechten Maustaste auf die Verbindung, und wählen Sie SQL-Fenster. Daraufhin wird das mit Registerkarten ausgestattete SQL-Fenster im Quelltext-Editor geöffnet. So führen Sie SQL aus: 1. Geben Sie eine gültige SQL-Anweisung oder den Namen einer Stored Procedure in das mehrzeilige Textfenster am oberen Rand des SQL-Fensters ein. 2. Klicken Sie auf SQL ausführen. Wenn die SQL-Anweisung oder Stored Procedure gültig ist, wird die Ergebnismenge im unteren Bereich des SQL-Fensters angezeigt. Anmerkung: Die SQL-Anweisung oder die Stored Procedure muss für die aktuelle Verbindung und deren Zieldatenbank ausgeführt werden. Ein SQL-Befehl lässt sich nicht für eine Datenbank ausführen, zu der keine Verbindung besteht. 3. Klicken Sie auf Gesamtes SQL löschen, um die SQL-Anweisung oder die Stored Procedure wieder aus dem mehrzeiligen Textfeld zu löschen. Siehe auch 2 ADO.NET-Komponentendesigner ( see page 23) Datenbank im Daten-Explorer durchsuchen ( see page 118) Neue Verbindung in den Daten-Explorer einfügen ( Verbindungen im Daten-Explorer bearbeiten ( see page 116) see page 125) 2.1.8 Fehler in Tabellenzuordnungen behandeln Jede Art von Vergleich zwischen einer Datenquelle und einer Arbeitsspeicherrepräsentation von Daten ist fehleranfällig. Fehler 122 2.1 Datenbankanleitungen RAD Studio für .NET Daten zwischen Datenbanken migrieren können auftreten, wenn die Datenquelle und die zugehörige Datenmenge nicht über die gleiche Anzahl von Spalten verfügen oder wenn die Spaltentypen der Datenquelle nicht mit den Spaltentypen der Datenmenge übereinstimmen. Zudem können andere interne Fehler auftreten, die sich zur Entwurfszeit nicht unterbinden lassen. Sie können mit den Eigenschaften MissingMappingAction und MissingSchemaAction auf Fehler in Tabellenzuordnungsoperationen reagieren. Mit Hilfe der Eigenschaft MissingMappingAction können Sie festlegen, wie der Datenadapter reagieren soll, wenn eine Zuordnung fehlt. Verwenden Sie die Eigenschaft MissingSchemaAction, um zu bestimmen, wie der Adapter reagieren soll, wenn der Versuch unternommen wird, Daten in eine Spalte zu schreiben, die in der Datenmenge nicht definiert ist. So legen Sie die Eigenschaft MissingMappingAction fest: 1. Nachdem Sie ein AdoDbxDataAdapter-Objekt erstellt und die Tabellenzuordnungen eingerichtet haben, klicken Sie im Objektinspektor auf die Dropdown-Liste neben der Eigenschaft MissingMappingAction. 2. Wählen Sie Passthrough, wenn der Adapter die Daten aus der Spalte der Datenquelle in eine gleichnamige Datenmengenspalte laden oder die in der Eigenschaft MissingSchemaAction angegebene Aktion ausführen soll, falls keine entsprechende Datenmengenspalte vorhanden ist. 3. Wählen Sie Ignore, wenn keine Daten geladen werden sollen, falls die Spalten der Datenquelle den Spalten der Datenmenge nicht korrekt zugeordnet sind. Dieser Fall kann eintreten, wenn die zuzuordnenden Spalten inkompatible Datentypen haben oder unterschiedliche Längen oder Fehler aufweisen. 4. Wählen Sie Error, wenn der Adapter eine Fehlerbedingung erzeugen soll, die Sie abfangen können. So legen Sie die Eigenschaft MissingSchemaAction fest: 1. Wählen Sie Add, wenn die Tabelle oder Spalte der Datenquelle der Datenmenge und deren Schema hinzugefügt werden soll. Wenn die Eigenschaft MissingMappingAction auf Passthrough und die Eigenschaft MissingSchemaAction auf Add gesetzt wird, hat dies zur Folge, dass die Tabellen- und Spaltennamen der Datenquelle zweimal in die Datenmenge eingefügt werden. 2. Wählen Sie AddWithKey, wenn die Tabelle oder Spalte der Datenquelle zusammen mit dem Primärschlüssel der Datenmenge und deren Schema hinzugefügt werden soll. 3. Wählen Sie Ignore, falls die Tabelle oder Spalte nur dann der Datenmenge hinzugefügt werden soll, wenn das Schema der Datenmenge die betreffende Tabelle oder Spalte bereits repräsentiert. Stellen Sie Ignore ein, wenn nur diejenigen Daten in die Datenmenge geladen werden sollen, die in den Tabellenzuordnungen explizit angegeben sind. Diese Einstellung kann erforderlich sein, wenn der Adapter eine Stored Procedure oder eine benutzerdefinierte SQL-Anweisung aufruft, die mehr Spalten zurückgibt als in der Datenmenge definiert sind. 4. Wählen Sie Error, wenn der Adapter eine Fehlerbedingung erzeugen soll, die Sie abfangen können. Siehe auch Überblick zu ADO.NET ( see page 15) ADO.NET-Komponentendesigner ( Tabellenzuordnungen erstellen ( see page 23) see page 120) 2 2.1.9 Daten zwischen Datenbanken migrieren Mit dem Daten-Explorer lassen sich Daten zwischen Datenbanken (und sogar Providern) schnell und einfach migrieren. Sie können mit dem Daten-Explorer eine Tabelle in einer Datenbank kopieren und diese dann in eine andere Datenbank einfügen. Dabei werden sowohl die Struktur als auch die Daten der Tabelle(n) migriert. Die Datenmigration wird von der Klasse BdpCopyTable unterstützt, die zur Entwurfszeit als Komponente in der Tool-Palette zur Verfügung steht. Mit dieser Komponente können Sie Daten programmgesteuert migrieren. Anmerkung: Die Klasse BdpCopyTable kopiert keine fremden Schlüssel oder abhängigen Objekte. 123 Verbindungen im Daten-Explorer RAD Studio für .NET 2.1 Datenbankanleitungen So migrieren Sie mehrere Tabellen: 1. Wählen Sie Ansicht Daten-Explorer. 2. Klicken Sie mit der rechten Maustaste auf einen Provider-Typ (z.B. Interbase), und wählen Sie Datenmigration. Die Seite des Daten-Explorers für die Datenmigration wird im Quelltext-Editor geöffnet. Auf dieser Seite können Sie eine oder mehrere Tabellen in einer Provider-Quellverbindung auswählen und eine Zielverbindung bestimmen, zu der die Tabellen migriert werden sollen. 3. Wählen Sie im Dropdown-Listenfeld Quellverbindung eine Verbindung aus. Die mit dieser Verbindung verknüpften Tabellen werden im Listenfeld unterhalb der Verbindung angezeigt. 4. Wählen Sie im Dropdown-Listenfeld Zielverbindung eine Verbindung aus. Die mit dieser Verbindung verknüpften Tabellen werden im Listenfeld unterhalb der Verbindung angezeigt. 5. Wählen Sie eine oder mehrere zu migrierende Tabellen in der Liste der Tabellen aus, die mit der Quellverbindung verknüpft sind. Zur Auswahl aufeinander folgender Tabellen klicken Sie auf die erste Tabelle, halten die Taste UMSCH gedrückt und klicken auf die letzte Tabelle. Um nicht aufeinander folgende Tabellen zu markieren, halten Sie die Taste STRG gedrückt und klicken auf jede auszuwählende Tabelle. 6. Klicken Sie auf die Schaltfläche Einbeziehen (>), um diese Tabellen in die Migration zur Zielverbindung aufzunehmen. Die ausgewählten Tabellen werden in der Liste der Tabellen für die Zielverbindung angezeigt. Falls eine der ausgewählten Tabellen denselben Namen wie eine in der Zielverbindung vorhandene Tabelle hat, kann sie nicht migriert werden. 7. Klicken Sie auf Ausführen, um die Tabellen in die Zielverbindung zu kopieren. Auf der Seite Datenmigration wird der Verlauf der Migrationsaktivitäten angezeigt. Hierzu gehören das Zuordnen von SQL-Typen, das Erstellen von Tabellen, das Abrufen von Daten aus der Quellverbindung sowie das Auffüllen der neuen Tabelle mit Daten in der Zielverbindung. Das Ergebnis der einzelnen Operationen wird für jede Tabelle separat ausgewiesen. 8. Klicken Sie mit der rechten Maustaste auf den Tabellenknoten im Ziel-Provider, und wählen Sie Aktualisieren. Für alle neuen Tabellen werden Knoten angezeigt. 9. Doppelklicken Sie auf einen neuen Tabellenknoten, um die Struktur und den Inhalt der Tabelle zu überprüfen. Die Tabelle wird auf einer Seite der Designoberfläche geöffnet. So migrieren Sie eine einzelne Tabelle: 1. Wählen Sie Ansicht Daten-Explorer. 2. Erweitern Sie den Tabellenknoten im Quell-Provider, und wählen Sie die Datenbanktabelle aus, in der die zu migrierenden Daten und deren Struktur enthalten sind. Damit die Provider-Knoten erweitert werden können, muss eine gültige Verbindung vorhanden sein. 3. Klicken Sie mit der rechten Maustaste auf die Tabelle, die migriert werden soll, und wählen Sie Tabelle kopieren. 4. Erweitern Sie den Tabellenknoten des Providers, in den die Daten migriert werden sollen. 5. Klicken Sie mit der rechten Maustaste auf eine Tabelle, und wählen Sie Tabelle einfügen. Das Dialogfeld Neuer Tabellenname wird geöffnet. 2 6. Geben Sie einen Namen für die neue Tabelle ein, und klicken Sie auf OK. 7. Klicken Sie mit der rechten Maustaste auf den Tabellenknoten im Ziel-Provider, und wählen Sie Aktualisieren. Für die neue Tabelle wird ein Knoten angezeigt. 8. Doppelklicken Sie auf den neuen Tabellenknoten, um die Struktur und den Inhalt der Tabelle zu überprüfen. Die Tabelle wird auf einer Seite der Designoberfläche geöffnet. Siehe auch Datenprovider für Microsoft .NET ( see page 28) Verbindungen im Daten-Explorer bearbeiten ( Datenbank im Daten-Explorer durchsuchen ( 124 see page 125) see page 118) 2.1 Datenbankanleitungen RAD Studio für .NET Verbindungen im Daten-Explorer 2.1.10 Verbindungen im Daten-Explorer bearbeiten Sie können Verbindungen im Daten-Explorer in vielerlei Hinsicht ändern. So ändern Sie Verbindungen: 1. Wählen Sie Ansicht Daten-Explorer. 2. Wählen Sie einen Provider aus. 3. Klicken Sie mit der rechten Maustaste, um ein Kontextmenü anzuzeigen, und wählen Sie die gewünschte Option aus. So aktualisieren Sie eine Verbindung: 1. Wählen Sie Ansicht Daten-Explorer. 2. Wählen Sie einen Provider aus. 3. Klicken Sie mit der rechten Maustaste, um ein Kontextmenü einzublenden. 4. Wählen Sie Aktualisieren. Daraufhin werden alle für den ausgewählten Provider definierten Verbindungen erneut initialisiert. So löschen Sie eine Verbindung: 1. Wählen Sie Ansicht Daten-Explorer. 2. Wählen Sie eine Verbindung aus. 3. Klicken Sie mit der rechten Maustaste, um ein Kontextmenü einzublenden. 4. Wählen Sie Verbindung löschen. In einer Bestätigungsmeldung werden Sie gefragt, ob die Verbindung entfernt werden soll. 5. Klicken Sie auf OK. So ändern Sie eine Verbindung: 1. Wählen Sie Ansicht Daten-Explorer. 2. Wählen Sie eine Verbindung aus. 3. Klicken Sie mit der rechten Maustaste, um ein Kontextmenü einzublenden. 4. Wählen Sie Verbindung bearbeiten. Das Dialogfeld Verbindungseditor wird geöffnet. 5. Nehmen Sie die Änderungen an den betreffenden Werten im Editor vor. 6. Klicken Sie auf OK. So schließen Sie eine Verbindung: 2 1. Wählen Sie Ansicht Daten-Explorer. 2. Wählen Sie eine Verbindung aus. 3. Klicken Sie mit der rechten Maustaste, um ein Kontextmenü einzublenden. 4. Wählen Sie Verbindung schließen. Ist die Verbindung geöffnet, wird sie durch diesen Schritt geschlossen. Anmerkung: Steht der Befehl Verbindung schließen im Menü nicht zur Verfügung, ist die Verbindung nicht geöffnet. So benennen Sie eine Verbindung um: 1. Wählen Sie Ansicht Daten-Explorer. 2. Wählen Sie eine Verbindung aus. 125 Datenbankverbindungen bearbeiten RAD Studio für .NET 2.1 Datenbankanleitungen 3. Klicken Sie mit der rechten Maustaste, um ein Kontextmenü einzublenden. 4. Wählen Sie Verbindung umbenennen. Daraufhin wird das Dialogfeld Verbindung umbenennen angezeigt. 5. Geben Sie einen neuen Namen ein. 6. Klicken Sie auf OK. Im Daten-Explorer wird die Verbindung mit dem neuen Namen angezeigt. Siehe auch ADO.NET-Komponentendesigner ( see page 23) Datenbank im Daten-Explorer durchsuchen ( SQL im Daten-Explorer ausführen ( see page 118) see page 122) Neue Verbindung in den Daten-Explorer einfügen ( see page 116) 2.1.11 Datenbankverbindungen bearbeiten Die grundlegenden Elemente eines Verbindungsstrings sind meist für alle Datenbanktypen gleich. Allerdings gilt für jeden Datenbanktyp eine leicht veränderte Syntax des Verbindungsstrings. In diesem Abschnitt werden diese Unterschiede beschrieben. So bearbeiten Sie verschiedene Typen von Datenbankverbindungen: 1. Klicken Sie in der IDE auf die Registerkarte Daten-Explorer. 2. Wählen Sie einen Datenbanktyp aus. 3. Klicken Sie mit der rechten Maustaste, um das Popup-Menü einzublenden. 4. Wählen Sie Verbindung bearbeiten. Das Dialogfeld Verbindungseditor wird angezeigt. Die Eigenschaften im Verbindungseditor sind in drei Kategorien gegliedert: Verbindungen, Optionen und Providereinstellungen. Die Verbindungsoptionen bestimmen die Datenbank- und Authentifizierungsparameter. Der Bereich mit den Optionen enthält verschiedene datenbankspezifische Datenbankoptionen, einschließlich der Typen für die Transaktionsisolation. Im Bereich für Provider-Einstellungen sind die Assemblierungen und die Client-Bibliotheken enthalten, die benötigt werden, um die Verbindung zu der betreffenden Datenbank herzustellen. Anmerkung: Bei allen Anleitungen in diesem Abschnitt wird vorausgesetzt, dass bereits ein Datenbank-Client und -Server oder beides installiert ist und dass die Datenbankinstanz läuft. So ändern Sie eine InterBase-Verbindung: 2 1. Geben Sie entweder den Datenbanknamen ein, oder klicken Sie auf die Ellipsenschaltfläche, und navigieren Sie zu der Datenbank auf einem lokalen oder Netzlaufwerk. Die mitgelieferten Datenbanken befinden sich standardmäßig im Verzeichnis C:\Programme\Gemeinsame Dateien\CodeGear Shared\Data. 2. Geben Sie das Passwort und den Benutzernamen ein. Standardmäßig sind dies masterkey und sysdba. 3. Legen Sie bei Bedarf die folgenden Optionen fest. Die Standardwerte sind in der folgenden Tabelle enthalten. Option Beschreibung Vorgabe CommitRetain Schließt die aktuelle Transaktion unter Beibehaltung des Transaktionskontextes. False LoginPrompt Bestimmt, ob der Benutzer jedes Mal zur Anmeldung aufgefordert wird, wenn die False Anwendung versucht, eine Verbindung zur Datenbank herzustellen. QuoteObjects Legt fest, dass Tabellennamen, Spaltennamen und andere Objekte in False Anführungszeichen oder andere Begrenzungszeichen eingeschlossen werden müssen, wenn sie in eine SQL-Anweisung aufgenommen werden. Dies ist für Datenbanken erforderlich, bei denen Leerzeichen in Namen zulässig sind, etwa bei MS Access. 126 2.1 Datenbankanleitungen RAD Studio für .NET Datenbankverbindungen bearbeiten RoleName Wenn für Sie in der Datenbank eine Rolle vorgesehen ist, können Sie den myRole Rollennamen hier eingeben. Diese Rolle ist prinzipiell ein Authentifizierungsalias, der Ihre Identität mit Ihren Zugriffsrechten kombiniert. ServerCharSet Bezeichnet den Zeichensatz auf dem Server. — SQLDialect Ermittelt den vom Client verwendeten SQL-Dialekt oder legt ihn fest. 3 TransactionIsolation Beim Lesen der Daten werden gemeinsame Sperren aufrechterhalten, um "Dirty ReadCommitted Reads" auszuschließen. Die Daten können aber vor Beendigung der Transaktion geändert werden, was nicht wiederholbare Lesezugriffe oder Phantomdaten zur Folge hat. Damit wird der Wert für die Eigenschaft TAdoDbxTransaction. IsolationLevel bestimmt. WaitOnLocks Legt fest, dass eine Transaktion auf den Zugriff warten muss, wenn sie auf einen False Sperrkonflikt mit einer anderen Transaktion trifft. 4. Für die folgenden Provider-Einstellungen sollten Sie die Standards übernehmen können: Option Vorgabe Assemblierung Borland.Data.Interbase,Version=Aktuelle Produktversion,Culture=neutral,PublicKeyToken=Token # Provider Interbase VendorClient gds32.dll 5. Klicken Sie auf Test, um die Verbindung zu überprüfen. 6. Klicken Sie auf OK, um den Verbindungsstring zu speichern. Anmerkung: Wenn Sie ASP.NET-Anwendungen schreiben und die ASP.NET Web Forms zu Testzwecken lokal ausführen, kann es notwendig sein, in die Pfadanweisung, die auf die Datenbank verweist, die Position localhost: aufzunehmen. Der oben genannte Pfad würde dann beispielsweise so aussehen: localhost:C:\Programme\Gemeinsame Dateien\CodeGear Shared\Data\employee.gdb. Anmerkung: Ihr Verbindungsstring sollte ungefähr so aussehen: database=C:\Programme\Gemeinsame Dateien\CodeGear Shared\Data\EMPLOYEE.GDB; assembly=Borland.Data.Interbase,Version=2.0.0.0,Culture=neutral,PublicKeyToken=91d62ebb5b0d1b1b ; vendorclient=gds32.dll;provider=Interbase;username=sysdba;password=masterkey So ändern Sie eine MS SQL Server-Verbindung: 1. Geben Sie den Datenbanknamen in das Feld Datenbank des Verbindungseditors ein. Verwenden Sie beispielsweise eine der MS SQL Server-Beispieldatenbanken wie Pubs oder Northwind. Die Dateinamenserweiterung muss nicht an den Namen angefügt werden. 2. Geben Sie den Hostnamen ein. Wenn Sie einen lokalen Datenbankserver verwenden, geben Sie in dieses Feld (local) ein. 3. Wenn Sie die BS-Authentifizierung wünschen, setzen Sie OSAuthentication auf True. 4. Soll die Datenbankauthentifizierung verwendet werden, geben Sie das Passwort und den Benutzernamen in die betreffenden Felder ein. Per Voreinstellung lautet der Benutzername der SQL Server-Datenbank sa. 5. Ändern Sie bei Bedarf die Datenbankoptionen. Die Standardwerte sind in der folgenden Tabelle enthalten. Option Beschreibung Vorgabe BlobSize Die obere Grenze eines BLOB-Feldes. 1024 LoginPrompt Bestimmt, ob der Benutzer jedes Mal zur Anmeldung aufgefordert wird, wenn die False Anwendung versucht, eine Verbindung zur Datenbank herzustellen. 127 2 Datenbankverbindungen bearbeiten QuoteObjects RAD Studio für .NET 2.1 Datenbankanleitungen Legt fest, dass Tabellennamen, Spaltennamen und andere Objekte in False Anführungszeichen oder andere Begrenzungszeichen eingeschlossen werden müssen, wenn sie in eine SQL-Anweisung aufgenommen werden. Dies ist für Datenbanken erforderlich, bei denen Leerzeichen in Namen zulässig sind, etwa bei MS Access. TransactionIsolation Beim Lesen der Daten werden gemeinsame Sperren aufrechterhalten, um "Dirty ReadCommitted Reads" auszuschließen. Die Daten können aber vor Beendigung der Transaktion geändert werden, was nicht wiederholbare Lesezugriffe oder Phantomdaten zur Folge hat. Damit wird der Wert für die Eigenschaft TAdoDbxTransaction. IsolationLevel bestimmt. 6. Für die folgenden Provider-Einstellungen sollten Sie die Standards übernehmen können: Option Vorgabe Assemblierung Borland.Data.Mssql,Version=Aktuelle # Provider MSSQL VendorClient sqloledb.dll Produktversion,Culture=neutral,PublicKeyToken=Token 7. Klicken Sie auf Test, um die Verbindung zu überprüfen. 8. Klicken Sie auf OK, um den Verbindungsstring zu speichern. Anmerkung: Wenn Sie ASP.NET-Anwendungen schreiben und die ASP.NET Web Forms zu Testzwecken lokal ausführen, kann es notwendig sein, in die Pfadanweisung, die auf die Datenbank verweist, die Position localhost: vorne an den Pfad anzufügen. Anmerkung: Ihr Verbindungsstring sollte ungefähr so aussehen: assembly=Borland.Data.Mssql,Version=2.0.0.0,Culture=neutral,PublicKeyToken=91d62ebb5b0d1b1b; vendorclient=sqloledb.dll;osauthentication=True;database=Pubs;username=;hostname=(local);passwo rd=; provider=MSSQL So ändern Sie eine DB2-Verbindung: 1. Geben Sie den Pfad zur Datenbank ein. 2. Geben Sie das Passwort und den Benutzernamen in die vorgesehenen Felder ein. 3. Legen Sie bei Bedarf die folgenden Datenbankoptionen fest. Die Standardwerte sind in der folgenden Tabelle enthalten. 2 Option Beschreibung Vorgabe LoginPrompt Bestimmt, ob der Benutzer jedes Mal zur Anmeldung aufgefordert wird, wenn die False Anwendung versucht, eine Verbindung zur Datenbank herzustellen. QuoteObjects Legt fest, dass Tabellennamen, Spaltennamen und andere Objekte in False Anführungszeichen oder andere Begrenzungszeichen eingeschlossen werden müssen, wenn sie in eine SQL-Anweisung aufgenommen werden. Dies ist für Datenbanken erforderlich, bei denen Leerzeichen in Namen zulässig sind. TransactionIsolation Beim Lesen der Daten werden gemeinsame Sperren aufrechterhalten, um "Dirty ReadCommitted Reads" auszuschließen. Die Daten können aber vor Beendigung der Transaktion geändert werden, was nicht wiederholbare Lesezugriffe oder Phantomdaten zur Folge hat. Damit wird der Wert für die Eigenschaft TAdoDbxTransaction. IsolationLevel bestimmt. 4. Für die folgenden Provider-Einstellungen sollten Sie die Standards übernehmen können: 128 2.1 Datenbankanleitungen RAD Studio für .NET Option Vorgabe Assemblierung Borland.Data.Db2,Version=Aktuelle # Provider DB2 VendorClient db2cli.dll Datenbankverbindungen bearbeiten Produktversion,Culture=neutral,PublicKeyToken=Token 5. Klicken Sie auf Test, um die Verbindung zu überprüfen. 6. Klicken Sie auf OK, um den Verbindungsstring zu speichern. So ändern Sie eine Oracle-Verbindung: 1. Geben Sie den Pfad zur Datenbank ein. 2. Wenn Sie die BS-Authentifizierung wünschen, setzen Sie OSAuthentication auf True. Dies bedeutet, dass das System zur Anmeldung bei der Datenbank den Benutzernamen und das Passwort des lokalen Systems verwendet. 3. Soll die Datenbankauthentifizierung verwendet werden, geben Sie das Passwort und den Benutzernamen in die betreffenden Felder ein. Der typische Oracle-Benutzername und das Passwort für die Beispieldatenbank lauten SCOTT und TIGER. 4. Legen Sie bei Bedarf die folgenden Datenbankoptionen fest. Die Standardwerte sind in der folgenden Tabelle enthalten. Option Beschreibung Vorgabe LoginPrompt Bestimmt, ob der Benutzer jedes Mal zur Anmeldung aufgefordert wird, wenn die False Anwendung versucht, eine Verbindung zur Datenbank herzustellen. QuoteObjects Legt fest, dass Tabellennamen, Spaltennamen und andere Objekte in False Anführungszeichen oder andere Begrenzungszeichen eingeschlossen werden müssen, wenn sie in eine SQL-Anweisung aufgenommen werden. Dies ist für Datenbanken erforderlich, bei denen Leerzeichen in Namen zulässig sind. TransactionIsolation Beim Lesen der Daten werden gemeinsame Sperren aufrechterhalten, um "Dirty ReadCommitted Reads" auszuschließen. Die Daten können aber vor Beendigung der Transaktion geändert werden, was nicht wiederholbare Lesezugriffe oder Phantomdaten zur Folge hat. Damit wird der Wert für die Eigenschaft TAdoDbxTransaction. IsolationLevel bestimmt. 5. Für die folgenden Provider-Einstellungen sollten Sie die Standards übernehmen können: Option Vorgabe Assemblierung Borland.Data.Oracle,Version=Aktuelle Produktversion,Culture=neutral,PublicKeyToken=Token # Provider Oracle VendorClient oci.dll 2 6. Klicken Sie auf Test, um die Verbindung zu überprüfen. 7. Klicken Sie auf OK, um den Verbindungsstring zu speichern. So ändern Sie eine MS Access-Verbindung: 1. Geben Sie entweder den Datenbanknamen ein, oder klicken Sie auf die Ellipsenschaltfläche, und navigieren Sie zu der Datenbank auf einem lokalen oder Netzlaufwerk. Wenn das Office Component Toolkit installiert ist, finden Sie Northwind in C:\Programme\Office Component Toolpack\Data\Northwind.mdb. 2. Geben Sie das Passwort und den Benutzernamen ein. Standardmäßig können Sie als Benutzernamen admin eingeben und das Passwortfeld leer lassen. 3. Legen Sie bei Bedarf die folgenden Datenbankoptionen fest. Die Standardwerte sind in der folgenden Tabelle enthalten. 129 Datenbankverbindungen bearbeiten RAD Studio für .NET 2.1 Datenbankanleitungen Option Beschreibung Vorgabe BlobSize Die obere Grenze eines BLOB-Feldes. 1024 LoginPrompt Bestimmt, ob der Benutzer jedes Mal zur Anmeldung aufgefordert wird, wenn die False Anwendung versucht, eine Verbindung zur Datenbank herzustellen. QuoteObjects Legt fest, dass Tabellennamen, Spaltennamen und andere Objekte in False Anführungszeichen oder andere Begrenzungszeichen eingeschlossen werden müssen, wenn sie in eine SQL-Anweisung aufgenommen werden. Dies ist für Datenbanken erforderlich, bei denen Leerzeichen in Namen zulässig sind, etwa bei MS Access. TransactionIsolation Beim Lesen der Daten werden gemeinsame Sperren aufrechterhalten, um "Dirty ReadCommitted Reads" auszuschließen. Die Daten können aber vor Beendigung der Transaktion geändert werden, was nicht wiederholbare Lesezugriffe oder Phantomdaten zur Folge hat. Damit wird der Wert für die Eigenschaft TAdoDbxTransaction. IsolationLevel bestimmt. 4. Für die folgenden Provider-Einstellungen sollten Sie die Standards übernehmen können: Option Vorgabe Assemblierung Borland.Data.Msacc,Version=Aktuelle Produktversion,Culture=neutral,PublicKeyToken=Token # Provider MSAccess VendorClient msjet40.dll 5. Klicken Sie auf Test, um die Verbindung zu überprüfen. 6. Klicken Sie auf OK, um den Verbindungsstring zu speichern. Anmerkung: Ihr Verbindungsstring sollte ungefähr so aussehen: database=C:\Programme\Office Component Toolpack\Data\Northwind.mdb; assembly=Borland.Data.Msacc,Version=2.0.0.0,Culture=neutral,PublicKeyToken=91d62ebb5b0d1b1b; vendorclient=msjet40.dll;provider=MSAccess;username=admin;password= So ändern Sie eine Sybase-Verbindung: 1. Geben Sie den Pfad zur Datenbank ein. 2. Geben Sie das Passwort und den Benutzernamen in die vorgesehenen Felder ein. 3. Legen Sie bei Bedarf die folgenden Datenbankoptionen fest. Die Standardwerte sind in der folgenden Tabelle enthalten. 2 Option Beschreibung Vorgabe BlobSize Die obere Grenze eines BLOB-Feldes. 1024 ClientAppName Name der Client-Anwendung, der von der Zwischenschicht-Anwendung festgelegt — wird. ClientHostName Client-Hostname, der von der Zwischenschicht-Anwendung festgelegt wird. LoginPrompt Bestimmt, ob der Benutzer jedes Mal zur Anmeldung aufgefordert wird, wenn die False Anwendung versucht, eine Verbindung zur Datenbank herzustellen. PacketSize Gibt die Anzahl der Bytes pro Netzwerkpaket an, die vom Datenbankserver zum Client 512 übertragen werden. 130 — 2.1 Datenbankanleitungen QuoteObjects RAD Studio für .NET Eine Datenbankanwendung für die Legt fest, dass Tabellennamen, Spaltennamen und andere Objekte in False Anführungszeichen oder andere Begrenzungszeichen eingeschlossen werden müssen, wenn sie in eine SQL-Anweisung aufgenommen werden. Dies ist für Datenbanken erforderlich, bei denen Leerzeichen in Namen zulässig sind, etwa bei MS Access. TransactionIsolation Beim Lesen der Daten werden gemeinsame Sperren aufrechterhalten, um "Dirty ReadCommitted Reads" auszuschließen. Die Daten können aber vor Beendigung der Transaktion geändert werden, was nicht wiederholbare Lesezugriffe oder Phantomdaten zur Folge hat. Damit wird der Wert für die Eigenschaft TAdoDbxTransaction. IsolationLevel bestimmt. 4. Für die folgenden Provider-Einstellungen sollten Sie die Standards übernehmen können: Option Vorgabe Assemblierung Borland.Data.Sybase,Version=Aktuelle Produktversion,Culture=neutral,PublicKeyToken=Token # Provider Sybase VendorClient libct.dll 5. Klicken Sie auf Test, um die Verbindung zu überprüfen. 6. Klicken Sie auf OK, um den Verbindungsstring zu speichern. Anmerkung: Ihr Verbindungsstring sollte ungefähr so aussehen: assembly=Borland.Data.Sybase,Version=2.0.0.0,Culture=neutral, PublicKeyToken=91d62ebb5b0d1b1b;vendorclient=libct.dll;database=Pubs; username=admin;hostname=host1;password=;provider=Sybase Siehe auch Überblick zu ADO.NET ( see page 15) Datenbank-Provider für .NET ( see page 28) ADO.NET-Komponentendesigner ( see page 23) ASP.NET-Datenbankanwendung erstellen ( see page 187) Datenbank-Projekte mit dem Daten-Explorer erstellen ( Parameterübergabe in einer Datenbankanwendung ( see page 120) see page 134) 2 2.1.12 Eine Datenbankanwendung für die Auflösung in mehrere Tabellen erstellen RAD Studio unterstützt die Auflösung in mehrere Tabellen mit BDP.NET. Zur Bereitstellung und Auflösung einer .NET-Datenmenge aus mehreren heterogenen Datenquellen dienen speziell die beiden Komponenten DataSync und DataHub. Zusätzlich unterstützen diese Komponenten die Anzeige von Live-Daten zur Entwurfszeit und stellen Haupt-/Detaildaten bereit und lösen sie auf, indem optimales SQL für die Auflösung in BDP-Datenquellen generiert wird. Die DataHub-Komponente dient als Bindeglied zwischen einer DataSet- und einer DataSync-Komponente. Der DataPort-Eigenschaft einer DataHub-Komponente kann eine beliebige Implementierung von IDataProvider zugewiesen werden. DataSync implementiert eine IDataProvider-Komponente und verfügt über eine Providers-Sammlung mit .NET-Daten-Providern, 131 Eine Datenbankanwendung für die RAD Studio für .NET 2.1 Datenbankanleitungen die IDbDataAdapter implementieren. Die Methode GetData für DataSync iteriert durch alle Daten-Provider in der Sammlung und gibt eine Datenmenge zurück. SaveData löst Änderungen an der Datenmenge über die DataProvider-Sammlung wieder zurück in die Datenbank auf. Beim Zurückschreiben der Änderungen über ein BdpDataAdapter-Objekt erzeugt der Resolver optimales SQL. Bei Nicht-BDP-Daten-Providern wird der entsprechende CommandBuilder verwendet. Die Erstellung einer Datenbankanwendung zur Auflösung in mehrere Tabellen umfasst folgende Schritte: 1. Ein einfaches Datenbankprojekt im Daten-Explorer mit mehreren BdpDataAdapter-Objekten erstellen, um eine Verbindung zu mehreren Providern herzustellen. 2. Eine DataSync-Komponente hinzufügen und konfigurieren, um eine Verbindung zu den Providern einzurichten. 3. Eine DataHub-Komponente hinzufügen und konfigurieren, um die DataSync-Komponente mit einer Datenmenge zu verbinden. So erstellen Sie ein Datenbankprojekt mit dem Daten-Explorer: 1. Wählen Sie Datei Neu Windows Forms-Anwendung (für Delphi für .NET). Der Windows Forms-Designer wird angezeigt. 2. Wählen Sie Ansicht Daten-Explorer, um auf den Daten-Explorer zuzugreifen. 3. Erweitern Sie die Daten-Explorerstruktur, um die gewünschten Provider und Datenbanktabellen anzuzeigen. Damit die Provider-Knoten erweitert werden können, muss eine Live-Verbindung vorhanden sein. Wenn dies nicht der Fall ist, müssen Sie möglicherweise den Verbindungsstring ändern. 4. Ziehen Sie Tabellen von einem oder mehreren Providern in das Formular. Für jede in das Formular gezogene Tabelle wird in der Komponentenablage eine BdpConnection- und eine BdpDataAdapter-Komponente angezeigt. Wenn Sie mehrere Tabellen desselben Providers einfügen, ist nur eine BdpConnection-Komponente für diesen Provider erforderlich. Alle anderen Komponenten dieser Art können gelöscht werden. 5. Konfigurieren Sie jede BdpDataAdapter-Komponente. Die Eigenschaft Active oder DataSet muss nicht gesetzt werden, da die Datenmenge über die DataHub-Komponente gefüllt wird. 6. Fügen Sie dem Formular eine DataSet-Komponente aus der Kategorie Datenkomponenten der Tool-Palette hinzu. 7. Fügen Sie dem Formular eine DataGrid-Komponente aus der Kategorie Datensteuerung der Tool-Palette hinzu, und konfigurieren Sie diese. Weisen Sie der Eigenschaft DataSource der DataGrid-Komponente den Namen der hinzugefügten Datenmengenkomponente zu (beispielsweise dataSet1). So erstellen und konfigurieren Sie eine DataSync-Komponente: 1. Ziehen Sie eine DataSync-Komponente aus der Kategorie Borland Daten-Provider der Tool-Palette in das Formular. 2. Wählen Sie in der Komponentenablage die DataSync-Komponente aus. 3. Wählen Sie im Objektinspektor die Eigenschaft Providers aus, und klicken Sie auf die Ellipsen-Schaltfläche, um den Editor für Daten-Provider-Sammlungen zu öffnen. 4. Fügen Sie in diesem Editor jeder Tabelle, die bereitgestellt und aufgelöst werden soll, einen Daten-Provider hinzu. Für jede BdpDataAdapter-Komponente im Projekt muss ein Daten-Provider vorhanden sein. 2 5. Wählen Sie für jeden Daten-Provider im Bereich Elemente den Eintrag Daten-Provider, und weisen Sie der Eigenschaft DataAdapter die entsprechende BdpDataAdapter-Komponente zu. 6. Wenn alle Daten-Provider konfiguriert sind, klicken Sie auf OK, um den Editor für Daten-Provider-Sammlungen zu schließen. 7. Legen Sie im Objektinspektor über die Eigenschaft CommitBehavior fest, wie Fehler während der Auflösung behandelt werden sollen. Für die Auflösungslogik stehen drei Optionen zur Verfügung: • Atomic: Es wird versucht, für jeden Provider Transaktionen auszuführen. Wenn eine Transaktion fehlschlägt, werden keine weiteren Versuche unternommen, und alle vorhergehenden Transaktionen werden rückgängig gemacht. Falls keine fehlgeschlagenen Transaktionen vorhanden sind, werden alle Transaktionen eingetragen. • Individual: Es wird versucht, für einen Provider eine Transaktion durchzuführen. Ist der Versuch erfolgreich, wird die Transaktion eingetragen. Ein weiterer Transaktionsversuch wird gestartet. Wenn dieser erfolgreich ist, wird die Transaktion eingetragen. Dieser Vorgang wird fortgesetzt, bis alle Transaktionen ausgeführt sind. Wenn eine Transaktion für einen Provider fehlschlägt, wird sie zurückgesetzt, und es werden keine weiteren Transaktionsversuche unternommen. 132 2.1 Datenbankanleitungen RAD Studio für .NET Parameterübergabe in einer • ForceIndividual: Es wird versucht, für einen Provider eine Transaktion durchzuführen. Ist der Versuch erfolgreich, wird die Transaktion eingetragen. Ein weiterer Transaktionsversuch wird gestartet. Wenn dieser erfolgreich ist, wird die Transaktion eingetragen. Dieser Vorgang wird fortgesetzt, bis alle Transaktionen ausgeführt sind. Wenn eine Transaktion für einen Provider fehlschlägt, wird sie zurückgesetzt, und der nächste Versuch wird gestartet. So erstellen und konfigurieren Sie eine DataHub-Komponente: 1. Ziehen Sie eine DataHub-Komponente aus der Kategorie Borland Daten-Provider der Tool-Palette in das Formular. 2. Wählen Sie in der Komponentenablage die DataHub-Komponente aus. 3. Weisen Sie im Objektinspektor der Eigenschaft DataPort die hinzugefügte DataSync-Komponente zu (beispielsweise DataSync1). 4. Weisen Sie der Eigenschaft DataSet die hinzugefügte DataSet-Komponente zu (beispielsweise dataSet1). 5. Wählen Sie Start Start. Die Anwendung wird compiliert und zeigt ein Windows Form mit einem Datengitter an. Siehe auch Überblick zu ADO.NET ( Daten-Provider für .NET ( see page 15) see page 28) ADO.NET-Komponentendesigner ( see page 23) Eine verteilte Datenbankanwendung erstellen ( see page 147) 2.1.13 Parameterübergabe in einer Datenbankanwendung Die folgende Anleitung beschreibt eine einfache Anwendung, die es Ihnen ermöglicht, zur Laufzeit einen Parameterwert an eine Datenmenge zu übergeben. Parameter ermöglichen die Erstellung von Anwendungen, bei denen zur Entwurfszeit nicht bekannt ist, welche Daten der Benutzer zur Laufzeit im Einzelnen eingeben wird. Im folgenden Beispiel wird unterstellt, dass Sie bereits die Interbase-Beispieldatenbank EMPLOYEE.GDB eingerichtet und eine entsprechende Verbindung definiert haben. In diesem Beispiel wird zur Veranschaulichung die Standardverbindungskomponente IBConn1 mit dem Standardspeicherort verwendet. Ihre Datenbank befindet sich möglicherweise in einem anderen Verzeichnis. So übergeben Sie einen Parameter: 1. Erzeugen Sie einen Datenadapter und eine Verbindung zur Interbase-Datenbank employee.gdb. 2. Fügen Sie ein Textfeld-Steuerelement, ein Schaltflächen-Steuerelement und ein DataGrid-Steuerelement in das Formular ein. 3. Konfigurieren Sie den Datenadapter. 4. So fügen Sie dem Datenadapter einen Parameter hinzu: 2 5. Konfigurieren Sie die DataGrid-Komponente. 6. Fügen Sie Quelltext für das Klick-Ereignis der Schaltfläche hinzu. 7. Compilieren Sie die Anwendung, und führen Sie sie aus. So erstellen Sie einen Datenadapter und eine Verbindung: 1. Wählen Sie Datei Neu Windows Forms-Anwendung (für Delphi für .NET oder C#). Der Windows Forms-Designer wird angezeigt. 2. Klicken Sie auf die Registerkarte Daten-Explorer, und erweitern Sie die Baumstruktur, um die Verbindung IBConn1 unter dem Knoten Interbase ausfindig zu machen. 3. Ziehen Sie die Tabelle EMPLOYEE in das das Windows Form. Daraufhin werden ein BdpDataAdapter- und ein BdpConnection-Objekt erstellt, die durch entsprechende Symbole in der Komponentenablage repräsentiert werden. 133 Parameterübergabe in einer RAD Studio für .NET 2.1 Datenbankanleitungen 4. Markieren Sie das Datenadapter-Symbol, und klicken Sie dann auf das Designer Verb Datenadapter konfigurieren, das am unteren Rand des Objektinspektors im Bereich Designer Verb angezeigt wird. Das Dialogfeld Datenadapter-Konfiguration wird geöffnet. 5. Ändern Sie die SQL-Anweisung, die auf der Registerkarte Auswählen dieses Dialogfelds angezeigt wird, wie folgt ab: SELECT EMP_NO, FIRST_NAME, LAST_NAME, SALARY FROM EMPLOYEE WHERE FIRST_NAME = ?; Wie Sie sehen, wird mit dieser Anweisung die Anzahl der Felder begrenzt. Die Anweisung enthält in der Where-Klausel zudem das Zeichen ?. Das Zeichen ? ist ein Platzhalter für den Parameterwert, der von der Anwendung zur Laufzeit übergeben wird. Es gibt mindestens zwei Gründe, die dafür sprechen, Parameter auf diese Weise zu verwenden. Der erste Grund ist, dass eine Anwendung so in die Lage versetzt werden kann, die Daten in den ausgewählten Spalten mehrfach abzurufen, zur Erfüllung der Bedingung aber einen anderen Wert zu verwenden. Der zweite Grund besteht darin, dass Sie in der Entwurfsphase die tatsächlichen Werte möglicherweise gar nicht kennen. Sie können sich vorstellen, wie beschränkt die Anwendung wäre, wenn nur die Daten abgerufen würden, für die die Bedingung FIRST_NAME = 'Bob' erfüllt ist. 6. Klicken Sie auf die Registerkarte DataSet. 7. Klicken Sie auf Neues DataSet. 8. Klicken Sie auf OK. Damit wird die Datenmenge erzeugt, die die Abfrage repräsentiert. So fügen Sie dem Datenadapter einen Parameter hinzu: 1. Wählen Sie das Datenadapter-Symbol aus, erweitern Sie dann die Eigenschaften unter SelectCommand im Bereich Füllen des Objektinspektors. Die Select-Anweisung sollte nun in der Dropdown-Liste der Eigenschaft SelectCommand angezeigt werden. 2. Ändern Sie die Eigenschaft ParameterCount in 1. 3. Klicken Sie auf den Eintrag (Auflistung) neben der Eigenschaft Parameters. Das Dialogfeld BdpParameter-Auflistungs-Editor wird angezeigt. 4. Klicken Sie auf Hinzufügen, um einen neuen Parameter hinzuzufügen. 5. Benennen Sie den Parameter in emp um. 6. Stellen Sie BdpType auf String, DbType auf Object, Direction auf Input, SourceColumn auf FIRST_NAME und ParameterName auf emp ein. 7. Klicken Sie auf OK. 8. Stellen Sie im Objektinspektor die Eigenschaft Active unter Live Data auf True ein. So fügen Sie dem Formular Steuerelemente hinzu: 1. Ziehen Sie ein TextBox-Steuerelement mit der Maus in das Formular. 2. Ziehen Sie ein Button-Steuerelement mit der Maus in das Formular. 3. Ändern Sie die Eigenschaft Text des Button-Elements in Get Info. 2 4. Ziehen Sie ein DataGrid-Steuerelement mit der Maus in das Formular. 5. Ordnen Sie die Steuerelemente so an, wie sie angezeigt werden sollen, und stellen Sie hierbei sicher, dass das DataGrid-Element ausreichend Raum für die Daten der vier Felder bietet. So konfigurieren Sie die DataGrid-Komponente: 1. Wählen Sie die DataGrid-Komponente aus. 2. Weisen Sie der Eigenschaft DataSource den Namen der Datenmenge (per Vorgabe DataSet1) zu. 3. Stellen Sie die Eigenschaft DataMember auf Table1 ein. Daraufhin sollten die Namen der Spalten angezeigt werden, die in der SQL-Anweisung genannt sind, die Sie in den Datenadapter eingegebenen haben. So fügen Sie Quelltext für das Klick-Ereignis der Schaltfläche hinzu: 1. Doppelklicken Sie auf die Schaltfläche, um den Quelltexteditor zu öffnen. 134 2.1 Datenbankanleitungen RAD Studio für .NET Datenadapter-Vorschau verwenden 2. Fügen Sie folgenden Code in den Quelltextblock für die Ereignisbehandlungsroutine button1_Click ein: bdpSelectCommand1.Close(); /* Damit wird der Befehl geschlossen, um sicherzustellen, dass der Parameter an */ /* den aktuellen bdpSelectCommand übergeben wird. */ bdpDataAdapter1.Active = false; /* Damit wird der Datenadapter geleert, so dass keine alten Daten vorhanden sind */ bdpSelectCommand1.Parameters["emp"].Value = textBox1.Text; /* Der Parameterwert wird auf den Inhalt des Textfelds gesetzt. */ bdpDataAdapter1.Active = true; /* Der Datenadapter wird reaktiviert, so dass im Datengitter aktualisierte Daten angezeigt werden. */ Self.bdpSelectCommand1.Close(); /* Damit wird der Befehl geschlossen, um sicherzustellen, dass der Parameter an */ /* den aktuellen bdpSelectCommand übergeben wird. */ Self.BdpDataAdapter1.Active := false; /* Damit wird der Datenadapter geleert, so dass keine alten Daten vorhanden sind */ Self.bdpSelectCommand1.Parameters['emp'].Value := textBox1.Text; /* Der Parameterwert wird auf den Inhalt des Textfelds gesetzt. */ Self.BdpDataAdapter1.Active := true; /* Der Datenadapter wird reaktiviert, so dass im Datengitter aktualisierte Daten angezeigt werden. */ Falls Sie den Namen eines dieser Elemente geändert haben, müssen Sie diese Befehle entsprechend abändern. 3. Speichern Sie die Anwendung. So compilieren Sie die Anwendung und führen sie aus: 1. Drücken Sie UMSCHALT + F9, um die Anwendung zu compilieren. 2. Drücken Sie F9, um die Anwendung auszuführen. 3. Geben Sie in das Textfeld einen der folgenden Namen ein: John, Robert, Roger, Kim, Terri, Katherine oder Ann. 4. Klicken Sie auf die Schaltfläche. Daraufhin werden im Datengitter Personalnummer (EMP_NO), Vorname (FIRST_NAME), Nachname (LAST_NAME) und Gehalt (SALARY) des Mitarbeiters mit dem angegebenen Vornamen angezeigt. Falls mehrere Personen mit demselben Vornamen vorhanden sind, werden im Datengitter alle Mitarbeiter mit dem betreffenden Vornamen angezeigt. Siehe auch Überblick zu ADO.NET ( see page 15) Datenprovider für Microsoft .NET ( see page 28) 2 Datenbankanwendung mit Windows Forms erstellen 2.1.14 Datenadapter-Vorschau verwenden CodeGear RAD Studio enthält ein Tool, das die Kommunikation zwischen Datenquelle und Datenmenge ermöglicht. Sie können in der Datenadapter-Vorschau angeben, welche Daten aus der Datenmenge übertragen werden sollen - entweder in Form von SQL-Anweisungen oder Stored Procedures, die zur Eingabe in die Datenbank oder zum Lesen aus der Datenbank aufgerufen werden. 135 Anweisungstext-Editor verwenden RAD Studio für .NET 2.1 Datenbankanleitungen So verwenden Sie die Datenadapter-Vorschau: 1. Nachdem Sie die Komponente BdpDataAdapter in das Design gezogen haben, klicken Sie auf das Designer Verb Datenadapter konfigurieren, das am unteren Rand des Objektinspektors angezeigt wird. 2. Aktivieren Sie die Registerkarte Vorschau, um die Datenadapter-Vorschau einzublenden. 3. Soll die Anzahl der eingeblendeten Zeilen beschränkt werden, aktivieren Sie das Kontrollkästchen Zeilen begrenzen. 4. Geben Sie die Anzahl der Zeilen, aus denen die Ergebnismenge bestehen soll, in das Textfeld Abzurufende Zeilen ein. 5. Klicken Sie auf Aktualisieren, um die Abfrage erneut auszuführen und das Listenfeld mit der angegebenen Zeilenanzahl zu füllen. Siehe auch Überblick zu ADO.NET ( see page 15) ADO.NET-Komponentendesigner ( see page 23) Datenbankanwendung mit Windows Forms erstellen Anweisungstext-Editor verwenden ( Verbindungseditor verwenden ( see page 137) see page 139) Designer "Datenmenge erzeugen" verwenden ( Designer für Datenadapter verwenden ( see page 143) see page 138) 2.1.15 Anweisungstext-Editor verwenden Um ein DataSet-Objekt zu erstellen, muss im BdpDataAdapter-Objekt mindestens SQL-Select-Anweisung für die Eigenschaft CommandText definiert sein. Sobald diese Anweisung eingegeben wurde, wird sie als Wert der Eigenschaft CommandText des BdpCommand-Objekts für die BdpDataAdapter-Komponente verwendet. Sie können diese Select-Anweisung eintippen oder den Anweisungstext-Editor zum Erstellen dieser Anweisung (sowie von Update-, Insert- und Delete-Anweisungen) mit Hilfe einfacher Zeigen- und Klicken-Operationen benutzen. Wenn Sie den Anweisungstext-Editor verwenden und eine Verbindung zu einer aktiven Datenquelle besteht, dann werden die Namen der Tabellen und Spalten in diesem Editor angezeigt. Sie können Einträge aus Listenfeldern auswählen, um die Anweisung aufzubauen. Wenn Sie die BdpDataAdapter-Komponente mit dem Daten-Explorer erstellen und eine aktive Verbindung zu einer Datenquelle besteht, wird automatisch eine Vorlage für eine Select-Anweisung in der Form select * from tablename erzeugt. Sie können diese Anweisung verwenden, um alle Zeilen der genannten Datenquelle abzurufen, oder die Anweisung vor der Erzeugung der Datenmenge ändern. 2 So generieren Sie die Anweisungen: 1. Wählen Sie im Dropdown-Listenfeld Verbindung eine Verbindung aus. Dabei muss es sich um eine bereits von Ihnen definierte BdpConnection-Komponente handeln. Das zugehörige BdpDataAdapter-Objekt muss ebenfalls definiert sein, und seine Eigenschaft Active muss den Wert True haben. Daraufhin werden die Listenfelder Tabellen und Spalten mit den Daten aus der Datenbank gefüllt. 2. Wählen Sie im Listenfeld Tabellen eine Tabelle aus. 3. Wählen Sie alle Spalten aus, die in die SQL-Anweisungen übernommen werden sollen. Sobald Sie die Spaltennamen auswählen, werden diese im Textfeld SQL angezeigt. 4. Aktivieren Sie neben den Anweisungstypen, die erstellt werden sollen, das jeweilige Kontrollkästchen. 5. Klicken Sie auf die Schaltfläche SQL generieren. 136 2.1 Datenbankanleitungen RAD Studio für .NET Designer für Datenadapter verwenden Siehe auch Überblick zu ADO.NET ( see page 15) ADO.NET-Komponentendesigner ( see page 23) Datenbankanwendung mit Windows Forms erstellen Verbindungseditor verwenden ( see page 139) Designer für Datenadapter verwenden ( see page 138) Designer "Datenmenge erzeugen" verwenden ( Datenadapter-Vorschau verwenden ( see page 143) see page 136) 2.1.16 Designer für Datenadapter verwenden Der Datenadapter muss mindestens eine SQL-Select-Anweisung mit der Anweisungseigenschaft SELECT enthalten. Sie können diese Anweisung entweder selbst eingeben oder den Designer Datenadapter dazu verwenden, die Select-Anweisung zusammen mit den Update-, Insert- und Delete-Anweisungen zu erstellen. Der BdpCommandBuilder erstellt die Update-, Insertund Delete-Anweisungen auf der Basis der von Ihnen ausgewählten Tabellen und Spalten. Der Designer Datenadapter verwendet eine Live-Verbindung, um die Metadaten abzurufen, auf deren Basis sich die geeigneten SQL-Anweisungen erstellen lassen. Mit den SQL-Anweisungen werden diejenigen Daten bearbeitet, die Sie aus der Datenmenge zurück in die Datenbank übertragen möchten. So rufen Sie die Anweisungen auf: 1. Wählen Sie im Dropdown-Listenfeld Verbindung eine Verbindung aus. Dabei muss es sich um eine bereits von Ihnen definierte BdpConnection-Komponente handeln. Daraufhin werden die Listenfelder Tabellen und Spalten mit den Daten aus der Datenbank gefüllt. 2. Wählen Sie im Listenfeld Tabellen eine Tabelle aus. 3. Wählen Sie alle Spalten aus, die in die SQL-Anweisungen übernommen werden sollen. 4. Aktivieren Sie neben den Anweisungstypen, die erstellt werden sollen, das jeweilige Kontrollkästchen. 5. Klicken Sie auf die Schaltfläche SQL generieren. 6. Bearbeiten Sie, falls erforderlich, den generierten Text, oder wählen Sie andere Spalten aus und klicken Sie wieder auf SQL generieren. 7. Klicken Sie auf OK. 2 Anmerkung: Die Anweisungskomponenten werden automatisch auf der Basis der Auswahl im Dialogfeld erstellt. Siehe auch Überblick zu ADO.NET ( see page 15) ADO.NET-Komponentendesigner ( see page 23) Datenbankanwendung mit Windows Forms erstellen Verbindungseditor verwenden ( see page 139) Anweisungstext-Editor verwenden ( see page 137) Designer "Datenmenge erzeugen" verwenden ( see page 143) 137 Standarddatenmengen verwenden RAD Studio für .NET Datenadapter-Vorschau verwenden ( 2.1 Datenbankanleitungen see page 136) 2.1.17 Verbindungseditor verwenden Jedes Verbindungsobjekt kann mehrere benannte Verbindungen unterstützen. Dabei kann es sich um Verbindungen zu mehreren Datenbanken oder Datenbanktypen handeln. So fügen Sie eine neue Verbindung hinzu: 1. Wählen Sie eine vorhandene BdpConnection-Komponente im Designer aus, oder ziehen Sie eine BdpConnection-Komponente in den Designer, um ein neues Objekt zu erstellen. 2. Klicken Sie auf das Designer-Register der Komponente am unteren Rand des Objektinspektors, um das Dialogfeld Verbindungseditor anzuzeigen. 3. Klicken Sie auf Hinzufügen, um das Dialogfeld Neue Verbindung hinzufügen anzuzeigen. 4. Wählen Sie im Dropdown-Listenfeld Provider-Name einen Provider aus. 5. Vergeben Sie für die Verbindung im Textfeld Name der Verbindung einen Namen. 6. Klicken Sie auf OK. 7. Geben Sie die erforderlichen Werte für die betreffende Datenquelle ein. 8. Klicken Sie auf OK. So entfernen Sie eine Verbindung: 1. Wählen Sie den Verbindungstyp aus. 2. Klicken Sie auf Entfernen. Das Dialogfeld Löschen bestätigen wird geöffnet. 3. Klicken Sie auf Ja. So benennen Sie eine Verbindung um: 1. Klicken Sie mit der rechten Maustaste auf die Verbindung, und wählen Sie im Kontextmenü Umbenennen. 2. Geben Sie den neuen Namen für die Verbindung ein. 3. Klicken Sie auf OK. Siehe auch Überblick zu ADO.NET ( 2 see page 15) ADO.NET-Komponentendesigner ( see page 23) Optionen für Verbindungs-Pooling ( see page 9) Datenbankanwendung mit Windows Forms erstellen Anweisungstext-Editor verwenden ( see page 137) Designer für Datenadapter verwenden ( see page 138) Designer "Datenmenge erzeugen" verwenden ( Datenadapter-Vorschau verwenden ( 138 see page 143) see page 136) 2.1 Datenbankanleitungen RAD Studio für .NET Standarddatenmengen verwenden 2.1.18 Standarddatenmengen verwenden Das Standardobjekt DataSet ist eine Arbeitsspeicher-Repräsentation von Tabellen oder Ansichten, die von einer verbundenen Datenquelle abgerufen werden. Wegen der Art und Weise, in der die zugrunde liegende Datenstruktur programmiert ist, werden zur Laufzeit nur die Spaltennamen der Datenquelle angezeigt. Wenn Sie eine Datenmenge generieren, werden die Daten aus allen Spalten abgerufen, die Sie in der Select-Anweisung im Dialogfeld Daten-Adapter-Konfiguration angegeben haben. Sie können die Spalten beschränken, indem Sie die Select-Anweisung ändern und eine neue Datenmenge erzeugen. So verwenden Sie Datenmengen: 1. Erzeugen Sie eine Datenmenge. 2. Fügen Sie der Datenmenge mehrere Tabellen hinzu. 3. Definieren Sie primäre Schlüssel (PrimaryKey) für die DataTable-Objekte der Datenmenge. 4. Definieren Sie die Eigenschaften der in der Datenmenge enthaltenen Spalten (Columns). 5. Definieren Sie einschränkende Bedingungen (Constraints) für die Spalten. 6. Definieren Sie die Beziehungen (Relations) zwischen den Tabellen der Datenmenge. So erzeugen Sie eine Datenmenge: 1. Wählen Sie im Daten-Explorer eine Datenquelle aus. 2. Erweitern Sie das Baumdiagramm, und ziehen Sie dann den Namen einer Tabelle in das Windows Form oder Web Form. Daraufhin werden für jede Tabelle ein BdpDataAdapter-Objekt und ein gemeinsames BdpConnection-Objekt für diese Datenquelle erzeugt, die durch entsprechende Symbole in der Komponentenablage repräsentiert werden. Anmerkung: Sie können auch nur eine Datenquelle anstatt einer Tabelle in das Formular ziehen. In diesem Fall erzeugt RAD Studio aber nur ein Verbindungsobjekt. Sie müssen das BdpDataAdapter-Objekt dann explizit erstellen und konfigurieren. 3. Klicken Sie auf das BdpDataAdapter-Symbol (das standardmäßig die Bezeichnung bdpDataAdapter1 trägt), um dieses Objekt auszuwählen. 4. Klicken Sie auf das Designer Verb Datenadapter konfigurieren, das im Bereich Designer Verb am unteren Rand des Objektinspektors angezeigt wird. Das Dialogfeld Datenadapter-Konfiguration wird geöffnet. 5. Falls die SQL-Anweisung, die in diesem Dialogfeld bereits angezeigt wird, akzeptabel ist, klicken Sie auf die Registerkarte DataSet, andernfalls bearbeiten Sie die SQL-Anweisung und klicken danach auf die Registerkarte DataSet. 6. Markieren Sie das Optionsfeld Neues DataSet. 2 Tip: Sie können den vorgegebenen Namen übernehmen oder den Namen der Datenmenge ändern. 7. Klicken Sie auf OK, um die Datenmenge zu erzeugen. In der Komponentenablage wird daraufhin ein DataSet-Symbol eingeblendet, das anzeigt, dass die Datenmenge erstellt wurde. Anmerkung: Wenn Sie den Quelltext für die Datenmenge im Quelltexteditor betrachten, können Sie feststellen, dass die Spalten als generische dataColumns definiert sind, deren columnName-Eigenschaften als Wert jeweils der Spaltenname einer Datenbanktabelle zugewiesen wird. Dies unterscheidet sich vom Aufbau eines typisierten DataSet-Objekts, bei dem der Objektname aus dem Datenbankspaltennamen gebildet und nicht als Wert einer Eigenschaft zugewiesen wird. So fügen Sie einer Datenmenge mehrere Tabellen hinzu: 1. Wählen Sie im Daten-Explorer eine Datenquelle aus. 139 Standarddatenmengen verwenden RAD Studio für .NET 2.1 Datenbankanleitungen 2. Erweitern Sie das Baumdiagramm, und ziehen Sie dann die Namen mehrerer Tabellen in das Windows Form oder Web Form. Daraufhin werden für jede Tabelle ein BdpDataAdapter-Objekt und ein gemeinsames BdpConnection-Objekt für diese Datenquelle erzeugt, die durch entsprechende Symbole in der Komponentenablage repräsentiert werden. 3. Klicken Sie auf das BdpDataAdapter-Symbol (das standardmäßig die Bezeichnung bdpDataAdapter1 trägt), um dieses Objekt auszuwählen. 4. Klicken Sie auf das Designer Verb Datenadapter konfigurieren, das im Bereich Designer Verb am unteren Rand des Objektinspektors angezeigt wird. Das Dialogfeld Datenadapter-Konfiguration wird geöffnet. 5. Falls die SQL-Anweisung, die in diesem Dialogfeld bereits angezeigt wird, akzeptabel ist, klicken Sie auf die Registerkarte DataSet, andernfalls bearbeiten Sie die SQL-Anweisung und klicken danach auf die Registerkarte DataSet. 6. Markieren Sie das Optionsfeld Neues DataSet. Tip: Sie können den vorgegebenen Namen übernehmen oder den Namen der Datenmenge ändern. 7. Klicken Sie auf OK, um die Datenmenge zu erzeugen. In der Komponentenablage wird daraufhin ein DataSet-Symbol eingeblendet, das anzeigt, dass die Datenmenge erstellt wurde. 8. Wiederholen Sie die Datenadapter-Konfiguration für jeden der anderen Datenadapter, wobei Sie jedoch bei allen Datenadaptern mit Ausnahme des zuerst konfigurierten auf der Registerkarte DataSet die Option Vorhandenes DataSet zum Erzeugen der Datenmenge auswählen. Dadurch wird für jeden Datenadapter ein DataTable-Objekt erstellt. Diese Objekte werden zusammen in einer Datenmenge gespeichert. Anmerkung: Es ist auch möglich, mehrere Datenmengen zu erzeugen, wobei entweder jedem Datenadapter eine Datenmenge oder eine Datenmenge jeweils Kombinationen von DataTable-Objekten zugeordnet werden kann. So definieren Sie primäre Schlüssel (PrimaryKey) für die DataTable-Objekte der Datenmenge: 1. Wählen Sie die einzelnen Datenadapter nacheinander aus, und stellen Sie die Eigenschaft Active unter Live Data im Objektinspektor auf True ein. 2. Wählen Sie die Datenmenge in der Komponentenablage aus. 3. Klicken Sie im Objektinspektor auf die Ellipsen-Schaltfläche (...) der Eigenschaft Tables. Das Dialogfeld Tabellensammlungs-Editor wird geöffnet. Wenn Sie die Eigenschaft Active aller Datenadapter auf True gesetzt haben, dann enthält der Tabellensammlungs-Editor ein Element für jedes in der zugehörigen Datenmenge gespeicherte DataTable-Objekt. 4. Wählen Sie in der Liste der Elemente eine Tabelle aus. 5. Klicken Sie im Bereich der Tabelleneigenschaften im Feld PrimaryKey auf den Eintrag DataColumn[], um eine Popup-Liste mit den Spaltennamen anzuzeigen. 6. Aktivieren Sie das graue Kontrollkästchen neben dem Namen der Spalte(n), die den Primärschlüssel bilden soll(en). Wenn Sie das graue Kontrollkästchen aktivieren, wird darin die Zahl 1 angezeigt. 2 7. Definieren Sie für die Spalten, die den Primärschlüssel bilden, die Eigenschaften Columns und Constraints. So definieren Sie die Eigenschaft Columns für die in der Datenmenge enthaltenen Spalten: 1. Klicken Sie im Tabellensammlungs-Editor im Bereich Tabelleneigenschaften auf den Eintrag (Auflistung) neben Spalten. Daraufhin wird der Spaltensammlungs-Editor für die gewählte Spalte angezeigt. 2. Legen Sie die Eigenschaftswerte für die einzelnen Spalten fest. 3. Wiederholen Sie diese Schritte für jede Spalte. So definieren Sie Bedingungen für die Spalten: 1. Klicken Sie im Tabellensammlungs-Editor im Bereich Tabelleneigenschaften auf den Eintrag (Auflistung) neben Einschränkungen. Daraufhin wird der Bedingungssammlungs-Editor für die gewählte Spalte angezeigt. 2. Klicken Sie auf Hinzufügen, und fügen Sie entweder eine Eindeutige Bedingung oder eine Fremdschlüsselbedingung 140 2.1 Datenbankanleitungen RAD Studio für .NET Standarddatenmengen verwenden hinzu. 3. Falls Sie Eindeutige Bedingung ausgewählt haben, wird das Dialogfeld Eindeutige Bedingung angezeigt. Wählen Sie einen oder mehrere der angezeigten Spaltennamen aus. Sie können auch das Kontrollkästchen Primärschlüssel aktivieren, wenn die Spalte als Primärschlüssel dienen soll. Wenn Sie einer Spalte die Einstellung Eindeutige Bedingung zuweisen, dann wird damit die Regel durchgesetzt, dass alle Werte der Spalte eindeutig sein müssen. Dies ist hilfreich bei Spalten, die Kennungen enthalten, wie z.B. Personalnummern, Sozialversicherungsnummern, Artikelnummern usw. Anmerkung: Wenn Sie bereits eine Primär-/Fremdschlüsselbeziehung zwischen zwei Tabellen definiert haben, steht eine Spalte möglicherweise nicht als Primärschlüssel zur Verfügung, da sie u. U. bereits als Primärschlüssel festgelegt wurde oder da sonst ein Konflikt mit einer anderen Beziehung vorläge. 4. Falls Sie Fremdschlüsselbedingung ausgewählt haben, wird das Dialogfeld Fremdschlüsselbedingung angezeigt. Legen Sie die miteinander in Beziehung zu setzenden Tabellen fest, indem Sie sie in den Dropdown-Listen Übergeordnete Tabelle und Untergeordnete Tabelle auswählen. 5. Klicken Sie auf Schlüsselspalten, um die Primärschlüsselspalte aus der Liste auszuwählen. 6. Klicken Sie auf Schlüsselspalten, um die Primärschlüsselspalte aus der Liste auszuwählen. Warnung: Primärschlüsselspalte und Fremdschlüsselspalte müssen den gleichen Datentyp haben und eindeutige Werte enthalten. Spalten, die doppelte Werte enthalten können, sind als Primär- oder Fremdschlüssel nicht geeignet. Es ist üblich, zur Definition der Beziehung zwischen Primär- und Fremdschlüssel in jeder Tabelle den gleichen Spaltennamen auszuwählen. So definieren Sie Beziehungen zwischen den Tabellen der Datenmenge: 1. Nachdem Sie die Primärschlüssel für jedes DataTable-Objekt definiert haben, wählen Sie die DataSet-Komponente in der Komponentenablage aus, sofern sie nicht bereits ausgewählt ist. 2. Klicken Sie im Objektinspektor auf die Ellipsen-Schaltfläche neben der Eigenschaft Relations. Das Dialogfeld Beziehungskollektions-Editor wird geöffnet. 3. Klicken Sie auf Hinzufügen. Das Dialogfeld Beziehung wird angezeigt. 4. Wählen Sie in den Dropdown-Listen Übergeordnete Tabelle und Untergeordnete Tabelle die Tabellen aus, die Sie miteinander in Beziehung setzen möchten. 5. Klicken Sie auf das Feld Schlüsselspalten, um eine Primärschlüsselspalte in der Liste der Spaltennamen der übergeordneten Tabelle auszuwählen. 6. Klicken Sie auf das Feld Fremdschlüsselspalten, um die Fremdschlüsselspalte in der Liste der Spaltennamen der untergeordneten Tabelle auszuwählen. Anmerkung: Falls Sie diesen Schritt bereits bei der Definition von Bedingungen für die DataTable-Objekte ausgeführt haben, dann sind die geeigneten Werte bereits festgelegt. Warnung: Primärschlüsselspalte und Fremdschlüsselspalte müssen den gleichen Datentyp haben und eindeutige Werte enthalten. Spalten, die doppelte Werte enthalten können, sind als Primär- oder Fremdschlüssel nicht geeignet. Es ist üblich, zur Definition der Beziehung zwischen Primär- und Fremdschlüssel in jeder Tabelle den gleichen Spaltennamen auszuwählen. 7. Klicken Sie auf OK. 8. Wiederholen Sie diese Schritte, um weitere Beziehungen zwischen den gleichen DataTable-Objekten zu definieren. Siehe auch Überblick zu ADO.NET ( see page 15) ADO.NET-Komponentendesigner ( see page 23) 141 2 Typisierte Datenmengen verwenden RAD Studio für .NET 2.1 Datenbankanleitungen Datenbankanwendung mit Windows Forms erstellen Anweisungstext-Editor verwenden ( Verbindungseditor verwenden ( see page 137) see page 139) Designer für Datenadapter verwenden ( see page 138) Datenadapter-Vorschau verwenden ( see page 136) Typisierte Datenmengen verwenden ( see page 143) 2.1.19 Typisierte Datenmengen verwenden Typisierte Datenmengen weisen bestimmte Vorteile gegenüber Standarddatenmengen auf. Erstens werden sie von einer XML-Hierarchie der Zieldatenbanktabelle abgeleitet. Die XML-Datei, die die Beschreibung der Datenmenge enthält, ermöglicht die Bereitstellung von Funktionen zur Code-Vervollständigung, die beim Einsatz von Standarddatenmengen nicht verfügbar sind. Die strenge Typisierung der Methoden, Eigenschaften und Ereignissen der Datenmenge lässt eine Typüberprüfung während der Compilierung zu und führt in manchen Anwendungen zu einem besseren Leistungsverhalten. So erstellen Sie eine streng typisierte Datenmenge: 1. Wählen Sie im Datenbank-Explorer die zu verwendende Datenquelle aus. 2. Ziehen Sie den Namen der Datenbanktabelle, die Sie verwenden möchten, in das Formular. Daraufhin werden in der Komponentenablage ein BdpConnection- und ein BdpDataAdapter-Symbol angezeigt. 3. Markieren Sie die BdpDataAdapter-Komponente. 4. Klicken Sie auf das Designer Verb Datenadapter konfigurieren, das im Bereich Designer Verb am unteren Rand des Objektinspektors angezeigt wird. Das Dialogfeld Datenadapter-Konfiguration wird geöffnet. 5. Bearbeiten Sie bei Bedarf die vorgegebene SQL-Anweisung. 6. Klicken Sie auf OK. Anmerkung: Erzeugen Sie keine Datenmenge, indem Sie die Registerkarte DataSet im Dialogfeld Daten-Adapter-Konfiguration aktivieren. Diese Registerkarte ist nur für Standarddatenmengen gültig. 7. Klicken Sie auf das Designer Verb Typisierte Datenmenge erzeugen, das im Bereich Designer Verb am unteren Rand des Objektinspektors angezeigt wird. Daraufhin wird das Dialogfeld Datenmenge erzeugen geöffnet. 8. Wählen Sie die zu verwendende Datenbanktabelle aus. 2 9. Klicken Sie auf OK. Daraufhin wird eine typisierte Datenmengeninstanz erzeugt und ein Symbol mit der Bezeichnung <DataSet Name>1 in der Komponentenablage angezeigt. Wenn Sie beispielsweise die Datenmenge DataSet1 verwenden, heißt die neue Datenmengeninstanz dataSet11. Zudem werden eine XML-Datei mit der Erweiterung XSD und eine neue Programmdatei in der Projektverwaltung unter dem Projekt angezeigt. So legen Sie die Spaltenanzeige fest: 1. Nachdem Sie eine neue typisierte Datenmenge erstellt haben, legen Sie eine DataGrid-Komponente auf dem Formular ab. 2. Stellen Sie die Eigenschaft DataSource so ein, dass sie auf die typisierte Datenmenge zeigt, und legen Sie die Eigenschaft DataMember so fest, dass sie auf die Zieltabelle zeigt. 3. Klicken Sie auf den Eintrag (Auflistung) neben der Eigenschaft TableStyles. Der DataGridTableStyle-Auflistungs-Editor wird angezeigt. 4. Klicken Sie auf Hinzufügen, um einen neuen Parameter hinzuzufügen. 5. Öffnen Sie die Dropdown-Liste neben der Eigenschaft MappingName. 142 2.1 Datenbankanleitungen RAD Studio für .NET Herstellen einer Verbindung zu einer 6. Klicken Sie auf den Eintrag (Auflistung) neben der Eigenschaft GridColumnStyles. Der DataGridColumnStyle-Auflistungs-Editor wird geöffnet. 7. Klicken Sie auf Hinzufügen, um der Liste der Elemente einen neuen Eintrag hinzuzufügen. Anmerkung: Standardmäßig wird ein Element vom Typ TextBoxColumn erstellt. Sie können auch auf den Dropdown-Pfeil neben der Schaltfläche Hinzufügen klicken, und stattdessen BoolColumn wählen, wenn eine Spalte für Boolesche Daten erzeugt werden soll. 8. Klicken Sie auf die Eigenschaft MappingName, wählen Sie die Spalte aus, die im Gitter angezeigt werden soll, und ändern Sie dann bei Bedarf weitere Eigenschaften, z.B. den Namen, der zur Laufzeit als Spaltenüberschrift angezeigt wird. 9. Klicken Sie zweimal auf OK. Anmerkung: Wenn Sie die Anwendung compilieren und ausführen, werden nur diejenigen Spalten angezeigt, die Sie wie oben beschrieben definiert haben. So ändern Sie die Struktur der Datenmenge: 1. Doppelklicken Sie in der Projektverwaltung auf die .XSD-Datei, die die XML-Definition der Datenmenge enthält. 2. Bearbeiten Sie die XML-Datei, sodass sie die gewünschte Struktur der Datenmenge beschreibt. Sie können Datentypen, Namen und alle übrigen Strukturelemente ändern. 3. Falls die Quelltextdatei (<dataset>.cs oder <dataset>.pas) im Quelltext-Editor geöffnet ist, schließen Sie diese jetzt. 4. Wählen Sie Projekt Projekt compilieren, um die .XSD-Datei neu zu compilieren. Wenn Sie die Quelltextdatei dann erneut öffnen, können Sie feststellen, dass die Datei die Änderungen enthält, die Sie am XML-Code in der .XSD-Datei vorgenommen haben. So legen Sie die Eigenschaft Namespace für eine Datenmenge fest: 1. Doppelklicken Sie in der Projektverwaltung auf die .XSD-Datei, die die XML-Definition der Datenmenge enthält. 2. Suchen Sie nach der Eigenschaft targetNamespace. 3. Ändern Sie den folgenden Text in einen gültigen Namespace: http://www.changeme.now/DataSet1.xsd 4. Falls die Quelltextdatei (<dataset>.cs oder <dataset>.pas) im Quelltext-Editor geöffnet ist, schließen Sie diese jetzt. 5. Wählen Sie Projekt Projekt compilieren, um die .xsd-Datei neu zu compilieren. Wenn Sie die Quelltextdatei dann erneut öffnen, können Sie feststellen, dass die Klasse InitClass() jetzt den neuen Namespace enthält. Siehe auch Überblick zu ADO.NET ( see page 15) ADO.NET-Komponentendesigner ( see page 23) 2 Datenbankanwendung mit Windows Forms erstellen Anweisungstext-Editor verwenden ( Verbindungseditor verwenden ( see page 137) see page 139) Designer für Datenadapter verwenden ( Datenadapter-Vorschau verwenden ( Standarddatenmengen verwenden ( see page 138) see page 136) see page 140) Anmerkungen mit einer typisierten Datenmenge verwenden 143 Herstellen einer Verbindung zu einer RAD Studio für .NET 2.1 Datenbankanleitungen 2.1.20 Herstellen einer Verbindung zu einer Datenbank mit dem dbExpress Treiber-Framework Diese Anleitung zeigt Ihnen, wie Sie mit dem dbExpress-Treiber-Framework eine Verbindung zu einer Datenbank herstellen und deren Datensätze lesen können. In dem Beispielcode enthalten die .ini-Dateien von dbExpress alle Informationen über die spezielle Datenbankverbindung, wie z.B. den Treiber, den Benutzernamen, das Passwort usw. So verbinden Sie zu einer Datenbank und lesen deren Datensätze: 1. Konfigurieren Sie die ini-Datei der Verbindung mit den Informationen über die Datenbank, zu der Sie eine Verbindung herstellen möchten. Dazu zählen der Treibernamen, der Benutzername, das Passwort usw. 2. Rufen Sie ein TDBXConnectionFactory-Objekt ab, das von TDBXConnectionFactory.GetConnectionFactory zurückgegeben wird. 3. Rufen Sie ein TDBXConnection-Objekt ab, das von TDBXConnectionFactory.GetConnection zurückgegeben wird. 4. Öffnen Sie die Datenbankverbindung durch Aufrufen von TDBXConnection.Open für die TDBXConnection-Instanz. 5. Rufen Sie ein TDBXCommand-Objekt ab, indem Sie TDBXConnection.CreateCommand für die TDBXConnection-Instanz aufrufen. 6. Setzen Sie die Eigenschaft Text von TDBXCommand auf die gewünschten SQL-Anweisung. Rufen Sie TDBXCommand.Prepare für die TDBXCommand-Instanz auf. 7. Führen Sie die SQL-Abfrage durch Aufrufen von TDBXCommand.ExecuteQuery aus. Eine TDBXReader-Instanz wird zurückgegeben. 8. Lesen Sie den ersten Datensatz in der Datenbank, indem Sie TDBXReader.Next aufrufen. Rufen Sie diese Methode auf, um die nachfolgenden Datensätze der Datenbank abzurufen. 9. Ermitteln Sie alle gewünschten Informationen aus der Datenbank. TDBXReader.GetColumnCount gibt beispielsweise die Anzahl der Spalten in der Datenbank zurück. Die Eigenschaften ValueType und Value von TDBXReader enthalten den Datentyp und den Wert einer angegebenen Spaltennummer im aktuellen Datensatz. // // // // 2 Dieses Beispiel verbindet zu einer Datenbank mithilfe von ini-Dateien. Diese Dateien müssen für die Datenbank konfiguriert sein. Nachdem Herstellen der Verbindung liest das Beispiel Werte und zeigt die ANSI-Werte der ersten 100 Datensätze in einem Listenfeld an. // Abrufen von TDBXConnection mithilfe von TDBXConnectionFactory. // ConnectionName = Abschnitt in der ini-Datei der Verbindung. class function TForm1.BuildConnectionFromConnectionName( ConnectionName: WideString): TDBXConnection; var ConnectionFactory: TDBXConnectionFactory; ConnectionProps: TDBXProperties; begin ConnectionFactory := TDBXConnectionFactory.GetConnectionFactory; ConnectionProps := ConnectionFactory.GetConnectionProperties(ConnectionName); Result := ConnectionFactory.GetConnection(ConnectionProps, ConnectionProps.Values[TDBXPropertyNames.UserName], ConnectionProps.Values[TDBXPropertyNames.Password] ); end; procedure Connect; var connection: TDBXConnection; command: TDBXCommand; reader: TDBXReader; value: TDBXValue; 144 2.1 Datenbankanleitungen RAD Studio für .NET Eine verteilte Datenbankanwendung valueType: TDBXValueType; colCountStr: string; i, j: Integer; numCols: integer; ListBox1: TListBox; const sqlCommand = 'select * from employee'; begin // Verbindung zu DB öffnen. connection := BuildConnectionFromConnectionName('ConnectionName'); connection.Open; // Befehl abrufen command := connection.CreateCommand(); command.Text := sqlCommand; // Abfrage ausführen command.Prepare; reader := command.ExecuteQuery; // Werte aus DB ermitteln if reader.Next then begin numCols := reader.GetColumnCount; Str(numCols, colCountStr); ListBox1.Items.Add('Number of columns = ' + colCountStr); j := 1; repeat for i := 0 to reader.GetColumnCount - 1 do begin valueType := reader.ValueType[i]; if valueType.DataType = TDBXDataTypes.AnsiStringType then begin value := reader.Value[i]; ListBox1.Items.Add(valueType.Name + ' = ' + value.GetString); end else ListBox1.Items.Add(valueType.Name); end; Inc(j); until (j > 100) or not reader.Next; reader.Next; end; // Ressourcen freigeben command.Free; end; 2 2.1.21 Eine verteilte Datenbankanwendung erstellen Daten-Remoting bildet eine wichtige Grundlage für die Entwicklung verteilter Datenbankanwendungen. Die .NET-Remoting-Technologie ist ein flexibles und erweiterbares Framework für die Kommunikation zwischen einzelnen Prozessen. Das .NET-Remoting ermöglicht eine Interaktion mit Objekten, die sich in unterschiedlichen Anwendungsdomänen befinden oder die zu verschiedenen Prozessen auf einem Computer oder auf mehreren Computern in einem Netzwerk gehören. Mit Hilfe der Komponenten RemoteServer und RemoteConnection kann eine Client-/Server-Anwendung, in der DataHub- und DataSync-Komponenten verwendet werden, problemlos in eine mehrschichtige Datenmengen-Remoting-Anwendung migriert 145 Eine verteilte Datenbankanwendung RAD Studio für .NET 2.1 Datenbankanleitungen werden. RemoteServer implementiert das Interface IDataService und stellt sich selbst als SAO (Singleton Server Activated Object) zur Verfügung. Auf der Client-Seite wird über die RemoteConnection-Eigenschaften der URL für die Verbindung zur RemoteServer-Komponente bereitgestellt. Die Eigenschaft Channel gibt das zu verwendende Protokoll (TCP/IP oder HTTP) an, die Eigenschaft Port legt den Anschluss fest, an dem die RemoteServer-Komponente Anforderungen empfängt, und die Eigenschaft URI enthält den eindeutigen Ressourcen-Bezeichner für die RemoteServer-Komponente. Die Erstellung einer verteilten Anwendung mit Daten-Remoting-Komponenten umfasst folgende Schritte: • Erstellen einer server-seitigen Windows Forms-Anwendung, die über eine oder mehrere Verbindungen zu einem BDP.NET-Daten-Provider, eine DataSync-Komponente zur Zusammenfassung der Verbindungen und zur Festlegung des Übergabeverhaltens sowie über eine RemoteServer-Komponente verfügt, mit der das Kommunikationsprotokoll und der URI für die Kommunikation mit Clients angegeben werden. • Erstellen einer client-seitigen Windows Forms-Anwendung, die über eine RemoteConnection-Komponente mit Eigenschaften für die Festlegung der Verbindung zur server-seitigen Anwendung, eine DataHub-Komponente für die Übergabe von Daten zu und von einer Datenmenge sowie über eine DataGrid-Komponente verfügt, mit der die Daten angezeigt werden. Anmerkung: Die RemoteServer-Komponente wird in Windows Forms-Anwendungen aufgenommen, ohne dass weiterer Quelltext manuell erstellt werden muss. So erstellen Sie eine Anwendung auf der Server-Seite: 1. Wählen Sie Datei Neu Windows Forms-Anwendung (für Delphi für .NET oder C#). Der Windows Forms-Designer wird angezeigt. 2. Wählen Sie Ansicht Daten-Explorer, um den Daten-Explorer zu öffnen, und erweitern Sie die Daten-Explorerstruktur, um die gewünschten Provider und Datenbanktabellen anzuzeigen. Damit die Provider-Knoten erweitert werden können, muss eine Live-Verbindung vorhanden sein. Wenn dies nicht der Fall ist, müssen Sie möglicherweise den Verbindungsstring ändern. 3. Ziehen Sie Tabellen von einem oder mehreren Providern in das Formular. Für jede in das Formular gezogene Tabelle wird in der Komponentenablage eine BdpConnection- und eine BdpDataAdapter-Komponente angezeigt. Wenn Sie mehrere Tabellen desselben Providers einfügen, ist nur eine BdpConnection-Komponente für diesen Provider erforderlich. Alle anderen Komponenten dieser Art können gelöscht werden. 4. Konfigurieren Sie jede BdpDataAdapter-Komponente. Die Eigenschaft Active oder DataSet muss nicht gesetzt werden, da die Datenmenge über die DataHub-Komponente auf der Client-Seite gefüllt wird. 5. Ziehen Sie eine DataSync-Komponente aus der Kategorie Borland Daten-Provider der Tool-Palette in das Formular, und konfigurieren Sie die folgenden DataSync-Eigenschaften im Objektinspektor: Eigenschaft Beschreibung Providers Eine Sammlung von Daten-Providern, die als Datenquellen genutzt werden. Klicken Sie auf die Ellipsen-Schaltfläche, um den Editor für Daten-Provider-Sammlungen zu öffnen, und fügen Sie für jede Tabelle, die bereitgestellt und aufgelöst werden soll, einen Daten-Provider hinzu. CommitBehavior Bestimmt die Logik (Atomic, Individual oder ForceIndividual) für die Behandlung von Fehlern, die bei der Auflösung auftreten. 2 6. Ziehen Sie eine RemoteServer-Komponente aus der Kategorie Borland Daten-Provider der Tool-Palette in das Formular, und konfigurieren Sie die folgenden RemoteServer-Eigenschaften im Objektinspektor: Eigenschaft Beschreibung DataSync Gibt die DataSync-Komponente an, für die das Remoting erforderlich DataSync-Komponente in der Dropdown-Liste im Objektinspektor aus. AutoStart Legt fest, ob der externe Server automatisch gestartet wird, wenn die Anwendung ausgeführt wird. Setzen Sie diese Eigenschaft auf True. ist. Wählen Sie die ChannelType Gibt den Typ des Kanals an: Http (HTTP) oder Tcp (TCP/IP). Wählen Sie den Kanaltyp in der Dropdown-Liste im Objektinspektor aus. 146 2.1 Datenbankanleitungen RAD Studio für .NET Eine verteilte Datenbankanwendung Port Gibt den Anschluss an, den der externe Server abhört. Geben Sie einen neuen Wert ein, oder übernehmen Sie den voreingestellten Port-Wert 8000. URI Legt den universellen Ressourcen-Bezeichner für den externen Server fest. Per Vorgabe ist die Eigenschaft URI identisch mit der Eigenschaft Name. 7. Wählen Sie Start Ausführen, um die Anwendung auf der Server-Seite auszuführen. So erstellen Sie eine Anwendung auf der Client-Seite: 1. Wählen Sie Datei Neu Windows Forms-Anwendung (für Delphi für .NET oder C#). Der Windows Forms-Designer wird angezeigt. 2. Ziehen Sie eine DataSet-Komponente aus der Kategorie Datenkomponenten der Tool-Palette in das Formular. 3. Ziehen Sie eine DataGrid-Komponente aus der Kategorie Datensteuerung der Tool-Palette in das Formular, und weisen Sie der Eigenschaft DataSource der DataGrid-Komponente den Namen der hinzugefügten DataSet-Komponente hinzu (beispielsweise dataSet1). 4. Ziehen Sie eine RemoteConnection-Komponente aus der Kategorie Borland Daten-Provider der Tool-Palette in das Formular, und konfigurieren Sie die folgenden RemoteConnection-Eigenschaften im Objektinspektor: Eigenschaft Beschreibung ProviderType Legt den Typ des Providers fest, der vom externen Server bereitgestellt wird. In vorliegenden Fall sollte die Eigenschaft auf Borland.Data.Provider.DataSync gesetzt werden. Wenn der externe Server ausgeführt wird, können Sie diesen Wert in der Dropdown-Liste auswählen. Andernfalls müssen Sie den Wert eingeben. ChannelType Gibt den Typ des Kanals an: Http (HTTP) oder Tcp (TCP/IP). Wählen Sie den Kanaltyp in der Dropdown-Liste im Objektinspektor aus. Der gewählte Typ muss dem Anschlusstyp entsprechen, der für den externen Server festgelegt wurde. Host Der Name oder die IP-Adresse des externen Servers. Port Gibt den Anschluss an, den der externe Server abhört. Geben Sie einen neuen Wert ein, oder übernehmen Sie den voreingestellten Port-Wert 8000. Der gewählte Typ muss dem Anschlusstyp entsprechen, der für den externen Server festgelegt wurde. URI Legt den universellen Ressourcen-Bezeichner für den externen Server fest. Dieser Wert muss der URI-Eigenschaft für die RemoteServer-Komponente in der Anwendung auf dem externen Server entsprechen. 5. Ziehen Sie eine DataHub-Komponente aus der Kategorie Borland Daten-Provider der Tool-Palette in das Formular, und konfigurieren Sie die folgenden DataHub-Eigenschaften im Objektinspektor: Eigenschaft Beschreibung DataPort Gibt die Datenquelle an. Weisen Sie der Eigenschaft DataPort die hinzugefügte RemoteConnection-Komponente zu (beispielsweise RemoteConnection1). DataSet Legt die Datenmenge fest, in der die Daten gespeichert werden, die aus der angegebenen Datenquelle abgerufen werden. Weisen Sie dieser Eigenschaft die hinzugefügte DataSet-Komponente zu (beispielsweise dataSet1). 6. Wählen Sie Start Ausführen. Die Anwendung wird compiliert und zeigt ein Windows Form mit einem Datengitter an. Siehe auch Überblick zu ADO.NET ( see page 15) Borland-Datenprovider für .NET ( BDP.NET-Komponentendesigner ( see page 28) see page 23) Eine Datenbankanwendung für die Auflösung in mehrere Tabellen erstellen ( see page 132) 147 2 Referenzen zu einem COM-Server RAD Studio für .NET 2.2 Interoperative Anwendungen – 2.2 Interoperative Anwendungen – Anleitungen Dieser Abschnitt enthält Anleitungen zur Erstellung von interoperativen Anwendungen. Themen Name Hinzufügen einer J2EE-Referenz ( Beschreibung see page 150) Referenzen zu einem COM-Server hinzufügen ( RAD Studio stellt ein Möglichkeit zum Erzeugen einer .NET-Assemblierung aus einem J2EE-Archiv bereit. Nach dem Erstellen der Assemblierung wird automatisch eine Referenz auf Ihr Projekt hinzugefügt. see page 150) 2.2.1 Hinzufügen einer J2EE-Referenz RAD Studio stellt ein Möglichkeit zum Erzeugen einer .NET-Assemblierung aus einem J2EE-Archiv bereit. Nach dem Erstellen der Assemblierung wird automatisch eine Referenz auf Ihr Projekt hinzugefügt. So fügen Sie eine J2EE-Referenz hinzu: 1. Klicken Sie in der Projektverwaltung mit der rechten Maustaste auf den Projektknoten der obersten Ebene, und wählen Sie J2EE-Referenz hinzufügen. Das Dialogfeld J2EE-Archiv auswählen wird angezeigt. 2. Navigieren Sie in dem Dialogfeld J2EE-Archiv auswählen zu der .jar- oder .ear-Datei, aus der die .NET-Assemblierung erzeugt werden soll. 3. Klicken Sie im Dialogfeld J2EE-Archiv auswählen auf Öffnen. Das Dialogfeld EJBs aus Liste auswählen wird geöffnet. 4. In dem Dialogfeld EJBs aus Liste auswählen können Sie eine Assemblierung für alle EJBs oder nur für einzelne EJBs in dem Archiv erzeugen. 2.2.2 Referenzen zu einem COM-Server hinzufügen So fügen Sie eine Referenz zu einem COM-Server hinzu: 1. Klicken Sie in der Projektverwaltung mit der rechten Maustaste auf den Verzeichnisknoten Referenzen des Projekts, und wählen Sie Referenz hinzufügen. 2 2. Klicken Sie im Dialogfeld Referenz hinzufügen auf die Registerkarte COM-Importe. Die IDE durchsucht dann die Systemregistrierung nach allen registrierten Typbibliotheken und COM-Servern. 3. Wählen Sie das oder die Elemente aus, für die eine Referenz in das Projekt eingefügt werden soll. Tip: Sie können mehrere Elemente aus der Liste auswählen, indem Sie die Taste STRG gedrückt halten und die Elemente nacheinander anklicken. Um einen zusammenhängenden Bereich von Elementen auszuwählen, klicken Sie auf erste Element und halten die Taste UMSCHALT gedrückt, während Sie auf das zweite Element klicken. 4. Klicken Sie auf die Schaltfläche Referenz hinzufügen. Alle ausgewählten Elemente werden im Listenfeld Neue Referenzen im unteren Bereich des Dialogfelds angezeigt. Tip: Sie können auch Elemente aus dem Listenfeld Neue Referenzen entfernen. Wählen Sie das bzw. die Elemente aus, und klicken Sie auf die Schaltfläche Entfernen. 148 2.2 Interoperative Anwendungen – RAD Studio für .NET Referenzen zu einem COM-Server 5. Wenn die COM-Komponente, die referenziert werden soll, nicht in der Liste enthalten ist, klicken Sie auf die Schaltfläche Durchsuchen, um eine explizite Referenz auf die gewünschte Komponente hinzuzufügen. 6. Wechseln Sie im Dialogfeld Wählen Sie eine Referenz zu dem Ordner, in dem sich die Komponente befindet. 7. Markieren Sie die Komponente, und klicken Sie auf Öffnen. 8. Sind alle COM-Server ausgewählt, die Sie einfügen möchten, klicken Sie auf OK. Wenn Sie im Dialogfeld Referenz hinzufügen auf die Schaltfläche OK klicken, generiert die IDE für jedes ausgewählte Element eine Interop-Assemblierung (sofern nicht bereits eine primäre Interop-Assemblierung erstellt worden ist). Diese Assemblierungen erhalten den Namen Interop.LibraryName.dll, wobei LibraryName der Name der Typbibliothek der Komponente ist (dieser Name kann sich vom DLL-Dateinamen des Elements unterscheiden). Die generierten Assemblierungen werden im Ordner COMImports unter dem Projektverzeichnis gespeichert. Jede generierte Interop-Assemblierung erhält die Einstellung Lokal kopieren, d.h. beim Erstellen des Projekts wird die Assemblierung automatisch in den Zielordner des Build kopiert. Es kann sein, dass der Ordner COMImports nicht vorhanden ist, wenn Sie das Projekt zum Beispiel auf einen anderen Computer transferieren oder der Ordner auf dem Computer gelöscht wurde, auf dem sich die Projekte befinden. Wenn der Ordner COMImports beim erneuten Öffnen eines Projekts nicht vorhanden ist, erstellt die IDE diesen neu und erzeugt auch die Interop-Assemblierungen erneut. Damit dies möglich ist, müssen die COM-Server jedoch zunächst auf dem Computer registriert werden, auf dem sich die Projekte befinden. Ist eine primäre Interop-Assemblierung für den COM-Server vorhanden, generiert die IDE keine neue Interop-Assemblierung. Stattdessen wird eine Referenz auf die primäre Interop-Assemblierung eingefügt und die Einstellung Lokal kopieren wird deaktiviert, weil das Deployment der primären Interop-Assemblierungen über den globalen Assemblierungs-Cache erfolgt. Anmerkung: Um die Einstellung Lokal kopieren für eine beliebige referenzierte Assemblierung zu prüfen, klicken Sie in der Projektverwaltung mit der rechten Maustaste auf die Assemblierung. Die Einstellung Lokal kopieren ist eine Option im Kontextmenü. Das Projekt behält die Referenzen auf die Interop-Assemblierungen, auch wenn der Ordner COMImports nicht neu generiert werden konnte. In diesem Fall wird die betreffende Assemblierung in der Projektverwaltung hervorgehoben dargestellt und damit angezeigt, dass sie sich aktuell nicht auf dem Computer befindet. Siehe auch Überblick zu COM Interop ( see page 41) ActiveX-Steuerelemente zur Tool-Palette hinzufügen 2 149 Importieren und Exportieren eines Modells RAD Studio für .NET 2.3 Anleitungen für die Modellierung 2.3 Anleitungen für die Modellierung Dieser Abschnitt enthält Anleitungen zum Modellieren von Anwendungen. Themen Name Beschreibung Code-Visualisierungsdiagramme als Grafik exportieren ( see page 152) Sie können ein Visualisierungsdiagramm als Bild exportieren und dann das Bild in einem beliebigen Grafik-Viewer öffnen, der das Windows-Bitmap-Dateiformat (.bmp) unterstützt. Importieren und Exportieren eines Modells mit XMI Metadata Interchange (XMI) ( see page 153) RAD Studio unterstützt XMI Version 1.1. Bitte verwenden Sie den Link zur OMG-Website am Ende dieses Themas, um weitere Informationen über XMI zu erhalten oder um die vollständige Spezifikation herunterzuladen. Verwenden des Modellansichtfensters und des Code-Visualisierungsdiagramms ( see page 154) Die Code-Visualisierung ermöglicht das Anzeigen und Navigieren in der logischen Struktur Ihrer Anwendung. Die Projektverwaltung bietet dagegen eine dateizentrierte Ansicht. Verwenden des Übersichtsfensters ( Große, reale Modelle passen nicht in das Diagrammfenster. Um das Diagramm anzuzeigen, können Sie das Übersichtsfenster verwenden. see page 155) 2.3.1 Code-Visualisierungsdiagramme als Grafik exportieren Sie können ein Visualisierungsdiagramm als Bild exportieren und dann das Bild in einem beliebigen Grafik-Viewer öffnen, der das Windows-Bitmap-Dateiformat (.bmp) unterstützt. So exportieren Sie ein Diagramm als Grafik: 1. Öffnen Sie ein Projekt. 2. Klicken Sie auf die Registerkarte Modellansicht. 3. Klicken Sie mit der rechten Maustaste auf den Diagrammknoten in der Hierarchie, und wählen Sie Als Bild exportieren. 4. Passen Sie bei Bedarf die Zoomeinstellungen an. 5. Klicken Sie auf Speichern. 6. Geben Sie dem Bild einen Namen, und klicken Sie auf Speichern. Siehe auch UML-Features in Delphi für .NET 2 Integrierte Modellierungstools - Übersicht Code-Visualisierung - Überblick ( see page 58) Importieren und Exportieren eines Modells mit XMI ( see page 153) Verwenden des Modellansichtfensters und des Code-Visualisierungsdiagramms ( Verwenden des Übersichtsfensters ( see page 155) Hinzufügen von Spalten zu einer Komponente OCL-Ausdruckseditor verwenden 150 see page 154) 2.3 Anleitungen für die Modellierung RAD Studio für .NET Verwenden des Modellansichtfensters und 2.3.2 Importieren und Exportieren eines Modells mit XMI Metadata Interchange (XMI) RAD Studio unterstützt XMI Version 1.1. Bitte verwenden Sie den Link zur OMG-Website am Ende dieses Themas, um weitere Informationen über XMI zu erhalten oder um die vollständige Spezifikation herunterzuladen. So importieren Sie ein Modell im XMI-Format: 1. Exportieren Sie das Modell aus dem Modellierungs-Tool im XMI-Format. Verwenden Sie beim Exportieren aus Rational Rose XMI Version 1.1 und die Unisys-Erweiterung. 2. Wählen Sie in RAD Studio Datei Neu Weitere. 3. Wählen Sie im Dialogfeld Objektgalerie ECO Windows Forms-Anwendung. Anmerkung: Wenn Sie eine neue ECO-Anwendung erstellen, können Sie entweder Delphi für .NET oder C# verwenden. 4. Öffnen Sie das Fenster Modellansicht, klicken Sie in der Hierarchie mit der rechten Maustaste auf den obersten Projektknoten und wählen Sie Projekt aus XMI importieren. 5. Klicken Sie im Dialogfeld XMI importieren auf Durchsuchen, um zu der XMI-Datei zu navigieren, die Sie im ersten Schritt exportiert haben. 6. Klicken Sie im Dialogfeld XMI importieren auf Importieren. RAD Studio erzeugt ECO-fähigen, Delphi- oder C#-Quelltext für die Modellelemente in den Klassendiagrammen der XMI-Datei. So exportieren Sie ein Modell im XMI-Format: 1. Öffnen Sie das Fenster Modellansicht, klicken Sie in der Hierarchie mit der rechten Maustaste auf den obersten Projektknoten und wählen Sie Projekt nach XMI exportieren. 2. Wählen Sie im Dialogfeld XMI exportieren die für das Tool, mit dem Sie die Modelldatei schlussendlich öffnen werden, geeignete XMI-Version und XMI-Codierung aus. 3. Klicken Sie auf Durchsuchen, um zu dem Zielordner zu navigieren. 4. Geben Sie eine Zieldateinamen für die exportierte Datei ein. 5. Klicken Sie im Dialogfeld XMI exportieren auf Exportieren. Siehe auch Website der Object Management Group (OMG) 2 UML-Features in Delphi für .NET Integrierte Modellierungstools - Übersicht Code-Visualisierung - Überblick ( see page 58) Verwenden des Modellansichtfensters und des Code-Visualisierungsdiagramms ( Verwenden des Übersichtsfensters ( see page 154) see page 155) Hinzufügen von Spalten zu einer Komponente OCL-Ausdruckseditor verwenden 151 Verwenden des Modellansichtfensters und RAD Studio für .NET 2.3 Anleitungen für die Modellierung 2.3.3 Verwenden des Modellansichtfensters und des Code-Visualisierungsdiagramms Die Code-Visualisierung ermöglicht das Anzeigen und Navigieren in der logischen Struktur Ihrer Anwendung. Die Projektverwaltung bietet dagegen eine dateizentrierte Ansicht. So zeigen Sie das Modellansichtfenster an: 1. Beginnen Sie ein neues Projekt oder laden Sie ein bestehendes. 2. Wählen Sie Ansicht Modellansicht. Das Fenster Modellansicht wird geöffnet. Es zeigt die Elemente Ihres Projekts in einer Hierarchie an. Verwenden des Modellansichtfensters und des Code-Visualisierungsdiagramms Verschachtelte Elemente in einem Klicken Sie auf das Pluszeichen (+) neben dem Symbol des Elements, um UML-Package, einer Klasse oder einem verschachtelte Elemente einzublenden, oder klicken Sie auf das Minuszeichen (-), Interface ein- oder ausblenden. um erschachtelte Elemente auszublenden. Anzeigen Code-Visualisierungsdiagramms einen .NET-Namespace oder Delphi-Unit eines Erweitern Sie das Symbol des Namespace oder der Unit ( ), und doppelklicken für Sie in der Modellhierarchie auf das Diagrammsymbol ( ). eine Anzeigen des Erweitern Sie in der Modellhierarchie das Projektsymbol ( ), und doppelklicken Code-Visualisierungsdiagramms für das auf das Diagrammsymbol. gesamte Projekt Öffnen des Quelltext-Editors für ein Klicken Sie mit der rechten Maustaste auf das Element, und wählen Sie Quelle bestimmtes Element in der öffnen. Beachten Sie, dass sich ein .NET-Namespace über mehrere Quelltextdateien erstrecken kann. Sie können eine Quelltextdatei für einen Modellhierarchie Namespace nicht direkt aus der Modellhierarchie öffnen. Öffnen des Klicken Sie mit der rechten Maustaste auf das Element, und wählen Sie Im Code-Visualisierungsdiagramms für ein Diagramm anzeigen. bestimmtes Element in der Modellhierarchie 2 Das Code-Visualisierungsdiagramm verfügt über eine Reihe von Funktionen zum Anzeigen von großen Modellen, Ein- oder Ausblenden von Attributen, Eigenschaften, usw. und zum direkten Wechseln von der grafischen Darstellung eines Elements im Diagramm zum entsprechenden Quelltext. Verwenden des Code-Visualisierungsdiagramms Neuanordnen Diagramm von Elementen im Klicken Sie auf das Element und ziehen Sie es an die neue Position. Ein- oder Ausblenden der Attribute, Klicken Sie auf das Pluszeichen (+) neben der Kategorie (Attribute, Operationen, etc.), Operationen, Eigenschaften und die Sie einblenden möchten. Klicken Sie auf das Minuszeichen (-), um die Elemente verschachtelten Typen für ein einer bestimmten Kategorie auszublenden. Element im Diagramm Ausführen eines Layouts für die Diagramm 152 automatischen Klicken Sie mit der rechten Maustaste auf eine beliebige Stelle im Elemente im Code-Visualisierungsdiagramm, und wählen Sie Layout Vollständiges Layout oder Layout Größen optimieren. 2.3 Anleitungen für die Modellierung RAD Studio für .NET Drucken des Diagramms Verwenden des Übersichtsfensters Klicken Sie mit der rechten Maustaste auf eine Code-Visualisierungsdiagramm, und wählen Sie Drucken. beliebige Stelle im Öffnen des Quelltext-Editors für ein Klicken Sie mit der rechten Maustaste auf das Element, und wählen Sie Zur Definition bestimmtes Element im gehe. Code-Visualisierungsdiagramm Speichern des Diagramms als Bild Klicken Sie mit der rechten Maustaste auf eine beliebige Code-Visualisierungsdiagramm, und wählen Sie Als Bild exportieren. Stelle im Anmerkung: Mit Ausnahme von "Code-Visualisierung - Überblick" und "Verwenden des Übersichtsfensters" stehen die unten aufgeführten Links nur für die Architect-Edition von RAD Studio zur Verfügung. Siehe auch Code-Visualisierung - Überblick ( see page 58) Verwenden des Übersichtsfensters ( see page 155) UML-Features in Delphi für .NET Integrierte Modellierungstools - Übersicht Importieren und Exportieren eines Modells mit XMI ( see page 153) Erstellen einer ECO-fähigen Benutzeroberfläche Hinzufügen von Spalten zu einer Komponente OCL-Ausdruckseditor verwenden 2.3.4 Verwenden des Übersichtsfensters Große, reale Modelle passen nicht in das Diagrammfenster. Um das Diagramm anzuzeigen, können Sie das Übersichtsfenster verwenden. So blättern Sie mit dem Übersichtsfenster durch das Modell: 1. Klicken Sie in der rechten, unteren Ecke des Diagramms auf die Schaltfläche Übersicht. Eine Miniaturansicht des gesamten Diagramms wird ein einem eigenen Fenster angezeigt. Ein kleines Rechteck im Übersichtsfenster enthält den Bereich des Modells, der aktuell im Diagramm angezeigt wird. 2. Klicken Sie im Übersichtsfenster auf das Rechteck und verschieben Sie es, um dynamisch den gewünschten Teil des Diagramms anzuzeigen. 2 3. Klicken Sie an eine beliebige Stelle außerhalb des Übersichtsfensters, um es zu schließen. Tip: Das Übersichtsfenster hat in der oberen, rechten Ecke ein Griffsymbol zum Ändern der Größe. Klicken Sie auf dieses Symbol und ziehen Sie es, um die Größe des Übersichtsfensters zu ändern. Beim Ändern der Größe des Fensters wird der Inhalt an die aktuelle Größe angepasst. Das Ändern der Größe ist dann sinnvoll, wenn das Modell so groß ist, dass Sie den Text auf den Miniaturdarstellungen im Übersichtsfenster nicht lesen können. Anmerkung: Mit Ausnahme von "Code-Visualisierung - Überblick" und "Verwenden des Modellansichtfensters und des Code-Visualisierungsdiagramms" stehen die unten aufgeführten Links nur für die Architect-Edition von RAD Studio zur Verfügung. 153 Verwenden des Übersichtsfensters RAD Studio für .NET 2.3 Anleitungen für die Modellierung Siehe auch Code-Visualisierung - Überblick ( see page 58) Verwenden des Modellansichtfensters und des Code-Visualisierungsdiagramms ( UML-Features in Delphi für .NET Integrierte Modellierungstools - Übersicht Importieren und Exportieren eines Modells mit XMI ( Hinzufügen von Spalten zu einer Komponente OCL-Ausdruckseditor verwenden 2 154 see page 153) see page 154) 2.4 VCL für .NET – Anleitungen RAD Studio für .NET 2.4 VCL für .NET – Anleitungen Dieser Abschnitt enthält Anleitungen zur Entwicklung von VCL.NET-Anwendungen. Themen Name Beschreibung VCL-Formularanwendungen mit Grafiken erstellen ( see page 161) Mit jedem der nachfolgend beschriebenen Verfahren wird eine VCL-Formularanwendung erstellt, in der Grafiken verwendet werden. Erstellen Sie eines oder mehrere dieser Beispiele. * 1. Gerade Linien zeichnen 2. Rechtecke und Ellipsen zeichnen 3. Ein Polygon zeichnen 4. Eine Bitmap-Grafik anzeigen 5. Eine Bitmap-Grafik in ein Kombinationsfeld einfügen ADO.NET-Datenbankanwendungen mit VCL.NET-Formularen erstellen ( page 161) see In der folgenden Anleitung wird beschrieben, wie eine ADO.NET-Datenbankanwendung erstellt wird. Die Erstellung einer VCL.NET-ADO.NET-Anwendung umfasst die folgenden grundlegenden Schritte: 1. Die Datenbankverbindung einrichten. 2. Die Datenmenge einrichten. 3. Datenprovider, Client-Datenmenge und Datenquelle einrichten. 4. Eine DataGrid-Komponente mit den Verbindungskomponenten verbinden. 5. Die Anwendung ausführen. VCL-Formularanwendung erstellen ( see page 163) Aktionen in einer VCL-Formularanwendung erstellen ( Im Folgenden werden die wichtigsten Schritte zum Erstellen einer VCL-Formularanwendung in RAD Studio erläutert. see page 163) Die folgenden Anleitungen veranschaulichen, wie in RAD Studio Aktionen mit dem Editor für Aktionslisten erstellt werden. Es wird eine einfache Anwendung angelegt und die Erstellung eines Menüs namens Bearbeiten mit den Befehlen Ausschneiden und Einfügen beschrieben, mit denen Daten aus einem Memofeld ausgeschnitten und wieder darin eingefügt werden können. Die Erstellung der VCL-Anwendung umfasst die folgenden grundlegenden Schritte: 1. Hauptmenü, Aktionsliste und Memofeld einem Formular hinzufügen. 2. Aktionen für das Ausschneiden und Einfügen erstellen. 3. Die Aktionen zum Hauptmenü hinzufügen und mit der Aktionskategorie für das Menü Bearbeiten verknüpfen. 4. Die Anwendung compilieren und ausführen. 155 2 RAD Studio für .NET VCL-Formularanwendung "Hello World" erstellen ( see page 165) 2.4 VCL für .NET – Anleitungen Anhand der Windows Forms-Anwendung Hello World werden die Schritte erläutert, die für die Erstellung einer VCL-Formulare-Anwendung ausgeführt werden müssen. Die Anwendung verwendet ein VCL-Formular, ein Steuerelement und ein Ereignis und zeigt als Antwort auf eine Benutzeraktion ein Dialogfeld an. Um die Anwendung Hello World zu erstellen, sind die folgenden Schritte erforderlich: 1. Ein VCL.NET-Formular mit einer Schaltfläche erstellen. 2. Quelltext einfügen, damit "Hello World" angezeigt wird, wenn auf die Schaltfläche geklickt wird. 3. Die Anwendung ausführen. Mit dem Aktionsmanager Aktionen in einer VCL-Formularanwendung erstellen ( see page 166) Die folgende Anleitung veranschaulicht, wie in RAD Studio Aktionen mit dem Aktionsmanager erstellt werden. Zu diesem Zweck wird eine einfache Benutzeroberfläche mit einem Bereich zur Textbearbeitung erstellt und beschrieben, wie im Dateimenü ein Befehl zum Öffnen von Dateien erzeugt wird. Die Erstellung der VCL-Anwendung mit Aktionsmanager-Aktionen umfasst die folgenden grundlegenden Schritte: 1. Dem Aktionsmanager in einem Formular eine Datei-Öffnen-Aktion hinzufügen. 2. Das Hauptmenü erstellen. 3. Die Aktion dem Menü hinzufügen. 4. Die Anwendung compilieren und ausführen. dbExpress.NET-Datenbankanwendungen mit VCL-Formularen erstellen ( page 167) see In den folgenden Anleitungen wird beschrieben, wie eine dbExpress-Datenbankanwendung erstellt wird. Die Erstellung einer dbExpress.NET-Datenbankanwendung mit VCL-Formularen umfasst die folgenden grundlegenden Schritte: 1. Die Datenbankverbindung einrichten. 2. Die unidirektionale Datenmenge einrichten. 3. Datenprovider, Client-Datenmenge und Datenquelle einrichten. 4. Eine DataGrid-Komponente mit den Verbindungskomponenten verbinden. 5. Die Anwendung ausführen. Anwendungen mit XML-Komponenten erstellen ( see page 169) Ausführen von Änderungen, die wegen der Unterstützung von 64-Bit .NET 2.0 erforderlich sind ( see page 171) In diesem Beispiel wird eine VCL-Formulare-Anwendung erstellt, die mit Hilfe einer XMLDocument-Komponente den Inhalt einer XML-Datei anzeigt. Für die Unterstützung von 64-Bit .NET 2.0 waren einige Änderungen erforderlich. Wegen dieser Änderungen könnten kleinere Quelltextänderungen erforderlich werden, damit vorhandene Anwendungen korrekt arbeiten. Dieses Thema beschreibt die Änderungen im Detail. Es gibt zwei allgemeine Bereiche: 1. Geänderte Quelltext-Pattern 2 2. Windows API-Deklarationen für einen Callbacks und Records Warnung: Diese Modifikationen sind wegen der Änderungen zur Unterstützung von 64-Bit-Systemen erforderlich. Sie müssen für Anwendungen vorgenommen werden, die sowohl auf 32-Bit- als auch auf 64-Bit-Systemen ausgeführt werden sollen. Eine neue VCL.NET-Komponente erstellen ( 156 see page 174) Mit dem Experten für neue VCL-Komponenten können Sie eine neue VCL.NET-Komponente erstellen und der Tool-Palette hinzufügen. 2.4 VCL für .NET – Anleitungen RAD Studio für .NET Bitmap-Grafik in einer VCL-Formularanwendung anzeigen ( see page 175) VCL-Formularanwendungen mit Grafiken Mit den folgenden Schritten wird eine Bitmap-Grafik aus einer Datei geladen und in einem VCL-Formular angezeigt: 1. Ein VCL-Formular mit einer Schaltfläche erstellen. 2. Eine Bitmap-Grafik bereitstellen. 3. Quelltext für die OnClick-Ereignisbehandlungsroutine der Schaltfläche schreiben, um eine Bitmap-Grafik zu laden und anzuzeigen. 4. Die Anwendung compilieren und ausführen. Rechtecke und Ellipsen in einer VCL-Formularanwendung zeichnen ( 176) see page Mit den folgenden Schritten werden ein Rechteck und eine Ellipse in einem VCL-Formular gezeichnet: 1. Ein VCL-Formular erstellen. 2. Eine Behandlungsroutine für das OnPaint-Ereignis des Formulars schreiben, die ein Rechteck und eine Ellipse zeichnet. 3. Die Anwendung compilieren und ausführen. Abgerundete Rechtecke in einer VCL-Formularanwendung zeichnen ( page 177) see Mit den folgenden Schritten wird ein abgerundetes Rechteck in einem VCL-Formular gezeichnet: 1. Ein VCL-Formular erstellen. 2. Eine Behandlungsroutine für das OnPaint-Ereignis des Formulars schreiben, die ein Polygon zeichnet. 3. Die Anwendung compilieren und ausführen. Gerade Linien in einer VCL-Formularanwendung zeichnen ( see page 177) Mit den folgenden Schritten werden zwei diagonal verlaufende gerade Linien in einem VCL-Formular gezeichnet: 1. Ein VCL-Formular erstellen. 2. Eine Behandlungsroutine für das OnPaint-Ereignis des Formulars schreiben, die die geraden Linien zeichnet. 3. Die Anwendung compilieren und ausführen. Bitmap-Grafik in ein Steuerelement einer VCL-Formularanwendung einfügen ( see page 178) Mit den folgenden Schritten wird eine Bitmap-Grafik in ein Kombinationsfeld in einer VCL-Formularanwendung eingefügt: 1. Ein VCL-Formular erstellen. 2. Komponenten auf dem Formular platzieren. 3. Eigenschaften der Komponenten im Objektinspektor festlegen. 4. Ereignisbehandlungsroutinen für die Zeichenaktion der Komponente schreiben. 2 5. Die Anwendung compilieren und ausführen. .NET-Steuerelemente in VCL.NET importieren ( see page 180) Es kann Fälle geben, in denen Sie .NET-Komponenten in VCL.NET-Formularen einsetzen möchten. .NET-Komponenten können nicht direkt in VCL-Anwendungen aufgenommen werden. Sie können diese Komponenten jedoch in einen ActiveX-Wrapper verpacken, den Sie dann der VCL.NET-Anwendung hinzufügen. RAD Studio stellt hierfür den .NET-Importexperten zur Verfügung. 2.4.1 VCL-Formularanwendungen mit Grafiken erstellen Mit jedem der nachfolgend beschriebenen Verfahren wird eine VCL-Formularanwendung erstellt, in der Grafiken verwendet werden. Erstellen Sie eines oder mehrere dieser Beispiele. * 157 ADO.NET-Datenbankanwendungen mit RAD Studio für .NET 2.4 VCL für .NET – Anleitungen 1. Gerade Linien zeichnen 2. Rechtecke und Ellipsen zeichnen 3. Ein Polygon zeichnen 4. Eine Bitmap-Grafik anzeigen 5. Eine Bitmap-Grafik in ein Kombinationsfeld einfügen Siehe auch Überblick zu VCL.NET ( see page 77) Gerade Linien in einer VCL-Formularanwendung zeichnen ( see page 177) Rechtecke und Ellipsen in einer VCL-Formularanwendung zeichnen ( Abgerundete Rechtecke in einer VCL-Anwendung zeichnen ( Bitmap-Grafik in einer VCL-Formularanwendung anzeigen ( see page 176) see page 177) see page 175) Eine Bitmap-Grafik in ein Kombinationsfeld einer VCL-Formularanwendung einfügen ( see page 178) 2.4.2 ADO.NET-Datenbankanwendungen mit VCL.NET-Formularen erstellen In der folgenden Anleitung wird beschrieben, wie eine ADO.NET-Datenbankanwendung erstellt wird. Die Erstellung einer VCL.NET-ADO.NET-Anwendung umfasst die folgenden grundlegenden Schritte: 1. Die Datenbankverbindung einrichten. 2. Die Datenmenge einrichten. 3. Datenprovider, Client-Datenmenge und Datenquelle einrichten. 4. Eine DataGrid-Komponente mit den Verbindungskomponenten verbinden. 5. Die Anwendung ausführen. So fügen Sie eine ADO-Verbindungskomponente hinzu: 1. Wählen Sie Datei Neu Weitere Delphi für .NET-Projekte VCL-Formularanwendung. Der VCL-Formular-Designer wird angezeigt. 2. Ziehen Sie aus der Kategorie dbGO der Tool-Palette eine TADOConnection-Komponente in das Formular. 2 3. Doppelklicken Sie auf die TADOConnection-Komponente, um das Dialogfeld Verbindungs-String zu öffnen. 4. Wählen Sie bei Bedarf Verbindungs-String verwenden, und klicken Sie dann auf die Schaltfläche Aufbauen, um das Dialogfeld Verknüpfungseigenschaften anzuzeigen. 5. Wählen Sie auf der Seite Provider des Dialogfelds Microsoft Jet 4.0 OLE DB Provider aus, und klicken Sie auf die Schaltfläche Weiter, um die Seite Verbindungen anzuzeigen. 6. Klicken Sie auf der Seite Verbindungen auf die Ellipsen-Schaltfläche, und wechseln Sie zum Verzeichnis mit der Datenbank dbdemos.mdb. Der Standardpfad zu dieser Datenbank lautet C:\Programme\Gemeinsame Dateien\Borland Shared\Data. 7. Geben Sie Admin in das Feld Benutzername ein (falls dieser Eintrag nicht bereits vorhanden ist), und aktivieren Sie das Kontrollkästchen für ein leeres Passwort. 8. Klicken Sie auf Verbindung testen, um die Verbindung zu überprüfen. Der Verbindungsstatus wird in einem Dialogfeld angezeigt. 158 2.4 VCL für .NET – Anleitungen RAD Studio für .NET VCL-Formularanwendung erstellen 9. Klicken Sie zweimal auf OK, um die Dialogfelder Verknüpfungseigenschaften und Verbindungs-String zu schließen. So richten Sie die Datenmenge ein: 1. Doppelklicken Sie in der Kategorie dbGO auf eine TADODataSet-Komponente, um diese in das Formular einzufügen. 2. Weisen Sie im Objektinspektor der Eigenschaft Connection aus der Kategorie Linkages den Wert ADOConnection1 zu. 3. Weisen Sie der Eigenschaft CommandText einen SQL-Befehl zu, beispielsweise Select * from orders. Sie können diese Select-Anweisung entweder direkt im Objektinspektor eingeben oder sie mit Hilfe des Anweisungstext-Editors formulieren. Sie öffnen diesen Editor, indem Sie auf die Ellipsenschaltfläche rechts neben CommandText klicken. Tip: Wenn Sie Hilfe bei der Verwendung des Anweisungstext-Editors benötigen, klicken Sie auf die Schaltfläche Hilfe oder drücken F1. 4. Setzen Sie die Eigenschaft Active auf True, um die Datenmenge zu öffnen. Sie werden aufgefordert, sich anzumelden. 5. Geben Sie als Benutzernamen Admin ein. 6. Lassen Sie das Feld für das Passwort leer. So fügen Sie den Provider hinzu: 1. Doppelklicken Sie in der Kategorie Datenzugriff der Tool-Palette auf eine TDataSetProvider-Komponente, um sie am Beginn des Formulars einzufügen. 2. Setzen Sie im Objektinspektor die Eigenschaft DataSet auf ADODataSet1. So fügen Sie eine Client-Datenmenge hinzu: 1. Doppelklicken Sie in der Kategorie Datenzugriff der Tool-Palette auf eine TClientDataSet-Komponente, um sie rechts neben der DataSetProvider-Komponente in das Formular einzufügen. 2. Setzen Sie im Objektinspektor die Eigenschaft ProviderName auf DataSetProvider1. 3. Setzen Sie die Eigenschaft Active auf True, damit Daten an die Anwendung übergeben werden können. Eine Datenquelle stellt eine Verbindung mit einer Clientdatenmenge über datensensitive Steuerelemente her. Jedes datensensitive Steuerelement muss mit einer Datenquellenkomponente verknüpft sein, damit Daten zum Anzeigen und Bearbeiten zur Verfügung stehen. Ebenso müssen alle Datenmengen mit einer Datenquellenkomponente verknüpft sein, damit ihre Daten in datensensitiven Steuerelementen des Formulars angezeigt und bearbeitet werden können. So fügen Sie die Datenquelle hinzu: 1. Doppelklicken Sie in der Kategorie Datenzugriff der Tool-Palette auf eine TDataSource-Komponente, um sie rechts neben der ClientDataSet-Komponente in das Formular einzufügen. 2. Setzen Sie im Objektinspektor die Eigenschaft DataSet auf ClientDataSet1. So verbinden Sie ein Datengitter mit der Datenmenge: 1. Doppelklicken Sie im Bereich Datensteuerung der Tool-Palette auf eine TDBGrid-Komponente, um sie in das Formular einzufügen. 2 2. Setzen Sie im Objektinspektor die Eigenschaft DataSource auf DataSource1. 3. Wählen Sie Start Ausführen. Sie werden aufgefordert, sich anzumelden. 4. Geben Sie als Benutzernamen Admin ein. 5. Lassen Sie das Feld für das Passwort leer. 6. Klicken Sie auf OK. Die Anwendung wird compiliert und zeigt ein VCL-Formular mit einer DBGrid-Komponente an. Siehe auch Überblick zu VCL.NET ( see page 77) dbExpress.NET-Datenbankanwendungen mit VCL-Formularen erstellen ( see page 167) 159 Aktionen in einer VCL-Formularanwendung RAD Studio für .NET 2.4 VCL für .NET – Anleitungen 2.4.3 VCL-Formularanwendung erstellen Im Folgenden werden die wichtigsten Schritte zum Erstellen einer VCL-Formularanwendung in RAD Studio erläutert. So erstellen Sie ein VCL-Formular: 1. Wählen Sie Datei Neu Weitere. Das Dialogfeld Objektgalerie wird geöffnet. 2. Wählen Sie Delphi für .NET-Projekte. 3. Doppelklicken Sie auf das Symbol VCL-Formularanwendung. Der VCL-Formular-Designer wird angezeigt. 4. Ziehen Sie Komponenten aus der Tool-Palette in das Formular, um die Benutzeroberfläche zu erstellen. 5. Geben Sie den Quelltext für die Steuerelemente ein. So verbinden Sie Quelltext mit einem Steuerelement: 1. Doppelklicken Sie im Formular auf eine Komponente. Der Quelltext-Editor wird angezeigt. Der Cursor befindet sich bereits zwischen den Klammern der Ereignisbehandlungsroutine. 2. Geben Sie den Quelltext für die Anwendungslogik ein. 3. Speichern und compilieren Sie die Anwendung. Siehe auch Überblick zu VCL.NET ( see page 77) 2.4.4 Aktionen in einer VCL-Formularanwendung erstellen Die folgenden Anleitungen veranschaulichen, wie in RAD Studio Aktionen mit dem Editor für Aktionslisten erstellt werden. Es wird eine einfache Anwendung angelegt und die Erstellung eines Menüs namens Bearbeiten mit den Befehlen Ausschneiden und Einfügen beschrieben, mit denen Daten aus einem Memofeld ausgeschnitten und wieder darin eingefügt werden können. Die Erstellung der VCL-Anwendung umfasst die folgenden grundlegenden Schritte: 1. Hauptmenü, Aktionsliste und Memofeld einem Formular hinzufügen. 2. Aktionen für das Ausschneiden und Einfügen erstellen. 3. Die Aktionen zum Hauptmenü hinzufügen und mit der Aktionskategorie für das Menü Bearbeiten verknüpfen. 2 4. Die Anwendung compilieren und ausführen. So fügen Sie Hauptmenü, Aktionsliste und Memofeld einem Formular hinzu: 1. Wählen Sie Datei Neu Weitere Delphi für .NET-Projekte VCL-Formularanwendung, um ein neues Formular zu erstellen. 2. Klicken Sie auf die Registerkarte Design, um zum VCL-Formular-Designer zu wechseln. 3. Ziehen Sie aus der Kategorie Standard der Tool-Palette eine TMainMenu-, TActionList- und eine TMemo-Komponente in das Formular. So definieren Sie die Aktionen: 1. Doppelklicken Sie im Formular auf ActionList1. Der Aktionslisten-Editor wird geöffnet. 2. Wählen Sie den Eintrag Neue Standardaktion aus der Dropdown-Liste, um das Dialogfeld Standardaktionsklassen zu 160 2.4 VCL für .NET – Anleitungen RAD Studio für .NET VCL-Formularanwendung "Hello World" öffnen. 3. Blättern Sie zur Aktion TEditCut, markieren Sie sie, und klicken Sie auf OK. Im Editor wird in der Aktionsliste EditCut1 angezeigt. 4. Wählen Sie den Eintrag Neue Standardaktion aus der Dropdown-Liste, um das Dialogfeld Standardaktionsklassen zu öffnen. 5. Blättern Sie zur Aktion TEditPaste, markieren Sie sie, und klicken Sie auf OK. Im Editor wird in der Liste Aktionen EditPaste1 angezeigt. 6. Schließen Sie den Aktionslisten-Editor. So fügen Sie die Aktionen Ausschneiden und Einfügen der Kategorie Bearbeiten des Hauptmenüs hinzu: 1. Doppelklicken Sie im Formular auf die MainMenu1-Komponente. Der Editor für MainMenu1 wird angezeigt. Die erste leere Befehlskategorie ist ausgewählt. 2. Geben Sie im Objektinspektor für die Eigenschaft Caption den Wert Bearbeiten ein, und drücken Sie die EINGABETASTE. Bearbeiten wird jetzt als erste Befehlskategorie angezeigt. 3. Klicken Sie auf Bearbeiten, um unmittelbar darunter eine leere Aktion anzuzeigen. 4. Klicken Sie auf die leere Aktion, um sie auszuwählen. 5. Wählen Sie im Objektinspektor in der Dropdown-Liste mit den Aktionen für die Eigenschaft Action (Kategorie Linkage) den Eintrag EditCut1. 6. Erweitern Sie, falls erforderlich, die Liste der Eigenschaften unter Action, geben Sie für die Eigenschaft Caption den Wert Ausschneiden und als Kategorie Bearbeiten ein, und drücken Sie dann die EINGABETASTE. Ausschneiden wird jetzt als erste Aktion angezeigt. 7. Klicken Sie im Editor für MainMenu1 auf die zweite leere Aktion unterhalb von Ausschneiden, um sie auszuwählen. 8. Wählen Sie im Objektinspektor in der Dropdown-Liste mit den Aktionen für die Eigenschaft Action (Kategorie Linkage) den Eintrag EditPaste. 9. Erweitern Sie die Liste der Eigenschaften unter Action, und geben Sie (falls erforderlich) für die Eigenschaft Caption den Wert Einfügen und als Kategorie Bearbeiten ein. Drücken Sie danach die EINGABETASTE. Einfügen wird jetzt als zweite Aktion angezeigt. So compilieren Sie die Anwendung und führen sie aus: 1. Speichern Sie alle Dateien des Projekts. 2. Wählen Sie Start Ausführen. Die Anwendung wird ausgeführt und zeigt ein Formular mit der Hauptmenüleiste und dem Menü Bearbeiten an. 3. Markieren Sie Text im Memofeld. 4. Wählen Sie Bearbeiten Ausschneiden. Der Text wird aus dem Memofeld ausgeschnitten. 5. Wählen Sie Bearbeiten Einfügen. Der Text wird wieder in das Memofeld eingefügt. 2 Siehe auch Überblick zu VCL.NET ( see page 77) VCL-Formularanwendung erstellen ( see page 163) 2.4.5 VCL-Formularanwendung "Hello World" erstellen Anhand der Windows Forms-Anwendung Hello World werden die Schritte erläutert, die für die Erstellung einer VCL-Formulare-Anwendung ausgeführt werden müssen. Die Anwendung verwendet ein VCL-Formular, ein Steuerelement und ein Ereignis und zeigt als Antwort auf eine Benutzeraktion ein Dialogfeld an. 161 Mit dem Aktionsmanager Aktionen in einer RAD Studio für .NET 2.4 VCL für .NET – Anleitungen Um die Anwendung Hello World zu erstellen, sind die folgenden Schritte erforderlich: 1. Ein VCL.NET-Formular mit einer Schaltfläche erstellen. 2. Quelltext einfügen, damit "Hello World" angezeigt wird, wenn auf die Schaltfläche geklickt wird. 3. Die Anwendung ausführen. So erstellen Sie ein VCL-Formular: 1. Wählen Sie Datei Neu Weitere Delphi für .NET-Projekte VCL-Formularanwendung. Der VCL-Formular-Designer wird angezeigt. 2. Klicken Sie auf die Registerkarte Design, um in die Design-Ansicht zu wechseln. 3. Ziehen Sie aus der Kategorie Standard der Tool-Palette eine TButton-Komponente in das Formular. So zeigen Sie den String "Hello World" an: 1. Markieren Sie im Formular das Steuerelement Button1. 2. Doppelklicken Sie im Objektinspektor auf das Ereignis OnClick auf der Registerkarte Ereignisse. Der Quelltext-Editor wird angezeigt. Der Cursor befindet sich bereits im Block der Ereignisbehandlungsroutine TForm1.Button1Click. 3. Bewegen Sie den Cursor vor das reservierte Wort begin, und drücken Sie dann die EINGABETASTE. Über dem Codeblock wird eine neue Zeile eingefügt. 4. Bewegen Sie den Cursor in die neue Zeile, und geben Sie die folgende Variablendeklaration ein: var s: string; 5. Bewegen Sie den Cursor in den Codeblock, und geben Sie folgenden Quelltext ein: s:= 'Hello World!'; ShowMessage(s); So führen Sie die Anwendung "Hello World" aus: 1. Speichern Sie die Projektdateien. 2. Wählen Sie Start Ausführen, um die Anwendung zu erstellen und auszuführen. Auf dem Formular wird eine Schaltfläche mit der Bezeichnung Button1 angezeigt. 3. Klicken Sie auf Button1. Es wird ein Dialogfeld mit der Meldung "Hello world!" angezeigt. 4. Klicken Sie auf OK, um das Dialogfeld mit der Meldung zu schließen. 5. Schließen Sie das VCL-Formular, um in die IDE zurückzukehren. Siehe auch Überblick zu VCL.NET ( see page 77) VCL-Formularanwendung erstellen ( see page 163) 2 2.4.6 Mit dem Aktionsmanager Aktionen in einer VCL-Formularanwendung erstellen Die folgende Anleitung veranschaulicht, wie in RAD Studio Aktionen mit dem Aktionsmanager erstellt werden. Zu diesem Zweck wird eine einfache Benutzeroberfläche mit einem Bereich zur Textbearbeitung erstellt und beschrieben, wie im Dateimenü ein Befehl zum Öffnen von Dateien erzeugt wird. Die Erstellung der VCL-Anwendung mit Aktionsmanager-Aktionen umfasst die folgenden grundlegenden Schritte: 1. Dem Aktionsmanager in einem Formular eine Datei-Öffnen-Aktion hinzufügen. 162 2.4 VCL für .NET – Anleitungen RAD Studio für .NET dbExpress.NET-Datenbankanwendungen 2. Das Hauptmenü erstellen. 3. Die Aktion dem Menü hinzufügen. 4. Die Anwendung compilieren und ausführen. So fügen Sie dem Aktionsmanager eine Aktion zum Öffnen von Dateien hinzu: 1. Wählen Sie Datei Neu Weitere Delphi für .NET-Projekte VCL-Formularanwendung, um ein neues Formular zu erstellen.. 2. Ziehen Sie aus der Seite Zusätzlich der Tool-Palette eine TActionManager-Komponente in das Formular. 3. Doppelklicken Sie auf die TActionManager-Komponente, um den Aktionsmanager-Editor anzuzeigen. Tip: Wenn Sie Titel von nicht-visuellen Komponenten wie TActionManager anzeigen möchten, wählen Sie Tools->Umgebungsoptionen . Aktivieren Sie danach auf der Registerkarte Designer die Option Komponenten-Titel zeigen, und klicken Sie auf OK. 4. Aktivieren Sie die Registerkarte Aktionen. 5. Wählen Sie den Eintrag Neue Standardaktion aus der Dropdown-Liste, um das Dialogfeld Standardaktionsklassen zu öffnen. 6. Blättern Sie zur Kategorie Datei, und klicken Sie auf die Aktion TFileOpen. 7. Klicken Sie auf OK, um das Dialogfeld zu schließen. 8. Wählen Sie im Aktionsmanager-Editor die Kategorie Datei. Im Listenfeld Aktionen wird der Eintrag Öffnen angezeigt. 9. Klicken Sie auf Schließen, um den Editor zu schließen. So erstellen Sie das Hauptmenü und fügen ihm die Datei-Öffnen-Aktion hinzu: 1. Ziehen Sie aus der Seite Zusätzlich der Tool-Palette eine TActionMainMenuBar-Komponente in das Formular. 2. Öffnen Sie den Aktionsmanager-Editor, und wählen Sie die Kategorie Datei im Listenfeld Kategorien. 3. Ziehen Sie den Eintrag Datei in die leere Menüleiste. In der Menüleiste wird nun Datei angezeigt. 4. Klicken Sie auf Schließen, um den Editor zu schließen. So compilieren Sie die Anwendung und führen sie aus: 1. Wählen Sie Start Ausführen. Die Anwendung wird ausgeführt und zeigt ein Formular mit der Hauptmenüleiste und dem Menü Datei an. 2. Wählen Sie Datei Öffnen. Das Dialogfeld zum Öffnen von Dateien wird angezeigt. Siehe auch Überblick zu VCL.NET ( see page 77) VCL-Formularanwendung erstellen ( see page 163) 2 2.4.7 dbExpress.NET-Datenbankanwendungen mit VCL-Formularen erstellen In den folgenden Anleitungen wird beschrieben, wie eine dbExpress-Datenbankanwendung erstellt wird. Die Erstellung einer dbExpress.NET-Datenbankanwendung mit VCL-Formularen umfasst die folgenden grundlegenden Schritte: 1. Die Datenbankverbindung einrichten. 2. Die unidirektionale Datenmenge einrichten. 163 dbExpress.NET-Datenbankanwendungen RAD Studio für .NET 2.4 VCL für .NET – Anleitungen 3. Datenprovider, Client-Datenmenge und Datenquelle einrichten. 4. Eine DataGrid-Komponente mit den Verbindungskomponenten verbinden. 5. Die Anwendung ausführen. So fügen Sie eine dbExpress-Verbindungskomponente hinzu: 1. Wählen Sie Datei Neu VCL-Formularanwendung. Der VCL-Formular-Designer wird angezeigt. 2. Ziehen Sie aus der Kategorie dbExpress der Tool-Palette eine TSQLConnection-Komponente in das Formular. 3. Doppelklicken Sie auf die TSQLConnection-Komponente, um den Verbindungseditor anzuzeigen. 4. Wählen Sie im Verbindungseditor in der Liste Verbindungsname den Eintrag IBConnection. 5. Geben Sie unter Einstellungen im Feld für die Datenbank den Pfad zur InterBase-Datenbankdatei employee.gdb ein. Diese Datei befindet sich standardmäßig im Verzeichnis C:\Programme\Gemeinsame Dateien\CodeGear Shared\Data. 6. Übernehmen Sie die Werte im Feld User_Name (sysdba) und Password (masterkey). 7. Um die Verbindung zu testen, klicken Sie auf die Schaltfläche mit dem Häkchen (die sich über der Liste Verbindungsname befindet). Anmerkung: Sie werden aufgefordert, sich anzumelden. Verwenden Sie das Passwort masterkey. Wenn die Verbindung funktioniert, wird eine Bestätigungsmeldung angezeigt. Kann keine Verbindung zur Datenbank hergestellt werden, überprüfen Sie, ob InterBase installiert ist und ob der Server gestartet wurde. 8. Klicken Sie auf OK, um den Verbindungseditor zu schließen und die Änderungen zu speichern. So richten Sie die unidirektionale Datenmenge ein: 1. Ziehen Sie aus der Kategorie dbExpress der Tool-Palette eine TSQLDataSet-Komponente an den Beginn des Formulars. 2. Wählen Sie im Objektinspektor in der Dropdown-Liste der Eigenschaft SQLConnection den Eintrag SQLConnection1. 3. Weisen Sie der Eigenschaft CommandText einen SQL-Befehl zu, beispielsweise Select * from sales. Sie können als SQL-Befehl entweder eine Select-Anweisung im Objektinspektor eingeben oder auf die Ellipsen-Schaltfläche rechts neben CommandText klicken, um den Anweisungstext-Editor anzuzeigen, in dem Sie eine Abfrageanweisung erstellen können. Tip: Wenn Sie Hilfe bei der Verwendung des Anweisungstext-Editors benötigen, klicken Sie auf die Schaltfläche Hilfe oder drücken F1. 4. Setzen Sie im Objektinspektor die Eigenschaft Active auf True, um die Datenmenge zu öffnen. So fügen Sie den Provider hinzu: 1. Ziehen Sie aus der Kategorie Datenzugriff der Tool-Palette eine TDataSetProvider-Komponente an den Beginn des Formulars. 2 2. Wählen Sie im Objektinspektor in der Dropdown-Liste der Eigenschaft DataSet den Eintrag SQLDataSet1. So fügen Sie eine Client-Datenmenge hinzu: 1. Ziehen Sie aus der Kategorie Datenzugriff der Tool-Palette eine TClientDataSet-Komponente rechts neben die DataSetProvider-Komponente in das Formular. 2. Wählen Sie im Objektinspektor in der Dropdown-Liste der Eigenschaft ProviderName den Eintrag DataSetProvider1. 3. Setzen Sie die Eigenschaft Active auf True, damit Daten an die Anwendung übergeben werden können. Eine Datenquelle stellt eine Verbindung mit einer Clientdatenmenge über datensensitive Steuerelemente her. Jedes datensensitive Steuerelement muss mit einer Datenquellenkomponente verknüpft sein, damit Daten zum Anzeigen und Bearbeiten zur Verfügung stehen. Ebenso müssen alle Datenmengen mit einer Datenquellenkomponente verknüpft sein, damit ihre Daten in datensensitiven Steuerelementen des Formulars angezeigt und bearbeitet werden können. 164 2.4 VCL für .NET – Anleitungen RAD Studio für .NET Anwendungen mit XML-Komponenten So fügen Sie die Datenquelle hinzu: 1. Ziehen Sie aus der Kategorie Datenzugriff der Tool-Palette eine TDataSource-Komponente rechts neben die ClientDataSet-Komponente in das Formular. 2. Setzen Sie im Objektinspektor die Eigenschaft DataSet auf ClientDataSet1. So verbinden Sie ein Datengitter mit der Datenmenge: 1. Ziehen Sie aus der Kategorie Datensteuerung der Tool-Palette eine TDBGrid-Komponente in das Formular. 2. Wählen Sie im Objektinspektor in der Dropdown-Liste der Eigenschaft DataSource den Eintrag DataSource1. 3. Speichern Sie alle Dateien des Projekts. 4. Wählen Sie Start Start. Sie werden zur Eingabe eines Passworts aufgefordert. 5. Geben Sie masterkey als Passwort ein. Die Anwendung wird compiliert und zeigt ein VCL.NET-Formular mit einer DBGrid-Komponente an. Siehe auch Überblick zu VCL.NET ( see page 77) 2.4.8 Anwendungen mit XML-Komponenten erstellen In diesem Beispiel wird eine VCL-Formulare-Anwendung erstellt, die mit Hilfe einer XMLDocument-Komponente den Inhalt einer XML-Datei anzeigt. Die folgenden grundlegenden Schritte werden ausgeführt: 1. Ein XML-Dokument erstellen. 2. Ein VCL-Formular erstellen. 3. Eine XMLDocument-Komponente in das Formular einfügen und mit der XML-Datei verknüpfen. 4. VCL-Komponenten für die Anzeige des XML-Dateiinhalts erstellen. 5. Ereignisbehandlungsroutinen für die Anzeige des Inhalts von untergeordneten Knoten in der XML-Datei schreiben. 6. Die Anwendung compilieren und ausführen. So erstellen Sie das XML-Dokument: 1. Kopieren Sie den folgenden Text in einem Texteditor in eine Datei. <?xml version="1.0" encoding="UTF-8" standalone="no" ?> <!DOCTYPE StockHoldings [ <!ELEMENT StockHoldings (Stock+)> <!ELEMENT Stock (name)> <!ELEMENT Stock (price)> <!ELEMENT Stock (symbol)> <!ELEMENT Stock (shares)> ]> 2 <StockHoldings> <Stock exchange="NASDAQ"> <name>Borland</name> <price>10.375</price> <symbol>BORL</symbol> <shares>100</shares> </Stock> 165 Anwendungen mit XML-Komponenten RAD Studio für .NET 2.4 VCL für .NET – Anleitungen <Stock exchange="NYSE"> <name>MyCompany</name> <price>8.75</price> <symbol>MYCO</symbol> <shares type="preferred">25</shares> </Stock> </StockHoldings> 2. Speichern Sie die Datei als XML-Dokument auf dem lokalen Laufwerk. Weisen Sie ihr den Namen stock.xml zu. 3. Öffnen Sie das Dokument im Browser. Der Inhalt der Datei sollte fehlerfrei angezeigt werden. Anmerkung: Im Browser können Sie den Text der Quelldatei durch Auswahl von Ansicht->Quelle anzeigen. So erstellen Sie ein Formular mit einer XMLDocument-Komponente: 1. Starten Sie ein neues Projekt. 2. Wählen Sie Datei Neu Weitere. 3. Wählen Sie im Dialogfeld Objektgalerie die Kategorie Delphi für .NET-Projekte. 4. Doppelklicken Sie auf das Symbol VCL-Formularanwendung. Der VCL-Formular-Designer wird angezeigt. 5. Ziehen Sie aus der Kategorie Internet der Tool-Palette eine TXMLDocument-Komponente in das Formular. 6. Klicken Sie im Objektinspektor auf die Ellipsen-Schaltfläche neben der Eigenschaft FileName, wechseln Sie zur neu erstellten XML-Datei, und öffnen Sie diese. Die XML-Datei ist mit der TXMLDocument-Komponente verknüpft. 7. Setzen Sie im Objektinspektor die Eigenschaft Active auf True. So richten Sie die VCL-Komponenten ein: 1. Ziehen Sie aus der Seite Standard der Tool-Palette eine TMemo-Komponente in das Formular. 2. Ziehen Sie aus der Seite Standard der Tool-Palette zwei TButton-Komponenten unmittelbar über Memo1 in das Formular. 3. Wählen Sie im Objektinspektor die Komponente Button1 aus, und weisen Sie der Eigenschaft Caption den Wert Borland zu. 4. Wählen Sie im Objektinspektor die Komponente Button2 aus, und weisen Sie der Eigenschaft Caption den Wert MyCompany zu. So zeigen Sie den Inhalt eines untergeordneten Knotens der XML-Datei an: 1. Wählen Sie Button1 aus. 2. Doppelklicken Sie im Objektinspektor auf das Ereignis OnClick auf der Registerkarte Ereignisse. Der Quelltext wird angezeigt. Der Cursor befindet sich bereits im Block der Ereignisbehandlungsroutine TForm1.Button1Click. 2 3. Geben Sie folgenden Quelltext ein, um den Aktienpreis des ersten untergeordneten Knotens anzuzeigen, sobald auf die Schaltfläche Borland geklickt wird: BorlandStock := XMLDocument1.DocumentElement.ChildNodes[0]; Price:= BorlandStock.ChildNodes['price'].Text; Memo1.Text := Price; 4. Fügen Sie unmittelbar über dem Codeblock, oberhalb der begin-Anweisung in der Ereignisbehandlungsroutine, einen var-Abschnitt hinzu, und geben Sie die folgenden Deklarationen für lokale Variablen ein: var BorlandStock: IXMLNode; Price: string; 5. Wählen Sie Button2 aus. 6. Doppelklicken Sie im Objektinspektor auf das Ereignis OnClick auf der Registerkarte Ereignisse. Der Quelltext wird angezeigt. Der Cursor befindet sich bereits im Block der Ereignisbehandlungsroutine TForm1.Button2Click. 7. Geben Sie folgenden Quelltext ein, um den Aktienpreis des zweiten untergeordneten Knotens anzuzeigen, sobald auf die 166 2.4 VCL für .NET – Anleitungen RAD Studio für .NET Ausführen von Änderungen, die wegen der Schaltfläche MyCompany geklickt wird: MyCompany:=XMLDocument1.DocumentElement.ChildNodes[1]; Price:= MyCompany.ChildNodes['price'].Text; Memo1.Text := Price; 8. Fügen Sie unmittelbar über dem Codeblock, oberhalb der begin-Anweisung in der Ereignisbehandlungsroutine, einen var-Abschnitt hinzu, und geben Sie die folgenden Deklarationen für lokale Variablen ein: var MyCompany: IXMLNode; Price: string; So compilieren Sie die Anwendung und führen sie aus: 1. Wählen Sie Start Ausführen, um die Anwendung zu compilieren und auszuführen. Die Anwendung zeigt zwei Schaltflächen und ein Memofeld an. 2. Klicken Sie auf die Schaltfläche Borland. Der Aktienpreis wird angezeigt. 3. Klicken Sie auf die Schaltfläche MyCompany. Der Aktienpreis wird angezeigt. Siehe auch Überblick zu VCL.NET ( see page 77) VCL-Formularanwendung erstellen ( see page 163) 2.4.9 Ausführen von Änderungen, die wegen der Unterstützung von 64-Bit .NET 2.0 erforderlich sind Für die Unterstützung von 64-Bit .NET 2.0 waren einige Änderungen erforderlich. Wegen dieser Änderungen könnten kleinere Quelltextänderungen erforderlich werden, damit vorhandene Anwendungen korrekt arbeiten. Dieses Thema beschreibt die Änderungen im Detail. Es gibt zwei allgemeine Bereiche: 1. Geänderte Quelltext-Pattern 2. Windows API-Deklarationen für einen Callbacks und Records Warnung: Diese Modifikationen sind wegen der Änderungen zur Unterstützung von 64-Bit-Systemen erforderlich. Sie müssen für Anwendungen vorgenommen werden, die sowohl auf 32-Bit- als auch auf 64-Bit-Systemen ausgeführt werden sollen. So führen Sie die erforderlichen Änderungen der Quelltext-Pattern aus: 1. Case-Anweisungen Quelltext, der Handles in case-Anweisungen enthält, wird nicht mehr compiliert. Ersetzen Sie diese Anweisungen folgendermaßen: 2 case Msg.WParam of durch eine der folgenden Anweisungen: case Msg.WParam.ToInt64 of case Int64(Msg.WParam) of // spezifisch für VCL.NET // Kompatibel mit VCL/Win32 2. Typumwandlungen von Aufzählungen Ein Handle kann nicht mehr direkt in einen Aufzählungstyp umgewandelt werden. Ersetzen Sie den Quelltext folgendermaßen: LEnum := TEnum(GetWindowLong(...)); durch folgenden: LEnum := TEnum(GetWindowLong(...).ToInt64); 3. Verwendung von Handles mit Mengen Das Überladen von Mengenoperatoren wird nicht mehr unterstützt. Quelltext, wie 167 Ausführen von Änderungen, die wegen der RAD Studio für .NET 2.4 VCL für .NET – Anleitungen der folgende: if Msg.WParam in [1..5] then muss durch einen der folgenden ersetzt werden: if Msg.WParam.ToInt64 in [1..5] then if Int64(Msg.WParam) in [1..5] then // spezifisch für VCL.NET // Kompatibel mit VCL/Win32 4. Array-Indizierung Quelltext, in dem über ein Handle ein Array indiziert wird, wird nicht mehr compiliert. Quelltext wie der folgende: S := StrArray[Msg.WParam]; muss in einen der folgenden geändert werden: S := StrArray[Msg.WParam.ToInt64]; S := StrArray[Int64(Msg.WParam)]; // spezifisch für VCL.NET // Kompatibel mit VCL/Win32 5. Annahme einer bestimmten Handle-Größe Quelltext, der auf 64-Bit-Plattformen ausgeführt werden soll, darf keine Annahmen über den Wert eines Handles oder darüber, dass IntPtr sich in dem Int32-Bereich befindet, treffen. Bei einem IntPtr löst die Methode ToInt32 eine Überlauf-Exception aus, wenn der Zeiger sich nicht im zulässigen Bereich befindet. Quelltext wie der folgende: LIntPtr := IntPtr.Create(Buffer.ToInt32 + 10); muss folgendermaßen geändert werden: LIntPtr := IntPtr.Create(Buffer.ToInt64 + 10); Der Code: var DC: HDC; begin ... SendMessage(Window, Message, Integer(DC), 0); end; muss durch folgenden ersetzt werden: var DC: HDC; begin ... SendMessage(Window, Message, WPARAM(DC), 0); end; So führen Sie die erforderlichen Änderungen für Callback-Funktionen aus: 1. Sehen Sie in der ersten Spalte der folgenden Tabelle nach, ob Sie eine dieser Units verwendet haben. 2 2. Falls ja, stellen Sie fest, ob Sie eine der Callback-Funktionen verwendet haben, die in der zweiten Spalte der Tabelle aufgeführt sind. 3. Ändern Sie bei jedem Vorkommen einer solchen Callback-Funktion die Parameter, die in der dritten Spalte aufgeführt sind. entsprechend. Unit Callback-Funktion Details DDEml TFNCallback Typ der Parameter Data1 und Data2 geändert MMSystem TFNDriverProc Typ des Parameters dwDriverId geändert MMSystem TFNDrvCallBack Typ der Parameter dwUser, dw1 und dw2 geändert MMSystem TFNTimeCallBack Typ der Parameter dwUser, dw1 und dw2 geändert RichEdit TEditStreamCallBack Typ des Parameters dwCookie geändert 168 2.4 VCL für .NET – Anleitungen RAD Studio für .NET Eine neue VCL.NET-Komponente erstellen Windows TFNWndProc Typen WParam, LParam und Result geändert Windows TFNWndEnumProc Typ des Parameters LParam geändert Windows TFNTimerProc Typ des Parameters P3 geändert Windows TFNAPCProc Typ des Parameters dwParam geändert Windows TFNDlgProc Ergebnistyp geändert Windows TFNSendAsyncProc Typ des Parameters P3 geändert Windows TFNPropEnumProcEx Typ des Parameters P4 geändert WinInet PFN_AUTH_NOTIFY Typ des Parameters dwContext geändert So führen Sie die erforderlichen Änderungen für Variant-Records aus: 1. Sehen Sie in der ersten Spalte der folgenden Tabelle nach, ob Sie eine dieser Units verwendet haben. 2. Falls ja, stellen Sie fest, ob Sie einen der Records verwendet haben, die in der zweiten Spalte der Tabelle aufgeführt sind. 3. Suchen Sie für diese Records alle Vorkommen, wo ein Feld als ein var-Parameter übergeben wurde, der in eine Eigenschaft geändert wurde und ändern Sie den Quelltext entsprechend. Der Compiler gibt eine Warnmeldung bei erforderlichen Aktualisierungen aus. Unit Record ActiveX TPictDesc ActiveX TPropSpec ActiveX TStgMedium ActiveX TTypeDesc ActiveX TVarDesc ActiveX TVariantArg CommCtrl TPropSheetHeader CommCtrl TPropSheetPage CommCtrl TTVInsertStruct CommCtrl TTVInsertStructA CommCtrl TTVInsertStructW MMSystem TMixerControlDetails ShlObj TStrRet Windows TInput Windows TProcessHeapEntry Windows TSystemInfo WinSpool TPrinterNotifyInfoData 2 Siehe auch Änderungen aufgrund der Unterstützung von 64-Bit .NET 2.0 ( see page 63) 169 Bitmap-Grafik in einer RAD Studio für .NET 2.4 VCL für .NET – Anleitungen 2.4.10 Eine neue VCL.NET-Komponente erstellen Mit dem Experten für neue VCL-Komponenten können Sie eine neue VCL.NET-Komponente erstellen und der Tool-Palette hinzufügen. Allgemeine Anleitung zum Erstellen einer neuen VCL.NET-Komponente 1. Ein Package (.dll) erstellen. 2. Eine neue VCL.NET-Komponente erstellen: 1. Vorfahrkomponente festlegen. 2. Den Klassennamen angeben. 3. Ihre Komponente registrieren und der VCL hinzufügen. So erstellen Sie ein Package: 1. Wählen Sie Datei Neu Weitere Delphi für .NET-Projekte Package. 2. RAD Studio erstellt das Package und zeigt es in der Projektverwaltung an. So erstellen Sie eine neue VCL-Komponente: 1. Wählen Sie Datei Neu Weitere Delphi für .NET-Projekte Neue Dateien VCL-Komponente. Nun wird die erste Seite des Dialogfeldes Neue VCL-Komponenten geöffnet und die Liste mit den Vorfahrkomponenten geladen. 2. Wählen Sie auf der Seite Vorfahrkomponente des Dialogfeldes Neue VCL-Komponenten eine Vorfahrkomponente aus der Liste aus und klicken Sie auf Weiter. 3. Überprüfen Sie auf der Seite Komponente des Dialogfeldes Neue VCL-Komponenten die Vorgabewerte für Klassenname, Palettenseite, Unit-Name und Suchpfad. Sie können die Vorgabewerte übernehmen oder eigene Werte eingeben. 4. Klicken Sie auf Weiter. In der Projektverwaltung sollte nun Ihre neue .NET VCL-Komponente in dem zuvor erstellten Package aufgeführt werden. So registrieren Sie Ihre Komponente bei der VCL: 1. Wählen Sie Komponenten Installierte .NET-Komponenten. 2. Aktivieren Sie die Registerkarte .NET VCL-Komponenten. 3. Klicken Sie auf Hinzufügen. 4. Klicken Sie im Dialogfeld Wählen Sie ein VCL .NET-Package oder eine Assemblierung aus auf das Package, das die neue .NET VCL-Komponente enthält. 2 5. Suchen Sie in der Tool-Palette die Unit, in die Ihre .NET VCL-Komponente installiert wurde. In dieser Unit sollte Ihre .NET VCL-Komponente aufgeführt sein. Siehe auch Überblick zu VCL für .NET ( see page 77) 2.4.11 Bitmap-Grafik in einer VCL-Formularanwendung anzeigen Mit den folgenden Schritten wird eine Bitmap-Grafik aus einer Datei geladen und in einem VCL-Formular angezeigt: 170 2.4 VCL für .NET – Anleitungen RAD Studio für .NET Bitmap-Grafik in einer 1. Ein VCL-Formular mit einer Schaltfläche erstellen. 2. Eine Bitmap-Grafik bereitstellen. 3. Quelltext für die OnClick-Ereignisbehandlungsroutine der Schaltfläche schreiben, um eine Bitmap-Grafik zu laden und anzuzeigen. 4. Die Anwendung compilieren und ausführen. So erstellen Sie ein VCL-Formular und eine Schaltfläche: 1. Wählen Sie Datei Neu Weitere Delphi für .NET-Projekte VCL-Formularanwendung. Der VCL-Formular-Designer wird angezeigt. 2. Ziehen Sie aus der Kategorie Standard der Tool-Palette eine TButton-Komponente in das Formular. So stellen Sie eine Bitmap-Grafik bereit: 1. Legen Sie ein Verzeichnis an, in dem die Projektdateien gespeichert werden. 2. Suchen Sie nach einer Bitmap-Grafik, und kopieren Sie diese in das Projektverzeichnis. 3. Speichern Sie alle Projektdateien in dem Projektverzeichnis. So schreiben Sie die Behandlungsroutine für das Ereignis OnClick: 1. Doppelklicken Sie in der Kategorie Eingabe auf der Registerkarte Ereignisse auf das OnClick-Ereignis für Button1. Der Quelltext-Editor wird angezeigt. Der Cursor befindet sich bereits im Block der Ereignisbehandlungsroutine TForm1.Button1Click. 2. Geben Sie folgenden Quelltext für die Ereignisbehandlungsroutine ein, wobei Sie MyFile.bmp durch den Namen der Bitmap-Datei in Ihrem Projektverzeichnis ersetzen müssen: Rect := TRect.Create(0,0,100,100); Bitmap := TBitmap.Create; try Bitmap.LoadFromFile('MyFile.bmp'); Form1.Canvas.Brush.Bitmap := Bitmap; Form1.Canvas.FillRect(Rect); finally Form1.Canvas.Brush.Bitmap := nil; Bitmap.Free; end; Tip: Sie können die Größe des anzuzeigenden Rechtecks anpassen, indem Sie die Parameterwerte für Rect ändern. 3. Fügen Sie die folgenden Variablendeklarationen in den var-Abschnitt der Routine ein: Bitmap: TBitmap; Rect : TRect; So führen Sie das Programm aus: 2 1. Speichern Sie alle Dateien des Projekts. 2. Wählen Sie Start Ausführen. 3. Klicken Sie auf die Schaltfläche, um die Bitmap-Grafik in einem Rechteck der Größe 100 x 100 Pixel in der oberen linken Ecke des Formulars anzuzeigen. Siehe auch Überblick zu VCL.NET ( see page 77) Gerade Linien in einer VCL-Formularanwendung zeichnen ( see page 177) Rechtecke und Ellipsen in einer VCL-Formularanwendung zeichnen ( Abgerundete Rechtecke in einer VCL-Anwendung zeichnen ( see page 176) see page 177) 171 Abgerundete Rechtecke in einer RAD Studio für .NET Bitmap-Grafik in ein Steuerelement einer VCL-Formularanwendung einfügen ( 2.4 VCL für .NET – Anleitungen see page 178) 2.4.12 Rechtecke und Ellipsen in einer VCL-Formularanwendung zeichnen Mit den folgenden Schritten werden ein Rechteck und eine Ellipse in einem VCL-Formular gezeichnet: 1. Ein VCL-Formular erstellen. 2. Eine Behandlungsroutine für das OnPaint-Ereignis des Formulars schreiben, die ein Rechteck und eine Ellipse zeichnet. 3. Die Anwendung compilieren und ausführen. So erstellen Sie ein VCL-Formular: 1. Wählen Sie Datei Neu Weitere Delphi für .NET-Projekte VCL-Formularanwendung. 2. Klicken Sie gegebenenfalls im Objektinspektor auf das Register Design, um Form1 anzuzeigen. So schreiben Sie die Behandlungsroutine für das Ereignis OnPaint: 1. Klicken Sie im Objektinspektor auf die Registerkarte Ereignisse. 2. Doppelklicken Sie auf das Ereignis OnPaint in der Kategorie Verschiedenes der Registerkarte Ereignisse. Der Quelltext-Editor wird angezeigt. Der Cursor befindet sich bereits im Block der Ereignisbehandlungsroutine TForm1.FormPaint. 3. Geben Sie folgenden Quelltext für die Ereignisbehandlungsroutine ein: Canvas.Rectangle (0, 0, ClientWidth div 2, ClientHeight div 2); Canvas.Ellipse (0, 0, ClientWidth div 2, ClientHeight div 2); So führen Sie das Programm aus: 1. Speichern Sie alle Dateien des Projekts. 2. Wählen Sie Start Ausführen. 3. Die Anwendung wird ausgeführt und zeigt im oberen linken Viertel des Formulars ein Rechteck und eine Ellipse in der Mitte des Rechtecks an. Siehe auch Überblick zu VCL.NET ( see page 77) Abgerundete Rechtecke in einer VCL-Formularanwendung zeichnen ( see page 177) 2 2.4.13 Abgerundete Rechtecke in einer VCL-Formularanwendung zeichnen Mit den folgenden Schritten wird ein abgerundetes Rechteck in einem VCL-Formular gezeichnet: 1. Ein VCL-Formular erstellen. 2. Eine Behandlungsroutine für das OnPaint-Ereignis des Formulars schreiben, die ein Polygon zeichnet. 3. Die Anwendung compilieren und ausführen. 172 2.4 VCL für .NET – Anleitungen RAD Studio für .NET Gerade Linien in einer So erstellen Sie ein VCL-Formular: 1. Wählen Sie Datei Neu Weitere Delphi für .NET-Projekte VCL-Formularanwendung. 2. Klicken Sie im Designer gegebenenfalls auf das Formular, um die Eigenschaften von Form1 im Objektinspektor anzuzeigen. So schreiben Sie die Behandlungsroutine für das Ereignis OnPaint: 1. Klicken Sie im Objektinspektor auf die Registerkarte Ereignisse. 2. Doppelklicken Sie in der Kategorie Visuell auf das Ereignis OnPaint. Der Quelltext-Editor wird angezeigt. Der Cursor befindet sich bereits im Block der Ereignisbehandlungsroutine TForm1.FormPaint. 3. Geben Sie folgenden Quelltext für die Ereignisbehandlungsroutine ein: Canvas.RoundRect(0, 0, ClientWidth div 2, ClientHeight div 2, 10, 10); So führen Sie das Programm aus: 1. Speichern Sie alle Dateien des Projekts. 2. Wählen Sie Start Ausführen. 3. Die Anwendung wird ausgeführt und zeichnet ein abgerundetes Rechteck in das obere linke Viertel des Formulars. Siehe auch Überblick zu VCL.NET ( see page 77) Rechtecke und Ellipsen in einer VCL-Formularanwendung zeichnen ( see page 176) 2.4.14 Gerade Linien in einer VCL-Formularanwendung zeichnen Mit den folgenden Schritten werden zwei diagonal verlaufende gerade Linien in einem VCL-Formular gezeichnet: 1. Ein VCL-Formular erstellen. 2. Eine Behandlungsroutine für das OnPaint-Ereignis des Formulars schreiben, die die geraden Linien zeichnet. 3. Die Anwendung compilieren und ausführen. So erstellen Sie ein VCL-Formular und fügen eine Grafik ein: 2 1. Wählen Sie Datei Neu Weitere Delphi für .NET-Projekte VCL-Formularanwendung. 2. Klicken Sie gegebenenfalls auf das Register Design, um die Eigenschaften von Form1 im Objektinspektor anzuzeigen. So schreiben Sie die Behandlungsroutine für das Ereignis OnPaint: 1. Klicken Sie im Objektinspektor auf die Registerkarte Ereignisse. 2. Doppelklicken Sie in der Kategorie Visuell auf das Ereignis OnPaint. Der Quelltext-Editor wird angezeigt. Der Cursor befindet sich bereits im Block der Ereignisbehandlungsroutine TForm1.FormPaint. 3. Geben Sie folgenden Quelltext für die Ereignisbehandlungsroutine ein: with Canvas do begin MoveTo(0,0); LineTo(ClientWidth, ClientHeight); MoveTo(0, ClientHeight); 173 Bitmap-Grafik in ein Steuerelement einer RAD Studio für .NET 2.4 VCL für .NET – Anleitungen LineTo(ClientWidth, 0); end; So führen Sie das Programm aus: 1. Speichern Sie alle Dateien des Projekts. 2. Wählen Sie Start Ausführen. Die Anwendung wird ausgeführt und zeigt zwei sich kreuzende diagonale Linien an. Tip: Um die Stiftfarbe in Grün zu ändern, fügen Sie die folgende Anweisung unmittelbar nach der ersten MoveTo()-Anweisung in die Ereignisbehandlungsroutine ein: Pen.Color := clRed; Probieren Sie andere Einstellungen für die Eigenschaften des Canvas- und des Pen-Objekts aus. Siehe auch Überblick zu VCL.NET ( see page 77) VCL-Formularanwendungen mit Grafiken erstellen ( see page 161) Rechtecke und Ellipsen in einer VCL-Formularanwendung zeichnen ( see page 176) Abgerundete Rechtecke in einer VCL-Formularanwendung zeichnen ( see page 177) Bitmap-Grafik in einer VCL-Formularanwendung anzeigen ( see page 175) 2.4.15 Bitmap-Grafik in ein Steuerelement einer VCL-Formularanwendung einfügen Mit den folgenden Schritten wird eine Bitmap-Grafik in ein Kombinationsfeld in einer VCL-Formularanwendung eingefügt: 1. Ein VCL-Formular erstellen. 2. Komponenten auf dem Formular platzieren. 3. Eigenschaften der Komponenten im Objektinspektor festlegen. 4. Ereignisbehandlungsroutinen für die Zeichenaktion der Komponente schreiben. 5. Die Anwendung compilieren und ausführen. So erstellen Sie ein VCL-Formular mit einem Kombinationsfeld: 1. Wählen Sie Datei Neu Weitere Delphi für .NET-Projekte VCL-Formularanwendung. Der VCL-Formular-Designer wird angezeigt. 2. Klicken Sie auf die Registerkarte Design, um das Formular anzuzeigen. 2 3. Ziehen Sie aus der Kategorie Win32 der Tool-Palette eine TImageList-Komponente in das Formular. 4. Ziehen Sie aus der Kategorie Standard der Tool-Palette eine TComboBox-Komponente in das Formular. So legen Sie die Komponenteneigenschaften fest: 1. Wählen Sie die Komponente ComboBox1 im Formular aus. 2. Öffnen Sie im Objektinspektor die Dropdown-Liste der Eigenschaft Style, und wählen Sie die Einstellung csOwnerDrawFixed. 3. Klicken Sie im Objektinspektor auf die Ellipsen-Schaltfläche [...] neben der Eigenschaft Items. Daraufhin wird der Stringlisten-Editor geöffnet. 4. Geben Sie einen String ein, der mit der Bitmap-Grafik verknüpft werden soll, z.B. NeuesBild, und klicken Sie dann auf OK. 5. Doppelklicken Sie im Formular auf die Komponente ImageList1. Der Bilderlisten-Editor wird geöffnet. 174 2.4 VCL für .NET – Anleitungen RAD Studio für .NET .NET-Steuerelemente in VCL.NET 6. Klicken Sie auf Hinzufügen, um das Dialogfeld Bilder hinzufügen anzuzeigen. 7. Suchen Sie auf dem lokalen Laufwerk eine Bitmap-Grafik, die im Kombinationsfeld angezeigt werden soll. 8. Wählen Sie ein sehr kleines Bild, z.B. ein Symbol. Kopieren Sie die Grafikdatei in Ihr Projektverzeichnis, und klicken Sie auf Öffnen. Das Bild wird im Bilderlisten-Editor angezeigt. 9. Klicken Sie auf OK, um den Editor zu schließen. So fügen Sie Quelltext für die Ereignisbehandlungsroutine hinzu: 1. Wählen Sie die Komponente ComboBox1 im Designer aus. 2. Klicken Sie im Objektinspektor auf die Registerkarte Ereignisse. 3. Doppelklicken Sie auf das Ereignis OnDrawItem. Der Quelltext-Editor wird angezeigt. Der Cursor befindet sich bereits im Block der DrawItem-Ereignisbehandlungsroutine. 4. Geben Sie folgenden Quelltext für die Ereignisbehandlungsroutine ein: ComboBox1.Canvas.FillRect(rect); ImageList1.Draw(ComboBox1.Canvas, Rect.Left, Rect.Top, Index); ComboBox1.Canvas.TextOut(Rect.Left+ImageList1.Width+2, Rect.Top, ComboBox1.Items[Index]); So führen Sie das Programm aus: 1. Speichern Sie alle Dateien des Projekts. 2. Wählen Sie Start Ausführen. Die Anwendung wird ausgeführt und zeigt ein Formular mit einem Kombinationsfeld an. 3. Klicken Sie auf den Abwärtspfeil des Kombinationsfeldes. Die Bitmap-Grafik und der Textstring werden als Listeneinträge angezeigt. Siehe auch Überblick zu VCL.NET ( see page 77) VCL-Formularanwendungen mit Grafiken erstellen ( see page 161) 2.4.16 .NET-Steuerelemente in VCL.NET importieren Es kann Fälle geben, in denen Sie .NET-Komponenten in VCL.NET-Formularen einsetzen möchten. .NET-Komponenten können nicht direkt in VCL-Anwendungen aufgenommen werden. Sie können diese Komponenten jedoch in einen ActiveX-Wrapper verpacken, den Sie dann der VCL.NET-Anwendung hinzufügen. RAD Studio stellt hierfür den .NET-Importexperten zur Verfügung. 2 So verwenden Sie .NET-Komponenten in einem VCL.NET-Formular: 1. Starten Sie den WinForms Control-Importexperten. 2. Erzeugen Sie das Package, um die Assemblierungsdatei zu erstellen. 3. Fügen Sie die Assemblierung der Tool-Palette hinzu. So starten Sie den WinForms Control-Importexperten: 1. Wählen Sie Datei Neu Weitere Delphi für .NET-Projekte WinForm Controls Package. Damit wird der WinForms Control-Importexperte gestartet. 2. Geben Sie folgende Datei an: c:\Windows\Microsoft.NET\Framework\v1.1.4322\System.Windows.Forms.dll 3. Klicken Sie auf Weiter. Daraufhin wird die zweite Seite des WinForms Control-Importexperten angezeigt, auf der alle 175 .NET-Steuerelemente in VCL.NET RAD Studio für .NET 2.4 VCL für .NET – Anleitungen verfügbaren Komponenten aufgeführt sind. 4. Aktivieren Sie die Kontrollkästchen neben den Komponenten, die importiert werden sollen. Anmerkung: Wenn Sie alle Komponenten importieren möchten, klicken Sie auf die Schaltfläche Alle markieren . 5. Klicken Sie auf Weiter. Nun wird die dritte Seite des Experten angezeigt, auf der Sie Optionen für die Erzeugung der Units einstellen können. 6. Übernehmen Sie die Voreinstellungen, und klicken Sie auf Weiter. Jetzt wird die vierte Seite des Experten angezeigt, auf der Sie den Speicherort und den Namen der Package-Datei angeben können. 7. Klicken Sie auf Weiter. Daraufhin wird die fünfte Seite des Experten angezeigt, auf der Sie angeben können, dass gleichnamige vorhandene Dateien überschrieben werden sollen. 8. Klicken Sie auf Weiter. Dadurch wird der Erzeugungsvorgang gestartet. Über die Erstellung der einzelnen Dateien, einschließlich der Package-Datei (.dpk), wird durch entsprechende Statusmeldungen informiert. 9. Falls Sie weitere Steuerelemente importieren möchten, klicken Sie auf Neu, ansonsten klicken Sie auf Fertig stellen. In der Projektverwaltung wird nun das Package angezeigt, das die betreffenden Units enthält. So erstellen Sie das Package und fügen es einem Projekt hinzu: 1. Markieren Sie den Package-Namen in der Projektverwaltung. 2. Wählen Sie im Hauptmenü Projekt <Projektname> erzeugen. Dabei steht <Projektname> für den Namen des Projekts. Daraufhin wird die Assemblierungsdatei erzeugt, die das Package und die Units enthält. 3. Wählen Sie Komponenten Installierte .NET-Komponenten. 4. Aktivieren Sie die Registerkarte .NET VCL-Komponenten. 5. Klicken Sie auf Hinzufügen. 6. Suchen Sie die Package-Assemblierungsdatei, markieren Sie sie, und klicken Sie auf Öffnen. Der Speicherort hängt von den Einstellungen ab, die in den Projektoptionen festgelegt sind. Möglicherweise wird die Datei im Standarddokumentverzeichnis abgelegt. 7. Klicken Sie auf OK. Die Steuerelemente werden in der Tool-Palette in der Kategorie WinForm Controls angezeigt. Sie können nun die einzelnen Steuerelemente in Ihre VCL.NET-Formularanwendung einfügen. Siehe auch Überblick zu VCL.NET ( 2 176 see page 77) 2.5 ASP.NET – Anleitungen RAD Studio für .NET 2.5 ASP.NET – Anleitungen Dieser Abschnitt enthält Anleitungen zur Entwicklung von ASP.NET Web Forms-Anwendungen. Themen Name ASP.NET-Anwendungen erstellen ( Beschreibung see page 186) ASP.NET-Datenbankanwendung erstellen ( Die folgende Anleitung beschreibt die grundlegenden Schritte zum Erstellen eines einfachen ASP.NET-Projekts. Informationen zu weiterführenden Themen finden Sie in den Hinweisen im Anschluss an diese Anleitung. see page 187) ASP.NET-Anwendung mit Datenbanksteuerelementen entwickeln, Teil 1 ( page 189) Die folgende Anleitung beschreibt, wie Sie mit wenigen Schritten eine einfache ASP.NET-Datenbankanwendung, wie z.B. BDP.NET, erstellen können. Wenn die erforderlichen Verbindungsobjekte generiert sind, werden die Daten im Projekt in einem Datengitter (DataGrid) angezeigt. Detailliertere Datenbankbeispiele, die andere Datenbanktechnologien für ASP.NET 2.0 verwenden, finden Sie unter ASP.NET-Anwendung mit Datenbanksteuerelementen erstellen 1 ( see page 189). BDP.NET enthält Komponenten-Designer, mit deren Hilfe sich Datenbankanwendungen einfach erstellen lassen. Anstatt jede einzelne Komponente in einem Designer zu platzieren und zu konfigurieren, lassen sich mit den BDP.NET-Designern Datenbankkomponenten deutlich schneller erstellen und konfigurieren. Die folgende Anleitung zeigt die Funktionsweise der Hauptkomponenten von ASP.NET, ADO.NET und BDP.NET.... more ( see page 187) see Dieses erweiterte Beispiel zeigt, wie eine Webseite erstellt wird, die ein GridView- und ein Datenbank-Steuerelement enthält. Das Beispiel illustriert: • Das Hinzufügen einer ASP.NET-Komponente zu einem Formular. • Die Verwendung des Smart Tasks-Fensters. • Das Konfigurieren und Verbinden mit einer Datenquelle. • Die Verwendung von SQL zum Lesen von Daten aus einer Datenbank. • Das Ausführen einer Anwendung in einem Browser. Anmerkung: Sie können nur ASP.NET-Projekte in CodeGear RAD Studio erstellen (keine Win32-Personalities). ASP.NET-Anwendung mit Datenbanksteuerelementen entwickeln, Teil 2 ( page 191) see Dieses Beispiel zeigt die weitere Entwicklung einer Webseite, die ein GridViewund ein Datenbank-Steuerelement enthält. In den folgenden Schritten werden dem GridView-Steuerelement weitere Funktionen, einschließlich dem Bearbeiten, hinzugefügt. Das Beispiel illustriert: • Die Verwendung des Smart Tasks-Fensters. 2 • Das Ändern der Konfiguration einer Datenquelle. • Das Ausführen einer Anwendung in einem Browser. 177 RAD Studio für .NET ASP.NET-Anwendung mit Datenbanksteuerelementen entwickeln, Teil 3 ( page 192) see 2.5 ASP.NET – Anleitungen Dieses Beispiel zeigt die weitere Entwicklung einer Webseite, die ein GridViewund ein Datenbank-Steuerelement enthält. In diesem Teil wird ein FormView-Steuerelement zum Einfügen von Zeilen hinzugefügt. Das Beispiel illustriert: • Das Hinzufügen einer ASP.NET-Komponente zu einem Formular. • Die Verwendung des Smart Tasks-Fensters. • Die Bearbeitung der Auszeichnungssprache, um das Aussehen einer Komponente zu ändern. • Das Ausführen einer Anwendung in einem Browser. ASP.NET-Anwendung "Hello World" erstellen ( Erstellen einer ASP.NET Sitemap ( see page 193) Die ASP.NET-Anwendung "Hello World" ist zwar sehr einfach, zeigt aber dennoch die wesentlichen Schritte, die zum Erstellen einer ASP.NET-Anwendung erforderlich sind. Die Anwendung verwendet ein Web Form, Steuerelemente und ein Ereignis, das in Reaktion auf eine Benutzeraktion ein Ergebnis anzeigt. see page 194) Dieses Beispiel zeigt, wie eine Website mit einer Sitemap einem Menü, einem SiteMapPath und einer Master-Seite erstellt wird. Eine web.sitemap-Datei ist eine XML-Datei, die die Struktur einer Website beschreibt. Eine Master-Seite dient als Template für Seiten in der Website. Ein Menü und ein SiteMapPath ermöglichen die Navigation in einer Website. Das Beispiel illustriert: • Das Erstellen einer Web-Sitemap. • Das Erstellen einer Master-Seite. • Das Hinzufügen eines Menüs und eines SiteMapPath zu einer Master-Seite. • Die Verwendung des Smart Tasks-Fensters. • Das Hinzufügen von Inhaltsseiten, die auf die Master-Seite der Site verweisen. • Das Ausführen einer Anwendung in einem Browser. Das Beispiel erstellt die... more ( Aktenkoffermodell-Anwendung mit DB Web Controls erstellen ( Anwendung mit DB Web Controls erstellen ( 2 see page 199) see page 198) see page 194) Sie können mit Hilfe von DB Web Controls, der XML-Zwischenspeicherung und der BDP.NET-Datenadapter serverseitige Aktenkoffermodell-Anwendungen erstellen. Für diese Anwendungsart ist eine Benutzerauthentifizierung zwingend erforderlich, da jeder Benutzer über eine eigene Kopie der XML-Datei verfügen muss. Anmerkung: DB Web Controls (Namespace Borland.Data.Web) sind seit 2007 veraltet. Sie sollten statt dessen die Standard-Websteuerelemente verwenden. Die folgende Anleitung beschreibt, wie Sie mit wenigen Schritten eine einfache ASP.NET-Datenbankanwendung mit DB Web Controls und BDP.NET erstellen können. Wenn die erforderlichen Verbindungsobjekte generiert sind, werden die Daten im Projekt in einer DBWebGrid-Komponente angezeigt, die über eine DBWebNavigator-Komponente gesteuert wird. Zu anderen häufig verwendeten DB Web Controls werden zusätzliche Informationen bereitgestellt. Der Benutzer sollte bereits mit der Erstellung von ASP.NET-Projekten mit BDP.NET vertraut sein. Die Erstellung einer einfachen ASP.NET-Anwendung mit DB Web Controls und BDP.NET umfasst drei grundlegende Schritte: 1. Ein ASP.NET-Projekt mit BDP.NET oder anderen Verbindungskomponenten anlegen. 2. Eine DBWebDataSource-Komponente in den Designer einfügen und deren Eigenschaft DataSource auf ein... more ( see page 199) 178 2.5 ASP.NET – Anleitungen RAD Studio für .NET HTML-Elemente in Server Controls konvertieren ( see page 200) Im Gegensatz zu Web Controls unterstützen HTML-Elemente die programmseitige Steuerung nicht standardmäßig. Es ist jedoch möglich, ein HTML-Element in ein Server Control zu konvertieren, auf das per Programm zugegriffen und das geändert werden kann. Die meisten HTML-Elemente, die in der Tool-Palette angeboten werden, lassen sich mit Hilfe des Befehls Als Server-Control ausführen konvertieren. HTML-Elemente, auf die nicht über die Tool-Palette zugegriffen werden kann (z.B. body), können manuell konvertiert werden. Im Folgenden wird gezeigt, wie eine HTML-Tabelle (table-Element) mit dem Befehl Als Server-Control ausführen, und wie ein body-Element manuell konvertiert wird. XML-Datei für DB Web Controls erstellen ( see page 201) XML-Dateien können als Datenquelle verwendet werden. Dieses Vorgehen bietet sich vor allem für die Erstellung von Prototypanwendungen an, die keine Leseund Schreibzugriffe auf eine Datenbank erfordern. Die betreffenden XML-Dateien müssen aber vorher erstellt werden. Ideal geeignet für diesen Zweck ist die DBWebDataSource-Komponente. Mit ihrer Hilfe können Sie eine XML-Datei erstellen, die auf echten Datenbankdaten basiert. In der vorliegenden Anleitung wird davon ausgegangen, dass Sie eine Verbindung zu der Datenbank herstellen können, die die gewünschten Daten enthält. Anmerkung: DB Web Controls (Namespace Borland.Data.Web) sind seit 2007 veraltet. Sie sollten statt dessen die Standard-Websteuerelemente verwenden. Metadaten für eine Datenmenge erstellen ( see page 203) Wenn Sie in einer ASP.NET-Anwendung mit DB Web Controls eine XML-Datei als Datenquelle verwenden, müssen Sie möglicherweise Metadaten erzeugen, um die XML-Daten im DataSet-Objekt zu strukturieren. Wird die XML-Datei ohne XML-Schemadatei (.xsd) erstellt, müssen die Metadaten manuell erzeugt werden. In der vorliegenden Anleitung wird davon ausgegangen, dass bereits eine XML-Datei mit Daten vorhanden ist. Anmerkung: DB Web Controls (Namespace Borland.Data.Web) sind seit 2007 veraltet. Sie sollten statt dessen die Standard-Websteuerelemente verwenden. Virtuelle Verzeichnisse erstellen ( see page 204) Wenn Sie eine ASP.NET-Anwendung erstellen, erzeugt die IDE ausgehend von den Einstellungen im Dialogfeld Neue ASP.NET-Webanwendung automatisch ein virtuelles Verzeichnis. Die IDE kann jedoch auch ein virtuelles Verzeichnis für eine Anwendung anlegen, die nicht in der IDE erstellt wurde, beispielsweise für die Demo-Anwendungen im Ordner DBWeb. Anmerkung: DB Web Controls (Namespace Borland.Data.Web) sind seit 2007 veraltet. Sie sollten statt dessen die Standard-Websteuerelemente verwenden. Aggregatwerte mit der DBWebAggregateControl-Komponente hinzufügen ( page 204) ASP.NET-Anwendungen debuggen und aktualisieren ( see Sie können mit Hilfe einer DBWebAggregateControl-Komponente eine Standard-Aggregatfunktion (Zusammenfassung) für eine Datenspalte implementieren. Der Aggregatwert wird in einem Textfeld angezeigt, dem ein Titel zugeordnet werden kann. Anmerkung: DB Web Controls (Namespace Borland.Data.Web) sind seit 2007 veraltet. Sie sollten statt dessen die Standard-Websteuerelemente verwenden. see page 205) Während der Installation von RAD Studio werden Sie gefragt, ob die Datei machine.config auf Ihrem Computer aktualisiert werden soll. Dies ist für das Debuggen von RAD Studio-Anwendungen unter IIS erforderlich. Wenn Sie auf die Frage mit Ja antworten, werden Borland-Debugger-Informationen in die Datei machine.config geschrieben und den Anwendungen zur Verfügung gestellt, die mit Delphi 8 erstellt wurden. Sie müssen diese Anweisung nicht ausführen. Sollten Sie die Frage mit Nein beantworten, werden die Debugger-Informationen in die Datei web.config der Anwendung geschrieben, wenn Sie eine ASP.NET-Anwendung mit RAD Studio erzeugen. Für Anwendungen, die mit Delphi 8 erstellt wurden, müssen Sie diese Informationen... more ( see page 205) Deployment einer ASP.NET-Anwendung mit Blackfish SQL an ein System ohne RAD Studio ( see page 206) Sie können eine ASP.NET-Anwendung mit Blackfish SQL an ein System ohne RAD Studio weitergeben. HTTP-Meldungen in ASP.NET erzeugen ( see page 207) Beim Debuggen Ihrer ASP.NET-Anwendungen werden möglicherweise unverständliche oder bedeutungslose Fehlermeldungen ausgegeben. Grund hierfür ist die Einstellung einer bestimmten Option im Internet Explorer. Sie können das Debuggen Ihrer Anwendung vereinfachen, indem Sie diese Einstellung ändern. Spalten in DBWebGrid-Objekten binden ( see page 207) In bestimmten Situationen kann es notwendig sein, die Reihenfolge zu ändern, in der die Spalten in einem DBWebGrid-Objekt angeordnet sind. Hierzu ist es möglich, die Spalten im Property Builder manuell zu binden. Anmerkung: DB Web Controls (Namespace Borland.Data.Web) sind seit 2007 veraltet. Sie sollten statt dessen die Standard-Websteuerelemente verwenden. 179 2 ASP.NET-Anwendungen erstellen RAD Studio für .NET Berechtigungen für die Nutzung von XML-Dateien festlegen ( Fehlerbehebung in ASP.NET-Anwendungen ( Den DB Web Control-Experten verwenden ( see page 209) see page 211) Den ASP.NET-Deploymentmanager verwenden ( Mit dem HTML-Tag-Editor arbeiten ( ASP.NET User Controls verwenden ( see page 208) see page 212) see page 215) see page 216) 2.5 ASP.NET – Anleitungen Um bei Verwendung von XML-Dateien als Datenquelle Zugriffsfehler zu vermeiden, müssen Sie Clients, die Ihre ASP.NET-Anwendungen nutzen, Berechtigungen zuweisen. Sie haben hierzu zwei Möglichkeiten, die im Folgenden beschrieben werden. Anmerkung: DB Web Controls (Namespace Borland.Data.Web) sind seit 2007 veraltet. Sie sollten statt dessen die Standard-Websteuerelemente verwenden. Im Gegensatz zu herkömmlichen, fensterbasierten Anwendungen sind Webanwendungen von Servern und Ressourcen abhängig, die nicht unmittelbar durch die Anwendung oder den Benutzer gesteuert werden können. Viele Webanwendungen greifen auf Client-, Server- und Netzwerkressourcen zu. Um Fehler zu minimieren, müssen die Bereiche ASP.NET-Installation, IIS-Installation und -Konfiguration und Sicherheit einer besonderen Überprüfung unterzogen werden. Alle drei Bereiche sind sehr umfangreich und komplex. In den folgenden Anleitungen werden Lösungen für die gängigsten Probleme vorgestellt. Anmerkung: Die folgenden Lösungen gelten nur für IIS 5.1. Mit dem DB Web Control-Experten können Sie ein datensensitives Web Control aus einem Standard-Web Control erstellen. Anmerkung: DB Web Controls (Namespace Borland.Data.Web) sind seit 2007 veraltet. Sie sollten statt dessen die Standard-Websteuerelemente verwenden. Sie können einem ASP.NET-Anwendungsprojekt einen ASP.NET-Deploymentmanager hinzufügen, um die Weitergabe der Anwendung zu vereinfachen. Der Deploymentmanager bestimmt die Dateien, die für das Deployment erforderlich sind, fordert den Namen des Zielverzeichnisses und die Verbindungsinformationen an und kopiert die Dateien in das Zielverzeichnis. Der Deploymentmanager erzeugt eine Liste der zu kopierenden Dateien basierend auf den Namen der Dateien im Projektverzeichnis. Sie können dieser Liste aber nach Bedarf weitere Dateien hinzufügen oder Dateien daraus entfernen. Wenn Sie im Fenster des Deploymentmanagers mit der rechten Maustaste klicken, werden die Optionen zum Anzeigen, Kopieren, Löschen, Ändern und Filtern der Zieldateien angezeigt. Ist die Option Assemblierungsreferenzen... more ( see page 212) Sie können zur Erstellung oder Bearbeitung einer HTML-Datei den Tag-Editor verwenden. Dieser Editor befindet sich unterhalb des Designer-Fensters. Für ASP.NET Webformulare wird der Tag-Editor nicht unterstützt. Wenn Sie beispielsweise ein HTML-Formular verwenden, können Sie den Tag-Editor im Designer durch Auswahl von Ansicht Tag-Editor anzeigen. Im Tag-Editor können Sie HTML-Tags überprüfen und ändern und gleichzeitig die entsprechenden Steuerelemente im Designer-Fenster darüber beobachten. Der Editor unterstützt die folgenden Funktionen des Quelltext-Editors: Programmierhilfe, Fehlermarkierung und Live-Template-Vervollständigung. Ausführliche Informationen zu diesen Funktionen finden Sie über die entsprechenden Links am Ende dieses Themas. Im Tag-Editor wird jeweils nur ein Tag bearbeitet, sofern... more ( see page 215) User Controls ermöglichen es, eine häufig verwendete Funktionalität der Benutzeroberfläche für alle ASP.NET-Webanwendungen bereitzustellen. Es ist beispielsweise möglich, einen Anmeldebildschirm in einem User Control zu kapseln. Wenn später in einem Web Form ein Anmeldebildschirm benötigt wird, muss nur das betreffende User Control in das Web Form eingefügt werden. Ausführliche Informationen über User Controls erhalten Sie über den Link am Ende dieses Themas. 2 2.5.1 ASP.NET-Anwendungen erstellen Die folgende Anleitung beschreibt die grundlegenden Schritte zum Erstellen eines einfachen ASP.NET-Projekts. Informationen zu weiterführenden Themen finden Sie in den Hinweisen im Anschluss an diese Anleitung. So erstellen Sie ein ASP.NET-Projekt: 1. Erstellen Sie ein neues ASP.NET-Projekt, indem Sie Datei Neu ASP.NET-Webanwendung wählen. Das Dialogfeld Neue ASP.NET-Webanwendung wird geöffnet. 2. Geben Sie in das Feld Name einen Namen für das Projekt ein. 3. Geben Sie in das Feld Speicherort den Verzeichnispfad des Projekts ein, oder übernehmen Sie den Standardpfad. 180 2.5 ASP.NET – Anleitungen RAD Studio für .NET ASP.NET-Datenbankanwendung erstellen So ändern Sie die Webserver-Einstellungen (optional): 1. Klicken Sie im Dialogfeld Neue ASP.NET-Webanwendung auf Serveroptionen einblenden. Das Dialogfeld wird dann erweitert und zeigt zusätzliche Optionen für Server an. 2. Setzen Sie die verschiedenen Lese- und Schreibattribute für das Projekt wie gewünscht, oder übernehmen Sie die Voreinstellungen. Tip: In den meisten Fällen sind die Voreinstellungen ausreichend. 3. Klicken Sie auf OK. Der Web Forms-Designer wird angezeigt. So erstellen Sie eine ASP.NET-Seite: 1. Stellen Sie sicher, dass der Designer angezeigt wird. 2. Ziehen Sie Komponenten aus der Tool-Palette in den Designer, um die Benutzeroberfläche zu erstellen. 3. Fügen Sie die Codebehind-Logik für die Komponenten hinzu. So programmieren Sie die Codebehind-Logik für eine Komponente: 1. Doppelklicken Sie im Designer auf die Komponente, die Sie mit einer Logik ausstatten möchten. Der Codebehind-Designer wird angezeigt. Der Cursor steht bereits im Rumpf der Ereignisbehandlungsroutine. 2. Fügen Sie die erforderliche Logik ein. So zeigen Sie die Auszeichnungssprache an und bearbeiten sie: 1. Klicken Sie im Quelltext-Editor auf die Registerkarte ApplicationName.aspx, um HTML- und ASP.NET-Komponenteninformationen in der Auszeichnungssprache anzuzeigen. 2. Bearbeiten Sie die Auszeichnungssprache. 3. Speichern Sie die Datei. So führen Sie die Anwendung aus: 1. Wählen Sie Start Start, um die Anwendung auszuführen. 2. Alternativ können Sie im Quelltext-Editor mit der rechten Maustaste klicken und im Kontextmenü Im Browser anzeigen wählen. 3. Die Anwendung wird gespeichert und compiliert. Sobald Sie die Anwendung compilieren, zeigt die generierte .aspx-Datei HTML im Standard-Webbrowser an. Siehe auch Überblick zu ASP.NET ( see page 85) ASP.NET-Anwendung "Hello World" erstellen ( 2 see page 193) ASP.NET-Anwendung mit Datenbanksteuerelementen erstellen 1 ( see page 189) ASP.NET-Anwendung mit Datenbanksteuerelementen erstellen 2 ( see page 191) ASP.NET-Anwendung mit Datenbanksteuerelementen erstellen 3 ( see page 192) Erstellen einer ASP.NET Sitemap ( see page 194) 181 ASP.NET-Datenbankanwendung erstellen RAD Studio für .NET 2.5 ASP.NET – Anleitungen 2.5.2 ASP.NET-Datenbankanwendung erstellen Die folgende Anleitung beschreibt, wie Sie mit wenigen Schritten eine einfache ASP.NET-Datenbankanwendung, wie z.B. BDP.NET, erstellen können. Wenn die erforderlichen Verbindungsobjekte generiert sind, werden die Daten im Projekt in einem Datengitter (DataGrid) angezeigt. Detailliertere Datenbankbeispiele, die andere Datenbanktechnologien für ASP.NET 2.0 verwenden, finden Sie unter ASP.NET-Anwendung mit Datenbanksteuerelementen erstellen 1 ( see page 189). BDP.NET enthält Komponenten-Designer, mit deren Hilfe sich Datenbankanwendungen einfach erstellen lassen. Anstatt jede einzelne Komponente in einem Designer zu platzieren und zu konfigurieren, lassen sich mit den BDP.NET-Designern Datenbankkomponenten deutlich schneller erstellen und konfigurieren. Die folgende Anleitung zeigt die Funktionsweise der Hauptkomponenten von ASP.NET, ADO.NET und BDP.NET. Die Erstellung einer ASP.NET-Anwendung mit Datenbankkomponenten umfasst vier grundlegende Schritte: 1. Ein ASP.NET-Projekt erstellen. 2. Datenbankverbindungskomponenten und eine Datenquelle konfigurieren. 3. Einen Aufruf für die Datenbindung einfügen. 4. Eine DataGrid-Komponente mit den Verbindungskomponenten verbinden. Tip: Zu Testzwecken können Sie die in Interbase enthaltene Datenbank EMPLOYEE.GDB verwenden, sofern diese in Ihrer Produktversion enthalten ist. So erstellen Sie ein ASP.NET-Projekt: 1. Wählen Sie Datei Neu ASP.NET-Webanwendung. Das Dialogfeld Neue ASP.NET-Webanwendung wird angezeigt. 2. Geben Sie in das Feld Name einen Namen für das Projekt ein. 3. Übernehmen Sie im Feld Speicherort den Standardpfad oder geben Sie einen anderen Projektpfad ein. So ändern Sie die Webserver-Einstellungen (optional): 1. Klicken Sie im Dialogfeld Neue ASP.NET-Webanwendung auf Serveroptionen einblenden. Das Dialogfeld wird dann erweitert und zeigt zusätzliche Optionen für Server an. 2. Setzen Sie die verschiedenen Lese- und Schreibattribute für das Projekt wie gewünscht, oder übernehmen Sie die Voreinstellungen. Tip: In den meisten Fällen sind die Voreinstellungen ausreichend. 2 3. Klicken Sie auf OK. Der Web Forms-Designer wird angezeigt. So konfigurieren Sie die Datenkomponenten: 1. Ziehen Sie eine BdpDataAdapter-Komponente in den Designer. Stellen Sie sicher, dass die BdpDataAdapter-Komponente ausgewählt ist. 2. Wählen Sie im Objektinspektor die Option Datenadapter konfigurieren. Das Dialogfeld Datenadapter-Konfiguration wird geöffnet. 3. Falls erforderlich, aktivieren Sie die Registerkarte Anweisung. Wählen Sie in der Dropdown-Liste Verbindung den Eintrag Neue Verbindung. 4. Das Dialogfeld Borland Daten-Provider: Verbindungseditor wird angezeigt. Tip: Alternativ können Sie den Daten-Explorer verwenden, um eine Tabelle auf die Oberfläche des Designers zu ziehen. Der 182 2.5 ASP.NET – Anleitungen RAD Studio für .NET ASP.NET-Datenbankanwendung erstellen Daten-Explorer definiert den Verbindungsstring automatisch. So richten Sie eine Verbindung ein: 1. Wählen Sie im Dialogfeld Borland Daten-Provider: Verbindungseditor das erforderliche Element in der Liste Verbindungen aus. 2. Geben Sie unter Einstellungen den Pfad zur Datenbank ein. Anmerkung: Soll der Bezug zu einer Datenbank auf der lokalen Festplatte hergestellt werden, stellen Sie der Pfadangabe den Eintrag localhost: voran. Wenn Sie mit Interbase arbeiten, können Sie beispielsweise den Pfad zu Ihrer Interbase-Datenbank wie folgt eingeben: localhost:C:\Programme\Borland\Interbase\Examples\Database\employee.gdb (oder entsprechend dem aktuellen Pfad auf Ihrem System). 3. Füllen Sie die Felder Benutzername und Passwort wie für die Datenbank erforderlich aus. 4. Klicken Sie auf Test, um die Verbindung zu überprüfen. Es wird ein Dialogfeld angezeigt, in dem der Verbindungsstatus bestätigt wird. 5. Klicken Sie auf OK, um zum Dialogfeld Borland Daten-Provider: Verbindungseditor zurückzukehren. 6. Klicken Sie auf OK, um zum Dialogfeld Datenadapter-Konfiguration zurückzukehren. Auf der Registerkarte Anweisung wurden die Bereiche für die Tabellen und Spalten mit den Informationen aus Ihrer Verbindung aktualisiert. So legen Sie eine Anweisung fest: 1. Geben Sie im Bereich Auswählen eine SQL-Anweisung ein. Tip: Wenn Sie mit der Interbase-Datenbank EMPLOYEE.GDB arbeiten, könnten Sie zum Beispiel select * from SALES eingeben. 2. Aktivieren Sie die Registerkarte Daten in der Vorabansicht. 3. Klicken Sie auf Aktualisieren. Die Daten für Spalten und Zeilen werden angezeigt. 4. Klicken Sie auf die Registerkarte DataSet. 5. Stellen Sie sicher, dass Neues DataSet ausgewählt ist. 6. Klicken Sie auf OK. Im Designer werden neue Komponenten für DataSet und BdpConnection angezeigt. 7. Wählen Sie die Komponente BdpDataAdapter aus. 8. Öffnen Sie im Objektinspektor die Dropdown-Liste der Eigenschaft Active, und wählen Sie True. So verbinden Sie ein Datengitter (DataGrid) mit einer Datenmenge: 1. Ziehen Sie das Web Control DataGrid in den Designer. Stellen Sie sicher, dass die DataGrid-Komponente ausgewählt ist. 2. Öffnen Sie im Objektinspektor die Dropdown-Liste der Eigenschaft DataSource. Wählen Sie die DataSet-Komponente aus, die Sie zuvor generiert haben (die Voreinstellung ist DataSet1). 3. Öffnen Sie im Objektinspektor die Dropdown-Liste der Eigenschaft DataMember. Wählen Sie die passende Tabelle aus. Das DataGrid-Objekt zeigt die Daten aus der DataSet-Komponente an. So fügen Sie einen Aufruf für die Datenbindung ein: 1. Wählen Sie in der Dropdown-Liste im Objektinspektor das Web Form aus (WebForm1 ist die Standardeinstellung). 2. Aktivieren Sie im Objektinspektor die Registerkarte Ereignisse. 3. Setzen Sie das Ereignis Load auf Page_Load. 4. Doppelklicken Sie im Objektinspektor auf Page_Load. Der Codebehind-Designer wird angezeigt. Der Cursor steht bereits im Rumpf der Ereignisbehandlungsroutine. 5. Geben Sie folgenden Code für die Datenbindung ein: 183 2 ASP.NET-Anwendung mit RAD Studio für .NET 2.5 ASP.NET – Anleitungen this.dataGrid1.DataBind(); Self.dataGrid1.DataBind(); Anmerkung: Wenn Sie datensensitive Steuerelemente verwenden, beispielsweise von einem Fremdhersteller, müssen Sie unter Umständen keinen Code für die Datenbindung eingeben. 6. Wählen Sie Start Start. Die Anwendung wird compiliert, und der HTTP-Server zeigt ein Web-Formular mit der DataGrid-Komponente an. In dieser Anleitung wurde gezeigt, wie sich mit wenigen Schritten ein Datenbankprojekt unter Verwendung der wesentlichen Komponenten von ASP.NET, ADO.NET und der BDP.NET-Architektur erstellen lässt. Zu den wichtigsten Komponenten zählen: Provider, Datenmengen und Adapter. Der Adapter stellt über einen Provider eine Verbindung zur eigentlichen Datenquelle her und sendet eine Anweisung an sie, um die Daten aus der Datenquelle einzulesen und in eine Datenmenge einzufügen. Sobald die Datenmenge gefüllt ist, zeigt ein Datengitter die Daten aus der Datenmenge an. Ist dies alles einmal erstellt, können Sie mit anderen BDP.NET-Designern die Komponenten Ihres Projekts bearbeiten und verwalten. Siehe auch Überblick zu ASP.NET ( see page 85) Überblick zu ADO.NET ( see page 15) Daten-Provider für .NET ( see page 28) ADO.NET-Komponentendesigner ( see page 23) Datenbank-Projekte mit dem Daten-Explorer erstellen ( see page 120) ASP.NET-Anwendung mit Datenbanksteuerelementen erstellen 1 ( see page 189) ASP.NET-Anwendung mit Datenbanksteuerelementen erstellen 2 ( see page 191) ASP.NET-Anwendung mit Datenbanksteuerelementen erstellen 3 ( see page 192) 2.5.3 ASP.NET-Anwendung mit Datenbanksteuerelementen entwickeln, Teil 1 Dieses erweiterte Beispiel zeigt, wie eine Webseite erstellt wird, die ein GridView- und ein Datenbank-Steuerelement enthält. Das Beispiel illustriert: • Das Hinzufügen einer ASP.NET-Komponente zu einem Formular. • Die Verwendung des Smart Tasks-Fensters. 2 • Das Konfigurieren und Verbinden mit einer Datenquelle. • Die Verwendung von SQL zum Lesen von Daten aus einer Datenbank. • Das Ausführen einer Anwendung in einem Browser. Anmerkung: Sie können nur ASP.NET-Projekte in CodeGear RAD Studio erstellen (keine Win32-Personalities). So erstellen Sie eine Seite, die ein GridView- und ein Datenbank-Steuerelement enthält: 1. Erstellen Sie ein neues ASP.NET-Projekt, indem Sie Datei Neu ASP.NET-Webanwendung wählen. 2. Geben Sie im Dialogfeld Neue ASP.NET-Webanwendung einen Namen für das Projekt ein. • Geben Sie in das Feld Speicherort den Verzeichnispfad des Projekts ein, oder übernehmen Sie den Standardpfad. • Wählen Sie in der Dropdown-Liste Server entweder Cassini oder IIS aus. Klicken Sie auf OK. 184 2.5 ASP.NET – Anleitungen RAD Studio für .NET ASP.NET-Anwendung mit 3. (Optional) Klicken Sie im Dialogfeld Neue ASP.NET-Webanwendung auf Serveroptionen einblenden. Das Dialogfeld wird dann erweitert und zeigt zusätzliche Optionen für Server an. Setzen Sie die verschiedenen Lese- und Schreibattribute für das Projekt wie gewünscht, oder übernehmen Sie die Voreinstellungen. Tip: In den meisten Fällen sind die Voreinstellungen ausreichend. 4. Wählen Sie im Quelltext-Editor die Registerkarte Design aus. Doppelklicken Sie in der Tool-Palette unter Daten-Web 2.0 auf eine GridView-Komponente, um sie der Anwendung hinzuzufügen. 5. Zeigen Sie das Smart Tasks-Fenster der GridView-Komponente an, indem Sie entweder auf den Pfeil in der rechten, oberen Ecke der GridView-Komponente klicken oder im Kontextmenü der Komponente Smart Tasks auswählen. 6. Um die GridView-Komponente mit einer Datenquelle zu verbinden, klicken Sie in der Dropdown-Liste Datenquelle auswählen auf <Neue Datenquelle>. Das Dialogfeld Datenquellentyp auswählen wird angezeigt, das Bestandteil des Assistenten zum Konfiguration von Datenquellen ist. 7. Wählen Sie im Dialogfeld Datenquellentyp auswählen Datenbank. Geben Sie eine ID für die Datenquelle ein und klicken Sie auf OK, um das Dialogfeld Wählen Sie Ihre Datenverbindung anzuzeigen. 8. Klicken Sie im Dialogfeld Wählen Sie Ihre Datenverbindung auf Neue Verbindung. 9. Das Dialogfeld Datenquelle auswählen enthält entsprechend Ihrer Konfiguration mehrere Datenquellen. Möglich sind: • AdoDbx: AdoDbx Client • Microsoft SQL Server: Microsoft SQL Server • Blackfish SQL: Blackfish SQL Server Wählen Sie aus den Listen die Datenquelle und den Daten-Provider für diese Datenquelle aus. Klicken Sie auf Fortsetzen 10. Geben Sie im Dialogfeld Verbindung hinzufügen die entsprechenden Verbindungsinformationen ein. • Klicken Sie bei Bedarf auf Erweitert, um detailliertere Verbindungsinformationen für Ihre Datenquelle einzugeben. • Klicken Sie auf die Schaltfläche Verbindung testen, um die Verbindung zu testen Klicken Sie auf OK, um das Dialogfeld zu schließen. 11. Klicken Sie im Dialogfeld Wählen Sie Ihre Datenverbindung auf Weiter, um mit der Konfiguration der Datenquelle fortzufahren. 12. Geben Sie im Dialogfeld Verbindungszeichenfolge in der Anwendungskonfigurationsdatei speichern einen Namen ein, und markieren Sie das Kontrollkästchen Ja, diese Verbindung speichern als. Dadurch verweist die Eigenschaft ConnectionString der Datenquelle auf den Namen, den Sie eingegeben haben, anstatt auf den tatsächlichen Verbindungs-String. Die Datei web.config in diesem Projekt enthält den Verbindungs-String, der auf den hier eingegebenen Informationen beruht. Klicken Sie auf Weiter. 13. Wählen Sie im Dialogfeld Die Select-Anweisung konfigurieren aus, ob Sie entweder eine benutzerdefinierte SQL-Select-Anweisung angeben oder eine SQL-Select-Anweisung für die Datenbank erzeugen lassen möchten. Wenn Sie die Anweisung erzeugen lassen, wählen Sie die Tabelle in der Dropdown-Liste Name aus, markieren die gewünschten Spalten und klicken optional auf die Schaltflächen WHERE, ORDER BY oder Erweitert, um die SQL-Anweisung einzugrenzen. Im Feld SELECT-Anweisung wird die erzeugte SQL-Anweisung angezeigt. Wenn Sie die SQL-Anweisung direkt festlegen möchten, klicken Sie auf Weiter, um das Dialogfeld Benutzerdefinierte Anweisungen oder gespeicherte Prozeduren definieren anzuzeigen und die Felder zu vervollständigen. Optional können Sie auf Abfrage-Generator klicken, um ein Dialogfeld anzuzeigen, in dem Sie eine SELECT-Anweisung grafisch erstellen können. Indem Sie auf die entsprechenden Registerkarten klicken, können Sie SQL-Anweisungen für SELECT-, UPDATE-, INSERT- und DELETE-Anweisungen erstellen. Klicken Sie im jeweiligen Dialogfeld auf Weiter, um mit der Konfiguration der Datenquelle fortzufahren. Anmerkung: Wenn Sie die SQL-Anweisungen direkt eingegeben haben, können Sie die Funktion zum automatischen Erstellen von INSERT-, UPDATE- und DELETE-Anweisungen nicht verwenden. Anmerkung: Der Abfrage-Generator kann keine SELECT-Anweisungen erstellen. 14. (Optional) Im Dialogfeld Testabfrage können Sie auf Testabfrage klicken, um Ihre SQL-Abfrage probeweise auszuführen. Wenn Ihre Abfrage erfolgreich ist, werden die entsprechenden Daten in dem Dialogfeld angezeigt. Klicken Sie auf Fertig 185 2 ASP.NET-Anwendung mit RAD Studio für .NET 2.5 ASP.NET – Anleitungen stellen, um die Konfiguration der Datenquelle abzuschließen. 15. (Optional) Beachten Sie, dass die Eigenschaft ConnectionString den Verbindungs-String enthält, wenn Sie auf der Registerkarte Design die Komponente SQLDataSource auswählen. Die Verbindungs-String-Daten werden auch in der Datei web.config im Element connectionStrings gespeichert: 16. (Optional) Klicken Sie im Quelltext-Editor auf die Registerkarte Default.aspx, um HTML- und ASP.NET-Komponenteninformationen in der Auszeichnungssprache anzuzeigen. Die Eigenschaft GridView Columns enthält Felder, die den Tabellenspaltennamen Ihrer Datenbank zugeordnet sind. 17. Zum Anzeigen der Seite in einem Webbrowser klicken Sie im Quelltext-Editor mit der rechten Maustaste und wählen aus dem Kontextmenü Im Browser anzeigen. Das Projekt wird erzeugt und ein Fenster mit dem Build-Status angezeigt, das bei Fertigstellung des Builds wieder geschlossen wird. Der Browser zeigt eine Tabelle für die Datenbank an, mit der Sie arbeiten. Damit ist Teil 1 des Beispiels abgeschlossen. Siehe auch Überblick zu ASP.NET ( see page 85) ASP.NET-Anwendung mit Datenbanksteuerelementen entwickeln ( see page 191) ASP.NET-Anwendung mit Datenbanksteuerelementen entwickeln ( see page 192) Erstellen einer ASP.NET Sitemap ( see page 194) 2.5.4 ASP.NET-Anwendung mit Datenbanksteuerelementen entwickeln, Teil 2 Dieses Beispiel zeigt die weitere Entwicklung einer Webseite, die ein GridView- und ein Datenbank-Steuerelement enthält. In den folgenden Schritten werden dem GridView-Steuerelement weitere Funktionen, einschließlich dem Bearbeiten, hinzugefügt. Das Beispiel illustriert: • Die Verwendung des Smart Tasks-Fensters. • Das Ändern der Konfiguration einer Datenquelle. • Das Ausführen einer Anwendung in einem Browser. So fügen Sie dem GridView-Steuerelement Bearbeitungsfunktionen hinzu: 1. Öffnen Sie das Projekt oder setzen Sie dessen Entwicklung fort, das unter ASP.NET-Datenbankanwendung entwickeln ( see page 189) beschrieben ist. Am Ende dieser Phase zeigte der Designer ein GridView- und ein SqlDataSource-Steuerelement in Bereich Design des Quelltext-Editors an. 2 2. Um die GridView-Anzeigefunktionen zu aktivieren, öffnen Sie das Smart Tasks-Fenster, indem Sie in der rechten, oberen Ecke des GridView-Steuerelements auf den Pfeil klicken. Markieren Sie Sortieren aktivieren, Auswahl aktivieren und Paging aktivieren. Die Darstellung des GridView-Steuerelements wird aktualisiert. 3. Zum Anzeigen der Seite in einem Webbrowser klicken Sie im Quelltext-Editor mit der rechten Maustaste und wählen aus dem Kontextmenü Im Browser anzeigen. Paging, Sortierung und Auswahl werden nun von diesem Gitter unterstützt. Die Spalten lassen sich sortieren, indem Sie den jeweiligen Spaltenamen am oberen Ende der Spalte anklicken. Auswahl scheint nicht zu funktionieren, weil das Format des GridView-Steuerelements ausgewählte Zeilen nicht markiert. Das Paging ist nicht aktiviert, wenn die Daten auf eine Seite passen. 4. Wechseln Sie zurück zum Bereich Design des Quelltext-Editors. Öffnen Sie das Smart Tasks-Fenster des GridView-Steuerelements und klicken Sie auf Auto-Format, um das Dialogfeld Auto-Format zu öffnen. Wählen Sie Klassisch. Die Beschreibung der Default.aspx-Datei für die asp:GridView-Komponente verfügt nun über Stileigenschaften, die durch die Auswahl von Klassisch im Dialogfeld Auto-Format geändert wurden. 5. Bislang war die Zeilenauswahl aktiviert. Zum Aktivieren der Zeilenbearbeitung müssen Sie die Verbindung evtl. neu 186 2.5 ASP.NET – Anleitungen RAD Studio für .NET ASP.NET-Anwendung mit konfigurieren. Klicken Sie im Smart Tasks-Fenster des GridView-Steuerelements auf Datenquelle konfigurieren. Klicken Sie im Dialogfeld Wählen Sie Ihre Datenverbindung auf Weiter. Klicken Sie im Dialogfeld Die Select-Anweisung konfigurieren auf Erweitert. Markieren Sie im Dialogfeld Erweiterte SQL-Generierungsoptionen INSERT-, UPDATE- und DELETE-Anweisungen generieren. Klicken Sie auf OK, um das Dialogfeld Erweiterte SQL-Generierungsoptionen zu schließen. Anmerkung: Sie können das Dialogfeld Erweiterte SQL-Generierungsoptionen nicht verwenden, wenn Sie im Dialogfeld Die Select-Anweisung konfigurieren festgelegt haben, eigene SQL-Anweisungen zu erstellen. 6. Klicken Sie im Dialogfeld Die Select-Anweisung konfigurieren auf Weiter und dann auf Fertig stellen, um den Assistenten zu beenden. 7. Das Smart Tasks-Fenster enthält nun die Kontrollkästchen Bearbeiten aktivieren und Löschen aktivieren. Markieren Sie beide. Das GridView-Steuerelement zeigt nun die Links Bearbeiten und Löschen an. 8. Zum Anzeigen der Seite in einem Webbrowser klicken Sie im Quelltext-Editor mit der rechten Maustaste und wählen aus dem Kontextmenü Im Browser anzeigen. Die Links Bearbeiten, Löschen und Auswählen arbeiten für alle Zeilen. Damit ist Teil 2 des Beispiels abgeschlossen. Siehe auch Überblick zu ASP.NET ( see page 85) ASP.NET-Anwendung mit Datenbanksteuerelementen entwickeln ( see page 189) ASP.NET-Anwendung mit Datenbanksteuerelementen entwickeln ( see page 192) Erstellen einer ASP.NET Sitemap ( see page 194) 2.5.5 ASP.NET-Anwendung mit Datenbanksteuerelementen entwickeln, Teil 3 Dieses Beispiel zeigt die weitere Entwicklung einer Webseite, die ein GridView- und ein Datenbank-Steuerelement enthält. In diesem Teil wird ein FormView-Steuerelement zum Einfügen von Zeilen hinzugefügt. Das Beispiel illustriert: • Das Hinzufügen einer ASP.NET-Komponente zu einem Formular. • Die Verwendung des Smart Tasks-Fensters. • Die Bearbeitung der Auszeichnungssprache, um das Aussehen einer Komponente zu ändern. • Das Ausführen einer Anwendung in einem Browser. 2 So fügen Sie ein FormView-Steuerelement hinzu: 1. Öffnen Sie das Projekt oder setzen Sie dessen Entwicklung fort, das unter ASP.NET-Datenbankanwendung entwickeln ( see page 191) beschrieben ist. Am Ende dieser Phase wurde im Bereich Design des Quelltext-Editors ein GridView- und ein SqlDataSource-Steuerelement angezeigt. 2. Wählen Sie im Quelltext-Editor die Registerkarte Design aus. Fügen Sie am Ende des Webentwurfs eine neue Zeile ein, indem Sie die Tasten Strg+Ende und dann Eingabe drücken. Doppelklicken Sie in der Tool-Palette unter Daten-Web 2.0 auf eine FormView-Komponente, um sie dem Formular hinzuzufügen. 3. Zeigen Sie das Smart Tasks-Fenster für die FormView-Komponente an, indem Sie oben rechts in der Komponente auf den kleinen Pfeil klicken. Wählen Sie in der Dropdown -Liste Datenquelle auswählen die Datenquelle aus, die Sie zuvor hinzugefügt und konfiguriert haben. Die FormView-Komponente auf der Registerkarte Design zeigt die Datenfelder an. 4. Klicken Sie im Smart Tasks-Fenster der FormView-Komponente auf Auto-Format. Wählen Sie im Dialogfeld Auto-Format Schiefer aus und klicken Sie auf OK. 187 ASP.NET-Anwendung "Hello World" RAD Studio für .NET 2.5 ASP.NET – Anleitungen 5. Wählen Sie auf der Registerkarte Design die FormView-Komponente aus. Ändern Sie im Objektinspektor den Wert von DefaultMode in Insert. Diese Änderung ermöglicht, dass mit dem FormView-Steuerelement Zeilen zu der Datenbank hinzugefügt werden können. 6. Ursprünglich wurden in dem FormView-Steuerelement Beschriftungen und Felder in derselben Zeile dargestellt: Das Erscheinungsbild des FormView-Steuerelements wird in der Auszeichnungssprache im Eintrag InsertItemTemplate der Datei Default.aspx definiert. Zeigen Sie den Text der Datei Default.aspx an, indem Sie auf die Registerkarte Default.aspx klicken. Damit die Beschriftungen und Felder in separaten Zeilen angezeigt werden, bearbeiten Sie die Datei Default.aspx und fügen <br/>-Tags hinter den Spaltenbeschriftungen ein. Das FormView-Steuerelement enthält nun die Beschriftungen und Felder in unterschiedlichen Zeilen. 7. Zum Anzeigen der Seite in einem Webbrowser klicken Sie im Quelltext-Editor mit der rechten Maustaste und wählen aus dem Kontextmenü Im Browser anzeigen. Das Formular wird nun mit dem Steuerelement FormView zum Einfügen von Zeilen angezeigt. Damit ist das Beispiel beendet. Siehe auch Überblick zu ASP.NET ( see page 85) ASP.NET-Anwendung mit Datenbanksteuerelementen entwickeln ( see page 189) ASP.NET-Anwendung mit Datenbanksteuerelementen entwickeln ( see page 191) Erstellen einer ASP.NET Sitemap ( see page 194) 2.5.6 ASP.NET-Anwendung "Hello World" erstellen Die ASP.NET-Anwendung "Hello World" ist zwar sehr einfach, zeigt aber dennoch die wesentlichen Schritte, die zum Erstellen einer ASP.NET-Anwendung erforderlich sind. Die Anwendung verwendet ein Web Form, Steuerelemente und ein Ereignis, das in Reaktion auf eine Benutzeraktion ein Ergebnis anzeigt. So erstellen Sie ein ASP.NET-Projekt: 1. Erstellen Sie ein neues ASP.NET-Projekt, indem Sie Datei Neu ASP.NET-Webanwendung wählen. Das Dialogfeld Neue ASP.NET-Webanwendung wird geöffnet. 2. Geben Sie in das Feld Name den Anwendungsnamen HelloWorld ein. 3. Übernehmen Sie im Feld Speicherort den Standardpfad oder geben Sie einen anderen Pfad ein. So ändern Sie die Webserver-Einstellungen (optional): 2 1. Klicken Sie im Dialogfeld Neue ASP.NET-Webanwendung auf Serveroptionen einblenden. Das Dialogfeld wird dann erweitert und zeigt zusätzliche Optionen für Server an. 2. Setzen Sie die verschiedenen Lese- und Schreibattribute für das Projekt wie gewünscht, oder übernehmen Sie die Voreinstellungen. Tip: Für die meisten ASP.NET-Projekte sind die Voreinstellungen ausreichend. 3. Klicken Sie auf OK. Der Web Forms-Designer wird angezeigt. So erstellen Sie eine ASP.NET-Seite: 1. Stellen Sie sicher, dass die Ansicht Design aktiv ist. 2. Ziehen Sie aus der Kategorie Web Controls der Tool-Palette eine Button-Komponente in die Designer-Oberfläche. Die Button-Komponente wird im Designer angezeigt. Stellen Sie sicher, dass sie ausgewählt ist. 188 2.5 ASP.NET – Anleitungen RAD Studio für .NET Erstellen einer ASP.NET Sitemap 3. Setzen Sie im Objektinspektor die Eigenschaft Text auf Hello World!. So fügen Sie Quelltext für die Schaltfläche hinzu: 1. Doppelklicken Sie im Designer auf das Button-Steuerelement. Der Codebehind-Designer wird angezeigt. Der Cursor steht bereits im Rumpf der Ereignisbehandlungsroutine. 2. Geben Sie den Quelltext für die Anwendungslogik ein: button1.Text = "Hallo, Entwickler!"; button1.Text := 'Hallo, Entwickler!'; 3. Wählen Sie Datei Speichern, um die Anwendung zu speichern. So führen Sie die Anwendung "Hello World" aus: 1. Wählen Sie Start Start. Die Anwendung wird compiliert, und der HTTP-Server zeigt ein Web Form mit der Schaltfläche "Hello World!" im Browser an. 2. Klicken Sie auf die Schaltfläche "Hello World!". Der Server aktualisiert die Seite mit der Antwort "Hallo Entwickler!". 3. Schließen Sie den Web-Browser, um in die IDE zurückzukehren. Siehe auch Überblick zu ASP.NET ( see page 85) ASP.NET-Anwendung erstellen ( see page 186) ASP.NET-Datenbankanwendung erstellen ( see page 187) 2.5.7 Erstellen einer ASP.NET Sitemap Dieses Beispiel zeigt, wie eine Website mit einer Sitemap einem Menü, einem SiteMapPath und einer Master-Seite erstellt wird. Eine web.sitemap-Datei ist eine XML-Datei, die die Struktur einer Website beschreibt. Eine Master-Seite dient als Template für Seiten in der Website. Ein Menü und ein SiteMapPath ermöglichen die Navigation in einer Website. Das Beispiel illustriert: • Das Erstellen einer Web-Sitemap. • Das Erstellen einer Master-Seite. • Das Hinzufügen eines Menüs und eines SiteMapPath zu einer Master-Seite. • Die Verwendung des Smart Tasks-Fensters. • Das Hinzufügen von Inhaltsseiten, die auf die Master-Seite der Site verweisen. • Das Ausführen einer Anwendung in einem Browser. 2 Das Beispiel erstellt die Website in mehreren aufeinander aufbauenden Schritten Anmerkung: Sie können nur ASP.NET-Projekte in CodeGear RAD Studio erstellen (keine Win32-Personalities). So fügen Sie eine Sitemap hinzu: 1. Erstellen Sie ein neues ASP.NET-Projekt, indem Sie Datei Neu ASP.NET-Webanwendung wählen. 2. Geben Sie im Dialogfeld Neue ASP.NET-Webanwendung einen Namen für das Projekt ein oder übernehmen Sie den Standardnamen. Geben Sie in das Feld Speicherort den Verzeichnispfad des Projekts ein, oder übernehmen Sie den Standardpfad. Wählen Sie in der Dropdown-Liste Server entweder Cassini oder IIS aus. 3. (Optional) Klicken Sie im Dialogfeld Neue ASP.NET-Webanwendung auf Serveroptionen einblenden. Das Dialogfeld wird dann erweitert und zeigt zusätzliche Optionen für Server an. Setzen Sie die verschiedenen Lese- und Schreibattribute für das Projekt wie gewünscht, oder übernehmen Sie die Voreinstellungen. Tip: In den meisten Fällen sind die Voreinstellungen ausreichend. 189 Erstellen einer ASP.NET Sitemap RAD Studio für .NET 2.5 ASP.NET – Anleitungen 4. Fügen Sie dem Projekt eine neue web.sitemap-Datei hinzu, indem Sie Datei Neu Weitere wählen. Wählen Sie im Dialogfeld Objektgalerie unter Neue ASP.NET-Dateien Site-Übersicht aus und klicken Sie auf OK. Die IDE zeigt die neue Registerkarte Web.sitemap mit dem Text einer Sitemap-Template an. 5. Ersetzen Sie den Text der Template auf der Registerkarte Web.sitemap mit dem folgenden Text: <?xml version="1.0" encoding="utf-8" ?> <siteMap> <siteMapNode title="Home" url="~/home.aspx" > <siteMapNode title="Book 1" url="~/book1/book1.aspx" > <siteMapNode title="Chapter 1" url="~/book1/chapter1/chapter1.aspx" > </siteMapNode> </siteMapNode> </siteMapNode> </siteMap> Dieser XML-Code definiert die Seitenhierarchie in der Site. Wählen Sie Datei Speichern oder drücken Sie Strg+S, um den neuen Text zu speichern. So fügen Sie eine Master-Seite hinzu: 1. Fügen Sie dem Projekt eine neue Master-Seite hinzu, indem Sie Datei Neu Weitere wählen. Wählen Sie im Dialogfeld Objektgalerie unter Neue ASP.NET-Dateien ASP.NET Master-Seite aus und klicken Sie auf OK. Im Dialogfeld Neue Master-Seite lautet der Standardname der Master-Seite MasterPage1.master; Sie können einen anderen Namen angeben, Sie müssen aber die Erweiterung .master beibehalten. Klicken Sie auf OK. Die IDE zeigt die neue Registerkarte MasterPage1.master an, die eine neue Master-Seite mit Platzhaltern enthält. Der Standardinhalt einer Master-Seite ist ein einziges ContentPlaceHolder-Steuerelement, mit dem angegeben wird, wo Inhalte in Inhaltsseiten eingefügt werden, die diese Master-Seite referenzieren. Dieses Beispiel verwendet nur ein ContentPlaceHolder-Steuerelement, aber Sie können mehrere davon auf einer Master-Seite platzieren. 2. Klicken Sie unten auf der Master-Seite auf das Register MasterPage1.master, um dessen Auszeichnungstext anzuzeigen. Fügen Sie vor dem Hinzufügen des Menüs und des SiteMapPath-Steuerelements einige <div>-Elemente hinzu, um die Positionierung der Steuerelemente festzulegen. Ersetzen Sie dazu den Text im body-Element der Master-Seite durch den folgenden Text: 2 <body> <form runat="server"> <div id="titlediv" style="WIDTH: 100%"> <h1>Beispiel</h1> </div> <div id="breadcrumbdiv" style="WIDTH: 100%"> </div> <div id="menudiv" style="FLOAT: left; WIDTH: 33%"> </div> <div id="contentdiv" style="FLOAT: left; WIDTH: 66%"> <asp:contentplaceholder id="ContentPlaceHolder1" runat="server"> </asp:contentplaceholder> </div> </form> </body> Wählen Sie Datei Speichern oder drücken Sie Strg+S, um den neuen Text zu speichern. Die Master-Seite enthält mehrere Bereiche (<div>), die im Design-Fenster als Rechtecke angezeigt werden. Der Platzhalter für den Inhalt wurde auf der Seite nach rechts verschoben. Master-Seiten werden zum Erstellen von Inhaltsseiten verwendet. Alles, was sich auf der Master-Seite befindet, erscheint auf einer Inhaltsseite, die auf dieser Master-Seite basiert. Wenn die Master-Seite geändert wird, werden diese Änderungen für allen davon abgeleiteten Inhaltsseiten übernommen. So fügen Sie der Master-Seite ein Menü und einen SiteMapPath hinzu: 1. Zum Hinzufügen eines Menüs zeigen Sie das Fenster Design für die Master-Seite an. Ziehen Sie ein Menu-Steuerelement aus der Kategorie Navigation der Tool-Palette in das <div>-Element links neben dem ContentPlaceHolder-Steuerelement. Positionieren Sie das Menu-Steuerelement so, dass sein oberer Rand auf einer Linie mit dem oberen Rand des 190 2.5 ASP.NET – Anleitungen RAD Studio für .NET Erstellen einer ASP.NET Sitemap ContentPlaceHolder-Steuerelements liegt. 2. Zeigen Sie das Smart Tasks-Fenster des Menu-Steuerelements an, indem Sie entweder auf den Pfeil in der rechten, oberen Ecke der Menu-Komponente klicken oder im Kontextmenü der Komponente Smart Tasks auswählen. 3. Um die Menu-Komponente mit einer Datenquelle zu verbinden, klicken Sie im Smart Tasks-Fenster in der Dropdown-Liste Datenquelle auswählen auf <Neue Datenquelle>. Daraufhin wird das Dialogfeld Datenquellentyp auswählen angezeigt 4. Wählen Sie im Dialogfeld Datenquellentyp auswählen den Datenquellentyp Sitemap aus. Geben Sie eine ID für die Datenquelle ein oder belassen Sie die Vorgabe-ID, und klicken Sie auf OK, um die Datenquelle hinzuzufügen. 5. Zum Anpassen des Steuerelements Menu klicken Sie auf Menu. Ändern Sie im Objektinspektor die Eigenschaft StaticDisplayLevels in 3. Dies ist die Anzahl der Ebenen, die in der Menu-Komponente angezeigt wird. Beachten Sie, dass in dem Menü im Fenster Design Daten aus der Sitemap-XML-Datei angezeigt werden. 6. Zum Hinzufügen eines SiteMapPath-Steuerelements zeigen Sie das Fenster Design für die Master-Seite an. Ziehen Sie ein SiteMapPath-Steuerelement aus der Kategorie Navigation der Tool-Palette auf die Master-Seite in das zweite <div>-Element von oben direkt über dem <div>-Element, das das Menu-Steuerelement enthält. Ein SiteMapPath wird auch Bread Crumbs (engl. für Brotkrumen) genannt und bezeichnet eine Standortanzeige, aus der der Benutzer ersehen kann, über welchen Pfad er zu einer Seite gelangt ist. Das Menü und das SiteMapPath-Steuerelement werden für die Navigation in der Site verwendet. So fügen Sie eine Inhaltsseite hinzu: 1. Erstellen Sie eine neue Inhaltsseite, indem Sie Datei Neu Weitere auswählen. Wählen Sie im Dialogfeld Objektgalerie unter Neue ASP.NET-Dateien ASP.NET Inhaltsseite aus und klicken Sie auf OK. Geben Sie der Seite im Dialogfeld Neue Inhaltsseite als Seitennamen Home.aspx ein. Wählen Sie im Dropdown-Menü Master-Seitendatei den Eintrag ~/MasterPage1.master aus. In der resultierenden Inhaltsseite werden alle Elemente, die von der Master-Seite geerbt sind, grau dargestellt: alles außer dem ContentPlaceHolder-Steuerelement. Diese Elemente werden grau dargestellt, um anzuzeigen, dass sie schreibgeschützt sind. Nur das ContentPlaceHolder-Steuerelement kann bearbeitet werden. 2. Klicken Sie im Fenster Home.aspx unten auf das Register Home.aspx. Ändern Sie in der ersten Zeile das Attribut Title in Title=”Home”. Wählen Sie Datei Speichern oder drücken Sie Strg+S, um den neuen Text zu speichern. 3. Die Inhaltsseite (home.aspx) hat ein einzelnen Content-Steuerelement, dass dem Steuerelement ContentPlaceHolder in der Master-Seite (masterpage1.master) entspricht. Zum Anpassen der Inhaltsseite klicken Sie unten im Fenster Home.aspx auf das Register Design. Klicken Sie in das ContentPlaceHolder-Element und geben Sie Home ein. Diese Inhaltsseite dient als Homepage für die Site. So erstellen Sie den Inhalt für die Site: 1. Um Inhalte für die Site zu erstellen, müssen Sie Inhaltsseiten und Ordner, die sie enthalten, anlegen. Erstellen Sie einen neuen Ordner, in dem Sie das Projekt in der Projektverwaltung mit der rechten Maustaste anklicken und Neue hinzufügen Ordner wählen. Geben Sie Book1 als Namen für den Ordner ein. 2. Klicken Sie den Ordner Book1 in der Projektverwaltung mit der rechten Maustaste an und wählen Sie Neue hinzufügen Weitere. Wählen Sie im Dialogfeld Objektgalerie unter Neue ASP.NET-Dateien ASP.NET Inhaltsseite aus und klicken Sie auf OK. Geben Sie im Dialogfeld Neue Inhaltsseite als Namen für die Seite Book1.aspx ein. Wählen Sie ~/MasterPage1.master in der Dropdown-Liste Master-Seitendatei aus. 2 3. Klicken Sie im Fenster Book1.aspx unten auf das Register Book1.aspx. Ändern Sie in der ersten Zeile das Attribut Title in Title=”Book1”. Wählen Sie Datei Speichern oder drücken Sie Strg+S, um den neuen Text zu speichern. 4. Klicken Sie im Fenster Book1.aspx unten auf das Register Design. Klicken Sie in das ContentPlaceHolder-Element und geben Sie Book1 ein. 5. Fügen Sie in den Ordner Book1 einen Ordner ein. Klicken Sie den Ordner Book1 in der Projektverwaltung mit der rechten Maustaste an und wählen Sie Neue hinzufügen Ordner. Geben Sie Chapter1 als Namen für den Ordner ein. 6. Klicken Sie den Ordner Chapter1 in der Projektverwaltung mit der rechten Maustaste an und wählen Sie Neue hinzufügen Weitere. Wählen Sie im Dialogfeld Objektgalerie unter Neue ASP.NET-Dateien ASP.NET Inhaltsseite aus und klicken Sie auf OK. Geben Sie der Seite im Dialogfeld Neue Inhaltsseite als Seitennamen Chapter1.aspx ein. Wählen Sie ~/MasterPage1.master in der Dropdown-Liste Master-Seitendatei aus. 7. Klicken Sie im Fenster Chapter1.aspx unten auf das Register Chapter1.aspx. Ändern Sie in der ersten Zeile das Attribut 191 Aktenkoffermodell-Anwendung mit DB Web RAD Studio für .NET 2.5 ASP.NET – Anleitungen Title in Title=”Chapter1”. Wählen Sie Datei Speichern oder drücken Sie Strg+S, um den neuen Text zu speichern. 8. Klicken Sie im Fenster Chapter1.aspx unten auf das Register Design. Klicken Sie in das ContentPlaceHolder-Element und geben Sie Chapter1 ein. Die Seiten und Ordner wurden entsprechend der Einträge in der Sitemap-XML-Datei hinzugefügt. Damit ist das Hinzufügen von Inhalt zu der Site abgeschlossen. So stellen Sie die Site fertig: 1. Die Datei Default.aspx wird nicht mehr benötigt. Klicken Sie in der Projektverwaltung mit der rechten Maustaste auf Default.aspx. Klicken Sie anschließend auf Löschen. Klicken Sie im Dialogfeld Bestätigen auf Ja. 2. Sie müssen eine Startseite definieren, die als erste Seite beim Ausführen der Anwendung angezeigt wird. Klicken Sie in der Projektverwaltung mit der rechten Maustaste auf Home.aspx und wählen Sie im Kontextmenü Als Startseite festlegen. Die Anwendung kann jetzt ausgeführt werden. So zeigen Sie die Seite in einem Webbrowser an: 1. Um die Anwendung aus zuführen und in einem Browser anzuzeigen, wählen Sie Start Start. Das Projekt wird erzeugt und ein Fenster mit dem Build-Status angezeigt, das bei Fertigstellung des Builds wieder geschlossen wird. 2. Die Homepage sollte nun in einem Webbrowser angezeigt werden. 3. Klicken Sie im Menü auf Book1, um diese Seite anzuzeigen. Klicken Sie auf Chapter1, um diese Seite anzuzeigen. 4. Beachten Sie, dass SiteMapPath aktualisiert wird, um die Position der aktuell angezeigten Seite in der Site darzustellen. Sie können auf diese Knoten klicken, um zu den vorherigen Seiten im Pfad zu wechseln. Damit ist das Projekt abgeschlossen. Siehe auch Überblick zu ASP.NET ( see page 85) ASP.NET-Anwendung mit Datenbanksteuerelementen entwickeln ( see page 189) ASP.NET-Anwendung mit Datenbanksteuerelementen entwickeln ( see page 191) ASP.NET-Anwendung mit Datenbanksteuerelementen entwickeln ( see page 192) 2.5.8 Aktenkoffermodell-Anwendung mit DB Web Controls erstellen 2 Sie können mit Hilfe von DB Web Controls, der XML-Zwischenspeicherung und der BDP.NET-Datenadapter serverseitige Aktenkoffermodell-Anwendungen erstellen. Für diese Anwendungsart ist eine Benutzerauthentifizierung zwingend erforderlich, da jeder Benutzer über eine eigene Kopie der XML-Datei verfügen muss. Anmerkung: DB Web Controls (Namespace Borland.Data.Web) sind seit 2007 veraltet. Sie sollten statt dessen die Standard-Websteuerelemente verwenden. So erstellen Sie eine Aktenkoffermodell-Anwendung: 1. Erstellen Sie eine BDP.NET-Anwendung. 2. Fügen Sie eine DBWebDataSource-Komponente hinzu, und verbinden Sie sie mit der BDP-Datenmenge. 3. Konfigurieren Sie die DBWebDataSource-Komponente so, dass sie eine XML- und eine XSD-Datei generiert. 4. Konfigurieren Sie die Eigenschaften AutoUpdateCache und UseUniqueFileName. 5. Schreiben Sie eine Ereignisbehandlungsroutine für OnApplyChangesRequest, in der die Methode AutoUpdate von 192 2.5 ASP.NET – Anleitungen RAD Studio für .NET Anwendung mit DB Web Controls erstellen BdpDataAdapter aufgerufen wird. 6. Führen Sie die Anwendung aus. So konfigurieren Sie die Eigenschaften AutoUpdateCache und UseUniqueFileName: 1. Erstellen Sie unter Verwendung der BDP.NET-Komponenten und der Komponente DBWebDataSource eine ASP.NET-Standarddatenbankanwendung. 2. Geben Sie in der DBWebDataSource-Komponente die Namen nicht vorhandener XML- und XSD-Dateien an. Anmerkung: Erstellen Sie diese Dateien wenn möglich im Projektverzeichnis oder einem Unterverzeichnis des Projektverzeichnisses (normalerweise auf dem Webserver). 3. Setzen Sie die Eigenschaft AutoUpdateCache auf True. 4. Setzen Sie die Eigenschaft UseUniqueFileName auf True. 5. Aktivieren Sie für die DBWebDataSource-Komponente die Registerkarte Ereignisse. 6. Doppelklicken Sie auf das Feld OnApplyChangesRequest, um die Ereignisbehandlungsroutine im Quelltext-Editor anzuzeigen. 7. Fügen Sie folgenden Quelltext hinzu: BdpDataAdapter1.AutoUpdate; 8. Wählen Sie Start Start. Bei der erstmaligen Ausführung der Anwendung wird die XSD-Datei unter Verwendung der Server-Metadaten erstellt. Wenn ein Benutzer die Anwendung zum ersten Mal ausführt, werden Daten vom Server abgerufen. Ändert er anschließend Daten und speichert diese, werden die Änderungen auf dem Server in einer Datei mit einem eindeutigen Namen abgelegt, der auf dem Namen des Benutzers basiert. Wenn der Benutzer die Anwendung beendet und sie später erneut ausführt, werden seine benutzerspezifischen Daten wiederhergestellt. Er kann dann Änderungen rückgängig machen oder die Daten anderweitig bearbeiten. Bei jedem erfolgreichen Aufruf der OnApplyChangesRequest-Ereignisbehandlungsroutine löscht die Anwendung die Dateien des Benutzer und erstellt sie neu. Warnung: Werden die von der Anwendung genutzten Tabellen oder Spalten nach der Ausführung der Anwendung geändert, muss die XSD-Datei gelöscht werden, damit keine Konflikte zwischen der XSD-Datei und den Server-Metadaten entstehen. Erfolgt die Löschung nicht, kann dies zu Laufzeitfehlern oder einem unerwarteten Verhalten der Anwendung führen. Siehe auch Überblick zu Borland DB Web Controls ( see page 88) XML-Dateien und DB Web Controls verwenden ( Anwendung mit DB Web Controls erstellen ( see page 99) see page 199) 2 2.5.9 Anwendung mit DB Web Controls erstellen Die folgende Anleitung beschreibt, wie Sie mit wenigen Schritten eine einfache ASP.NET-Datenbankanwendung mit DB Web Controls und BDP.NET erstellen können. Wenn die erforderlichen Verbindungsobjekte generiert sind, werden die Daten im Projekt in einer DBWebGrid-Komponente angezeigt, die über eine DBWebNavigator-Komponente gesteuert wird. Zu anderen häufig verwendeten DB Web Controls werden zusätzliche Informationen bereitgestellt. Der Benutzer sollte bereits mit der Erstellung von ASP.NET-Projekten mit BDP.NET vertraut sein. Die Erstellung einer einfachen ASP.NET-Anwendung mit DB Web Controls und BDP.NET umfasst drei grundlegende Schritte: 1. Ein ASP.NET-Projekt mit BDP.NET oder anderen Verbindungskomponenten anlegen. 2. Eine DBWebDataSource-Komponente in den Designer einfügen und deren Eigenschaft DataSource auf ein DataSet-, 193 Anwendung mit DB Web Controls erstellen RAD Studio für .NET 2.5 ASP.NET – Anleitungen DataView- oder DataTable-Objekt setzen. 3. Eine DBWebGrid-Komponente und ggf. weitere Komponenten in den Designer einfügen. Anmerkung: DB Web Controls (Namespace Borland.Data.Web) sind seit 2007 veraltet. Sie sollten statt dessen die Standard-Websteuerelemente verwenden. So legen Sie ein ASP.NET-Projekt für DB Web Controls an: 1. Erstellen Sie ein ASP.NET-Projekt. 2. Richten Sie BDP.NET- oder andere Datenzugriffskomponenten ein, wobei Sie deren DataSource-Eigenschaft ein bestehendes DataSet-, DataView- oder DataTable-Objekt zuweisen. Tip: Weitere Informationen über das Einrichten von BDP.NET-Datenzugriffskomponenten finden Sie in der Anleitung zum Erstellen einer ASP.NET-Datenbankanwendung. Anstatt eine DataGrid-Komponente zu verwenden und zur Datenbindung einen Aufruf von DataBind hinzuzufügen, werden in der folgenden Anleitung DB Web Controls ohne DataBind-Aufruf eingesetzt. So konfigurieren Sie eine DBWebDataSource-Komponente: 1. Ziehen Sie eine DBWebDataSource-Komponente in den Designer. 2. Wählen Sie im Objektinspektor die Eigenschaft DataSource aus. 3. Wählen Sie eine vorhandene Datenquelle aus (diese hat den Standardnamen dataSet1). So konfigurieren Sie DB Web Controls: 1. Ziehen Sie eine DBWebNavigator-Komponente in den Designer. 2. Wählen Sie im Objektinspektor in der Dropdown-Liste der Eigenschaft DBDataSource eine Datenquelle aus. 3. Wählen Sie im Objektinspektor in der Dropdown-Liste der Eigenschaft TableName ein DataTable-Objekt aus. Tip: Wenn kein Tabellenname (Eigenschaft TableName) verfügbar ist, stellen Sie sicher, dass die Eigenschaft Active des BdpDataAdapter-Objekts auf True gesetzt ist. 4. Ziehen Sie eine DBWebGrid-Komponente in den Designer. 5. Wählen Sie im Objektinspektor in der Dropdown-Liste der Eigenschaft DBDataSource die Datenquelle aus. 6. Wählen Sie im Objektinspektor in der Dropdown-Liste der Eigenschaft TableName ein DataTable-Objekt aus. Im Gitter werden Daten angezeigt. 7. Fügen Sie weitere DB Web Controls nach Bedarf hinzu. 8. Legen Sie die Werte von DBDataSource, TableName und weitere Eigenschaften nach Bedarf fest. Anmerkung: Bei datensensitiven Spalten-Steuerelementen (z.B. DBWebTextBox, DBWebImage, DBWebMemo und DBWebCalendar) stellen Sie zusätzlich die Eigenschaft ColumnName ein. Für datensensitive Komponenten, die Nachschlagezwecken dienen (wie DBWebDropDownList, DBWebListBox und DBWebRadioButtonList) müssen zusätzlich die Eigenschaften LookupTableName, DataTextField und DataValueField zugewiesen werden. 2 9. Wählen Sie Start Start. Die Anwendung wird compiliert, und der HTTP-Server zeigt ein Web Form mit der mit Daten gefüllten DBWebGrid-Komponente an. Tip: Wenn Sie Webkomponenten aus der Tool-Palette ziehen, werden sie an einer absoluten Position im ASP.NET-Web Form eingefügt. Wenn Sie auf Komponenten in der Tool-Palette doppelklicken, behalten sie ein fließendes ASP.NET-Layout. Das fließende Layout ist viel einfacher zu handhaben. Beispielsweise können Controls an einer absoluten Position in einem Web Form andere Controls überlagern, wenn sich zur Laufzeit ihre Größe verändert. Dieser Fall kann eintreten, wenn Sie Zeilen in ein Gitter einfügen oder daraus entfernen und auf diese Weise die Größe des Gitters ändern. 194 2.5 ASP.NET – Anleitungen RAD Studio für .NET HTML-Elemente in Server Controls Siehe auch ASP.NET-Datenbankanwendung erstellen CodeGear DB Web Controls ( see page 88) XML-Dateien und DB Web Controls verwenden ( Überblick zum DB Web Control-Experten ( Überblick zu ASP.NET ( see page 85) Überblick zu ADO.NET ( see page 15) Daten-Provider für .NET ( see page 99) see page 93) see page 28) ADO.NET-Komponentendesigner ( see page 23) 2.5.10 HTML-Elemente in Server Controls konvertieren Im Gegensatz zu Web Controls unterstützen HTML-Elemente die programmseitige Steuerung nicht standardmäßig. Es ist jedoch möglich, ein HTML-Element in ein Server Control zu konvertieren, auf das per Programm zugegriffen und das geändert werden kann. Die meisten HTML-Elemente, die in der Tool-Palette angeboten werden, lassen sich mit Hilfe des Befehls Als Server-Control ausführen konvertieren. HTML-Elemente, auf die nicht über die Tool-Palette zugegriffen werden kann (z.B. body), können manuell konvertiert werden. Im Folgenden wird gezeigt, wie eine HTML-Tabelle (table-Element) mit dem Befehl Als Server-Control ausführen, und wie ein body-Element manuell konvertiert wird. So konvertieren Sie eine HTML-Tabelle in ein Server Control: 1. Öffnen Sie eine ASP.NET-Anwendung, und wechseln Sie in den Designer. 2. Ziehen Sie aus der Kategorie HTML-Elemente der Tool-Palette das Element HTML-Tabelle in den Designer. 3. Klicken Sie im Designer mit der rechten Maustaste auf das Table-Element, und wählen Sie Als Server-Control ausführen. Das Symbol für Server Controls wird zum Table-Element hinzugefügt. In der .aspx-Datei werden dem table-Tag die Attribute id="TABLE1" und runat="server" hinzugefügt. In der Codebehind-Datei wird TABLE1 mit System.Web.UI.HtmlControls.HtmlTable deklariert. 4. Nun können Sie im Quelltext auf TABLE1 Bezug nehmen. Ziehen Sie aus der Kategorie Web Controls der Tool-Palette eine Button-Komponente in den Designer. 5. Doppelklicken Sie auf die Schaltfläche. Der Quelltext-Editor wird geöffnet. Der Cursor befindet sich in der Behandlungsroutine für das Klickereignis der Schaltfläche. 2 6. Fügen Sie der Ereignisbehandlungsroutine folgenden Quelltext hinzu, um die Hintergrundfarbe der Tabelle in Blau zu ändern. Beachten Sie dabei, dass TABLE1 die ID ist, die dem table-Tag in Schritt 3 automatisch hinzugefügt wurde. TABLE1.BgColor := 'blue'; TABLE1.BgColor = "blue"; 7. Wählen Sie Start Ausführen, um die Anwendung auszuführen. 8. Klicken Sie auf die Schaltfläche, um die Farbe der Tabelle zu ändern. So konvertieren Sie ein body-HTML-Element manuell in ein Server Control: 1. Öffnen Sie eine ASP.NET-Anwendung, und zeigen Sie die .aspx-Datei an. 2. Fügen Sie dem body-Tag die Attribute runat="server" und id="bezeichner" hinzu. Dabei steht bezeichner für einen Bezeichner wie bodytag. 195 XML-Datei für DB Web Controls erstellen RAD Studio für .NET 2.5 ASP.NET – Anleitungen 3. Fügen Sie dem strict protected-Abschnitt der Codebehind-Datei folgende Deklaration hinzu: bodytag: System.Web.UI.HtmlControls.HtmlGenericControl; protected System.Web.UI.HtmlControls.HtmlGenericControl bodytag; 4. Nun können Sie im Quelltext auf bodytag Bezug nehmen. Ziehen Sie aus der Kategorie Web Controls der Tool-Palette eine Button-Komponente in den Designer. 5. Doppelklicken Sie auf die Schaltfläche. Der Quelltext-Editor wird geöffnet. Der Cursor befindet sich in der Behandlungsroutine für das Klickereignis der Schaltfläche. 6. Fügen Sie folgenden Quelltext hinzu, um die Hintergrundfarbe des Web Form in Gelb zu ändern: bodytag.Attributes['bgcolor'] := 'yellow'; bodytag.Attributes["bgcolor"] = "yellow"; 7. Wählen Sie Start Ausführen, um die Anwendung auszuführen. 8. Klicken Sie auf die Schaltfläche, um die Hintergrundfarbe des Formulars zu ändern. Siehe auch Zwischen HTML-Elementen und Server Controls wählen 2.5.11 XML-Datei für DB Web Controls erstellen XML-Dateien können als Datenquelle verwendet werden. Dieses Vorgehen bietet sich vor allem für die Erstellung von Prototypanwendungen an, die keine Lese- und Schreibzugriffe auf eine Datenbank erfordern. Die betreffenden XML-Dateien müssen aber vorher erstellt werden. Ideal geeignet für diesen Zweck ist die DBWebDataSource-Komponente. Mit ihrer Hilfe können Sie eine XML-Datei erstellen, die auf echten Datenbankdaten basiert. In der vorliegenden Anleitung wird davon ausgegangen, dass Sie eine Verbindung zu der Datenbank herstellen können, die die gewünschten Daten enthält. Anmerkung: DB Web Controls (Namespace Borland.Data.Web) sind seit 2007 veraltet. Sie sollten statt dessen die Standard-Websteuerelemente verwenden. So erstellen und verwenden Sie eine XML-Datei: 1. Erstellen Sie eine ASP.NET-Anwendung mit DB Web Controls. 2. Verwenden Sie eine XML-Datei als Datenquelle für die neue ASP.NET-Anwendung. So erstellen Sie eine ASP.NET-Anwendung mit DBWeb Controls: 1. Wählen Sie Datei Neu ASP.NET-Webanwendung (für Delphi für .NET). 2 2. Erstellen Sie mit Hilfe der BDP.NET-Steuerelemente oder mit anderen Datenadapter-Elementen eine Datenbankverbindung und einen Datenadapter. 3. Ziehen Sie eine DBWebDataSource-Komponente aus dem Bereich DB Web der Tool-Palette in den Designer. 4. Geben Sie in der Eigenschaft XMLFileName oder XMLSchemaFile den Namen einer Datei an, die noch nicht vorhanden ist. 5. Erzeugen Sie ein DataSet-Objekt aus dem Datenadapter. 6. Setzen Sie die Eigenschaft DataSource der DBWebDataSource-Komponente auf dataSet1. 7. Setzen Sie die Eigenschaft Active des Datenadapters auf True. 8. Wählen Sie Start Start. Dadurch wird die Anwendung ausgeführt, und gleichzeitig wird die XML- bzw. XSD-Datei erstellt und mit den Daten aus dem DataSet-Objekt gefüllt. So verwenden Sie die XML-Datei als Datenquelle für eine neue ASP.NET-Anwendung: 1. Wählen Sie Datei Neu ASP.NET-Webanwendung (für Delphi für .NET). 196 2.5 ASP.NET – Anleitungen RAD Studio für .NET Metadaten für eine Datenmenge erstellen 2. Ziehen Sie eine DataSet-Komponente aus dem Bereich Datenkomponenten der Tool-Palette in den Designer. 3. Ziehen Sie eine DBWebDataSource-Komponente aus dem Bereich DB Web der Tool-Palette in den Designer. 4. Weisen Sie den Namen der XML-Datei der Eigenschaft XMLFileName der DBWebDataSource-Komponente zu . Anmerkung: Wenn Sie anstatt einer XML-Datei eine XSD-Datei erstellt haben, verwenden Sie in diesem Schritt deren Namen. 5. Setzen Sie die Eigenschaft DataSource der DBWebDataSource-Komponente auf die DataSet-Komponente. 6. Ziehen Sie eine DBWebGrid-Komponente aus dem Bereich DB Web der Tool-Palette in den Designer. 7. Setzen Sie die Eigenschaft DBDataSource der DBWebGrid-Komponente auf den Namen der DBWebDataSource-Komponente. 8. Wählen Sie Start Ausführen, um die Anwendung auszuführen. Die Anwendung ruft nun Daten aus dem DataSet-Objekt bzw. der XML-Datei ab und zeigt sie in der DBWebGrid-Komponente an. Warnung: Sie können über die Eigenschaft XMLFileName der DBWebDataSource-Komponente auch den Namen einer vorhandenen Datei zusammen mit einer aktiven BdpDataAdapter-Komponente und deren DataSet-Objekt angeben. Wenn Sie die Anwendung dann ausführen, zeigen die DB Web Controls die Daten dieser XML-Datei an. Es ist jedoch nicht sinnvoll, die XML-Funktionalität der DBWebDataSource-Komponente für diesen Zweck zu verwenden. Zwar werden die Daten der XML-Datei richtig angezeigt, eine Aktualisierung oder andere Operationen mit den Daten liefern aber oft nicht das gewünschte Ergebnis. Siehe auch XML-Dateien mit DBWeb Controls verwenden ( Überblick zu Borland DBWeb Controls ( see page 99) see page 88) Anwendung mit DBWeb Controls erstellen ( see page 199) Berechtigungen für die Nutzung von XML-Dateien festlegen ( ASP.NET-Datenbankanwendung erstellen ( see page 208) see page 187) 2.5.12 Metadaten für eine Datenmenge erstellen Wenn Sie in einer ASP.NET-Anwendung mit DB Web Controls eine XML-Datei als Datenquelle verwenden, müssen Sie möglicherweise Metadaten erzeugen, um die XML-Daten im DataSet-Objekt zu strukturieren. Wird die XML-Datei ohne XML-Schemadatei (.xsd) erstellt, müssen die Metadaten manuell erzeugt werden. In der vorliegenden Anleitung wird davon ausgegangen, dass bereits eine XML-Datei mit Daten vorhanden ist. Anmerkung: DB Web Controls (Namespace Borland.Data.Web) sind seit 2007 veraltet. Sie sollten statt dessen die Standard-Websteuerelemente verwenden. So richten Sie die Anwendung ein: 1. Wählen Sie Datei Neu ASP.NET-Webanwendung (für Delphi für .NET). 2. Ziehen Sie eine DBWebDataSource-Komponente in das Formular. 3. Ziehen Sie eine DataSet-Komponente in das Formular. 4. Klicken Sie auf die Ellipsen-Schaltfläche (...) neben der Eigenschaft XMLFileName der DBWebDataSource-Komponente, und wechseln Sie zum Verzeichnis mit der XML-Datei. 5. Wählen Sie die DataSet-Komponente in der Komponentenablage aus. 6. Klicken Sie auf die Eigenschaft für Tabellensammlungen, um den Tabellensammlungs-Editor anzuzeigen. 197 2 Virtuelle Verzeichnisse erstellen RAD Studio für .NET 2.5 ASP.NET – Anleitungen So erstellen Sie die Metadaten: 1. Klicken Sie auf Hinzufügen, um der Sammlung eine neue Tabelle hinzuzufügen. Zu Demonstrationszwecken werden hier die folgenden XML-Datensätze verwendet: <?xml version="1.0" standalone="yes"> <NewSongs> /// XML-Deklaration /// <song> wird zum Tabellennamen der Datenmenge. <song> /// <songid> wird zur 1. Spalte der Datenmenge. <songid>1001</songid> /// <title> wird zur 2. Spalte der Datenmenge. <title>Mary Had a Little Lamb</title> </song> <song> <songid>1003</songid> <title>Twinkle, Twinkle Little Star</title> </song> </Newongs> 2. Ändern Sie die Eigenschaft TableName zu song. 3. Klicken Sie auf die Eigenschaft für Spaltensammlungen, um den Spaltensammlungs-Editor anzuzeigen. 4. Klicken Sie auf Hinzufügen, um eine neue Spalte hinzuzufügen. 5. Ändern Sie die Eigenschaft ColumnName zu songid. 6. Klicken Sie auf Hinzufügen, um eine weitere Spalte hinzuzufügen. 7. Ändern Sie die Eigenschaft ColumnName zu title. 8. Klicken Sie auf Schließen, um den Spaltensammlungs-Editor zu schließen. 9. Klicken Sie auf Schließen, um den Tabellensammlungs-Editor zu schließen. Sie haben nun die Metadaten für die Daten in der XML-Datei erstellt. Siehe auch XML-Dateien mit DBWeb Controls verwenden ( see page 99) 2.5.13 Virtuelle Verzeichnisse erstellen 2 Wenn Sie eine ASP.NET-Anwendung erstellen, erzeugt die IDE ausgehend von den Einstellungen im Dialogfeld Neue ASP.NET-Webanwendung automatisch ein virtuelles Verzeichnis. Die IDE kann jedoch auch ein virtuelles Verzeichnis für eine Anwendung anlegen, die nicht in der IDE erstellt wurde, beispielsweise für die Demo-Anwendungen im Ordner DBWeb. Anmerkung: DB Web Controls (Namespace Borland.Data.Web) sind seit 2007 veraltet. Sie sollten statt dessen die Standard-Websteuerelemente verwenden. So erstellen Sie ein virtuelles Verzeichnis für eine vorhandene Anwendung: 1. Öffnen Sie die Projektdatei der ASP.NET-Anwendung in der IDE. 2. Wählen Sie Projekt Optionen Debugger ASP.NET. Die Standard-Anwendungseinstellungen werden angezeigt. Übernehmen Sie die Standardeinstellungen, oder ändern Sie sie nach Bedarf. 3. Wenn Sie ein virtuelles Verzeichnis zur Verwendung mit dem Internet Information Server (IIS) erstellen, klicken Sie auf die 198 2.5 ASP.NET – Anleitungen RAD Studio für .NET ASP.NET-Anwendungen debuggen und Schaltfläche Serveroptionen, um das Dialogfeld Virtuelles Verzeichnis konfigurieren zu öffnen. Wenn Sie den Namen des virtuellen Verzeichnisses oder dessen Alias ändern, können Sie auch die Berechtigungen ändern, die mit dem virtuellen Verzeichnis verbunden sind. 4. Klicken Sie auf OK, um zu den Projektoptionen zurückzukehren. 5. Klicken Sie auf OK, um die Projektoptionen zu verlassen. Das virtuelle Verzeichnis wird angelegt, sodass Sie die Anwendung ausführen können. 2.5.14 Aggregatwerte mit der DBWebAggregateControl-Komponente hinzufügen Sie können mit Hilfe einer DBWebAggregateControl-Komponente eine Standard-Aggregatfunktion (Zusammenfassung) für eine Datenspalte implementieren. Der Aggregatwert wird in einem Textfeld angezeigt, dem ein Titel zugeordnet werden kann. Anmerkung: DB Web Controls (Namespace Borland.Data.Web) sind seit 2007 veraltet. Sie sollten statt dessen die Standard-Websteuerelemente verwenden. So erstellen und konfigurieren Sie eine DBWebAggregateControl-Komponente: 1. Erstellen Sie eine neue ASP.NET-Webanwendung, und fügen Sie ihr eine Datenbankverbindung, einen Datenadapter, eine Datenmenge und eine DBWebDataSource-Komponente hinzu. 2. Setzen Sie die Eigenschaft Active der BdpDataAdapter-Komponente auf True. 3. Ziehen Sie eine DBWebAggregateControl-Komponente in den Web Forms-Designer. 4. Setzen Sie die Eigenschaft DBDataSource der DBWebAggregateControl-Komponente auf DBWebDataSource1. Dies ist der Standardname der DBWebDataSource-Komponente. 5. Weisen Sie der Eigenschaft TableName einen Wert zu. 6. Öffnen Sie die Dropdown-Liste der Eigenschaft AggregateType, und wählen Sie einen Wert aus. 7. Öffnen Sie die Dropdown-Liste der Eigenschaft ColumnName, und wählen Sie einen Wert aus. Welcher Wert im Textfeld angezeigt wird, hängt von der gewählten Aggregatfunktion und den Werten in der ausgewählten Spalte ab. Anmerkung: Falls die Spalte NULL-Werte enthält, setzen Sie die Eigenschaft IgnoreNullValues auf True, um Fehler zu vermeiden. So legen Sie den Titel für die DBWebAggregateControl-Komponente fest: 1. Geben Sie im Objektinspektor in das Feld für die Eigenschaft Caption einen Titel ein. 2 2. Legen Sie mit Hilfe der Dropdown-Liste der Eigenschaft CaptionPosition die Position für den Titel fest. Siehe auch CodeGear DB Web Controls ( see page 88) Anwendung mit DB Web Controls erstellen ( see page 199) 2.5.15 ASP.NET-Anwendungen debuggen und aktualisieren Während der Installation von RAD Studio werden Sie gefragt, ob die Datei machine.config auf Ihrem Computer aktualisiert werden soll. Dies ist für das Debuggen von RAD Studio-Anwendungen unter IIS erforderlich. Wenn Sie auf die Frage mit Ja 199 Deployment einer ASP.NET-Anwendung RAD Studio für .NET 2.5 ASP.NET – Anleitungen antworten, werden Borland-Debugger-Informationen in die Datei machine.config geschrieben und den Anwendungen zur Verfügung gestellt, die mit Delphi 8 erstellt wurden. Sie müssen diese Anweisung nicht ausführen. Sollten Sie die Frage mit Nein beantworten, werden die Debugger-Informationen in die Datei web.config der Anwendung geschrieben, wenn Sie eine ASP.NET-Anwendung mit RAD Studio erzeugen. Für Anwendungen, die mit Delphi 8 erstellt wurden, müssen Sie diese Informationen manuell in die Datei web.config einfügen. Andernfalls kann beim Versuch, die Anwendung mit RAD Studio zu debuggen, folgende Fehlermeldung angezeigt werden: Debugging kann auf dem Webserver nicht gestartet werden. Zu Arbeitsprozess ASP.NET kann nicht verbunden werden (normalerweise aspnet_wp.exe oder w3wp.exe). So aktualisieren Sie die Datei web.config für eine mit Delphi 8 erstellte ASP.NET-Anwendung: 1. Öffnen Sie die Datei web.config in der IDE oder in einem Texteditor. 2. Ersetzen Sie die Zeilen <compilation debug="true" defaultLanguage="c#"> </compilation> durch folgende: <compilation defaultLanguage="c#" debug="true"> <assemblies> <add assembly="Borland.dbkasp, Version=9.0.0.1, Culture=neutral, PublicKeyToken=b0524c541232aae7"/> </assemblies> </compilation> <httpModules> <add name="DbgConnect" type = "Borland.DbkAsp.DbkConnModule, Borland.dbkasp,Version=9.0.0.1, Culture=neutral, PublicKeyToken=b0524c541232aae7"/> </httpModules> 3. Speichern Sie die Datei web.config. 4. Öffnen Sie das Anwendungsprojekt in der IDE, und führen Sie es aus. Anmerkung: Vor dem Deployment einer ASP.NET-Anwendung müssen Sie das Debugging deaktivieren und die Debugger-Referenzen aus der Datei web.config entfernen. Einzelheiten finden Sie im unten aufgeführten Thema. Siehe auch Den ASP.NET-Deploymentmanager verwenden ( see page 212) 2 2.5.16 Deployment einer ASP.NET-Anwendung mit Blackfish SQL an ein System ohne RAD Studio Sie können eine ASP.NET-Anwendung mit Blackfish SQL an ein System ohne RAD Studio weitergeben. So geben Sie eine ASP.NET-Anwendung mit Blackfish SQL an ein System weiter, das nicht über CodeGear RAD Studio verfügt: 1. Erstellen Sie eine ASP.NET-Anwendung . Setzen Sie in der Datei web.config des Projekts den Eintrag connectionString auf Blackfish SQL Local Client. Im Folgenden finden Sie einen Beispieleintrag für die Datei web.config: <connectionStrings> 200 2.5 ASP.NET – Anleitungen RAD Studio für .NET Spalten in DBWebGrid-Objekten binden <!-- Lokaler Verbindungs-String : Mit dem folgenden String eine Verbindung zum Provider mittels des lokalen Clients herstellen --> <add name="BlackfishSqlAspNet" connectionString="database=|DataDirectory|bsql_aspnetdb.jds; user=user;password=password;create=true" providerName="Borland.Data.BlackfishSQL.LocalClient"/> </connectionStrings> 2. Compilieren Sie die Anwendung. 3. Geben Sie die Anwendung wie unter Den ASP.NET-Deploymentmanager verwenden ( see page 102) beschrieben weiter. 4. Kopieren Sie die folgenden Dateien in das Verzeichnis bin: • Borland.Delphi.dll • Borland.VclRtl.dll • Borland.Web.Provider.dll • Borland.Data.BlackfishSQL.LocalClient.dll • BlackfishSQL.slip 5. Kopieren Sie eine Blackfish SQL-Datenbank in das Verzeichnis App_Data, das im Projektverzeichnis erstellt wird, wenn die Anwendung ausgeführt wird. 6. Führen Sie die Anwendung aus. Siehe auch Deployment von ASP.NET-Anwendungen ( see page 102) Den ASP.NET-Deploymentmanager verwenden ( see page 102) 2.5.17 HTTP-Meldungen in ASP.NET erzeugen Beim Debuggen Ihrer ASP.NET-Anwendungen werden möglicherweise unverständliche oder bedeutungslose Fehlermeldungen ausgegeben. Grund hierfür ist die Einstellung einer bestimmten Option im Internet Explorer. Sie können das Debuggen Ihrer Anwendung vereinfachen, indem Sie diese Einstellung ändern. So sorgen Sie für die Anzeige aussagekräftiger Fehlermeldungen: 1. Wählen Sie im Internet Explorer (sofern Sie diesen verwenden) Tools Internetoptionen. 2. Klicken Sie auf die Registerkarte Erweitert. 3. Deaktivieren Sie das Kontrollkästchen Kurze HTTP-Fehlermeldungen anzeigen. 4. Klicken Sie auf OK. Kurze HTTP-Fehlermeldungen sind nun deaktiviert, und es werden aussagekräftige ASP.NET-Meldungen angezeigt. Siehe auch Überblick zu ASP.NET ( see page 85) Fehlerbehebung in ASP.NET-Anwendungen ( see page 209) 2.5.18 Spalten in DBWebGrid-Objekten binden In bestimmten Situationen kann es notwendig sein, die Reihenfolge zu ändern, in der die Spalten in einem DBWebGrid-Objekt 201 2 Berechtigungen für die Nutzung von RAD Studio für .NET 2.5 ASP.NET – Anleitungen angeordnet sind. Hierzu ist es möglich, die Spalten im Property Builder manuell zu binden. Anmerkung: DB Web Controls (Namespace Borland.Data.Web) sind seit 2007 veraltet. Sie sollten statt dessen die Standard-Websteuerelemente verwenden. So öffnen Sie den Property Builder: 1. Starten Sie eine neue ASP.NET-Anwendung. 2. Fügen Sie einen Datenprovider hinzu. 3. Fügen Sie ein DBWebDataSource-Objekt hinzu, und verbinden Sie es mit einer generierten Datenmenge. 4. Fügen Sie eine DBWebGrid-Komponente in das Web Form ein. 5. Klicken Sie auf das Designer Verb Property Builder am unteren Rand des Objektinspektors. Der Property Builder wird geöffnet. So ändern Sie die Spaltenreihenfolge: 1. Klicken Sie im Property Builder auf das Register General. 2. Setzen Sie die Eigenschaft DataSource auf das DBWebDataSource-Objekt oder DataSet-Objekt, auf das DBWebDataSource verweist. 3. Klicken Sie auf die Registerkarte Columns. 4. Wählen Sie in der Liste Available Columns die Spalten aus, die angezeigt werden sollen. 5. Klicken Sie auf die Schaltfläche mit dem Rechtspfeil, um die Spalten in die Liste Selected Columns zu übertragen. 6. Ordnen Sie die Spalten in der Liste Selected Columns nach Bedarf neu an. 7. Im Feld Header können Sie den Text festlegen, der später im Gitter als Spaltenüberschrift angezeigt wird. 8. Klicken Sie auf Apply. 9. Klicken Sie auf OK. Warnung: Wenn Sie sich für dieses Verfahren zur Spaltenbindung entscheiden, muss die Eigenschaft AutoGenerateColumns auf False gesetzt werden. Hat diese Eigenschaft den Wert True, wird ein Laufzeitfehler ausgelöst. Es ist dann nicht möglich, während des Entwurfs die Anordnung der Spalten zu verändern. Ebenso kann ein Laufzeitfehler ausgelöst werden, wenn eine Spalte mehr als einmal einem Gitter zugeordnet wird. Siehe auch CodeGear DBWeb Controls ( see page 88) Anwendung mit DBWeb Controls erstellen ( see page 199) 2 2.5.19 Berechtigungen für die Nutzung von XML-Dateien festlegen Um bei Verwendung von XML-Dateien als Datenquelle Zugriffsfehler zu vermeiden, müssen Sie Clients, die Ihre ASP.NET-Anwendungen nutzen, Berechtigungen zuweisen. Sie haben hierzu zwei Möglichkeiten, die im Folgenden beschrieben werden. Anmerkung: DB Web Controls (Namespace Borland.Data.Web) sind seit 2007 veraltet. Sie sollten statt dessen die Standard-Websteuerelemente verwenden. 202 2.5 ASP.NET – Anleitungen RAD Studio für .NET Fehlerbehebung in So weisen Sie Benutzern Berechtigungen zu, wenn die Eigenschaft UseUniqueFileName auf False gesetzt ist: 1. Klicken Sie mit der rechten Maustaste auf das Startmenü von Windows, und wählen Sie den Befehl Suchen. 2. Wählen Sie Tools Ordneroptionen. 3. Aktivieren Sie die Registerkarte Ansicht. 4. Deaktivieren Sie die Option Einfache Dateifreigabe verwenden. 5. Klicken Sie auf Für alle übernehmen. 6. Klicken Sie auf OK. 7. Wechseln Sie zu der XML-Datei, die im Projekt verwendet wird, klicken Sie mit der rechten Maustaste darauf, und wählen Sie Eigenschaften. 8. Aktivieren Sie die Registerkarte Sicherheit. 9. Fügen Sie den Benutzer Jeder hinzu, und vergeben Sie für die Datei alle Zugriffsrechte. So weisen Sie Benutzern Berechtigungen zu, wenn UseUniqueFileName den Wert True hat und die Benutzerauthentifizierung verwendet wird: 1. Legen Sie in der Windows-Systemsteuerung im Dialogfeld Benutzerkonten einen neuen Benutzer an. 2. Erstellen Sie im virtuellen IIS-Verzeichnis, in dem sich Ihre Webanwendung befindet, einen neuen Ordner mit der Bezeichnung CacheFiles. Die virtuellen IIS-Verzeichnisse befinden sich normalerweise im Verzeichnis C:\Inetpub\wwwroot. 3. Wechseln Sie mit Hilfe des Windows-Explorers zum Ordner CacheFiles. 4. Klicken Sie mit der rechten Maustaste, und wählen Sie Eigenschaften. 5. Aktivieren Sie die Registerkarte Sicherheit, und fügen Sie den in Schritt 1 angelegten Benutzer hinzu. 6. Weisen Sie dem Ordner alle Zugriffsrechte zu. 7. Verschieben Sie die XML-Datei in diesen Ordner. 8. Weisen Sie der Eigenschaft XMLFileName der DBWebDataSource-Komponente in der Anwendung diese Datei zu. Anmerkung: Stellen Sie sicher, dass in den Ordneroptionen von Windows die Einstellung Einfache Dateifreigabe verwenden deaktiviert ist. Siehe auch XML-Dateien und DB Web Controls verwenden ( XML-Datei für DB Web Controls erstellen ( see page 99) see page 201) 2 2.5.20 Fehlerbehebung in ASP.NET-Anwendungen Im Gegensatz zu herkömmlichen, fensterbasierten Anwendungen sind Webanwendungen von Servern und Ressourcen abhängig, die nicht unmittelbar durch die Anwendung oder den Benutzer gesteuert werden können. Viele Webanwendungen greifen auf Client-, Server- und Netzwerkressourcen zu. Um Fehler zu minimieren, müssen die Bereiche ASP.NET-Installation, IIS-Installation und -Konfiguration und Sicherheit einer besonderen Überprüfung unterzogen werden. Alle drei Bereiche sind sehr umfangreich und komplex. In den folgenden Anleitungen werden Lösungen für die gängigsten Probleme vorgestellt. Anmerkung: Die folgenden Lösungen gelten nur für IIS 5.1. 203 Fehlerbehebung in RAD Studio für .NET 2.5 ASP.NET – Anleitungen So beheben Sie Fehler in einer ASP.NET-Anwendung: 1. Führen Sie eine Installation bzw. eine erneute Installation von ASP.NET durch. 2. Erstellen oder überprüfen Sie Ihr ASP.NET-Benutzerkonto. 3. Führen Sie eine Installation bzw. eine erneute Installation von IIS durch. 4. Starten Sie IIS, oder starten Sie IIS neu. 5. Konfigurieren Sie IIS so, dass Ihre Anwendung erkannt wird. 6. Fügen Sie Dokumenttypen zu IIS hinzu. 7. Aktivieren Sie die anonyme Authentifizierung. 8. Überprüfen Sie gegebenenfalls die Datenbankverbindung. So führen Sie eine Installation bzw. eine erneute Installation von ASP.NET durch: 1. Wählen Sie Start Ausführen, um das Dialogfeld Ausführen zu öffnen. 2. Geben Sie cmd /e in das Dropdown-Feld Öffnen ein. 3. Klicken Sie auf OK. 4. Wechseln Sie zum Verzeichnis c:\Windows\Microsoft.NET\Framework\v1.1.4322. 5. Geben Sie den Befehl aspnet_regiis.exe -i ein. 6. Drücken Sie die EINGABETASTE. Anmerkung: Wenn Sie die verfügbaren Befehlsoptionen für das Dienstprogramm aspnet_regiis.exe anzeigen möchten, geben Sie nach dem Basisbefehl anstelle von -i das Zeichen ? ein. So erstellen oder überprüfen Sie Ihr ASP.NET-Benutzerkonto: 1. Wählen Sie Start Systemsteuerung Benutzerkonten, um die Liste der im System verwendeten Benutzerkonten anzuzeigen. 2. Wenn noch kein ASPNET-Benutzerkonto vorhanden ist, erstellen Sie eines. 3. Starten Sie den Computer neu. Warnung: Weisen Sie dem ASPNET-Benutzerkonto keine Administratorrechte zu. Dies würde ein Sicherheitsrisiko für das System bedeuten und Hackern die Möglichkeit eröffnen, weitergegebene ASP.NET-Anwendungen zu manipulieren. Erstellen Sie stattdessen ein Konto, das einen Identitätswechsel unterstützt. So führen Sie eine Installation bzw. eine erneute Installation von IIS durch: 1. Wählen Sie Start Systemsteuerung Software. Das Dialogfeld Software wird geöffnet. 2 2. Klicken Sie auf Windows-Komponenten hinzufügen/entfernen. Der Assistent für Windows-Komponenten wird angezeigt. 3. Aktivieren Sie das Kontrollkästchen Internet Information Services (IIS). 4. Klicken Sie auf Weiter. 5. Klicken Sie auf Fertig stellen. 6. Starten Sie IIS. So starten Sie IIS neu: 1. Klicken Sie auf Start Systemsteuerung Verwaltung Internet Information Services. 2. Wählen Sie den Knoten für den lokalen Computer aus. 3. Klicken Sie mit der rechten Maustaste, und wählen Sie IIS erneut starten. Das Dialogfeld Beenden/Starten/Herunterfahren wird geöffnet. 204 2.5 ASP.NET – Anleitungen RAD Studio für .NET Fehlerbehebung in 4. Wählen Sie die gewünschte Aktion in der Dropdown-Liste aus. 5. Klicken Sie auf OK. So konfigurieren Sie IIS, damit Ihre Anwendung erkannt wird: 1. Wechseln Sie in der IIS-Konsole zu dem Ordner oder dem virtuellen Verzeichnis mit Ihrer Webanwendung. Ist weder ein Ordner noch ein virtuelles Verzeichnis vorhanden, müssen Sie ein virtuelles Verzeichnis erstellen. 2. Wählen Sie den Ordner aus. 3. Klicken Sie mit der rechten Maustaste, und wählen Sie Eigenschaften. 4. Aktivieren Sie die Registerkarte Virtuelles Verzeichnis. 5. Klicken Sie auf die Schaltfläche Erstellen unter dem Bereich Anwendungseinstellung. Falls die Schaltfläche Entfernen angezeigt wird, entfernen Sie gegebenenfalls das vorhandene virtuelle Verzeichnis und erstellen ein neues. So fügen Sie Dokumenttypen zu IIS hinzu: 1. Klicken Sie auf Start Systemsteuerung Verwaltung Internet Information Services. 2. Wählen Sie Standardwebsite. 3. Klicken Sie mit der rechten Maustaste, und wählen Sie Eigenschaften. 4. Aktivieren Sie die Registerkarte Dokumente. 5. Klicken Sie auf Hinzufügen. Das Dialogfeld Standarddokument hinzufügen wird geöffnet. 6. Geben Sie WebForm1.aspx in das Feld Name des Standarddokuments ein. 7. Klicken Sie zweimal auf OK. So aktivieren Sie die anonyme Authentifizierung: 1. Wechseln Sie in der IIS-Konsole zu dem Ordner oder dem virtuellen Verzeichnis mit Ihrer Webanwendung. Ist weder ein Ordner noch ein virtuelles Verzeichnis vorhanden, müssen Sie ein virtuelles Verzeichnis erstellen. 2. Wählen Sie den Ordner aus. 3. Klicken Sie mit der rechten Maustaste, und wählen Sie Eigenschaften. 4. Aktivieren Sie die Registerkarte Verzeichnissicherheit. 5. Klicken Sie auf Bearbeiten. 6. Aktivieren Sie das Kontrollkästchen Anonymer Zugriff. 7. Geben Sie in das Feld Benutzername den Namen des ASPNET-Benutzerkontos ein, das Sie erstellt haben. 8. Aktivieren Sie das Kontrollkästchen Integrierte Windows-Authentifizierung, oder fügen Sie Ihr eigenes Passwort hinzu. 9. Klicken Sie zweimal auf OK. 2 So überprüfen Sie die Datenbankverbindung: 1. Aktivieren Sie die Registerkarte Daten-Explorer, um die Datenbankverbindungen anzuzeigen. 2. Erweitern Sie die Liste der Provider, um eine gültige Datenbankverbindung anzuzeigen. 3. Klicken Sie mit der rechten Maustaste, und wählen Sie Verbindung bearbeiten. Der Verbindungseditor wird angezeigt. 4. Wenn der Bezeichner localhost nicht im Datenbank-Verbindungsstring enthalten ist, fügen Sie ihn an den String an. Beispiel: localhost:C:\Programme\Gemeinsame Dateien\Borland Shared\Data\EMPLOYEE.GDB 5. Stellen Sie sicher, dass alle anderen Verbindungseinstellungen korrekt sind. 6. Klicken Sie auf Test, um die Verbindung zu überprüfen. 205 Den ASP.NET-Deploymentmanager RAD Studio für .NET 2.5 ASP.NET – Anleitungen Siehe auch Überblick zu ASP.NET ( see page 85) Microsoft-Diskussionsgruppen Virtuelle Verzeichnisse erstellen ( see page 204) HTTP-Meldungen in ASP.NET erzeugen ( see page 207) 2.5.21 Den DB Web Control-Experten verwenden Mit dem DB Web Control-Experten können Sie ein datensensitives Web Control aus einem Standard-Web Control erstellen. Anmerkung: DB Web Controls (Namespace Borland.Data.Web) sind seit 2007 veraltet. Sie sollten statt dessen die Standard-Websteuerelemente verwenden. So starten Sie den DB Web Control-Experten: 1. Wählen Sie Datei Neu Weitere Delphi für .NET-Projekte DB Web Control-Bibliothek.. Der DB Web Control-Experte wird geöffnet. 2. Geben Sie in das Textfeld Name des Steuerelements einen Namen für das Control ein. 3. Aktivieren Sie die Option An DataTable binden. Der Experte fügt dann automatisch Quelltext für die Implementierung des Interface IDBWebDataLink in die Control-Datei ein. Über dieses Interface kann auf Datenquellen- und Tabelleninformationen zugegriffen werden. 4. Wählen Sie die Option An DataColumn binden, wenn eine Bindung zu einer Spalte definiert werden soll (wenn das Control z.B. nur einen bestimmten Datentyp unterstützt). Der Experte fügt dann automatisch Quelltext für die Implementierung des Interface IDBWebColumnLink in die Control-Datei ein. Über dieses Interface wird auf eine Spalte in der Tabelle zugegriffen, die über IDBWebDataLink zugänglich ist. 5. Wenn Sie eine Bindung zu einer Datenspalte für ein Control definieren, das Nachschlagezwecken dient (Listenfeld, Optionsfeldgruppe, Kontrollkästchen usw.), und das neue Control ebenfalls ein Nachschlage-Control sein soll, aktivieren Sie das Kontrollkästchen Lookup unterstützen. Der Experte fügt dann automatisch Quelltext für die Implementierung des Interface IDBWebLookupColumnLink in die Control-Datei ein. Über dieses Interface wird auf die Nachschlagetabelle, das Textfeld und den Feldwert der Spalte zugriffen, die über IDBWebColumnLink zugänglich ist. Der DB Web Control-Experte erstellt eine Template-Datei und öffnet sie im Quelltext-Editor. Bearbeiten Sie diese Datei, und leiten Sie Ihr Control von einem DB Web Control ab. Siehe auch Überblick zum DB Web Control-Experten ( 2 Überblick zu Borland DB Web Controls ( see page 93) see page 88) 2.5.22 Den ASP.NET-Deploymentmanager verwenden Sie können einem ASP.NET-Anwendungsprojekt einen ASP.NET-Deploymentmanager hinzufügen, um die Weitergabe der Anwendung zu vereinfachen. Der Deploymentmanager bestimmt die Dateien, die für das Deployment erforderlich sind, fordert den Namen des Zielverzeichnisses und die Verbindungsinformationen an und kopiert die Dateien in das Zielverzeichnis. Der Deploymentmanager erzeugt eine Liste der zu kopierenden Dateien basierend auf den Namen der Dateien im Projektverzeichnis. Sie können dieser Liste aber nach Bedarf weitere Dateien hinzufügen oder Dateien daraus entfernen. Wenn Sie im Fenster des Deploymentmanagers mit der rechten Maustaste klicken, werden die Optionen zum Anzeigen, 206 2.5 ASP.NET – Anleitungen RAD Studio für .NET Den ASP.NET-Deploymentmanager Kopieren, Löschen, Ändern und Filtern der Zieldateien angezeigt. Ist die Option Assemblierungsreferenzen anzeigen aktiviert, enthält das Fenster des Deploymentmanagers eine Liste mit allen vom Projekt referenzierten Assemblierungen. Die Systemassemblierungen werden zwar angezeigt, sind aber deaktiviert (grau). Dieses deaktivierten Assemblierungen können nicht weitergegeben werden. Mit Hilfe der Option Externe Dateien können Sie die externen Dateien auswählen, die weitergegeben werden sollen. In einem Dialogfeld mit einer Checkliste sind bereits die BDP-Datenbankbibliotheken markiert, da diese häufig weitergegeben werden müssen. Sie können auch Datei Öffnen wählen und die gewünschten Dateien in einem separaten Dialogfeld der Liste hinzufügen. Die Liste enthält eine Spalte, in der das Zielverzeichnis für die externe Datei angegeben ist. Sie können den Zielpfad ändern. Die Dateien, die beim Klicken auf OK ausgewählt sind, werden im Deploymentmanager angezeigt. Weitere Informationen zum Kontextmenü des Deploymentmanagers finden Sie über die entsprechenden Links am Ende dieses Themas. Vorbereitende Maßnahmen • Um das IIS-Debugging von RAD Studio-Anwendungen zu ermöglichen, werden Sie während der Installation von RAD Studio gefragt, ob die Datei machine.config auf Ihrem Computer aktualisiert werden soll. Wenn Sie diese Frage mit Ja beantworten, werden CodeGear-Debugger-Informationen in die Datei machine.config geschrieben. Sollten Sie die Frage mit Nein beantworten, werden die Debugger-Informationen in die Datei web.config der Anwendung geschrieben, wenn Sie eine ASP.NET-Anwendung mit RAD Studio erzeugen. Vor dem Deployment einer Anwendung muss das Debugging wie in der folgenden Anleitung beschrieben deaktiviert werden, um die Anwendung zu optimieren. Wenn Sie sich bei der Installation gegen eine Aktualisierung der Datei machine.config entschieden haben, müssen Sie Verweise auf CodeGear-Debugger-Module in der Datei web.config entfernen, da diese auf dem Zielcomputer möglicherweise nicht zur Verfügung stehen. • Sie sollten deshalb die Verwendung einer separaten web.config-Datei für Deployment-Zwecke in Betracht ziehen. So könnten Sie beispielsweise eine Datei mit dem Namen web.config.deploy erstellen und diese während des Deployments in web.config umbenennen. Verwenden Sie zum Umbenennen der Datei den Befehl Name der Zieldatei ändern des Deploymentmanagers. • Es ist möglich, das Zielverzeichnis während der Arbeit mit dem Deploymentmanager zu erstellen. Die Anwendung kann dann aber erst verwendet werden, nachdem das virtuelle Verzeichnis mit IIS erstellt wurde. Alternativ können Sie das Deployment auch in ein vorhandenes virtuelles Verzeichnis durchführen. • Beim Deployment für eine FTP-Site behält der Deploymentmanager Ihre FTP-Verbindungsinformationen bei. Sie können Ihr Passwort für die FTP-Verbindung speichern. Dies erfolgt dann aber unverschlüsselt als Text. • Sie können einem ASP.NET-Projekt mehrere Deploymentmanager hinzufügen und diese für die Weitergabe an verschiedene Zielverzeichnisse konfigurieren. • Einige der im Deploymentmanager verfügbaren Befehle sind auch im Kontextmenü der Projektverwaltung enthalten. So entfernen Sie Debugger-Verweise aus der web.config-Datei: 1. Öffnen Sie die Datei web.config für die ASP.NET-Anwendung, die Sie weitergeben möchten, in der IDE oder in einem Texteditor. 2 2. Ändern Sie im Abschnitt <compilation> die Anweisung debug="true" in debug="false". 3. Übergehen Sie diesen Schritt, wenn Sie während der Installation von RAD Studio der Aktualisierung der Datei machine.config zugestimmt haben (siehe den Abschnitt Vorbereitende Maßnahmen weiter oben). Entfernen Sie die folgenden Verweise auf CodeGear-Debugger-Assemblierungen und -Module, oder kommentieren Sie diese aus: <assemblies> <add assembly="Borland.dbkasp, Version=9.0.0.1, Culture=neutral, PublicKeyToken=b0524c541232aae7"/> </assemblies> <httpModules> <add name="DbgConnect" type = "Borland.DbkAsp.DbkConnModule,Borland.dbkasp,Version=9.0.0.1, Culture=neutral, PublicKeyToken=b0524c541232aae7"/> 207 Den ASP.NET-Deploymentmanager RAD Studio für .NET 2.5 ASP.NET – Anleitungen </httpModules> 4. Speichern Sie die Datei, und compilieren Sie die Anwendung erneut. So führen Sie das Deployment einer ASP.NET-Anwendung durch: 1. Öffnen Sie das ASP.NET-Anwendungsprojekt, das Sie weitergeben möchten, in der IDE. 2. Wählen Sie Datei Neu Weitere Deployment ASP.NET-Deployment, und klicken Sie auf OK. (Der Deployment-Knoten wird nur dann im Dialogfeld Objektgalerie angezeigt, wenn ein ASP.NET-Projekt geöffnet ist.) Die Registerkarte Weitergeben wird angezeigt, und dem Projektverzeichnis wird eine .bdsdeploy-Datei hinzugefügt. Die Datei wird in der Projektverwaltung angezeigt. Auf der linken Seite der Registerkarte Weitergeben unter Quelldateien sehen Sie eine Liste der Dateien, die für das Deployment erforderlich sind. Tip: In dieser Liste sind nur gespeicherte Dateien enthalten. Speichern Sie alle neue Dateien, und aktualisieren Sie den Deploymentmanager, damit diese Dateien angezeigt werden. 3. Wählen Sie in der Dropdown-Liste Ziel entweder Ordnerposition oder FTP-Speicherort. Bei Auswahl von Ordnerposition wird das Dialogfeld Ordner suchen geöffnet. Sie können ein vorhandenes Verzeichnis auswählen oder auf Neues Verzeichnis erstellen klicken. Wenn Sie FTP-Speicherort wählen, wird das Dialogfeld FTP-Site angezeigt. Geben Sie die Verbindungsinformationen ein. Wenn Sie Informationen zu einem Feld benötigen, klicken Sie auf Hilfe. Klicken Sie anschließend auf OK, um zum Deploymentmanager zurückzukehren. 4. Wenn Sie einen FTP-Speicherort ausgewählt haben, aktivieren Sie das Kontrollkästchen Verbunden, um die Dateien im Zielverzeichnis (sofern vorhanden) zu verbinden und anzuzeigen. 5. Überprüfen Sie die Dateien in der Liste Quelldateien. Wenn Sie auf eine Datei klicken, werden im Textfeld unter der Dateiliste Detailinformationen zu dieser Datei angezeigt. 6. Um alle Dateien in das Zielverzeichnis zu kopieren, klicken Sie auf die Schaltfläche Alle neuen und geänderten Dateien nach Ziel kopieren in der Symbolleiste am oberen Rand des Deploymentmanagers. Die Dateien werden dann sofort in das Zielverzeichnis kopiert und in der Liste Zieldateien angezeigt. Um die Dateiliste zu ändern, klicken Sie mit der rechten Maustaste an einer beliebigen Stelle der Liste und wählen den gewünschten Befehl im Kontextmenü aus oder verwenden die Dateistatus-Schaltflächen, wie unten beschrieben. Tip: Um eine Datei in der Liste auszuwählen, klicken Sie auf ihren Namen. Sie können mehrere Dateien in der Liste markieren, indem Sie bei gedrückter STRG -Taste nacheinander auf die betreffenden Dateien klicken. Um einen Bereich mit Dateien auszuwählen, drücken Sie STRG+UMSCHALT und klicken auf die erste Datei und anschließend auf die letzte Datei des Bereichs. Kontextmenübefehl Beschreibung Aktualisieren Der Deploymentmanager wird entsprechend der Änderungen in der Dateiliste aktualisiert. Markierte Datei(en) Die ausgewählten Dateien werden in das Zielverzeichnis kopiert. nach Ziel kopieren 2 Markierte löschen Namen ändern Zieldatei(en) Die ausgewählten Dateien werden im Zielverzeichnis gelöscht (für jede Datei wird eine Bestätigung des Vorgangs gefordert). der Zieldatei Ein Dialogfeld zum Umbenennen der ausgewählten Datei im Zielverzeichnis wird geöffnet. Alle neuen und Alle mit markierten Dateien werden in das Zielverzeichnis kopiert. Dieser Befehl steht auch in der geänderten Dateien Symbolleiste des Deploymentmanagers zur Verfügung oder kann durch Klicken mit der rechten nach Ziel kopieren Maustaste auf den .bdsdeploy-Knoten in der Projektverwaltung aufgerufen werden. Alle nicht im Projekt Alle mit markierten Dateien werden im Zielverzeichnis gelöscht (für jede Datei wird eine enthaltenen Zieldateien Bestätigung des Vorgangs gefordert). löschen Ignorierte Gruppen und Alle Dateien im Projektverzeichnis werden angezeigt, auch diejenigen, die für das Deployment der Dateien anzeigen Anwendung nicht erforderlich sind. Gruppe ignorieren 208 Die ausgewählte Datei wird vom Deploymentmanager ignoriert. 2.5 ASP.NET – Anleitungen RAD Studio für .NET Mit dem HTML-Tag-Editor arbeiten Datei(en) ignorieren Alle Dateien eines Knotens in der Quelldateiliste werden vom Deploymentmanager ignoriert. Protokollierung aktivieren Die Aktionen des Deploymentmanagers werden in der Datei DeployLog.txt im Projektverzeichnis protokolliert. Protokoll anzeigen Die Protokolldatei wird im Standard-Texteditor geöffnet. 7. Wenn Sie die Kriterien für das Deployment festgelegt haben, speichern Sie die Einstellungen in der Datei .bdsdeploy. Nach dem erneuten Öffnen des Projekts können Sie den Deploymentmanager in der Projektverwaltung öffnen und die Anwendung mit den aktuellen Einstellungen weitergeben oder die Deployment-Kriterien ändern (siehe oben). Die folgenden Schaltflächen zeigen den Status der Dateien in der Dateiliste an und können zum Kopieren oder Löschen von Dateien verwendet werden (siehe unten). Dateistatus-Schaltfläche Beschreibung Die Datei kann zum Kopieren ausgewählt werden (sie ist im Zielverzeichnis nicht vorhanden oder wurde seit dem letzten Kopieren geändert). Klicken Sie auf die Schaltfläche, um die Datei in das Zielverzeichnis zu kopieren. Die Datei ist im Zielverzeichnis, nicht aber im Projektverzeichnis vorhanden. Dateien mit diesem Symbol können in der Regel ohne nachteilige Auswirkungen aus dem Zielverzeichnis entfernt werden. Klicken Sie auf die Schaltfläche, um die Datei im Zielverzeichnis zu löschen. Der Status der Datei ist nicht bekannt. Sie ist möglicherweise jüngeren Datums als die Datei im Projektverzeichnis. Klicken Sie auf die Schaltfläche, um die Datei im Zielverzeichnis zu ersetzen. So erstellen Sie mit IIS ein virtuelles Verzeichnis für ein neues Zielverzeichnis: 1. Öffnen Sie IIS auf dem Computer, an den Sie die Anwendung weitergegeben haben. Wählen Sie beispielsweise unter Windows XP Start Systemsteuerung Verwaltung Internet Information Services. 2. Erweitern Sie im Dialogfeld Internet Information Services die Baumstruktur, um den Knoten des lokalen Computers anzuzeigen. 3. Klicken Sie mit der rechten Maustaste auf den Knoten Standardwebsite, und wählen Sie Neu Virtuelles Verzeichnis. Der Assistent zum Erstellen virtueller Verzeichnisse wird angezeigt. 4. Folgen Sie den Aufforderungen auf den Seiten des Assistenten, um das virtuelle Verzeichnis zu erstellen. Weitere Informationen zu virtuellen Verzeichnissen finden Sie in der Online-Hilfe von IIS. Siehe auch Deployment von ASP.NET-Anwendungen ( see page 102) 2 2.5.23 Mit dem HTML-Tag-Editor arbeiten Sie können zur Erstellung oder Bearbeitung einer HTML-Datei den Tag-Editor verwenden. Dieser Editor befindet sich unterhalb des Designer-Fensters. Für ASP.NET Webformulare wird der Tag-Editor nicht unterstützt. Wenn Sie beispielsweise ein HTML-Formular verwenden, können Sie den Tag-Editor im Designer durch Auswahl von Ansicht Tag-Editor anzeigen. Im Tag-Editor können Sie HTML-Tags überprüfen und ändern und gleichzeitig die entsprechenden Steuerelemente im Designer-Fenster darüber beobachten. Der Editor unterstützt die folgenden Funktionen des Quelltext-Editors: Programmierhilfe, Fehlermarkierung und Live-Template-Vervollständigung. Ausführliche Informationen zu diesen Funktionen finden Sie über die entsprechenden Links am Ende dieses Themas. Im Tag-Editor wird jeweils nur ein Tag bearbeitet, sofern nicht das Dokumentobjekt markiert oder ein Tag verkleinert ist (bei 209 Mit dem HTML-Tag-Editor arbeiten RAD Studio für .NET 2.5 ASP.NET – Anleitungen ausgewähltem Dokumentobjekt wird im Objektinspektor der Eintrag "DOCUMENT" angezeigt). Mit Hilfe der Zoom-Schaltflächen können Sie die Ansicht verkleinern, um das übergeordnete Tag anzuzeigen, oder die Ansicht vergrößern und das ausgewählte untergeordnete Tag anzeigen. Die Zoomfunktion wird nicht für ein bestimmtes Tag ausgeführt, sondern für die gesamte Auszeichnung im Dokument. Wenn Sie den Cursor beispielsweise auf ein Tag im HTML-Markup platzieren und den Zoom-Befehl aufrufen, gelangen Sie zum äußeren Tag, d.h. auf die Ebene oberhalb des Attributs, auf dem sich der Cursor befindet. Die Überprüfung auf HTML-Standardregeln wird automatisch durchgeführt. Wenn diese Validierung fehlschlägt, wird das fehlerhafte Element im Designer rot hervorgehoben. Gleichzeitig wird im Tag-Editor die Funktion Fehlermarkierung aktiviert, um die Fehlerbehebung zu erleichtern. Anmerkung: Der Tag-Editor steht in einer ASP.NET-Anwendung nicht zur Verfügung. So zeigen Sie den HTML-Quelltext für ein einzelnes Steuerelement an: 1. Ziehen Sie bei angezeigtem Designer ein HTML-Element aus der Tool-Palette in die Designer-Oberfläche. Der HTML-Code wird im Tag-Editor angezeigt. 2. Sie können den Quelltext des Steuerelements einblenden, indem Sie auf eine beliebige Stelle der Designer-Oberfläche klicken, um die Auswahl des Steuerelements aufzuheben. Der HTML-Quelltext wird im Tag-Editorfenster angezeigt, wobei verschiedene Syntaxelemente unterschiedlich hervorgehoben werden. In der grauen Titelleiste des Tag-Editors wird jetzt das übergeordnete Tag angezeigt. In der Regel handelt es sich hierbei um das Tag FORM, das zur Definition des betreffenden Web Form dient. Anmerkung: Falls die Definition des Steuerelements mehrere HTML-Quelltextzeilen umfasst, wird bei Auswahl des Steuerelements die erste Quelltextzeile in der grauen Titelleiste des Tag-Editors angezeigt. Der weitere Quelltext wird darunter im Tag-Editorfenster eingeblendet. So zeigen Sie den HTML-Quelltext für alle Steuerelemente an: 1. Ziehen Sie bei angezeigtem Designer mehrere HTML-Elemente aus der Tool-Palette in die Designer-Oberfläche. Sobald Sie ein Element im Designer ablegen, wird der zugehörige HTML-Quelltext im Editor angezeigt. 2. Klicken Sie auf eine beliebige Stelle der Designer-Oberfläche, um die Auswahl sämtlicher Steuerelemente aufzuheben. Daraufhin wird der Quelltext für alle Steuerelemente mit Syntaxhervorhebungen im Tag-Editor angezeigt. So bearbeiten Sie ein Steuerelement: 1. Klicken Sie auf eine beliebige Stelle der Designer-Oberfläche, um die Auswahl sämtlicher Steuerelemente aufzuheben. 2. Suchen Sie das Tag, das zu dem zu bearbeitenden Steuerelement gehört. 3. Bearbeiten Sie den Quelltext. Das Steuerelement im Designer wird sofort entsprechend aktualisiert. 4. Speichern Sie das Projekt, um die Änderungen festzuschreiben. 2 So ändern Sie Editoreigenschaften: 1. Wählen Sie Tools Optionen HTML-/ASP.NET-Optionen. 2. Ändern Sie die Eigenschaften des Quelltext-Editors nach Bedarf. 3. Klicken Sie auf OK. Die Änderungen sind sofort wirksam. So wechseln Sie zwischen der Anzeige des Formulars und der Anzeige des Formularcontainers: 1. Um die Anzeige zu verkleinern, sodass die HTML-Formulardefinition angezeigt wird, klicken Sie auf den blauen Pfeil, der sich am linken Rand der grauen Titelleiste des Tag-Editors befindet. Anmerkung: Diese Funktion ist nur verfügbar, wenn sich der Cursor innerhalb des Tag-Editors und nicht innerhalb der Designer-Oberfläche befindet. 210 2.5 ASP.NET – Anleitungen RAD Studio für .NET ASP.NET User Controls verwenden 2. Um die Anzeige zu vergrößern, sodass der innerhalb der FORM-Tags definierte Inhalt angezeigt wird, klicken Sie auf den blauen Pfeil am rechten Rand der grauen Titelleiste des Tag-Editors. Anmerkung: Diese Funktion ist nur verfügbar, wenn sich der Cursor innerhalb des Tag-Editors und nicht innerhalb der Designer-Oberfläche befindet. So schließen Sie den Tag-Editor: 1. Wählen Sie Tools Optionen HTML-/ASP.NET-Optionen. 2. Deaktivieren Sie die Option Tag-Editor anzeigen. 3. Klicken Sie auf OK. Siehe auch Den Quelltext-Editor verwenden Quelltext-Editor anpassen Verwendung von Live-Templates Code Insight verwenden 2.5.24 ASP.NET User Controls verwenden User Controls ermöglichen es, eine häufig verwendete Funktionalität der Benutzeroberfläche für alle ASP.NET-Webanwendungen bereitzustellen. Es ist beispielsweise möglich, einen Anmeldebildschirm in einem User Control zu kapseln. Wenn später in einem Web Form ein Anmeldebildschirm benötigt wird, muss nur das betreffende User Control in das Web Form eingefügt werden. Ausführliche Informationen über User Controls erhalten Sie über den Link am Ende dieses Themas. So erstellen Sie ein ASP.NET User Control: 1. Öffnen Sie eine ASP.NET-Anwendung. 2. Wählen Sie Datei Neu Weitere Delphi für .NET-Projekte Neue ASP.NET-Dateien, und doppelklicken Sie auf ASP.NET User Control. Der Projektverwaltung wird eine neue .ascx-Datei hinzugefügt, und die leere Seite wird im Designer angezeigt. Sie können die .ascx-Datei bei Bedarf umbenennen. Klicken Sie dazu in der Projektverwaltung mit der rechten Maustaste auf die Datei, und wählen Sie Umbenennen. Alle verknüpften Dateien (z.B. .pas- und .resx-Dateien) werden ebenfalls umbenannt. 3. Entwerfen Sie die Seite, indem Sie Steuerelemente platzieren, Eigenschaften zuweisen und der Codebehind-Datei .pas nach Bedarf Quelltext hinzufügen. 4. Speichern und compilieren Sie das Projekt. 2 So fügen Sie ein ASP.NET User Control zu einem Web Form hinzu: 1. Öffnen Sie das Web Form, dem Sie das User Control hinzufügen möchten. Stellen Sie sicher, dass der Designer angezeigt wird. 2. Wählen Sie Einfügen User Control einfügen, um das Dialogfeld User Control einfügen zu öffnen. 3. Wählen Sie ein User Control aus der Dropdown-Liste, oder navigieren Sie mit der Schaltfläche Durchsuchen zu einer Datei mit einem User Control (.ascx). 4. Klicken Sie auf OK, um das User Control in das Web Form einzufügen. 5. Sie können der User Control-Schaltfläche einen Namen zuweisen, indem Sie im Objektinspektor die Eigenschaft Id entsprechend festlegen. 6. Speichern und compilieren Sie das Projekt. 211 ASP.NET User Controls verwenden RAD Studio für .NET 2.5 ASP.NET – Anleitungen Das Web Form wird im Browser angezeigt, und die User Control-Schaltfläche wird durch die gekapselten Steuerelemente ersetzt. Tip: Wie das User Control zur Laufzeit aussieht, hängt von der Seite und den Steuerelementen ab, die im Control gekapselt sind. Die Position der User Control-Schaltfläche im Web Form spielt dabei keine Rolle. Wenn Sie einer Seite mehrere User Controls hinzufügen, sollten Sie die Anwendung ausführen und überprüfen, ob sich Controls überlappen. Siehe auch User Controls in Web Forms 2 212 2.6 Web-Services-Anleitungen RAD Studio für .NET Auf die 2.6 Web-Services-Anleitungen Dieser Abschnitt enthält Anleitungen zur Entwicklung und Verwendung von Web-Services. Themen Name Beschreibung Auf die ASP.NET-Web-Services-Anwendung "Hello World" zugreifen ( page 218) Webreferenzen in ASP.NET-Projekte einfügen ( see see page 220) ASP.NET-Web-Services-Anwendung "Hello World" erstellen ( see page 222) Web-Services-Client-Anwendung von Delphi für Win32 nach Delphi für .NET portieren ( see page 223) Wenn Sie die erstellte Web-Services-Anwendung benutzen möchten, müssen Sie eine Client-Anwendung erstellen, über die auf die ASP.NET-Web-Services-Anwendung zugegriffen werden kann. Um das gewünschte Ergebnis zu erzielen, sind andere Entwicklungsschritte erforderlich. Um einen Web-Service zu nutzen, müssen Sie eine Client-Anwendung erstellen und eine Webreferenz hinzufügen. In diesen Anleitungen wird die Erstellung einer ASP.NET-Client-Anwendung demonstriert, die einen Web-Service eines Fremdherstellers nutzt. Dabei handelt es sich um den Web-Service DeadOrAliveWS, der auf der XMethods-Website zur Verfügung steht. Mit Hilfe dieses Web-Service können Sie auf eine einfache Datenbank mit den Geburtsund Todestagen berühmter Persönlichkeiten zugreifen. Wenn Sie eine Anwendung mit ASP.NET-Web-Services erstellen, können Sie über eine Internet-Verbindung der Client-Anwendung eine bestimmte Funktionalität bereitstellen. Die folgenden Schritte zeigen, wie eine einfache "Hello World"-Anwendung mit ASP.NET-Web-Services erstellt wird. Nach dem Build stellt die Anwendung alle in ihr definierten Objekte und Methoden über eine Webmethode zur Verfügung, die Sie definieren und auf die Sie über einen Web-Browser zugreifen. Im Folgenden werden die Schritte beschrieben, die zum Portieren einer mit Delphi für Win32 erstellten Web-Services-Client-Anwendung nach Delphi für .NET ausgeführt werden müssen. 2.6.1 Auf die ASP.NET-Web-Services-Anwendung "Hello World" zugreifen Wenn Sie die erstellte Web-Services-Anwendung benutzen möchten, müssen Sie eine Client-Anwendung erstellen, über die auf die ASP.NET-Web-Services-Anwendung zugegriffen werden kann. Um das gewünschte Ergebnis zu erzielen, sind andere Entwicklungsschritte erforderlich. So greifen Sie auf eine einfache ASP.NET- Web-Services-Anwendung namens "Hello World" zu: 1. Erstellen Sie eine Client-Anwendung. 2. Fügen Sie eine Webreferenz für einen XML-Web-Service hinzu. 2 3. Erstellen Sie die Codebehind-Logik. 4. Führen Sie die Client-Anwendung aus. So erstellen Sie eine Client-Anwendung: 1. Wählen Sie Datei Neu Weitere. Das Dialogfeld Objektgalerie wird geöffnet. 2. Wählen Sie einen beliebigen Anwendungstyp für den Client aus, zum Beispiel eine Windows Forms-Anwendung oder eine ASP.NET-Webanwendung. In diesem Beispiel wird eine Windows Forms-Anwendung erstellt (mit Delphi für .NET oder C#). 3. Klicken Sie auf OK. Das Dialogfeld Neues Projekt wird geöffnet. So fügen Sie eine Webreferenz für eine ASP.NET-Web-Services-Anwendung hinzu: 1. Wählen Sie Projekt Webreferenz hinzufügen. 213 Webreferenzen in ASP.NET-Projekte RAD Studio für .NET 2.6 Web-Services-Anleitungen 2. Geben Sie in das Adressfeld im oberen Bereich des Web-Dialogfelds CodeGear UDDI Browser folgenden URL ein: http://localhost/WebService1/WebService1.asmx Anmerkung: Der Name Ihrer Anwendung lautet möglicherweise nicht WebService1. In diesem Fall ersetzen Sie WebService1 im vorstehenden Beispiel durch den Namen Ihrer Anwendung. 3. Drücken Sie die Taste EINGABE. Anmerkung: Wenn Sie die richtige Pfadangabe ermitteln müssen und mit IIS arbeiten, können Sie den Internetdienste-Manager im Modul Verwaltung der Windows XP-Systemsteuerung öffnen. Suchen Sie in der Liste der IIS-Websites nach dem Web-Service, den Sie gespeichert und compiliert haben. Überprüfen Sie dann den Namen der Website und den Namen der .asmx -Datei. Wenn Sie den korrekten Pfad eingegeben haben, werden daraufhin Informationen zu den Webmethoden angezeigt. 4. Klicken Sie auf den Link Service Description, um das WSDL-Dokument anzuzeigen. 5. Klicken Sie auf Referenz hinzufügen, um das WSDL-Dokument in die Client-Anwendung einzufügen. Der Ordner Web References wird in das Projektverzeichnis in der Projektverwaltung eingefügt. Er enthält die Datei WebService1.wsdl. Das Dialogfeld wird geschlossen. So erstellen Sie die Codebehind-Logik: 1. Fügen Sie dem Windows Form eine Button-Komponente hinzu. 2. Doppelklicken Sie auf die Button-Komponente, um die Quelltextdatei anzuzeigen. 3. Implementieren Sie für einen Delphi für .NET-Client im Quelltext-Editor folgende Behandlungsroutine für das Click-Ereignis: procedure TWinForm.Button1_Click(sender: System.Object; e: System.EventArgs); var ws: TWebService1; begin ws := TWebService1.Create; button1.Text := ws.HelloWorld(); end; Beim Hinzufügen der Webreferenz hat RAD Studio mit WSDL eine Proxy-Klasse erzeugt, die den "Hello World"-Web-Service repräsentiert. Das Click-Ereignis verwendet Methoden der Proxy-Klasse für den Zugriff auf den Web-Service. Für einen Delphi für .NET-Client muss eventuell der Unit-Name der Proxy-Klasse (z.B. localhost.WebService1) in die uses-Klausel der Windows Form-Unit aufgenommen werden, um Fehler beim Click-Ereignis zu verhindern. 4. Implementieren Sie für einen C#-Client im Quelltext-Editor folgende Behandlungsroutine für das Click-Ereignis: private void button1_Click(object sender, System.EventArgs e) { TWebService1 ws = new TWebService1(); button1.Text = ws.HelloWorld(); } 2 So führen Sie die Client-Anwendung aus: 1. Speichern Sie die Anwendung. 2. Compilieren Sie das Projekt, und führen Sie es aus. 3. Klicken Sie in der Client-Anwendung auf die hinzugefügte Schaltfläche. Der Titel "Hello World" wird auf der Schaltfläche angezeigt. Siehe auch Überblick zu den ASP.NET-Web-Services ( ASP.NET-Web-Services-Support ( see page 106) see page 110) ASP.NET-Web-Services-Anwendung "Hello World" erstellen ( 214 see page 222) 2.6 Web-Services-Anleitungen RAD Studio für .NET Webreferenzen in ASP.NET-Projekte 2.6.2 Webreferenzen in ASP.NET-Projekte einfügen Um einen Web-Service zu nutzen, müssen Sie eine Client-Anwendung erstellen und eine Webreferenz hinzufügen. In diesen Anleitungen wird die Erstellung einer ASP.NET-Client-Anwendung demonstriert, die einen Web-Service eines Fremdherstellers nutzt. Dabei handelt es sich um den Web-Service DeadOrAliveWS, der auf der XMethods-Website zur Verfügung steht. Mit Hilfe dieses Web-Service können Sie auf eine einfache Datenbank mit den Geburts- und Todestagen berühmter Persönlichkeiten zugreifen. So erstellen Sie ein ASP.NET-Projekt: 1. Wählen Sie Datei Neu Weitere. Das Dialogfeld Objektgalerie wird geöffnet. 2. Doppelklicken Sie in der Elementkategorie Delphi für .NET-Projekte auf das Symbol ASP.NET-Webanwendung. Das Dialogfeld Neue ASP.NET-Anwendung wird geöffnet. 3. Geben Sie in das Feld Name einen Namen für das Projekt ein. 4. Geben Sie in das Feld Speicherort den Verzeichnispfad des Projekts ein. Tip: Die meisten ASP.NET-Projekte befinden sich im IIS-Verzeichnis Inetpub\wwwroot . 5. Klicken Sie gegebenenfalls auf die Schaltfläche Serveropt. einblenden, um die Einstellungen für den Webserver zu ändern. Tip: Dieser Schritt ist optional. Normalerweise können die Standard-Serveroptionen verwendet werden. 6. Klicken Sie auf OK. Der Web Forms-Designer wird angezeigt. So entwerfen Sie die ASP.NET-Webseite: 1. Stellen Sie sicher, dass die Ansicht Design aktiv ist. 2. Ziehen Sie aus der Kategorie Web Controls der Tool-Palette eine Button-Komponente in die Designer-Oberfläche. Die Button-Komponente wird im Designer angezeigt. Stellen Sie sicher, dass sie ausgewählt ist. 3. Setzen Sie im Objektinspektor die Eigenschaft Text auf Dead or Alive?. 4. Ziehen Sie aus der Kategorie Web Controls der Tool-Palette eine TextBox-Komponente in den Designer, und platzieren Sie sie über der Button-Komponente. Hier wird die Abfrage für den Web-Service eingegeben. 5. Fügen Sie eine Label-Komponente unterhalb der Button-Komponente ein. Hier werden die Ergebnisse der Web-Service-Abfrage angezeigt. Lokalisieren Sie nun mit Hilfe des UDDI-Browsers den Web-Service DeadOrAlive im Internet. Dies ermöglicht Ihnen die Nutzung der von WSDL (Web Service Definition Language) veröffentlichten Methoden und Objekte. So fügen Sie die Webreferenz für DeadOrAliveWS hinzu: 1. Wählen Sie Projekt Webreferenz hinzufügen. 2. Klicken Sie im Web-Dialogfeld CodeGear UDDI Browser in der Liste der verfügbaren UDDI-Verzeichnisse auf den Link Vollständige XMethods. Eine Liste der auf der XMethods-Website veröffentlichten Web-Services wird angezeigt. 3. Suchen Sie nach dem Link DeadOrAliveWS, und klicken Sie darauf. Tip: Sie können für die Suche im CodeGear UDDI Browser die Tastenkombination STRG+F verwenden. 4. Klicken Sie auf den Link zur WSDL-Datei: http://www.abundanttech.com/webservices/deadoralive/deadoralive.wsdl 215 2 Webreferenzen in ASP.NET-Projekte RAD Studio für .NET 2.6 Web-Services-Anleitungen Ein WSDL-Dokument wird angezeigt. Dieses XML-Dokument beschreibt das Interface zum Web-Service DeadOrAliveWS. 5. Klicken Sie auf Referenz hinzufügen, um das WSDL-Dokument in die Client-Anwendung einzufügen. Der Ordner Web References mit dem Knoten com.abundanttech.www wird in der Projektverwaltung in das Projektverzeichnis eingefügt. So erstellen Sie die Anwendungslogik: 1. Stellen Sie sicher, dass die Ansicht Design aktiv ist. 2. Doppelklicken Sie auf die Schaltfläche Dead or Alive?, um die Codebehind-Datei anzuzeigen. 3. Implementieren Sie für eine Delphi für .NET-Web-Services-Anwendung im Quelltext-Editor folgende Behandlungsroutine für das Click-Ereignis: procedure TWebForm1.Button1_Click(sender: System.Object; e: System.EventArgs); var result: DataSet; ws: DeadOrAlive; currentTable: DataTable; currentRow: DataRow; currentCol: DataColumn; begin // Web-Service initialisieren ws := DeadOrAlive.Create; // Eingabe an den Web-Service senden result := ws.getDeadOrAlive(TextBox1.Text); // Ergebnisse analysieren und anzeigen Label1.Text := ''; for currentTable in result.Tables do begin Label1.Text := Label1.Text + '<p>' + #13#10; for currentRow in currentTable.Rows do begin for currentCol in currentTable.Columns do begin Label1.Text := Label1.Text + currentCol.ColumnName + ': '; Label1.Text := Label1.Text + (currentRow[currentCol]).ToString; Label1.Text := Label1.Text + '<br>' + #13#10; end; end; Label1.Text := Label1.Text + '</p>'; end; end; 2 Beim Hinzufügen der Webreferenz hat RAD Studio mit WSDL eine Proxy-Klasse erzeugt, die den "Hello World"-Web-Service repräsentiert. Das Click-Ereignis verwendet Methoden der Proxy-Klasse für den Zugriff auf den Web-Service. Für Delphi für .NET-Web-Services muss eventuell der Unit-Name der Proxy-Klasse (abundanttech.deadoralive) zur uses-Klausel der Web Form-Unit hinzugefügt werden, um Fehler beim Click-Ereignis zu verhindern. So führen Sie die Anwendung aus: 1. Wählen Sie Projekt Alle Projekte erzeugen. Das Projekt wird erstellt und befindet sich nun auf dem ASP.NET-Server. 2. Öffnen Sie einen Web-Browser. 3. Geben Sie den URL der .aspx-Datei Ihrer Webanwendung ein, und drücken Sie die EINGABETASTE. Tip: Bei Verwendung von Microsoft IIS ist der URL der Pfad der .aspx -Datei nach Inetpub\wwwroot. Ist beispielsweise c:\Inetpub\wwwroot\WebApplication1 der Pfad der Webanwendung und WebForm1.aspx der Name der .aspx-Datei, lautet der URL http://localhost/WebApplication1/WebForm1.aspx. 4. Geben Sie, falls erforderlich, Ihren Benutzernamen und das Passwort für den ASP.NET-Server ein. Die Webseite für Ihre 216 2.6 Web-Services-Anleitungen RAD Studio für .NET ASP.NET-Web-Services-Anwendung Webanwendung wird angezeigt. 5. Geben Sie den Namen einer berühmten Persönlichkeit (z.B. Isaac Asimov) in das Textfeld ein, und klicken Sie auf die Schaltfläche Dead or Alive?. Ihre Webanwendung fordert die Informationen vom Web-Service DeadOrAliveWS an und zeigt das Ergebnis als Beschriftung an. Anmerkung: Wird kein Ergebnis angezeigt, ist der eingegebene Name möglicherweise nicht in der Datenbank enthalten. Prüfen Sie, ob die Schreibweise korrekt war, oder versuchen Sie es mit einem anderen Namen. Siehe auch ASP.NET-Webanwendungen erstellen Überblick zu den ASP.NET-Web-Services ( see page 106) ASP.NET-Web-Services-Anwendung "Hello World" erstellen ( see page 222) Auf die ASP.NET-Web-Services-Anwendung "Hello World" zugreifen ( see page 218) TDataset 2.6.3 ASP.NET-Web-Services-Anwendung "Hello World" erstellen Wenn Sie eine Anwendung mit ASP.NET-Web-Services erstellen, können Sie über eine Internet-Verbindung der Client-Anwendung eine bestimmte Funktionalität bereitstellen. Die folgenden Schritte zeigen, wie eine einfache "Hello World"-Anwendung mit ASP.NET-Web-Services erstellt wird. Nach dem Build stellt die Anwendung alle in ihr definierten Objekte und Methoden über eine Webmethode zur Verfügung, die Sie definieren und auf die Sie über einen Web-Browser zugreifen. So erzeugen Sie eine einfache ASP.NET- Web-Services-Anwendung namens "Hello World": 1. Erstellen Sie eine ASP.NET-Web-Services-Anwendung. 2. Erzeugen Sie eine Webmethode. 3. Testen Sie die ASP.NET-Web-Services-Anwendung, und führen Sie sie aus. Anmerkung: Gegenwärtig können in RAD Studio nur mit dem Codebehind-Verfahren Web-Services erstellt werden. Sie können nicht mit Inlinecode arbeiten, d.h. Sie können in die Datei <ServiceName>.asmx keinen Quelltext für den Web-Service einfügen. Gegenwärtig wird die Inline-Methode zur Erstellung von Web-Services von RAD Studio nicht unterstützt. So erstellen Sie eine ASP.NET-Web-Services-Anwendung: 2 1. Wählen Sie Datei Neu Weitere. Das Dialogfeld Objektgalerie wird geöffnet. 2. Wählen Sie den Ordner ASP-Projekte für die von Ihnen verwendete Sprache. 3. Wählen Sie ASP.NET-Web-Service-Anwendung. Das Dialogfeld Anwendungsname wird geöffnet. 4. Geben Sie den Namen und die Verzeichnisposition der Anwendung in die Felder ein, und übernehmen Sie alle anderen Voreinstellungen. Anmerkung: Wenn Sie mit dem Cassini-Webserver arbeiten, müssen Sie die Angaben für Speicherort und Server ändern. Außerdem müssen Sie den Cassini-Webserver entsprechend konfigurieren, bevor Sie diese Anwendung ausführen. Wählen Sie Tools->Optionen , und markieren Sie ASP.NET-Optionen, um den Pfad und den Port für den Cassini-Webserver einzustellen. 5. Klicken Sie auf OK. Die Dateien WebService1.asmx und WebService1.asmx.<Dateityp> werden automatisch erstellt. 217 Web-Services-Client-Anwendung von RAD Studio für .NET 2.6 Web-Services-Anleitungen So erstellen Sie eine Webmethode: 1. Aktivieren Sie die Registerkarte WebService.pas oder WebService.asmx.cs am unteren Rand des Quelltext-Editors. Falls Sie der Web-Services-Anwendung einen anderen Namen als den vorgegebenen zugewiesen haben, dann wird dieser Name auf der Registerkarte angezeigt. Der Code für die "Hello World"-Anwendung ist bereits in der Webmethode enthalten, die während der Erstellung der Web-Services-Anwendung automatisch erzeugt wurde. 2. Kommentieren Sie die Beispiel-Webmethoden aus, die in der Codebehind-Datei enthalten sind. Bei Delphi für .NET-Anwendungen müssen zwei "Hello World"-Webmethoden auskommentiert werden: eine im Interface-Modul und eine im Implementation-Modul. 3. Wählen Sie Projekt <Projektname> erzeugen, um das Projekt zu compilieren. 4. Führen Sie das Projekt aus. Durch diesen Schritt wird der Browser mit dem Web-Service aufgerufen. Auf den angezeigten Seiten ist auch der SOAP- und HTTP-Code enthalten, den Sie zum Zugriff auf die Webmethoden verwenden können. Sie können diese Beispiele ausführen und beobachten, wie die Ergebnisse an eine XML-Ausgabedatei übertragen werden. So testen Sie den XML-Web-Service und führen ihn manuell aus: 1. Geben Sie in einem Web-Browser die Speicherposition der Datei WebService1.asmx im localhost ein: http://localhost/WebService1/WebService1.asmx Auf den angezeigten Seiten ist auch der SOAP- und HTTP-Code enthalten, den Sie zum Zugriff auf die Webmethoden verwenden können. Sie können diese Beispiele ausführen und beobachten, wie die Ergebnisse an eine XML-Ausgabedatei übertragen werden. Anmerkung: Möglicherweise müssen Sie eine etwas andere Syntax als in diesem Schritt angegeben verwenden. Bei manchen Windows XP-Rechnern muss beispielsweise für localhost der Computername angegeben werden. Wenn der Rechner z.B. den Computernamen MeinRechner hat, lautet die Syntax wie folgt: http://MeinRechner/WebService1/WebService1.asmx. 2. Testen Sie die beiden Methoden in einem Webbrowser. Siehe auch Überblick zu den ASP.NET-Web-Services ( ASP.NET-Web-Services-Support ( see page 106) see page 110) Auf die ASP.NET-Web-Services-Anwendung "Hello World" zugreifen ( see page 218) 2.6.4 Web-Services-Client-Anwendung von Delphi für Win32 nach Delphi für .NET portieren 2 Im Folgenden werden die Schritte beschrieben, die zum Portieren einer Web-Services-Client-Anwendung nach Delphi für .NET ausgeführt werden müssen. mit Delphi So portieren Sie einen Web-Service: 1. Ändern Sie die vorhandenen RIO-Formularkomponenten. 2. Ändern Sie die uses-Klausel. 3. Fügen Sie eine Webreferenz hinzu. 4. Ändern Sie den Quelltext, mit dem der Web-Service aufgerufen wird. So ändern Sie vorhandene Formularkomponenten: 1. Kopieren Sie den Webreferenz-URL aus der vorhandenen RIO-Komponente, und speichern Sie ihn. 218 für Win32 erstellten 2.6 Web-Services-Anleitungen RAD Studio für .NET Web-Services-Client-Anwendung von 2. Löschen Sie die HTTPRio-Komponente aus dem Formular, sofern sie nicht zur Laufzeit erstellt wird. So ändern Sie die uses-Klausel: 1. Löschen Sie alle Delphi für Win32-SOAP-Units aus der Klausel. Hierzu gehören InvokeRegistry, RIO und SOAPHTTPClient und möglicherweise noch andere Units. Warnung: Die vorstehende Unit-Liste ist nicht vollständig. Stellen Sie sicher, dass Sie alle SOAP-Units identifizieren, gleichgültig, welche Namenskonvention verwendet wurde. Sie werden feststellen, dass nicht alle Units das Wort SOAP im Namen enthalten. 2. Entfernen Sie den Verweis auf die von der Delphi für Win32-Importfunktion für WSDL-Dateien erzeugte Interface-Proxy-Unit. 3. Entfernen Sie die Proxy-Unit aus dem Projekt. So fügen Sie eine Webreferenz hinzu: 1. Öffnen Sie ein Delphi für Win32-Projekt in RAD Studio, und wählen Sie Projekt Webreferenz hinzufügen. Sobald Sie das Projekt gespeichert haben, wird der UDDI-Browser angezeigt. 2. Geben Sie in das Listenfeld am oberen Rand des Browsers den zu verwendenden URL ein, wobei es sich um einen Ihnen bekannten Dienst oder um den URL handeln kann, den Sie aus der RIO-Komponente kopiert und gespeichert haben. Anmerkung: Wenn Sie die WSDL-Datei auf der lokalen Festplatte Ihres Rechners suchen möchten, klicken Sie auf die Ellipsen-Schaltfläche neben dem Listenfeld und suchen nach dem Dokument. Sie können auch eine der im UDDI-Browser aufgeführten Web-Service-Sites auswählen, wenn Sie einen veröffentlichten Service benutzen möchten. 3. Klicken Sie auf die Schaltfläche Referenz hinzufügen, um das WSDL-Dokument dem Projekt hinzuzufügen. RAD Studio erstellt anhand des WSDL-Dokuments die erforderliche Webreferenz und die zugehörige Proxy-Unit. In der Projektverwaltung wird ein neuer Knoten namens Web References angezeigt. Erweitern Sie den Knoten, damit die zugehörigen WSDL- und die Proxy-Quelltextdateien angezeigt werden. 4. Wählen Sie Datei Unit verwenden. So ändern Sie den Quelltext, mit dem der Web-Service aufgerufen wird: 1. Machen Sie in der Quelltextdatei Ihrer Anwendung den Code ausfindig, mit dem der Web-Service aufgerufen wird. Angenommen, dieser Quelltext sieht folgendermaßen aus: procedure TForm1.Button1Click(Sender: TObject); var HelloService: Service3Soap; begin // Die nächste Zeile sieht etwas anders aus, wenn // Sie eine Komponente verwendet haben oder die Methode zur Laufzeit erstellt wird. // Wenn Sie eine Komponente verwendet haben, sieht der Code so aus. HelloService := (HTTPRIO1 as Service3Soap); 2 // So sieht der Code für eine zur Laufzeit erzeugte Methode aus. // GetService3Soap ist die globale Methode der Proxy-Unit. HelloService := GetService3Soap; Caption := HelloService.HelloWorld; end; 2. Ändern Sie den var-Abschnitt von seiner ursprünglichen Form: var // Typ des alten Proxy-Interface. HelloService: Service3Soap; in 219 Web-Services-Client-Anwendung von RAD Studio für .NET 2.6 Web-Services-Anleitungen var // Typ der neuen Proxy-Klasse. HelloService: Service3; Hier wird vorausgesetzt, dass Ihr Web-Service Service3 heißt. Ändern Sie den Namen entsprechend. Anmerkung: Sie werden feststellen, dass jetzt das als Klasse erstellt wird, was zuvor ein Interface war. Das .NET Framework stellt eine automatische Garbage Collection zur Verfügung, sodass bestimmte Beschränkungen, die in früheren Delphi-Versionen für die Verwendung von Klassen galten, möglicherweise beim Einsatz von RAD Studio nicht mehr gelten. 3. Ändern Sie die erste Zeile im Prozedurblock von seiner ursprünglichen Form: HelloService := (HTTPRIO1 as Service3Soap); in: HelloService := Service3.Create; Der aktualisierte Quelltext sollte wie folgt aussehen: procedure TForm1.Button1Click(Sender: TObject); var HelloService: Service3; begin HelloService := Service3.Create; Caption := HelloService.HelloWorld; end; Ihr Code ist wahrscheinlich etwas komplizierter als dieses Beispiel. Diese Anleitung beschreibt jedoch die grundlegenden Schritte, mit denen sich jede Delphi für Win32-Anwendung, die Web-Services nutzt, nach RAD Studio portieren lässt. Siehe auch Web-Services nach Delphi für .NET portieren ( Überblick zu Web-Services ( 2 220 see page 106) see page 80) 3 RAD Studio für .NET Index hinzufügen 204 Aktenkoffermodell-Anwendung AutoUpdateCache (Eigenschaft) 198 . .NET-Datentypen ADO.NET 12 .NET-Steuerelemente VCL und .NET-Steuerelemente 180 Aktenkoffermodell-Anwendung mit DB Web Controls erstellen 198 Aktionen in einer VCL-Formularanwendung erstellen 163 Ä .NET-Steuerelemente in VCL.NET importieren 180 Änderungen aufgrund der Unterstützung von 64-Bit .NET 2.0 63 A A Abgerundete Rechtecke in einer VCL-Formularanwendung zeichnen 177 Anleitung zum Hinzufügen eines Dialogfelds zur Fehlerbehebung zu einer BDP-Anwendung. 116 ADO.NET Anleitungen 113 Anweisungstext-Editor 137, 138 Anleitungen für die Modellierung 152 Architektur 15 Anweisungstext-Editor verwenden 137 ASP.NET 85 Anwendung mit DB Web Controls erstellen 199 Datenadapter-Vorschau 136 Anwendungen mit nicht verwaltetem Code entwickeln 41 Datenbankanwendungen 161 Anwendungen mit VCL.NET-Komponenten entwickeln 62 Namespace 15 Anwendungen mit XML-Komponenten erstellen 169 Überblick 15, 77 ASP.NET Übersicht 63 Architektur 85 Verbindungskomponenten 161 DB Web Controls 199 ADO.NET-Anwendungen 187 ADO.NET-Datenbankanwendungen mit VCL.NET-Formularen erstellen 161 ADO.NET-Komponentendesigner 23 AdoDbx BDP-Migration 18 AdoDbx.NET Übersicht 85 ASP.NET – Anleitungen 182 ASP.NET installieren erneut installieren 209 ASP.NET User Control ASP.NET 216 ASP.NET ASP.NET User Control 216 Datenprovider 28 ASP.NET User Controls verwenden 216 Datentypen 12 ASP.NET-Anwendung 186, 189, 191, 192, 193, 194 AdoDbx.NET-Datentypen 12 ASP.NET-Anwendung "Hello World" erstellen 193 AdoDbx.NET-Komponenten ASP.NET-Anwendung mit Datenbanksteuerelementen entwickeln, Teil 1 189 ADO 28 AdoDbx-Client Überblick 6 AdoDbx-Client-Verbindung herstellen 119 Aggregatwerte mit der DBWebAggregateControl-Komponente ASP.NET-Anwendung mit Datenbanksteuerelementen entwickeln, Teil 2 191 ASP.NET-Anwendung mit Datenbanksteuerelementen entwickeln, Teil 3 192 ASP.NET-Anwendungen debuggen und aktualisieren 205 ASP.NET-Anwendungen erstellen 186 a RAD Studio für .NET ASP.NET-Benutzerkonto Bitmaps Sicherheitslücken 209 ASP.NET-Datenbankanwendung erstellen 187 Kombinationsfeld 178 Blackfish SQL - Überblick 21 ASP.NET-Fehler HTTP-Meldungen 207 ASP.NET-Lebenszyklus C Callback-Funktionen ASP.NET-Verarbeitung 93 Funktionen 48 ASP.NET-Projekt 186, 193 ClearSessionChanges (Methode) 101 ASP.NET-Seite 186, 193 Client-Datenmenge ASP.NET-Web-Services-Anwendung "Hello World" erstellen 222 TClientDataSet 167 ASP.NET-Web-Services-Support 110 Codebehind-Logik 186, 193 Auf die ASP.NET-Web-Services-Anwendung "Hello World" zugreifen 218 Code-Visualisierung 58, 152, 154, 155 Diagramme exportieren 152 Auflösung mehrere Tabellen 132 Ausführen von Änderungen, die wegen der Unterstützung von 64-Bit .NET 2.0 erforderlich sind 171 Code-Visualisierung - Überblick 58 Code-Visualisierungsdiagramme als Grafik exportieren 152 COM Interop 41, 150 Interop-Assemblierungen in der IDE 41 AutoUpdateCache SDK-Tools 41 UseUniqueFileName 198 Terminologie 41 B COM Interop in verwalteten Anwendungen 41 BDE.NET COM-Interfaces Interfaces 48 Datenbanken 7 BDP-Migration 18 BDP-Migration: Überblick 18 D Beispiele DataHub (Komponente) ASP.NET-Anwendung &quot;Hello World&quot; 193 Benutzerauthentifizierung UseUniqueFileName 208 Benutzeroberflächen ADO.NET 15 konfigurieren 132 DataSet Tabellenzuordnungen 120 DataSnap .NET-Client Datenbanken 7 Berechtigungen für die Nutzung von XML-Dateien festlegen 208 DataSync (Komponente) Berichte für .NET-Anwendungen entwickeln 60 Bindung Komponenten 211 Bitmap-Grafik in ein Steuerelement einer VCL-Formularanwendung einfügen 178 Bitmap-Grafik in einer VCL-Formularanwendung anzeigen 175 Bitmap-Grafiken 178 Bitmap-Grafiken anzeigen 175 b konfigurieren 132 DataView-Einschränkungen Datensätze einfügen 101 DataView-Objekte Laufzeiteigenschaften 101 Daten migrieren 124 Remoting-Komponenten 147 3 3 RAD Studio für .NET Daten zwischen Datenbanken migrieren 124 Datenadapter-Vorschau verwenden 136 Datenbank Datenadapter-Vorschau verwenden 136 Datenprovider Architektur 28 Datenprovider für .NET (AdoDbx) ADO.NET 28 Datenmengen-Designer verwenden 143 Datenprovider für Microsoft .NET 28 Fehlerbehebung hinzufügen 116 Datentypen neue Verbindung hinzufügen 116 Projekte erstellen 132 Datenbank durchsuchen 118 Datenbank im Daten-Explorer durchsuchen 118 ADO.NET 28 DB Web Control-Experte benutzerdefinierte Controls 93 DB Web Controls Datenbankanleitungen 114 Architektur 88 Datenbankanwendungen mit ADO.NET entwickeln 3 ASP.NET 88 Datenbanken Bibliothek 211 Anweisungstext-Editor 137 erweitern 93 DataAdapter-Designer 138 konfigurieren 199 DataSet-Designer 140 Namespace 88 dbExpress 32, 34 Projekte vorbereiten 199 dbExpress für .NET 10 WebDataLink-Interfaces 103 dbGo für .NET 11 DB Web Controls in Haupt-/Detail-Anwendungen verwenden 90 neue Verbindung hinzufügen 139 DB Web-Interfaces 93 Objekte suchen 118 DB2 Projekte erstellen 120, 147 AdoDbx.NET 12 SQL ausführen 122 dbExpress Framework-Kompatibilität 34 Verbindungen 126 dbExpress.NET Verbindungen bearbeiten 125 Datenbankkomponenten konfigurieren 120 Datenbank-Projekte mit dem Daten-Explorer erstellen 120 Datenbankverbindungen bearbeiten 126 Datenbindung DB Web Control 93 Daten-Explorer Definition 23 ISQLDataSource 23 SQL ausführen 122 Verbindungen bearbeiten 125 Datengitter verbinden 161 Datenmenge XML-Dateien 203 Datenbanken 7 dbExpress.NET-Datenbankanwendungen mit VCL-Formularen erstellen 167 dbExpress-Framework 32 dbGo Datenbanken 7 DBWebAggregateControl Aggregatwerte 204 DBWebDataSource konfigurieren 199 Delphi für .NET Web Forms 85 Den ASP.NET-Deploymentmanager verwenden 212 Den DB Web Control-Experten verwenden 211 Deployment ASP.NET-Deploymentmanager 206, 212 c RAD Studio für .NET BDE-Anwendungen für .NET 27 BDP.NET-Anwendungen 27 COM Interop-Anwendungen 47 Datenbankanwendungen 27 H Haupt Detail-Beziehungen/DataView-Objekte 101 DB Web Controls 88 dbExpress-Anwendungen für .NET 27 Herstellen einer Verbindung zu einer Datenbank mit dem dbExpress Treiber-Framework 145 dbGo-Anwendungen für .NET 27 Hinzufügen einer J2EE-Referenz 150 Deployment einer ASP.NET-Anwendung mit Blackfish SQL an ein System ohne RAD Studio 206 Deployment von ASP.NET-Anwendungen 102 HTML-Elemente in Server Controls konvertieren 200 HTML-Tag-Editor HTML-Tags bearbeiten 215 Deployment von COM Interop-Anwendungen 47 Deployment von Datenbankanwendungen für das .NET Framework 27 Designer für Datenadapter verwenden 138 HTTP Meldungen 209 HTTP-Meldungen Fehler 207 DrInterop verwenden 46 HTTP-Meldungen in ASP.NET erzeugen 207 E ECO-Framework 153 Eine Datenbankanwendung für die Auflösung in mehrere Tabellen erstellen 132 Eine neue VCL.NET-Komponente erstellen 174 I IBX.NET InterBase 7 IDBWebColumnLink Eine verteilte Datenbankanwendung erstellen 147 IDBWebDataLink 103 Einführung in InterBase Express 35 Ereignisbehandlungsroutinen OnPaint 176, 177 IDBWebLookupColumnLink 103 IDBWebDataLink 103 IIS erstellen Anwendungen mit XML-Komponenten 169 Fehlerbehebung 209 VCL-Formularanwendung &quot;Hello World&quot; 165 Importieren und Exportieren eines Modells mit XMI Metadata Interchange (XMI) 153 VCL-Formularmenüs 166 Interbase Verbindungen 126 Erstellen einer ASP.NET Sitemap 194 InterBase F ADO.NET 12 Komponenten 35 Fehler in Tabellenzuordnungen behandeln 123 Fehlerbehebung in ASP.NET-Anwendungen 209 Interfaces AdoDbx.NET 28 G Interfaces für virtuelle Bibliotheken 56 Interoperative Anwendungen – Anleitungen 150 Gerade Linien in einer VCL-Formularanwendung zeichnen 177 K Kombinationsfeldereignisse d 3 3 RAD Studio für .NET OnDrawItem 178 migrieren Komponenten datensensitive 88 Tabellen 124 MissingMappingAction (Eigenschaft) importieren 77 Verbindung 88 Fehler 123 MissingSchemaAction (Eigenschaft) Komponentendesigner Fehler 123 Anweisungstext-Editor 23 Mit DataView-Objekten arbeiten 101 Beziehungen 23 Mit dem Aktionsmanager Aktionen in einer VCL-Formularanwendung erstellen 166 Datenadapter konfigurieren 23 Datenmenge 23 Stored Procedures (Dialogfeld) 23 Verbindungseditor 23 Mit dem HTML-Tag-Editor arbeiten 215 Modellierung 58 MS SQL ADO.NET 12 konfigurieren Datenkomponenten 187 IIS 161, 186 N Verbindungskomponenten 187 Neue Funktionen der Programmiersprache 75 Web-Server 187, 193 Neue Verbindung in Daten-Explorer einfügen 116 Konstruktoren Nicht verwaltete Funktionen Win32 API 48 Destruktoren 64 Konzepte 1 Nullwerte in Aggregaten Caption (Eigenschaft) 204 L Logische Datentypen AdoDbx.NET 12 O Objektreferenzen Referenzen übergeben 48 M Oracle ADO.NET 12 Mehrstufige Aktualisierungen Datenbanken 90 Mehrstufige Löschvorgänge Datenbanken 90 Menüs P Parameter Datenbanken 134 Aktionen 163 Parameterübergabe in einer Datenbankanwendung 134 Beispielanwendung 163 Pascal Standardaktionen 163 VCL-Formulare 163 Metadaten Änderungen der Programmiersprache 75 PInvoke Platform Invoke 48 XML-Schemadateien 203 Platform Invoke mit Delphi für .NET verwenden 48 Zuordnung zu Datenmengen 203 Polygone Metadaten für eine Datenmenge erstellen 203 zeichnen 177 e RAD Studio für .NET Portieren Tabellenzuordnungen VCL.NET portieren 77 Fehler 123 Portieren von VCL-Anwendungen nach RAD Studio 64 konfigurieren 120 Property Builder Löschen 120 DB Web Controls 207 Protokoll-Stack von Web-Services 108 Tabellenzuordnungen erstellen 120 Tag-Editor 215 TDataSetProvider R dbExpress-Provider 167 Rave Reports 60 TDataSource dbExpress-Datenquelle 167 neue Berichte erstellen 60 Rave Reports in RAD Studio verwenden 60 TDBGrid dbExpress-Verbindung 167 Rechtecke und Ellipsen in einer VCL-Formularanwendung zeichnen 176 Text löschen 166 Referenzen zu einem COM-Server hinzufügen 150 Typisierte Datenmengen verwenden 143 Render (Methode) Typumwandlungen Seite aufbauen 93 Cracker 64 Ressourcen Migration 64 Ü Überblick über AdoDbx Client 6 S Überblick zu ADO.NET 15 senden Befehle 187 ServerSupport ASP.NET 85 Überblick zu ASP.NET 85 Überblick zu CodeGear DB Web Controls 88 Überblick zu dbExpress-Komponenten 10 Überblick zu dbGo-Komponenten 11 Spalten in DBWebGrid-Objekten binden 207 Überblick zu den ASP.NET-Web-Services 106 SQL im Daten-Explorer ausführen 122 Überblick zu Stored Procedures 31 Standarddatenmengen verwenden 140 Überblick zu VCL für .NET 77 Stored Procedures Überblick zum BDP-Verbindungs-Pooling 9 Überblick 31 String Überblick zum DB Web Control-Experten 93 Überblick zur Navigations-API der DB Web Controls 92 char 64 Strukturen Zeiger 48 Sybase ADO.NET 12 unidirektionale Datenmengen TSQLDataSet 167 Unidirektionale Datenmengen dbExpress-Komponenten 167 T untergeordnete Knoten anzeigen 169 Tabellen Zuordnungen 120 f U 3 3 RAD Studio für .NET DataBind 187 DataGrid 187 V Datenquelle 187 Varianten Verbindungen TVarRec 64 Datenbankverbindungen 126 VCL MS Access-Verbindung 126 portieren 75 MS SQL Server-Verbindung 126 VCL für .NET Grafiken 175 VCL für .NET – Anleitungen 157 VCL für .NET-Datenbanktechnologien 7 VCL und .NET-Steuerelemente .NET-Steuerelement-Package 180 VCL.NET Sybase-Verbindung 126 Verbindungen im Daten-Explorer bearbeiten 125 Verbindungseditor verwenden 139 Verwenden des Modellansichtfensters und des Code-Visualisierungsdiagramms 154 Verwenden des Übersichtsfensters 155 Virtuelle Verzeichnisse erstellen 204 Architektur 77 Virtuelles Verzeichnis, erstellen in der IDE 204 Namespace 77 Vorfahr portieren 64 Basis 174 VCL.NET-Komponenten VCL.NET 77 VCL-Anwendungen Client-Datenmengen 161 DataSet-Provider 161 Datenquellen 161 dbExpress-Datenbankanwendungen 167 Ereignisse 163 Formulare 163 Grafiken 161 Windows Forms-Projekt 163 VCL-Anwendungen portieren 75 VCL-Formularanwendung "Hello World" erstellen 165 VCL-Formularanwendung erstellen 163 VCL-Formularanwendungen mit Grafiken erstellen 161 VCL-Formulare Beispielanwendung ausführen 165 Bitmap-Grafiken 178 Menüs 163 neue erstellen 165 Schaltflächen- und Ereignisquelltext hinzufügen 165 Verbinden mit AdoDbx Client 119 W Webanwendungen mit ASP.NET entwickeln 83 WebDataLink-Interfaces verwenden 103 Webreferenzen 220 Webreferenzen in ASP.NET-Projekte einfügen 220 Web-Service-Clients portieren 75 Web-Service-Clients portieren 80 Web-Services Anwendung erstellen 222 Anwendungen portieren 80 Architektur 106 ASP.NET 85, 106 Client 218 Client-Anwendung erstellen 218 Client-Support 110 Dateien 106 finden 108 Namespaces 110 portieren 80, 223 Protokoll 108 Verbindung einrichten g RAD Studio für .NET Server-Support 110 Service-Beschreibung 108 Service-Transport 108 Szenarien 106 UDDI-Browser 220 Voraussetzungen 106 Webreferenzen 220 Web-Services-Anwendung zugreifen auf 218 Web-Services-Formulare portieren 80 Win32 zu .NET portieren 223 XML-Messaging 108 Zugriff 220 Web-Services mit ASP.NET entwickeln 105 Web-Services-Anleitungen 218 Web-Services-Client-Anwendung von Delphi für Win32 nach Delphi für .NET portieren 223 Win32 API nicht verwalteter Code 64 WinForms Control-Importexperte .NET-Steuerelemente in VCL 180 X XML DB Web Controls 201 XML-Authentifizierung XML-Zwischenspeicherung 99 XML-Datei für DB Web Controls erstellen 201 XML-Datei-Berechtigungen Berechtigungen 208 XML-Dateien DB Web-Datenquellen 99 DBWeb-XML-Dateien 201 Vorteile 99 XML-Dateien und DB Web Controls verwenden 99 Z zeichnen gerade Linien 177 Rechtecke und Ellipsen 176 h Zeigertypen portieren 64 3