Willkommen bei ADO

Mit Microsoft® ActiveX® Data Objects (ADO) können Ihre Clientanwendungen über einen OLE DB-Provider auf Daten auf einem Datenbankserver zugreifen und diese bearbeiten.

ADO Programmer's Reference

ADO unterstützt wichtige Funktionen zum Erstellen von Client/Server-Anwendungen und webbasierten Anwendungen. Die wichtigsten Vorteile sind einfache Bedienung, Schnelligkeit sowie der geringe Bedarf an Arbeitsspeicher und Speicherplatz. ADO bietet auch Remote Data Service (RDS), wodurch es möglich ist, Daten von einem Server in eine Clientanwendung oder auf eine Webseite zu verschieben, die Daten auf dem Client zu bearbeiten und die aktualisierten Daten im gleichen Arbeitsgang wieder auf den Server zu übertragen.

Weitere Informationen zu ADO finden Sie in der ADO Programmer's Reference.

ADOX Programmer's Reference

ActiveX Data Objects Extensions for Data Definition Language and Security (ADOX) stellt eine Erweiterung von ADO dar und stellt Objekte bereit, um Schemaobjekte zu erstellen, zu bearbeiten und zu löschen, wie beispielsweise Tabellen und Prozeduren. Außerdem enthält es Sicherheitsobjekte zum Verwalten von Benutzern und Gruppen sowie zum Erteilen und Widerrufen von Berechtigungen für Objekte.

Weitere Informationen zu ADOX finden Sie in der ADOX Programmer's Reference.

ADO MD Programmer's Reference

ActiveX Data Objects (Multidimensional) (ADO MD) erweitert ADO auf für multidimensionale Daten spezifischer Objekte und ermöglicht Ihnen das Durchsuchen multidimensionaler Schemas, das Abfragen eines Cubes und das Abrufen der Ergebnisse.

Weitere Informationen zu ADO MD finden Sie in der ADO MD Programmer's Reference.

Weitere Informationen

Weitere Informationen zum Microsoft Data Access Components SDK finden Sie in der MDAC SDK-Übersicht im Plattform-SDK.


Microsoft ADO Programmer's Reference

Mit Microsoft® ActiveX® Data Objects (ADO) können Sie eine Anwendung schreiben, mit deren Hilfe Sie über einen OLE DB-Provider auf Daten auf einem Datenbankserver zugreifen und diese bearbeiten können. Die wichtigsten Vorteile sind einfache Bedienung, Schnelligkeit sowie der geringe Bedarf an Arbeitsspeicher und Speicherplatz. ADO unterstützt wichtige Funktionen zum Erstellen von Client/Server-Anwendungen und webbasierten Anwendungen.

ADO bietet auch Remote Data Service (RDS), wodurch es möglich ist, Daten von einem Server in eine Clientanwendung oder auf eine Webseite zu verschieben, die Daten auf dem Client zu bearbeiten und die aktualisierten Daten im gleichen Arbeitsgang wieder auf den Server zu übertragen. RDS, zuvor als Microsoft Remote Data Service 1.5 herausgegeben, wurde mit dem ADO-Programmiermodell kombiniert, um die clientbasierte Remotebearbeitung von Daten zu vereinfachen.

Weitere Informationen über ADO und die Integration von RDS finden Sie unter Erste Schritte mit ADO.


Neue Features in ADO 2.5

In der Version ADO 2.5 sind die folgenden neuen Features, neuen Hilfethemen und die neue und verbesserte Dokumentation enthalten.

Neue Features

Datensätze und Datenströme

Diese ADO-Version stellt das Record–Objekt vor, das Objekte wie z. B. Verzeichnisse und Dateien in einem Dateisystem bzw. Ordner und Mitteilungen in einem e-Mailsystem darstellen und verwalten kann. Ein Record-Objekt kann auch als Zeile in einem Recordset-Objekt dargestellt werden, obwohl Record- und Recordset-Objekte verschiedene Methoden und Eigenschaften besitzen.

Das neue Stream-Objekt bietet die Möglichkeit zum Lesen, Schreiben und Verwalten des binären Datenstroms von Bytes oder Text, aus denen eine Datei oder eine Nachricht besteht.

Verwendung von URL

Diese Version stellt auch die Verwendung von Uniform Resource Locators (URL) als eine Alternative zu Verbindungszeichenfolgen und Befehlstext vor, um Datenspeicherobjekte zu benennen. URLs können mit vorhandenen Connection–und Recordset-Objekten sowie mit den neuen Record- und Stream-Objekten verwendet werden.

ADO unterstützt mit dieser Version OLE DB-Provider, die ihre eigenen URL-Schemas erkennen. Der OLE DB-Provider für Internet Publishing beispielsweise, der auf Dateisysteme von Windows 2000 zugreift, erkennt ein vorhandenes HTTP-Schema.

Spezielle Felder für Dokumentenquellenprovider

Eine besondere Klasse von Providern, Dokumentenquellenprovider genannt, die Ordner und Dokumente verwalten. Wenn ein Record-Objekt ein Dokument oder ein Recordset-Objekt einen Ordner eines Dokuments darstellt, füllt der Dokumentenquellenprovider diese Objekte mit einer eindeutigen Gruppe von Feldern auf, die Merkmale des Dokuments beschreiben. Die Felder bilden eine Ressource des Record- oder Recordset-Objekts.

Neue Hilfethemen

Die folgenden neuen Eigenschaften sind in dieser Version enthalten.

Eigenschaft | Beschreibung
Charset | Zeigt den Zeichensatz an, in den die Inhalte des Stream-Textobjekts übertragen werden sollen.
EOS | Zeigt an, ob die aktuelle Position am Ende des Datenstroms ist.
LineSeparator | Zeigt das binäre Zeichen an, das als Zeilentrennzeichen in Stream–Textobjekten verwendet wird.
Mode | Zeigt die verfügbaren Berechtigungen zur Änderung von Daten in einem Connection-, Record- oder Stream–Objekt an.
ParentURL | Zeigt eine absolute URL-Zeichenfolge an, die auf das übergeordnete Record–Objekt des aktuellen Record-Objekts zeigt.
Position | Zeigt die aktuelle Position innerhalb eines Stream–Objekts an.
RecordType | Zeigt den Typ des Record-Objekts an.
Size | Zeigt die Größe eines Datenstroms als Byteanzahl an.
Source | Zeigt die Einheit an, die durch dieses Record–Objekt dargestellt wird.
State | Zeigt für alle anwendbaren Objekte an, ob der Status des Objekts geöffnet oder geschlossen ist. Zeigt für alle anwendbaren Objekte, die eine asynchrone Methode ausführen, ob der aktuelle Status des Objekts verbindend, ausführend oder abrufend ist.
Type | Zeigt den Datentyp an, der im Stream–Objekt enthalten ist (binär oder Text)

Die folgenden neuen Methoden sind in dieser Version enthalten.

Methode | Beschreibung
CopyRecord | Kopiert eine Datei oder ein Verzeichnis und die Inhalte zu einem anderen Speicherplatz.
CopyTo | Kopiert eine angegebene Anzahl von Zeichen oder Bytes eines Stream-Objekts (von der Type-Eigenschaft abhängig) in ein anderes Stream-Objekt.
DeleteRecord | Löscht eine Datei oder ein Verzeichnis und alle seine Unterverzeichnisse.
Flush | Veranlasst den Inhalt des Stream-Objekts, im ADO-Puffer eines zugrunde liegenden Objekts zu verbleiben, mit dem das Stream-Objekt verbunden ist
GetChildren | Gibt ein Recordset–Objekt zurück, dessen Zeilen die Dateien und Unterverzeichnisse im Verzeichnis darstellen, das durch dieses Record–Objekt dargestellt wird.
LoadFromFile | Lädt den Inhalt einer vorhandenen Datei in ein Stream-Objekt.
MoveRecord | Verschiebt eine Datei oder ein Verzeichnis und die Inhalte an einen anderen Speicherplatz.
Open | Öffnet ein vorhandenes Record-Objekt oder erstellt eine neue Datei oder ein Verzeichnis.
Open | Öffnet ein Stream-Objekt, um Datenströme binärer oder Textdaten zu verändern.
Read | Liest eine bestimmt Anzahl an Byte aus einem binären Stream-Objekt.
ReadText | Liest eine bestimmt Anzahl an Zeichen aus einem Text eines Stream-Objekts.
SaveToFile | Speichert den binären Inhalt eines Stream-Objekts in eine Datei.
SetEOS | Legt die Position fest, die das Ende des Datenstroms darstellt.
SkipLine | Überspringt eine vollständige Linie, wenn ein Text des Stream-Objekts gelesen wird.
Write | Schreibt binäre Daten in ein Stream-Objekt.
WriteText | Schreibt eine bestimmte Textzeichenfolge in ein Stream-Objekt.

Neue und verbesserte Dokumentation

Hilfethemen zum Codebeispiel

Die Beispiele wurden erweitert, so dass jetzt Codebeispiele, die in Microsoft Visual C++® und in Microsoft Visual J++® geschrieben wurden, enthalten sind. Sie können diese Codebeispiele kopieren und in den Editor einfügen.

Hilfethemen zum Provider

Es ist ein neues Thema enthalten, das beschreibt, wie ADO mit dem OLE DB-Provider für Internet Publishing verwendet wird.

Programmieren mit ADO

Dieser neue Abschnitt beinhaltet Tipps und Tricks für die Verwendung von ADO mit verschiedenen Programmiersprachen. Er beinhaltet die vorhandenen Syntaxindizes für die Erweiterungen in Visual C++ für ADO und ADO/WFC sowie neue Informationen speziell für Entwickler, die Microsoft Visual Basic®, Microsoft Visual Basic® Scripting Edition, Microsoft JScript®, Microsoft Visual C++ oder Microsoft Visual J++ verwenden.


Erste Schritte mit ADO

Dieser Abschnitt informiert über ADO und RDS (Remote Data Service), Übungen, die unter Verwendung der ADO- und RDS-Programmiermodelle eine Datenquelle abfragen und aktualisieren sowie Situationen unter Verwendung von ADO und RDS. Erste Schritte mit ADO finden Sie in folgenden Abschnitten:

  • Übersicht über ADO

  • Übersicht über RDS

Die ADO-Dokumentation beinhaltet auch die folgenden Abschnitte, die Ihnen helfen, ADO zu lernen und zu verwenden:

  • ADO-Features Beschreibt wichtige Funktionen von ADO und wie Sie diese in Ihren Anwendungen verwenden.

  • ADO-API-Referenz Beschreibt detailliert jedes Objekt, Ereignis, jede Auflistung, Eigenschaft, Methode und Aufzählungskonstante in ADO genauso wie Fehlerinformationen.

  • Programmieren mit ADO Beschreibt Tipps und Tricks zur Verwendung von ADO in verschiedenen Entwicklungssprachen; einschließlich Syntaxindizes für die Visual C++-Erweiterungen zu ADO, Visual C++ mit COM und Visual J++ (ADO/WFC).

  • ADO-Beispiele Bietet Codebeispiele für die ADO-Eigenschaften und -Methoden in Visual Basic, C++, Java und VBScript sowie Beispielanwendungen, die praktische ADO- und RDS-Verwendungsmöglichkeiten zeigen.

  • Verwenden von Providern mit ADO Beschreibt, wie ADO mit einer Vielzahl von OLE DB-Daten- und Serviceprovidern verwendet wird.

  • ADO-Glossar Definiert Begriffe, speziell für Datenzugriffsprogrammierung.

  • Technische Artikel Beinhaltet Informationen über technische Fragen. Dieser Abschnitt beinhaltet technische Artikel in einer Vielzahl von Themen, ein Teil des MDAC SDK.


Übersicht über ADO

Dieser Abschnitt enthält eine Reihe von Themen, die Sie in der vorgegebenen Reihenfolge durchgehen können. Folgende Themen werden erläutert:

  • Lösungen für lokalen Datenzugriff

  • Das zugrunde liegende ADO-Programmiermodell

  • Das ADO-Programmiermodell im Detail

  • Das ADO-Programmiermodell mit Objekten

  • Das ADO-Objektmodell - Zusammenfassung

Dieser Abschnitt beinhaltet auch die Übungen zu ADO, mit denen gezeigt wird, wie Sie eine Datenquelle abfragen und aktualisieren können.

Weiter Lösungen für lokalen Datenzugriff


Lösungen für lokalen Datenzugriff

Die Frage

Sie möchten eine einfache, konsistente Schnittstelle für Anwendungsprogrammierung (application programming interface = API), die Anwendungen ermöglicht, auf eine große Anzahl von Datenquellen zugreifen und diese verändern zu können. Eine Datenquelle kann aus einer einfachen Textdatei bestehen, aus einer komplexen Gruppe verschiedenartiger Datenbanken oder aus einer anderen Struktur, die erst noch erfunden wird. Darüber hinaus sollte die API die Mittel zum Zugriff auf die Datenquelle und die Bearbeitung derselben nicht voraussetzen.

Obwohl Ihre besonderen Bedürfnisse wie oben beschrieben aussehen, handelt es sich bei der Datenquelle in der Regel um eine relationale Datenbank, die den ODBC-Standard (Open Database Connectivity-Standard) unterstützt und mit Befehlen verändert wird, die in SQL (Structured Query Language) geschrieben sind.

Als allgemeine Lösung zu diesem Problem bietet Microsoft OLE DB an, eine Reihe von COM-Schnittstellen (Component Object Model-Schnittstellen), über die Sie gleichermaßen auf Daten in verschiedenen Informationsquellen zugreifen können. Da die OLE DB-API entwickelt wurde, eine optimale Funktionalität bei einer großen Anzahl von Anwendungen zu bieten, erfüllt sie den Anspruch der Einfachheit nicht.

Sie benötigen eine API, die als Brücke zwischen der Anwendung und OLE DB funktioniert. ADO (ActiveX Data Objects) ist eine solche Brücke.

Die Lösung

ADO definiert ein Programmiermodell - eine Folge von Aktivitäten, die für den Zugriff auf eine Datenquelle und für ihre Aktualisierung erforderlich ist. Das Programmiermodell fasst die gesamte Funktionalität von ADO zusammen.

Das Programmiermodell setzt ein Objektmodell voraus - eine Reihe von Objekten, die dem Programmiermodell entsprechen und es implementieren. Objekte besitzen Methoden, die eine Operation an Daten durchführen, und Eigenschaften, die entweder ein Attribut der Daten darstellen oder das Verhalten einer Objektmethode kontrollieren.

Mit den Objekten sind Ereignisse verbunden, die darüber informieren, dass eine Operation stattgefunden hat oder ansteht.

Weiter Das zugrunde liegende ADO-Programmiermodell


Das zugrunde liegende ADO-Programmiermodell

ADO stellt die Mittel zur Verfügung, damit Sie die folgenden Aktionen nacheinander durchführen können:

  • Herstellen einer Verbindung zu einer Datenquelle. Optional können Sie sicherstellen, dass alle Änderungen an der Datenquelle entweder erfolgreich oder gar nicht stattfinden.

  • Angeben eines Befehls, um auf die Datenquelle zuzugreifen, optional mit variablen Parametern oder optimiert zur Steigerung der Leistung.

  • Ausführen des Befehls.

  • Wenn durch den Befehl Daten in Form von Zeilen in einer Tabelle zurückgegeben werden, können Sie die Zeilen in einem Zwischenspeicher speichern, den Sie auf einfache Weise überprüfen, bearbeiten oder verändern können.

  • Gegebenenfalls Aktualisieren der Datenquelle mit Änderungen aus dem Zwischenspeicher.

  • Verfügbarkeit allgemeiner Mittel zur Fehlersuche (in der Regel als Folge der Herstellung einer Verbindung oder der Ausführung eines Befehls).

In der Regel werden alle diese Schritte mit dem beschriebenen Programmiermodell abgedeckt. Wir möchten jedoch darauf hinweisen, dass ADO so flexibel ist, dass es auch nützlich sein kann, Arbeiten nur zum Teil innerhalb des Modells durchzuführen. Sie können z. B. Daten aus einer Datei direkt in den Zwischenspeicher der Zeilen speichern und dann die ADO-Ressourcen verwenden, nur um die Daten zu überprüfen.

Weiter Das ADO-Programmiermodell im Detail


Das ADO-Programmiermodell im Detail

Die folgenden Elemente sind Schlüsselelemente des ADO-Programmiermodells:

  • Verbindung

  • Befehl

  • Parameter

  • Recordset

  • Feld

  • Fehler

  • Eigenschaft

  • Datensatz

  • Datenstrom

  • Auflistung

  • Ereignis

Verbindung

Sie erreichen den Zugriff aus der Anwendung auf die Datenquelle über eine Verbindung - die Umgebung, die zum Austausch von Daten erforderlich ist. Die Anwendung kann direkt auf die Datenquelle zugreifen (dies wird auch Zwei-Ebenen-System genannt) oder indirekt (dies wird auch Drei-Ebenen-System genannt) über einen Vermittler wie Microsoft Internet-Informationsdienste (Internet Information Services, IIS).

Das Objektmodell verkörpert das Konzept einer Verbindung mit dem Connection-Objekt.

Eine Transaktion gibt den Anfang und das Ende einer Reihe von Datenzugriffsoperationen an, die in einer Verbindung vorkommen. ADO stellt sicher, dass Änderungen an Datenquellen, die aus Operationen in einer Transaktion resultieren, entweder alle erfolgreich oder gar nicht abgeschlossen werden.

Wenn Sie die Transaktion abbrechen oder wenn eine Operation fehlschlägt, sieht das Endergebnis so aus, als ob keine der Operationen in der Transaktion stattgefunden hätte. Die Datenquelle ist verglichen mit ihrem Zustand zu Beginn der Transaktion unverändert.

Das Objektmodell setzt das Konzept einer Transaktion nicht direkt um, aber es stellt die Transaktion in einer Reihe von Connection-Objektmethoden dar.

ADO greift auf Daten und Dienste von OLE DB-Providern zu. Das Connection-Objekt wird verwendet, um einen bestimmten Provider und Parameter anzugeben. So kann beispielsweise RDS (Remote Data Service) explizit aufgerufen werden, oder implizit mit dem Microsoft OLE DB Remoting Provider. (Im Schritt 2 der Übungen zu RDS finden Sie ein Beispiel für das Aufrufen von RDS mit dem OLE DB Remoting Provider.)

Die Datenquelle, die das Ziel einer Verbindung ist, kann mit einer Verbindungszeichenfolge oder einem Uniform Resource Locator (URL) angegeben werden.

Befehl

Durch einen Befehl, der in einer aufgebauten Verbindung ausgegeben wird, wird die Datenquelle bearbeitet. In der Regel fügt der Befehl Daten in die Datenquelle ein, löscht oder aktualisiert sie oder ruft Daten in Form von Zeilen in eine Tabelle ab.

Das Objektmodell setzt das Konzept eines Befehls mit dem Command-Objekt um. Durch das Vorhandensein eines Command-Objekts kann ADO die Ausführung des Befehls optimieren.

Parameter

In vielen Fällen benötigen Befehle variable Teile, Parameter, die vor Ausgabe eines Befehls verändert werden können. Sie können einen Datenabrufbefehl z. B. mehrmals wiederholen, wobei die Angaben zu den abzurufenden Daten jedes Mal unterschiedlich sind.

Parameter sind besonders zum Ausführen von Befehlen nützlich, die sich wie Funktionen verhalten. In diesem Fall wissen Sie, was der Befehl tut, aber nicht unbedingt, wie er funktioniert. Sie geben z. B. einen Befehl für eine Banküberweisung aus, durch den ein Konto belastet wird und auf einem anderen Konto eine Gutschrift erfolgt. Sie geben den zu überweisenden Betrag als Parameter an.

Das Objektmodell setzt das Konzept eines Parameters mit dem Parameter-Objekt um.

Recordset

Handelt es sich bei dem Befehl um eine Abfrage, die Daten als mit Informationen gefüllte Zeilen in einer Tabelle zurückgibt (d. h. die Abfrage gibt Zeilen zurück), werden diese Zeilen in einem lokalen Speicher platziert.

Das Objektmodell setzt diesen Speicher als Recordset-Objekt um.

Das Recordset-Objekt ist das wichtigste Mittel zum Untersuchen und Bearbeiten von Daten in den Zeilen. Mit dem Recordset-Objekt können Sie Folgendes tun:

  • Angeben, welche Zeilen für die Untersuchung verfügbar sind.

  • Durchgehen der Zeilen.

  • Angeben der Reihenfolge, in der die Zeilen durchgegangen werden können.

  • Hinzufügen, Ändern oder Löschen von Zeilen.

  • Aktualisieren der Datenquelle mit geänderten Zeilen.

  • Verwalten des Gesamtzustands des Recordset-Objekts.

Feld

Die Zeile eines Recordset-Objekts besteht aus einem oder mehreren Feldern. Wenn Sie sich das Recordset-Objekt als zweidimensionale Tabelle vorstellen, bilden die Felder Spalten. Jedes Feld (jede Spalte) enthält in den Attributen einen Namen, Datentyp und Wert. Dieser Wert enthält die eigentlichen Daten der Datenquelle.

Das Objektmodell setzt ein Feld als Field-Objekt um.

Wenn Sie die Daten in der Datenquelle bearbeiten möchten, verändern Sie den Wert der Field-Objekte in den Zeilen des Recordset-Objekts. Abschließend werden Änderungen an dem Recordset-Objekt an die Datenquelle weitergeleitet. Optional kann auch durch die Methoden zum Transaktionsmanagement auf dem Connection-Objekt sichergestellt werden, dass die Änderungen erfolgreich sind oder alle fehlschlagen.

Fehler

Fehler können zu jeder Zeit in der Anwendung auftreten, weil eine Verbindung nicht hergestellt oder ein Befehl nicht ausgeführt werden kann oder weil eine Operation auf einem Objekt durchgeführt werden soll, das sich nicht in einem geeigneten Zustand befindet (z. B. beim Versuch, ein Recordset-Objekt zu verwenden, das nicht initialisiert worden ist).

Das Objektmodell setzt einen Fehler als Error-Objekt um.

Jeder Fehler erstellt ein oder mehrere Error-Objekte. Der nächste auftretende Fehler löscht den vorherigen Satz von Error-Objekten.

Eigenschaft

Jedes ADO-Objekt besitzt einen Satz eindeutiger Eigenschaften, die das Verhalten des Objekts entweder beschreiben oder steuern.

Es gibt zwei Arten von Eigenschaften: integrierte und dynamische. Integrierte Eigenschaften sind Teil des ADO-Objekts und immer verfügbar. Dynamische Eigenschaften werden der Properties-Auflistung des ADO-Objekts durch den zugrunde liegenden Datenprovider oder Serviceprovider hinzugefügt und sind nur vorhanden, während der betreffende Provider verwendet wird.

Das Objektmodell stellt eine Eigenschaft als Property-Objekt dar.

Datensatz

Nicht alle Datenquellen sind als Tabellen in einer Datenbank vorhanden. Informationsspeichersysteme, wie eine Datei oder ein E-Mailsystem, bestehen aus Container- und Inhalts-Komponenten. Ein Container kann Inhalt oder andere, untergeordnete Container beinhalten.

In einem Dateisystem bestehen Container und Inhalt aus Verzeichnissen und Dateien; in einem E-Mailsystem bestehen Container und Inhalt aus Ordnern und Nachrichten.

Das Objektmodell setzt einen Container oder Inhalt als ein Record-Objekt um. Weiterhin kann eine Zeile eines Recordsets als ein Record-Objekt umgesetzt werden.

Das Record-Objekt bietet folgende Mittel an:

  • Kopieren, Löschen oder Bewegen des Elements, dass es darstellt.

  • Erstellen eines neuen Record-Objekts, das zur Darstellung eines Elements geeignet ist, wie ein Verzeichnis oder eine Datei, oder einer Zeile eines Recordset-Objekts.

Ein Record-Objekt wird in Verbindung mit anderen ADO-Objekten verwendet, wie z. B. den Connection- oder Recordset-Objekten. Ein Record-Objekt wird jedoch erstellt, um einen anderen Satz von Fragen als den der ADO-Objekte zu lösen, der im Abschnitt Das zugrunde liegende ADO Programmiermodell beschrieben wurde. Weitere Informationen finden Sie unter Records und Streams.

Datenstrom

Der Inhalt eines Informationsspeichersystems, wie eine Datei in einem Dateisystem, beinhaltet einen Datenstrom aus Bytes. Ein Puffer im Speicher beinhaltet ebenfalls einen Datenstrom aus Bytes.

Das Objektmodell setzt einen Datenstrom aus Bytes als Stream-Objekt um.

Das Stream-Objekt bietet folgende Mittel an:

  • Lesen oder Schreiben einer Reihe von Bytes oder Textzeilen.

  • Auffüllen aus oder Speichern in einer Datei.

Ein Stream-Objekt wird nur in Verbindung mit dem Record-Objekt verwendet. Ein Stream-Objekt wird erstellt, um einen anderen Satz von Fragen als den der ADO-Objekte zu lösen, der im Abschnitt Das zugrunde liegende ADO Programmiermodell beschrieben wurde. Weitere Informationen finden Sie unter Records und Streams.

Auflistung

ADO verfügt über Auflistungen, eine Art von Objekt, das zur leichteren Handhabung andere Objekte eines bestimmten Typs enthält. Die Objekte in der Auflistung können mit einer Auflistungseigenschaft entweder nach Namen, als Textzeichenfolge oder nach Ordinalzahlen als Ganzzahl abgerufen werden.

ADO verfügt über vier Arten von Auflistungen:

  • Das Connection-Objekt umfasst die Errors-Auflistung, in der alle Error-Objekte enthalten sind, die als Reaktion auf einen einzelnen Fehler bezüglich der Datenquelle erstellt werden.

  • Das Command-Objekt umfasst die Parameters-Auflistung, in der alle Parameter-Objekte enthalten sind, die für dieses Command-Objekt gelten.

  • Die Recordset- und Record-Objekte umfassen die Fields-Auflistung, in der alle Field-Objekte enthalten sind, die die Spalten dieses Recordset-Objekts definieren.

  • Darüber hinaus umfassen die Connection-, Command-, Recordset- und Field-Objekte die Properties-Auflistung, in der alle Property-Objekte enthalten sind, die für die entsprechenden Objekte gelten.

ADO-Objekte besitzen Eigenschaften, in denen Sie Werte mit normalen Datentypen wie INTEGER, CHARACTER oder BOOLEAN festlegen oder abrufen können. Bestimmte Eigenschaften können jedoch auch Werte des Datentyps "COLLECTION OBJECT" zurückgeben. Das Auflistungsobjekt hat wiederum Methoden, um andere für die Auflistung geeignete Objekte zu speichern und abzurufen.

Das Recordset-Objekt verfügt z. B. über eine Properties-Eigenschaft, die ein Auflistungsobjekt zurückgibt. Dieses Auflistungsobjekt verfügt über Methoden zum Speichern und Abrufen von Property-Objekten, die Attribute dieses Recordset-Objekts beschreiben.

Ereignisse

Ereignisse sind Benachrichtigungen, dass bestimmte Operationen stattfinden werden oder bereits stattgefunden haben. Sie können Ereignisse verwenden, um eine Anwendung, die aus mehreren asynchronen Aufgaben besteht, effizient zu organisieren.

Das Objektmodell setzt Ereignisse nicht direkt um, es stellt sie als Aufrufe von Ereignishandlern dar.

Mit Ereignishandlern, die vor Beginn der Operation aufgerufen werden, können Sie Operationsparameter überprüfen und bearbeiten, danach können Sie die Operation abbrechen oder zu Ende führen.

Mit Ereignishandlern, die nach Beendigung der Operation aufgerufen werden, werden Sie über den Abschluss einer asynchronen Operation informiert. Mehrere Operationen sind verbessert worden, so dass sie optional asynchron ausgeführt werden können. Eine Anwendung, die eine asynchrone Recordset.Open-Operation startet, wird z. B. durch ein Ereignis zur Beendigung der Ausführung erkannt, wenn die Operation beendet ist.

Weitere Informationen über Ereignisse finden Sie unter ADO-Ereignismodell, synchrone und asynchrone Operationen.

Weiter Das ADO-Programmiermodell mit Objekten


Das ADO-Programmiermodell mit Objekten

Das Ziel von ADO liegt darin, auf Datenquellen zuzugreifen, diese zu bearbeiten und zu aktualisieren. Das Programmiermodell stellt die Folge von Aktivitäten dar, die zum Erreichen dieses Ziels erforderlich ist. ADO stellt Klassen und Objekte zur Verfügung, mit denen jede der folgenden Aktivitäten ermöglicht wird:

  • Stellen Sie eine Verbindung zu einer Datenquelle her (Connection). Wahlweise können Sie auch eine Transaktion beginnen.

  • Erstellen Sie optional ein Objekt, das einen Befehl, z. B. einen SQL-Befehl, darstellt (Command).

  • Geben Sie optional Spalten, Tabellen und Werte als variable Parameter in den SQL-Befehl ein (Parameter).

  • Führen Sie den Befehl aus (Command, Connection oder Recordset).

  • Gibt der Befehl Zeilen zurück, speichern Sie die Zeilen in einem Zwischenspeicher (Recordset).

  • Erstellen Sie optional eine Ansicht des Zwischenspeicher, so dass Sie die Daten sortieren, filtern und sich durch sie bewegen können (Recordset).

  • Bearbeiten Sie die Daten, indem Sie Zeilen und Spalten hinzufügen, löschen oder verändern (Recordset-Objekt).

  • Aktualisieren Sie die Datenquelle, falls angebracht, mit den Änderungen aus dem Speicherobjekt (Recordset).

  • Wenn Sie eine Transaktion verwendet haben, akzeptieren Sie die Änderungen, die während der Transaktion vorgenommen wurden, oder lehnen Sie diese ab. Beenden Sie die Transaktion (Connection).

Weiter Das ADO-Objektmodell - Zusammenfassung


Das ADO-Objektmodell - Zusammenfassung

Das ADO-Objektmodell – Zusammenfassung

ADO-Objekte - Zusammenfassung

Objekt | Beschreibung
Connection | Ermöglicht den Austausch von Daten.
Command | Stellt eine SQL-Anweisung dar.
Parameter | Stellt einen Parameter einer SQL-Anweisung dar.
Recordset | Ermöglicht das Bewegen durch und Bearbeiten von Daten.
Field | Stellt eine Spalte eines Recordset- oder Record-Objekts dar.
Error | Stellt einen Fehler bei einer Verbindung dar.
Property | Stellt ein Merkmal eines ADO-Objekts dar.
Record | Stellt eine Verzeichnis oder eine Datei dar.
Stream | Stellt den Inhalt einer Datei dar.

ADO-Auflistungen - Zusammenfassung

Auflistung | Beschreibung
Errors | Alle Error-Objekte, die als Reaktion auf einen einzelnen Fehler in der Verbindung erstellt worden sind.
Parameters | Alle Parameter-Objekte, die mit einem Command-Objekt verbunden sind.
Fields | Alle Field-Objekte, die mit einem Recordset-Objekt verbunden sind.
Properties | Alle Property-Objekte, die mit einem Connection-, Command-, Recordset- oder Field-Objekt verbunden sind.

ADO-Ereignishandler - Zusammenfassung

ConnectionEvents | Beschreibung
BeginTransComplete, CommitTransComplete, RollbackTransComplete | Transaktionsmanagement - Benachrichtigung, dass die aktuelle Transaktion auf der Verbindung gestartet, ausgeführt oder zurückgesetzt wurde.
WillConnect, ConnectComplete, Disconnect | Verbindungsmanagement - Benachrichtigung, dass die aktuelle Verbindung starten wird, gestartet oder beendet wurde.
WillExecute, ExecuteComplete | Befehlsausführungsmanagement - Benachrichtigung, dass die Ausführung des aktuellen Befehls auf der Verbindung starten wird oder beendet wurde.
InfoMessage | Information – Benachrichtigung über zusätzliche Informationen zur aktuellen Operation.

RecordsetEvents | Beschreibung
FetchProgress, FetchComplete | Abfragestatus –Benachrichtigung über den Fortschritt der Datenabrufoperation oder über die Beendigung der Abrufoperation.
WillChangeField, FieldChangeComplete | Feldänderungsmanagement - Benachrichtigung, dass sich der Wert des aktuellen Feldes ändert oder geändert hat.
WillMove, MoveComplete, EndOfRecordset | Navigationsmanagement – Benachrichtigung, dass sich die aktuelle Zeilenposition in einem Recordset-Objekt ändert, geändert hat oder das Ende des Recordset-Objekts erreicht wurde.
WillChangeRecord, RecordChangeComplete | Zeilenänderungsmanagement - Benachrichtigung, dass sich Daten in der aktuellen Zeile eines Recordset-Objekts ändern werden oder geändert haben.
WillChangeRecordset, RecordsetChangeComplete | Recordset-Änderungsmanagement - Benachrichtigung, dass sich Daten im aktuellen Recordset-Objekt ändern werden oder geändert haben.


Übungen zu ADO

In diesen Übungen wird erläutert, wie Sie mit dem ADO-Programmiermodell eine Datenquelle abfragen und aktualisieren können. Zuerst werden die Schritte beschrieben, die zur Erfüllung dieser Aufgabe erforderlich sind. Dann werden die Übungen jeweils für Microsoft Visual Basic, Microsoft Visual C++ mit Visual C++-Erweiterungen und Microsoft Visual J++ mit ADO für Windows Foundation Classes (ADO/WFC) wiederholt.

Aus zwei Gründen werden die Übungen mit Code in verschiedenen Sprachen vorgestellt:

  • Die ADO-Dokumentation geht davon aus, dass in Visual Basic programmiert wird. Dadurch ist diese Dokumentation beim Programmieren in Visual Basic sehr nützlich, sie ist jedoch für diejenigen Programmierer wenig hilfreich, die mit anderen Sprachen arbeiten.

  • Wenn Sie sich bei einem bestimmten ADO-Feature unsicher sind und sich ein wenig in einer anderen Sprache auskennen, können Sie Ihre Fragen unter Umständen beantworten, indem Sie nachsehen, wie dieses Feature in einer anderen Sprache formuliert wird.

Präsentation der Übungen

Die Übungen sind in einzelne Schritte unterteilt, die sich an dem ADO-Programmiermodell orientieren. Darüber hinaus wird jeder Schritt anhand eines in Visual Basic geschriebenen Codefragments erörtert und veranschaulicht. Am Schluss werden die Codefragmente dann zu einem Visual Basic-Beispiel zusammengefasst und integriert.

Das integrierte Beispiel wird anschließend in den anderen Programmiersprachen wiederholt. Jeder Schritt in jeder programmiersprachlichen Variante eines Beispiels ist nummeriert. Die Nummer des jeweiligen Schrittes dient als Verweis auf die zugehörige Darstellung in den Erläuterungen zu den Übungen.

Das ADO-Programmiermodell ist im Folgenden dargestellt. Verwenden Sie es als Leitfaden, der Sie durch die Übungen führt.

Das ADO-Programmiermodell mit Objekten

  • Stellen Sie eine Verbindung zu einer Datenquelle her (Connection). Wahlweise können Sie auch eine Transaktion beginnen.

  • Erstellen Sie optional ein Objekt, das einen SQL-Befehl darstellt (Command).

  • Geben Sie optional Spalten, Tabellen und Werte als variable Parameter in den SQL-Befehl ein (Parameter).

  • Führen Sie den Befehl aus (Command, Connection oder Recordset).

  • Gibt der Befehl Zeilen zurück, speichern Sie die Zeilen in einem Speicherobjekt (Recordset-Objekt).

  • Erstellen Sie optional eine Ansicht des Speicherobjekts, so dass Sie die Daten sortieren, filtern und sich durch sie bewegen können (Recordset-Objekt).

  • Bearbeiten Sie die Daten, indem Sie Zeilen und Spalten hinzufügen, löschen oder ändern (Recordset-Objekt).

  • Aktualisieren Sie die Datenquelle ggf. mit den Änderungen aus dem Speicherobjekt (Recordset-Objekt).

  • Wenn Sie eine Transaktion verwendet haben, akzeptieren Sie die Änderungen, die während der Transaktion gemacht wurden, oder lehnen Sie sie ab. Beenden Sie die Transaktion (Connection).

Weiter Schritt 1: Öffnen einer Verbindung


Schritt 1: Öffnen einer Verbindung (Übungen zu ADO)

Der hier erläuterte Schritt ist grafisch hervorgehoben...

  • Stellen Sie eine Verbindung zu einer Datenquelle her.

  • Erstellen Sie optional ein Objekt, das einen SQL-Abfragebefehl darstellt.

  • Geben Sie in der SQL-Anweisung optional Werte als variable Parameter an.

  • Führen Sie die Anweisung aus. Gibt die Anweisung Zeilen zurück, speichern Sie die Zeilen in einem Speicherobjekt.

  • Bewegen Sie sich optional durch die Daten, und untersuchen, verändern und bearbeiten Sie sie.

  • Aktualisieren Sie ggf. die Datenquelle mit den Änderungen aus dem Speicherobjekt. Betten Sie die Aktualisierung optional in eine Transaktion ein.

  • Wenn Sie eine Transaktion verwendet haben, akzeptieren Sie die während der Transaktion vorgenommenen Änderungen, oder lehnen Sie sie ab. Beenden Sie die Transaktion.

Erläuterung

Sie benötigen ein Mittel, um die für den Austausch von Daten erforderlichen Voraussetzungen zu erfüllen, d. h. eine Verbindung. Die Datenquelle, zu der Sie die Verbindung herstellen, ist in einer Verbindungszeichenfolge angegeben, wobei die Parameter in einer Verbindungszeichenfolge für jeden Provider und jede Datenquelle unterschiedlich sein können.

Der am meisten gebräuchliche Weg, über den ADO eine Verbindung aufbaut, ist die Connection.Open-Methode. Alternativ dazu können Sie auch ein Schnellverfahren verwenden, indem Sie Recordset.Open aufrufen, um sowohl eine Verbindung herzustellen als auch über diese Verbindung einen Befehl auszugeben und all dies in einer einzigen Operation auszuführen. Es folgt die Syntax für beide Methoden in Visual Basic:

connection.Open ConnectionString, UserID, Password, OpenOptions
recordset.Open Source, ActiveConnection, CursorType, LockType, Options

Es ist hilfreich, diese beiden Methoden miteinander zu vergleichen, um einige nützliche Merkmale der ADO-Methodenparameter allgemein hervorzuheben.

Ein Methodenparameter kann auf mehrere Arten angegeben werden. Recordset.Open verwendet beispielsweise einen ActiveConnection-Parameter, der eine Literalzeichenfolge sein kann, eine Variable, die diese Zeichenfolge darstellt, oder ein Connection-Objekt, das eine offene Verbindung darstellt.

In diesen Übungen wird die folgende Zeichenfolgenkonstante "DSN=Pubs;uid=sa;pwd=;".als Verbindungszeichenfolge verwendet. (Die Datenquelle ist indirekt durch das Schlüsselwort "DSN=" bezeichnet. Weitere Informationen finden Sie im Abschnitt "Typische Beispiele für Verbindungszeichenfolgen" in der Dokumentation zu Microsoft OLE DB-Provider für ODBC.)

Die meisten Methoden eines Objekts verfügen über Eigenschaften, die ein Argument liefern können, wenn ein Methodenparameter übergangen wird. Beispielsweise können Sie die Informationen der Verbindungszeichenfolge für die Connection.Open-Methode bereitstellen, indem Sie einen Wert für die ConnectionString-Eigenschaft des Connection-Objekts festlegen und dann den ConnectionString-Parameter beim Aufruf der Open-Methode weglassen.

Die Übungen verwenden die folgende Deklaration eines Connection-Objekts und den folgenden Aufruf seiner Open-Methode:

Dim cnn As New ADODB.Connection
cnn.Open "DSN=Pubs;uid=sa;pwd=;"

Weiter Schritt 2: Erstellen eines Befehls


Schritt 2: Erstellen eines Befehls (Übungen zu ADO)

Der hier erläuterte Schritt ist grafisch hervorgehoben...

  • Stellen Sie eine Verbindung zu einer Datenquelle her.

  • Erstellen Sie optional ein Objekt, das einen SQL-Abfragebefehl darstellt.

  • Geben Sie in der SQL-Anweisung optional Werte als variable Parameter an.

  • Führen Sie die Anweisung aus. Gibt die Anweisung Zeilen zurück, speichern Sie die Zeilen in einem Speicherobjekt.

  • Bewegen Sie sich optional durch die Daten, und untersuchen, verändern und bearbeiten Sie sie.

  • Aktualisieren Sie ggf. die Datenquelle mit den Änderungen aus dem Speicherobjekt. Betten Sie die Aktualisierung optional in eine Transaktion ein.

  • Wenn Sie eine Transaktion verwendet haben, akzeptieren Sie die Änderungen, die während der Transaktion gemacht wurden, oder lehnen Sie sie ab. Beenden Sie die Transaktion.

Erläuterung

Ein Befehl ist eine Anweisung, die der Datenprovider interpretieren kann und die auf eine Änderung, Verwaltung oder Manipulation der Datenquelle zielt. Befehle werden in der Regel als SQL-Anweisungen formuliert, obwohl keine spezielle Befehlssprache erforderlich ist. Ein Abfragebefehl bewirkt, dass die Datenquelle ein Recordset-Objekt zurückgibt, das Zeilen mit den gewünschten Informationen enthält.

Ein Befehl wird folgendermaßen angegeben:

  • Durch einen Befehlstext in Form einer Literalzeichenfolge oder einer Variable, die die Zeichenfolge darstellt.

  • Durch ein Objekt, das die Befehlszeichenfolge darstellt. In diesem Fall ist der Wert der CommandText-Eigenschaft eines Command-Objekts auf die Befehlszeichenfolge festgelegt.

In der Randleiste finden Sie eine kurze Erläuterung parametrisierter Befehle.

Im Rahmen dieser Übungen werden alle Daten der Tabelle Authors in der Pubs-Datenbank abgefragt. Das Command-Objekt wird deklariert und anschließend werden ihm als Attribute das geöffnete Connection-Objekt sowie der Befehlstext zugewiesen. Der dafür zuständige Code sieht folgendermaßen aus:

Dim cmd As New ADODB.Command
Set cmd.ActiveConnection = cnn
cmd.CommandText = "SELECT * from Authors"

Weiter Schritt 3: Ausführen des Befehls


Schritt 3: Ausführen des Befehls (Übungen zu ADO)

Der hier erläuterte Schritt ist grafisch hervorgehoben...

  • Stellen Sie eine Verbindung zu einer Datenquelle her.

  • Erstellen Sie optional ein Objekt, das einen SQL-Abfragebefehl darstellt.

  • Geben Sie in der SQL-Anweisung optional Werte als variable Parameter an.

  • Führen Sie die Anweisung aus. Gibt die Anweisung Zeilen zurück, speichern Sie die Zeilen in einem Speicherobjekt.

  • Bewegen Sie sich optional durch die Daten, und untersuchen, verändern und bearbeiten Sie sie.

  • Aktualisieren Sie ggf. die Datenquelle mit den Änderungen aus dem Speicherobjekt. Betten Sie die Aktualisierung optional in eine Transaktion ein.

  • Wenn Sie eine Transaktion verwendet haben, akzeptieren Sie die Änderungen, die während der Transaktion gemacht wurden, oder lehnen Sie sie ab. Beenden Sie die Transaktion.

Erläuterung

Die drei Methoden, die ein Recordset-Objekt zurückgeben, sind Connection. Execute, Command.Execute und Recordset.Open. Es folgt ihre Syntax in Visual Basic:

connection.Execute(CommandText, RecordsAffected, Options)
command.Execute(RecordsAffected, Parameters, Options)
recordset.Open Source, ActiveConnection, CursorType, LockType, Options

Diese Methoden sind so optimiert, dass sie die jeweiligen Stärken ihrer Objekte nutzen.

Vor der Übermittlung eines Befehls müssen Sie implizit oder explizit eine Verbindung öffnen. Jede Methode, die einen Befehl ausgibt, stellt die Verbindung unterschiedlich dar:

  • Die Connection.Execute-Methode verwendet die Verbindung, die durch das Connection-Objekt selbst verkörpert wird.

  • Die Command.Execute-Methode verwendet das Connection-Objekt, das in der ActiveConnection-Eigenschaft festgelegt ist.

  • Die Recordset.Open-Methode verwendet eine Verbindungszeichenfolge oder den Wert ihres ActiveConnection-Parameters oder das Connection-Objekt, auf das die ActiveConnection-Eigenschaft des Recordset-Objekts festgelegt wurde.

Ein weiterer Unterschied besteht in der Art, wie der Befehl in den drei Methoden angegeben wird:

  • Bei der Connection.Execute-Methode wird der Befehl als eine Zeichenfolge angegeben.

  • Beim Aufruf der Command.Execute-Methode ist der Befehl nicht sichtbar, sondern in der Command.CommandText-Eigenschaft angegeben. Außerdem kann dieser Befehl parametrisiert werden.

  • Beim Aufruf der Recordset.Open-Methode ist der Befehl im Source-Argument enthalten, das ein Befehlstext oder ein Command-Objekt sein kann. (Das Source-Argument kann also eine Zeichenfolge sein, die einen Tabellennamen, eine gespeicherte Prozedur oder den Dateinamen eines dauerhaft gespeicherten Recordset-Objekts repräsentiert.)

Bei jeder Methode wird ein Kompromiss zwischen Funktionalität und Leistung geschlossen:

  • Die Execute-Methoden sind zur Ausführung von Befehlen gedacht, die keine Daten zurückgeben - sie sind jedoch nicht darauf beschränkt.

  • Beide Execute-Methoden geben ausschließlich Recordset-Objekte mit schnellem Schreibschutzcursor vom Typ Vorwärts zurück.

  • Mit der Command.Execute-Methode können Sie parametrisierte Befehle verwenden, die effizient wiederverwendet werden können.

  • Andererseits können Sie mit der Open-Methode den CursorType festlegen, der die Strategie und das Objekt für den Zugriff auf die Daten bestimmt, sowie den LockType, der den Grad der Isolierung von anderen Benutzern bestimmt und andererseits festlegt, ob der Cursor Aktualisierungen im Direktmodus (sofort) oder im Stapelmodus unterstützt.

Sie sollten sich diese Optionen sehr genau ansehen, da sie einen großen Teil der Funktionalität eines Recordset-Objekts verkörpern. Von besonderer Bedeutung ist die Entscheidung, den Microsoft Cursordienst für OLE DB zu verwenden. Konsultieren Sie das entsprechende Hilfethema (Microsoft Cursordienst für OLE DB), wenn Sie weitere Einzelheiten über die Implikationen dieser Entscheidung erfahren möchten.

In diesen Übungen werden Änderungen am Recordset-Inhalt im Stapelmodus durchgeführt. Es wird deshalb adLockBatchOptimistic als LockType-Einstellung verwendet. Die Stapelverarbeitung erfordert den lokalen Cursordienst, so dass die CursorLocation-Eigenschaft den Wert adUseClient zugewiesen erhält. Da das Command-Objekt bereits über eine geöffnete Verbindung verfügt, darf der ActiveConnection-Parameter beim Aufruf der Open-Methode nicht angegeben werden.

Das Recordset-Objekt wird folgendermaßen deklariert und initialisiert:

Dim rs As New ADODB.Recordset
rst.CursorLocation = adUseClient
rst.Open cmd, , adOpenStatic, adLockBatchOptimistic

Weiter Schritt 4: Ändern der Daten


Schritt 4: Ändern der Daten (Übungen zu ADO)

Der hier erläuterte Schritt ist grafisch hervorgehoben...

  • Stellen Sie eine Verbindung zu einer Datenquelle her.

  • Erstellen Sie optional ein Objekt, das einen SQL-Abfragebefehl darstellt.

  • Geben Sie in der SQL-Anweisung optional Werte als variable Parameter an.

  • Führen Sie die Anweisung aus. Gibt die Anweisung Zeilen zurück, speichern Sie die Zeilen in einem Speicherobjekt.

  • Bewegen Sie sich optional durch die Daten, und untersuchen, verändern und bearbeiten Sie sie.

  • Aktualisieren Sie ggf. die Datenquelle mit den Änderungen aus dem Speicherobjekt. Betten Sie die Aktualisierung optional in eine Transaktion ein.

  • Wenn Sie eine Transaktion verwendet haben, akzeptieren Sie die Änderungen, die während der Transaktion gemacht wurden, oder lehnen Sie sie ab. Beenden Sie die Transaktion.

Erläuterung

Der größte Teil der Methoden und Eigenschaften des Recordset-Objekts dient dazu, die Datenzeilen eines Recordsets zu untersuchen, sich durch sie zu bewegen und sie zu verändern.

Stellen Sie sich ein Recordset als ein Array von Zeilen vor. Die Zeile, die Sie zu jeder beliebigen Zeit untersuchen und verändern können, ist die aktuelle Zeile, und ihre Position im Recordset ist die aktuelle Zeilenposition. Jedes Mal, wenn Sie zu einer anderen Zeile wechseln, wird diese Zeile zur neuen aktuellen Zeile.

Verschiedene Methoden bewegen sich explizit durch das Recordset (die Move-Methoden). Einige Methoden (z. B. die Find-Methode) weisen diese Funktion als Nebeneffekt ihrer Operation auf. Darüber hinaus können Sie auch durch Festlegen bestimmter Eigenschaften (z. B. der Bookmark-Eigenschaft) die Zeilenposition verändern. Die CursorType-Eigenschaft des Recordset-Objekts bzw. der CursorType-Parameter der Open-Methode legen fest, ob ein Navigieren in beiden Richtungen durch den Recordset möglich ist.

Die Filter-Eigenschaft kann zur Auswahl der Zeilen verwendet werden, auf die Sie zugreifen können (d. h., die Zeilen sind für Sie "sichtbar"). Die Sort-Eigenschaft steuert die Reihenfolge, in der Sie sich durch die Zeilen des Recordset bewegen.

Neue Zeilen können mit der AddNew-Methode generiert und vorhandene Zeilen mit der Delete-Methode gelöscht werden.

Ein Recordset enthält eine Fields-Auflistung, die aus der Gruppe von Field-Objekten besteht, die jedes Feld oder jede Spalte in einer Zeile darstellen. Legen Sie die Daten für ein Feld mit der Value-Eigenschaft des Field-Objekts fest, oder rufen Sie die Daten über diese Eigenschaft ab. Sie können auch auf größere Datenmengen mithilfe der GetRows-Methode zugreifen. Nachdem Sie den Recordset-Inhalt modifiziert haben, veranlassen Sie die Weiterleitung Ihrer Änderungen durch Aufrufe der Update-Methoden.

In diesen Übungen werden Sie folgende Aktionen durchführen:

  • Sie legen die Optimize-Eigenschaft in der Properties-Auflistung des Field-Objekts au_lname auf true fest, um die Leistung beim Sortieren und Filtern zu verbessern.

  • Sie sortieren das Recordset-Objekt nach den Nachnamen der Verfasser.

  • Sie filtern das Recordset-Objekt, so dass nur auf die Zeilen zugegriffen werden kann, in denen der Vorwahlbereich des Autors "415" ist und der Verteiler mit "5" beginnt.

  • Sie ändern in den gefilterten Telefonnummern den Vorwahlbereich in den fiktiven Wert "777."

Verwenden Sie die Move-Methoden, um sich vom Anfang des sortierten, gefilterten Recordset-Objekts zu seinem Ende zu bewegen. Stoppen Sie, wenn die EOF-Eigenschaft des Recordset-Objekts anzeigt, dass Sie die letzte Zeile erreicht haben. Während Sie sich durch das Recordset-Objekt bewegen, zeigen Sie Vor- und Nachnamen sowie die ursprünglichen Telefonnummern der Autoren an, ändern Sie dann den Vorwahlbereich im phone-Feld zu "777". (Die Telefonnummern im phone-Feld haben die Form "aaa xxx-yyyy", wobei aaa der Vorwahlbereich ist und xxx der Verteiler.)

Nach der Änderung entspricht die jeweils betroffene Zeile nicht mehr den Filterkriterien und ist deshalb im Recordset nicht mehr sichtbar. Alle Zeilen sind erneut sichtbar, wenn der Filterinhalt gelöscht wird.

In der Randleiste Schema ist das Layout der Tabelle Authors aufgeführt. Der dafür zuständige Code sieht folgendermaßen aus:

rst!au_lname.Properties("Optimize") = True
rst.Sort = "au_lname"
rst.Filter = "phone LIKE '415 5*'"
rst.MoveFirst
Do While Not rst.EOF
    Debug.Print "Name = "; rst!au_fname; " "; rst!au_lname; _
        ", Phone = "; rst!phone
    rst!phone = "777" & Mid(rst!phone, 4)
    rst.MoveNext
Loop
rst.Filter = adFilterNone

Weiter Schritt 5: Aktualisieren der Daten


Schritt 5: Aktualisieren der Daten (Übungen zu ADO)

Der hier erläuterte Schritt ist grafisch hervorgehoben...

  • Stellen Sie eine Verbindung zu einer Datenquelle her.

  • Erstellen Sie optional ein Objekt, das einen SQL-Abfragebefehl darstellt.

  • Geben Sie in der SQL-Anweisung optional Werte als variable Parameter an.

  • Führen Sie die Anweisung aus. Gibt die Anweisung Zeilen zurück, speichern Sie die Zeilen in einem Speicherobjekt.

  • Bewegen Sie sich optional durch die Daten, und untersuchen, verändern und bearbeiten Sie sie.

  • Aktualisieren Sie ggf. die Datenquelle mit den Änderungen aus dem Speicherobjekt. Betten Sie die Aktualisierung optional in eine Transaktion ein.

  • Wenn Sie eine Transaktion verwendet haben, akzeptieren Sie die Änderungen, die während der Transaktion gemacht wurden, oder lehnen Sie sie ab. Beenden Sie die Transaktion.

Erläuterung

Sie haben gerade die Daten in verschiedenen Zeilen des Recordset-Objekts verändert. ADO unterstützt zwei grundlegende Konzepte zum Hinzufügen, Löschen und Ändern von Datenzeilen.

Das erste Konzept besagt, dass Änderungen nicht direkt am Recordset-Objekt vorgenommen werden, sondern in einem internen Kopierpuffer. Wenn Sie beschließen, die Änderungen zu verwerfen, werden die Änderungen im Kopierpuffer verworfen. Wenn Sie beschließen, die Änderungen zu übernehmen, werden die Änderungen vom Kopierpuffer auf das Recordset übertragen.

Das zweite Konzept besagt, dass Änderungen entweder an die Datenquelle weitergegeben werden, sobald Sie die Arbeit an einer Zeile für abgeschlossen erklären (d. h. Sie arbeiten im Direktmodus), oder dass alle Änderungen an einer Gruppe von Zeilen gesammelt werden, bis Sie die Arbeit an der gesamten Gruppe für abgeschlossen erklären (so genannter Stapelmodus). Die LockType-Eigenschaft bestimmt, wann die Änderungen zur zugrunde liegenden Datenquelle übertragen werden. Die CursorLocation-Eigenschaft kann Einfluss darauf nehmen, welche LockType-Einstellungen verfügbar sind. Beispielsweise wird die adLockPessimistic-Einstellung nicht unterstützt, wenn die CursorLocation-Eigenschaft auf adUseClient festgelegt ist.

Im Direktmodus werden durch jeden Aufruf der Update-Methode die Änderungen an die Datenquelle übergeben. Im Stapelmodus werden durch jeden Aufruf von Update oder durch jede Veränderung der aktuellen Zeilenposition die Änderungen am Recordset-Objekt gespeichert, aber lediglich bei Verwendung der UpdateBatch-Methode werden die Änderungen auch an die Datenquelle übergeben. Da das Recordset im Stapelmodus (adLockBatchOptimistic) geöffnet wurde, erfolgt auch die Aktualisierung im Stapelmodus.

Optional können Sie die Aktualisierung auch in einer Transaktion durchführen. Eine Transaktion schafft eine Umgebung, in der die Operationen der Transaktion entweder alle erfolgreich verlaufen oder alle ihre Auswirkungen insgesamt verworfen werden.

Ein häufig anzutreffendes Beispiel einer Transaktion stellt eine Anwendung für bankbezogene Finanzoperationen dar, wo sowohl die Operation, die einen Betrag von einem Konto abbucht, als auch diejenige Operation, die denselben Betrag auf ein anderes Konto überweist, beide erfolgreich abgeschlossen werden müssen. Wenn eine der Operationen fehlschlägt, muss die andere storniert werden, denn andernfalls sind die Konten nicht ausgeglichen.

Transaktionen belegen in der Regel begrenzte Ressourcen in der Datenquelle über einen langen Zeitraum. Aus diesem Grund wird empfohlen, dass eine Transaktion über einen möglichst kurzen Zeitraum besteht. (Daher wurde am Anfang dieser Übung keine Transaktion gestartet, als die Verbindung aufgebaut wurde.)

Unter praktischen Gesichtspunkten ist für diese Übungen keine Transaktion erforderlich, wird aber zur Veranschaulichung dennoch einbezogen. Der Code zum Starten einer Transaktion und Durchführung einer Stapelaktualisierung sieht folgendermaßen aus:

cnn.BeginTrans
rst.UpdateBatch

Weiter Schritt 6: Abschließen der Aktualisierung


Schritt 6: Abschließen der Aktualisierung (Übungen zu ADO)

Der hier erläuterte Schritt ist grafisch hervorgehoben...

  • Stellen Sie eine Verbindung zu einer Datenquelle her.

  • Erstellen Sie optional ein Objekt, das einen SQL-Abfragebefehl darstellt.

  • Geben Sie in der SQL-Anweisung optional Werte als variable Parameter an.

  • Führen Sie die Anweisung aus. Gibt die Anweisung Zeilen zurück, speichern Sie die Zeilen in einem Speicherobjekt.

  • Bewegen Sie sich optional durch die Daten, und untersuchen, verändern und bearbeiten Sie sie.

  • Aktualisieren Sie ggf. die Datenquelle mit den Änderungen aus dem Speicherobjekt. Betten Sie die Aktualisierung optional in eine Transaktion ein.

  • Wenn Sie eine Transaktion verwendet haben, akzeptieren Sie die Änderungen, die während der Transaktion gemacht wurden, oder lehnen Sie sie ab. Beenden Sie die Transaktion.

Erläuterung

Stellen Sie sich vor, die Stapelaktualisierung wurde mit Fehlern beendet. Die Behebung dieser Fehler hängt von der Ursache und Bedeutung des Fehlers sowie von der Logik der Anwendung ab. Wenn Sie jedoch die Datenbank mit anderen Benutzern gemeinsam nutzen, liegt ein typischer Fehler darin, dass ein anderer Benutzer ein Feld vor Ihnen verändert hat. Diese Art von Fehler wird Konflikt genannt. ADO erkennt diese Situation und meldet einen Fehler.

In der Übung besteht dieser Schritt aus zwei Teilen: Falls die Aktualisierung fehlerfrei erfolgt ist, enthält die Datenquelle die Aktualisierungsänderungen. Die Transaktion wird dann übertragen. Das Übertragen der Transaktion schließt die Transaktion ab und beendet sie.

Die Aktualisierung wird mit Code der folgenden Art akzeptiert:

cnn.CommitTrans

Sind bei der Aktualisierung Fehler aufgetreten, werden sie in einem Fehlerhandler aufgefangen. Filtern Sie das Recordset-Objekt mit der adFilterConflictingRecords-Konstante, so dass nur die Zeilen mit den Konflikten angezeigt werden. Die Strategie für die Fehlerbehebung liegt einfach darin, den Vor- und Nachnamen des Autors (au_fname und au_lname ) auszugeben und dann die Transaktion zurückzusetzen. Das Zurücksetzen der Transaktion verwirft alle tatsächlich erfolgreich durchgeführten Änderungen und beendet die Transaktion.

Für das Zurückweisen einer Aktualisierung wird Code der folgenden Art verwendet:

rst.Filter = adFilterConflictingRecords
rst.MoveFirst
Do While Not rst.EOF
    Debug.Print "Conflict: Name =  "; rst!au_fname; " "; rst!au_lname
    rst.MoveNext
Loop
cnn.RollbackTrans

Nach dem Abschluss der Aktualisierung werden das Recordset- und das Connection-Objekt geschlossen und die Beispielanwendung beendet. Der dafür zuständige Code sieht folgendermaßen aus:

rst.Close
cnn.Close

Hier enden die Übungserläuterungen.


Übungen zu ADO (Visual Basic)

Hier finden Sie die Visual Basic-Version der Übungen zu ADO. Das Thema Übungen zu ADO beschreibt den Zweck dieser Übungen im Einzelnen.

Public Sub Main()    ' Lernprogramm in VB

Dim cnn As New ADODB.Connection
Dim cmd As New ADODB.Command
Dim rst As New ADODB.Recordset

' Schritt 1 - Eine Verbindung öffnen
cnn.Open "DSN=Pubs;uid=sa;pwd=;"

' Schritt 2 - Einen Befehl erstellen
Set cmd.ActiveConnection = cnn
cmd.CommandText = "SELECT * from Authors"

' Schritt 3 - Den Befehl ausführen
rst.CursorLocation = adUseClient
rst.Open cmd, , adOpenStatic, adLockBatchOptimistic

' Schritt 4 - Die Daten bearbeiten
rst!au_lname.Properties("Optimize") = True
rst.Sort = "au_lname"
rst.Filter = "phone LIKE '415 5*'"
rst.MoveFirst
Do While Not rst.EOF
    Debug.Print "Name = "; rst!au_fname; " "; rst!au_lname; _
        ", Phone = "; rst!phone
    rst!phone = "777" & Mid(rst!phone, 4)
    rst.MoveNext
Loop

rst.Filter = adFilterNone

' Schritt 5 - Die Daten aktualisieren
cnn.BeginTrans
On Error GoTo ConflictHandler
rst.UpdateBatch

'Schritt 6, Teil A - Abschließen der Aktualisierung (Änderungen annehmen)
cnn.CommitTrans

ExitTutorial:
On Error GoTo 0
rst.Close
cnn.Close
Exit Sub

'Schritt 6, Teil B - Abschließen der Aktualisierung (Änderungen ablehnen)
ConflictHandler:
rst.Filter = adFilterConflictingRecords
rst.MoveFirst
Do While Not rst.EOF
    Debug.Print "Conflict: Name =  "; rst!au_fname; " "; rst!au_lname
    rst.MoveNext
Loop
cnn.RollbackTrans
Resume ExitTutorial

End Sub

Hier endet die Visual Basic-Übung.


Übungen zu ADO (Visual C++)

Hier finden Sie die Version der Übungen zu ADO, die unter Verwendung von Microsoft Visual C++ und der #import-Anweisung erstellt wurden. Das Thema Übungen zu ADO beschreibt den Zweck dieser Übungen im Einzelnen.

Die #import-Anweisung generiert Funktionen aus der ADO-Typbibliothek und speichert sie in einer Headerdatei, die bei Verwendung von ADO für Visual C++ einen von Visual Basic her bekannten Programmierkomfort ermöglicht.

In dieser Übung werden auch die Visual C++-Erweiterungen für ADO behandelt. Die Visual C++-Erweiterungen konvertieren automatisch die Feldwerte eines angegebenen Recordset-Objekts und füllen mit den Ergebnissen lokale Variableninstanzen. Außerdem unterstützen die Visual C++-Erweiterungen eigene Versionen der Methoden AddNew und Update.

Die #import-Anweisung generiert zu jeder ADO-Methode und -Eigenschaft einen Fehlerhandler. Diese Funktion namens TESTHR() wird in diesen Übungen als bequemes Mittel benutzt, um denselben Mechanismus zur Fehlerbehandlung auch für Funktionen einzusetzen, die nicht zu ADO gehören.

#import "c:\Program Files\Common Files\System\ADO\msado15.dll" \
   no_namespace rename("EOF", "EndOfFile")
#include <stdio.h>
#include <icrsint.h>  //Unterstützung für VC++Erweiterungen einschließen

void dump_com_error(_com_error &e)
   {
   printf("Error:\n");
   printf("Code = %08lx\n", e.Error());
   printf("Code meaning = %s\n", e.ErrorMessage());
   printf("Source = %s\n", (LPCSTR) e.Source());
   printf("Description = %s\n", (LPCSTR) e.Description());
   }

inline void TESTHR( HRESULT _hr )
   { if FAILED(_hr) _com_issue_error(_hr); }

class CCustomRs :
   public CADORecordBinding
{
BEGIN_ADO_BINDING(CCustomRs)
   ADO_VARIABLE_LENGTH_ENTRY2(3, adVarChar, m_szau_fname,
         sizeof(m_szau_fname), lau_fnameStatus, false)
   ADO_VARIABLE_LENGTH_ENTRY2(2, adVarChar, m_szau_lname,
         sizeof(m_szau_lname), lau_lnameStatus, false)
   ADO_VARIABLE_LENGTH_ENTRY2(4, adVarChar, m_szphone,
         sizeof(m_szphone),    lphoneStatus,    true)
END_ADO_BINDING()

public:
   CHAR   m_szau_fname[22];
   ULONG   lau_fnameStatus;
   CHAR   m_szau_lname[42];
   ULONG   lau_lnameStatus;
   CHAR   m_szphone[14];
   ULONG   lphoneStatus;
};

VOID   main()         // Lernprogramm in VC
   {
   IADORecordBinding   *picRs = NULL;

   ::CoInitialize(NULL);

   try
      {
      _ConnectionPtr pConn("ADODB.Connection");
      _RecordsetPtr pRs("ADODB.Recordset");
      _CommandPtr pCmd("ADODB.Command");
      CCustomRs rs;

// Schritt 1: Eine Verbindung öffnen
      pConn->Open("dsn=Pubs;", "sa", "", adConnectUnspecified);

// Schritt 2: Einen Befehl erstellen
      pCmd->CommandText = "select * from Authors";
      pCmd->ActiveConnection = pConn;

// Schritt 3: Den Befehl ausführen
      pRs->CursorLocation = adUseClient;
      pRs->Open((IDispatch *) pCmd, vtMissing,
         adOpenStatic, adLockBatchOptimistic, adCmdUnspecified);

      TESTHR(pRs->QueryInterface(__uuidof(IADORecordBinding),
               (LPVOID*)&picRs));
      TESTHR(picRs->BindToRecordset(&rs));

// Schritt 4: Die Daten bearbeiten
      pRs->Fields->GetItem("au_lname")->Properties->GetItem("Optimize")->Value = true;
      pRs->Sort = "au_lname ASC";
      pRs->Filter = "phone LIKE '415 5*'";

      pRs->MoveFirst();
      while (VARIANT_FALSE == pRs->EndOfFile)
         {
         printf("Name: %s\t %s\tPhone: %s\n",
            (rs.lau_fnameStatus == adFldOK ? rs.m_szau_fname : ""),
            (rs.lau_lnameStatus == adFldOK ? rs.m_szau_lname : ""),
            (rs.lphoneStatus == adFldOK ? rs.m_szphone   : ""));

         if (rs.lphoneStatus == adFldOK)
            memcpy(rs.m_szphone, "777", 3);

         TESTHR(picRs->Update(&rs));   // Die Änderung zum Batch
                                       // hinzufügen

      // Die aktuelle Zeile des Recordsets ändern.
      // Recordsetdaten für die neue aktuelle Zeile werden automatisch
      // ausgelesen und in den Variablen der C++-Instanz CCustomRs
      // gespeichert.

         pRs->MoveNext();
         }

      pRs->Filter = (long) adFilterNone;

// Schritt 5: Die Daten aktualisieren
      pConn->BeginTrans();
      try
         {
         pRs->UpdateBatch(adAffectAll);

// Schritt 6, Teil A: Aktualisierung abschließen - Änderungen annehmen
         pConn->CommitTrans();
         }

// Schritt 6, Teil B: Aktualisierung abschließen - Änderungen ablehnen
      catch (_com_error &e)
         {
         dump_com_error(e);
         pRs->Filter = (long) adFilterConflictingRecords;
         pRs->MoveFirst();
         while (VARIANT_FALSE == pRs->EndOfFile)
            {
            printf("Conflict: Name = %s\t %s\n",
               (rs.lau_fnameStatus == adFldOK ? rs.m_szau_fname : ""),
               (rs.lau_lnameStatus == adFldOK ? rs.m_szau_lname : ""));
            pRs->MoveNext();
            }
         pConn->RollbackTrans();
         }

      if (picRs) picRs->Release();
      pRs->Close();
      pConn->Close();
      }

   catch (_com_error &e)
      {
      dump_com_error(e);
      }

   CoUninitialize();
   }

Hier endet die Visual C++-Übung.


Übungen zu ADO (Visual J++)

Hier finden Sie die Version der Übungen zu ADO, die unter Verwendung von Microsoft Visual J++ und der ADO/WFC-Klassen erstellt wurden. Das Thema Übungen zu ADO beschreibt den Zweck dieser Übungen im Einzelnen.

import com.ms.wfc.data.*;

/**
* ADO-Lernprogramm:
* Zweck: Verdeutlicht die Verwendung von ADO in Java.
*          Öffnet ein Recordset durch ein Befehlsobjekt
*          und erläutert Aktualisierungen innerhalb einer Transaktion.
*/
public class ADOTutorial
{
   // Verbindungszeichenfolge im ODBC-Format
   public static String strConn =
      "Driver={SQL Server};SERVER=YourServer;DATABASE=JetQA;" +
      "UID=testmod;PWD=testmod;";

   public static void main(String args[] )   // Lernprogramm in VJ
   {
      try
      {
         Connection conn = new Connection();
         Command cmd = new Command();
         Recordset rs = new Recordset();

         Field fld;
         AdoProperties fldProps;

// SCHRITT 1: Die Verbindung öffnen
         conn.open(strConn);

// SCHRITT 2: Einen Befehl erstellen
         cmd.setActiveConnection(conn);
         cmd.setCommandText("SELECT * from Authors");

// SCHRITT 3: Das Recordset mit der Quelle als Befehlsobjekt öffnen
         rs.setCursorLocation(AdoEnums.CursorLocation.CLIENT);
         rs.setCursorType(AdoEnums.CursorType.DYNAMIC);
         rs.setLockType(AdoEnums.LockType.BATCHOPTIMISTIC);
         rs.open (cmd);

// SCHRITT 4: Daten bearbeiten
         fldProps  = rs.getField("au_lname").getProperties();
         fldProps.getItem("Optimize").setBoolean(true);
         rs.setSort("au_lname");
         rs.setFilter("phone like '415 5*'");

         rs.moveFirst();
         while ( !rs.getEOF())
         {
            StringBuffer strBuf = new StringBuffer();
            System.out.println( " Name: " +
               rs.getField("au_fname").getString() +
               "  " + rs.getField("au_lname").getString() +
               "   Phone : " + rs.getField("phone").getString() );

            // Vorwahl 415 in 777 ändern.
            fld =  rs.getField("phone");
            strBuf.append( fld.getString());
            strBuf.setCharAt(0, '7');
            strBuf.setCharAt(1, '7');
            strBuf.setCharAt(2, '7');

            // Das Feld auf den neuen Wert festlegen
            fld.setString(strBuf.toString());

            rs.moveNext();
         }

         rs.setFilter(new Integer(AdoEnums.FilterGroup.NONE));

// SCHRITT 5: Die Daten aktualisieren
         conn.beginTrans();
         try
         {
            rs.updateBatch();

// SCHRITT 6 TEIL A: Die Aktualisierung abschließen - Änderungen annehmen
            conn.commitTrans();
         }

// SCHRITT 6 TEIL B: Die Aktualisierung abschließen - Änderungen ablehnen
         catch(AdoException ex)
         {
            rs.setFilter(new Integer
                        (AdoEnums.FilterGroup.CONFLICTINGRECORDS));
            rs.moveFirst();
            while(!rs.getEOF())
            {
               // Konfliktverursachende Datensätze drucken
               System.out.println("Conflict : Name : " +
                  rs.getField("au_fname").getString() + " " +
                  rs.getField("au_lname").getString() );
               rs.moveNext();
            }
            conn.rollbackTrans();
         }

         rs.close();
         conn.close();

      }
      catch(Exception ex)
      {
         ex.printStackTrace();
      }
   }
}

Hier endet die Visual J++-Übung.


Übersicht über RDS

Dieser Abschnitt enthält eine Reihe von Themen, die Sie in der vorgegebenen Reihenfolge durchgehen können. Folgende Themen werden erläutert:

  • Lösungen für Remotedatenzugriff

  • Das zugrunde liegende RDS-Programmiermodell

  • Das RDS-Programmiermodell im Detail

  • Das RDS-Programmiermodell mit Objekten

  • Das RDS-Objektmodell - Zusammenfassung

Dieser Abschnitt beinhaltet auch die RDS-Übung und ein RDS-Szenario, die demonstrieren, wie auf eine Datenquelle zugegriffen wird und wie sie aktualisiert wird, sowie eine Reihe von Themen, Verwendung von RDS genannt, in der weitere RDS-Themen diskutiert werden.

Weiter Lösungen für Remotedatenzugriff


Lösungen für Remotedatenzugriff

Die Frage

Mit ADO kann eine Anwendung direkt auf die Datenquelle zugreifen und sie verändern (dies wird auch Zwei-Ebenen-System genannt). Besteht die Verbindung z. B. zu der Datenquelle mit den zu bearbeitenden Daten, handelt es sich um eine direkte Verbindung in einem System mit zwei Ebenen.

Sie möchten jedoch vielleicht auch indirekt über einen Vermittler wie Microsoft Internet-Informationsdienste (Internet Information Services, IIS) auf Datenquellen zugreifen. Dieser Aufbau wird auch Drei-Ebenen-System genannt. IIS ist ein Client/Server-System, das eine effiziente Möglichkeit für eine lokale (oder Client-) Anwendung bietet, ein Remote- (oder Server-) Programm über das Internet oder ein Intranet aufzurufen. Das Serverprogramm kann auf die Datenquelle zugreifen und optional die abgerufenen Daten verarbeiten.

Ihre Intranet-Webseite enthält z. B. eine Anwendung in Microsoft Visual Basic Scripting Edition (VBScript), die eine Verbindung zu IIS aufbaut. IIS stellt wiederum eine Verbindung zur eigentlichen Datenquelle her, ruft die Daten ab und verarbeitet sie und gibt dann die verarbeiteten Daten an Ihre Anwendung zurück.

In diesem Beispiel hat Ihre Anwendung zu keinem Zeitpunkt eine direkte Verbindung zu der Datenquelle hergestellt, IIS war mit der Datenquelle verbunden. IIS hat über ADO auf die Daten zugegriffen.

Anmerkung Die Client/Server-Anwendung muss nicht auf dem Internet oder einem Intranet basieren (d. h. sie muss nicht webbasiert sein) - sie kann auch aus kompilierten Programmen auf einem LAN bestehen. In der Regel handelt es sich jedoch um eine webbasierte Anwendung.

Da einige grafische Steuerelemente, z. B. ein Tabellensteuerelement, Kontrollkästchen oder eine Liste, ggf. die zurückgegebenen Daten verwenden, muss die einfache Handhabung der zurückgegebenen Daten durch ein grafisches Steuerelement gewährleistet sein.

Sie möchten eine einfache und effiziente API (application programming interface; Schnittstelle für Anwendungsprogrammierung), die Drei-Ebenen-Systeme unterstützt und Daten so einfach zurückgibt wie bei einem Zwei-Ebenen-System. Remote Data Service (RDS) ist diese Schnittstelle.

Die Lösung

RDS definiert ein Programmiermodell - eine Folge von Aktivitäten, die für den Zugriff auf eine Datenquelle und die Aktualisierung derselben erforderlich ist - zum Zugriff auf Daten über einen Vermittler wie Internet-Informationsdienste (Internet Information Services, IIS). Das Programmiermodell fasst die gesamte Funktionalität von RDS zusammen.

Weiter Das zugrunde liegende RDS-Programmiermodell


Das zugrunde liegende RDS-Programmiermodell

RDS ist für Anwendungen in der folgenden Umgebung gedacht: Eine Clientanwendung gibt ein Programm an, das auf einem Server ausgeführt wird, und die Parameter, die für die Rückgabe der gewünschten Daten erforderlich sind. Das auf dem Server aufgerufene Programm greift auf die angegebene Datenquelle zu, ruft die Daten ab, verarbeitet die Daten optional und gibt die Ergebnisse an die Clientanwendung in einer einfach zu verwendenden Form zurück. RDS stellt die Mittel zur Verfügung, damit Sie die folgenden Aktivitäten nacheinander durchführen können:

  1. Angeben des Programms, das auf dem Server aufgerufen werden soll und Bereitstellen einer Möglichkeit, vom Client aus darauf zu verweisen. (Dieser Verweis wird auch Proxy genannt. Er stellt das Remote-Serverprogramm dar. Die Clientanwendung "ruft" den Proxy wie ein lokales Programm auf, es wird aber das Remote-Serverprogramm aufgerufen.)

  2. Aufrufen des Serverprogramms. Übergeben der Parameter an das Serverprogramm, das die Datenquelle und den auszugebenden Befehl erkennt. (Das Serverprogramm verwendet ADO, um auf die Datenquelle zuzugreifen. ADO baut mit einem der vorgegebenen Parameter eine Verbindung auf und gibt dann den im anderen Parameter angegebenen Befehl aus.)

  3. Das Serverprogramm erhält ein Recordset-Objekt von der Datenquelle. Optional wird das Recordset-Objekt auf dem Server verarbeitet.

  4. Das Serverprogramm gibt das erstellte Recordset-Objekt an die Clientanwendung zurück.

  5. Auf dem Client wird das Recordset-Objekt in ein Format umgewandelt, das von grafischen Steuerelementen auf einfache Art verwendet werden kann.

  6. Veränderungen am Recordset-Objekt werden an das Serverprogramm zurückgeschickt, die damit die Datenquelle aktualisieren.

Dieses Programmiermodell enthält bestimmte leicht handhabbare Features. Wenn Sie kein komplexes Serverprogramm für den Zugriff auf die Datenquelle verwenden und die erforderliche Verbindung und die Befehlsparameter zur Verfügung stellen, ruft RDS automatisch die angegebenen Daten mit einem einfachen Standardserverprogramm ab.

Wenn Sie jedoch eine komplexere Verarbeitung benötigen, können Sie Ihr eigenes benutzerdefiniertes Serverprogramm angeben. Da ein benutzerdefiniertes Serverprogramm alle Funktionen von ADO verwenden kann, kann es z. B. zu mehreren verschiedenen Datenquellen verbinden, ihre Daten in komplexer Form zusammenfassen und ein einfaches, verarbeitetes Ergebnis an die Clientanwendung zurückgeben.

Liegt Ihr Bedarf zwischen diesen beiden Möglichkeiten, können Sie mit ADO jetzt auch das Verhalten des Standardserverprogramms anpassen.

Weiter Das RDS-Programmiermodell im Detail


Das RDS-Programmiermodell im Detail

Die folgenden Elemente sind Schlüsselelemente des RDS-Programmiermodells:

  • RDS.DataSpace

  • RDSServer.DataFactory

  • RDS.DataControl

  • Ereignis

RDS.DataSpace

Die Clientanwendung muss den Server und das Serverprogramm angeben, das aufgerufen werden soll. Die Anwendung erhält daraufhin einen Verweis auf das Serverprogramm und behandelt den Verweis wie das Serverprogramm.

Das RDS-Objektmodell setzt diese Funktionalität mit dem RDS.DataSpace-Objekt um.

Das Serverprogramm wird mit einem Programmbezeichner bzw. einer ProgID angegeben. Der Server verwendet die ProgID und die Registrierung des Servercomputers, um nach dem zu startenden Programm zu suchen.

RDS unterscheidet intern, ob sich das Serverprogramm auf einem Remoteserver im Internet oder einem Intranet befindet, auf einem Server in einem LAN oder auf keinem Server, sondern in einer lokalen Dynamic Link Library (DLL). Durch diese Unterscheidung wird festgelegt, wie Daten zwischen Client und Server ausgetauscht werden, und es wird ein klarer Unterschied bei der Art des Verweises gemacht, der an die Clientanwendung zurückgegeben wird. Für Sie hat diese Unterscheidung jedoch keine große Bedeutung. Wichtig ist nur, dass Sie einen brauchbaren Programmverweis erhalten.

RDSServer.DataFactory

RDS stellt ein Standardserverprogramm zur Verfügung, das entweder eine SQL-Abfrage für die Datenquelle durchführen und ein Recordset-Objekt zurückgeben kann oder ein Recordset-Objekt benutzt und die Datenquelle aktualisiert.

Das RDS-Objektmodell setzt diese Funktionalität mit dem RDSServer.DataFactory-Objekt um.

Darüber hinaus hat das Objekt eine Methode zur Erstellung eines leeren Recordset-Objekts, das Sie programmgesteuert füllen können (CreateRecordset), und es verfügt über eine weitere Methode zum Konvertieren eines Recordset-Objekts in eine Textzeichenfolge zum Erstellen einer Webseite (ConvertToString).

Mit ADO können Sie Teile der Standardverbindung und des Befehlsverhaltens von RDSServer.DataFactory mit einem DataFactory-Handler und einer Anpassungsdatei überschreiben, die Verbindungs-, Befehls- und Sicherheitsparameter enthält.

Das Serverprogramm wird auch als Geschäftsobjekt bezeichnet. Sie können Ihr eigenes benutzerdefiniertes Geschäftsobjekt schreiben, das komplizierte Datenzugriffsoperationen, Gültigkeitsüberprüfungen und anderes mehr durchführen kann. Auch wenn Sie ein benutzerdefiniertes Geschäftsobjekt schreiben, können Sie die Instanz eines RDSServer.DataFactory-Objekts erstellen und einige seiner Methoden für Ihre eigenen Aufgaben verwenden.

RDS.DataControl

RDS stellt ein Mittel zur Verfügung, mit dem die Funktionalität von RDS.DataSpace und RDSServer.DataFactory kombiniert werden kann, und mit dem auch grafische Steuerelemente ermöglicht werden, mit denen ein durch eine Abfrage einer Datenquelle zurückgegebenes Recordset-Objekt einfach zu verwenden ist. Das Ziel von RDS liegt in den meisten Fällen darin, automatisch auf die Daten eines Servers zuzugreifen und diese in grafischen Steuerelementen anzuzeigen.

Das RDS-Objektmodell setzt diese Funktionalität mit dem RDS.DataControl-Objekt um.

RDS.DataControl hat zwei Aspekte. Ein Aspekt bezieht sich auf die Datenquelle. Wenn Sie die Connection- und Command-Eigenschaften von RDS.DataControl festlegen, wird automatisch RDS.DataSpace zum Erstellen eines Verweises auf das standardmäßige RDSServer.DataFactory-Objekt verwendet. Dann verwendet RDSServer.DataFactory den Wert der Connection-Eigenschaft für den Aufbau einer Verbindung zur Datenquelle und den Wert der Command-Eigenschaft, um ein Recordset-Objekt von der Datenquelle zu erhalten, und gibt schließlich das Recordset-Objekt an RDS.DataControl zurück.

Der zweite Aspekt bezieht sich auf die Anzeige der zurückgegebenen Daten des Recordset-Objekts in einem grafischen Steuerelement. Sie können das grafische Steuerelement mit RDS.DataControl verbinden (in einem Prozess mit dem Namen Bindung) und auf die Daten im verbundenen Recordset-Objekt zugreifen, wobei Abfrageergebnisse auf einer Webseite in Internet Explorer angezeigt werden. Jedes RDS.DataControl-Objekt bindet ein Recordset-Objekt, das die Ergebnisse einer einzelnen Abfrage darstellt, an ein oder mehrere grafische Steuerelemente (z. B. ein TextBox-, ein ComboBox-, ein Grid-Steuerelement usw.). Auf einer Seite können sich mehrere RDS.DataControl-Objekte befinden. Jedes RDS.DataControl-Objekt kann mit einer unterschiedlichen Datenquelle verbunden sein und die Ergebnisse einer anderen Abfrage enthalten.

Das RDS.DataControl-Objekt verfügt auch über eigene Methoden zum Bewegen durch die, Sortieren und Filtern der mit einem Recordset-Objekt verbundenen Zeilen. Diese Methoden sind ähnlich, jedoch nicht identisch mit den Methoden eines Recordset-Objekts von ADO.

Ereignisse

RDS unterstützt zwei eigene Ereignisse, die unabhängig vom ADO-Ereignismodell sind. Das onReadyStateChange-Ereignis wird immer dann aufgerufen, wenn sich die ReadyState-Eigenschaft von RDS.DataControl verändert, wodurch Sie benachrichtigt werden, wenn eine asynchrone Operation abgeschlossen, beendet oder fehlerhaft ist. Das onError-Ereignis wird bei jedem auftretenden Fehler aufgerufen, auch wenn der Fehler während einem asynchronen Vorgang auftritt.

Anmerkung Microsoft Internet Explorer stellt zwei zusätzliche Ereignisse für RDS zur Verfügung: onDataSetChanged (das Recordset-Objekt ist funktionsfähig, ruft aber noch Zeilen ab) und onDataSetComplete (das Recordset-Objekt hat das Abrufen von Zeilen abgeschlossen).

Weiter Das RDS-Programmiermodell mit Objekten


Das RDS-Programmiermodell mit Objekten

Das Ziel von RDS liegt darin, über einen Vermittler wie IIS auf Datenquellen zuzugreifen und diese zu aktualisieren. Das Programmiermodell gibt die Folge von Aktivi-täten an, die zum Erreichen dieses Ziels erforderlich ist. Das Objektmodell gibt die Objekte an, deren Methoden und Eigenschaften das Programmiermodell beeinflussen.

RDS stellt die Mittel für die Durchführung folgender Aktivitäten zur Verfügung:

  • Angeben des Programms, das auf dem Server aufgerufen werden soll, und Bereitstellen einer Möglichkeit (eines Proxys), um vom Client aus darauf verweisen zu können. (RDS.DataSpace)

  • Aufrufen des Serverprogramms. Übergeben der Parameter an das Serverprogramm, das die Datenquelle und den auszugebenden Befehl angibt. (Proxy oder RDS.DataControl)

  • Das Serverprogramm erhält ein Recordset-Objekt von der Datenquelle; dies geschieht in der Regel über ADO. Optional wird das Recordset-Objekt auf dem Server verarbeitet. (RDSServer.DataFactory)

  • Das Serverprogramm gibt das erstellte Recordset-Objekt an die Clientanwendung zurück. (Proxy)

  • Auf dem Client wird das Recordset-Objekt in ein Format umgewandelt, das von grafischen Steuerelementen auf einfache Art verwendet werden kann. (grafisches Steuerelement und RDS.DataControl)

  • Veränderungen am Recordset-Objekt werden an den Server zurückgeschickt und zur Aktualisierung der Datenquelle verwendet. (RDS.DataControl oder RDSServer.DataFactory)

Weiter Das RDS-Objektmodell - Zusammenfassung


Das RDS-Objektmodell - Zusammenfassung

Objekt | Beschreibung
RDS.DataSpace | Dieses Objekt enthält nur eine Methode, um einen Server-Proxy zu erhalten. Der Proxy kann das standardmäßige oder ein benutzerdefiniertes Serverprogramm (Geschäftsobjekt) sein. Das Serverprogramm kann im Internet, einem Intranet oder LAN aufgerufen werden, oder es kann eine lokale Dynamic Link Library sein.
RDSServer.DataFactory | Dieses Objekt stellt das Standardserverprogramm dar. Es führt den standardmäßigen RDS-Datenabruf und die Aktualisierung aus.
RDS.DataControl Dieses Objekt kann automatisch die Objekte RDS.DataSpace und RDSServer.DataFactory aufrufen.

Verwenden Sie dieses Objekt, um den standardmäßigen RDS-Datenabruf und die Aktualisierung aufzurufen.

Dieses Objekt stellt auch die Mittel zur Verfügung, um mit grafischen Steuerelementen auf das zurückgegebene Recordset-Objekt zuzugreifen.


Übungen zu RDS

In diesen Übungen wird erläutert, wie Sie mit dem RDS-Programmiermodell eine Datenquelle abfragen und aktualisieren können. Zuerst werden die Schritte beschrieben, die zur Erfüllung dieser Aufgabe erforderlich sind. Danach werden die Übungen jeweils für Microsoft Visual Basic Scripting Edition und Microsoft Visual J++ (mit ADO für Windows Foundation Classes, ADO/WFC) wiederholt.

Aus zwei Gründen werden die Übungen mit Code in verschiedenen Sprachen vorgestellt:

  • Bei der Dokumentation von RDS wird davon ausgegangen, dass in Visual Basic programmiert wird. Dadurch ist diese Dokumentation beim Programmieren in Visual Basic sehr nützlich, sie ist jedoch für diejenigen Programmierer wenig hilfreich, die mit anderen Sprachen arbeiten.

  • Wenn Sie sich bei einem bestimmten RDS-Feature unsicher sind und sich in einer anderen Sprache auskennen, können Sie Ihre Frage unter Umständen beantworten, indem Sie nachsehen, wie dieses Feature in einer anderen Sprache formuliert ist.

Präsentation der Übungen

Diese Übungen basieren auf dem RDS-Programmiermodell. Sie beschreiben jeden Schritt des Programmiermodells einzeln. Darüber hinaus wird jeder Schritt durch ein in Visual Basic geschriebenes Codefragment veranschaulicht.

Das Codebeispiel wird in anderen Sprachen wiederholt, ohne dass dies jedoch weiter erläutert wird. Jeder Schritt in einer programmiersprachenspezifischen Übung ist mit dem ihm entsprechenden Schritt in der Übung gekennzeichnet, die das Programmiermodell erläutert. Die Nummer des jeweiligen Schrittes dient als Verweis auf die zugehörige Darstellung in den Übungserläuterungen.

Das RDS-Programmiermodell ist im Folgenden dargestellt. Verwenden Sie es als Leitfaden, der Sie durch die Übungen führt.

Das RDS-Programmiermodell mit Objekten

  • Festlegen des Programms, das auf dem Server aufgerufen werden soll, und Bereitstellen einer Möglichkeit (eines Proxys), um vom Client aus darauf verweisen zu können.

  • Rufen Sie das Serverprogramm auf. Übergeben Sie Parameter an das Serverprogramm, die die Datenquelle und den auszugebenden Befehl bezeichnen.

  • Das Serverprogramm erhält von der Datenquelle ein Recordset-Objekt zurück; dies geschieht in der Regel über ADO. Optional wird das Recordset-Objekt auf dem Server verarbeitet.

  • Das Serverprogramm gibt das erstellte Recordset-Objekt an die Clientanwendung zurück.

  • Auf dem Client wird das Recordset-Objekt optional in ein Formular umgewandelt, das von grafischen Steuerelementen problemlos verwendet werden kann.

  • Änderungen am Recordset-Objekt werden an das Serverprogramm zurückgeschickt, das damit die Datenquelle aktualisiert.

Weiter Schritt 1: Festlegen eines Serverprogramms


Schritt 1: Festlegen eines Serverprogramms (Übungen zu RDS)

Der hier erläuterte Schritt ist grafisch hervorgehoben...

  • Geben Sie das Programm an, das auf dem Server aufgerufen werden soll, und bestimmen Sie einen Proxy.

  • Rufen Sie das Serverprogramm auf. Übergeben Sie Parameter an das Serverprogramm, die die Datenquelle und den auszugebenden Befehl bezeichnen.

  • Das Serverprogramm erhält von der Datenquelle ein Recordset-Objekt zurück; dies geschieht in der Regel über ADO.

  • Das Serverprogramm reicht das erstellte Recordset-Objekt an die Clientanwendung weiter.

  • Auf dem Client wird das Recordset-Objekt optional in ein Formular umgewandelt, das von grafischen Steuerelementen problemlos verwendet werden kann.

  • Änderungen am Recordset-Objekt werden an das Serverprogramm zurückgeschickt, das damit die Datenquelle aktualisiert.

Erläuterung

In den meisten Fällen können Sie die CreateObject-Methode des RDS.DataSpace-Objekts verwenden, um das Standardserverprogramm RDSServer.DataFactory oder ein benutzerdefiniertes Serverprogramm (Geschäftsobjekt) anzugeben. Ein Serverprogramm wird auf dem Server instanziiert und es wird ein Verweis auf das Serverprogramm oder den Proxy zurückgegeben.

In dieser Übung wird das Standardserverprogramm verwendet:

Sub RDSTutorial1()
   Dim DS as New RDS.DataSpace
   Dim DF as Object
   Set DF = DS.CreateObject("RDSServer.DataFactory", "http://yourServer")
...

Weiter Schritt 2: Aufrufen des Serverprogramms


Schritt 2: Aufrufen des Serverprogramms (Übungen zu RDS)

Der hier erläuterte Schritt ist grafisch hervorgehoben...

  • Geben Sie das Programm an, das auf dem Server aufgerufen werden soll, und bestimmen Sie einen Proxy.

  • Rufen Sie das Serverprogramm auf. Übergeben Sie Parameter an das Serverprogramm, die die Datenquelle und den auszugebenden Befehl bezeichnen.

  • Das Serverprogramm erhält von der Datenquelle ein Recordset-Objekt zurück; dies geschieht in der Regel über ADO.

  • Das Serverprogramm reicht das erstellte Recordset-Objekt an die Clientanwendung weiter.

  • Auf dem Client wird das Recordset-Objekt optional in ein Formular umgewandelt, das von grafischen Steuerelementen problemlos verwendet werden kann.

  • Änderungen am Recordset-Objekt werden an das Serverprogramm zurückgeschickt, das damit die Datenquelle aktualisiert.

Erläuterung

Wenn Sie eine Methode auf dem Client-Proxy aufrufen, führt das Programm auf dem Server die Methode aus. Bei diesem Schritt führen Sie eine Abfrage auf dem Server durch.

Teil A In dieser Übung soll RDSServer.DataFactory verwendet werden; anderenfalls ließe sich dieser Schritt am praktischsten mit dem RDS.DataControl-Objekt durchführen. Mit dem RDS.DataControl-Objekt kombinieren Sie den vorherigen Schritt, das Erstellen eines Proxy, und diesen Schritt, das Übermitteln der Abfrage.

Legen Sie die Server-Eigenschaft des RDS.DataControl-Objekts fest, um zu bestimmen, wo das Serverprogramm instanziiert werden soll, die Connect-Eigenschaft, um die Verbindungszeichenfolge für den Zugriff auf die Datenquelle anzugeben, und die SQL-Eigenschaft, um den Text des Abfragebefehls anzugeben. Rufen Sie dann die Refresh-Methode auf, damit das Serverprogramm eine Verbindung zur Datenquelle herstellt, die in der Abfrage angegebenen Zeilen abruft und ein Recordset-Objekt an den Client zurückgibt.

In dieser Übung wird das RDS.DataControl-Objekt nicht verwendet, anderenfalls würde der entsprechende Code folgendermaßen aussehen:

Sub RDSTutorial2A()
   Dim DC as New RDS.DataControl
   DC.Server = "http://yourServer"
   DC.Connect = "DSN=Pubs"
   DC.SQL = "SELECT * FROM Authors"
   DC.Refresh
...

Ebenso wenig wird in dieser Übung RDS mit ADO-Objekten aufgerufen; sonst sähe dies folgendermaßen aus:

Dim rs as New ADODB.Recordset
   rs.Open "SELECT * FROM Authors", "Provider=MS Remote;Data Source=Pubs;Remote Server=http://YourServer"

Teil B Im Allgemeinen wird dieser Schritt ausgeführt, indem die Query-Methode des RDSServer.DataFactory-Objekts aufgerufen wird. Diese Methode benötigt eine Verbindungszeichenfolge, die zum Aufbau einer Verbindung mit der Datenquelle verwendet wird, und Befehlstext, der zur Angabe der Zeilen verwendet wird, die von der Datenquelle zurückgegeben werden sollen.

Diese Übung bedient der Query-Methode des DataFactory-Objekts:

Sub RDSTutorial2B()
   Dim DS as New RDS.DataSpace
   Dim DF
   Dim RS as ADODB.Recordset
   Set DF = DS.CreateObject("RDSServer.DataFactory", "http://yourServer")
   Set RS = DF.Query ("DSN=Pubs", "SELECT * FROM Authors")
...

Weiter Schritt 3: Server erhält ein Recordset-Objekt


Schritt 3: Server erhält ein Recordset-Objekt (Übungen zu RDS)

Der hier erläuterte Schritt ist grafisch hervorgehoben...

  • Geben Sie das Programm an, das auf dem Server aufgerufen werden soll, und bestimmen Sie einen Proxy.

  • Rufen Sie das Serverprogramm auf. Übergeben Sie Parameter an das Serverprogramm, die die Datenquelle und den auszugebenden Befehl bezeichnen.

  • Das Serverprogramm erhält ein Recordset-Objekt von der Datenquelle; dies geschieht in der Regel über ADO.

  • Das Serverprogramm gibt das erstellte Recordset-Objekt an die Clientanwendung zurück.

  • Auf dem Client wird das Recordset-Objekt optional in ein Formular umgewandelt, das von grafischen Steuerelementen problemlos verwendet werden kann.

  • Änderungen am Recordset-Objekt werden an das Serverprogramm zurückgeschickt, das damit die Datenquelle aktualisiert.

Erläuterung

Das Serverprogramm verwendet die Verbindungszeichenfolge und den Befehlstext, um die Datenquelle nach den gewünschten Zeilen abzufragen. In der Regel wird ADO zum Abrufen des Recordset-Objekts verwendet, obwohl auch andere Microsoft-Schnittstellen für den Datenzugriff verwendet werden können, z. B. OLE DB. Eine detaillierte Beschreibung der Durchführung von Abfragen finden Sie in den Übungen zu ADO.

Ein benutzerdefiniertes Serverprogramm kann folgendermaßen aussehen:

Public Function ServerProgram(cn as String, qry as String) as Object
Dim rs as New ADODB.Recordset
   rs.CursorLocation = adUseClient
   rs.Open qry, cn
   rs.ActiveConnection = Nothing
   Set ServerProgram = rs
End Function

Weiter Schritt 4: Server gibt das Recordset-Objekt zurück


Schritt 4: Server gibt das Recordset-Objekt zurück (Übungen zu RDS)

Der hier erläuterte Schritt ist grafisch hervorgehoben...

  • Geben Sie das Programm an, das auf dem Server aufgerufen werden soll, und bestimmen Sie einen Proxy.

  • Rufen Sie das Serverprogramm auf. Übergeben Sie Parameter an das Serverprogramm, die die Datenquelle und den auszugebenden Befehl bezeichnen.

  • Das Serverprogramm erhält von der Datenquelle ein Recordset-Objekt zurück; dies geschieht in der Regel über ADO.

  • Das Serverprogramm reicht das erstellte Recordset-Objekt an die Clientanwendung weiter.

  • Auf dem Client wird das Recordset-Objekt optional in ein Formular umgewandelt, das von grafischen Steuerelementen problemlos verwendet werden kann.

  • Änderungen am Recordset-Objekt werden an das Serverprogramm zurückgeschickt, das damit die Datenquelle aktualisiert.

Erläuterung

RDS konvertiert das abgerufene Recordset-Objekt in ein Formular, das an den Client zurückgeschickt werden kann (Marshaling des Recordsets). Die exakte Form der Konvertierung und die Art der Versendung hängen davon ab, ob sich der Server im Internet, einem Intranet oder einem LAN befindet oder ob es sich um eine lokale DLL (Dynamic Link Library) handelt. Dieses Detail ist jedoch nicht von großer Bedeutung; Wichtig ist, dass RDS das Recordset-Objekt an den Client zurückschickt.

Auf der Client-Seite wird ein Recordset-Objekt empfangen und einer lokalen Variablen zugewiesen.

Sub RDSTutorial4()
   Dim DS as New RDS.DataSpace
   Dim RS as ADODB.Recordset
   Dim DF as Object
   Set DF = DS.CreateObject("RDSServer.DataFactory", "http://yourServer")
   Set RS = DF.Query("DSN=Pubs", "SELECT * FROM Authors")
...

Weiter Schritt 5: DataControl wird nutzbar gemacht


Schritt 5: DataControl wird nutzbar gemacht (Übungen zu RDS)

Der hier erläuterte Schritt ist grafisch hervorgehoben...

  • Geben Sie das Programm an, das auf dem Server aufgerufen werden soll, und bestimmen Sie einen Proxy.

  • Rufen Sie das Serverprogramm auf. Übergeben Sie Parameter an das Serverprogramm, die die Datenquelle und den auszugebenden Befehl bezeichnen.

  • Das Serverprogramm erhält von der Datenquelle ein Recordset-Objekt zurück; dies geschieht in der Regel über ADO.

  • Das Serverprogramm reicht das erstellte Recordset-Objekt an die Clientanwendung weiter.

  • Auf dem Client wird das Recordset-Objekt optional in ein Formular umgewandelt, das von grafischen Steuerelementen problemlos verwendet werden kann.

  • Änderungen am Recordset-Objekt werden an das Serverprogramm zurückgeschickt, das damit die Datenquelle aktualisiert.

Erläuterung

Das zurückgegebene Recordset-Objekt steht nun zur Verfügung. Sie können es wie jedes andere Recordset-Objekt durchsuchen, sich durch den Inhalt des Objekts bewegen oder ihn bearbeiten. Welche Funktionsmerkmale Ihnen mit dem Recordset zur Verfügung stehen, hängt von der verwendeten Entwicklungsumgebung ab. Visual Basic und Visual C++ verfügen über grafische Steuerelemente, die ein Recordset-Objekt direkt oder indirekt, d. h. mithilfe eines "aktivierenden" Daten-Steuerelements, verwenden können.

Wenn Sie z. B. eine Webseite mit Microsoft Internet Explorer anzeigen, möchten Sie unter Umständen die Daten des Recordset-Objekts in einem grafischen Steuerelement anzeigen. Grafische Steuerelemente auf einer Webseite können nicht direkt auf ein Recordset-Objekt zugreifen. Sie können aber über RDS.DataControl auf ein Recordset-Objekt zugreifen. RDS.DataControl kann über grafische Steuerelemente verwendet werden, wenn die SourceRecordset-Eigenschaft auf das Recordset-Objekt festgelegt ist.

Der DATASRC-Parameter des Objekts für das grafische Steuerelement muss auf RDS.DataControl festgelegt sein; und die DATAFLD-Eigenschaft muss auf ein Feld (eine Spalte) des Recordset-Objekts verweisen.

In dieser Übung wird die SourceRecordset-Eigenschaft festgelegt.

Sub RDSTutorial5()
   Dim DS as New RDS.DataSpace
   Dim RS as ADODB.Recordset
   Dim DC as New RDS.DataControl
   Dim DF as Object
   Set DF = DS.CreateObject("RDSServer.DataFactory", "http://yourServer")
   Set RS = DF.Query ("DSN=Pubs", "SELECT * FROM Authors")
   DC.SourceRecordset = RS            ' Visual-Steuerelemente können jetzt an
                                 ' DC gebunden werden.
...

Weiter Schritt 6: Änderungen werden an den Server gesendet


Schritt 6: Änderungen werden an den Server gesendet (Übungen zu RDS)

Der hier erläuterte Schritt ist grafisch hervorgehoben...

  • Geben Sie das Programm an, das auf dem Server aufgerufen werden soll, und bestimmen Sie einen Proxy.

  • Rufen Sie das Serverprogramm auf. Übergeben Sie Parameter an das Serverprogramm, die die Datenquelle und den auszugebenden Befehl bezeichnen.

  • Das Serverprogramm erhält von der Datenquelle ein Recordset-Objekt zurück; dies geschieht in der Regel über ADO.

  • Das Serverprogramm reicht das erstellte Recordset-Objekt an die Clientanwendung weiter.

  • Auf dem Client wird das Recordset-Objekt optional in ein Formular umgewandelt, das von grafischen Steuerelementen problemlos verwendet werden kann.

  • Änderungen am Recordset-Objekt werden an das Serverprogramm zurückgeschickt, das damit die Datenquelle aktualisiert.

Erläuterung

Nach der Bearbeitung eines Recordset-Objekts können alle Änderungen (d. h. Zeilen, die hinzugefügt, geändert oder gelöscht wurden) zurück an den Server geschickt werden.

Anmerkung Das Standardverhalten von RDS kann implizit mithilfe von ADO-Objekten und dem Microsoft OLE DB Remoting Provider aufgerufen werden. Abfragen können Recordsets zurückgeben und die Datenquelle kann mit bearbeiteten Recordsets aktualisiert werden. In dieser Übung wird RDS nicht mit ADO-Objekten aufgerufen; sonst sähe dies folgendermaßen aus:

Dim rs as New ADODB.Recordset
rs.Open "SELECT * FROM Authors", "Provider=MS Remote;Data Source=Pubs;Remote Server=http://YourServer"
...              ' Das Recordset bearbeiten
rs.UpdateBatch   ' Entspricht SubmitChanges
...

Teil A Nehmen Sie für diesen Fall an, dass nur RDS.DataControl verwendet worden ist und nun ein Recordset-Objekt mit RDS.DataControl verbunden ist. Mit der SubmitChanges-Methode wird die Datenquelle mit allen Änderungen des Recordset-Objekts aktualisiert, wenn die Eigenschaften Server und Connect immer noch festgelegt sind.

Sub RDSTutorial6A()
Dim DC as New RDS.DataControl
Dim RS as ADODB.Recordset
DC.Server = "http://yourServer"
DC.Connect = "DSN=Pubs"
DC.SQL = "SELECT * FROM Authors"
DC.Refresh
...
Set RS = DC.Recordset
   ' Das Recordset bearbeiten
...
DC.SubmitChanges
...

Teil B Alternativ könnten Sie den Server auch mit dem RDSServer.DataFactory-Objekt aktualisieren, indem Sie eine Verbindung und ein Recordset-Objekt angeben.

Sub RDSTutorial6B()
Dim DS As New RDS.DataSpace
Dim RS As ADODB.Recordset
Dim DC As New RDS.DataControl
Dim DF As Object
Dim blnStatus As Boolean
Set DF = DS.CreateObject("RDSServer.DataFactory", "http://yourServer")
Set RS = DF.Query ("DSN=Pubs", "SELECT * FROM Authors")
DC.SourceRecordset = RS    ' Visual-Steuerelemente können nun an DC
                           ' gebunden werden.
    ' Das Recordset bearbeiten
blnStatus = DF.SubmitChanges "DSN=Pubs", RS
End Sub

Hier endet die Übung.


Übungen zu RDS (VBScript)

Hier wird die Übung zu RDS noch einmal präsentiert, diesmal in Microsoft Visual Basic Scripting Edition. Das Thema Übungen zu RDS beschreibt den Zweck dieser Übung im Einzelnen.

In dieser Übung werden RDS.DataControl und RDS.DataSpace zur Entwurfszeit erstellt, d. h., sie werden über OBJECT-Tags wie den folgenden definiert: <OBJECT>...</OBJECT>. Alternativ könnten sie zur Laufzeit mit der Server.CreateObject-Methode erstellt werden. Das RDS.DataControl-Objekt könnte dann z. B. folgendermaßen erstellt werden:

Set DC = Server.CreateObject("RDS.DataControl")
    <!-- RDS.DataControl -->
    <OBJECT
        ID="DC1" CLASSID="CLSID:BD96C556-65A3-11D0-983A-00C04FC29E33">
    </OBJECT>

    <!-- RDS.DataSpace -->
    <OBJECT
        ID="DS1" WIDTH=1 HEIGHT=1
        CLASSID="CLSID:BD96C556-65A3-11D0-983A-00C04FC29E36">
    </OBJECT>

    <SCRIPT LANGUAGE="VBScript">

    Sub RDSTutorial()
    Dim DF1

Schritt 1 - Angeben eines Serverprogramms

VBScript kann den Namen des IIS-Webservers ermitteln, auf dem es ausgeführt wird, indem es auf die Request.ServerVariables-Methode von VBScript zugreift, die Active Server Pages zur Verfügung steht:

"http://<%=Request.ServerVariables("SERVER_NAME")%>"

In dieser Übung wird jedoch ein fiktiver Server namens "yourServer" verwendet.

Anmerkung Achten Sie auf den Datentyp der ByRef-Argumente. Bei VBScript können Sie den Variablentyp nicht angeben, also müssen Sie immer einen Datentyp Variant übergeben. Wenn Sie HTTP verwenden, können Sie bei RDS einen Datentyp Variant an eine Methode übergeben, die einen anderen Datentypen als Variant erwartet, wenn sie mit der CreateObject-Methode des RDS.DataSpace-Objekts aufgerufen wird. Wenn Sie DCOM oder einen prozessinternenen Server verwenden, müssen Sie die Parametertypen auf Client- und Serverseite aufeinander abstimmen, sonst erhalten Sie einen "Typen unverträglich"-Fehler.

Set DF1 = DS1.CreateObject("RDSServer.DataFactory", "http://yourServer")

Schritt 2a - Aufrufen des Serverprogramms mit RDS.DataControl

Dieses Beispiel ist nur ein Kommentar, der illustrieren soll, dass das Standardverhalten von RDS.DataControl gerade darin besteht, die angegebene Abfrage durchzuführen.

<OBJECT CLASSID="clsid:BD96C556-65A3-11D0-983A-00C04FC29E33" ID="DC1">
    <PARAM NAME="SQL" VALUE="SELECT * FROM Authors">
    <PARAM NAME="Connect" VALUE="DSN=Pubs;">
    <PARAM NAME="Server" VALUE="http://YourServer/">
</OBJECT>
...
<SCRIPT LANGUAGE="VBScript">

Sub RDSTutorial2A()
   Dim RS
   DC1.Refresh
   Set RS = DC1.Recordset
...

Schritt 2b - Aufrufen des Serverprogramms mit RDSServer.DataFactory

Schritt 3 - Server erhält ein Recordset-Objekt

Schritt 4 - Server gibt das Recordset-Objekt zurück

Set RS = DF1.Query("DSN=Pubs;", "SELECT * FROM Authors")

Schritt 5 - DataControl wird für grafische Steuerelemente nutzbar gemacht

' Das zurückgegebene Recordset an DataControl zuweisen.

DC1.SourceRecordset = RS

Schritt 6a - Änderungen werden mit RDS.DataControl an den Server gesendet

Dieses Beispiel ist nur ein Kommentar, der zeigen soll, wie RDS.DataControl Aktualisierungen durchführt.

<OBJECT CLASSID="clsid:BD96C556-65A3-11D0-983A-00C04FC29E33" ID="DC1">
    <PARAM NAME="SQL" VALUE="SELECT * FROM Authors">
    <PARAM NAME="Connect" VALUE="DSN=Pubs;">
    <PARAM NAME="Server" VALUE="http://YourServer/">
</OBJECT>
...
<SCRIPT LANGUAGE="VBScript">

Sub RDSTutorial6A()
Dim RS
DC1.Refresh
...
Set RS = DC1.Recordset
' Das Recordset-Objekt bearbeiten.
' Die SERVER- und die CONNECT-Eigenschaft sind von Schritt 2A bereits
' festgelegt.
Set DC1.SourceRecordset = RS
...
DC1.SubmitChanges

Schritt 6b - Änderungen werden mit RDSServer.DataFactory an den Server gesendet

DF.SubmitChanges "DSN=Pubs", RS

End Sub
</SCRIPT>
</BODY>
</HTML>

Hier endet die Übung.


Übungen zu RDS (VJ++)

ADO/WFC folgt dem RDS-Objektmodell insofern nicht ganz, als es das RDS.DataControl-Objekt nicht implementiert. ADO/WFC implementiert nur die Client-Klasse RDS.DataSpace.

Die DataSpace-Klasse implementiert eine einzige Methode namens CreateObject, die ein ObjectProxy -Objekt zurückgibt. Die DataSpace-Klasse implementiert außerdem die InternetTimeout-Eigenschaft.

Die ObjectProxy-Klasse implementiert eine Methode, die Call-Methode, die jedes serverbasiertes Geschäftsobjekt aufrufen kann.

Hier beginnt die Übung.

import com.ms.wfc.data.*;
public class RDSTutorial
{
    public void tutorial()
    {
// Schritt 1: Ein Serverprogramm angeben
        ObjectProxy obj =
            DataSpace.createObject(
                "RDSServer.DataFactory",
                "http://YourServer");

// Schritt 2: Der Server gibt ein Recordset zurück
        Recordset rs = (Recordset) obj.call(
                "Query",
                new Object[] {"DSN=Pubs;", "SELECT * FROM Authors"});

// Schritt 3: Änderungen werden an den Server gesendet
        ...                                // Recordset bearbeiten
        obj.call(
                "SubmitChanges",
                new Object[] {"DSN=Pubs;", rs});
        return;
    }
}

Hier endet die Übung.


RDS-Szenario

Die Beispielanwendung Address Book bietet ein Szenario, das Ihnen zeigt, wie Sie Remote Data Service (RDS) zum Aufbau einer einfachen, datenbezogenen Webanwendung - einem Online-Adressbuch für ein Unternehmen - verwenden können. Dieses Szenario ist für Programmierer von Nutzen, die mit Microsoft Visual Basic Scripting Edition (VBScript) und COM arbeiten und lernen möchten, wie datenbezogene ActiveX-Steuerelemente mit Remote Data Service verwendet werden. Es ist auch für erfahrenere Anwendungsentwickler von Interesse, die Daten verarbeitende Webanwendungen erstellen möchten.

In der Darstellung wird vorausgesetzt, dass Sie mit der Verwendung grundlegender HTML-Layout-Tags und dem Programmieren mit ActiveX-Steuerelementen vertraut sind.

Der vollständige Quelltext für die Beispielanwendung Address Book ist unter der Adresse <Laufwerk>:\Platform SDK\samples\dataaccess\rds\AddrBook\AddrBook.asp zu finden, sofern Platform SDK installiert worden ist. Wenn Sie das Beispiel anzeigen lassen möchten, geben Sie in Internet Explorer 4,0 die Adresse http://WebserverRDS/AddrBook/AddrBook.asp ein. Hierbei ist für Webserver der Namen des Windows NT 4.0-Webservers oder des Windows 2000-Webservers einzusetzen, der Internet-Informationsdienste (Internet Information Services, IIS) und ASP ausführt.

Einführung in Address Book

Bei der Beispielanwendung Address Book handelt es sich um ein Online-Adressbuch, mit dem Sie ein zum Durchsuchen geeignetes Verzeichnis im Intranet veröffentlichen können. Das Adressbuch ist so aufgebaut, dass ein Benutzer eine Suchzeichenfolge in eines oder mehrere Felder eingeben kann, um Daten über Angestellte abzufragen. Damit die wichtigsten Features von Remote Data Service demonstriert werden können, ist die Beispielanwendung absichtlich klein gehalten worden und verfügt über eine minimale Anzahl an Objekten und Suchfeldern.

Die Schnittstelle der Anwendung besteht aus den folgenden Teilen:

  • Ein nicht sichtbares RDS.DataControl-Datenbindungsobjekt, mit dem der Client eine Verbindung mit der Datenbank herstellt.

  • HTML-Textfelder, die als Felder für die Eingabe von als Suchkriterien verwendbaren Angestelltendaten dienen.

  • HTML-Befehlsschaltflächen für unterschiedliche Funktionen, z. B. das Erstellen von Abfragen, Löschen von Suchfeldern, Aktualisieren der Datenbank mit Angestelltendaten, Stornieren ausstehender Änderungen und Navigieren innerhalb der in Tabellenform angezeigten Datenzeilen.

  • DHTML-Datenbindung zur tabellarischen Anzeige von Daten, die von Abfragen zurückgegeben werden, die (über das RDS.DataControl-Datenbindungsobjekt) an eine Backend-Datenbank gerichtet wurden.

  • VBScript-Routinen, die die zuvor genannten Komponenten miteinander verbinden und deren Interaktion gewährleisten. Zusätzlicher VBScript-Code zur Initialisierung des RDS.DataControl-Objekts und dynamischen Erstellung der Spaltenüberschriften in der HTML-Tabelle aus den Namen der Recordset-Felder des RDS.DataControl-Objekts.

Arbeiten Sie der Reihe nach jeden Schritt durch (folgen Sie dabei den weiterführenden Links), um das Szenario vorzubereiten und die Beispielanwendung auszuführen, und um die Funktionsweise des Szenarios näher kennen zu lernen.

Weiter Systemanforderungen für die Anwendung Address Book


Systemanforderungen für die Anwendung Address Book

Wenn Sie die Beispielanwendung Address Book installieren möchten, müssen folgende Software- und Datenbankanforderungen erfüllt sein.

Softwareanforderungen

Für das Ausführen dieser Webanwendung müssen folgende Softwareanforderungen an den Servercomputer erfüllt sein:

  • Microsoft Windows NT® Server 4.0 (mit Service Pack 3 oder höher) oder Microsoft Windows® 2000 Server.

  • Microsoft Internet-Informationsdienste (IIS) 3.0 oder höher mit Active Server Pages.

Für das Ausführen dieser Webanwendung müssen folgende Softwareanforderungen an den Clientcomputer erfüllt sein:

  • Microsoft Internet Explorer 4.0 oder höher.

  • Microsoft Windows NT 4.0 (Workstation oder Server), Windows 2000 oder Microsoft Windows 98.

Datenbankanforderungen

Voraussetzung für die Funktionsfähigkeit dieses Beispiels ist Folgendes:

  • Ein funktionsfähiger Datenbankserver mit Microsoft SQL Server, Version 6.5 oder höher.

  • Schreibrechte, um die Datenbank anlegen und mit den Beispieldaten füllen zu können.

  • Überprüfung der Bestandsdaten mit dem Enterprise Manager oder den ISQL-Dienstprogrammen (die als Query Analyzer in SQL Server 7.0 verfügbar sind).

Wenn Sie keine Zugriffsrechte haben, muss der zuständige Datenbankadministrator das System für Sie einrichten und Ihnen Zugriffsrechte für die Datenbank geben oder die Datenbank für Sie einrichten.

Weiter Ausführen des SQL-Skripts für Address Book


Ausführen des SQL-Skripts für Address Book

Sie müssen entweder das ISQL/Query Analyzer-Befehlszeilendienstprogramm oder SQL Server Enterprise Manager verwenden, um das zur Anwendung gehörende SQL-Skript (Sampleemp.sql) auszuführen. Das Skript hat folgende Aufgaben:

  • Erstellen einer neuen Datenbank AddrBookDB auf dem Standardgerät.

  • Herstellen einer Verbindung mit der Datenbank AddrBookDB.

  • Erstellen einer Tabelle namens Employees.

  • Füllen der Tabelle mit Beispieldaten.

  • Starten einer einfachen SELECT-Anweisung, um den Bestand der Datenbanktabelle zu überprüfen.

  • Einrichten eines Benutzerkontos mit dem Namen "rdsdemo" und dem Kennwort "rdsdemo".

So führen Sie das Skript "Sampleemp.sql" aus

Unter Microsoft SQL Server 6,5:

  1. Klicken Sie auf Start, zeigen Sie auf Programme und dann auf Microsoft SQL Server 6,5. Klicken Sie auf SQL Enterprise Manager.

  2. Klicken Sie im Menü Extras auf den Befehl SQL-Abfrage.

  3. Klicken Sie auf die Schaltfläche SQL-Skript laden, und wechseln Sie zum Ordner C:\Platform SDK\Samples\DataAccess\RDS\AddrBook.

  4. Markieren Sie die Datei Sampleemp.sql. Klicken Sie auf Öffnen.

  5. Klicken Sie auf die Schaltfläche Abfrage ausführen (den grünen Pfeil auf der Symbolleiste).

  6. Nachdem die Option ausgeführt worden ist, schließen Sie die Fenster Abfrage und Enterprise Manager.

Unter Microsoft SQL Server 7.0:

  1. Klicken Sie auf Start, zeigen Sie auf Programme und dann auf Microsoft SQL Server 7.0. Klicken Sie auf Enterprise Manager.

  2. Vergewissern Sie sich, dass der SQL Server, den Sie verwenden möchten, in der Liste der registrierten Server in Enterprise Manager ausgewählt ist.

  3. Klicken Sie im Menü Extras auf den Befehl SQL Server Query Analyzer.

  4. Klicken Sie auf die Schaltfläche SQL-Skript laden (den offenen Ordner auf der Symbolleiste), und wechseln Sie zum Ordner C:\Platform SDK\Samples\DataAccess\RDS\AddrBook.

  5. Markieren Sie die Datei Sampleemp.sql. Klicken Sie auf Öffnen.

  6. Klicken Sie auf die Schaltfläche Abfrage ausführen (den grünen Pfeil auf der Symbolleiste) oder drücken Sie F5.

  7. Nachdem die Option ausgeführt worden ist, schließen Sie die Fenster Abfrage, Query Analyzer und SQL Server Enterprise Manager.

Weiter Ausführen der Beispielanwendung Address Book


Ausführen der Beispielanwendung Address Book

Befolgen Sie die folgende Anleitung, um die Anwendung Address Book auszuführen.

So führen Sie diese Anwendung aus

  1. Stellen Sie sicher, dass Microsoft SQL Server ausgeführt wird. Klicken Sie auf Start, zeigen Sie auf Programme, zeigen Sie auf Microsoft SQL Server 7.0, und klicken Sie dann auf Dienst-Manager. Erscheint im weißen Kreis ein grüner Pfeil, wird SQL Server ausgeführt. Klicken Sie andernfalls (wenn im weißen Kreis ein rotes Quadrat zu sehen ist) auf Starten/Fortsetzen.

  2. Geben Sie in Microsoft Internet Explorer 4.0 (oder höher) die folgende Adresse ein:

    http://Webserver/RDS/AddrBook/AddrBook.asp

    wobei Webserver der Name des Webservers ist, auf dem die RDS-Serverkomponenten installiert sind.

  3. Anschließend können Sie verschiedene Situationen mit der Beispielanwendung Address Book durchspielen. Sie können z. B. auf der Grundlage des E-Mail-Namens nach einer Person suchen, alle Mitarbeiter mit dem Titel "Program Manager" auflisten oder vorhandene Datensätze bearbeiten und aktualisieren. Klicken Sie auf Find, um die Datentabelle mit allen verfügbaren Namen zu füllen.

Weiter Das Datenbindungsobjekt von Address Book


Das Datenbindungsobjekt von Address Book

Die Anwendung Address Book verwendet das RDS.DataControl-Objekt, um Daten einer SQL Server-Datenbank an ein grafisches Objekt (in diesem Fall eine DHTML-Tabelle) in der clientbasierten HTML-Seite der Anwendung zu binden. Die ereignisgesteuerte VBScript-Programmlogik verwendet das RDS.DataControl-Objekt für folgende Aufgaben:

  • Abfragen der Datenbank, Senden von Aktualisierungen an die Datenbank und Aktualisieren der Datentabelle.

  • Bereitstellen der Funktionalität, die es Benutzer ermöglicht, zum ersten, nächsten, vorhergehenden oder letzten Datensatz in der Datentabelle zu springen.

Durch den folgenden Code wird die RDS.DataControl-Komponente definiert:

<OBJECT classid="clsid:BD96C556-65A3-11D0-983A-00C04FC29E33"
    ID=DC1 Width=1 Height=1>
    <PARAM NAME="SERVER" VALUE="http://<%=Request.ServerVariables("SERVER_NAME")%>">
    <PARAM NAME="CONNECT" VALUE="Provider=sqloledb;
Initial Catalog=AddrBookDb;User ID=adcdemo;Password=adcdemo;">
</OBJECT>

Durch das OBJECT-Tag wird die RDS.DataControl-Komponente im Programm definiert. Das Tag enthält zwei Arten von Parametern:

  • Parameter, die mit dem generischen OBJECT-Tag verbunden sind.

  • Parameter, die eigens dem RDS.DataControl-Objekt zugehörig sind.

Generische Parameter des OBJECT-Tags

In der folgenden Tabelle sind die mit dem OBJECT-Tag verknüpften Parameter beschrieben.

Parameter | Beschreibung
CLASSID | Eine eindeutige, 128 Bit umfassende Zahl, durch die dem System der Typ des eingebetteten Objekts angezeigt wird. Dieser Bezeichner wird in der Systemregistrierung des lokalen Computers verwaltet. (Informationen über die Klassenbezeichner des RDS.DataControl-Objekts finden Sie unter dem Thema RDS.DataControl-Objekt.)
ID | Definiert einen für das gesamte Dokument gültigen Bezeichner für das eingebettete Objekt, der zur Identifizierung des Objekts im Code verwendet wird.

Tag-Parameter von RDS.DataControl

In der folgenden Tabelle sind die Parameter beschrieben, die für das RDS.DataControl-Objekt spezifisch sind. (Eine vollständige Liste der Parameter des RDS.DataControl-Objekts und Informationen darüber, wann sie implementiert werden müssen, finden Sie unter dem Thema RDS.DataControl-Objekt.)

Parameter | Beschreibung
SERVER | Bei Verwendung von HTTP ist der Wert der Name des Servercomputers, dem das Präfix HTTP:// vorangestellt ist.
CONNECT | Stellt die Verbindungsdaten bereit, die das RDS.DataControl-Objekt benötigt, um eine Verbindung mit SQL Server herzustellen.
SQL | Legt die Abfragezeichenfolge fest, die zum Abrufen des Recordset-Objekts verwendet wird, oder gibt diese Zeichenfolge zurück.

Next Befehlsschaltflächen von Address Book


Befehlsschaltflächen von Address Book

Die Anwendung Address Book beinhaltet die folgenden Befehlsschaltflächen:

  • Die Schaltfläche Find zum Übertragen einer Abfrage zur Datenbank.

  • Die Schaltfläche Clear zum Löschen der Textfelder, bevor mit einer neuen Suche begonnen wird.

  • Die Schaltfläche Update Profile zum Speichern der Änderungen an Angestelltendatensätzen.

  • Die Schaltfläche Cancel Changes zum Verwerfen von Änderungen.

Find (Schaltfläche)

Durch Klicken auf die Schaltfläche Find wird die VBScript-Prozedur Find_OnClick aufgerufen, die eine SQL-Abfrage erstellt und übermittelt. Durch Klicken auf diese Schaltfläche wird die Datentabelle aufgefüllt.

Erstellen der SQL-Abfrage

Durch den ersten Teil der Find_OnClick-Prozedur wird die SQL-Abfrage Ausdruck für Ausdruck erstellt, indem Textzeichenfolgen an eine globale SQL SELECT-Anweisung angehängt werden. Zunächst wird der Variablen myQuery der Text einer SQL SELECT-Anweisung zugewiesen, die alle Datenzeilen der Datenquellentabelle abfragt. Danach durchsucht die Prozedur jedes der vier Eingabefelder von Address Book.

Da das Programm den Operator like beim Erstellen der SQL-Anweisungen verwendet, handelt es sich bei den Abfragen eher um die Suche nach Teilzeichenfolgen als um exakte Übereinstimmungen.

Wenn z. B. das Feld Last Name den Eintrag "Berge" und das Feld Title den Eintrag "Program Manager" enthält, sieht die SQL-Anweisung (Wert von myQuery) folgendermaßen aus:

Select FirstName, LastName, Title, Email, Building, Room, Phone from Employee where lastname like 'Berge%' and title like 'Program Manager%'

War die Abfrage erfolgreich, werden alle Personen in der HTML-Datentabelle angezeigt, deren Nachname den Text "Berge" enthält (z. B. Berge und Berger) und deren Titel die Wörter "Program Manager" enthält (z. B. Program Manager, Advanced Technologies).

Vorbereiten und Senden einer Abfrage

Der letzte Teil der Find_OnClick-Prozedur besteht aus zwei Anweisungen. Die erste Anweisung weist der SQL-Abfrageeigenschaft des RDS.DataControl-Objekts die dynamisch erstellte SQL-Abfrage zu. Durch die zweite Anweisung fragt das RDS.DataControl-Objekt (DC1) die Datenbank ab und zeigt dann die neuen Ergebnisse der Abfrage in der Tabelle an.

Sub Find_OnClick
    '...
    DC1.SQL = myQuery
    DC1.Refresh
End Sub

Update Profile (Schaltfläche)

Durch Klicken auf die Schaltfläche Update Profile wird die VBScript-Prozedur Update_OnClick aufgerufen, die die Methoden SubmitChanges und Refresh des RDS.DataControl-Objekts (DC1) ausführt.

Sub Update_OnClick
    DC1.SubmitChanges
    DC1.Refresh
End Sub

Wird DC1.SubmitChanges ausgeführt, erstellt Remote Data Service aus allen Aktualisierungsinformationen ein Paket und sendet dieses über HTTP an den Server. Die Aktualisierung erfolgt als Ganzes oder gar nicht. Ist die Aktualisierung teilweise nicht erfolgreich, wird keine der Änderungen durchgeführt und eine Statusmeldung zurückgegeben. Ein Aufruf von DC1.Refresh nach dem Aufruf von SubmitChanges ist im Kontext von Remote Data Service nicht erforderlich, aber auf diese Weise kann sichergestellt werden, dass die Daten aktualisiert worden sind.

Cancel Changes (Schaltfläche)

Durch Klicken auf Cancel Changes wird die VBScript-Prozedur Cancel_OnClick ausgelöst, die die CancelUpdate-Methode des RDS.DataControl-Objekts (DC1) ausführt.

Sub Cancel_OnClick
    DC1.CancelUpdate
End Sub

Durch Ausführen von DC1.CancelUpdate werden alle Veränderungen verworfen, die der Benutzer an einem Angestelltendatensatz in der Datentabelle seit der letzten Abfrage oder Aktualisierung durchgeführt hat. Die ursprünglichen Werte werden wiederhergestellt.

Weiter Address Book-Navigationsschaltflächen


Address Book-Navigationsschaltflächen

In der Anwendung Address Book werden die Navigationsschaltflächen unten auf der Webseite angezeigt. Sie können sich mit den Navigationsschaltflächen durch die Daten in der HTML-Tabellenanzeige bewegen, indem Sie entweder die erste oder letzte Datenzeile oder Zeilen markieren, die neben der aktuellen Auswahl liegen.

Prozeduren zum Navigieren durch Daten

Die Anwendung Address Book enthält verschiedene Prozeduren, die es dem Benutzer ermöglichen, auf die Schaltflächen First, Next, Previous und Last zu klicken, um sich auf diese Weise durch die Daten zu bewegen.

Beispielsweise aktiviert das Klicken auf die Schaltfläche First die VBScript-Prozedur First_OnClick. Diese Prozedur ruft die MoveFirst-Methode auf, die die erste Datenzeile zur aktuellen Auswahl bestimmt. Durch Klicken auf die Schaltfläche Last wird die Last_OnClick–Prozedur aktiviert, die ihrerseits die MoveLast-Methode aufruft, mit der die letzte Datenzeile zur aktuellen Auswahl wird. Die anderen Navigationsschaltflächen funktionieren ähnlich.

' Zum ersten Datensatz im gebundenen Recordset bewegen.
Sub First_OnClick
    DC1.Recordset.MoveFirst
End Sub

' Von der aktuellen Position im gebundenen Recordset zum nächsten
' Datensatz bewegen.
Sub Next_OnClick
    If Not DC1.Recordset.EOF Then    ' Bewegen über letzten Datensatz
                                    ' hinaus nicht möglich.
        DC1.Recordset.MoveNext
        Exit Sub
    End If
End Sub

' Von der aktuellen Position im gebundenen Recordset zum vorhergehenden
' Datensatz bewegen.
Sub Prev_OnClick
    If Not DC1.Recordset.BOF Then    ' Bewegen über ersten Datensatz
                                    ' hinaus nicht möglich.
        DC1.Recordset.MovePrevious
        Exit Sub
    End If
End Sub

' Zum letzten Datensatz im gebundenen Recordset bewegen.
Sub Last_OnClick
    DC1.Recordset.MoveLast
End Sub


Verwenden von RDS

Verwenden Sie die Informationen in diesem Abschnitt zum Einrichten des Servers und zum schnellen Einsetzen von RDS. Diese Informationen enthalten spezielle Konfigurationsschritte, die Sie bei der Implementierung von RDS möglicherweise durchführen müssen, beschreiben einige der wichtigsten Beziehungen zwischen RDS und anderen Technologien und helfen Ihnen, Lösungen für Probleme zu finden, die sich beim Einrichten einer RDS-Lösung ergeben können.

Dieser Abschnitt enthält Informationen zu den folgenden Themen:

  • Konfigurieren von RDS

  • Verwenden von verwandten Technologien mit RDS

  • Problembehandlung von RDS


Konfigurieren von RDS

Für eine effiziente Implementierung von RDS sollten Sie mit den unterschiedlichen Konfigurationen, die Ihnen zur Verfügung stehen, vertraut sein. Dieser Abschnitt enthält wichtige Informationen zur Sicherheit und Skalierbarkeit bei der Implementierung von RDS. Weitere Informationen zum Konfigurieren von Computern für die Verwendung von RDS finden Sie unter den folgenden Themen:

  • Gewähren von Gastprivilegien für einen Webserver

  • Registrieren eines benutzerdefinierten Geschäftsobjekts

  • Kennzeichnen von Geschäftsobjekten als "Sicher für Skripterstellung"

  • Registrieren von Geschäftsobjekten auf dem Client zur Verwendung mit DCOM

  • Festlegen eines DCOM Stream Marshaling-Formats

  • Ausführen einer DLL in DCOM

  • Konfigurieren von virtuellen Servern auf IIS

  • Angeben der Anzahl von Threads pro Prozessor auf IIS

  • Sichern von RDS-Anwendungen

  • Konfigurieren von DataFactory für abgesicherten oder unbeschränkten Modus


Gewähren von Gastprivilegien für einen Webserver

Das anonyme Webserverkonto (IUSR_ComputerName) muss zur lokalen Gruppe Gäste auf dem Webserver hinzugefügt werden, damit RDS verwendet werden kann.

So gewähren Sie Gastprivilegien für einen Webserver

  1. Klicken Sie auf dem Windows 2000-Server auf Start, zeigen Sie auf Programme, zeigen Sie auf Verwaltung, und klicken Sie dann auf Computerverwaltung.

  2. Klicken Sie in der Konsolenstruktur unter Lokale Benutzer und Gruppen auf Gruppen.

  3. Wählen Sie die lokale Gruppe Gäste aus. Klicken Sie im Menü Vorgang auf Eigenschaften.

  4. Klicken Sie im Dialogfeld Eigenschaften von Gäste auf der Registerkarte Mitglieder auf Hinzufügen.

  5. Wird der anonyme Webserver nicht auf der Liste im Dialogfeld Benutzer oder Gruppen auswählen angezeigt, geben Sie den entsprechenden Namen (IUSR_ComputerName) in das leere Feld unten ein, und klicken Sie auf Hinzufügen.

  6. Klicken Sie auf OK.


Registrieren eines benutzerdefinierten Geschäftsobjekts

Um ein benutzerdefiniertes Geschäftsobjekt (DLL oder EXE) erfolgreich über den Webserver zu starten, muss die Programm-ID des Geschäftsobjekts wie in diesem Verfahren erklärt in die Registrierung eingegeben werden. Dieses RDS-Feature dient der Sicherheit Ihres Webservers, da nur zuvor überprüfte ausführbare Dateien gestartet werden können.

Anmerkung Bei MDAC 2.0 und höher erfolgt während der Installation von MDAC keine standardmäßige Registrierung des Standardgeschäftsobjekts RDSServer.DataFactory. War jedoch RDSServer.DataFactory vor der Installation als sicher für die Ausführung auf dem Computer registriert, wird der Registrierungseintrag für die neue Installation beibehalten.

So registrieren Sie ein benutzerdefiniertes Geschäftsobjekt

  1. Klicken Sie auf Start und anschließend auf Ausführen.

  2. Geben Sie Regedit ein, und klicken Sie auf OK.

  3. Gehen Sie im Registrierungs-Editor zum Registrierungsschlüssel HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W3SVC\Parameters\ADCLaunch.

  4. Wählen Sie den Schlüssel ADCLaunch aus, zeigen Sie im Menü Bearbeiten auf Neu, und klicken Sie auf Schlüssel.

  5. Geben Sie die Programm-ID des benutzerdefinierten Geschäftsobjekts ein, und drücken Sie dann die EINGABETASTE. Lassen Sie den Eintrag Wert leer.


Kennzeichnen von Geschäftsobjekten als "Sicher für Skripterstellung"

Um eine sichere Internetumgebung zu gewährleisten, müssen Sie jedes Geschäftsobjekt, das mit der CreateObject-Methode eines RDS.DataSpace-Objekts instanziiert wurde, als "Sicher für Skripterstellung" kennzeichnen. Sie müssen sicherstellen, dass eine derartige Kennzeichnung im Lizenzbereich der Systemregistrierung vorliegt, bevor Sie diese Objekte in DCOM verwenden.

Um die Geschäftsobjekte manuell als "Sicher für Skripterstellung" zu kennzeichnen, erstellen Sie eine Textdatei mit der Erweiterung REG, die den folgenden Text enthält. Durch die folgenden zwei Zahlen wird das Feature "Sicher für Skripterstellung" aktiviert:

[HKEY_CLASSES_ROOT\CLSID\<MyActiveXGUID>\Implemented
Categories\{7DD95801-9882-11CF-9FA9-00AA006C42C4}]
[HKEY_CLASSES_ROOT\CLSID\<MyActiveXGUID>\Implemented
Categories\{7DD95802-9882-11CF-9FA9-00AA006C42C4}]

wobei <MyActiveXGUID> die hexadezimale GUID-Nummer des Geschäftsobjekts ist. Speichern Sie sie und fügen sie in die Registrierung ein, indem Sie den Registrierungs-Editor verwenden oder auf die REG-Datei in Windows Explorer doppelklicken.

Geschäftsobjekte, die in Microsoft Visual Basic erstellt wurden, können mithilfe des Assistenten zum Packen und Verteilen automatisch als "Sicher für Skripterstellung" gekennzeichnet werden. Wenn der Assistent Sie zur Angabe von Sicherheitseinstellungen auffordert, aktivieren Sie Sicher für Initialisierung und Sicher für Skripterstellung.

Im letzten Schritt erstellt der Anwendungs-Assistent je eine HTM- und CAB-Datei. Anschließend können Sie die beiden Dateien auf den Zielcomputer kopieren und auf die HTM-Datei doppelklicken, um die Seite zu laden und den Server richtig zu registrieren.

Da das Geschäftsobjekt standardmäßig im Verzeichnis Windows\System32\Occache installiert wird, müssen Sie es in das Verzeichnis Windows\System32 verschieben und den Registrierungsschlüssel HKEY_CLASSES_ROOT\CLSID\<MyActiveXGUID>\InprocServer32 ändern, damit der Pfad richtig ist.


Registrieren von Geschäftsobjekten auf dem Client zur Verwendung mit DCOM

Bei benutzerdefinierten Geschäftsobjekten muss sichergestellt sein, dass die Clientseite dem Programmnamen (Programm-ID) einen über DCOM verwendbaren Klassenbezeichner (CLSID) zuordnet. Aus diesem Grund muss sich die Programm-ID des DCOM-Objekts in der clientseitigen Registrierung befinden und mit dem Klassenbezeichner des serverbasierten Geschäftsobjekts übereinstimmen. Bei den anderen unterstützten Protokollen (HTTP, HTTPS und prozessintern) ist dies nicht erforderlich.

Wenn Sie beispielsweise ein serverbasiertes Geschäftsobjekt mit dem Namen "MyBObj" mit einem bestimmten Klassenbezeichner, wie z. B. "{00112233-4455-6677-8899-00AABBCCDDEE}", anzeigen möchten, sollten Sie sicherstellen, dass die folgenden Einträge in die Registrierung auf der Clientseite eingefügt werden:

[HKEY_CLASSES_ROOT]
\MyBObj
    \Clsid
    (Default) "{00112233-4455-6677-8899-00AABBCCDDEE}"


Festlegen eines DCOM Stream Marshaling-Formats

Ein Clientcomputer, der Komponenten aus RDS 1.5 oder früheren Versionen verwendet, ist nicht mit einem Server kompatibel, der Komponenten aus RDS 2.0 oder höher verwendet. Bei Verwendung von DCOM als zugrunde liegendes Protokoll ist die Unterstützung für RDS 2.0 oder höher beim Transportieren von Recordset-Objekten effektiver. Führt Ihr Client Komponenten aus RDS 1.5 oder früheren Versionen aus, können Sie den Server so einrichten, dass er mit der früheren RDS-Unterstützung (RDS 1.0 genannt) oder der neueren RDS-Unterstützung (RDS 2.0 genannt) arbeitet. Legen Sie einen der folgenden Registrierungseinträge fest:

[HKEY_CLASSES_ROOT]
\CLSID
    \[58ECEE30-E715-11CF-B0E3-00AA003F000F}
        \ADTGOptions]"MarshalFormat"="RDS10"

- oder -

[HKEY_CLASSES_ROOT]
\CLSID
    \[58ECEE30-E715-11CF-B0E3-00AA003F000F}
        \ADTGOptions]"MarshalFormat"="RDS20"


Ausführen einer DLL in DCOM

In den folgenden Schritten erfahren Sie, wie Sie einer Geschäftsobjekt -DLL ermöglichen, sowohl DCOM als auch Microsoft Internet-Informationsdienste (HTTP) über Komponentendienste zu verwenden.

  1. Erstellen Sie ein neues leeres Paket im MMC-Snap-In Komponentendienste.

    Mit dem MMC-Snap-In Komponentendienste können Sie ein Paket erstellen und die DLL zu diesem Paket hinzufügen. Dadurch kann auf die DLL über DCOM zugegriffen werden, wobei jedoch die Zugriffsmöglichkeit über IIS deaktiviert wird. (Wenn Sie in der Registrierung nach der DLL suchen, verfügt der Inproc-Schlüssel nun über keinen Wert; durch Festlegen des Aktivierungsattributs, das weiter unten in diesem Hilfethema erklärt wird, wird ein Wert zum Inproc-Schlüssel hinzugefügt.)

  2. Installieren Sie ein Geschäftsobjekt in diesem Paket,

    - oder -

    importieren Sie das RDSServer.DataFactory-Objekt in das Paket.

  3. Legen Sie das Aktivierungsattribut für das Paket auf Komponenten werden im Erstellerprozess aktiviert (Bibliotheksanwendung) fest.

    Damit DCOM und IIS auf demselben Computer auf die DLL zugreifen können, müssen Sie das Aktivierungsattribut der Komponente im MMC-Snap-In Komponentendienste festlegen. Nachdem Sie das Attribut auf Komponenten werden im Erstellerprozess aktiviert eingestellt haben, werden Sie bemerken, dass ein Inproc-Serverschlüsssel in der Registrierung hinzugefügt wurde, der auf eine Ersatz-DLL von Komponentendienste zeigt.

    Siehe auch Weitere Informationen zu Komponentendienste (oder, falls Sie Windows NT verwenden, zu Microsoft Transaction Server) und zum Durchführen der entsprechenden Schritte finden Sie in der Dokumentation zu Komponentendienste bzw. in der Transaction Server-Website unter http://www.microsoft.com/germany/backoffice/infoserver/transaction4.htm.


Konfigurieren von virtuellen Servern auf IIS

Beim Erstellen von virtuellen Servern in Internet-Informationsdienste 4.0 sind die zwei folgenden zusätzlichen Schritte erforderlich, um den virtuellen Server für das Zusammenwirken mit RDS zu konfigurieren:

  1. Aktivieren Sie beim Einrichten des Servers die Option Zugriff zur Ausführung erlauben.

  2. Verschieben Sie die Datei msadcs.dll in das Verzeichnis vStamm\msadc, wobei vStamm das Stammverzeichnis Ihres virtuellen Servers ist.


Angeben der Anzahl von Threads pro Prozessor auf IIS

Bei der Verwendung von RDS mit Internet-Informationsdienste (IIS) 4.0 oder höher kann die Anzahl der Threads, die pro Prozessor erstellt werden, durch Bearbeiten der Registrierung auf dem Webserver gesteuert werden. Die Anzahl der Threads pro Prozessor kann die Leistung in Zeiten hohen Datenverkehrs oder in Situationen mit geringem Datenverkehr, aber großen Abfragen, beeinflussen. Das optimale Ergebnis lässt sich am besten durch Ausprobieren ermitteln.

Die verwendete Methode zum Festlegen und Ändern des Standardwerts für diese Einstellung hängt von der Konfiguration des IIS 4.0-Servers ab.

Ist MDAC 2.1.2.4202.3 (GA) oder höher auf dem IIS-Server installiert, wird von RDS derselbe Komponentendienste (bzw. Microsoft Transaction Server, falls Sie Windows NT verwenden)-Threadpool verwendet wie bei ASP-Skripts. Der Standardwert für die Anzahl von Threads je Prozessor beträgt 10. Zum Ändern des Standards müssen Sie zur Serverregistrierung folgenden Schlüssel hinzufügen:

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\InetInfo\Parameters\MaxPoolThreads

wobei es sich bei MaxPoolThreads um einen REG_DWORD-Wert handelt. MaxPoolThreads erscheint nicht in der Registrierung, außer es wird eigens hinzugefügt. Gültige Werte bewegen sich im Bereich von 5 bis zum empfohlenen Maximum von 20. Ist der durch den Registrierungsschlüssel angegebene Wert größer als der des Schlüssels PoolThreadLimit (der sich auf demselben Pfad befindet), wird PoolThreadLimit verwendet.

Alternativ beträgt der Standardwert für die Anzahl von Threads je Prozessor 6, falls MDAC 2.1 2.1.1.3711.11 (GA) oder früher auf dem IIS-Server installiert ist. Zum Ändern des Standards müssen Sie zur Registrierung des IIS-Servers folgenden Schlüssel hinzufügen:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W3SVC\Parameters\ADCThreads

wobei es sich bei ADCThreads um ein REG_DWORD handelt. ADCThreads erscheint nicht in der Registrierung, außer es wird eigens hinzugefügt. Der Bereich der gültigen Werte liegt zwischen 1 und 50. Liegt der durch den Registrierungsschlüssel angegebene Wert über 50, wird stattdessen der Höchstwert (50) verwendet.


Sichern von RDS-Anwendungen

Microsoft Internet Explorer-Sicherheitsfragen

Dadurch, dass zu Microsoft Internet Explorer verbesserte Sicherheitsfunktionen hinzugefügt wurden, sind einige ADO- und RDS-Objekte auf die Ausführung in einer "sicheren" Umgebung beschränkt. Sie müssen sich dieser Problematik bewusst sein, bei der verschiedene Zonen, Sicherheitsstufen, beschränktes Verhalten, unsichere Vorgänge und benutzerdefinierte Sicherheitseinstellungen eine Rolle spielen.

Weitere Informationen zu diesen Problemen finden Sie unter "ADO und RDS - Sicherheitsfragen in Microsoft Internet Explorer" unter ActiveX Data Objects (ADO) Technical Articles in Microsoft Data Access Technical Articles.

Sicherheit des Webservers

Wenn Sie das RDSServer.DataFactory-Objekt auf dem Internetwebserver verwenden, sollten Sie das potenzielle Sicherheitsrisiko beachten. Externe Benutzer können unter Verwendung eines gültigen Datenquellennamens (DSN), einer Benutzer-ID und eines Kennworts Webseiten erstellen, mit denen sie beliebige Abfragen an die Datenquelle senden können. Wenn Sie den Zugriff auf eine Datenquelle weiter einschränken möchten, können Sie das RDSServer.DataFactory-Objekt (msadcf.dll) aus der Registrierung entfernen sowie von der Festplatte löschen und stattdessen benutzerdefinierte Geschäftsobjekte mit hartcodierten Abfragen verwenden.

Weitere Informationen zu Sicherheitsfragen im Zusammenhang mit der Verwendung des RDSServer.Datafactory-Objekts finden Sie im Microsoft Security Bulletin MS99-025 in der Microsoft Security-Website unter http://www.microsoft.com/security/default.asp.

Clientidentitätswechsel und Sicherheit

Wenn die Password Authentication-Eigenschaft für den IIS-Webserver auf die Authentifizierung Windows NT-Herausforderung/Rückmeldung (bei Windows NT 4.0) oder auf Integrierte Windows-Authentifizierung (bei Windows 2000) festgelegt ist, werden die Geschäftsobjekte im Sicherheitskontext des Clients aufgerufen. Hierbei handelt es sich um ein neues Feature in RDS 1.5, mit dem ein Clientidentitätswechsel (Client Impersonation) über HTTP möglich ist. Beim Verwenden dieses Modus geschieht das Anmelden beim Webserver (IIS) nicht anonym, sondern es werden die Benutzer-ID und das Kennwort des Clientcomputers verwendet. Sind die ODBC-DSNs so eingerichtet, dass Vertraute Verbindung verwendet wird, dann wird auf Datenbanken wie SQL Server ebenfalls im Sicherheitskontext des Clients zugegriffen. Dies funktioniert jedoch nur, wenn sich die Datenbank auf demselben Computer befindet wie IIS; die Benutzerangaben des Clients können nicht auf einen anderen Computer übertragen werden.

Ein Clientbenutzer, Hans Müller, mit der Benutzer-ID "HansM" und dem Kennwort "Geheimnis", ist z. B. bei einem Clientcomputer angemeldet. Er führt eine browserbasierte Anwendung aus, die auf das RDSServer.DataFactory-Objekt zugreifen muss, um ein Recordset-Objekt durch Ausführen einer SQL-Abfrage auf dem Computer MyServer zu erstellen, auf dem IIS ausgeführt wird. Der Computer MyServer, auf dem Windows NT Server 4.0 ausgeführt wird, ist so eingerichtet, dass Windows NT-Herausforderung/Rückmeldung zur Kennwortauthentifizierung verwendet wird, bei dem zugehörigen ODBC-DSN Vertraute Verbindung verwenden aktiviert ist und die SQL Server-Datenquelle sich ebenfalls auf dem Server befindet. Wenn der Webserver eine Anfrage empfängt, wird der Client nach der Benutzer-ID und dem Kennwort gefragt. Daher wird die Anfrage bei MyServer so protokolliert, als ob sie von "HansM"/"Geheimnis" statt von IUSER_MyServer stammt (dies ist die Voreinstellung, wenn die anonyme Kennwortauthentifizierung aktiviert ist). Bei der Anmeldung bei SQL Server wird ebenfalls "HansM"/"Geheimnis" verwendet.

Dies bedeutet, dass der Windows NT-Authentifizierungsmodus Herausforderung/Rückmeldung von IIS das Erstellen von HTML-Seiten ermöglicht, ohne dass der Benutzer explizit zur Eingabe der Benutzer-ID und des Kennworts aufgefordert wird, die zur Anmeldung bei der Datenbank erforderlich sind. Wenn die Standardauthentifizierung von IIS verwendet wird, ist dies ebenfalls erforderlich.

Kennwortauthentifizierung

RDS kann mit einem IIS-Webserver Daten austauschen, unabhängig davon, welcher der drei Modi zur Kennwortauthentifizierung verwendet wird: Anonyme, Standard, oder NT-Herausforderung/Rückmeldung (in Windows 2000 Integrierte Windows-Authentifizierung genannt). Durch diese Einstellungen wird definiert, wie der Webserver den Zugriff überprüft. Beispielsweise kann es erforderlich sein, dass der Clientcomputer explizit Zugriffsrechte auf den NT-Webserver hat.


Konfigurieren von "DataFactory" für abgesicherten oder unbeschränkten Modus

Standardmäßig wird ADO mit einer "sicheren" RDSServer.DataFactory-Konfiguration installiert. Der abgesicherte Modus für RDS-Serverkomponenten bedeutet, dass folgende Bedingungen den Wert True besitzen:

  1. Handler ist bei RDSServer.DataFactory erforderlich (dies wird durch eine Einstellung für den Registrierungsschlüsssel gefordert).

  2. Der Standardhandler, msdfmap.handler, wird registriert, befindet sich in der Liste der sicheren Handler und wird als Standardhandler gekennzeichnet.

  3. Die Initialisierungsdatei Msdfmap.ini wird im Windows-Verzeichnis installiert. Es ist erforderlich, die Datei Ihren Bedürfnissen entsprechend zu ändern, bevor Sie RDS im Drei-Ebenen-Modus verwenden können.

Wahlweise können Sie eine unbeschränkte Installation von DataFactory konfigurieren. DataFactory kann direkt ohne den benutzerdefinierten Handler verwendet werden. Sie können dennoch einen benutzerdefinierten Handler verwenden, indem Sie die Verbindungszeichenfolgen ändern, doch dies ist nicht erforderlich. Weitere Informationen zu den Implikationen der Verwendung des RDSServer.DataFactory-Objekts finden Sie unter Sichern von RDS-Anwendungen.

Die Registrierungsdatei handsafe.reg wurde bereitgestellt, um die Registrierungseinträge des Handlers für eine sichere Konfiguration einzurichten. Zum Ausführen im abgesicherten Modus führen Sie handsafe.reg aus.

Die Registrierungsdatei handunsf.reg wurde bereitgestellt, um die Registrierungseinträge des Handlers für eine unbeschränkte Konfiguration einzurichten. Zum Ausführen im abgesicherten Modus führen Sie handsafe.reg aus.

Weitere Informationen zum Verwenden des RDS-Features zur Handleranpassung finden Sie im technischen Artikel "Using the Customization Handler Feature in RDS 2.0" unter http://www.microsoft.com/data/ado/rds/custhand.htm


Verwenden von verwandten Technologien mit RDS

Dieser Abschnitt enthält spezielle Informationen zum Verwenden von RDS im Zusammenhang mit folgenden Technologien:

  • ODBC-Verbindungs-Pooling

  • Microsoft Komponentendienste

Viele andere Technologien interagieren mit Remote Data Service oder werden bei seiner Implementierung verwendet.

Internet-Informationsdienste Weitere Informationen zu Microsoft Internet-Informationsdienste (IIS, Internet Information Services) oder Active Server Pages (ASP) finden Sie in der IIS-Website unter http://www.microsoft.com/germany/backoffice/infoserver/default.htm.

Microsoft Komponentendienste Weitere Informationen zu Komponentendienste (bekannt als Microsoft Transaction Server in Windows NT) finden Sie in der Windows-Webseite unter http://www.microsoft.com/germany/windows/. Weitere Informationen zu Microsoft Transaction Server finden Sie in der MTS-Website unter http://www.microsoft.com/germany/backoffice/infoserver/transaction4.htm.

Microsoft SQL Server Weitere Informationen zu Microsoft SQL Server finden Sie in der SQL Server-Website unter http://www.microsoft.com/germany/backoffice/sql/default.htm.

Microsoft Internet Explorer Weitere Informationen zu Microsoft Internet Explorer finden Sie in der Internet Explorer-Webseite unter http://www.microsoft.com/windows/ie_intl/de/ und der Microsoft Internet Client SDK-Webseite unter http://msdn.microsoft.com/workshop/default.asp.

Microsoft Windows NT Server/Windows 2000 Server Weitere Informationen zur Sicherheit bei Microsoft Windows NT Server bzw. bei Windows 2000 Server finden Sie in der Windows-Webseite unter http://www.microsoft.com/germany/windows/.


Verwenden von RDS mit ODBC-Verbindungs-Pooling

Wenn Sie eine ODBC-Datenquelle verwenden, können Sie die Option für Verbindungs-Pooling in Internet-Informationsdienste (IIS) verwenden, um die Auslastung des Clients effektiv handhaben zu können. Verbindungs-Pooling stellt einen Ressourcen-Manager für Verbindungen dar, durch den häufig verwendete Verbindungen einen offenen Status behalten.

Weitere Informationen dazu, wenn Sie Verbindungs-Pooling aktivieren möchten, finden Sie in der Dokumentation zu Internet-Informationsdienste.

Beachten Sie, dass durch das Aktivieren von Verbindungs-Pooling der Webserver möglicherweise in anderen Funktionen eingeschränkt wird, wie in der Dokumentation zu Microsoft Internet-Informationsdienste erläutert wird.

Für stabiles Verbindungs-Pooling und eine zusätzliche Leistungssteigerung sollten Sie Microsoft SQL Server so konfigurieren, dass die TCP/IP-Socket-Netzwerkbibliothek verwendet wird.

Gehen Sie dazu folgendermaßen vor:

  • Konfigurieren Sie den Computer mit SQL Server für die Verwendung von TCP/IP-Sockets.

  • Konfigurieren Sie den Webserver für die Verwendung von TCP/IP-Sockets.

Konfigurieren des Computers mit SQL Server für die Verwendung von TCP/IP-Sockets

Führen Sie auf dem Computer mit SQL Server das Programm SQL Server Setup aus, so dass beim Datenaustausch mit der Datenquelle die TCP/IP-Socket-Netzwerkbibliothek verwendet wird.

So geben Sie die TCP/IP-Socket-Netzwerkbibliothek auf dem Computer mit SQL Server an

In Microsoft SQL Server 6,5:

  1. Zeigen Sie im Menü Start zuerst auf Programme, dann auf Microsoft SQL Server 6.5, und klicken Sie anschließend auf SQL Setup.

  2. Klicken Sie zweimal auf Fortfahren.

  3. Wählen Sie im Dialogfeld Microsoft SQL Server —Optionen die Option Netzwerkunterstützung ändern aus, und klicken Sie dann auf Fortfahren.

  4. Stellen Sie sicher, dass das Kontrollkästchen TCP/IP-Sockets aktiviert ist, und klicken Sie auf OK.

  5. Klicken Sie auf Fortfahren, um den Vorgang zu beenden, und beenden Sie anschließend Setup.

In Microsoft SQL Server 7.0:

  1. Zeigen Sie im Menü Start zuerst auf Programme, dann auf Microsoft SQL Server 7,0, und klicken Sie anschließend auf SQL Server-Netzwerkkonfiguration.

  2. Klicken Sie auf der Registerkarte Allgemein des Dialogfelds auf Hinzufügen.

  3. Klicken Sie im Dialogfeld Netzwerkbibliothekskonfiguration hinzufügen auf TCP/IP.

  4. Geben Sie in den Feldern Anschlussnummer und Proxyadresse die vom Netzwerkadministrator bereitgestellte Nummer und Adresse ein.

  5. Klicken Sie auf OK, um den Vorgang zu beenden, und beenden Sie anschließend Setup.

Konfigurieren des Webservers für die Verwendung von TCP/IP-Sockets

Bei der Konfiguration des Webservers für die Verwendung von TCP/IP-Sockets stehen zwei Optionen zur Verfügung. Ihre Vorgehensweise hängt davon ab, ob auf alle SQL-Server vom Webserver aus oder nur auf einen bestimmten SQL-Server vom Webserver aus zugegriffen wird.

Wird auf alle SQL-Server vom Webserver aus zugegriffen, müssen Sie das SQL Client-Konfigurationsprogramm auf dem Webserver ausführen. Mit den folgenden Schritten ändern Sie die Standardnetzwerkbibliothek für alle SQL Server-Verbindungen, die von diesem IIS-Webserver hergestellt werden, in die TCP/IP-Sockets-Netzwerkbibliothek.

So konfigurieren Sie den Webserver (alle SQL-Server)

Für Microsoft SQL Server 6,5:

  1. Zeigen Sie im Menü Start zuerst auf Programme, dann auf Microsoft SQL Server 6.5, und klicken Sie anschließend auf SQL Client-Konfigurations-Programm.

  2. Klicken Sie auf die Registerkarte Net Library.

  3. Klicken Sie im Feld Standardnetzwerk auf TCP/IP-Sockets.

  4. Klicken Sie auf Schließen, um die Änderungen zu speichern und das Dienstprogramm zu beenden.

Für Microsoft SQL Server 7.0:

  1. Zeigen Sie im Menü Start zuerst auf Programme, dann auf Microsoft SQL Server 7.0, und klicken Sie anschließend auf SQL Server-Clientkonfiguration.

  2. Klicken Sie auf die Registerkarte Allgemein.

  3. Klicken Sie im Listenfeld Standardnetzwerkbibliothek auf TCP/IP.

  4. Klicken Sie auf OK, um die Änderungen zu speichern und das Dienstprogramm zu beenden.

Wird auf einen bestimmten Computer mit SQL Server von einem Webserver aus zugegriffen, müssen Sie das SQL Client-Konfigurationsprogramm auf dem Webserver ausführen. Um die Netzwerkbibliothek für eine bestimmte SQL Server-Verbindung zu verändern, konfigurieren Sie die SQL Server-Clientsoftware auf dem Webserver folgendermaßen.

So konfigurieren Sie den Webserver (einen bestimmten SQL-Server)

Für Microsoft SQL Server 6,5:

  1. Zeigen Sie im Menü Start zuerst auf Programme, dann auf Microsoft SQL Server 6.5, und klicken Sie anschließend auf SQL Client-Konfigurations-Programm.

  2. Klicken Sie auf die Registerkarte Erweiterte Optionen.

  3. Geben Sie in das Feld Server den Namen des Servers ein, zu dem mit TCP/IP-Sockets eine Verbindung hergestellt werden soll.

  4. Wählen Sie im Feld DLL-Name die Option TCP/IP-Sockets aus.

  5. Klicken Sie auf Hinzufügen/Ändern. Alle Datenquellen, die auf diesen Server zeigen, verwenden nun TCP/IP-Sockets.

  6. Klicken Sie auf Schließen.

Für Microsoft SQL Server 7.0:

  1. Zeigen Sie im Menü Start zuerst auf Programme, dann auf Microsoft SQL Server 7.0, und klicken Sie anschließend auf SQL Server-Clientkonfiguration.

  2. Klicken Sie auf die Registerkarte Allgemein.

  3. Klicken Sie auf Hinzufügen.

  4. Geben Sie den Alias des Servers in das Feld Serveralias ein. Klicken Sie unter Netzwerkbibliotheken auf TCP/IP. Geben Sie im Feld Computername den Namen des Computers ein, der Informationen von TCP/IP Sockets-Clients empfangen soll. Geben Sie im Feld Anschlussnummer den Anschluss des SQL-Servers ein.

  5. Klicken Sie auf OK, und dann erneut auf OK, um das Dienstprogramm zu beenden.


Ausführen von Geschäftsobjekten in Komponentendienste

Geschäftsobjekte können ausführbare Dateien (EXE) oder Dynamic Link Libraries (DLL) sein. Die zum Ausführen des Geschäftsobjekts verwendete Konfiguration hängt davon ab, ob es sich bei dem Objekt um eine DLL- oder EXE-Datei handelt:

  • Geschäftsobjekte, die als EXE-Dateien erstellt wurden, können mit DCOM aufgerufen werden. Wenn diese Geschäftsobjekte mit Internet-Informationsdienste (IIS) verwendet werden, muss ein zusätzliches Marshalling der Daten stattfinden, wodurch die Clientleistung verringert wird.

  • Als DLL-Dateien erstellte Geschäftsobjekte können über IIS (und daher HTTP) verwendet werden. Sie können auch über DCOM nur via Komponentendienste verwendet werden (oder Microsoft Transaction Server, wenn Sie Windows NT verwenden). Die DLLs von Geschäftsobjekten müssen auf dem Server mit IIS registriert sein, damit Sie über IIS darauf zugreifen können. (Weitere Informationen zu den Schritten, die für die Konfiguration einer DLL zum Ausführen in DCOM erforderlich sind, finden Sie im Abschnitt "Ausführen einer DLL in DCOM".)

    Anmerkung Wenn Geschäftsobjekte auf der mittleren Ebene als Komponentendienste-Komponenten (mit GetObjectContext, SetComplete und SetAbort) implementiert werden, können diese mithilfe von Komponentendienste-Kontextobjekten (oder MTS, falls Sie Windows NT verwenden) ihren Status über mehrere Clientaufrufe hinweg aufrechterhalten. Dies ist mit DCOM möglich, das in der Regel zwischen vertrauten Clients und Servern (einem Intranet) implementiert ist. In diesem Fall werden das RDS.DataSpace-Objekt und die CreateObject-Methode auf der Clientseite durch das Transaction Server-Kontextobjekt und die CreateInstance-Methode (verfügbar über die ITransactionContext-Schnittstelle) ersetzt, die durch Microsoft Komponentendiensteimplementiert wurden.


Problembehandlung bei RDS

In diesem Abschnitt finden Sie Informationen zu Lösungen für spezielle Fehler oder Schwierigkeiten mit RDS. Es werden folgende Probleme behandelt:

  • Internet Server Error: Access Denied

  • Deadlocks bei der Isolationsstufe "Repeatable Read"

  • Sicherstellen einer ausreichenden Größe von "tempdb"

  • Minimieren der Größe der Protokolldatei


Internet Server Error: Access Denied

Wenn dieser Fehler angezeigt wird, hat Microsoft® Internet-Informationsdienste (IIS, Internet Information Services) in der Regel folgenden Status zurückgegeben:

HTTP_STATUS_DENIED 401.

Stellen Sie sicher, dass für die Verzeichnisse, auf die IIS zugreift, die entsprechenden Rechte vorhanden sind. RDS kann mit einem IIS-Webserver Daten austauschen, unabhängig davon, welcher der drei Modi zur Kennwortauthentifizierung verwendet wird: Anonyme, Standard, oder NT-Herausforderung/Rückmeldung (in Windows 2000 Integrierte Windows-Authentifizierung genannt). Der Webserver muss darüber hinaus auch über Berechtigungen für den Datenquellencomputer verfügen, wenn es sich um einen Computer unter Windows NT oder Windows 2000 handelt.


Deadlocks bei der Isolationsstufe "Repeatable Read"

Wenn ein benutzerdefiniertes Geschäftsobjekt die Isolationsstufe "Repeatable Read" zum Zugreifen auf einen Computer mit SQL Server verwendet und das Geschäftsobjekt gleichzeitig von zwei Clients aufgerufen wird, die in derselben Transaktion eine Abfrage und eine Aktualisierung senden, kann ein Deadlock entstehen. Remote Data Service erlaubt einen Timeout für einen der Prozesse, um den Deadlock aufzuheben. Hierdurch schlägt jedoch die Aktualisierung für diesen Client fehl.

Verwenden Sie die dynamische Eigenschaft Command Time Out des Cursordienstes, um die Länge des Timeouts zu verändern.


Sicherstellen einer ausreichenden Größe von "tempdb"

Treten bei der Behandlung von Recordset-Objekten, die in Microsoft SQL Server 6.5 Speicherplatz für die Verarbeitung benötigen, Fehler auf, müssen Sie tempdb ggf. vergrößern. (Einige Abfragen erfordern temporären Speicherplatz für die Verarbeitung; für eine Abfrage mit einer ORDER BY-Klausel wird z. B. eine Sortierung des Recordset-Objekts benötigt, die temporären Speicherplatz erfordert.)

Wichtig Lesen Sie sich die Verfahrensanweisungen durch, bevor Sie mit Änderungen beginnen, da es nicht einfach ist, ein Medium wieder zu verkleinern, nachdem es vergrößert wurde.

Anmerkung Standardmäßig wird tempdb in Microsoft SQL Server 7.0 und höher so eingerichtet, dass bei Bedarf eine automatische Vergrößerung möglich ist. Daher ist dieses Verfahren möglicherweise nur auf Servern notwendig, auf denen frühere Versionen als 7.0 ausgeführt werden.

So erweitern Sie die Größe von "tempdb" in SQL Server 6.5

  1. Starten Sie Microsoft® SQL Server Enterprise Manager, öffnen Sie die Struktur für den Server und anschließend die Struktur für Datenbankmedien.

  2. Wählen Sie ein (physisches) Medium für die Erweiterung, wie z. B. master, und doppelklicken Sie auf das Medium, um das Dialogfeld Datenbankmedium bearbeiten zu öffnen.

    In diesem Dialogfeld wird angezeigt, wie viel Speicherplatz die aktuellen Datenbanken benötigen.

  3. Vergrößern Sie im Feld Größe (MB) das Medium auf die gewünschte Größe (z. B. 50 Megabyte (MB) des Festplattenspeichers).

  4. Klicken Sie auf Jetzt ändern, um die Größe zu erhöhen, auf welche die (logische) tempdb-Datenbank erweitert werden kann.

  5. Öffnen Sie die Struktur der Datenbanken auf dem Server, und doppelklicken Sie dann auf tempdb, um das Dialogfeld Datenbank bearbeiten zu öffnen. Auf der Registerkarte Datenbank wird die Größe angezeigt, die tempdb momentan zugewiesen ist (Datengröße). Die Voreinstellung ist 2 MB.

  6. Klicken Sie unter der Gruppe Größe (MB) auf Vergrößern. Die Diagramme zeigen den verfügbaren und zugewiesenen Speicherplatz auf den einzelnen physischen Medien an. Die braunen Balken stellen den verfügbaren Platz dar.

  7. Wählen Sie ein Protokollmedium (z. B. master) aus, um die verfügbare Größe im Feld Größe (MB) anzuzeigen.

  8. Klicken Sie auf Jetzt vergrößern, um der tempdb-Datenbank diese Größe zuzuweisen.

    Im Dialogfeld Datenbank bearbeiten wird die neu zugewiesene Größe für tempdb angezeigt.

    Siehe auch Weitere Informationen zu diesem Thema finden Sie in der Hilfedatei von Microsoft SQL Server Enterprise Manager unter "Datenbank vergrößern (Dialogfeld)".


Minimieren der Größe der Protokolldatei

Eine Protokolldatei kann sich schnell füllen (wodurch der Server aufgehalten wird), wenn zahlreiche Aktivitäten auf einer SQL Server-Datenbank durchgeführt werden. Sie können die Protokolldatei auf Protokoll bei Prüfpunkt abschneiden festlegen, um die Lebensdauer der Protokolldatei für eine Datenbank erheblich zu verlängern.

So aktivieren Sie "Protokoll bei Prüfpunkt abschneiden" in Microsoft SQL Server 6,5

  1. Starten Sie Microsoft SQL Server Enterprise Manager, öffnen Sie die Struktur für den Server und anschließend die Struktur für Datenbankmedien.

  2. Doppelklicken Sie auf den Namen der Datenbank, für die dieses Feature aktiviert werden soll.

  3. Klicken Sie auf der Registerkarte Datenbank auf Abschneiden.

  4. Klicken Sie auf der Registerkarte Optionen auf Protokoll bei Prüfpunkt abschneiden, und klicken Sie dann auf OK.

So aktivieren Sie "Protokoll bei Prüfpunkt abschneiden" in Microsoft SQL Server 7.0

  1. Starten Sie Microsoft SQL Server Enterprise Manager, öffnen Sie die Struktur für den Server und anschließend die Struktur für Datenbanken.

  2. Klicken Sie mit der rechten Maustaste auf den Namen der Datenbank, für die dieses Feature aktiviert werden soll, und klicken Sie auf Eigenschaften.

  3. Klicken Sie auf der Registerkarte Optionen auf Protokoll bei Prüfpunkt abschneiden, und klicken Sie dann auf OK.

    Siehe auch Weitere Informationen zum Feature Protokoll bei Prüfpunkt abschneiden finden Sie in der Dokumentation von Microsoft SQL Server.


ADO-Features

Die folgenden Themen beschreiben diverse Features von ADO und RDS.

  • Schnellverfahren für das Erstellen eines Recordset-Objekts

  • Dauerhaftigkeit von Recordsets

  • Indexunterstützung und die Find-Methode sowie die Eigenschaften "Sort" und "Filter"

  • Datensätze und Datenströme

  • ADO-Ereignismodell, synchrone und asynchrone Operationen

  • Datenstrukturierung

  • DataFactory-Anpassung


Schnellverfahren für das Erstellen eines Recordset-Objekts

ADO stellt ein Schnellverfahren für das Erstellen eines Recordset-Objekts zur Verfügung, indem neue Field-Objekte an die Fields-Auflistung eines Recordset-Objekts angehängt werden. Später können Sie dann das Recordset-Objekt öffnen und Daten aus einer beliebigen Quelle einfügen, wobei es sich bei der Datenquelle nicht unbedingt um eine Datenbank handeln muss. Sie können die Daten aber auch programmgesteuert erstellen.

Das neue Recordset-Objekt kann alle Datenverarbeitungsmethoden verwenden, die einem normalen Recordset-Objekt zur Verfügung stehen. Verwenden Sie das Recordset-Objekt, um Informationen an ein grafisches Steuerelement zu liefern, oder sogar, um eine gegenwärtige Datenquelle zu aktualisieren.

Die folgenden Codierungen in Visual Basic zeigen ein Beispiel, wie mit dem Schnellverfahren ein Recordset-Objekt erstellt wird.

Sub CreateRS()
    Dim rs As New ADODB.Recordset

    rs.Fields.Append "Field1", adChar, 10
    rs.Fields.Append "Field2", adInteger

    rs.Open
    rs.AddNew
    rs("Field1") = "any string"
    rs("Field2") = 9

    Do While Not rs.EOF
        Debug.Print rs("Field1") & " " & rs("Field2")
        rs.MoveNext
    Loop

    rs.Close
    Set rs = Nothing
End Sub


Dauerhaftigkeit von Recordsets

Der Microsoft OLE DB Persistence-Provider unterstützt das Speichern eines Recordset-Objekts in einer Datei mithilfe der Save-Methode des Recordset-Objekts. Die dauerhaft gespeicherte Datei kann sich auf einem lokalen Laufwerk, einem Netzwerkserver oder als URL auf einer Webseite befinden. Später kann die Datei mithilfe der Open-Methode des Recordset-Objekts oder der Execute-Methode des Connection-Objekts wiederhergestellt werden.

Darüber hinaus konvertiert die GetString-Methode ein Recordset-Objekt in ein Formular, in dem die Spalten und Zeilen mit den von Ihnen angegebenen Zeichen getrennt werden.

Um ein Recordset-Objekt zu erhalten, konvertieren Sie es anfangs in ein Formular, das in einer Datei gespeichert werden kann. Recordset-Objekte können entweder im proprietären Format Advanced Data TableGram (ADTG) oder im offenen Format Extensible Markup Language (XML) gespeichert werden.

Anmerkung Zwei Einschränkungen treten auf, wenn hierarchische Recordset-Objekte (Datenstrukturierung) im XML-Format gespeichert werden. Sie können nicht im XML-Format speichern, wenn das hierarchische Recordset-Objekt anstehende Aktualisierungen enthält, und Sie können kein parametrisiertes, hierarchisches Recordset-Objekt speichern.

Speichern Sie dann anstehende Änderungen in der bestehenden Datei. Das erlaubt Ihnen, eine Abfrage auszugeben, die ein Recordset-Objekt zurückgibt; das Recordset zu bearbeiten; es selbst und die anstehenden Änderungen zu speichern; das Recordset später wiederherzustellen und die Datenquelle dann mit den gespeicherten anstehenden Änderungen zu aktualisieren.

Informationen über dauerhaft gespeicherte Stream-Objekte finden Sie unter Streams und Dauerhaftigkeit.

Ein Beispiel für die Recordset-Dauerhaftigkeit finden Sie unter Dauerhaftigkeitsszenario für XML-Recordsets.

Beispiel

Speichern eines Recordsets:

Dim rs as New ADODB.Recordset
rs.Save "c:\yourFile.adtg", adPersistADTG

Öffnen einer gespeicherten Datei mit Recordset.Open:

Dim rs as New ADODB.Recordset
rs.Open "c:\yourFile.adtg", "Provider=MSPersist",,,adCmdFile

Falls das Recordset-Objekt keine aktive Verbindung hat, können Sie auch alle Standardwerte übernehmen und einfach den folgenden Code verwenden:

Dim rs as New ADODB.Recordset
rs.Open "c:\yourFile.adtg"

Öffnen einer gespeicherten Datei mit Connection.Execute:

Dim conn as New ADODB.Connection
Dim rs as ADODB.Recordset
conn.Open "Provider=MSPersist"
Set rs = conn.execute("c:\yourFile.adtg")

Öffnen einer gespeicherten Datei mit RDS.DataControl:

In diesem Fall wird die Server-Eigenschaft nicht festgelegt.

Dim dc as New RDS.DataControl
dc.Connection = "Provider=MSPersist"
dc.SQL = "c:\yourFile.adtg"
dc.Refresh


Dauerhaftigkeitsszenario für XML-Recordsets

In diesem Szenario wird eine Active Server Pages-Anwendung (ASP) erstellt, die den Inhalt eines Recordset-Objekts direkt im ASP Response-Objekt speichert.

Anmerkung Dieses Szenario setzt Internet Information Server, Version 5.0 (IIS) oder höher, voraus.

Das zurückgegebene Recordset-Objekt wird im Internet Explorer über ein RDS.DataControl-Objekt angezeigt

Die folgenden Schritte sind zur Erstellung dieses Szenarios notwendig:

  1. Einrichten der Anwendung

  2. Abrufen der Daten

  3. Senden der Daten

  4. Erhalten der Daten

  5. Anzeigen der Daten

Weiter Schritt 1: Einrichten der Anwendung


Schritt 1: Einrichten der Anwendung

Erstellen Sie ein virtuelles IIS-Verzeichnis XMLPersist mit Schreibberechtigungen. Erstellen Sie zwei neue Textdateien in dem Ordner, in dem das virtuelle Verzeichnis liegt, eine mit dem Namen XMLResponse.asp, die andere mit dem Namen Default.htm.

Weiter Schritt 2: Abrufen der Daten


Schritt 2: Abrufen der Daten

In diesem Schritt werden Sie die Codierung schreiben, um ein ADO-Recordset zu öffnen, und die Codierung vorbereiten, es an den Client zu senden. Öffnen Sie die Datei XMLResponse.asp mit einem Texteditor, wie Windows Editor, und geben Sie folgende Codierung ein.

<%@ codepage="65001" %>
<object id="rstCustomers" progid="ADODB.Recordset" runat="Server">
</object>
<!-- metadata name="Microsoft ActiveX Data Objects 2.5 Library"
     type="TypeLib" uuid="{00000205-0000-0010-8000-00AA006D2EA4}" -->
<%
  Option Explicit
  Response.Buffer = True

  Dim strSQL, strConnection

  Response.ContentType = "text/xml"
  Response.Expires = 0
  Response.Buffer = False

  strSQL="SELECT title_id, title, type FROM titles" & _
         " ORDER By title"

  strConnection = "Provider=MSDataShape;Data Provider=SQLOLEDB;" & _
                      "Database=Pubs;Data Source=SRV;User Id=sa;" & _
                        "Password=;"

  rstCustomers.Open strSQL, strConnection, adOpenStatic,
      adLockBatchOptimistic

Sichern Sie, dass der Wert des Datenquellparameters in strConnection in den Namen Ihres Computers mit Microsoft SQL Server geändert wird. Die Codeseite für die Seite wurde auf 65001 (Unicode) festgelegt, so dass XML zurückgegeben wird.

Lassen Sie die Datei geöffnet, und gehen Sie zum nächsten Schritt.

Weiter Schritt 3: Senden der Daten


Schritt 3: Senden der Daten

Jetzt, da Sie ein Recordset-Objekt haben, müssen Sie es an den Client senden, indem Sie es als XML zum ASP Response-Objekt speichern. Fügen Sie den folgenden Code zum Ende von XMLResponse.asp hinzu.

  Response.Write "<?xml version='1.0' encoding='ISO-8859-1'?>" & vbCRLF
  rstCustomers.save Response, adPersistXML
  rstCustomers.Close
%>

Beachten Sie, dass das ASP Response-Objekt als das Ziel für die Save-Methode des Recordset-Objekts bestimmt wurde. Das Ziel der Speichermethode kann ein Objekt sein, das die IStream-Schnittstelle unterstützt, z. B. ein Stream-Objekt von ADO, oder ein Dateiname, der den vollständigen Pfad enthält, in dem das Recordset-Objekt gespeichert wurde.

Speichern und schließen Sie XMLResponse.asp, bevor Sie zum nächsten Schritt gehen.

Weiter Schritt 4: Erhalten und Anzeigen der Daten


Schritt 4: Erhalten und Anzeigen der Daten

In diesem Schritt werden Sie eine HTML-Datei mit einem eingebetteten RDS.DataControl-Objekt erstellen, die auf die Datei XMLResponse.asp zeigt, um das Recordset-Objekt abzurufen. Öffnen Sie default.htm mit einem Texteditor wie Windows Editor, und fügen Sie folgende Codierung hinzu. Ersetzen Sie "yourserver" im URL mit dem Namen Ihres Servers.

<HTML>
<HEAD><TITLE>ADO Recordset Persistence Sample</TITLE></HEAD>
<BODY>

<OBJECT CLASSID="clsid:BD96C556-65A3-11D0-983A-00C04FC29E33" ID="RDC1"
   <PARAM NAME="URL"
          VALUE="http://yourserver/XMLPersist/XMLResponse.asp">
</OBJECT>

<TABLE DATASRC="#RDC1">
  <TR>
<TD><SPAN DATAFLD="title_id"></SPAN></TD>
<TD><SPAN DATAFLD="title"></SPAN></TD>
<TD><SPAN DATAFLD="type"></SPAN></TD>
  </TR>
</TABLE>
</BODY>
</HTML>

Speichern und Schließen Sie default.htm. Verwenden Sie Internet Explorer, Version 4.0 oder höher, öffnen Sie den URL http://yourserver/XMLPersist/default.htm, und beobachten Sie die Ergebnisse. Die Daten werden in einer gebundenen DHTML-Tabelle angezeigt. Öffnen Sie jetzt den URL http://yourserver/XMLPersist/XMLResponse.asp, und beobachten Sie die Ergebnisse. Die XML wird angezeigt.


Indexunterstützung und die Find-Methode sowie die Eigenschaften "Sort" und "Filter"

Durch Indizes bei Feldern kann die Leistung der Find-Methode und der Eigenschaften Sort und Filter des Recordset-Objekts sehr verbessert werden. Sie können einen internen Index für ein Field-Objekt erstellen, indem Sie dafür die dynamische Optimize-Eigenschaft festlegen. Diese dynamische Eigenschaft wird zur Properties-Auflistung des Field-Objekts hinzugefügt, wenn Sie die CursorLocation-Eigenschaft auf adUseClient festlegen. Beachten Sie, dass dieser Index in ADO intern ist, d. h., Sie können nicht darauf zugreifen oder ihn für einen anderen Zweck verwenden. Dieser Index ist auch anders als die Index-Eigenschaft des Recordset-Objekts.

Durch die Sort-Eigenschaft wird die Reihenfolge bestimmt, in der die Zeilen eines Recordset-Objekts durchlaufen werden; mit der Filter-Eigenschaft wird bestimmt, auf welche Zeilen beim Durchlaufen zugegriffen werden kann; und durch die Find-Methode kann ein Wert innerhalb einer Spalte (eines Feldes) eines Recordset-Objekts schnell gefunden werden. Sie können häufig die Geschwindigkeit der Find-Operationsmethode in einer Spalte verbessern, indem Sie mit der Optimize-Eigenschaft einen Index erstellen.


Records und Streams

ADO stellt zurzeit ein einfaches Mittel für den Zugriff auf Informationen in Datenquellen, wie z. B. relationalen Datenbanken, zur Verfügung. Viele Informationen liegen jedoch nicht in Form von Tabellen in Datenbanken vor, sondern befinden sich als Nachrichten in E-Mail-Systemen und als Dateien in modernen Dateisystemen. Durch Record- und Stream-Objekte wird der Zugriff auf Informationen, die nicht in relationalen Datenbanken gespeichert sind, ermöglicht.

Durch das Record-Objekt können Daten, wie z. B. Verzeichnisse und Dateien eines Dateisystems oder Ordner und Nachrichten eines E-Mail-Systems, dargestellt und verwaltet werden. Ein Record kann auch eine Zeile in einem Recordset darstellen, obwohl Record- und Recordset-Objekte über unterschiedliche Methoden und Eigenschaften verfügen.

Mithilfe des Stream-Objekts ist das Lesen, Schreiben und Verwalten des binären Datenstroms der Bytes, aus denen eine Datei oder eine Nachricht besteht, möglich.

URLs (Uniform Resource Locators) können als Alternative zu Verbindungszeichenfolgen und Befehlstext für die Angabe von Datenquellen und des Speicherortes von Dateien und Verzeichnissen verwendet werden. Sie können URLs sowohl mit den vorhandenen Connection- und Recordset-Objekten als auch mit Record- und Stream-Objekten verwenden.

Einige ADO-Objekte wurden so erweitert, dass sie in Verbindung mit Record- und mit Stream-Objekten funktionieren.

  • Die Append-Methode der Fields-Auflistung, mit der ein Field-Objekt erstellt und zur Auflistung hinzugefügt wird, kann ebenfalls den Wert von Field angeben.

  • Die Update-Methode beendet das Hinzufügen oder Löschen von Feldern zur bzw. aus der Auflistung.

  • Mit einer kürzeren Methode und Alternative zur Append-Methode können Sie Felder erstellen, indem Sie einfach einem undefinierten oder bereits gelöschten Feld einen Wert zuweisen.

(In den folgenden Erläuterungen wird der Begriff Verzeichnis auch für Ordner und der Begriff Datei auch für Nachrichten verwendet.)

In den folgenden Themen finden Sie weitere Informationen zur Verwendung der Record- und Stream-Objekte:

  • Absolute und relative URLs

  • Records und vom Provider bereitgestellte zusätzliche Felder

  • Streams

  • Streams und Dauerhaftigkeit

  • Verwenden von ADO mit dem OLE DB-Provider für Internet Publishing

  • Szenario für Internet Publishing


Absolute und relative URLs

Ein URL gibt den Speicherort eines auf einem lokalen oder einem Netzwerkcomputer gespeicherten Ziels an, z. B. einer Datei, eines Verzeichnisses, einer HTML-Seite, eines Bildes, eines Programms usw. In diesem Dokument hat ein absoluter URL folgende Form:

Schema://Server/Pfad/Ressource

wobei Folgendes gilt:

Schema

Gibt an, wie auf die Ressource zugegriffen werden muss.

Server

Gibt den Namen des Computers an, auf dem sich die Ressource befindet.

Pfad

Gibt die Folge der Verzeichnisse an, die zum Ziel führen. Falls keine Ressource angegeben wird, ist das Ziel das letzte im Pfad genannte Verzeichnis.

Ressource

Falls angegeben, ist die Ressource das Ziel, normalerweise ein Dateiname. Dabei kann es sich um eine einfache Datei handeln, in der ein einfacher binärer Datenstrom aus Bytes enthalten ist, oder um ein strukturiertes Dokument, in dem eine oder mehrere Speichereinheiten und binäre Datenströme aus Bytes enthalten sind.

Ein absoluter URL enthält alle Informationen, die zum Auffinden einer Ressource benötigt werden.

Ein relativer URL gibt den Speicherort einer Ressource an, wobei ein absoluter URL als Ausgangspunkt verwendet wird. Somit wird der "vollständige URL" des Ziels durch Verknüpfung des absoluten und des relativen URLs angegeben. Ein relativer URL enthält normalerweise nur den Pfad und ggf. die Ressource, nicht jedoch das Schema oder den Server.

Definieren des Kontextes mit einem URL

Eine Funktion einer offenen Verbindung, die durch ein Connection-Objekt dargestellt wird, besteht darin, dass nachfolgende Operationen auf die durch diese Verbindung repräsentierte Datenquelle beschränkt werden. Das bedeutet, dass die Verbindung den Kontext für nachfolgende Operationen definiert.

Mit dieser Version kann auch ein absoluter URL einen Kontext definieren. Wenn z. B. ein Record-Objekt mit einem absoluten URL geöffnet wird, wird implizit ein Connection-Objekt erzeugt, um die durch den URL angegebene Ressource zu darzustellen.

Ein absoluter URL, der einen Kontext definiert, kann im Parameter ActiveConnection der Open-Methode des Record-Objekts angegeben werden. Ein absoluter URL kann auch als Wert des neuen Schlüsselwortes "URL=" im Parameter ConnectionString der Open-Methode des Connection-Objekts und des Parameters ActiveConnection der Open-Methode des Recordset-Objekts angegeben werden.

Ein Kontext kann auch mit einem offenen Record- oder Recordset-Objekt definiert werden, welches ein Verzeichnis darstellt, da diese Objekte bereits über ein implizit oder explizit definiertes Connection-Objekt verfügen, welches einen Kontext angibt.

Operationen mit Gültigkeitsbereich

Der Kontext legt gleichzeitig einen Gültigkeitsbereich fest, also das Verzeichnis und dessen Unterverzeichnisse, die an nachfolgenden Operationen beteiligt sind. Das Record-Objekt verfügt über mehrere Methoden mit Gültigkeitsbereich. Dazu gehören z. B. CopyRecord, MoveRecord und DeleteRecord, die auf ein Verzeichnis und alle seine Unterverzeichnisse wirken.

Relative URLs als Befehlstext

Eine Zeichenfolge, die einen mit der Datenquelle auszuführenden Befehl angibt, kann im Parameter CommandText der Execute-Methode des Connection-Objekts und im Parameter Source der Open-Methode des Recordset-Objekts angegeben werden.

Ein relativer URL kann im Parameter CommandText oder Source angegeben werden. Der relative URL gibt nicht wirklich einen Befehl an (wie z. B. einen SQL-Befehl), der Befehl ist lediglich durch diese Parameter festgelegt. Außerdem muss der Kontext der aktiven Verbindung ein absoluter URL sein, und für den Parameter Option muss adCmdTableDirect festgelegt sein.

So könnte z. B. für die Datei Readme25.txt im Verzeichnis Winnt/system32 wie folgt ein Recordset geöffnet werden:

recordset.Open "system32/Readme25.txt",      "URL=http://YourServer/Winnt/",,,adCmdTableDirect

Der absolute URL in der Verbindungszeichenfolge gibt den Server (YourServer) und den Pfad (Winnt) an. Dieser URL definiert außerdem den Kontext.

Der relative URL im Befehlstext verwendet den absoluten URL als Ausgangspunkt und gibt den restlichen Pfad (system32) und die zu öffnende Datei (Readme25.txt) an.

Das Optionsfeld (adCmdTableDirect) zeigt an, dass es sich beim Befehlstyp um einen relativen URL handelt.

Als weiteres Beispiel wird durch den folgenden Code ein Recordset für den Inhalt des Verzeichnisses Winnt geöffnet:

recordset.Open "", "URL=http://YourServer/Winnt/",,,adCmdTableDirect

Vom OLE DB-Provider bereitgestellte URL-Schemas

Am Anfang eines vollständigen URLs steht das Schema, mit dem auf die im restlichen Teil des URLs angegebene Ressource zugegriffen wird. Beispiele für ein Schema sind HTTP (HyperText Transfer Protocol) und FTP (File Transfer Protocol).

Mit dieser Version unterstützt ADO solche OLE DB-Provider, die ihre eigenen URL-Schemas erkennen. So erkennt z. B. der OLE DB-Provider für Internet Publishing für den Zugriff auf "veröffentlichte" Windows 2000-Dateien das vorliegende HTTP-Schema.


Records und vom Provider bereitgestellte Felder

Wenn ein Record-Objekt geöffnet wird, kann seine Quelle die aktuelle Zeile eines offenen Recordset, ein absoluter URL oder ein relativer URL in Verbindung mit einem offenen Connection-Objekt sein.

Wenn der Record von einem Recordset geöffnet wird, enthält die Fields-Auflistung des Record-Objekts alle Felder des Recordset und alle eventuell vom zugrunde liegenden Provider hinzugefügten Felder.

Der Provider kann zusätzliche Felder einfügen, die als ergänzende Merkmale für den Record dienen. Infolgedessen kann ein Record eindeutige Felder, die nicht im Recordset als Ganzes enthalten sind, und beliebige Records, die von einer anderen Zeile des Recordsets abgeleitet wurden, enthalten.

So können z, B. alle Zeilen eines von einer E-Mail-Datenquelle abgeleiteten Recordsets Spalten, wie z. B. Von, An und Betreff, enthalten. Ein von diesem Recordset abgeleiteter Record enthält dieselben Felder. Der Record kann jedoch auch weitere Felder enthalten, die nur in der speziellen durch diesen Record dargestellten Nachricht enthalten sind, z. B. Anhang und Cc (Kopie an).

Obwohl der Record und die aktuelle Zeile des Recordsets dieselben Felder haben, unterscheiden sich diese, da Record und Recordset über unterschiedliche Methoden und Eigenschaften verfügen.

Ein im Record und im Recordset öffentlich gehaltenes Feld kann von jedem der beiden Objekte geändert werden. Das Feld kann jedoch nicht aus dem Record-Objekt gelöscht werden, auch wenn durch den zugrunde liegende Provider unterstützt wird, dass das Feld auf Null gesetzt werden kann.

Nachdem der Record geöffnet wurde, können Sie programmtechnisch Felder hinzufügen. Außerdem können Sie von Ihnen hinzugefügte Felder löschen. Im ursprünglichen Recordset können Sie jedoch keine Felder löschen.

Sie können das Record-Objekt auch direkt aus einem URL öffnen. in diesem Falle sind die zum Record hinzugefügten Felder vom zugrunde liegenden Provider abhängig. Zurzeit fügen die meisten Provider eine Gruppe von Feldern hinzu, welche das durch den Record dargestellte Element beschreiben. Wenn das Element aus einem Datenstrom von Bytes, z. B. einer einfachen Datei, besteht, kann normalerweise ein Stream-Objekt vom Record geöffnet werden.

Spezielle Felder für Dokumentenquellenprovider

Eine besondere Klasse von Providern, die Dokumentenquellenprovider, verwaltet Ordner und Dokumente. Wenn ein Dokument durch ein Record-Objekt dargestellt wird oder ein Dokumentenordner durch ein Recordset-Objekt dargestellt wird, füllt der Dokumentenquellenprovider diese Objekte mit einer eindeutigen Gruppe von Felder auf, welche die Merkmale des Dokuments beschreiben, und nicht das Dokument selbst. Normalerweise enthält ein Feld einen Verweis auf den Stream, der das Dokument repräsentiert.

Diese Felder bilden einen Ressourcen-Record bzw. ein Ressourcen-Recordset. Sie sind nach den entsprechenden Providern, von denen sie unterstützt werden, unter Verwenden von Providern mit ADO aufgelistet.

Zwei Konstanten indizieren die Fields-Auflistung eines Ressourcen-Records bzw. eines Ressourcen-Recordsets, um ein Paar von gemeinsam verwendeten Feldern abzurufen. Die Value-Eigenschaft des Field-Objekts gibt den gewünschten Inhalt zurück.

  • Das Feld, auf das mit der adDefaultStream-Konstanten zugegriffen wird, enthält einen Standarddatenstrom, der mit dem Record- bzw. Recordset-Objekt verknüpft ist. Der Provider weist einem Objekt einen Standarddatenstrom zu.

  • Das Feld, auf welches mit der adRecordURL-Konstanten zugegriffen wird, enthält den absoluten URL, durch den das Dokument identifiziert wird.

Ein Dokumentenquellenprovider unterstützt nicht die Properties-Auflistung der Record- und Field-Objekte. Für diese Objekte ist der Inhalt der Properties-Auflistung null.

Ein Dokumentenquellenprovider kann eine providerspezifische Eigenschaft, wie z. B. Datasource Type, hinzufügen, um feststellen zu können, ob es sich um einen Dokumentenquellenprovider handelt. Weitere Informationen zur Bestimmung des Providertyps finden Sie in der Dokumentation zum Provider.

Spalten eines Ressourcen-Recordsets

Ein Ressourcen-Recordset besteht aus den folgenden Spalten:

Spaltenname | Typ | Beschreibung
RESOURCE_PARSENAME | adVarWChar | Schreibgeschützt. Zeigt den URL der Ressource an.
RESOURCE_PARENTNAME | adVarWChar | Schreibgeschützt. Zeigt den absoluten URL des übergeordneten Datensatzes an.
RESOURCE_ABSOLUTEPARSENAME | adVarWChar | Schreibgeschützt. Zeigt den absoluten URL der Ressource, der aus der Verknüpfung von PARENTNAME und PARSENAME gebildet wird, an.
RESOURCE_ISHIDDEN | adBoolean | True, falls die Ressource verborgen ist. Es werden erst Zeilen zurückgegeben, wenn der Befehl für das Erstellen von Zeilengruppen explizit Zeilen auswählt, bei denen RESOURCE_ISHIDDEN den Wert TRUE hat.
RESOURCE_ISREADONLY | adBoolean | True, falls die Ressource schreibgeschützt ist. Versuche zum Öffnen dieser Ressource mit DBBINDFLAG_WRITE schlagen mit DB_E_READONLY fehl. Diese Eigenschaft kann auch dann bearbeitet werden, wenn die Ressource schreibgeschützt geöffnet wurde.
RESOURCE_CONTENTTYPE | adVarWChar | Zeigt den MIME-Typ des Dokuments an, wobei das Format angegeben wird, z. B. "text/html".
RESOURCE_CONTENTCLASS | adVarWChar | Zeigt den wahrscheinlichen Verwendungszweck des Dokuments an, z. B. als Falldarstellung eines Rechtsanwalts. Dies stimmt möglicherweise mit der Office-Vorlage überein, die zum Erstellen des Dokuments verwendet wurde.
RESOURCE_CONTENTLANGUAGE | adVarWChar | Zeigt die Sprache, in der der Inhalt gespeichert ist, an.
RESOURCE_CREATIONTIME | adFileTime | Schreibgeschützt. Zeigt eine FILETIME-Struktur an, die die Erstellungszeit der Ressource enthält. Die Zeit wird im Format UTC (Universal Time Coordinated, korrigierte Weltzeit) angegeben.
RESOURCE_LASTACCESSTIME | adFileTime | Schreibgeschützt. Zeigt eine FILETIME-Struktur an, welche die Zeit des letzten Zugriffs auf die Ressource enthält. Die Zeit wird im Format UTC angegeben. Falls der Provider dieses Zeitelement nicht unterstützt, sind die FILETIME-Elemente gleich null.
RESOURCE_LASTWRITETIME | adFileTime | Schreibgeschützt. Zeigt eine FILETIME-Struktur an, welche die Zeit des letzten Schreibzugriffs auf die Ressource enthält. Die Zeit wird im Format UTC angegeben. Falls der Provider dieses Zeitelement nicht unterstützt, sind die FILETIME-Elemente gleich null.
RESOURCE_STREAMSIZE | asUnsignedBigInt | Schreibgeschützt. Zeigt die Größe des Standarddatenstroms der Ressource in Byte an.
RESOURCE_ISCOLLECTION | adBoolean | Schreibgeschützt. True, falls die Ressource eine Auflistung ist, z. B. ein Verzeichnis, False, wenn die Ressource eine einfache Datei ist.
RESOURCE_ISSTRUCTUREDDOCUMENT | adBoolean | True, falls die Ressource ein strukturiertes Dokument ist, False, wenn die Ressource kein strukturiertes Dokument ist. Es kann sich um eine Auflistung oder um eine einfache Datei handeln.
DEFAULT_DOCUMENT | adVarWChar | Schreibgeschützt. Zeigt an, dass diese Ressource einen URL auf das einfache Standarddokument eines Ordners oder eines strukturierten Dokuments enthält. Wird verwendet, wenn der Standarddatenstrom von einer Ressource angefordert wird. Bei einer einfachen Datei ist diese Eigenschaft leer.
CHAPTERED_CHILDREN | adChapter | Schreibgeschützt. Optional. Gibt das Kapitel des Rowsets an, das die untergeordneten Elemente der Ressource enthält (Vom OLE DB-Provider für Internet Publishing wird diese Spalte nicht verwendet.)
RESOURCE_DISPLAYNAME | adVarWChar | Schreibgeschützt. Zeigt den Anzeigenamen der Ressource an.
RESOURCE_ISROOT | adBoolean | Schreibgeschützt. True, wenn die Ressource der Stamm einer Auflistung oder eines strukturierten Dokuments ist.


Streams

Ein Stream-Objekt kann für folgende Elemente geöffnet werden:

  • Eine durch einen URL angegebene einfache Datei.

  • Ein Feld eines Records oder Recordsets, in dem ein Stream-Objekt enthalten ist.

  • Der Standarddatenstrom eines Record- oder Recordset-Objekts, der ein Verzeichnis oder eine Verbunddatei darstellt

  • Ein Ressourcenfeld, das den URL einer einfachen Datei enthält.

  • Keine bestimmte Quelle. In diesem Fall wird ein Stream-Objekt im Speicher geöffnet, in das Daten geschrieben werden können. Anschließend wird es in einem anderen Stream oder einer anderen Datei gespeichert.

  • Ein BLOB-Feld in einem Recordset.


Streams und Dauerhaftigkeit

Die Save-Methode des Recordset-Objekts speichert ein Recordset in eine Datei, d. h. das Recordset wird dauerhaft gespeichert. Die Open-Methode lädt das Recordset aus dieser Datei.

Dann können die Save- und die Open-Methode ein Recordset auch in einem Stream-Objekt dauerhaft speichern. Dieses Feature ist besonders für das Arbeiten mit RDS (Remote Data Service) und ASP (Active Server Pages) hilfreich.

Weitere Informationen zur Verwendung von Dauerhaftigkeit in ASP für ASP-Seiten finden Sie in der aktuellen ASP-Dokumentation.

Im Folgenden werden einige Szenarien für die Anwendung von Stream-Objekten und Dauerhaftigkeit aufgeführt.

Szenario 1:

In diesem Szenario wird ein Recordset einfach nur in eine Datei und anschließend in einen Stream gespeichert. Danach wird der dauerhaft gespeicherte Stream in einem anderen Recordset geöffnet.

Dim rs1 As ADODB.Recordset
Dim rs2 As ADODB.Recordset
Dim stm As ADODB.Stream

rs1.Open    "SELECT * FROM Authors", "DSN=Pubs;uid=sa;pwd=;", _
            adopenStatic, adLockReadOnly, adCmdText
rs1.Save "c:\myfolder\mysubfolder\myrs.xml", adPersistXML
rs1.Save stm, adPersistXML
rs2.Open stm

Szenario 2:

In diesem Szenario wird ein Recordset dauerhaft im XML-Format in einen Stream gespeichert. Anschließend wird der Stream in eine Zeichenfolge gelesen. Diese Zeichenfolge kann getestet, bearbeitet oder angezeigt werden.

Dim rs As New ADODB.Recordset
Dim stm As New ADODB.Stream
Dim strRst As String

' Öffnen, Speichern und Schließen des Recordsets.
rs.Open "select * from Authors", "dsn=Pubs;uid=sa;pwd=;"
rs.Save stm, adPersistXML
rs.Close
Set rs = nothing

' Einfügen des gespeicherten Recordsets in eine Zeichenfolgenvariable.
strRst = stm.ReadText(adReadAll)

' Untersuchen, Bearbeiten oder Anzeigen der XML-Daten.
...

Szenario 3:

In diesem Beispiel ist ein ASP-Code aufgeführt, durch den ein Recordset als XML direkt in das Response-Objekt dauerhaft gespeichert wird.

...
<%
response.ContentType = "text/xml"

' Erstellen und Öffnen eines Recordsets.
Set rs = Server.CreateObject("ADODB.Recordset")
rs.Open "select * from Authors", "dsn=Pubs;uid=sa;pwd=;"

' Speichern des Recordsets direkt im Ausgabedatenstrom.
rs.Save Response, adPersistXML

' Schließen des Recordsets.
rs.Close
Set rs = nothing
%>
...

Szenario 4:

In diesem Szenario schreibt der ASP-Code den Inhalt vom Recordset im ADTG-Format an den Client. Diese Daten können vom Cursordienst verwendet werden, um einen Recordset mit getrennter Verbindung zu erstellen.

Eine neue Eigenschaft der RDS-DataControl, URL, verweist auf die ASP-Seite, die den Recordset erzeugt. Das bedeutet, dass ein Recordset-Objekt empfangen werden kann, ohne dass RDS das DataFactory-Objekt auf der Serverseite verwendet oder der Benutzer ein Geschäftsobjekt schreibt. Dadurch wird das Programmiermodell von RDS erheblich vereinfacht.

Der Code der Serverseite hat die Bezeichnung http://server/directory/recordset.asp:

<%
Dim rs
Set rs = Server.CreateObject("ADODB.Recordset")
rs.Open "select au_fname, au_lname, phone from Authors", "dsn=Pubs"
response.ContentType = "multipart/mixed"
rs.Save response, adPersistADTG
%>

Code der Clientseite:

<HTML>
<HEAD>
<TITLE>RDS Query Page</TITLE>
</HEAD>
<body>
<CENTER>
<H1>Remote Data Service 2.5</H1>
<TABLE DATASRC="#DC1">
    <TR>
        <TD><SPAN DATAFLD="au_fname"></SPAN></TD>
        <TD><SPAN DATAFLD="au_lname"></SPAN></TD>
        <TD><SPAN DATAFLD="phone"></SPAN></TD>
    </TR>
</TABLE>
<BR>

<OBJECT classid="clsid:BD96C556-65A3-11D0-983A-00C04FC29E33"
    ID=DC1 HEIGHT=1 WIDTH = 1>
    <PARAM NAME="URL" VALUE="http://server/directory/recordset.asp">
</OBJECT>

</SCRIPT>
</BODY>
</HTML>

Entwickler haben auch die Möglichkeit, auf dem Client ein Recordset-Objekt zu verwenden.

...
function GetRs()
    {
    rs = CreateObject("ADODB.Recordset");
    rs.Open "http://server/directory/recordset.asp"
    DC1.SourceRecordset = rs;
    }
...


Verwenden von ADO mit dem OLE DB-Provider für Internet Publishing

Die Record- und Stream-Objekte von ADO können zusammen mit dem Microsoft OLE DB-Provider für Internet Publishing (Internet Publishing-Provider) verwendet werden, um auf Ressourcen, beispielsweise Webordner oder Dateien zuzugreifen, die von Microsoft FrontPage® verwaltet werden. Mit ADO können Sie angeben, dass die Quelle eines Record-, Stream- oder Recordset-Objekts ein URL sein soll. Sie können dann Ressourcen uploaden, downloaden, verschieben, kopieren und löschen oder die Eigenschaften der Ressourcen direkt bearbeiten.

Beispielcode, in dem Records und Streams zusammen mit dem Internet Publishing-Provider verwendet werden, finden Sie unter Szenario für Internet Publishing.

Der Internet Publishing-Provider wird zusammen mit Microsoft Windows 2000 installiert. Frühere Versionen des Internet Publishing-Providers waren ebenfalls mit Microsoft Office 2000 und Microsoft Internet Explorer 5.0 verfügbar.

Um ADO mit dem Internet Publishing-Provider zu verbinden, gibt es drei Möglichkeiten:

  • Geben Sie "URL=" in der Verbindungszeichenfolge an. Beispiel:
    objConn.Open "URL=http://servername"
  • Geben Sie MSDAIPP.DSO für das Schlüsselwort Provider der Verbindungszeichenfolge an. Beispiel:
    objConn.Open "provider=MSDAIPP.DSO;data source=http://servername"
  • Geben Sie MSDAIPP.DSO für die Provider-Eigenschaft des Connection-Objekts an. Beispiel:
    objConn.Provider = "MSDAIPP.DSO"
objConn.Open "http://servername"

    Anmerkung Wenn MSDAIPP.DSO entweder durch das Schlüsselwort Provider der Verbindungszeichenfolge oder durch die Provider-Eigenschaft explizit als Wert für den Provider angegeben wurde, können Sie in der Verbindungszeichenfolge "URL=" nicht verwenden. Wenn Sie es verwenden, wird ein Fehler angezeigt. Geben Sie daher den URL wie oben gezeigt an.

Weitere spezifische Informationen zu Internet Publishing Provider finden Sie unter Microsoft OLE DB-Provider für Internet Publishing, oder in der Dokumentation zum Provider, die mit der Quellanwendung geliefert wurde, mit der der OLE DB-Provider für Internet Publishing installiert wurde: Windows 2000, Office 2000 oder Internet Explorer 5.0.


Szenario für Internet Publishing

In diesem Codebeispiel wird die Verwendung von ADO mit dem Microsoft OLE DB-Provider für Internet Publishing gezeigt. In diesem Szenario erstellen Sie eine Visual Basic-Anwendung, die das Recordset-, das Record- und das Stream-Objekt verwendet, um den Inhalt der mit Internet Publishing-Provider veröffentlichten Ressourcen anzuzeigen.

Die folgenden Schritte sind zur Erstellung dieses Szenarios notwendig:

  • Schritt 1: Einrichten des Visual Basic-Projekts

  • Schritt 2: Initialisieren des Listenfeldes "Main"

  • Schritt 3: Auffüllen des Listenfeldes "Fields"

  • Schritt 4: Auffüllen des Textfeldes "Details"

Weiter Schritt 1: Einrichten des Visual Basic-Projekts


Schritt 1: Einrichten des Visual Basic-Projekts

In diesem Szenario wird angenommen, dass auf dem System Microsoft Visual Basic 6.0 oder höher, ADO 2.5 oder höher und der Microsoft OLE DB-Provider für Internet Publishing installiert sind.

So erstellen Sie ein ADO-Projekt

  1. Erstellen Sie in Microsoft Visual Basic ein neues EXE-Standardprojekt.

  2. Wählen Sie Verweise im Menü Projekt aus.

  3. Wählen Sie Microsoft ActiveX Data Objects 2.5 Library aus, und klicken Sie auf OK.

So fügen Sie Steuerelemente in das Hauptformular ein

  1. Fügen Sie zu Form1 ein ListBox-Steuerelement hinzu. Legen Sie lstMain als Name-Eigenschaft fest.

  2. Fügen Sie zu Form1 ein weiteres ListBox-Steuerelement hinzu. Legen Sie lstDetails als Name-Eigenschaft fest.

  3. Fügen Sie zu Form1 ein TextBox-Steuerelement hinzu. Legen Sie txtDetails als Name-Eigenschaft fest.

Weiter Schritt 2: Initialisieren des Listenfeldes "Main"


Schritt 2: Initialisieren des Listenfeldes "Main"

So deklarieren Sie globale Record- und Recordset-Objekte

  • Fügen Sie den folgenden Code in (Allgemeine) (Deklarationen) für Form1 ein:
    Option Explicit
Dim grec As Record
Dim grs As Recordset

    Dieser Code deklariert alle globalen Objektverweise für Record und Recordset, die später in diesem Szenario vewendet werden.

So stellen Sie eine Verbindung zu einem URL her und füllen "lstMain"

  • Fügen Sie den folgenden Code in den Form Load-Ereignishandler für Form1 ein:
    Private Sub Form_Load()
    Set grec = New Record
    Set grs = New Recordset
    grec.Open "", "URL=http://servername/foldername/", , _
        adOpenIfExists Or adCreateCollection
    Set grs = grec.GetChildren
    While Not grs.EOF
        lstMain.AddItem grs(0)
        grs.MoveNext
    Wend
End Sub

    Dieser Code instanziiert die globalen Record- und Recordset-Objekte. Das Record-Objekt, grec, wird mit einem URL geöffnet, der als ActiveConnection angegeben wurde. Wenn der URL schon vorhanden ist, wird er geöffnet, andernfalls wird er erstellt. Beachten Sie, dass Sie http://servername/foldername/ durch einen gültigen URL aus der Umgebung ersetzen sollten.

    Das Recordset-Objekt, grs, wird auf den untergeordneten Elementen des Record-Objekts, grec, geöffnet. Dann wird lstMain mit den Dateinamen der auf dem URL veröffentlichten Ressourcen gefüllt.

Weiter Schritt 3: Auffüllen des Listenfeldes "Fields"


Schritt 3: Auffüllen des Listenfeldes "Fields"

So füllen Sie das Listenfeld "Fields" auf

Fügen Sie folgenden Code in den Form Load-Ereignishandler für Form1 ein:

Private Sub lstMain_Click()
    Dim rec As Record
    Dim rs As Recordset
    Set rec = New Record
    Set rs = New Recordset
    grs.MoveFirst
    grs.Move lstMain.ListIndex
    lstDetails.Clear
    rec.Open grs
    Select Case rec.RecordType
        Case adCollectionRecord:
            Set rs = rec.GetChildren
            While Not rs.EOF
                lstDetails.AddItem rs(0)
                rs.MoveNext
            Wend
        Case adSimpleRecord:
            recFields rec, lstDetails, txtDetails

        Case adStructDoc:
    End Select

End Sub

Mit diesem Code werden die lokalen Record- und Recordset-Objekte, rec bzw. rs, deklariert und instanziiert.

Die Zeile, die der in lstMain ausgewählten Ressource entspricht, wird die aktuelle Zeile von grs. Dann wird das Listenfeld Details gelöscht und rec wird mit der aktuellen Zeile von grs als Quelle geöffnet.

Wenn die Ressource ein Datensatz einer Auflistung (wie in RecordType angegeben) ist, wird das lokale Recordset rs auf den untergeordneten Elementen von rec geöffnet. Dann wird lstDetails mit den Werten der Zeilen von rs ausgefüllt.

Wenn die Ressource ein einfacher Datensatz ist, wird recFields aufgerufen. Weitere Informationen zu recFields finden Sie im nächsten Schritt.

Wenn die Ressource ein strukturiertes Dokument ist, wird kein Code implementiert.

Weiter Schritt 4: Auffüllen des Textfeldes "Details"


Schritt 4: Auffüllen des Textfeldes "Details"

So füllen Sie das Textfeld "Details" auf

Erstellen Sie eine neue Subroutine mit der Bezeichnung recFields, und fügen Sie folgenden Code ein:

Sub recFields(r As Record, l As ListBox, t As TextBox)
    Dim f As Field
    Dim s As Stream
    Set s = New Stream
    Dim str As String

    For Each f In r.Fields
        l.AddItem f.Name & ": " & f.Value
    Next
    t.Text = ""
    If r!RESOURCE_CONTENTCLASS = "text/plain" Then
        s.Open r, adModeRead, adOpenStreamFromRecord
        str = s.ReadText(1)
        s.Position = 0
        If Asc(Mid(str, 1, 1)) = 63 Then '//63 = "?"
            s.Charset = "ascii"
            s.Type = adTypeText
        End If
        t.Text = s.ReadText(adReadAll)
    End If
End Sub

Dieser Code füllt lstDetails mit den Feldern und Werten des einfachen Datensatzes auf, der an recFields übergeben wurde. Wenn die Ressource eine Textdatei ist, wird ein Text-Stream vom Ressourcendatensatz geöffnet. Durch den Code wird festgelegt, ob der ASCII-Zeichensatz verwendet wird, und der Code kopiert den Stream-Inhalt nach txtDetails.


ADO-Ereignismodell, synchrone und asynchrone Operationen

Das ADO-Ereignismodell unterstützt bestimmte synchrone und asynchrone ADO-Operationen, die Ereignisse oder Benachrichtigungen ausgeben, bevor die Operation beginnt oder nachdem sie abgeschlossen wurde. Ein Ereignis ist der Aufruf einer Ereignishandlerroutine, die Sie in der Anwendung definieren.

Mit Ereignishandlern, die vor dem Beginn einer Operation aufgerufen werden, können Sie Operationsparameter überprüfen und ändern, anschließend können Sie die Operation abbrechen oder vollständig ausführen.

Ereignishandler, die nach Beendigung einer Operation aufgerufen werden, sind besonders wichtig, da ADO asynchrone Operationen unterstützt. Eine Anwendung, die eine asynchrone Recordset.Open-Operation startet, wird z. B. durch eine Ausführung eines vollständigen Ereignisses benachrichtigt, wenn die Operation beendet ist.

Mithilfe des ADO-Ereignismodells wird zur Anwendung einiger Overhead hinzugefügt, aber weit größere Flexibilität geschaffen als bei anderen Methoden, die mit asynchronen Operationen zu tun haben, wie z. B. die Kontrolle der Status-Eigenschaft eines Objekts mit einer Schleife.

Weitere Informationen zu ADO-Ereignissen finden Sie unter den folgenden Themen:

  • Zusammenfassung der ADO-Ereignishandler

  • Ereignistypen

  • Ereignisparameter

  • Zusammenarbeit von Ereignishandlern

  • ADO-Ereignisse in ADO/WFC

  • ADO Event Instantiation by Language


ADO-Ereignishandler - Zusammenfassung

ADO-Ereignisse werden in zwei Gruppen unterteilt. Die ConnectionEvent-Gruppe gehört zu Operationen auf dem Connection-Objekt, und die RecordsetEvent-Gruppe gehört zu Operationen auf dem Recordset-Objekt.

  • ConnectionEvents - Ereignisse werden ausgelöst, wenn eine Transaktion auf einer Verbindung beginnt, ausgeführt oder zurückgesetzt wird, wenn ein Befehl ausgeführt wird, wenn eine Warnung während einer ConnectionEvent-Operation auftritt und wenn eine Verbindung beginnt oder endet.

  • RecordsetEvents - Ereignisse werden um asynchrone Abruf-Operationen ausgelöst, genauso als würden Sie zwischen den Zeilen eines Recordset-Objekts navigieren, ein Feld in einer Zeile eines Recordsets ändern, eine Zeile in einem Recordset ändern, ein Recordset mit einem serverseitigen Cursor öffnen, ein Recordset schließen oder irgendwelche Änderungen im Recordset vornehmen.

ADO-Ereignishandler - Zusammenfassung

Die folgende Tabelle fasst die Ereignisse und deren Beschreibungen zusammen.

ConnectionEvent | Beschreibung
BeginTransComplete, CommitTransComplete, RollbackTransComplete | Transaktionsmanagement - Benachrichtigung, dass die aktuelle Transaktion auf der Verbindung gestartet, ausgeführt oder zurückgesetzt wurde.
WillConnect, ConnectComplete, Disconnect | Verbindungsmanagement - Benachrichtigung, dass die aktuelle Verbindung starten wird, gestartet oder beendet wurde.
WillExecute, ExecuteComplete | Befehlsausführungsmanagement - Benachrichtigung, dass die Ausführung des aktuellen Befehls auf der Verbindung starten wird oder beendet wurde.
InfoMessage | Information - Benachrichtigung über zusätzliche Informationen zur aktuellen Operation.

RecordsetEvents | Beschreibung
FetchProgress, FetchComplete | Abfragestatus - Benachrichtigung über den Fortschritt der Datenabrufoperation oder über die Beendigung der Abrufoperation.
WillChangeField, FieldChangeComplete | Feldänderungsmanagement - Benachrichtigung, dass sich der Wert des aktuellen Feldes ändert oder geändert hat.
WillMove, MoveComplete, EndOfRecordset | Navigationsmanagement - Benachrichtigung, dass sich die aktuelle Zeilenposition in einem Recordset-Objekt ändert, geändert hat oder das Ende des Recordset-Objekts erreicht wurde.
WillChangeRecord, RecordChangeComplete | Zeilenänderungsmanagement - Benachrichtigung, dass sich Daten in der aktuellen Zeile eines Recordset-Objekts ändern werden oder geändert haben.
WillChangeRecordset, RecordsetChangeComplete | Recordset-Änderungsmanagement - Benachrichtigung, dass sich Daten im aktuellen Recordset-Objekt ändern werden oder geändert haben.


Ereignistypen

Will-Ereignisse

Ereignishandler, die vor dem Beginn einer Operation aufgerufen werden, ermöglichen Ihnen Operationsparameter zu überprüfen oder zu ändern, und danach können Sie die Operation entweder abbrechen oder ausführen lassen. Die Ereignishandlerroutinen haben in der Regel Namen der Form WillEreignis.

Complete-Ereignisse

Durch Ereignishandler, die nach Beendigung einer Operation aufgerufen werden, kann die Anwendung benachrichtigt werden, dass eine Operation abgeschlossen worden ist. Ein solcher Ereignishandler wird auch aufgerufen, wenn ein Will-Ereignishandler eine anstehende Operation abbricht. Diese Ereignishandlerroutinen haben in der Regel Namen der Form EreignisComplete.

Will- und Complete-Ereignisse werden in der Regel paarweise verwendet.

Andere Ereignisse

Die anderen Ereignishandler - Ereignisse, deren Namen nicht die Form WillEreignis oder EreignisComplete aufweisen - werden nur nach Beendigung einer Operation aufgerufen.


Ereignisparameter

Jeder Ereignishandler hat einen Statusparameter, der den Ereignishandler steuert. Die meisten Complete-Ereignisse haben einen Fehlerparameter, der angibt, ob die durch das Ereignis aufgerufene Operation erfolgreich war, genauso wie ein Objektparameter das ADO-Objekt angibt, auf das die Operation angewendet wird. (Das ExecuteComplete-Ereignis schließt Objektparameter für die Command-, Recordset- und Connection-Objekte ein, die mit dem Ereignis in Verbindung stehen.)

Die Parameter, die in der anstehenden Operation verwendet werden sollen, werden auch an die Will-Ereignisse übergeben. Auf diese Weise können Sie die Parameter überprüfen und angeben, ob die Operation beendet werden soll.

Einige Ereignishandler haben einen Begründungsparameter, der zusätzliche Informationen zum Ereignisgrund zur Verfügung stellt.

Statusparameter

Wenn die Ereignishandlerroutine aufgerufen wird, wird der Statusparameter auf einen der folgenden Informationswerte festgelegt.

Wert | Beschreibung
AdStatusOK | Die Operation, die das Ereignis verursacht hat, war erfolgreich.
AdStatusErrorsOccurred | Die Operation, die das Ereignis verursacht hat, war nicht erfolgreich, oder ein Will-Ereignis hat die Operation abgebrochen; weitere Informationen finden Sie im Fehlerparameter.
AdStatusCantDeny | Ein Will-Ereignis kann eine bevorstehende Operation nicht abbrechen.

Lassen Sie den Statusparameter unverändert, oder legen Sie ihn auf einen der folgenden Anforderungswerte fest, bevor die Ereignishandlerroutine zurückgegeben wird.

Wert | Beschreibung
AdStatusUnwantedEvent | Anforderung, dass dieser Ereignishandler keine weiteren Benachrichtigungen erhält.
AdStatusCancel | Anforderung, dass die bevorstehende Operation abgebrochen wird.

Abhängig vom Ereignistyp kann der Statusparameter beim Aufruf des Ereignishandlers einen der folgenden Werte haben.

Ereignistyp | Wert
Will | adStatusOK, adStatusCantDeny
Complete | adStatusOK, adStatusErrorsOccurred

Abhängig vom Ereignistyp kann der Statusparameter bei der Rückgabe des Ereignishandlers einen der folgenden Werte haben.

Ereignistyp | Wert
Will | adStatusOK, adStatusCancel, adStatusUnwantedEvent, adStatusCantDeny
Complete | adStatusOK, adStatusUnwantedEvent

Fehlerparameter

Der Fehlerparameter verweist auf ein ADO Error-Objekt, das Einzelheiten darüber enthält, warum die Operation fehlgeschlagen ist, wenn der Statusparameter adStatusErrorsOccurred ist.

Objektparameter

Der Objektparameter verweist auf ein ADO-Objekt, auf das die Operation angewendet wird. (Das ExecuteComplete-Ereignis schließt Objektparameter für die Command-, Recordset- und Connection-Objekte ein, die mit der Operation in Verbindung stehen.)

Anmerkung Der Objektparameter wird nicht bei Microsoft Visual Basic angewendet. Sie müssen für jedes Objekt einzelne Ereignishandler erstellen.

Begründungsparameter

Der Begründungsparameter, adReason, stellt zusätzliche Informationen zum Ereignisgrund zur Verfügung. Ereignisse mit einem adReason-Parameter können sogar für dieselbe Operation mehrmals aufgerufen werden, sofern jedes Mal ein anderer Grund vorliegt.

Der WillChangeRecord-Ereignishandler wird z. B. für Operationen aufgerufen, die im Begriff sind, einen Datensatz einzufügen, zu löschen oder zu ändern oder den betreffenden Vorgang rückgängig zu machen. Verwenden Sie den adReason-Parameter als einen Filter, um nur bestimmte Ereignisse zu verarbeiten.

Sie müssen adStatusUnwantedEvent im adStatus-Parameter zurückgeben, um anzufordern, dass ein Ereignishandler ohne adReason-Parameter aufhört, Ereignisbenachrichtigungen zu empfangen. Ein Ereignishandler mit adReason-Parameter kann jedoch mehrere Benachrichtigungen aus jeweils unterschiedlichen Gründen empfangen. Deshalb müssen Sie adStatusUnwantedEvent für jede Benachrichtigung zurückgeben, die durch einen anderen Grund verursacht wurde.

Sie haben z. B. einen WillChangeRecord-Ereignishandler in Visual Basic codiert. Wenn Sie keinerlei weitere Benachrichtigungen empfangen möchten, fügen Sie einfach den folgenden Code ein:

adStatus = adStatusUnwantedEvent

Wenn Sie jedoch Ereignisse verarbeiten möchten, bei denen das Löschen einer Zeile bevorsteht, aber Benachrichtigungen aus anderen Gründen verwerfen möchten, verwenden Sie den folgenden Code:

if (adReason = adRsnDelete)
' Ein Ereignis mit diesem Grund verarbeiten.
...
else
' Aufhören, Ereignisse mit anderen Gründen zu empfangen.
adStatus = adStatusUnwantedEvent
...


Zusammenarbeit von Ereignishandlern

Alle Ereignishandler in den ConnectionEvent- und RecordsetEvent-Gruppen müssen durchgeführt werden, auch wenn keine Ereignisse verwendet werden. Der Aufwand bei der Implementierung hängt von der verwendeten Programmiersprache ab. Weitere Informationen finden Sie unter ADO-Ereignisinstanziierung nach Sprachen.

Will- und Complete-Ereignishandler können paarweise oder einzeln verwendet werden.

Paarweise Ereignishandler

  • Das folgende Szenario beschreibt, was geschieht, wenn ein Will-Ereignis Erfolg hat.

    Ein Recordset-Objekt wurde paarweise aus WillChangeField- und FieldChangeComplete-Ereignissen zusammengestellt. Sie ändern in der Anwendung den Wert eines Feldes. Der WillChangeField-Ereignishandler wird aufgerufen. Sie geben eine Anzeige zurück, dass das Feld geändert werden kann. Die Operation wird abgeschlossen, und ein FieldChangeComplete-Ereignis informiert die Anwendung, dass die Operation beendet wird. Der Statusparameter des Ereignishandlers berichtet den erfolgreichen Abschluss der Operation.

  • Das folgende Szenario beschreibt, was geschieht, wenn ein Will-Ereignis eine Operation abbricht.

    In derselben Anwendung ändern Sie ein weiteres Feld. Der WillChangeField-Ereignishandler wird aufgerufen. Sie entscheiden aus einem bestimmten Grund, dass Sie die Änderung des Feldes nicht annehmen, und geben adStatusCancel im Statusparameter zurück. Die Operation wird daher nicht beendet.

    Durch das FieldChangeComplete-Ereignis werden Sie benachrichtigt, dass die Operation beendet ist. Der Statusparameter des Ereignishandlers ist auf adStatusErrorsOccurred festgelegt, der Fehlerparameter verweist auf ein Error-Objekt, und die Number-Eigenschaft des Error-Objekts wird entweder auf einen ADO-Wert oder einen Provider-Wert festgelegt, der angibt, dass die Operation abgebrochen wurde.

  • Für dieselbe Operation können mehrere Will- und Complete-Ereignishandler aufgerufen werden. Das folgende Szenario beschreibt, was geschieht, wenn mehrere Will-Ereignisse Erfolg haben.

    Ein Recordset-Objekt wurde paarweise aus WillChangeField-, FieldChangeComplete-, WillChangeRecord- und RecordChangeComplete-Ereignissen zusammengestellt. Sie ändern den Wert eines Feldes, der WillChangeField-Ereignishandler wird aufgerufen, und Sie geben eine Anzeige zurück, dass das Feld geändert werden kann.

    Als Nächstes wird der WillChangeRecord-Ereignishandler aufgerufen, und Sie geben erneut an, dass die Operation beendet werden kann.

    Anmerkung Im Allgemeinen werden alle Will-Ereignishandler aufgerufen, die zu einer bestimmten Instanz eines ADO-Objekts gehören. Sie werden jedoch in keiner bestimmten Reihenfolge aufgerufen.

    Wurde die Operation beendet, werden die FieldChangeComplete- und RecordChangeComplete-Ereignishandler aufgerufen.

  • Für dieselbe Operation können mehrere Will- und Complete-Ereignishandler aufgerufen werden, durch eine davon kann die anstehende Operation jedoch abgebrochen werden. Das folgende Szenario beschreibt, was geschieht, wenn das letzte von mehreren Will-Ereignissen eine Operation abbricht.

    Auch hier wurde ein Recordset-Objekt paarweise aus WillChangeField-, FieldChangeComplete-, WillChangeRecord- und RecordChangeComplete-Ereignissen zusammengestellt. Sie ändern den Wert eines Feldes, der WillChangeField-Ereignishandler wird aufgerufen, und Sie geben eine Anzeige zurück, dass das Feld geändert werden kann.

    Als Nächstes wird der WillChangeRecord-Ereignishandler aufgerufen. Vielleicht geben Sie an, dass die Feldänderung an sich akzeptiert wird, aber es tritt ein Fehler im gesamten Datensatz auf. Sie geben adStatusCancel zurück, um anzugeben, dass eine Änderung des Feldes nicht akzeptiert wird. Der WillChangeField-Ereignishandler hat die Operation bereits erlaubt.

    Die Operation wird nicht beendet, da der WillChangeRecord-Ereignishandler sie abgebrochen hat. Der FieldChangeComplete-Ereignishandler wird aufgerufen, und der Statusparameter ist auf adStatusErrorsOccurred festgelegt; der Fehlerparameter ist entsprechend festgelegt.

    Danach wird der RecordChangeComplete-Ereignishandler ebenfalls aufgerufen, der Statusparameter ist auf adStatusErrorsOccurred festgelegt. Das entsprechende Complete-Ereignis wird für das Will-Ereignis aufgerufen.

  • Für dieselbe Operation können mehrere Will- und Complete-Ereignishandler aufgerufen werden, durch eine davon kann die anstehende Operation jedoch abgebrochen werden. Das folgende Szenario beschreibt, was geschieht, wenn die Operation durch einen anderen Ereignishandler als den letzten von mehreren Will-Ereignissen abgebrochen wird.

    Auch hier wurde ein Recordset-Objekt paarweise aus WillChangeField-, FieldChangeComplete-, WillChangeRecord- und RecordChangeComplete-Ereignissen zusammengestellt. Sie ändern den Wert eines Feldes, der WillChangeField-Ereignishandler wird aufgerufen, und Sie geben adStatusCancel zurück, um anzugeben, dass die Änderung im Feld nicht akzeptiert wird. Die Operation wird nicht beendet; das FieldChangeComplete-Ereignis gibt an, dass die Operation beendet ist, die Status- und Fehlerparameter sind entsprechend festgelegt.

    Der Ereignishandler WillChangeRecord (und damit RecordChangeComplete) wird jedoch nicht aufgerufen, da die Operation durch das erste Will-Ereignis abgebrochen wurde. Im Allgemeinen gilt, dass keine anstehenden Will-Ereignishandler aufgerufen werden, wenn eine Operation durch ein Will-Ereignis abgebrochen wurde.

Nicht paarweise Ereignishandler

Sie können die Ereignisbenachrichtigungen für jedes Ereignis ausschalten, indem Sie im Statusparameter adStatusUnwantedEvent zurückgeben. Wenn Sie z. B. der Complete-Ereignishandler das erste Mal aufrufen, geben Sie adStatusUnwantedEvent zurück. Sie empfangen dann nur Will-Ereignisse.

Einzelne Will-Ereignishandler können nützlich sein, wenn Sie die Parameter überprüfen möchten, die in einer Operation verwendet werden. Sie können diese Operationsparameter ändern oder die Operation abbrechen.

Alternativ können Sie die Complete-Ereignisbenachrichtigung aktiviert lassen. Wenn Sie zuerst den Will-Ereignishandler aufrufen, geben Sie adStatusUnwantedEvent zurück. Sie empfangen dann nur Complete-Ereignisse.

Einzelne Complete-Ereignishandler können beim Verwalten asynchroner Operationen nützlich sein. Jede asynchrone Operation hat ein entsprechendes Complete-Ereignis.

Es kann z. B. sehr lange dauern, ein großes Recordset-Objekt aufzufüllen. Wenn die Anwendung richtig geschrieben wurde, können Sie eine Recordset.Open(...,adAsyncExecute)-Operation beginnen und mit anderen Verarbeitungsschritten fortfahren. Sie werden schließlich durch ein ExecuteComplete-Ereignis benachrichtigt, wenn das Recordset-Objekt aufgefüllt wurde.

Einzelne Ereignishandler und mehrere Objekte

Durch die Flexibilität einer Programmiersprache wie Microsoft Visual C++ kann ein Ereignishandler die Ereignisse mehrerer Objekte verarbeiten. Ein Disconnect-Ereignishandler kann z. B. die Ereignisse verschiedener Connection-Objekte verarbeiten. Wird eine der Verbindungen beendet, wird der Disconnect-Ereignishandler aufgerufen. Sie können sagen, welche Verbindung das Ereignis ausgelöst hat, da der Objektparameter des Ereignishandlers auf das entsprechende Connection-Objekt festgelegt wurde.

Anmerkung Diese Technik kann in Visual Basic nicht verwendet werden, da bei dieser Sprache nur ein Objekt pro Ereignis verarbeitet werden kann.

Mehrere Ereignishandler und einzelne Operationen

Es ist möglich, ein ADO-Objekt und seine Operationen mit mehreren Gruppen von Ereignissen zu verbinden. Sie können z. B. mehrere WillChangeField-Ereignisse erstellen, die jeweils eine bestimmte Feldüberprüfungsbearbeitung durchführen. Wenn ein Feld geändert werden soll, kann ein Will-Ereignis einen Aspekt des Feldwertes überprüfen, danach kann ein anderes Will-Ereignis einen anderen Aspekt prüfen.

Wenn möglich, können Sie alle Bearbeitungen von einem einzigen Ereignishandler verrichten oder aufrufen.


ADO-Ereignisse in ADO/WFC

ADO für Windows Foundation Classes (ADO/WFC) basiert auf dem ADO-Ereignismodell und stellt eine vereinfachte Schnittstelle für die Anwendungsprogrammierung dar. Im Allgemeinen fängt ADO/WFC die ADO-Ereignisse ab, stellt die Ereignisparameter in einer einzelnen Ereignisklasse zusammen und ruft dann den Ereignishandler auf.

So verwenden Sie ADO-Ereignisse in ADO/WFC

  1. Definieren Sie einen eigenen Ereignishandler zur Verarbeitung eines Ereignisses. Wenn Sie das ConnectComplete-Ereignis z. B. in der ConnectionEvent-Gruppe verarbeiten möchten, können Sie folgenden Code verwenden:
        public void onConnectComplete(Object sender,ConnectionEvent e)
{
    System.out.println("onConnectComplete:" + e);
}
  2. Definieren Sie ein handler-Objekt zur Darstellung des Ereignishandlers. Das handler-Objekt muss dem Datentyp ConnectEventHandler für ein Ereignis des Typs ConnectionEvent oder dem Datentyp RecordsetEventHandler für ein Ereignis des Typs RecordsetEvent entsprechen. Schreiben Sie z. B. folgenden Code für den ConnectComplete-Ereignishandler:
        ConnectionEventHandler handler =
        new ConnectionEventHandler(this, "onConnectComplete");

    Das erste Argument des ConnectionEventHandler-Konstruktors verweist auf die Klasse, welche den im zweiten Argument genannten Ereignishandler enthält.

    Der Microsoft Visual J++-Compiler unterstützt auch eine äquivalente Syntax:

        ConnectionEventHandler handler =
        new ConnectionEventHandler(this.onConnectComplete);

    Das einzelne Argument ist ein Verweis auf die gewünschte Klasse (this) und Methode innerhalb der Klasse (onConnectComplete).

  3. Fügen Sie den Ereignishandler in eine Liste von Handlern ein, die zur Verarbeitung eines besonderen Ereignistyps gedacht ist. Verwenden Sie die Methode mit einem Namen, wie addOn EventName (handler).

  4. ADO/WFC implementiert intern alle ADO-Ereignishandler. Daher wird ein durch eine Connection- oder Recordset-Operation verursachtes Ereignis von einem ADO/WFC-Ereignishandler abgefangen.

    Der ADO/WFC-Ereignishandler übergibt ADO ConnectionEvent-Parameter in eine Instanz der ADO/WFC ConnectionEvent-Klasse oder ADO RecordsetEvent-Parameter in eine Instanz der ADO/WFC RecordsetEvent-Klasse. Diese ADO/WFC-Klassen stellen die ADO-Ereignisparameter zusammen; jede ADO/WFC-Klasse enthält ein Datenelement für jeden einzelnen Parameter in allen ADO ConnectionEvent- oder RecordsetEvent-Methoden.

  5. ADO/WFC ruft dann den Ereignishandler mit dem ADO/WFC-Ereignisobjekt auf. Der onConnectComplete-Handler hat z. B. folgende Signatur:
        public void onConnectComplete(Object sender,ConnectionEvent e)

    Das erste Argument ist der Objekttyp (Connection oder Recordset), der das Ereignis gesendet hat, und das zweite Argument ist das ADO/WFC-Ereignisobjekt (ConnectionEvent oder RecordsetEvent).

    Die Signatur des Ereignishandlers ist einfacher als ein ADO-Ereignis. Sie sollten aber das ADO-Ereignismodell verstehen, damit Sie wissen, welche Parameter auf ein Ereignis angewendet werden und wie Sie darauf antworten.

  6. Kehren Sie von Ihrem Ereignishandler zum ADO/WFC-Handler für das ADO-Ereignis zurück. ADO/WFC kopiert die entsprechenden Datenelemente des ADO/WFC-Ereignisses in die ADO-Ereignisparameter zurück, dann wird der ADO-Ereignishandler zurückgegeben.

  7. Wenn die Verarbeitung abgeschlossen ist, entfernen Sie den Handler aus der Liste der ADO/WFC-Ereignishandler. Verwenden Sie die Methode mit einem Namen, wie removeOn EventName (handler).


ADO-Ereignisinstanziierung nach Sprachen

Jede Programmiersprache erstellt die Instanzen von ADO-Ereignissen auf unterschiedliche Weise. In allen folgenden Beispielen wird ein ConnectComplete-Ereignishandler erstellt.

Visual Basic

Es gibt in Visual Basic zwei Möglichkeiten, um Instanzen von ADO-Ereignissen zu erstellen. Beide erfordern, dass die Objektvariable, die mithilfe des WithEvents-Schlüsselwortes deklariert wurde, Teil eines Klassenmoduls ist und dass das Objekt die Möglichkeit hat, alle Codes im Modul zu erkennen. In der ersten Instanz erstellen Sie ein Ereignisobjekt und ein separates Objekt zur Bearbeitung. (Formobjekte sind in Visual Basic Klassen.)

Dim WithEvents connEvent as Connection
Dim conn as New Connection

Private Sub MySub()
    set connEvent = conn        ' Ereignisunterstützung
                                ' aktivieren.
    conn.Open(...)
    ...
    set connEvent = Nothing    ' Ereignisunterstützung
                               ' deaktivieren.
    ...
End Sub

Private Sub connEvent_ConnectComplete(ByVal err as ADODB.Error, & _
 adStatus as ADODB.EventStatus, ByVal pConnection as ADODB.Connection)
    ' Error-Objekt nur überprüfen, wenn adStatus
    ' gleich adStatusErrorsOccurred ist.
    ...
End Sub

Die zweite Instanz verwendet nur ein einzelnes Objekt.

Dim WithEvents conn as New Connection

Private Sub MySub()
    conn.Open(...)
    ...
    set conn = Nothing    ' Ereignisunterstützung
                          ' deaktivieren.
    ...
End Sub

Private Sub conn_ConnectComplete(ByVal err as ADODB.Error, & _
 adStatus as ADODB.EventStatus, ByVal pConnection as ADODB.Connection)
    ' Error-Objekt nur überprüfen, wenn adStatus
    ' gleich adStatusErrorsOccurred ist.
    ...
End Sub

Visual C++

Im Folgenden wird schematisch beschrieben, wie ADO-Ereignisse in Visual C++ instanziiert werden. Eine vollständige Beschreibung finden Sie unter Beispiel für das ADO-Ereignismodell (VC++).

Erstellen Sie von den in der Datei adoint.h befindlichen ConnectionEventsVt- und RecordsetEventsVt-Schnittstellen abgeleitete Klassen.

class CConnEvent : public ConnectionEventsVt
{
    public:
    STDMETHODIMP InfoMessage(
            ADOError *pError,
            EventStatusEnum *adStatus,
            _ADOConnection *pConnection);
...
}

class CRstEvent : public RecordsetEventsVt
{
    public:
        STDMETHODIMP WillChangeField(
                LONG cFields,
                VARIANT Fields,
                EventStatusEnum *adStatus,
                _ADORecordset *pRecordset);
...
}

Implementieren Sie alle Methoden der Ereignishandler in beiden Klassen. Es reicht aus, wenn jede Methode nur S_OK als HRESULT zurückgibt. Wenn Sie jedoch bekannt geben, dass Ihre Ereignishandler verfügbar sind, werden sie standardmäßig kontinuierlich aufgerufen. Sie können auch anfordern, dass nach dem ersten Mal keine weitere Benachrichtigung erfolgt, indem Sie adStatus auf adStatusUnwantedEvent festlegen.

STDMETHODIMP CConnEvent::ConnectComplete(
            ADOError *pError,
            EventStatusEnum *adStatus,
            _ADOConnection *pConnection)
        {
        *adStatus = adStatusUnwantedEvent;
        return S_OK;
        }

Die Ereignisklassen erben Informationen von IUnknown. Deshalb müssen Sie auch die QueryInterface-, AddRef- und Release-Methoden implementieren. Implementieren Sie auch Klassenkonstruktoren und -destruktoren. Wählen Sie die Visual C++-Werkzeuge, mit denen Sie am liebsten arbeiten, um diesen Teil des Vorgangs zu vereinfachen.

Geben Sie bekannt, dass Ihre Ereignishandler verfügbar sind, indem Sie QueryInterface auf den Recordset- und Connection-Objekten für die Schnittstellen IConnectionPointContainer und IConnectionPoint ausführen. Führen Sie dann IConnectionPoint::Advise für jede Klasse aus.

Nehmen Sie z. B. an, Sie verwenden eine boolesche Funktion, die true zurückgibt, wenn Sie ein Recordset-Objekt erfolgreich darüber informiert, dass Sie verfügbare Ereignishandler besitzen.

HRESULT    hr;
DWORD      dwEvtClass;
IConnectionPointContainer    *pCPC = NULL;
IConnectionPoint             *pCP = NULL;
CRstEvent                    *pRStEvent = NULL;
...
_RecordsetPtr                pRs;
pRs.CreateInstance(__uuidof(Recordset));
pRStEvent = new CRstEvent();
if (pRStEvent == NULL) return FALSE;
...
hr = pRs->QueryInterface(IID_IConnectionPointContainer, &pCPC);
if (FAILED(hr)) return FALSE;
hr = pCPC->FindConnectionPoint(IID_ADORecordsetEvents, &pCP);
pCPC->Release();    // Hier immer freigeben, selbst vor der Überprüfung.
if (FAILED(hr)) return FALSE;
hr = pCP->Advise(pRstEvent, &dwEvtClass);    // Ereignisunterstützung
                                          // aktivieren.
pCP->Release();
if (FAILED(hr)) return FALSE;
...
return TRUE;
...

An dieser Stelle werden Ereignisse für die RecordsetEvent-Gruppe aktiviert und Ihre Methoden werden aufgerufen, wenn Recordset-Ereignisse auftreten.

Rufen Sie später, wenn Sie die Verfügbarkeit Ihrer Ereignishandler aufheben möchten, den Verbindungspunkt erneut ab, und führen Sie die IConnectionPoint::Unadvise-Methode aus.

...
hr = pCP->UnAdvise(dwEvtClass);    // Ereignisunterstützung
                                   // deaktivieren.
pCP->Release();
if (FAILED(hr)) return FALSE;
...

Selbstverständlich müssen Sie die jeweiligen Schnittstellen freigeben und die entsprechenden Klassenobjekte löschen.

Visual J++

import wfc.data.*;
public class MyClass
{
ConnectionEventHandler handler =
    new ConnectionEventHandler(this,"onConnectComplete");

    public void onConnectComplete(Object sender,ConnectionEvent e)
    {
        if (e.adStatus == AdoEnums.EventStatus.ERRORSOCCURRED)
            System.out.println("Connection failed");
        else
            System.out.println("Connection completed");
        return;
    }

    void main( void )
    {
        Connection conn = new Connection();

        conn.addOnConnectComplete(handler);     // Ereignisunterstützung
                                                // aktivieren.
        conn.open("DSN=Pubs");
        conn.close();
        conn.removeOnConnectComplete(handler);  // Ereignisunterstützung
                                                // deaktivieren.
    }
}

Microsoft Visual Basic Scripting Edition

VBScript unterstützt keine Ereignisse.


Datenstrukturierung

Datenstrukturierung bietet einen Weg zur Abfrage einer Datenquelle und Rückgabe eines Recordset-Objekts, das eine übergeordnete-untergeordnete Beziehung zwischen zwei oder mehreren lokalen Einheiten (eine Hierarchie) darstellt. Ein klassisches Beispiel einer hierarchischen Beziehung sind Kunden und Bestellungen. Für jeder Kunden in einer Datenbank können keine oder mehrere Bestellungen vorliegen. SQL bietet Mittel zur Abfrage der Daten unter Verwendung der Verbindungssyntax an, das kann aber wenig effektiv und unhandlich sein, da überflüssige übergeordnete Daten in jedem Datensatz für eine gegebene übergeordnete-untergeordnete Beziehung zurückgegeben werden. Datenstrukturierung kann einen einzelnen übergeordneten Datensatz im übergeordneten Recordset mit mehrfachen untergeordneten Datensätzen im untergeordneten Recordset verbinden, unter Verhinderung der Redundanz einer Verknüpfung.

Die Syntax der Datenstrukturierung bietet auch andere Fähigkeiten an. Entwickler können ein neues Recordset-Objekt mithilfe des Schlüsselwortes NEW ohne eine zugrunde liegende Datenquelle erstellen, um die Felder der übergeordneten und untergeordneten Recordsets zu beschreiben. Das neue Recordset-Objekt kann mit Daten aufgefüllt und dauerhaft gespeichert werden. Entwickler können auch verschiedene Berechnungen oder Aggregationen (z. B. SUM, AVG oder MAX) in untergeordneten Feldern ausführen, und dann ein übergeordnetes Recordset durch Ableiten übergeordneter Spaltenwerte aus diesen gruppierten untergeordneten Datensätzen erstellen.

Weitere Informationen zur Datenstrukturierung finden Sie unter den folgenden Themen:

  • Datenstrukturierung - Zusammenfassung

  • Erforderliche Provider für die Datenstrukturierung

  • Strukturierungsbefehle im Allgemeinen

  • Strukturierungsklausel Append

  • Strukturierungsklausel Compute

  • Erstellen hierarchischer Recordsets

  • Zugreifen auf Zeilen in einem hierarchischen Recordset

  • Formale Strukturierungsgrammatik

  • Funktionen von Visual Basic für Applikationen


Datenstrukturierung - Zusammenfassung

Im Folgenden werden Konzepte der Datenstrukturierung, hierarchischer Recordsets, der Neustrukturierung, der Enkel-Aggregate und die Syntax der Strukturierungsbefehle beschrieben.

Datenstrukturierung

Bei der Datenstrukturierung haben Sie die Möglichkeit, die Spalten eines strukturierten Recordset, die Beziehungen zwischen den von den Spalten dargestellten Einheiten sowie die Art und Weise, wie das Recordset mit Daten gefüllt wird, festzulegen.

Spalten eines strukturierten Recordset-Objekts können Daten eines Datenproviders, beispielsweise SQL Server, Verweise auf ein anderes Recordset, Berechnungswerte einer einzelnen Recordset-Zeile bzw. Werte eines Spaltenvorgangs eines vollständigen Recordset-Objekts enthalten, oder aber es kann sich bei ihnen um vollständig neue, leere Spalten handeln.

Wenn Sie den Wert einer Spalte abrufen, die einen Verweis auf ein anderes Recordset enthält, gibt ADO das durch den Verweis dargestellte eigentliche Recordset automatisch zurück. Ein Recordset, das ein anderes Recordset enthält, wird als hierarchisches Recordset bezeichnet. Hierarchische Recordsets weisen eine übergeordnete-untergeordnete Beziehung auf, wobei das übergeordnete Element das enthaltende Recordset und das untergeordnete Element das enthaltene Recordset ist. Bei einem Verweis auf ein Recordset handelt es sich eigentlich um einen Verweis auf eine Teilmenge des untergeordneten Elements, das als Kapitel bezeichnet wird. Ein einzelnes übergeordnetes Element kann auf mehr als ein untergeordnetes Recordset verweisen.

Die Syntax des Strukturierungsbefehls ermöglicht Ihnen die programmgesteuerte Erstellung eines strukturierten Recordsets. Anschließend können Sie programmgesteuert oder über ein entsprechendes grafisches Steuerelement auf die Komponenten des Recordset-Objekts zugreifen. Ein Strukturierungsbefehl wird genau wie jeder andere ADO-Befehlstext ausgegeben.

Mit der Syntax des Strukturierungsbefehls können Sie auf zwei Wegen hierarchische Recordset-Objekte erstellen. Bei der ersten Möglichkeit wird ein untergeordnetes Recordset einem übergeordneten Recordset angehängt. Das übergeordnete und das untergeordnete Recordset verfügen dabei in der Regel mindestens über eine gemeinsame Spalte: der Spaltenwert in einer Zeile des übergeordneten Elements stimmt mit dem Spaltenwert aller Zeilen des untergeordneten Elements überein.

Bei der zweiten Möglichkeit wird ein übergeordnetes Recordset aus einem untergeordneten Recordset erzeugt. Das übergeordnete Recordset muss eine Kapitelspalte aufweisen, die auf das untergeordnete Recordset verweist. Sie können weitere übergeordnete Spalten erstellen, indem eine Aggregatoperation auf eine untergeordnete Spalte ausführen, Ausdrücke in einer Zeile eines Recordset-Objekts berechnen, eine Gruppenspalte mit dem Schlüsselwort BY angegeben oder neue leere Spalten anhängen.

Sie können hierarchische Recordset-Objekte bis zur gewünschten Tiefe verschachteln (d. h., untergeordnete Recordset-Objekte von untergeordneten Recordset-Objekten erstellen usw.).

Anschließend können Sie programmgesteuert oder über ein entsprechendes grafisches Steuerelement auf die Recordset-Komponenten des strukturierten Recordset-Objekts zugreifen.

Aus diesem Grund stellt Microsoft ein grafisches Tool zur Verfügung, mit dem sich Strukturierungsbefehle erstellen lassen (siehe hierzu in der Visual Basic-Dokumentation unter The Data Environment Designer) sowie ein anderes grafisches Tool zum Anzeigen hierarchischer Cursor (siehe hierzu in der Visual Basic-Dokumentation unter Using the Microsoft Hierarchical Flexgrid Control).

Neustrukturierung

Einem mit einer Klausel eines Strukturierungsbefehls erstellten Recordset kann ein Alias (für gewöhnlich mit dem Schlüsselwort AS) zugewiesen werden. Auf den Alias eines strukturierten Recordset-Objekts kann in einem vollständig anderen Befehl verwiesen werden. Sie können ein zuvor strukturiertes Recordset in einem neuen Strukturierungsbefehl wiederverwenden oder neustrukturieren. Um dieses Feature zu unterstützen, bietet ADO die Reshape Name-Eigenschaft an.

Die Neustrukturierung hat zwei Hauptfunktionen. Die erste Funktion ordnet ein vorhandenes Recordset einem neuen übergeordneten Recordset zu.

Beispiel

. . .
rs1.Open "SHAPE {select * from Customers} " & _
            "APPEND ({select * from Orders} AS chapOrders " & _
            "RELATE CustomerID to CustomerID)", cn

rs2.Open "SHAPE {select * from Employees} " & _
            "APPEND (chapOrders RELATE EmployeeID to EmployeeID)", cn
. . .

Die zweite Funktion wird den Zugriff ohne Kapitel auf ein vorhandenes untergeordnetes Recordset-Objekt unter Verwendung der Syntax "SHAPE <recordset reshape name>" aktivieren.

Anmerkung Sie können keine Spalten an vorhandene Recordset-Objekte anfügen, ein parametrisiertes Recordset oder die Recordset-Objekte in eingreifenden COMPUTE-Klauseln nicht neu strukturieren oder Aggregatoperationen auf beliebigen Recordset-Objekten durchführen, die von neustrukturierten Recordset-Objekten abstammen. Das neustrukturierte Recordset und der neue Strukturierungsbefehl müssen beide das gleiche Connection -Objekt verwenden.

Enkel-Aggregate

Einer mit einer Klausel eines Strukturierungsbefehls erstellten Kapitelspalte kann ein Kapitelalias (für gewöhnlich mit dem Schlüsselwort AS) zugewiesen werden. Sie können jede Spalte in allen Kapiteln des strukturierten Recordset-Objekts mit einem vollständigen Namen angeben, um das untergeordnete Element mit der entsprechenden Spalte festzulegen. Enthält beispielsweise das übergeordnete Kapitel, Kap1, das untergeordnete Kapitel, Kap2, das die Mengenspalte, Meng, aufweist, lautet der vollständige Name Kap1.Kap2.Meng. Der vollständige Name kann anschließend als Argument für eine der Aggregatfunktionen (SUM, AVG, MAX, MIN, COUNT, STDEV oder ANY) verwendet werden.

Parametrisierte Befehle mit eingreifenden COMPUTE-Befehlen

Ein herkömmlicher parametrisierter APPEND-Strukturierungsbefehl verfügt über eine Klausel, die ein übergeordnetes Recordset mit einem Abfragebefehl erstellt, und über eine weitere Klausel, die ein untergeordnetes Recordset mit einem parametrisierten Abfragebefehl erstellt; d. h. einen Befehl mit einem Parameterplatzhalter (ein Fragezeichen "?"). Das sich ergebende strukturierte Recordset weist zwei Ebenen auf, bei dem das übergeordnete Element die obere und das untergeordnete Element die untere Ebene belegt.

Bei der Klausel, die das untergeordnete Recordset erstellt, kann es sich um eine willkürliche Anzahl verschachtelter COMPUTE-Strukturierungsbefehle handeln, bei der der am tiefsten verschachtelte Befehl die parametrisierte Abfrage enthält. Das sich ergebende strukturierte Recordset verfügt über mehrere Ebenen, bei dem das übergeordnete Element die oberste, das untergeordnete Element die unterste und eine mit COMPUTE-Strukturierungsbefehlen willkürlich erstellte Anzahl von Recordset-Objekten die eingreifenden Ebenen belegen.

Die typische Verwendung für diese Funktion dient dem Aufrufen der Aggregatfunktion und Gruppierungsmöglichkeiten von COMPUTE-Strukturierungsbefehlen, um eingreifende Recordset-Objekte mit analytischen Informationen zum untergeordneten Recordset zu erstellen. Da es sich dabei um einen parametrisierten Strukturierungsbefehl handelt, kann darüber hinaus bei jedem Zugriff auf eine Kapitelspalte des übergeordneten Elements ein neues untergeordnetes Recordset abgerufen werden. Da die eingreifenden Ebenen vom untergeordneten Element bezogen werden, werden diese ebenfalls neu berechnet.

Dauerhafte Speicherung hierarchischer Recordsets

Sie können ein hierarchisches Recordset in einer Datei, entweder im ADTG- oder XML-Format speichern, indem Sie die Save-Methode aufrufen. Zwei Einschränkungen treten jedoch auf, wenn hierarchische Recordset-Objekte im XML-Format gespeichert werden: Sie können nicht im XML-Format speichern, wenn das hierarchische Recordset-Objekt anstehende Aktualisierungen enthält, und Sie können kein parametrisiertes, hierarchisches Recordset-Objekt speichern.

Weitere Informationen über Datenstrukturierungsprovider finden Sie unter Microsoft Data Shaping Service für OLE DB (ADO) und Der Data Shaping Service für OLE DB.


Erforderliche Provider für die Datenstrukturierung

Für eine Datenstrukturierung sind für gewöhnlich zwei Provider erforderlich. Der Serviceprovider, Data Shaping Service für OLE DB, stellt die Datenstrukturierungsfunktionalität und der Datenprovider, beispielsweise der OLE DB-Provider für SQL Server, stellt die Datenzeilen zum Füllen des strukturierten Recordsets zur Verfügung.

Der Name des Serviceproviders kann dabei als der Wert der Provider-Eigenschaft des Connection-Objekts oder als Schlüsselwort der Verbindungszeichenfolge, "Provider=", angegeben werden.

Der Name des Datenproviders kann als der Wert der dynamischen Eigenschaft "Data Provider" angegeben werden, der vom Data Shaping Service für OLE DB oder dem Schlüsselwort der Verbindungszeichenfolge, "Data Provider=", zur Properties-Auflistung des Connection-Objekts hinzugefügt wird.

Es ist kein Datenprovider erforderlich, wenn das Recordset nicht gefüllt wird (z. B. wie in einem erzeugten Recordset, in dem Spalten mit dem Schlüsselwort NEW erstellt werden). Geben Sie in diesem Fall "Data Provider=none" an.

Beispiel

Dim cnn As New ADODB.Connection
cnn.Provider = "MSDataShape"
cnn.Open "Data Provider=MSDASQL;DSN=vfox;uid=sa;pwd=vfox;database=Pubs„


Strukturierungsbefehle im Allgemeinen

Bei der Datenstrukturierung werden die Spalten eines strukturierten Recordsets, die Beziehungen zwischen den von den Spalten dargestellten Einheiten sowie die Art und Weise festgelegt, wie das Recordset mit Daten gefüllt wird.

Ein strukturiertes Recordset kann aus den folgenden Arten von Spalten bestehen:

Spaltentyp | Beschreibung
Daten | Felder eines Recordset-Objekts, die von einem Abfragebefehl zu einem Datenprovider, einer Tabelle oder einem zuvor strukturierten Recordset zurückgegeben wurden.
Kapitel | Ein Verweis auf ein anderes Recordset, der als Kapitel bezeichnet wird; Kapitelspalten ermöglichen das Festlegen einer übergeordneten-untergeordneten Beziehung, bei der das übergeordnete Element das die Kapitelspalte enthaltende Recordset und das untergeordnete Element das vom Kapitel dargestellte Recordset ist.
Aggregat | Der Wert der Spalte wird durch Ausführen einer Aggregatfunktion auf alle Zeilen oder auf eine Spalte aller Zeilen eines untergeordneten Recordset abgeleitet (siehe unter "Aggregatfunktionen" in der nachstehenden Tabelle)
Berechneter Ausdruck | Der Wert der Spalte wird durch Berechnen eines Ausdrucks von Visual Basic für Applikationen auf Spalten in derselben Zeile des Recordset-Objekts abgeleitet. Der Ausdruck ist das Argument für die CALC-Funktion (siehe unter "Berechneter Ausdruck" in der nachstehenden Tabelle und unter Funktionen von Visual Basic für Applikationen).
Neu | Leere, erstellte Felder, die mit Daten zu einem späteren Zeitpunkt gefüllt werden können; die Spalte wird mit dem Schlüsselwort NEW festgelegt (siehe unter "Schlüsselwort NEW" in der nachstehenden Tabelle).

Ein Strukturierungsbefehl kann eine Klausel enthalten, die einen Abfragebefehl zu einem zugrunde liegenden Datenprovider angibt, der das Recordset-Objekt zurückgibt. Die Abfragesyntax hängt von den Anforderungen dieses zugrunde liegenden Datenproviders ab. In der Regel handelt es sich um Structured Query Language (SQL), ADO setzt jedoch keine besondere Abfragesprache voraus.

Sie können eine JOIN-Anweisung von SQL verwenden, um zwei Tabellen zu verbinden. In einem hierarchischen Recordset-Objekt werden die Daten jedoch möglicherweise effizienter dargestellt. In jeder Zeile eines durch JOIN erstellten Recordset-Objekts können die Daten aus einer der Tabellen beliebig oft wiederholt werden. Ein hierarchisches Recordset-Objekt hat nur ein übergeordnetes Recordset-Objekt für jedes der zahlreichen untergeordneten Recordset-Objekte.

Strukturierungsbefehle können über Recordset-Objekte oder über die Einstellung der CommandText-Eigenschaft des Command-Objekts und den folgenden Aufruf der Execute-Methode verwendet werden.

Strukturierungsbefehle können verschachtelt werden. Das bedeutet, dass es sich beim übergeordneten oder untergeordneten Befehl selbst um einen weiteren Strukturierungsbefehl handeln kann.

Weitere Informationen über das Bewegen eines hierarchischen Recordset-Objekts finden Sie unter Zugreifen auf Zeilen in einem hierarchischen Recordset.

Genaue Informationen zu syntaktisch korrekten Strukturierungsbefehlen finden Sie unter Formale Strukturierungsgrammatik.

Aggregatfunktionen, die CALC-Funktion und das Schlüsselwort NEW

Datenstrukturierung unterstützt die folgenden Funktionen. Der Name, der dem Kapitel zugeordnet ist, das die zu bearbeitende Spalte enthält, ist der Kapitelalias.

Ein Kapitelalias kann dabei vollständig sein und die einzelnen Kapitelspaltennamen enthalten, die zu den Kapiteln führen, die den Spaltennamen enthalten, wobei alle Bezeichnungen durch Punkte voneinander getrennt werden. Enthält beispielsweise das übergeordnete Kapitel, Kap1, das untergeordnete Kapitel, Kap2, das die Mengenspalte, Meng, aufweist, lautet der vollständige Name Kap1.Kap2.Meng.

Aggregatfunktionen | Beschreibung
SUM(chapter-alias.column-name) | Berechnet die Summe aller Werte in der angegebenen Spalte.
AVG(chapter-alias.column-name) | Berechnet den Durchschnitt aller Werte in der angegebenen Spalte.
MAX(chapter-alias.column-name) | Berechnet den höchsten Wert in der angegebenen Spalte.
MIN(chapter-alias.column-name) | Berechnet den niedrigsten Wert in der angegebenen Spalte.
COUNT(chapter-alias[.column-name]) | Zählt die Anzahl der Zeilen in dem angegebenen Alias oder der angegebenen Spalte.
STDEV(chapter-alias.column-name) | Berechnet die Standardabweichung in der angegebenen Spalte.
ANY(chapter-alias.column-name) | Der Wert einer Spalte (wobei der Wert der Spalte für alle Zeilen gleich ist).

Berechneter Ausdruck | Beschreibung
CALC(expression) | Berechnet einen willkürlichen Ausdruck, jedoch nur auf der Zeile eines Recordset-Objekts, das die CALC-Funktion enthält; alle Ausdrücke, die Funktionen von Visual Basic für Applikationen (VBA) verwenden, sind erlaubt.

Schlüsselwort NEW | Beschreibung
NEW field-type [(width | scale | precision | error [, scale | error])] | Fügt eine leere Spalte des angegebenen Typs in das Recordset-Objekt ein.

Der Feldtyp, der mit dem NEW-Schlüsselwort übergeben wird, kann einen der folgenden Datentypen darstellen.

OLE DB-Datentypen | ADO-Datentypäquivalent(e)
DBTYPE_BSTR | AdBSTR
DBTYPE_BOOL | AdBoolean
DBTYPE_DECIMAL | AdDecimal
DBTYPE_UI1 | AdUnsignedTinyInt
DBTYPE_I1 | AdTinyInt
DBTYPE_UI2 | AdUnsignedSmallInt
DBTYPE_UI4 | AdUnsignedInt
DBTYPE_I8 | AdBigInt
DBTYPE_UI8 | AdUnsignedBigInt
DBTYPE_GUID | AdGuid
DBTYPE_BYTES | AdBinary, AdVarBinary, adLongVarBinary
DBTYPE_STR | AdChar, adVarChar, adLongVarChar
DBTYPE_WSTR | AdWChar, adVarWChar, adLongVarWChar
DBTYPE_NUMERIC | AdNumeric
DBTYPE_DBDATE | AdDBDate
DBTYPE_DBTIME | AdDBTime
DBTYPE_DBTIMESTAMP | AdDBTimeStamp
DBTYPE_VARNUMERIC | AdVarNumeric
DBTYPE_FILETIME | AdFileTime
DBTYPE_ERROR | AdError

Ist der neue Feldtyp dezimal (in OLE DB DBTYPE_DECIMAL oder in ADO adDecimal), müssen Sie die Präzision und die Maßstabswerte angeben.

Ausgabe von Befehlen zugrunde liegender Datenprovider

Jeder Befehl, der nicht mit SHAPE beginnt, wird an den Datenprovider weitergegeben. Das ist das Äquivalent zur Ausgabe des Strukturbefehls der Form "SHAPE {Providerbefehl}". Die Befehle erstellen kein Recordset. "SHAPE {DROP TABLE meine Tabelle}" beispielsweise ist ein vollkommen gültiger Strukturbefehl, vorausgesetzt, der Datenprovider unterstützt DROP TABLE.

Diese Fähigkeit gestattet, sowohl normale Providerbefehle als auch Strukturbefehle für die gleiche Verbindung und Transaktion freizugeben.


Strukturierungsklausel Append

Die APPEND-Klausel des Strukturierungsbefehls hängt eine Spalte oder Spalten an ein Recordset an. Die Spalten sind meist Kapitelspalten, die auf ein untergeordnetes Recordset verweisen.

Syntax

SHAPE [parent-command [[AS] parent-alias]]

APPEND ( column-list [ [[AS] child-alias]

[RELATE parent-column TO child-column], ... ] )

[[AS] chapter-alias]

[, ... ]

Beschreibung der Komponenten

Bei den Klammern ("()") handelt es sich um ein erforderliches Schlüsselwort; sie hängen einer Kapitelspalte ein übergeordnetes Recordset an, das von dem Providerbefehl zurückgegeben wird.

Es gibt folgende Komponenten dieser Klausel:

parent-command

Null oder eine der folgenden Komponenten (Sie können parent-command auch völlig übergehen):

  • ein Providerbefehl in geschweiften Klammern ("{}"), der ein Recordset-Objekt zurückgibt; der Befehl wird an den zugrunde liegenden Datenprovider ausgegeben und seine Syntax hängt von den Anforderungen dieses Providers ab; in der Regel ist dies die SQL-Sprache, ADO setzt jedoch keine besondere Abfragesprache voraus

  • andere Strukturierungsbefehle werden in Klammern eingebettet

  • das Schlüsselwort TABLE mit nachfolgendem Namen der Tabelle

parent-alias

ein optionaler Alias, der sich auf das übergeordnete Recordset bezieht

column-list

eine oder mehrere der folgenden Komponenten:

  • eine Kapitelspalte (durch Klammern gekennzeichnet ('()'), die normalerweise einen Providerbefehl in geschweiften Klammern ("{}") umgeben)

  • der Name des vorhandenen Recordset-Objekts

  • andere Strukturierungsbefehle werden in Klammern eingebettet

  • das Schlüsselwort TABLE mit nachfolgendem Namen der Tabelle

  • eine Aggregatspalte

  • eine berechnete Spalte

  • eine neue, mit der NEW-Klausel erstellte Spalte

child-alias

ein Alias, der sich auf das untergeordnete Recordset bezieht

parent-column

eine Spalte im Recordset-Objekt, das durch parent-command zurückgegeben wird

child-column

eine Spalte im Recordset-Objekt, das durch den untergeordneten Befehl zurückgegeben wird

chapter-alias

ein Alias, der sich auf die dem übergeordneten Element angehängte Kapitelspalte bezieht

...

Die "parent-column TO child-column"-Klausel ist eigentlich eine Auflistung, in der festgelegte Beziehungen durch ein Komma voneinander getrennt werden.

...

Die Klausel hinter dem Schlüsselwort APPEND ist eigentlich eine Auflistung, bei jede Klausel durch Komma voneinander getrennt wird, und eine weitere Spalte festlegt, die dem übergeordneten Element hinzugefügt werden soll.

Operationen nicht-parametrisierter Befehle

Der übergeordnete Befehl wird, wenn vorhanden, ausgegeben und ein übergeordnetes Recordset zurückgegeben. Anschließend wird der untergeordnete Befehl ausgegeben und das untergeordnete Recordset zurückgegeben.

Der übergeordnete Befehl kann z. B. ein Recordset-Objekt mit Kunden eines Unternehmens aus einer Customers-Tabelle zurückgeben, und der untergeordnete Befehl kann aus einer Orders-Tabelle ein Recordset-Objekt mit den Bestellungen für alle Kunden zurückgeben.

SHAPE {SELECT * FROM Customers}
   APPEND ({SELECT * FROM Orders} AS chapOrders
   RELATE customerID TO customerID)

Jedes übergeordnete und untergeordnete Recordset-Objekt für nicht-parametrisierte übergeordnete-untergeordnete Beziehungen muss eine ihnen zugeordnete gemeinsame Spalte besitzen. Die Spalten sind in der RELATE-Klausel benannt, zuerst parent-column, dann child-column. Die Spalten können in den entsprechenden Recordset-Objekten unterschiedliche Namen haben, sie müssen sich aber auf dieselben Daten beziehen, um eine sinnvolle Beziehung anzugeben. Beispielsweise können die Customers- und Orders-Recordset-Objekte ein gemeinsames customerID-Feld aufweisen.

Die Datenstrukturierung fügt eine Kapitelspalte dem übergeordneten Recordset hinzu. Die Werte in der Kapitelspalte verweisen auf Zeilen im untergeordneten Recordset-Objekt, welche die RELATE-Klausel erfüllen. Das bedeutet, dass derselbe Wert sowohl in der übergeordneten Spalte einer gegebenen übergeordneten Zeile als auch in der untergeordneten Spalte aller Zeilen des untergeordneten Kapitels ist. Werden verschiedene TO-Klauseln in der gleichen RELATE-Klausel verwendet, werden sie implizit unter Verwendung des AND-Operators kombiniert.

Wenn Sie auf den Verweis in der Kapitelspalte zugreifen, ruft ADO automatisch das mit dem Verweis dargestellte Recordset ab. Beachten Sie, dass in einem nicht-parametrisierten Befehl, das Kapitel nur eine Teilmenge der Zeilen darstellt, obgleich das gesamte untergeordnete Recordset abgerufen wurde.

Verfügt die hinzugefügte Spalte über keinen Kapitelalias, wird ein entsprechender Name automatisch erstellt. Der Fields-Auflistung des Recordset-Objekts wird ein Field-Objekt für die Spalte hinzugefügt und als Datentyp wird adChapter verwendet.

Weitere Informationen über das Bewegen eines hierarchischen Recordset-Objekts finden Sie unter Zugreifen auf Zeilen in einem hierarchischen Recordset.

Operationen parametrisierter Befehle

Wenn Sie mit einem sehr komplexen untergeordneten Recordset arbeiten - im Besonderen auf die Größe des übergeordneten Recordset bezogen - jedoch nur auf einige untergeordnete Kapitel zugreifen müssen, ist es gegebenenfalls effizienter, parametrisierte Befehle zu verwenden.

Ein nicht-parametrisierter Befehl ruft sowohl vollständig übergeordnete als auch untergeordnete Recordset-Objekte ab, fügt dem übergeordneten Element eine Kapitelspalte hinzu und ordnet dann einen Verweis auf das zugehörige untergeordnete Kapitel für die einzelnen übergeordneten Zeilen zu.

Ein parametrisierter Befehl ruft den gesamten übergeordneten Recordset auf, ruft jedoch nur das Kapitel-Recordset auf, wenn auf die Kapitelspalte zugegriffen wird. Dieser Unterschied bei den Abrufstrategien kann zu erheblichen Leistungssteigerungen führen.

Sie können z. B. Folgendes angeben:

SHAPE {SELECT * FROM customer}
   APPEND ({SELECT * FROM orders WHERE cust_id = ?}
   RELATE cust_id TO PARAMETER 0)

Die übergeordneten und die untergeordneten Tabellen weisen eine gemeinsamen Spaltennamen, cust_id, auf. Der untergeordnete Befehl hat einen Platzhalter ("?"), auf den sich die RELATE-Klausel bezieht ("...PARAMETER 0").

Anmerkung Die PARAMETER-Klausel bezieht sich nur auf die Strukturierungsbefehlssyntax. Sie ist weder mit dem Parameter-Objekt von ADO noch der Parameters-Auflistung verbunden.

Wird der parametrisierte Strukturierungsbefehl ausgeführt, werden die folgenden Vorgänge durchgeführt:

  1. Der übergeordnete Befehl wird ausgeführt und gibt ein untergeordnetes Recordset aus der Customers-Tabelle zurück.

  2. Eine Kapitelspalte wird an das übergeordnete Recordset-Objekt angehängt.

  3. Wird auf die Kapitelspalte einer übergeordneten Zeile zugegriffen, ersetzt der Wert der customer.cust_id-Spalte den Platzhalter für orders.cust_id, und der untergeordnete Befehl wird ausgeführt.

  4. Es werden sämtliche Zeilen aus der Orders-Tabelle abgerufen, bei denen der Wert der orders.cust_id-Spalte dem der customer.cust_id-Spalte entspricht. Die untergeordneten Recordset-Objekte werden standardmäßig im Client zwischengespeichert, bis alle Verweise auf das übergeordnete Recordset gelöscht wurden. Um dieses Verhalten zu ändern, legen Sie die dynamische Eigenschaft Cache Child Rows des Recordset-Objekts auf false fest.

  5. Ein Verweis auf die abgerufenen untergeordneten Zeilen (d. h. das Kapitel des untergeordneten Recordset-Objekts) wird in die Kapitelspalte der aktuellen Zeile des übergeordneten Recordset-Objekts positioniert.

  6. Die Schritte 3-5 werden wiederholt ausgeführt, wenn auf die Kapitelspalte einer weiteren Zeile zugegriffen wird.

Die dynamische Eigenschaft Cache Child Rows ist auf true festgelegt. Die Zwischenspeicherung hängt von den Parameterwerten der Abfrage ab. In einer Abfrage mit einem einzelnen Parameter wird das untergeordnete Recordset für einen gegebenen Parameterwert zwischen Abfragen für ein untergeordnetes Objekt mit diesem Wert zwischengespeichert werden. Im folgenden Code wird das demonstriert:

...
SCmd = "SHAPE {select * from customer} " & _
         "APPEND({select * from orders where cust_id = ?} " & _
         "RELATE cust_id TO PARAMETER 0) AS chpCustOrder"
Rst1.Open sCmd, Cnn1
Set RstChild = Rst1("chpCustOrder").Value
Rst1.MoveNext      ' Nächster cust_id-Wert wird an Parameter 0 übergeben
                   ' und ein neues Recordset nach RstChild abgerufen.
Rst1.MovePrev      ' RstChild enthält nun das zwischengespeicherte
                   ' Recordset und erspart einen weiteren Durchlauf.
...

In einer Abfrage mit zwei oder mehreren Parametern wird ein zwischengespeichertes untergeordnetes Objekt nur verwendet, wenn alle Parameterwerte mit den zwischengespeicherten Werten übereinstimmen.

Hybridbefehle

Hybridbefehle sind teilweise parametrisierte Befehle. Beispiel:

SHAPE {select * from plants}
   APPEND( {select * from customers where country = ?}
           RELATE PlantCountry TO PARAMETER 0,
             PlantRegion TO CustomerRegion )

Die Zwischenspeicherung für Hybridbefehle verhält sich wie die der normalen parametrisierten Befehle.

Eingreifende COMPUTE-Strukturierungsklauseln

Sie können den parametrisierten Befehl eines parametrisierten Strukturierungsbefehls in eine willkürlich verschachtelte Anzahl von COMPUTE-Strukturierungsbefehlen einbetten, wie im folgenden Beispiel gezeigt.

SHAPE {select au_lname, state from authors} APPEND
   ((SHAPE
      (SHAPE
         {select * from authors where state = ?} rs
      COMPUTE rs, ANY(rs.state) state, ANY(rs.au_lname) au_lname
      BY au_id) rs2
   COMPUTE rs2, ANY(rs2.state) BY au_lname)
RELATE state TO PARAMETER 0)


Strukturierungsklausel Compute

Ein COMPUTE-Strukturierungsbefehl erzeugt erstens ein übergeordnetes Recordset, dessen Spalten einen Verweis auf das untergeordnetes Recordset enthalten; zweitens optionale Spalten, deren Inhalt Kapitel, neu, berechnete Spalten oder das Ergebnis ausgeführter Aggregatfunktionen auf das untergeordnete Recordset oder auf ein zuvor strukturiertes Recordset ist; und drittens beliebige Spalten aus dem untergeordneten Recordset, die in der optionalen BY-Klausel aufgeführt sind.

Syntax

SHAPE child-command [AS] child-alias

COMPUTE child-alias [[AS] name], [appended-column-list]

[BY grp-field-list]

Beschreibung der Komponenten

Die Klausel besteht aus den folgenden Komponenten:

child-command

besteht aus einem der folgenden Werte:

  • ein Abfragebefehl in geschweiften Klammern ("{}"), der ein untergeordnetes Recordset-Objekt zurückgibt; der Befehl wird an den zugrunde liegenden Datenprovider ausgegeben und seine Syntax hängt von den Anforderungen dieses Providers ab; in der Regel ist dies die SQL-Sprache, ADO setzt jedoch keine besondere Abfragesprache voraus

  • der Name des vorhandenen Recordset-Objekts

  • ein weiterer Strukturierungsbefehl

  • das Schlüsselwort TABLE mit nachfolgendem Namen der Tabelle

child-alias

Ein Alias, der auf das Recordset-Objekt verweist, das durch child-command zurückgegeben wird. Der child-alias ist in der Spaltenauflistung der COMPUTE-Klausel erforderlich und legt die Beziehung zwischen den übergeordneten und untergeordneten Recordset-Objekten fest.

appended-column-list

Eine Liste, in der jedes Element eine Spalte im erzeugten übergeordneten Objekt definiert. Jedes Element beinhaltet entweder eine Kapitelspalte, eine neue Spalte, eine berechnete Spalte oder einen Wert, der aus einer Aggregatsfunktion des untergeordneten Recordset-Objekts resultiert.

grp-field-list

Eine Auflistung von Spalten in den übergeordneten und untergeordneten Recordset-Objekten, die festlegen, wie Zeilen im untergeordneten Element gruppiert werden sollen.

Für die einzelnen Spalten in grp-field-list gibt es entsprechende Spalten in den übergeordneten und untergeordneten Recordset-Objekten. Die grp-field-list-Spalten haben für die einzelnen Zeilen im übergeordneten Recordset eindeutige Werte, und auf das von der übergeordneten Zeile verwiesene untergeordnete Recordset enthält ausschließlich untergeordnete Zeilen, deren grp-field-list-Spalten denselben Wert wie die übergeordneten Zeilen aufweisen.

Enthält die COMPUTE-Klausel keine BY-Klausel, dann ist eine einzelne übergeordnete Zeile mit einem Aggregatwert für das gesamte untergeordnete Recordset vorhanden. Ist jedoch eine BY-Klausel vorhanden, sind möglicherweise mehrere übergeordnete Zeilen mit jeweils einem Verweis sowie einem Aggregatwert für ein untergeordnetes Recordset vorhanden.

Operation

child-command wird zum Provider ausgegeben, der anschließend das untergeordnete Recordset zurückgibt.

Die COMPUTE-Klausel gibt die Spalten des übergeordneten Recordset-Objekts an, wobei es sich um einen Verweis auf das untergeordnete Recordset, eine oder mehrere berechnete Ausdrücke oder neue Spalten handeln kann. Ist auch eine BY-Klausel vorhanden, werden die entsprechend angegebenen Spalten ebenfalls dem übergeordneten Recordset hinzugefügt. Die BY-Klausel gibt an, wie die Zeilen des untergeordneten Recordset-Objekts gruppiert werden.

Beispielsweise verfügen Sie über eine Tabelle, die demographische Daten, wie die Felder Bundesstaat, Stadt und Bevölkerung, beinhaltet (die Bevölkerungszahlen dienen nur der Veranschaulichung).

Bundesstaat | Stadt | Bevölkerung
WA | Seattle | 700,000
OR | Medford | 200,000
OR | Portland | 600,000
CA | Los Angeles | 900,000
CA | San Diego | 400,000
WA | Tacoma | 500,000
OR | Corvallis | 300,000

Geben Sie nun folgenden Strukturierungsbefehl aus:

rst.Open  "SHAPE {select * from demographics} AS rs "  & _
          "COMPUTE rs, SUM(rs.population) BY state", _
           objConnection

Dieser Befehl öffnet ein strukturiertes Recordset mit zwei Ebenen. Bei der übergeordneten Ebene handelt es sich um ein erzeugtes Recordset mit einer Aggregatspalte (SUM(rs.Bevölkerung)), einer auf das untergeordnete Recordset (rs) verweisenden Spalte sowie einer zum Gruppieren des untergeordneten Recordset (Bundesstaat) verwendeten Spalte. Bei der untergeordneten Ebene handelt es sich um das vom Abfragebefehl (select * from demographics) zurückgegebene Recordset.

Die untergeordneten Recordset-Detailzeilen werden nach Bundesstaat gruppiert, aber ansonsten in keiner bestimmten Reihenfolge. Das heißt, die Gruppen stehen nicht in einer bestimmten alphabetischen oder numerischen Reihenfolge.

Sie können sich nun durch das geöffnete übergeordnete Recordset-Objekt bewegen und auf die einzelnen untergeordneten Recordset-Objekte zugreifen. Siehe auch Zugreifen auf Zeilen in einem hierarchischen Recordset.

Entstandene über- und untergeordnete Detail-Recordsets

Übergeordnet

SUM (rs.Bevölkerung) | rs | Bundesstaat
1,300,000 | verweist auf Untergeordnet1 | CA
1,200,000 | verweist auf Untergeordnet2 | WA
1,100,000 | verweist auf Untergeordnet3 | OR

Untergeordnet1

Bundesstaat | Stadt | Bevölkerung
CA | Los Angeles | 900,000
CA | San Diego | 400,000

Untergeordnet2

Bundesstaat | Stadt | Bevölkerung
WA | Seattle | 700,000
WA | Tacoma | 500,000

Untergeordnet3

Bundesstaat | Stadt | Bevölkerung
OR | Medford | 200,000
OR | Portland | 600,000
OR | Corvallis | 300,000


Erstellen eines hierarchischen Recordsets

Das folgende Beispiel zeigt, wie ein hierarchisches Recordset erzeugt wird, ohne eine zugrunde liegende Datenquelle zu verwenden mithilfe der Datenstrukturierungsgrammatik, um Spalten für übergeordnete, untergeordnete und Enkel-Recordsets zu definieren.

Um ein hierarchisches Recordset zu erstellen, müssen Sie den Microsoft Data Shaping Service für OLE DB (MSDataShape) und einen Datenproviderwert von NONE im Verbindungszeichenfolge-Parameter der Open-Methode des Connection-Objekts bestimmen. Weitere Informationen finden Sie unter Erforderliche Provider für Datenstrukturierung.

Dim cn As New ADODB.Connection
Dim rsCustomers As New ADODB.Recordset

cn.Open "Provider=MSDataShape;Data Provider=NONE;"

strShape = _
"SHAPE APPEND NEW adInteger AS CustID," & _
            " NEW adChar(25) AS FirstName," & _
            " NEW adChar(25) AS LastName," & _
            " NEW adChar(12) AS SSN," & _
            " NEW adChar(50) AS Address," & _
         " ((SHAPE APPEND NEW adChar(80) AS VIN_NO," & _
                        " NEW adInteger AS CustID," & _
                        " NEW adChar(20) AS BodyColor, " & _
                     " ((SHAPE APPEND NEW adChar(80) AS VIN_NO," & _
                                    " NEW adChar(20) AS Make, " & _
                                    " NEW adChar(20) AS Model," & _
                                    " NEW adChar(4) AS Year) " & _
                        " AS VINS RELATE VIN_NO TO VIN_NO))" & _
            " AS Vehicles RELATE CustID TO CustID) "

rsCustomers.Open strShape, cn, adOpenStatic, adLockOptimistic, -1

Es wurde ein Recordset erstellt, das aufgefüllt, verändert oder in einer Datei gespeichert werden kann.


Zugreifen auf Zeilen in einem hierarchischen Recordset

Im folgenden Beispiel wird gezeigt, welche Schritte zum Zugreifen auf Zeilen in einem hierarchischen Recordset-Objekt erforderlich sind:

  1. Die Recordset-Objekte der Tabellen authors und titleauthor sind durch die Autor-ID miteinander verbunden.

  2. Die äußere Schleife zeigt den Vor- und Nachnamen der einzelnen Autoren, den Bundesstaat und die Identifikation an.

  3. Das angehängte Recordset-Objekt jeder Zeile wird aus der Fields-Auflistung abgerufen und rstTitleAuthor zugewiesen.

  4. Die innere Schleife zeigt vier Felder jeder Zeile im angehängten Recordset-Objekt an.

(Die StayInSync-Eigenschaft ist zur Veranschaulichung auf FALSE festgelegt, so dass Sie die Kapiteländerungen bei jedem Durchlaufen der äußeren Schleife explizit sehen können. Jedoch wird das Beispiel effizienter, wenn die Zuordnung in Schritt 3 vor die erste Zeile in Schritt 2 verschoben wird, so dass die Zuordnung nur ein einziges Mal durchgeführt wird. Legen Sie dann die StayInSync-Eigenschaft auf TRUE fest, so dass rstTitleAuthor implizit und automatisch zum entsprechenden Kapitel geändert wird, sobald sich rst zu einer neuen Zeile bewegt.)

Beispiel

Sub datashape()
    Dim cnn As New ADODB.Connection
    Dim rst As New ADODB.Recordset
    Dim rstTitleAuthor As New ADODB.Recordset

    cnn.Provider = "MSDataShape"
    cnn.Open    "Data Provider=MSDASQL;" & _
                "Data Source=SRV;User Id=sa;Password=;Database=Pubs"
' SCHRITT 1
    rst.StayInSync = FALSE
    rst.Open    "SHAPE  {select * from authors} "  & _
                "APPEND ({select * from titleauthor} " & _
                "RELATE au_id TO au_id) AS chapTitleAuthor", _
                cnn
' SCHRITT 2
    While Not rst.EOF
        Debug.Print    rst("au_fname"), rst("au_lname"), _
                       rst("state"), rst("au_id")
' SCHRITT 3
        Set rstTitleAuthor = rst("chapTitleAuthor").Value
' SCHRITT 4
        While Not rstTitleAuthor.EOF
            Debug.Print rstTitleAuthor(0), rstTitleAuthor(1), _
                        rstTitleAuthor(2), rstTitleAuthor(3)
            rstTitleAuthor.MoveNext
        Wend
        rst.MoveNext
    Wend
End Sub


Formale Strukturierungsgrammatik

Im Folgenden wird die formale Grammatik für die Erstellung eines Strukturierungsbefehls erläutert.

  • Erforderliche grammatische Begriffe sind Textzeichenfolgen, die in spitze Klammern ("<>") eingeschlossen sind.

  • Optionale Begriffe sind in eckige Klammern ("[ ]") eingeschlossen.

  • Alternativen sind durch einen senkrechten Strich ("|") gekennzeichnet.

  • Sich wiederholende Alternativen sind durch Auslassungspunkte ("...") gekennzeichnet.

  • Alpha kennzeichnet eine Zeichenfolge, die aus Buchstaben besteht.

  • Ziffer kennzeichnet eine numerische Zeichenfolge.

  • Unicode-Ziffer kennzeichnet eine Zeichenfolge aus Unicode-Ziffern.

Alle anderen Begriffe sind Literale.

Begriff Definition
<shape-command>

SHAPE [<table-exp> [[AS] <alias>]][<shape-action>]

<table-exp>

{<native-sql-statement>} |
(<shape-command>) |
TABLE <quoted-name> |
<quoted-name>

<shape-action>

APPEND <aliased-field-list> |
COMPUTE <aliased-field-list> [BY <field-list>]

<aliased-field-list>

<aliased-field> [, <aliased-field...>]

<aliased-field>

<field-exp> [[AS] <alias>]

<field-exp>

(<relation-exp>) |
<calculated-exp> |
<aggregate-exp> |
<new-exp>

<relation_exp>

<table-exp> [[AS] <alias>]
    RELATE <relation-cond-list>

<relation-cond-list>

<relation-cond> [, <relation-cond>...]

<relation-cond>

<field-name> TO <child-ref>

<child-ref>

<field-name> |
PARAMETER <param-ref>

<param-ref>

<number>

<field-list>

<field-name> [, <field-name>]

<aggregate-exp>

SUM(<qualified-field-name>) |
AVG(<qualified-field-name>) |
MIN(<qualified-field-name>) |
MAX(<qualified-field-name>) |
COUNT(<alias> | <qualified-field-name>) |
STDEV(<qualified-field-name>) |
ANY(<qualified-field-name>)

<calculated-exp>

CALC(<expression>)

<qualified-field-name>

<alias>.[<alias>...]<field-name>

<alias>

<quoted-name>

<field-name>

<quoted-name> [[AS] <alias>]

<quoted-name>

"<string>" |
'<string>' |
[<string>] |
<name>

<name>

Alpha [ alpha | digit | _ | # ...]

<number>

Digit [digit...]

<new-exp>

NEW <field-type> [(<number> [, <number>])]

<field-type>
 Ein OLE DB- oder ADO-Datentyp.
<string>

Unicode-char [unicode-char...]

<expression>
 Ein Ausdruck von Visual Basic für Applikationen, bei dessen Operanden es sich um andere Nicht-CALC-Spalten in derselben Zeile handelt.


Funktionen von Visual Basic für Applikationen

Die folgenden Funktionen von Visual Basic für Applikationen können in CALC-Ausdrücken der Datenstrukturierung verwendet werden:

Abs | Asc | Atn | Cbool | CByte | CCur
CDate | CDbl | Chr | ChrB | ChrW | Chr$
ChrB$ | CInt | CLng | Cos | CSng | CStr
Cvar | CVDate | CVErr | Date | Date$ | DateAdd
DateDiff | DatePart | DateSerial | DateValue | Day | DDB
Error | Error$ | Exp | Fix | Format | Format$
FV | Hex | Hex$ | Hour | IIF | InStr
Int | IPmt | IRR | IsDate | IsEmpty | IsError
IsNull | IsNumeric | IsObject | Lcase | LCase$ | Left
LeftB | Left$ | LeftB$ | Len | Log | LTrim
LTrim$ | Mid | Mid$ | Minute | MIRR | Month
Now | NPer | NPV | Oct | Oct$ | Pmt
PPmt | PV | QBColor | Rate | RGB | Right
RightB | Right$ | RightB$ | Rnd | RTrim | RTrim$
Second | Sgn | Sin | SLN | Space | Space$
Sqr | Str | Str$ | StrComp | StrConv | String
String$ | SYD | Tan | Time | Time$ | Timer
TimeSerial | TimeValue | Trim | Trim$ | TypeName | UCase
UCase$ | Val | VarType | Weekday | Year |


DataFactory-Anpassung

Mit Remote Data Service (RDS) können Sie auf einfache Weise auf Daten in einem Client/Server-System mit drei Ebenen zugreifen. Ein Datensteuerelement des Clients gibt Parameter für Verbindungs- und Befehlszeichenfolgen an, die eine Abfrage auf einer Remote-Datenquelle durchführen, oder Parameter für Verbindungszeichenfolgen und Recordset-Objekte, die eine Aktualisierung durchführen.

Die Parameter werden an ein Serverprogramm übergeben, das die Datenzugriffsoperation auf der Remote-Datenquelle durchführt. RDS bietet ein Standardserverprogramm, das RDSServer.DataFactory-Objekt. Das RDSServer.DataFactory-Objekt gibt alle durch eine Abfrage an den Client entstandenen Recordset-Objekte zurück.

RDSServer.DataFactory ist jedoch begrenzt auf die Durchführung von Abfragen und Aktualisierungen. Es kann keine Gültigkeitsüberprüfung oder Verarbeitung der Verbindungs- oder Befehlszeichenfolgen durchführen.

Mit ADO können Sie angeben, dass DataFactory in Verbindung mit einer anderen Art von Serverprogramm arbeitet, die Handler genannt wird. Der Handler kann Verbindungs- und Befehlszeichenfolgen des Clients ändern, bevor diese für den Zugriff auf Datenquellen verwendet werden. Darüber hinaus kann der Handler Zugriffsrechte erzwingen, welche die Berechtigung des Clients, Daten aus einer Datenquelle zu lesen oder in eine Datenquelle zu schreiben, steuern.

Die Parameter, die den Handler zum Ändern der Clientparameter und Zugriffsrechte verwendet, sind in Abschnitten einer Anpassungsdatei angegeben.

Weitere Informationen zur Anpassung des DataFactory-Objekts finden Sie unter den folgenden Themen:

  • Grundlegendes zur Anpassungsdatei

  • Connect-Abschnitt der Anpassungsdatei

  • SQL-Abschnitt der Anpassungsdatei

  • UserList-Abschnitt der Anpassungsdatei

  • Logs-Abschnitt der Anpassungsdatei

  • Erforderliche Clienteinstellungen

  • Schreiben eines eigenen benutzerdefinierten Handlers


Grundlegendes zur Anpassungsdatei

Jeder Abschnittsheader in der Anpassungsdatei besteht aus eckigen Klammern ([]), die einen Typ und Parameter enthalten. Die vier Abschnittstypen werden durch die Literalzeichenfolgen connect, sql, userlist oder logs angezeigt. Der Parameter ist die Literalzeichenfolge, der Standard, ein vom Benutzer angegebener Bezeichner oder ein fehlender Eintrag.

Aus diesem Grund ist jeder Abschnitt durch einen der folgenden Abschnittsheader gekennzeichnet:

[ connect    default        ]
[ connect    identifier    ]
[ sql            default        ]
[ sql            identifier    ]
[ userlist    identifier    ]
[ logs                        ]

Die Abschnittsheader bestehen aus den folgenden Teilen:

Teil | Beschreibung
connect | Eine Literalzeichenfolge, die eine Verbindungszeichenfolge ändert.
sql | Eine Literalzeichenfolge, die eine Befehlszeichenfolge ändert.
userlist | Eine Literalzeichenfolge, welche die Zugriffsrechte eines angegebenen Benutzers ändert.
logs | Eine Literalzeichenfolge, die eine Protokolldatei angibt, die Operationsfehler aufzeichnet.
default | Eine Literalzeichenfolge, die verwendet wird, wenn kein Bezeichner angegeben ist oder gefunden wird.
identifier Eine Zeichenfolge, die mit einer Zeichenfolge in der connect- (Verbindungs-) oder command- (Befehls-)Zeichenfolge übereinstimmt.
  • Verwenden Sie diesen Abschnitt, wenn der Abschnittsheader connect enthält und die Bezeichnerzeichenfolge in der Verbindungszeichenfolge gefunden wird.

  • Verwenden Sie diesen Abschnitt, wenn der Abschnittsheader sql enthält und die Bezeichnerzeichenfolge in der Befehlszeichenfolge gefunden wird.

  • Verwenden Sie diesen Abschnitt, wenn der Abschnittsheader userlist enthält und die Bezeichnerzeichenfolge mit einem Bezeichner des connect-Abschnitts übereinstimmt.

DataFactory ruft den Handler auf, wobei Clientparameter übertragen werden. Der Handler sucht nach ganzen Zeichenfolgen in den Clientparametern, die mit Bezeichnern in den entsprechenden Abschnittsheadern übereinstimmen. Wird eine Übereinstimmung gefunden, wird der Inhalt dieses Abschnitts auf die Clientparameter angewendet.

Unter den folgenden Umständen wird ein bestimmter Abschnitt verwendet:

  • Ein connect-Abschnitt wird verwendet, wenn der angegebene Wert für das Schlüsselwort der Clientverbindungszeichenfolge, "Data Source=value", mit einem connect-Abschnittsbezeichner übereinstimmt.

  • Ein sql-Abschnitt wird verwendet, wenn die Clientbefehlszeichenfolge eine Zeichenfolge enthält, die mit einem sql-Abschnittsbezeichner übereinstimmt.

  • Ein connect- oder sql-Abschnitt wird mit einem Standardparameter verwendet, wenn kein Bezeichner übereinstimmt.

  • Ein userlist-Abschnitt wird verwendet, wenn der userlist-Abschnittsbezeichner mit einem connect-Abschnittsbezeichner übereinstimmt. Gibt es eine Übereinstimmung, wird der Inhalt des userlist-Abschnitts für die Verbindung übernommen, die durch den connect-Abschnitt gesteuert wird.

  • Stimmt die Zeichenfolge in einer Verbindungs- oder Befehlszeichenfolge nicht mit dem Bezeichner eines connect- oder sql-Abschnittsheaders überein und gibt es keine connect- oder sql-Abschnittsheader mit einem Standardparameter, wird die Clientzeichenfolge ohne Änderung verwendet.

  • Der logs-Abschnitt wird verwendet, wenn DataFactory ausgeführt wird.


Connect-Abschnitt der Anpassungsdatei

Das Standardverhalten des Handlers ist die Verweigerung aller Verbindungen. Der Connect-Abschnitt gibt Ausnahmen zu diesem Verhalten an. Fehlen beispielsweise alle Connect-Abschnitte, oder sie sind leer, dann werden standardmäßig keine Verbindungen hergestellt.

Der connect-Abschnitt kann Folgendes enthalten:

  • Einen Standardzugriffseintrag, der die standardmäßigen Lese- und Schreiboperationen angibt, die in dieser Verbindung erlaubt sind. Gibt es in diesem Abschnitt keinen Standardzugriffseintrag, wird der Abschnitt ignoriert.

  • Eine neue Verbindungszeichenfolge, welche die Verbindungszeichenfolge des Clients ersetzt.

Syntax

Ein Standardzugriffseintrag weist die folgende Form auf:

Access=accessRight

Eine Ersetzungsverbindungszeichenfolge weist die folgende Form auf:

Connect=connectionString

Teil | Beschreibung
Connect | Eine Literalzeichenfolge, die anzeigt, dass es sich hier um einen Verbindungszeichenfolgeneintrag handelt.
connectionString | Eine Zeichenfolge, welche die gesamte Clientverbindungszeichenfolge ersetzt.
Access | Eine Literalzeichenfolge, die anzeigt, dass es sich hier um einen Zugriffseintrag handelt.
accessRight Eines der folgenden Zugriffsrechte:
  • NoAccess - Benutzer kann nicht auf die Datenquelle zugreifen

  • ReadOnly - Benutzer kann die Datenquelle lesen

  • ReadWrite - Benutzer kann die Datenquelle lesen oder in sie schreiben

Wenn Sie Verbindungen zulassen möchten (Deaktivieren des Standardverhaltens des Handlers), legen Sie den Zugriffseintrag im connect default-Abschnitt auf Access=ReadWrite fest, und löschen oder kommentieren Sie andere Bezeichner des Connect-Abschnitts aus.


SQL-Abschnitt der Anpassungsdatei

Der sql-Abschnitt kann eine neue SQL-Zeichenfolge enthalten, welche die Clientbefehlszeichenfolge ersetzt. Ist keine SQL-Zeichenfolge in dem Abschnitt vorhanden, wird der Abschnitt ignoriert.

Die neue SQL-Zeichenfolge kann parametrisiert sein. Dies bedeutet, dass Parameter in der SQL-Zeichenfolge des sql-Abschnitts (gekennzeichnet durch das Zeichen ?) durch entsprechende Argumente in einem Bezeichner in der Clientbefehlszeichenfolge (gekennzeichnet durch eine durch Kommas getrennte Liste in Klammern ) ersetzt werden können. Der Bezeichner und die Argumentliste verhalten sich wie ein Funktionsaufruf.

Angenommen, die Clientbefehlszeichenfolge lautet "CustomerByID(4)", der SQL-Abschnittsheader [SQL CustomerByID] und die neue SQL-Abschnittszeichenfolge "SELECT * FROM Customers WHERE CustomerID = ?". Dann wird der Handler "SELECT * FROM Customers WHERE CustomerID = 4" generieren und mit dieser Zeichenfolge die Datenquelle abfragen.

Ist die neue SQL-Anweisung eine leere Zeichenfolge (""), wird der Abschnitt ignoriert.

Ist die Zeichenfolge der neuen SQL-Anweisung nicht gültig, schlägt die Ausführung der Anweisung fehl. Der Clientparameter wird effektiv ignoriert. Sie können dies absichtlich einsetzen, wenn Sie alle SQL-Befehle des Clients "ausschalten" möchten, indem Sie Folgendes angeben:

[SQL default]
SQL = " "

Syntax

Ein Eintrag in der SQL-Ersetzungszeichenfolge weist die folgende Form auf:

SQL=sqlString

Teil | Beschreibung
SQL | Eine Literalzeichenfolge, die anzeigt, dass es sich hier um einen SQL-Abschnittseintrag handelt.
sqlString | Eine SQL-Zeichenfolge, welche die Clientzeichenfolge ersetzt.


UserList-Abschnitt der Anpassungsdatei

Der userlist-Abschnitt gehört zum connect-Abschnitt mit demselben Bezeichnerparameter des Abschnitts.

Dieser Abschnitt kann einen Benutzerzugriffseintrag enthalten, der Zugriffsrechte für den angegebenen Benutzer angibt und den Standardzugriffseintrag im übereinstimmenden connect-Abschnitt überschreibt.

Syntax

Ein Benutzerzugriffseintrag weist die folgende Form auf:

userName=accessRights

Teil | Beschreibung
userName | Der Benutzername der Person, die diese Verbindung verwendet; Gültige Benutzernamen werden mit dem IIS Service Manager-Dialog eingerichtet.
accessRights Eines der folgenden Zugriffsrechte:
  • NoAccess - Benutzer kann nicht auf die Datenquelle zugreifen

  • ReadOnly - Benutzer kann die Datenquelle lesen

  • ReadWrite - Benutzer kann die Datenquelle lesen oder in sie schreiben


Logs-Abschnitt der Anpassungsdatei

Der logs-Abschnitt enthält einen Protokolldateieintrag, der den Namen einer Datei angibt, die Fehler während der Ausführung von DataFactory aufzeichnet.

Syntax

Ein Protokolldateieintrag weist die folgende Form auf:

err=FileName

Teil | Beschreibung
err | Eine Literalzeichenfolge, die anzeigt, dass es sich hier um einen Protokolldateieintrag handelt.
FileName | Ein vollständiger Pfad- und Dateiname; der typische Dateiname lautet c:\msdfmap.log.

Die Protokolldatei enthält den Benutzernamen, HRESULT sowie Datum und Zeit jedes Fehlers.


Erforderliche Clienteinstellungen

Geben Sie die folgenden Einstellungen an, um einen benutzerdefinierten DataFactory-Handler zu verwenden.

  • Geben Sie "Provider=MS Remote" in der Provider-Eigenschaft des Connection-Objekts oder das Schlüsselwort "Provider=" der Verbindungszeichenfolge des Connection-Objekts an.

  • Legen Sie die CursorLocation-Eigenschaft auf adUseClient fest.

  • Geben Sie den Namen des Handlers an, die in der Handler-Eigenschaft des RDS.DataControl-Objekts verwendet werden soll, oder das Schlüsselwort "Handler=" der Verbindungszeichenfolge des Recordset-Objekts. (Es ist nicht möglich, den Handler in der Verbindungszeichenfolge des Connection-Objekts festzulegen.)

    RDS stellt einen standardmäßigen Handler mit dem Namen MSDFMAP.Handler auf dem Server zur Verfügung. (Die standardmäßige Anpassungsdatei heißt MSDFMAP.INI.)

Beispiel

Voraussetzung ist, dass die folgenden Abschnitte in MSDFMAP.INI und der Name der Datenquelle, AdvWorks, zuvor definiert worden sind:

[connect CustomerDataBase]
Access=ReadWrite
Connect="DSN=AdvWorks"

[sql CustomerById]
SQL="SELECT * FROM Customers WHERE CustomerID = ?"

Die folgenden Codeteile wurden in Visual Basic geschrieben:

RDS.DataControl-Version:

Dim dc as New RDS.DataControl
Set dc.Handler = "MSDFMAP.Handler"
Set dc.Server = "http://YourServer"
Set dc.Connect = "Data Source=CustomerDatabase"
Set dc.SQL = "CustomerById(4)"
dc.Refresh

Recordset-Version:

Dim rs as New ADODB.Recordset
rs.CursorLocation = adUseClient

Geben Sie die Handler-Eigenschaft oder das Handler-Schlüsselwort, die Provider-Eigenschaft oder das Provider-Schlüsselwort sowie die Bezeichner CustomerById und CustomerDatabase an. Öffnen Sie dann das Recordset-Objekt:

rs.Open "CustomerById(4)", "Handler=MSDFMAP.Handler;" & _
    "Provider=MS Remote;Data Source=CustomerDatabase;" & _
    "Remote Server=http://YourServer"


Schreiben eines eigenen benutzerdefinierten Handlers

Wenn Sie mit der Administration eines IIS-Servers betraut sind, der die standardmäßige RDS-Unterstützung wünscht, aber die Benutzeranfragen und Zugriffsrechte stärker kontrollieren möchte, könnten Sie unter Umständen Ihren eigenen Handler schreiben.

Durch MSDFMAP.Handler wird die IdataFactoryHandler-Schnittstelle implementiert.

IdataFactoryHandler-Schnittstelle

Diese Schnittstelle hat zwei Methoden, GetRecordset und Reconnect. Für beide Methoden muss die CursorLocation-Eigenschaft auf adUseClient festgelegt sein.

Beide Methoden verwenden Argumente, die nach dem ersten Komma im Schlüsselwort "Handler=" stehen. "Handler=progid,arg1,arg2;" übergibt z. B. die Argumentzeichenfolge "arg1,arg2", und "Handler=progid" übergibt ein Null-Argument.

GetRecordset-Methode

Diese Methode fragt die Datenquelle ab und erstellt ein neues Recordset-Objekt mit den angegebenen Argumenten. Das Recordset-Objekt muss mit adLockBatchOptimistic geöffnet werden; es darf nicht asynchron geöffnet werden.

Argumente

conn Die Verbindungszeichenfolge.

args Die Argumente für den Handler.

query Der Befehlstext zur Durchführung einer Abfrage.

ppRS Der Zeiger, der angibt, wohin das Recordset zurückgegeben werden soll.

Reconnect-Methode

Diese Methode aktualisiert die Datenquelle. Sie erstellt ein neues Connection-Objekt und hängt das angegebene Recordset an.

Argumente

conn Die Verbindungszeichenfolge.

args Die Argumente für den Handler.

pRS Ein Recordset-Objekt.

msdfhdl.idl

Dies ist die Schnittstellendefinition für IDataFactoryHandler in der Datei msdfhdl.idl.

[
  uuid(D80DE8B3-0001-11d1-91E6-00C04FBBBFB3),
  version(1.0)
]
library MSDFHDL
{
    importlib("stdole32.tlb");
    importlib("stdole2.tlb");

    // TLib : Microsoft ActiveX Data Objects 2.0-Bibliothek
    // {00000200-0000-0010-8000-00AA006D2EA4}
    #ifdef IMPLIB
    importlib("implib\\x86\\release\\ado\\msado15.dll");
    #else
    importlib("msado20.dll");
    #endif

    [
      odl,
      uuid(D80DE8B5-0001-11d1-91E6-00C04FBBBFB3),
      version(1.0)
    ]
    interface IDataFactoryHandler : IUnknown
    {
HRESULT _stdcall GetRecordset(
        [in] BSTR conn,
        [in] BSTR args,
        [in] BSTR query,
        [out, retval] _Recordset **ppRS);

// DataFactory verwendet die ActiveConnection-Eigenschaft
// für das Recordset, nachdem Reconnect aufgerufen wurde.
    HRESULT _stdcall Reconnect(
        [in] BSTR conn,
        [in] BSTR args,
        [in] _Recordset *pRS);
    };
};


ADO-API-Referenz

Dieser Abschnitt der ADO-Dokumentation enthält Themen zu allen Objekten, Auflistungen, Eigenschaften, dynamischen Eigenschaften, Methoden, Ereignissen und Aufzählungen von ADO und RDS. Weitere Informationen finden Sie im Index unter dem entsprechenden Thema oder den folgenden Themen:

  • ADO-Objektmodell

  • ADO-Objekte

  • ADO-Auflistungen

  • ADO-Eigenschaften

  • Dynamische Eigenschaften von ADO

  • ADO-Methoden

  • ADO-Ereignisse

  • ADO-Aufzählungskonstanten

  • ADO-Fehler


ADO-Objektmodell

Die folgenden Abbildungen zeigen die ADO-Objekte und deren Auflistungen. Klicken Sie auf ein Objekt oder eine Auflistung, um weitere Informationen zu erhalten.


ADO-Objekte

Die Beziehungen zwischen diesen Objekten sind im ADO-Objektmodell dargestellt.

Jedes Objekt kann in seiner dazugehörigen Auflistung enthalten sein. So kann z. B. ein Error -Objekt in einer Errors-Auflistung enthalten sein. Weitere Informationen erhalten Sie unter ADO-Auflistungen oder unter einem bestimmten Auflistungsthema.

ADO-Objekte - Zusammenfassung

Objekt | Beschreibung
Command | Definiert einen bestimmten Befehl, den Sie beabsichtigen, gegen eine Datenquelle auszuführen.
Connection | Stellt eine geöffnete Verbindung mit einer Datenquelle dar.
DataControl (RDS) | Bindet ein Recordset-Objekt für die Datenabfrage an ein oder mehrere Steuerelemente (z. B. ein TextBox-, ein Grid- oder ein ComboBox-Steuerelement), um die Recordset-Daten auf einer Webseite anzuzeigen.
DataFactory (RDS Server) | Implementiert Methoden, die Lese-/Schreibdatenzugriff auf angegebene Datenquellen für clientseitige Anwendungen zur Verfügung stellen.
DataSpace (RDS) | Erstellt clientseitige Proxies für benutzerdefinierte Geschäftsobjekte, die sich auf der mittleren Ebene befinden.
Error | Enthält Einzelheiten zu Fehlern beim Datenzugriff, die sich auf eine einzelne Operation im Zusammenhang mit dem Provider beziehen.
Field | Stellt eine Spalte mit Daten eines gemeinsamen Datentyps dar.
Parameter | Stellt einen Parameter oder ein Argument dar, das mit einem Command-Objekt verbunden ist und auf einer parametrisierten Abfrage oder einer gespeicherten Prozedur basiert.
Property | Stellt ein dynamisches Merkmal eines ADO-Objekts dar, das vom Provider definiert wird.
Record | Stellt eine Zeile eines Recordsets, ein Verzeichnis oder eine Datei in einem Dateisystem dar.
Recordset | Stellt die gesamte Gruppe von Datensätzen in einer Basistabelle oder die Ergebnisse eines ausgeführten Befehls dar. Das Recordset-Objekt bezieht sich immer nur auf einen einzelnen Datensatz innerhalb der Gruppe, der als aktueller Datensatz bezeichnet wird.
Stream | Stellt einen binären Datenstrom dar.


Command-Objekt (ADO)

Command-Objekt

Definiert einen bestimmten Befehl, den Sie beabsichtigen, gegen eine Datenquelle auszuführen.

Hinweise

Verwenden Sie ein Command-Objekt zum Abfragen einer Datenbank und zum Zurückgeben von Datensätzen in einem Recordset-Objekt sowie zum Ausführen einer Sammeloperation oder zum Ändern der Datenbankstruktur. Abhängig von der Funktionalität des Providers, lösen einige Command-Auflistungen, -Methoden oder -Eigenschaften eventuell einen Fehler aus, wenn auf sie verwiesen wird.

Mit den Auflistungen, Methoden und Eigenschaften eines Command-Objekts können Sie folgende Verfahren ausführen:

  • Definieren des ausführbaren Textes des Befehls (z. B. eine SQL-Anweisung) mit der CommandText-Eigenschaft.

  • Definieren von parametrisierten Abfragen oder Argumenten in Form gespeicherter Prozeduren mit Parameter-Objekten und der Parameters-Auflistung.

  • Ausführen eines Befehls und Zurückgeben eines Recordset-Objekts, sofern es für die Execute-Methode geeignet ist.

  • Angeben des Befehlstyps mit der CommandType-Eigenschaft vor dem Ausführen des Befehls zum Optimieren der Leistung.

  • Prüfen, ob der Provider eine vorverarbeitete (oder kompilierte) Version des Befehls vor der Ausführung mit der Prepared-Eigenschaft speichert.

  • Festlegen der Anzahl der Sekunden, die ein Provider auf das Ausführen eines Befehls mit der CommandTimeout-Eigenschaft wartet.

  • Zuordnen einer geöffneten Verbindung zu einem Command-Objekt durch Festlegen seiner ActiveConnection-Eigenschaft.

  • Festlegen der Name-Eigenschaft zum Kennzeichnen des Command-Objekts als eine Methode des zugeordneten Connection-Objekts.

  • Übergeben eines Command-Objekts an die Source-Eigenschaft eines Recordsets zum Anfordern von Daten.

    Anmerkung Um eine Abfrage ohne Verwendung eines Command-Objekts auszuführen, übergeben Sie eine Abfragezeichenfolge an die Execute-Methode eines Connection-Objekts oder an die Open-Methode eines Recordset-Objekts. Wenn der Befehlstext bestehen bleiben (dauerhaft speichern) und erneut ausgeführt werden soll oder wenn Abfrageparameter verwendet werden sollen, ist jedoch ein Command-Objekt erforderlich.

Um ein Command-Objekt unabhängig von einem vorher definierten Connection-Objekt zu erstellen, legen Sie seine ActiveConnection-Eigenschaft auf eine gültige Verbindungszeichenfolge fest. ADO erstellt zwar dennoch ein Connection-Objekt, weist dieses Objekt aber keiner Objektvariablen zu. Wenn Sie jedoch mehrere Command-Objekte derselben Verbindung zuordnen, sollten Sie explizit ein Connection-Objekt erstellen und öffnen. Dies weist das Connection-Objekt einer Objektvariablen zu. Falls Sie die ActiveConnection-Eigenschaft des Command-Objekts nicht auf diese Objektvariable festlegen, erstellt ADO ein neues Connection-Objekt für jedes Command-Objekt, selbst wenn Sie dieselbe Verbindungszeichenfolge verwenden.

Wenn Sie ein Command-Objekt ausführen möchten, rufen Sie es lediglich durch seine Name-Eigenschaft in dem zugeordneten Connection-Objekt auf. Die ActiveConnection-Eigenschaft des Command-Objekts muss auf das Connection-Objekt festgelegt sein. Besitzt das Command-Objekt Parameter, übergeben Sie die Werte als Argumente an die Methode.

Wenn zwei oder mehr Command-Objekte auf derselben Verbindung ausgeführt werden und eines davon eine gespeicherte Prozedur mit Ausgabeparameter ist, tritt ein Fehler auf. Verwenden Sie zur Ausführung jedes Command-Objekts separate Verbindungen, oder trennen Sie alle anderen Command-Objekte von der Verbindung.

Die Parameter-Auflistung ist das Standardelement des Command-Objekts. Die folgenden zwei Codierungen sind daher gleichwertig.

objCmd.Parameters.Item(0)
objCmd(0)


Connection-Objekt (ADO)

Connection-Objekt

Stellt eine geöffnete Verbindung mit einer Datenquelle dar.

Hinweise

Ein Connection-Objekt stellt eine einmalige Sitzung mit einer Datenquelle dar. Bei Client/Server-Datenbanksystemen kann dies einer tatsächlichen Netzwerkverbindung zum Server entsprechen. Abhängig von den Funktionalitäten, die der Provider unterstützt, stehen einige Auflistungen, Methoden oder Eigenschaften eines Connection-Objekts möglicherweise nicht zur Verfügung.

Mit den Auflistungen, Methoden und Eigenschaften eines Connection-Objekts können Sie folgende Verfahren ausführen:

  • Konfigurieren der Verbindung, bevor Sie sie mit den Eigenschaften ConnectionString, ConnectionTimeout und Mode öffnen. ConnectionString ist die Standardeigenschaft eines Connection-Objekts.

  • Festlegen der CursorLocation-Eigenschaft zum Aufrufen des Microsoft Cursordienst für OLE DB, der Stapelaktualisierungen unterstützt.

  • Festlegen der Standarddatenbank für die Verbindung mit der DefaultDatabase-Eigenschaft.

  • Festlegen der Isolierungsebene für die Transaktionen, die in der Verbindung mit der IsolationLevel-Eigenschaft geöffnet sind.

  • Angeben eines OLE DB-Providers mit der Provider-Eigenschaft.

  • Einrichten und späteres Beenden der physischen Verbindung zur Datenquelle mit den Open- und Close-Methoden.

  • Ausführen eines Befehls in der Verbindung mit der Execute-Methode und Konfigurieren der Ausführung mit der CommandTimeout-Eigenschaft.

    Anmerkung Um eine Abfrage ohne Verwendung eines Command-Objekts auszuführen, übergeben Sie eine Abfragezeichenfolge an die Execute-Methode eines Connection-Objekts. Wenn der Befehlstext bestehen bleiben (dauerhaft speichern) und erneut ausgeführt werden soll oder wenn Abfrageparameter verwendet werden sollen, ist jedoch ein Command-Objekt erforderlich.

  • Verwalten von Transaktionen in der geöffneten Verbindung, einschließlich verschachtelter Transaktionen, sofern der Provider diese unterstützt, mit den BeginTrans-, CommitTrans- und RollbackTrans-Methoden und der Attributes-Eigenschaft.

  • Untersuchen von Fehlern, die von der Datenquelle mit der Errors-Auflistung zurückgegeben werden.

  • Lesen der Version aus der ADO-Implementierung, die mit der Version-Eigenschaft verwendet wird.

  • Anfordern von Schemainformationen über die Datenbank mit der OpenSchema-Methode.

Sie können die Connection-Objekte unabhängig von jedem anderen vorher definierten Objekt erstellen.

Sie können Befehle oder gespeicherte Prozeduren ausführen, als handle es sich um systemeigene Methoden des Connection-Objekts.

Um einen Befehl auszuführen, geben Sie dem Befehl mithilfe der Name-Eigenschaft des Command-Objekts einen Namen. Legen Sie die ActiveConnection-Eigenschaft des Command-Objekts auf die gewünschte Verbindung fest. Geben Sie dann eine Anweisung aus, in der der Befehlsname verwendet wird, als handele es sich um eine Methode des Connection-Objekts, gefolgt von beliebigen Parametern bzw. bei der Rückgabe von Zeilen von einem Recordset-Objekt. Legen Sie die Recordset-Eigenschaften fest, um das resultierende Recordset anzupassen. Beispiel:

Dim cnn As New ADODB.Connection
Dim cmd As New ADODB.Command
Dim rst As New ADODB.Recordset
...
cnn.Open "..."
cmd.Name = "yourCommandName"
cmd.ActiveConnection = cnn
...
' Befehlsname, beliebige Parameter und ein optionales Recordset.
cnn.yourCommandName "parameter", rst

Um eine gespeicherte Prozedur auszuführen, geben Sie eine Anweisung aus, in der der Name der gespeicherten Prozedur verwendet wird, als handele es sich um eine Methode des Connection-Objekts, gefolgt von beliebigen Parametern. ADO schlägt Parametertypen vor. Beispiel:

Dim cnn As New ADODB.Connection
...
' Name der gespeicherten Prozedur und beliebige Parameter.
cnn.sp_yourStoredProcedureName "parameter"


DataControl-Objekt (RDS)

Bindet ein Recordset-Objekt für die Datenabfrage an ein Steuerelement oder mehrere Steuerelemente (z. B. ein TextBox-, ein Grid- oder ein ComboBox-Steuerelement), um die Recordsetdaten in einer Webseite anzuzeigen.

Syntax

<OBJECT CLASSID="clsid:BD96C556-65A3-11D0-983A-00C04FC29E33" ID="DataControl"
    <PARAM NAME="Connect" VALUE="DSN=DSNName;UID=usr;PWD=pw;">
    <PARAM NAME="Server" VALUE="http://awebsrvr">
    <PARAM NAME="SQL" VALUE="QueryText">
</OBJECT>

Hinweise

Der Klassenbezeichner für das RDS.DataSpace-Objekt ist BD96C556-65A3-11D0-983A-00C04FC29E33.

Anmerkung Wenn Sie einen Fehler erhalten, dass ein RDS.DataSpace- oder RDS.DataControl-Objekt nicht geladen wurde, stellen Sie sicher, dass Sie den richtigen Klassenbezeichner verwenden. Die Klassenbezeichner für diese Objekte haben sich von Version 1.0 und 1.1 geändert.

Für ein Basisszenario müssen Sie lediglich die SQL-, Connect- und Server-Eigenschaften des RDS.DataControl-Objekts festlegen. Hierdurch wird automatisch das Standardgeschäftsobjekt, RDSServer.DataFactory, aufgerufen.

Alle Eigenschaften in RDS.DataControl sind optional, da benutzerdefinierte Geschäftsobjekte deren Funktionalitäten ersetzen können.

Anmerkung Wenn Sie mehrere Ergebnisse abfragen, wird nur das erste Recordset-Objekt zurückgegeben. Werden mehrfache Ergebnissätze benötigt, weisen Sie jedem sein eigenes DataControl zu. Das Folgende könnte ein Beispiel einer Abfrage für mehrfache Ergebnisse sein:

"Select * from Authors, Select * from Topics"

Wenn Sie ein RDS.DataControl-Objekt verwenden, kann die Hinzufügung von "DFMode=20;" zu der Verbindungszeichenfolge die Leistung Ihres Servers verbessern, wenn Sie die Daten aktualisieren. Mit dieser Einstellung verwendet das RDSServer.DataFactory-Objekt auf dem Server einen weniger ressourcenintensiven Modus. Die folgenden Features sind in dieser Konfiguration jedoch nicht verfügbar:

  • Verwenden parametrisierter Abfragen

  • Übertragen von Parametern und Spalteninformationen vor Aufruf der Execute-Methode

  • Festlegen von Transact Updates auf True

  • Übertragen des Zeilenstatus

  • Aufrufen der Resync-Methode

  • Aktualisieren (ausdrücklich oder automatisch) über die Update Resync-Eigenschaft

  • Festlegen von Command- oder Recordset-Eigenschaften

  • Verwenden von adCmdTableDirect

Das RDS.DataControl-Objekt läuft standardmäßig im asynchronen Modus. Wenn für Ihre Anwendung die synchrone Ausführung erforderlich ist, setzen Sie den ExecuteOptions-Parameter gleich adcExecSync und den FetchOptions-Parameter gleich adcFetchUpFront, wie im folgenden Beispiel gezeigt wird.

<SCRIPT LANGUAGE=VBSCRIPT>
Const adcExecSync = 1
Const adcFetchUpFront = 1
…
</SCRIPT>
<OBJECT CLASSID="clsid:BD96C556-65A3-11D0-983A-00C04FC29E33"
    ID="DataControl"
   <PARAM NAME="Connect" VALUE="DSN=DSNName;UID=usr;PWD=pw;">
   <PARAM NAME="Server" VALUE="http://awebsrvr">
   <PARAM NAME="SQL" VALUE="QueryText">
   <PARAM NAME="ExecuteOptions" VALUE="adcExecSync">
   <PARAM NAME="FetchOptions" VALUE="adcFetchUpFront">
</OBJECT>

Verwenden Sie ein RDS.DataControl-Objekt, um die Ergebnisse einer einzelnen Abfrage mit einem oder mehreren grafischen Steuerelementen zu verknüpfen. Angenommen, Sie codieren eine Abfrage, mit der Kundendaten, wie Name, Wohnort, Geburtsort, Alter und Kundenprioritätsstatus, angefordert werden. Mithilfe eines einzelnen RDS.DataControl-Objekts können Sie den Namen, das Alter und die Region des Kunden in drei verschiedenen Textfeldern, den Kundenprioritätsstatus in einem Kontrollkästchen und die gesamten Daten in einem Grid-Steuerelement anzeigen.

Verwenden Sie verschiedene RDS.DataControl-Objekte, um die Ergebnisse mehrerer Abfragen mit unterschiedlichen grafischen Steuerelementen zu verknüpfen. Angenommen, Sie verwenden eine Abfrage zum Anfordern von Kundeninformationen und eine zweite Abfrage zum Anfordern von Informationen über die Waren, die dieser Kunde gekauft hat. Sie möchten die Ergebnisse der ersten Abfrage in drei Textfeldern und einem Kontrollkästchen und die Ergebnisse der zweiten Abfrage in einem Grid-Steuerelement anzeigen. Wenn Sie das Standardgeschäftsobjekt (RDSServer.DataFactory) verwenden, müssen Sie folgende Verfahren ausführen:

  • Hinzufügen von zwei RDS.DataControl-Objekten zu Ihrer Webseite.

  • Schreiben von zwei Abfragen, eine für jede SQL-Eigenschaft der beiden RDS.DataControl-Objekte. Das eine RDS.DataControl-Objekt enthält eine SQL-Abfrage, mit der Kundeninformationen angefordert werden. Mit der zweiten SQL-Abfrage wird eine Liste der Waren angefordert, die der Kunde gekauft hat.

  • Geben Sie in jedem OBJECT-Tag der gebundenen Steuerelemente den DATAFLD-Wert an, um die Werte für die Daten festzulegen, die in den einzelnen grafischen Steuerelementen angezeigt werden sollen.

Die Anzahl der RDS.DataControl-Objekte, die Sie über OBJECT-Tags in eine einzelne Webseite einbetten können, ist nicht beschränkt.

Verwenden Sie beim Definieren des RDS.DataControl-Objekts in einer Webseite Height- und Width-Werte ungleich Null, wie beispielsweise 1 (um den Einschluss zusätzlichen Platzes zu verhindern).

Clientkomponenten für Remote Data Service sind bereits in Internet Explorer, Version 4.0, enthalten. Aus diesem Grund ist es nicht erforderlich, dem OBJECT-Tag des RDS.DataControl-Objekts einen CODEBASE-Parameter hinzuzufügen.

Beim Verwenden von Internet Explorer, Version 4.0 oder später, können Datenbindungen unter Verwendung von HTML-Steuerelementen und ActiveX®-Steuerelementen nur dann durchgeführt werden, wenn diese als Steuerelemente für das Apartmentmodell gekennzeichnet sind.

Benutzer von Microsoft Visual Basic Das RDS.DataControl-Objekt wird nur in webbasierten Anwendungen verwendet. In einer Clientanwendung von Visual Basic wird es nicht benötigt.


DataFactory-Objekt (RDSServer)

Dieses serverseitige Standardgeschäftsobjekt implementiert Methoden, die Lese-/Schreibdatenzugriff auf bestimmte Datenquellen für clientseitige Anwendungen zur Verfügung stellen.

Hinweise

Bei dem RDSServer.DataFactory-Objekt handelt es sich um ein serverseitiges Automatisierungsobjekt, das Clientanforderungen erhält. In einer Internetimplementierung befindet es sich auf einem Webserver und wird durch die ADISAPI-Komponente instanziiert. Das RDSServer.DataFactory-Objekt stellt Lese- und Schreibzugriff auf bestimmte Datenquellen zur Verfügung, enthält jedoch keine Logik für die Gültigkeitsüberprüfung oder für Geschäftsregeln.

Wenn Sie eine Methode verwenden, die sowohl in RDSServer.DataFactory- als auch in RDS.DataControl-Objekten zur Verfügung steht, wird durch Remote Data Service standardmäßig die RDS.DataControl-Version verwendet. Als Voreinstellung wird von einem grundlegenden Programmierszenario ausgegangen, wobei RDSServer.DataFactory als allgemeines, serverseitiges Geschäftsobjekt fungiert.

Wenn in der Webanwendung eine aufgabenspezifische und serverseitige Datenverarbeitung durchgeführt werden soll, können Sie das RDSServer.DataFactory-Objekt durch ein benutzerdefiniertes Geschäftsobjekt ersetzen.

Sie können serverseitige Geschäftsobjekte erstellen, welche die RDSServer.DataFactory-Methoden, z. B. Query und CreateRecordset, aufrufen. Dies ist hilfreich, wenn Sie zu den Geschäftsobjekten zwar Funktionalitäten hinzufügen, den Vorteil der vorhandenen Technologien von Remote Data Service jedoch auch nutzen möchten.

Der Klassenbezeichner für das RDSServer.DataFactory-Objekt ist 9381D8F5-0288-11D0-9501-00AA00B911A5.


DataSpace-Objekt (RDS)

Erstellt clientseitige Proxies für benutzerdefinierte Geschäftsobjekte, die sich auf der mittleren Ebene befinden.

Hinweise

Remote Data Service benötigt Geschäftsobjekt-Proxies, damit clientseitige Komponenten mit Geschäftsobjekten kommunizieren können, die sich auf der mittleren Ebene befinden. Proxies vereinfachen das Packen, Auspacken und Transportieren (Marshalling) der Recordset-Daten einer Anwendung über Prozess- oder Computergrenzen.

Remote Data Service verwendet die CreateObject-Methode des RDS.DataSpace-Objekts zum Erstellen von Proxies für Geschäftsobjekte. Der Proxy für das Geschäftsobjekt wird dynamisch erstellt, sobald eine Instanz für das Gegenstück jenes Geschäftsobjekts auf der mittleren Ebene erstellt wird. Remote Data Service unterstützt die folgenden Protokolle: HTTP, HTTPS (HTTP Secure Sockets), DCOM sowie prozessinterne Protokolle. (Die Clientkomponenten und das Geschäftsobjekt befinden sich auf demselben Computer.)

Anmerkung RDS verhält sich "statusfrei", wenn das RDS.DataSpace-Objekt die HTTP- oder HTTPS-Protokolle verwendet. Dies bedeutet, dass jede interne Information über eine Clientanforderung verworfen wird, nachdem der Server eine Rückmeldung liefert.

Obgleich das Geschäftsobjekt über die Lebenszeit des Proxies für Geschäftsobjekte zu existieren scheint, existiert das Geschäftsobjekt nur, bis eine Rückmeldung auf eine Anfrage gesendet wird. Wird eine Anfrage abgegeben (eine Methode wird auf dem Geschäftsobjekt aufgerufen), öffnet der Proxy eine neue Verbindung zum Server, und der Server erstellt eine neue Instanz des Geschäftsobjekts. Nachdem das Geschäftsobjekt die Anfrage beantwortet hat, löscht der Server das Geschäftsobjekt und schließt die Verbindung.

Dieses Verhalten bedeutet, dass Sie unter Verwendung einer Eigenschaft oder Variable eines Geschäftsobjekts keine Daten von einer Anfrage an eine andere übergeben können. Sie sollten einen anderen Mechanismus anwenden, wie z. B. eine Datei oder ein Methodenargument, um Statusdaten zu behalten.

Der Klassenbezeichner für das RDS.DataSpace-Objekt ist BD96C556-65A3-11D0-983A-00C04FC29E36.


Error-Objekt (ADO)

Error-Objekt

Enthält Einzelheiten zu Fehlern beim Datenzugriff, die sich auf eine einzelne Operation im Zusammenhang mit dem Provider beziehen.

Hinweise

Jede Operation, an der ADO-Objekte beteiligt sind, kann einen oder mehrere Providerfehler auslösen. Sobald ein Fehler auftritt, werden ein oder mehrere Error-Objekte in die Errors-Auflistung des Connection-Objekts übernommen. Wenn eine andere ADO-Operation einen Fehler auslöst, wird die Errors-Auflistung gelöscht, und der neue Satz von Error-Objekten wird in die Errors-Auflistung aufgenommen.

Anmerkung Jedes Error-Objekt stellt einen bestimmten Providerfehler, aber keinen ADO-Fehler dar. ADO-Fehler werden über die Laufzeitfehlerbehandlung bearbeitet. In Microsoft Visual Basic beispielsweise löst das Auftreten eines ADO-spezifischen Fehlers ein On Error-Ereignis aus, und der Fehler wird im Error-Objekt angezeigt. Eine vollständige Liste der ADO-Fehler finden Sie unter ErrorValueEnum.

Sie können folgende Eigenschaften eines Error-Objekts lesen, um u. a. folgende Einzelheiten zu jedem Fehler zu erhalten:

  • die Description-Eigenschaft, die den Text der Fehlermeldung enthält; das ist die Standardeigenschaft

  • die Number-Eigenschaft, die den Wert vom Datentyp Long der Fehlerkonstante enthält

  • die Source-Eigenschaft, die das Objekt kennzeichnet, das den Fehler ausgelöst hat diese Eigenschaft ist besonders nützlich, wenn mehrere Error-Objekte in der Errors-Auflistung vorhanden sind, nachdem eine Anforderung an die Datenquelle geschickt wurde

  • die SQLState- und NativeError-Eigenschaften, die Informationen aus SQL-Datenquellen liefern

Wenn ein Providerfehler auftritt, wird er in die Errors-Auflistung des Connection-Objekts aufgenommen. ADO unterstützt die Rückgabe mehrerer Fehler durch eine einzige ADO-Operation und bietet so die Möglichkeit, providerspezifische Fehlerinformationen zu liefern. Um diese vielfältigen Fehlerinformationen in einer Fehlerhandler anzufordern, verwenden Sie die geeigneten Features zum Auffangen von Fehlern in der Sprache oder Umgebung, in der Sie arbeiten. Verwenden Sie anschließend geschachtelte Schleifen, um die Eigenschaften der einzelnen Error-Objekte in der Errors-Auflistung auszuwerten.

Benutzer von Microsoft Visual Basic und VBScript Wenn kein gültiges Connection-Objekt vorhanden ist, ist es erforderlich, die Fehlerinformationen aus dem Error-Objekt abzurufen.

ADO löscht (ebenso wie Provider) das OLE Error Info-Objekt, bevor ein Aufruf durchgeführt wird, der möglicherweise einen neuen Providerfehler auslöst. Die Errors-Auflistung im Connection-Objekt wird dennoch gelöscht und nur aufgefüllt, wenn der Provider einen neuen Fehler auslöst oder die Clear-Methode aufgerufen wird.

Einige Eigenschaften und Methoden geben Warnmeldungen zurück, die als Error-Objekte in der Errors-Auflistung angezeigt werden, ohne die Programmausführung jedoch anzuhalten. Bevor Sie die Resync-, UpdateBatch- oder CancelBatch-Methoden bei einem Recordset-Objekt aufrufen, die Open-Methode bei einem Connection-Objekt aufrufen oder die Filter-Eigenschaft bei einem Recordset-Objekt festlegen, rufen Sie die Clear-Methode in der Errors-Auflistung auf. Dadurch können Sie die Count-Eigenschaft der Errors-Auflistung lesen, um nach zurückgegebenen Warnmeldungen zu suchen.


Field-Objekt (ADO)

Field-Objekt

Stellt eine Spalte mit Daten eines gemeinsamen Datentyps dar.

Hinweise

Jedes Field-Objekt entspricht einer Spalte im Recordset -Objekt. Mit der Value-Eigenschaft der Field-Objekte werden Daten für den aktuellen Datensatz festgelegt oder zurückgegeben. Je nach Funktionalität des Providers sind einige Auflistungen, Methoden oder Eigenschaften eines Field-Objekts unter Umständen nicht verfügbar.

Mit den Auflistungen, Methoden und Eigenschaften eines Field-Objekts können Sie folgende Verfahren ausführen:

  • Zurückgeben eines Feldnamens mit der Name-Eigenschaft

  • Anzeigen oder Ändern der Daten im Feld mit der Value-Eigenschaft Value ist die Standardeigenschaft eines Field-Objekts

  • Zurückgeben der Grundmerkmale eines Feldes mit den Type-, Precision- und NumericScale-Eigenschaften

  • Zurückgeben der deklarierten Größe eines Feldes mit der DefinedSize-Eigenschaft

  • Zurückgeben des tatsächlichen Datenumfangs in einem gegebenen Feld mit der ActualSize-Eigenschaft

  • Bestimmen, welche Funktionalitäten für ein gegebenes Feld unterstützt werden. Verwenden Sie dafür die Attributes-Eigenschaft und die Properties-Auflistung

  • Ändern der Werte von Feldern, die Binärdaten oder Zeichendaten vom Datentyp Long enthalten, mit den AppendChunk- und GetChunk-Methoden

  • Sofern der Provider Stapelaktualisierungen unterstützt, lösen Sie Widersprüche zwischen Feldwerten während der Stapelaktualisierung mit den OriginalValue- und UnderlyingValue-Eigenschaften

Sämtliche Eigenschaften von Metadaten (Name, Type, DefinedSize, Precision und NumericScale) stehen vor dem Öffnen des Recordsets des Field-Objekts zur Verfügung. Das Festlegen dieser Eigenschaften zu diesem Zeitpunkt ist hilfreich beim dynamischen Erstellen von Formularen.


Parameter-Objekt (ADO)

Parameter-Objekt

Stellt einen Parameter oder ein Argument dar, der oder das mit einem Command-Objekt verbunden ist und auf einer parametrisierten Abfrage oder einer gespeicherten Prozedur basiert.

Hinweise

Viele Provider unterstützen parametrisierte Befehle. Hierbei handelt es sich um Befehle, bei denen die gewünschte Aktion einmal definiert wurde, wobei jedoch Einzelheiten des Befehls mithilfe von Variablen (oder Parametern) geändert werden können. Beispielsweise kann eine SELECT-Anweisung von SQL einen Parameter zum Definieren der entsprechenden Kriterien einer WHERE-Klausel verwenden und einen anderen, um den Spaltennamen für eine SORT BY-Klausel zu definieren.

Parameter-Objekte stellen Parameter dar, die mit parametrisierten Abfragen oder den Eingabe-/Ausgabe-Argumenten und den Rückgabewerten von gespeicherten Prozeduren verbunden sind. Abhängig davon, welche Funktionalität der Provider bietet, sind einige Auflistungen, Methoden oder Eigenschaften eines Parameter-Objekts möglicherweise nicht verfügbar.

Mit den Auflistungen, Methoden und Eigenschaften eines Parameter-Objekts können Sie folgende Verfahren ausführen:

  • Festlegen oder Zurückgeben eines Parameternamens mit der Name-Eigenschaft

  • Festlegen oder Zurückgeben eines Parameterwertes mit der Value-Eigenschaft; Value ist die Standardeigenschaft eines Parameter-Objekts

  • Festlegen oder Zurückgeben von Parametermerkmalen mit den Attributes-, Direction-, Precision-, NumericScale-, Size- und Type-Eigenschaften

  • Übergeben von Binär- oder Zeichendaten vom Datentyp Long an einen Parameter mit der AppendChunk-Methode

Wenn Sie die Namen und Eigenschaften der Parameter kennen, die mit der gespeicherten Prozedur oder der aufzurufenden parametrisierten Abfrage verbunden sind, können Sie die CreateParameter-Methode verwenden, um Parameter-Objekte mit den entsprechenden Eigenschaftseinstellungen zu erstellen. Weiterhin können Sie die Append-Methode verwenden, um die Objekte der Parameters-Auflistung hinzuzufügen. Auf diese Weise können Sie Parameterwerte festlegen und zurückgeben, ohne die Refresh-Methode in der Parameters-Auflistung aufrufen zu müssen, um in einem möglicherweise ressourcenintensiven Vorgang die Parameterinformationen vom Provider abzurufen.


Property-Objekt (ADO)

Property-Objekt

Stellt ein dynamisches Merkmal eines ADO-Objekts dar, das vom Provider definiert wird.

Hinweise

ADO-Objekte besitzen zwei Eigenschaftstypen: integrierte und dynamische.

Integrierte Eigenschaften sind in ADO implementiert und stehen unter Verwendung der MyObject.Property-Syntax sofort für jedes neue Objekt zur Verfügung. Sie werden in der Properties-Auflistung eines Objekts jedoch nicht als Property-Objekte angezeigt. Daher können Sie zwar ihre Werte ändern, nicht aber ihre Merkmale.

Dynamische Eigenschaften werden durch den zugrunde liegenden Datenprovider definiert. Sie werden in der Properties-Auflistung für das entsprechende ADO-Objekt angezeigt. Eine providerspezifische Eigenschaft kann z. B. anzeigen, ob ein Recordset-Objekt Transaktionen oder Aktualisierungen unterstützt. Diese zusätzlichen Eigenschaften werden als Property-Objekte in der Properties-Auflistung dieses Recordset-Objekts angezeigt. Auf dynamische Eigenschaften kann nur durch die Auflistung unter Verwendung der folgenden Syntax verwiesen werden: MyObject.Properties(0) oder MyObject.Properties("Name").

Sie können keine Eigenschaft löschen.

Ein dynamisches Property-Objekt besitzt vier eigene, integrierte Eigenschaften:

  • Die Name-Eigenschaft ist eine Zeichenfolge, welche die Eigenschaft kennzeichnet.

  • Die Type-Eigenschaft ist eine ganze Zahl (Integer), die den Datentyp der Eigenschaft festlegt.

  • Die Value-Eigenschaft ist ein Wert vom Datentyp Variant, der die Eigenschaftseinstellung enthält; Value ist die Standardeigenschaft für ein Property-Objekt.

  • Die Attributes-Eigenschaft ist ein Wert vom Datentyp Long, der charakteristische Merkmale der providerspezifischen Eigenschaft angibt.


Record-Objekt (ADO)

Record-Objekt

Stellt eine Zeile in einem Recordset-Objekt, einem Verzeichnis oder einer Datei in einem Dateisystem dar.

Hinweise

Mit der Fields-Auflistung des Record-Objekts können Sie die Felder, die mit dem Record-Objekt verbunden sind, anzeigen. ADO ermöglicht objektbezogene Spalten, einschließlich Recordset und SafeArray, und skalare Werte in der Fields-Auflistung der Record-Objekte.

Stellt das Record-Objekt eine Zeile in einem Recordset dar, dann kann es zum originalen Recordset zurückgegeben werden.

Das Record-Objekt kann baumstrukturartige Namespaces modellieren. Jeder Knoten in der Struktur ist ein Record-Objekt mit verbundenen Spalten. Die Spalten können die Attribute des Knotens und andere relevante Informationen darstellen. Das Record-Objekt kann in der Baumstruktur beides darstellen, einen Blattknoten und Nicht-Blattknoten. Nicht-Blattknoten besitzen andere Knoten als ihr Inhalt, während Blattknoten keine solche Inhalte besitzen. Blattknoten enthalten typischerweise binäre Datenströme, während Nicht-Blattknoten einen standardmäßigen binären Datenstrom enthalten können, der mit ihnen verbunden ist. Eigenschaften des Record-Objekts benennen den Knotentyp.

Das Record-Objekt stellt auch eine Alternative zur Bewegung durch hierarchisch verwaltete Daten dar. Ein Record-Objekt kann erstellt werden, um den Stamm einer bestimmten Unterstruktur in einer großen Baumstruktur darzustellen. Ebenso können neue Record-Objekte geöffnet werden, um untergeordnete Knoten darzustellen.

Eine Datei oder ein Verzeichnis (eine Ressource) wird eindeutig durch einen absoluten URL bestimmt. Wird ein Record-Objekt mit einem absoluten URL geöffnet, wird ein Connection-Objekt implizit erstellt und als Record-Objekt festgelegt. Ein Connection-Objekt kann explizit über die ActiveConnection-Eigenschaft als Record-Objekt festgelegt werden. Die über das Connection-Objekt zu erreichenden Dateien und Verzeichnisse definieren den Kontext, in dem die Record-Operationen auftreten können.

Methoden zur Veränderung von und Bewegung in Daten auf dem Record-Objekt akzeptieren auch einen relativen URL, der unter Verwendung eines absoluten URLs oder des Kontextes des Connection-Objekts als Startpunkt eine Ressource sucht.

Ein Connection-Objekt wird mit jedem Record-Objekt verbunden. Durch Aufrufen der Transaktionsmethoden des Connection-Objekts können Operationen des Record-Objekts Teil einer Transaktion sein.

Das Record-Objekt unterstützt keine ADO-Ereignisse und antwortet deshalb nicht auf Benachrichtigungen.

Mit den Methoden und Eigenschaften eines Record-Objekts können Sie folgende Verfahren ausführen:

  • Festlegen oder Zurückgeben des verbundenen Connection-Objekts mit der ActiveConnection-Eigenschaft

  • Angeben der Zugriffsrechte mit der Mode-Eigenschaft

  • Zurückgeben der URL des Verzeichnisses mit der ParentURL-Eigenschaft, das die mit dem Verweis dargestellte Ressource enthält

  • Angeben des absoluten URLs, relativen URLs oder des Recordset-Objekts mit der Source-Eigenschaft, aus der das Record-Objekt abgeleitet wurde

  • Angeben des gegenwärtigen Status des Record-Objekts mit der State-Eigenschaft

  • Angeben des Record-Typs mit der RecordType-Eigenschaft - einfach, Auflistung oder strukturiertes Dokument

  • Anhalten der Ausführung einer asynchronen Operation mit der Cancel-Methode

  • Trennen des Record-Objekts von der Datenquelle mit der Close-Methode

  • Kopieren der durch ein Record-Objekt dargestellten Datei oder des Verzeichnisses in einen anderen Speicherort mit der CopyRecord-Methode

  • Löschen einer durch ein Record-Objekt dargestellten Datei oder eines Verzeichnisses und Unterverzeichnisses mit der DeleteRecord-Methode

  • Öffnen eines durch ein Record-Objekt dargestellten Recordset-Objekts, das Zeilen enthält, die Unterverzeichnisse und Dateien der Entität darstellen, mit der GetChildren-Methode

  • Bewegen (umbenennen) der durch ein Record-Objekt dargestellten Datei oder des Verzeichnisses und der Unterverzeichnisse auf einen anderen Speicherplatz mit der MoveRecord-Methode

  • Zuordnen des Record-Objekts zu einer vorhandenen Datenquelle oder Erstellen einer neuen Datei oder eines neuen Verzeichnisses mit der Open-Methode


Recordset-Objekt (ADO)

Recordset-Objekt

Stellt die gesamte Gruppe von Datensätzen in einer Basistabelle oder die Ergebnisse eines ausgeführten Befehls dar. Das Recordset-Objekt bezieht sich immer nur auf einen einzelnen Datensatz innerhalb der Gruppe, der als aktueller Datensatz bezeichnet wird.

Hinweise

Verwenden Sie die Recordset-Objekte zum Ändern der Daten eines Providers. Wenn Sie ADO verwenden, ändern Sie Daten fast ausschließlich mithilfe der Recordset-Objekte. Alle Recordset-Objekte bestehen aus Datensätzen (Zeilen) und Feldern (Spalten). Abhängig davon, welche Funktionalität der Provider unterstützt, stehen einige Recordset-Methoden oder -Eigenschaften möglicherweise nicht zur Verfügung.

ADODB.Recordset ist der Programmbezeichner, der verwendet werden sollte, um ein Recordset-Objekt zu erstellen. Vorhandene Anwendungen, die auf den überholten ADOR.Recordset-Programmbezeichner verweisen, werden ohne Rekompilierung weiterarbeiten, neue Entwicklungen sollten jedoch auf ADODB.Recordset referenzieren.

Es gibt in ADO vier verschiedene definierte Cursortypen:

  • Dynamischer Cursor - Er ermöglicht das Anzeigen von Zusätzen, Änderungen und Löschungen durch andere Benutzer; ermöglicht alle Arten von Bewegungen im Recordset-Objekt, die nicht auf Lesezeichen basieren; und lässt Lesezeichen zu, falls der Provider diese unterstützt.

  • Keyset-Cursor - Sein Verhalten ähnelt dem eines dynamischen Cursors, mit dem Unterschied, dass Sie damit keine von anderen Benutzern hinzugefügten Datensätze anzeigen lassen können, und dass der Zugriff auf von anderen Benutzern gelöschte Datensätze verhindert wird. Von anderen Benutzern durchgeführte Datenänderungen bleiben weiterhin sichtbar. Dieser Cursor bietet immer eine Lesezeichenunterstützung und ermöglicht daher alle Arten von Bewegungen im Recordset-Objekt.

  • Statischer Cursor - Dieser Cursor stellt eine statische Kopie einer Gruppe von Datensätzen zur Verfügung, mit der Daten gesucht oder Berichte erzeugt werden können. Er lässt immer Lesezeichen und daher alle Arten von Bewegungen im Recordset-Objekt zu. Zusätze, Änderungen oder Löschungen anderer Benutzer sind nicht sichtbar. Wenn Sie ein clientseitiges Recordset-Objekt öffnen, ist nur dieser Cursortyp erlaubt.

  • Vorwärtscursor - Dieser Cursor gestattet Ihnen nur, vorwärts durch das Recordset-Objekt zu blättern. Zusätze, Änderungen oder Löschungen anderer Benutzer sind nicht sichtbar. Dies verbessert die Leistung in Situationen, in denen Sie nur einen einzigen Durchlauf durch ein Recordset durchführen müssen.

Legen Sie die CursorType-Eigenschaft vor dem Öffnen des Recordset-Objekts fest, um den Cursortyp zu wählen, oder übergeben Sie ein CursorType-Argument mit der Open-Methode. Manche Provider unterstützen nicht alle Cursortypen. Prüfen Sie hierzu die Dokumentation des Providers. Wenn Sie keinen Cursortyp angeben, öffnet ADO standardmäßig einen Vorwärtscursor.

Ist die CursorLocation-Eigenschaft auf adUseClient festgelegt, um ein Recordset-Objekt zu öffnen, dann ist die zugrunde liegende UnderlyingValue-Eigenschaft auf den Field-Objekten im zurückgegebenen Recordset-Objekt nicht verfügbar. Bei einigen Providern (wie z. B. Microsoft ODBC Provider für OLE DB in Verbindung mit Microsoft SQL Server) können Sie Recordset-Objekte unabhängig von einem zuvor definierten Connection-Objekt erstellen, indem Sie eine Verbindungszeichenfolge mit der Open-Methode übergeben. ADO erstellt zwar dennoch ein Connection-Objekt, weist dieses Objekt aber keiner Objektvariablen zu. Wenn Sie jedoch mehrere Recordset-Objekte über dieselbe Verbindung öffnen, sollten Sie explizit ein Connection-Objekt erstellen und öffnen. Dies weist dem Connection-Objekt eine Objektvariable zu. Falls Sie diese Objektvariable beim Öffnen der Recordset-Objekte nicht verwenden, erstellt ADO ein neues Connection-Objekt für jedes neue Recordset-Objekt, selbst wenn Sie dieselbe Verbindungszeichenfolge übergeben.

Sie können so viele Recordset-Objekte erstellen, wie benötigt werden.

Wenn Sie ein Recordset-Objekt öffnen, wird der aktuelle Datensatz auf den ersten Datensatz festgelegt (bei Bedarf), und die BOF- und EOF-Eigenschaften werden auf False festgelegt. Wenn keine Datensätze vorhanden sind, erhalten die Eigenschaftseinstellungen für BOF und EOF den Wert True.

Sie können die MoveFirst-, MoveLast-, MoveNext-, MovePrevious- und Move-Methoden sowie die AbsolutePosition-, AbsolutePage- und Filter-Eigenschaften dazu verwenden, den aktuellen Datensatz neu zu platzieren, sofern der Provider die jeweilige Funktionalität unterstützt. Ausschließlich vorwärts gerichtete Recordset-Objekte unterstützen lediglich die MoveNext-Methode. Wenn Sie die Move-Methoden zum Einsehen der einzelnen Datensätze (oder zum Aufzählen des Recordset-Objekts) verwenden, können Sie mit den BOF- und EOF-Eigenschaften bestimmen, ob Sie sich über den Anfang oder das Ende des Recordset-Objekts hinaus bewegt haben.

Die Recordset-Objekte unterstützen zwei Aktualisierungstypen: sofortige Aktualisierung und Stapelaktualisierung. Beim sofortigen Aktualisieren werden alle Änderungen an den Daten sofort in die zugrunde liegende Datenquelle geschrieben, sobald Sie die Update-Methode aufrufen. Sie können auch Arrays mit Werten als Parameter der AddNew- und Update-Methoden übergeben und gleichzeitig mehrere Felder in einem Datensatz aktualisieren.

Falls ein Provider die Stapelaktualisierung unterstützt, kann im Cache des Providers mehr als ein Datensatz gespeichert werden, um diese Datensätze dann mit der UpdateBatch-Methode in einem einzigen Aufruf an die Datenbank zu senden. Dies gilt für Änderungen, die mit den AddNew-, Update- und Delete-Methoden vorgenommen wurden. Nachdem Sie die UpdateBatch-Methode aufgerufen haben, können Sie mithilfe der Status-Eigenschaft prüfen, ob zu lösende Datenkonflikte vorliegen.

Anmerkung Um eine Abfrage ohne Verwendung eines Command-Objekts auszuführen, übergeben Sie eine Abfragezeichenfolge an die Open-Methode eines Recordset-Objekts. Wenn der Befehlstext bestehen bleiben (dauerhaft speichern) und erneut ausgeführt werden soll oder wenn Abfrageparameter verwendet werden sollen, ist jedoch ein Command-Objekt erforderlich.

Die Mode-Eigenschaft steuert Zugriffsrechte.

Die Fields-Auflistung ist das Standardelement des Recordset-Objekts. Die folgenden zwei Codierungen sind daher gleichwertig.

Debug.Print objRs.Fields.Item(0)  ' Beide Anweisungen drucken
Debug.Print objRs(0)              ' den Wert von Item(0).


Stream-Objekt (ADO)

Stream-Objekt

Stellt einen binären Datenstrom oder Text dar.

Hinweise

In strukturierten Hierarchien, wie z. B. in einem Dateisystem oder einem E-Mailsystem, kann ein Record-Objekt einen ihm zugeordneten standardmäßigen binären Datenstrom aus Bits enthalten, der den Inhalt der Datei oder der E-Mail enthält. Ein Stream-Objekt kann zur Veränderung von Feldern oder Datensätzen verwendet werden, die diese Datenströme enthalten. Ein Stream-Objekt kann folgendermaßen erhalten werden:

  • Aus einem URL, der auf ein Objekt (meist eine Datei) zeigt, welches die binären Daten oder Textdaten enthält. Dieses Objekt kann ein einfaches Dokument, ein Record-Objekt (das ein strukturiertes Dokument darstellt) oder ein Ordner sein.

  • Durch Öffnen des standardmäßigen Stream-Objekts, das mit dem Record-Objekt verbunden ist. Sie können den standardmäßigen Strom, der mit dem Record-Objekt verbunden ist, erhalten, wenn das Record-Objekt geöffnet wurde, um einen Umweg zum Öffnen des Stroms zu vermeiden.

  • Durch Instanziieren eines Stream-Objekts. Diese Stream-Objekte können zur Datenspeicherung Ihrer Anwendung verwendet werden. Anders als ein Stream-Objekt, das mit einem URL verbunden ist, oder der Standard-Stream eines Record-Objekts, hat ein instanziiertes Stream-Objekt standardmäßig keine Verbindung mit einer zugrunde liegenden Quelle.

Mit den Methoden und Eigenschaften eines Stream-Objekts können Sie folgende Verfahren ausführen:

  • Öffnen eines Stream-Objekts von einem Record-Objekt oder URL aus, mit der Open-Methode

  • Schließen eines Stream-Objekts mit der Close-Methode

  • Eingeben von Bytes oder Text in ein Stream-Objekt mit den Write- und WriteText-Methoden

  • Lesen von Bytes aus einem Stream-Objekt mit den Read- und ReadText-Methoden

  • Schreiben von Stream-Daten in den ADO-Puffer eines zugrunde liegenden Objekts mit der Flush-Methode

  • Kopieren des Inhalts eines Stream-Objekts in einen anderen Stream mit der CopyTo-Methode

  • Steuern, wie Zeilen aus der Quelldatei gelesen werden, mit der SkipLine-Methode und der LineSeparator-Eigenschaft

  • Bestimmen des Endes der Datenstromposition mit der EOS-Eigenschaft und der SetEOS-Methode

  • Speichern und Wiederherstellen von Daten in Dateien mit den SaveToFile- und LoadFromFile-Methoden

  • Angeben des Zeichensatzes für das Speichern des Stream-Objekts mit der Charset-Eigenschaft

  • Anhalten einer asynchronen Stream-Operation mit der Cancel-Methode

  • Bestimmen der Anzahl des Bytes in einem Stream-Objekt mit der Size-Eigenschaft

  • Steuern der aktuellen Position innerhalb eines Stream-Objekts mit der Position-Eigenschaft

  • Bestimmen des Datentyps in einem Stream-Objekt mit der Type-Eigenschaft

  • Bestimmen des aktuellen Status des Stream-Objekts (geschlossen, offen oder ausführend) mit der State-Eigenschaft

  • Angeben des Zugriffsmodus für das Stream-Objekt mit der Mode-Eigenschaft


ADO-Auflistungen

Die Beziehungen zwischen diesen Auflistungen und den ADO-Objekten sind im ADO-Objektmodell dargestellt.

Jede Auflistung kann ihr entsprechendes Objekt beinhalten. So kann z. B. ein Error -Objekt in einer Errors-Auflistung enthalten sein. Weitere Informationen zu Objekten erhalten Sie unter ADO-Objekte oder unter einem bestimmten Objektthema.

ADO-Auflistungen - Zusammenfassung

Auflistung | Beschreibung
Errors | Enthält sämtliche Error-Objekte, die als Reaktion auf einen einzelnen Fehler erstellt wurden, an dem der Provider beteiligt war.
Fields | Enthält alle Field-Objekte eines Recordset-Objekts.
Parameters | Enthält alle Parameter-Objekte eines Command-Objekts.
Properties | Enthält alle Property-Objekte für eine bestimmte Instanz eines Objekts.


Errors-Auflistung (ADO)

Errors-Auflistung

Enthält sämtliche Error-Objekte, die als Reaktion auf einen einzelnen Fehler erstellt wurden, an dem der Provider beteiligt war.

Hinweise

Jede Operation, an der ADO-Objekte beteiligt sind, kann einen oder mehrere Providerfehler auslösen. Sobald ein Fehler auftritt, können ein oder mehrere Error-Objekte in die Errors-Auflistung des Connection-Objekts übernommen werden. Wenn eine andere ADO-Operation einen Fehler auslöst, wird die Errors-Auflistung gelöscht, und der neue Satz von Error-Objekten kann in der Errors-Auflistung platziert werden.

Jedes Error-Objekt stellt einen bestimmten Providerfehler, aber keinen ADO-Fehler dar. ADO-Fehler werden über die Laufzeitfehlerbehandlung bearbeitet. In Microsoft Visual Basic beispielsweise löst das Auftreten eines ADO-spezifischen Fehlers ein onError-Ereignis aus, und der Fehler wird im Err-Objekt angezeigt.

ADO-Operationen, die keinen Fehler auslösen, haben keinen Einfluss auf die Errors-Auflistung. Verwenden Sie die Clear-Methode, um die Errors-Auflistung manuell zu löschen.

Der Satz von Errors-Objekten in der Errors-Auflistung beschreibt sämtliche Fehler, die als Reaktion auf eine einzelne Anweisung aufgetreten sind. Durch das Aufzählen der spezifischen Fehler in der Errors-Auflistung können Ihre Fehlerbehandlungsroutinen die Ursache und Herkunft eines Fehlers genauer bestimmen und geeignete Schritte für dessen Behebung einleiten.

Einige Eigenschaften und Methoden geben Warnmeldungen zurück, die als Error-Objekte in der Errors-Auflistung angezeigt werden, ohne die Programmausführung jedoch anzuhalten. Bevor Sie die Resync-, UpdateBatch- oder CancelBatch-Methode bei einem Recordset-Objekt, die Open-Methode bei einem Connection-Objekt oder die Filter-Eigenschaft bei einem Recordset-Objekt aufrufen, rufen Sie die Clear-Methode in der Errors-Auflistung auf. Dadurch können Sie die Count-Eigenschaft der Errors-Auflistung lesen, um nach zurückgegebenen Warnmeldungen zu suchen.

Anmerkung Eine ausführliche Erklärung darüber, wie eine einzelne ADO-Operation mehrere Fehler auslösen kann, finden Sie unter dem Thema zum Error-Objekt.


Fields-Auflistung (ADO)

Fields-Auflistung

Beinhaltet alle Field-Objekte eines Recordset- oder Record-Objekts.

Hinweise

Ein Recordset-Objekt besitzt eine Fields-Auflistung, die aus den Field-Objekten besteht. Jedes Field-Objekt entspricht einer Spalte im Recordset-Objekt. Sie können die Fields-Auflistung vor dem Öffnen des Recordset-Objekts durch Aufrufen der Refresh-Methode in der Auflistung auffüllen.

Anmerkung Eine ausführliche Erklärung zum Verwenden der Field-Objekte finden Sie unter dem Hilfethema zum Field-Objekt.

Die Fields-Auflistung enthält eine Append-Methode, die Field-Objekte vorläufig erstellt und der Auflistung hinzufügt, und eine Update-Methode, die Ergänzungen und Entfernungen zum Abschluss bringt.

Ein Record-Objekt beinhaltet zwei spezielle Felder, die mit FieldEnum-Konstanten indiziert werden können. Eine Konstante greift auf ein Feld zu, das den Standarddatenstrom für das Record-Objekt enthält, und die andere Konstante greift auf ein Feld zu, das die Zeichenfolge des absoluten URLs für das Record-Objekt enthält.

Bestimmte Provider (z. B. der Microsoft OLE DB-Provider für Internet Publishing) können die Fields-Auflistung mit einer Teilmenge der verfügbaren Felder für das Record- oder das Recordset-Objekt auffüllen. Andere Felder werden nicht in die Auflistung aufgenommen, bis auf sie durch den Namen verwiesen wurde oder sie durch Ihre Codierung indiziert wurden.

Wenn Sie versuchen, mit dem Namen auf ein Feld zu referenzieren, das nicht existiert, wird ein neues Field-Objekt der Fields-Auflistung mit einem Status von adFieldPendingInsert hinzugefügt. Wenn Sie Update aufrufen, wird ADO ein neues Feld in Ihrer Datenquelle erstellen, falls es der Provider erlaubt.


Parameters-Auflistung (ADO)

Parameters-Auflistung

Enthält alle Parameter-Objekte eines Command-Objekts.

Hinweise

Ein Command-Objekt besitzt eine Parameters-Auflistung, die aus den Parameter-Objekten besteht.

Durch Verwenden der Refresh-Methode in einer Parameters-Auflistung eines Command-Objekts werden die Parameterinformationen des Providers für die im Command-Objekt festgelegte, gespeicherte Prozedur oder parametrisierte Abfrage gelesen. Einige Provider unterstützen keine Aufrufe oder parametrisierten Abfragen gespeicherter Prozeduren. Beim Verwenden eines solchen Providers gibt das Aufrufen der Refresh-Methode in der Parameters-Auflistung einen Fehler zurück.

Wenn Sie keine eigenen Parameter-Objekte definiert haben und auf die Parameters-Auflistung zugreifen, bevor Sie die Refresh-Methode aufrufen, ruft ADO automatisch die Methode auf und füllt die Auflistung selbst auf.

Sie können die Aufrufe des Providers zum Zweck der Leistungsverbesserung auf ein Minimum reduzieren, wenn Sie die Eigenschaften der Parameter kennen, die mit der aufzurufenden, gespeicherten Prozedur oder parametrisierten Abfrage verbunden sind. Verwenden Sie die CreateParameter-Methode, um Parameter-Objekte mit den entsprechenden Eigenschaftseinstellungen zu erstellen. Verwenden Sie die Append-Methode, um sie der Parameters-Auflistung hinzuzufügen. Hiermit können Sie Parameterwerte festlegen und zurückgeben, ohne den Provider für den Erhalt der Parameterinformationen aufzurufen. Wenn Sie für einen Provider schreiben, der keine Parameterinformationen zur Verfügung stellt, müssen Sie die Parameters-Auflistung mit dieser Methode manuell auffüllen, damit überhaupt Parameter verwendet werden können. Verwenden Sie die Delete-Methode, um die Parameter-Objekte gegebenenfalls aus der Parameters-Auflistung zu entfernen.


Properties-Auflistung (ADO)

Properties-Auflistung

Enthält alle Property-Objekte für eine bestimmte Instanz eines Objekts.

Hinweise

Einige ADO-Objekte besitzen eine Properties-Auflistung, die aus den Property-Objekten besteht. Jedes Property-Objekt entspricht einem Merkmal des ADO-Objekts, das spezifisch für den Provider ist.

Anmerkung Eine ausführliche Erklärung zum Verwenden von Property-Objekten finden Sie unter dem Thema zum Property-Objekt.


ADO-Eigenschaften

ADO-Eigenschaften - Zusammenfassung

Eigenschaft | Beschreibung
AbsolutePage | Gibt an, auf welcher Seite der aktuelle Datensatz gespeichert ist.
AbsolutePosition | Gibt die Ordinalposition des aktuellen Datensatzes eines Recordset-Objekts an.
ActiveCommand | Bestimmt das Command-Objekt, das das zugeordnete Recordset-Objekt erstellt hat.
ActiveConnection | Zeigt an, welchem Connection-Objekt das gegebene Command-, Recordset- oder Record-Objekt derzeit zugeordnet ist.
ActualSize | Kennzeichnet die tatsächliche Länge eines Feldwertes.
Attributes | Kennzeichnet eines oder mehrere Merkmale eines Objekts.
BOF und EOF | BOF – zeigt an, dass sich die aktuelle Datensatzposition vor dem ersten Datensatz in einem Recordset-Objekt befindet. EOF – zeigt an, dass sich die aktuelle Datensatzposition hinter dem letzten Datensatz in einem Recordset-Objekt befindet.
Bookmark | Gibt ein Lesezeichen zurück, das den aktuellen Datensatz in einem Recordset-Objekt eindeutig kennzeichnet, oder legt als aktuellen Datensatz in einem Recordset-Objekt denjenigen Datensatz fest, der durch ein gegebenes gültiges Lesezeichen gekennzeichnet ist.
CacheSize | Zeigt die Anzahl an Datensätzen aus einem Recordset-Objekt an, die lokal zwischengespeichert sind.
CharSet | Gibt den Zeichensatz an, der zur Umwandlung der Zeichen im Textdatenstrom des gegebenen Stream-Objekts verwendet werden soll.
CommandText | Verweist auf den Text eines Befehls, der an einen Provider ausgegeben werden soll.
CommandTimeout | Zeigt an, wie lange während der Ausführung eines Befehls gewartet werden muss, bevor der Versuch abgebrochen und ein Fehler ausgelöst wird.
CommandType | Gibt den Typ eines Command-Objekts an.
Connect (RDS) | Gibt den Namen der Datenbank an, in der die Abfrage- und Aktualisierungsoperationen ausgeführt werden.
ConnectionString | Gibt die Informationen an, die zum Einrichten einer Verbindung mit einer Datenquelle verwendet werden.
ConnectionTimeout | Zeigt an, wie lange bei der Einrichtung einer Verbindung gewartet wird, bevor der Versuch abgebrochen und ein Fehler ausgelöst wird.
Count | Gibt die Anzahl der Objekte in einer Auflistung an.
CursorLocation | Gibt den Standort der Cursorfunktion an.
CursorType | Gibt den in einem Recordset-Objekt verwendeten Cursortyp an.
DataMember | Gibt den Namen des Datenelements an, das von dem Objekt abgerufen werden soll, auf das die DataSource-Eigenschaft verweist.
DataSource | Gibt ein Objekt an, das Daten enthält, die als Recordset-Objekt dargestellt werden sollen.
DefaultDatabase | Gibt die Standarddatenbank für ein Connection-Objekt an.
DefinedSize | Gibt den Umfang der von einem Field-Objekt speicherbaren Daten an.
Description | Beschreibt ein Error-Objekt.
Direction | Zeigt an, ob der Parameter einen Eingabeparameter, einen Ausgabeparameter oder beides darstellt bzw. ob es sich bei dem Parameter um den Rückgabewert einer gespeicherten Prozedur handelt.
EditMode | Gibt den Bearbeitungsstatus des aktuellen Datensatzes an.
EOS | Zeigt an, ob die aktuelle Position auf das Ende des Datenstroms verweist.
ExecuteOptions (RDS) | Gibt an, ob asynchrone Ausführung aktiviert ist.
FetchOptions (RDS) | Gibt den Typ des asynchronen Abrufs an.
Filter | Gibt einen Filter für die Daten in einem Recordset-Objekt an.
FilterColumn (RDS) | Gibt die Spalte an, auf die die Filterkriterien angewendet werden sollen.
FilterCriterion (RDS) | Gibt den im Filterwert zu verwendenden Auswertungsoperator an.
FilterValue (RDS) | Gibt den Wert an, nach dessen Maßgabe die Datensätze gefiltert werden sollen.
Handler (RDS) | Gibt den Namen eines serverbasierten Anpassungsprogramms (Handlers) an, mit dem die Funktionalität von RDSServer.DataFactory erweitert wird, sowie alle vom Handler verwendeten Parameter.
HelpContext und HelpFile | Enthalten Verweise auf Hilfedatei und Hilfethema zu einem bestimmten Error-Objekt. HelpContextID - gibt eine Kontext-ID als Wert vom Datentyp Long für ein Thema in einer Hilfedatei zurück. HelpFile - Gibt einen Wert vom Datentyp String zurück, der einen vollständig aufgeschlüsselten Pfad zu einer Hilfedatei ergibt.
Index | Gibt den Namen des für ein Recordset-Objekt derzeit gültigen Indexes an.
InternetTimeout (RDS) | Zeigt die Anzahl an Millisekunden an, die bis zum Ablaufen des Zeitlimits einer Anforderung vergehen.
IsolationLevel | Zeigt die Isolationsebene für ein Connection-Objekt an.
Item | Verweist (über Namen oder Ordinalzahl) auf ein bestimmtes Element einer Auflistung.
LineSeparator | Gibt das Binärzeichen an, das als Zeilentrennzeichen in Stream-Objekten für Textdatenströme verwendet werden soll.
LockType | Zeigt die Art der Sperrung an, die während des Bearbeitens auf Datensätze gelegt wird.
MarshalOptions | Gibt an, welche Datensätze durch Marshalling an den Server zurückgegeben werden.
MaxRecords | Gibt die maximale Anzahl an Datensätzen an, die aus einer Abfrage an ein Recordset-Objekt zurückgegeben werden.
Mode | Gibt die verfügbaren Berechtigungen für das Ändern von Daten in einem Connection-, Record- oder Stream-Objekt an.
Name | Gibt den Namen eines Objekts an.
NativeError | Gibt den providerspezifischen Fehlercode für ein gegebenes Error-Objekt an.
Number | Gibt die Nummer an, durch die ein Error-Objekt eindeutig gekennzeichnet wird.
NumericScale | Gibt die Skalierung der numerischen Werte in einem Parameter- oder Field-Objekt an.
OriginalValue | Gibt den ursprünglich im Datensatz gespeicherten Wert eines Field-Objekts an, bevor Änderungen vorgenommen wurden.
PageCount | Gibt an, wie viele Datenseiten das Recordset-Objekt enthält.
PageSize | Gibt an, aus wie vielen Datensätzen eine Seite im Recordset-Objekt besteht.
ParentURL | Gibt die Zeichenfolge einer absoluten URL-Adresse an, die auf das übergeordnete Record-Objekt des aktuellen Record–Objekts verweist.
Position | Zeigt die aktuelle Position innerhalb eines Stream–Objekts an.
Precision | Gibt den Genauigkeitsgrad für die numerischen Werte in einem Parameter-Objekt oder für numerische Field-Objekte an.
Prepared | Gibt an, ob eine kompilierte Version eines Befehls vor dessen Ausführung gespeichert werden soll.
Provider | Gibt den Namen des Providers für ein Connection-Objekt an.
ReadyState (RDS) | Gibt den Fortschritt eines DataControl-Objekts beim Abrufen von Daten in das dazugehörige Recordset-Objekt an.
RecordCount | Gibt die Anzahl von Datensätzen in einem Recordset-Objekt an.
Recordset und SourceRecordset (RDS) | Gibt das von einem benutzerdefinierten Geschäftsobjekt zurückgegebene Recordset–Objekt an.
RecordType | Gibt den Typ des Record-Objekts an.
Server (RDS) | Gibt den Namen für Internet-Informationsdienste (IIS) und das Kommunikationsprotokoll an.
Size | Gibt die maximale Größe eines Parameter-Objekts in Bytes oder Zeichen an.
Size (ADO Stream-Objekt) | Gibt die Gesamtgröße des Datenstroms in Bytes an.
Sort | Gibt einen oder mehrere Feldnamen an, nach denen die Sortierung im Recordset-Objekt durchgeführt wird. Außerdem wird festgelegt, ob die einzelnen Felder in aufsteigender oder absteigender Reihenfolge sortiert werden.
SortColumn (RDS) | Gibt die Spalte an, nach der die Datensätze sortiert werden sollen.
SortDirection (RDS) | Gibt an, ob eine Sortierung in auf- oder absteigender Reihenfolge erfolgen soll.
Source (ADO Error-Objekt) | Gibt den Namen des Objekts oder der Anwendung an, das/die ursprünglich einen Fehler ausgelöst hat.
Source (ADO Record-Objekt) | Verweist auf die Einheit, die durch das Record–Objekt repräsentiert wird.
Source (ADO Recordset-Objekt) | Gibt die Quelle für die Daten im Recordset-Objekt an.
SQL (RDS) | Gibt die Abfragezeichenfolge an, die zum Abrufen des Recordset-Objekts verwendet wird.
SQLState | Gibt den SQL-Zustand für ein gegebenes Error-Objekt an.
State | Gibt für alle anwendbaren Objekte an, ob der Status des jeweiligen Objekts 'geöffnet' oder 'geschlossen' ist. Sofern die anwendbaren Objekte eine asynchrone Methode ausführen, gibt diese Eigenschaft an, ob der aktuelle Status des jeweiligen Objekts 'verbindend', 'ausführend' oder 'abrufend' ist.
Status (ADO Field-Objekt) | Gibt den Status eines Field-Objekts an.
Status (ADO Recordset-Objekt) | Gibt den Status des aktuellen Datensatzes in Bezug auf Stapelaktualisierungen oder andere Mehrfachoperationen an.
StayInSync | Gibt in einem hierarchischen Recordset-Objekt an, ob der Verweis auf die zugrunde liegenden untergeordneten Datensätze (d. h. ein Kapitel) sich ändert, wenn sich die Position der übergeordneten Zeile ändert.
Type | Gibt den Operationstyp oder Datentyp eines Parameter-, Field- oder Property-Objekts an.
Type (ADO Stream-Objekt) | Gibt den Typ der im Stream–Objekt enthaltenen Daten an (binär oder Text).
UnderlyingValue | Gibt den aktuellen Wert eines Field-Objekts in der Datenbank an.
URL (RDS) | Gibt eine Zeichenfolge an, die einen relativen oder absoluten URL darstellt.
Value | Gibt den Wert an, der einem Field-, Parameter- oder Property-Objekt zugewiesen ist.
Version | Gibt die ADO-Versionsnummer an.


AbsolutePage-Eigenschaft (ADO)

AbsolutePage-Eigenschaft

Gibt an, auf welcher Seite der aktuelle Datensatz gespeichert ist.

Einstellungen und Rückgabewerte

Legt einen Wert vom Datentyp Long zwischen 1 und der Anzahl der Seiten im Recordset-Objekt (PageCount) fest bzw. gibt diesen Wert zurück oder gibt einen der PositionEnum-Werte zurück.

Hinweise

Verwenden Sie die AbsolutePage-Eigenschaft, um die Seite festzulegen, auf der sich der aktuelle Datensatz befindet. Verwenden Sie die PageSize-Eigenschaft, um das Recordset-Objekt logisch in eine Folge von Seiten aufzuteilen, von denen jede die Anzahl von Datensätzen enthält, die in PageSize definiert ist (mit Ausnahme der letzten Seite, die weniger Datensätze enthalten kann). Der Provider muss die entsprechende Funktionalität für diese Eigenschaft unterstützen, damit sie zur Verfügung steht.

Wie bei der AbsolutePosition-Eigenschaft beginnt auch der Wertebereich von AbsolutePage mit 1. Die Eigenschaft hat den Wert 1, wenn es sich bei dem aktuellen Datensatz um den ersten Datensatz im Recordset-Objekt handelt. Legen Sie diese Eigenschaft fest, um zum ersten Datensatz einer bestimmten Seite zu wechseln. Die Gesamtzahl von Seiten erhalten Sie über die PageCount-Eigenschaft.


AbsolutePosition-Eigenschaft (ADO)

AbsolutePosition-Eigenschaft

Gibt die Ordinalposition des aktuellen Datensatzes eines Recordset-Objekts an.

Einstellungen und Rückgabewerte

Legt einen Wert vom Datentyp Long zwischen 1 und der Anzahl der Seiten im Recordset-Objekt (PageCount) fest bzw. gibt diesen Wert zurück oder gibt einen der PositionEnum-Werte zurück.

Hinweise

Verwenden Sie die AbsolutePosition-Eigenschaft, um zu einem Datensatz anhand seiner Ordinalposition im Recordset-Objekt zu wechseln oder um die Ordinalposition des aktuellen Datensatzes zu bestimmen. Der Provider muss die entsprechende Funktionalität für diese Eigenschaft unterstützen, damit sie zur Verfügung steht.

Wie bei der AbsolutePage-Eigenschaft beginnt der Wertebereich der AbsolutePosition–Eigenschaft mit 1. Dieser Wert zeigt an, dass es sich bei dem aktuellen Datensatz um den ersten Datensatz im Recordset-Objekt handelt. Sie können die Gesamtzahl an Datensätzen im Recordset-Objekt über die RecordCount-Eigenschaft abrufen.

Beim Setzen der AbsolutePosition-Eigenschaft lädt ADO eine neue Gruppe von Datensätzen in den Zwischenspeicher, wobei der Vorgang bei dem angegebenen Datensatz beginnt, selbst wenn sich dieser Datensatz bereits im aktuellen Zwischenspeicher befindet. Die CacheSize-Eigenschaft bestimmt die Größe dieser Gruppe.

Anmerkung Sie sollten die AbsolutePosition-Eigenschaft nicht als Ersatz für eine Datensatznummer verwenden. Die Position eines gegebenen Datensatzes ändert sich, wenn Sie einen vorhergehenden Datensatz löschen. Es gibt außerdem keine Garantie, dass ein bestimmter Datensatz denselben Wert der AbsolutePosition-Eigenschaft beibehält, falls das Recordset-Objekt erneut abgefragt oder geöffnet wird. Lesezeichen sind weiterhin die empfohlene Lösung für das Beibehalten und Zurückkehren zu einer gegebenen Position und den nachfolgenden Zugriff darauf. Sie stellen die einzige Möglichkeit dar, eine Positionierung in allen Typen von Recordset-Objekten vorzunehmen.


ActiveCommand-Eigenschaft (ADO)

ActiveCommand-Eigenschaft

Bestimmt das Command-Objekt, das das zugeordnete Recordset-Objekt erstellt hat.

Rückgabewert

Gibt einen Wert vom Datentyp Variant zurück, der ein Command-Objekt enthält. Die Standardeinstellung ist ein Null-Objektverweis.

Hinweise

Die ActiveCommand-Eigenschaft ist schreibgeschützt.

Falls zur Erstellung des aktuellen Recordset-Objekts kein Command-Objekt verwendet wurde, besteht der zurückgegebene Wert aus einem Null-Objektverweis.

Verwenden Sie diese Eigenschaft zur Ermittlung des zugeordneten Command-Objekts, wenn Ihnen nur das resultierende Recordset-Objekt zur Verfügung steht.


ActiveConnection-Eigenschaft (ADO)

ActiveConnection-Eigenschaft

Gibt an, welchem Connection-Objekt das gegebene Command-, Recordset - oder Record-Objekt derzeit zugeordnet ist.

Einstellungen und Rückgabewerte

Legt bei geschlossener Verbindung einen Wert vom Datentyp String fest, der die Definition für diese Verbindung enthält, oder gibt diesen Wert zurück. Bei geöffneter Verbindung gibt diese Eigenschaft einen Wert vom Datentyp Variant an, der das aktuelle Connection-Objekt enthält. Die Standardeinstellung ist ein Null-Objektverweis. Weitere Information hierzu finden Sie in der Beschreibung der ConnectionString-Eigenschaft.

Hinweise

Verwenden Sie die ActiveConnection-Eigenschaft, um das Connection-Objekt zu bestimmen, über das das gegebene Command-Objekt ausgeführt bzw. das gegebene Recordset-Objekt geöffnet wird.

Befehl

Bei Command-Objekten bietet die ActiveConnection-Eigenschaft Schreib-/Lesezugriff.

Wenn Sie versuchen, die Execute-Methode in einem Command-Objekt aufzurufen, bevor Sie diese Eigenschaft für ein geöffnetes Connection-Objekt oder eine gültige Verbindungszeichenfolge festlegen, tritt ein Fehler auf.

Microsoft Visual Basic Das Setzen der ActiveConnection-Eigenschaft auf Nothing trennt das Command-Objekt vom aktuellen Connection-Objekt und veranlasst den Provider, alle zugeordneten Ressourcen in der Datenquelle freizugeben. Sie können das Command-Objekt dann demselben oder einem anderen Connection-Objekt zuordnen. Einige Provider ermöglichen es, beim Ändern der Einstellung der Eigenschaft direkt von einem Connection-Objekt zu einem anderen zu wechseln, ohne dass die Eigenschaft zunächst auf den Wert Nothing gesetzt werden muss.

Falls die Parameters-Auflistung des Command-Objekts Parameter enthält, die vom Provider geliefert wurden, wird die Auflistung gelöscht, wenn Sie die ActiveConnection-Eigenschaft auf Nothing oder auf ein anderes Connection-Objekt setzen. Falls Sie die Parameter-Objekte manuell erstellen und zum Ausfüllen der Parameters-Auflistung des Command-Objekts verwenden, bleibt die Parameters-Auflistung beim Festlegen der ActiveConnection-Eigenschaft auf Nothing oder auf ein anderes Connection-Objekt intakt.

Das Schließen des Connection-Objekts, mit dem ein Command-Objekt verknüpft ist, setzt die ActiveConnection-Eigenschaft auf Nothing. Wird versucht, der Eigenschaft ein geschlossenes Connection-Objekt zuzuweisen, löst dies einen Fehler aus.

Recordset

Für geöffnete Recordset-Objekte oder für Recordset-Objekte, deren Source-Eigenschaft auf ein gültiges Command-Objekt gesetzt ist, ist die ActiveConnection-Eigenschaft schreibgeschützt. Andernfalls bietet sie Schreib-/Lesezugriff.

Sie können die Eigenschaft auf ein gültiges Connection-Objekt oder auf eine gültige Verbindungszeichenfolge festlegen. Im letzteren Fall erstellt der Provider unter Verwendung dieser Definition ein neues Connection-Objekt und öffnet die Verbindung. Darüber hinaus kann der Provider anschließend der Eigenschaft das neue Connection-Objekt zuweisen, um über den Zugriff auf das Connection-Objekt das Abrufen erweiterter Fehlerinformationen oder die Ausführung anderer Befehle zu ermöglichen.

Wenn Sie das ActiveConnection-Argument der Open-Methode zum Öffnen eines Recordset-Objekts verwenden, übernimmt die ActiveConnection-Eigenschaft den Wert dieses Arguments.

Wenn Sie die Source-Eigenschaft des Recordset-Objekts auf eine gültige Command-Objektvariable setzen, übernimmt die ActiveConnection-Eigenschaft des Recordset-Objekts die Einstellung der ActiveConnection-Eigenschaft des Command-Objekts.

Verwenden von Remote Data Service In einem clientseitig verwendeten Recordset-Objekt kann diese Eigenschaft nur auf eine Verbindungszeichenfolge bzw. (in Microsoft Visual Basic oder Visual Basic Scripting Edition) auf Nothing festgelegt werden.

Datensatz

Diese Eigenschaft bietet Schreib-/Lesezugriff, wenn das Record-Objekt geschlossen ist. Sie kann dann eine Verbindungszeichenfolge oder einen Verweis auf ein geöffnetes Connection-Objekt enthalten. Bei geöffnetem Record-Objekt ist die Eigenschaft schreibgeschützt und enthält einen Verweis auf ein geöffnetes Connection-Objekt.

Ein Connection-Objekt wird implizit erstellt, wenn das Record-Objekt über einen URL geöffnet wird. Das Record-Objekt lässt sich unter Verwendung eines vorhandenen geöffneten Connection-Objekts öffnen, indem das Connection-Objekt dieser Eigenschaft zugewiesen wird oder indem das Connection-Objekt als Parameter im Aufruf der Open–Methode verwendet wird. Wenn das Record-Objekt über ein vorhandenes Record- oder Recordset-Objekt geöffnet wird, ist es automatisch mit dem Connection-Objekt des ursprünglichen Record– bzw. Recordset-Objekts verknüpft.


ActualSize-Eigenschaft (ADO)

ActualSize-Eigenschaft

Kennzeichnet die tatsächliche Länge eines Feldwertes.

Einstellungen und Rückgabewerte

Gibt einen Wert vom Datentyp Long zurück. Einige Provider lassen unter Umständen das Setzen dieser Eigenschaft zu, um Speicherplatz für BLOB-Daten zu reservieren. In diesem Fall ist der Standardwert 0.

Hinweise

Verwenden Sie die ActualSize-Eigenschaft, um die tatsächliche Länge des Wertes eines Field-Objekts zurückzugeben. Die ActualSize-Eigenschaft ist für alle Felder schreibgeschützt. Falls ADO die Länge des Wertes des Field-Objekts nicht bestimmen kann, gibt die ActualSize-Eigenschaft den Wert adUnknown zurück.

Die Eigenschaften ActualSize und DefinedSize sind verschieden, wie das folgende Beispiel zeigt: Ein Field-Objekt mit einem deklarierten adVarChar-Typ und einer maximalen Länge von 50 Zeichen gibt einen DefinedSize-Eigenschaftswert von 50 zurück. Der zurückgegebene ActualSize-Eigenschaftswert entspricht jedoch der Länge der Daten, die in dem Feld für den aktuellen Datensatz gespeichert sind. Field-Objekte, deren DefinedSize–Eigenschaft einen Wert von mehr als 255 Bytes angibt, werden als Spalten mit variabler Länge behandelt.


Attributes-Eigenschaft (ADO)

Attributes-Eigenschaft

Kennzeichnet eines oder mehrere Merkmale eines Objekts.

Einstellungen und Rückgabewerte

Legt einen Wert vom Datentyp Long fest oder gibt diesen zurück.

Bei einem Connection-Objekt bietet die Attributes-Eigenschaft Schreib-/Lesezugriff. Ihr Wert kann die Summe aus einem oder mehreren XactAttributeEnum-Werten sein. Der Standardwert ist Null (0).

Bei einem Parameter-Objekt bietet die Attributes-Eigenschaft Schreib-/Lesezugriff. Ihr Wert kann die Summe aus einem oder mehreren ParameterAttributesEnum-Werten sein. Der Standardwert ist adParamSigned.

Bei einem Field-Objekt kann die Attributes-Eigenschaft die Summe aus einem oder mehreren FieldAttributeEnum-Werten sein. In der Regel ist die Attributes–Eigenschaft schreibgeschützt. Aber bei neuen Field–Objekten, die zur Fields–Auflistung eines Record–Objekts hinzugefügt wurden, bietet die Attributes–Eigenschaft erst dann Lese/Schreibzugriff, wenn die Value–Eigenschaft des Field–Objekts bereits mit einem Wert belegt und das neue Field-Objekt erfolgreich vom Datenprovider durch einen Aufruf der Update-Methode der Fields-Auflistung hinzugefügt worden ist.

Bei einem Property-Objekt bietet die Attributes-Eigenschaft Schreib-/Lesezugriff. Ihr Wert kann die Summe aus einem oder mehreren PropertyAttributesEnum-Werten sein.

Hinweise

Verwenden Sie die Attributes-Eigenschaft, um die Merkmale von Connection-, Parameter-, Field- oder Property-Objekten festzulegen bzw. zurückzugeben.

Wenn Sie mehrere Attribute festlegen, können Sie die entsprechenden Konstanten addieren. Wenn Sie den Eigenschaftswert durch eine Summe festlegen, die nicht kompatible Konstanten enthält, tritt ein Fehler auf.

Verwenden von Remote Data Service Diese Eigenschaft steht in einem clientseitig verwendeten Connection-Objekt nicht zur Verfügung.


BOF- und EOF-Eigenschaften (ADO)

BOF- und EOF-Eigenschaften

  • BOF - zeigt an, dass sich die aktuelle Datensatzposition vor dem ersten Datensatz in einem Recordset-Objekt befindet.

  • EOF - zeigt an, dass sich die aktuelle Datensatzposition hinter dem letzten Datensatz in einem Recordset-Objekt befindet.

Rückgabewert

Die Eigenschaften BOF und EOF geben boolesche Werte zurück.

Hinweise

Verwenden Sie BOF und EOF, um zu bestimmen, ob ein Recordset-Objekt Datensätze enthält oder ob Sie die Grenzen eines Recordset-Objekts überschreiten, wenn Sie von Datensatz zu Datensatz wechseln.

Die BOF-Eigenschaft gibt den Wert True (-1) zurück, wenn sich die aktuelle Datensatzposition vor dem ersten Datensatz befindet. Wenn sich die aktuelle Datensatzposition an oder hinter dem ersten Datensatz befindet, wird False (0) zurückgegeben.

Die EOF-Eigenschaft gibt True zurück, wenn die aktuelle Datensatzposition hinter dem letzten Datensatz liegt, und False, wenn die aktuelle Datensatzposition auf den letzten oder einen davor liegenden Datensatz weist.

Falls die BOF- oder die EOF-Eigenschaft den Wert True besitzt, ist kein aktueller Datensatz definiert.

Wenn Sie ein Recordset-Objekt öffnen, das keine Datensätze enthält, werden BOF und EOF auf True gesetzt, und die RecordCount-Eigenschaft des Recordset-Objekts zeigt den Wert 0 an. Wird ein Recordset-Objekt geöffnet, das mindestens einen Datensatz enthält, ist der erste Datensatz der aktuelle Datensatz und BOF und EOF besitzen den Wert False.

Wenn Sie den letzten verbleibenden Datensatz im Recordset-Objekt löschen, behalten die BOF- und die EOF-Eigenschaft gegebenenfalls so lange den Wert False, bis Sie versuchen, den aktuellen Datensatz neu zu platzieren.

Die folgende Tabelle zeigt, welche Move-Methoden mit verschiedenen Kombinationen der BOF- und der EOF-Eigenschaft zulässig sind.

 | MoveFirst, MoveLast | MovePrevious, Move < 0 | Move 0 | MoveNext, Move > 0
BOF=True, EOF=False | Zulässig | Fehler | Fehler | Zulässig
BOF=False, EOF=True | Zulässig | Zulässig | Fehler | Fehler
Beide True | Fehler | Fehler | Fehler | Fehler
Beide False | Zulässig | Zulässig | Zulässig | Zulässig

Die Zulässigkeit einer Move-Methode gewährleistet nicht, dass (bei ihrer Ausführung) ein Datensatz gefunden wird. Es bedeutet lediglich, dass ein Aufruf der angegebenen Move-Methode keinen Fehler auslöst.

Die folgende Tabelle zeigt, wie sich die Einstellungen der Eigenschaften BOF und EOF verhalten, wenn beim Aufrufen der verschiedenen Move-Methoden kein Datensatz ermittelt werden kann.

 | BOF | EOF
MoveFirst, MoveLast | Auf True gesetzt | Auf True gesetzt
Move 0 | Keine Änderung | Keine Änderung
MovePrevious, Move < 0 | Auf True gesetzt | Keine Änderung
MoveNext, Move > 0 | Keine Änderung | Auf True gesetzt


Bookmark-Eigenschaft (ADO)

Bookmark-Eigenschaft

Gibt ein Lesezeichen an, das den aktuellen Datensatz in einem Recordset-Objekt eindeutig kennzeichnet oder legt als aktuellen Datensatz in einem Recordset-Objekt denjenigen Datensatz fest, der durch ein gegebenes gültiges Lesezeichen gekennzeichnet ist.

Einstellungen und Rückgabewerte

Legt einen Variant-Ausdruck fest, der ein gültiges Lesezeichen darstellt, oder gibt diesen Ausdruck zurück.

Hinweise

Verwenden Sie die Bookmark-Eigenschaft, um die Position des aktuellen Datensatzes zu speichern und zu einem beliebigen Zeitpunkt zu diesem Datensatz zurückzukehren. Lesezeichen stehen nur in den Recordset-Objekten zur Verfügung, die die Lesezeichenfunktionalität unterstützen.

Wenn Sie ein Recordset-Objekt öffnen, besitzen alle darin enthaltenen Datensätze ein eindeutiges Lesezeichen. Sie speichern das Lesezeichen für den aktuellen Datensatz, indem Sie den Wert der Bookmark-Eigenschaft einer Variablen zuweisen. Nach dem Wechseln zu einem anderen Datensatz können Sie jederzeit schnell zu diesem Datensatz zurückkehren; legen Sie dazu die Bookmark-Eigenschaft des Recordset-Objekts auf den Wert dieser Variablen fest.

Der Wert des Lesezeichens kann u. U. nicht angezeigt werden. Lesezeichen sind außerdem nicht unbedingt direkt vergleichbar - zwei Lesezeichen, die sich auf denselben Datensatz beziehen, können etwa unterschiedliche Werte haben.

Wenn Sie zum Erstellen einer Kopie eines Recordset-Objekts die Clone-Methode verwenden, sind die Bookmark-Eigenschaftseinstellungen für das Original und das Duplikat des Recordset-Objekts identisch und austauschbar. Sie können Lesezeichen von verschiedenen Recordset-Objekten jedoch nicht austauschen, selbst wenn sie aus derselben Quelle oder mit demselben Befehl erstellt wurden.

Verwenden von Remote Data Service Die Bookmark-Eigenschaft steht in einem clientseitig verwendeten Recordset-Objekt immer zur Verfügung.


CacheSize-Eigenschaft (ADO)

CacheSize-Eigenschaft

Zeigt die Anzahl der Datensätze aus einem Recordset-Objekt an, die lokal zwischengespeichert sind.

Einstellungen und Rückgabewerte

Legt einen Wert vom Datentyp Long fest oder gibt einen solchen Wert zurück. Der Wert muss größer als 0 sein. Der Standardwert ist 1.

Hinweise

Mit der CacheSize-Eigenschaft können Sie steuern, wie viele Datensätze im Puffer des Providers verbleiben und wie viele Datensätze gleichzeitig in den lokalen Speicher geladen werden. Falls die CacheSize-Eigenschaft auf 10 festgelegt ist, ruft der Provider nach dem ersten Öffnen des Recordset-Objekts die ersten 10 Datensätze in den lokalen Speicher ab. Während Sie durch den Inhalt des Recordset-Objekts navigieren, gibt der Provider die Daten aus dem lokalen Pufferspeicher zurück. Sobald Sie sich über den letzten Datensatz im Zwischenspeicher hinaus bewegen, ruft der Provider die nächsten 10 Datensätze aus der Datenquelle in den Zwischenspeicher ab.

Der Wert dieser Eigenschaft kann während der Existenz des Recordset-Objekts angepasst werden. Das Ändern dieses Wertes beeinflusst die Anzahl der Datensätze im Zwischenspeicher jedoch erst bei den nachfolgenden Abrufen aus der Datenquelle. Das Ändern des Eigenschaftswertes allein ändert den aktuellen Inhalt des Zwischenspeichers nicht.

Wenn weniger Datensätze als in CacheSize angegeben abrufbar sind, gibt der Provider die verbleibenden Datensätze zurück. Es tritt kein Fehler auf.

Das Setzen von CacheSize auf Null (0) ist nicht zulässig; es wird ein Fehler zurückgegeben.

Aus dem Zwischenspeicher abgerufene Datensätze spiegeln nicht die Änderungen wider, die andere Personen gleichzeitig an den Quelldaten vornehmen. Um eine Aktualisierung aller zwischengespeicherten Daten zu erreichen, verwenden Sie die Resync-Methode.

Falls CacheSize auf einen Wert größer als 1 gesetzt wurde, kann die Verwendung der Navigationsmethoden (Move, MoveFirst, MoveLast, MoveNext und MovePrevious) dazu führen, dass ein gelöschter Datensatz angesteuert wird, sofern das Löschen nach dem Abruf der Datensätze erfolgte. Nach dem ersten Laden der Daten sind nachfolgende Löschungen solange im Datencache nicht präsent, wie nicht versucht wird, auf einen Datenwert eines gelöschten Datensatzes zuzugreifen. Allerdings lässt sich dieser Fall umgehen, indem CacheSize auf 1 gesetzt wird, da gelöschte Datensätze nicht abgerufen werden können.


Charset-Eigenschaft (ADO)

Charset-Eigenschaft

Gibt den Zeichensatz an, der zur Umwandlung der Zeichen im Textdatenstrom des gegebenen Stream-Objekts verwendet werden soll.

Einstellungen und Rückgabewerte

Legt einen Wert vom Datentyp String fest oder gibt einen solchen zurück. Der Wert bezeichnet den Zeichensatz, mit dessen Hilfe der Inhalt des String–Objekts umgewandelt wird. Der Standardwert ist "Unicode". Zulässige Werte sind die typischerweise zur Bezeichnung von Internet-Zeichensätzen über die Schnittstelle übergebenen Zeichenfolgen (z. B. "iso-8859-1", "Windows-1252" usw.). Eine Liste der Werte (Datentyp String) für die Zeichensätze, die einem System bekannt sind, findet sich in den Unterschlüsseln des Eintrags HKEY_CLASSES_ROOT\Mime\Database\Charset in der Windows-Registrierung.

Hinweise

In einem Text-Stream–Objekt werden Textdaten im Unicode-Format gespeichert. Die Charset–Eigenschaft veranlasst die Übersetzung der vom Stream–Objekt gelesenen Daten in den angegebenen Zeichensatz. In ähnlicher Weise werden Daten des angegebenen Zeichensatzformats, die in den Datenstrom des Stream–Objekts geschrieben werden, vor der Speicherung im Stream-Objekt in Unicode-Zeichen umgewandelt.

Bei geöffnetem Stream-Objekt muss sich die aktuelle Position am Anfang des Streams (0) befinden, damit Charset gesetzt werden kann.

Charset wird nur in Verbindung mit Text-Stream-Objekten verwendet (Type hat in diesem Fall den Wert adTypeText). Die Eigenschaft wird ignoriert, falls Type die Einstellung adTypeBinary besitzt.


CommandText-Eigenschaft (ADO)

CommandText-Eigenschaft

Verweist auf den Text eines Befehls, der an einen Provider ausgegeben werden soll.

Einstellungen und Rückgabewerte

Legt einen Wert vom Datentyp String fest oder gibt einen solchen zurück. Dieser Wert enthält einen Providerbefehl, wie z. B. eine SQL-Anweisung, einen Tabellennamen, einen relativen URL oder den Aufruf einer gespeicherten Prozedur. Die Voreinstellung ist "" (Zeichenfolge mit Nulllänge).

Hinweise

Verwenden Sie die CommandText-Eigenschaft, um den Text eines Befehls, repräsentiert von einem Command-Objekt, festzulegen oder zurückzugeben. Hierbei handelt es sich normalerweise um eine SQL-Anweisung. Es ist jedoch auch jede andere Art von Befehlsanweisung möglich, die durch den Provider erkannt wird (z. B. der Aufruf einer gespeicherten Prozedur). Eine SQL-Anweisung muss in dem bestimmten Dialekt bzw. der Version erstellt werden, die durch den Abfrageprozessor des Providers unterstützt wird.

Falls zum Zeitpunkt der Festlegung der CommandText-Eigenschaft die Prepared-Eigenschaft des Command-Objekts auf den Wert True gesetzt und das Command-Objekt an eine geöffnete Verbindung gebunden ist, bereitet ADO die Abfrage vor (d. h. eine kompilierte Version der Abfrage wird durch den Provider gespeichert), wenn Sie die Execute- oder Open-Methode aufrufen.

Je nach Einstellung der CommandType-Eigenschaft kann ADO die Einstellung der CommandText-Eigenschaft ändern. Sie können die CommandText-Eigenschaft zu jedem beliebigen Zeitpunkt lesen, um den aktuellen Befehlstext anzuzeigen, den ADO während der Ausführung verwendet.

Verwenden Sie die CommandText–Eigenschaft, um einen relativen URL zuzuweisen bzw. abzurufen, der eine Ressource (z. B. eine Datei oder ein Verzeichnis) bezeichnet. Die Ressourcenadresse ist relativ, bezieht sich also auf eine Adresse, die entweder explizit durch einen absoluten URL oder implizit durch ein geöffnetes Connection-Objekt vorgegeben ist.


CommandTimeout-Eigenschaft (ADO)

CommandTimeout-Eigenschaft

Zeigt an, wie lange während der Ausführung eines Befehls gewartet werden muss, bevor der Versuch abgebrochen und ein Fehler ausgelöst wird.

Einstellungen und Rückgabewerte

Legt einen Wert vom Datentyp Long fest oder gibt einen solchen zurück. Dieser Wert zeigt in Sekunden an, wie lange auf die Ausführung eines Befehls gewartet wird. Der Standardwert ist 30.

Hinweise

Verwenden Sie die CommandTimeout-Eigenschaft eines Connection- oder Command-Objekts, um den Abbruch eines Execute-Methodenaufrufs aufgrund netzwerkbedingter Verzögerungen oder starker Serverbeanspruchung zuzulassen. Wenn das in der CommandTimeout-Eigenschaft festgelegte Intervall abläuft, bevor die Befehlsausführung beendet ist, tritt ein Fehler auf, und ADO bricht den Befehl ab. Wenn Sie die Eigenschaft auf Null festlegen, wartet ADO bis die Ausführung abgeschlossen ist. Stellen Sie sicher, dass der Provider und die Datenquelle, für die Sie Code schreiben, die CommandTimeout-Funktionalität unterstützen.

Die CommandTimeout-Einstellung in einem Connection-Objekt hat keinen Einfluss auf die CommandTimeout-Einstellung eines Command-Objekts desselben Connection-Objekts. Dies bedeutet, dass die CommandTimeout-Eigenschaft des Command-Objekts den CommandTimeout-Wert des Connection-Objekts nicht übernimmt.

In einem Connection-Objekt bietet die CommandTimeout-Eigenschaft weiterhin Schreib-/Lesezugriff, nachdem das Connection-Objekt geöffnet wurde.


CommandType-Eigenschaft (ADO)

CommandType-Eigenschaft

Gibt den Typ eines Command-Objekts an.

Einstellungen und Rückgabewerte

Legt einen oder mehrere CommandTypeEnum-Werte fest oder gibt einen oder mehrere solcher Werte zurück. Sie können auch die adExecuteNoRecords–Konstante der ExecuteOptionEnum–Aufzählung verwenden, um das Leistungsverhalten durch Minimieren der internen Verarbeitungsvorgänge zu verbessern. Diese Konstante kommt nie einzeln vor, sondern immer in Kombination mit adCmdText oder adCmdStoredProc (Beispiel: adCmdText+adExecuteNoRecords). Wird adExecuteNoRecords zusammen mit der Open-Methode oder einem von dieser Methode verwendeten Command-Objekt verwendet, tritt ein Fehler auf.

Hinweise

Verwenden Sie die CommandType-Eigenschaft, um die Auswertung der CommandText-Eigenschaft zu optimieren.

Falls der Wert der CommandType-Eigenschaft dem Wert adCmdUnknown (dem Standardwert) entspricht, werden Sie u. U. eine verminderte Leistung feststellen, da ADO Aufrufe an den Provider durchführen muss, um zu bestimmen, ob es sich bei der CommandText-Eigenschaft um eine SQL-Anweisung, eine gespeicherte Prozedur oder einen Tabellennamen handelt. Wenn Ihnen der verwendete Befehlstyp bekannt ist, weist das Festlegen der CommandType-Eigenschaft ADO an, direkt zum entsprechenden Code zu springen. Wenn die CommandType-Eigenschaft nicht mit dem Typ des in der CommandText-Eigenschaft festgelegten Befehls übereinstimmt, tritt beim Aufrufen der Execute-Methode ein Fehler auf.


Connect-Eigenschaft (RDS)

Gibt den Namen der Datenbank an, in der die Abfrage- und Aktualisierungsoperationen ausgeführt werden.

Sie können die Connect-Eigenschaft zur Entwurfszeit in den OBJECT-Tags des RDS.DataControl-Objekts oder zur Laufzeit im Skripterstellungscode (z. B. VBScript) festlegen.

Syntax

Entwurfszeit: <PARAM NAME="Connect" VALUE="ConnectionString">

Laufzeit: DataControl.Connect = "ConnectionString"

Parameter

ConnectionString Eine gültige Verbindungszeichenfolge. Weitere allgemeine Informationen über Verbindungszeichenfolgen finden Sie im Hilfethema für die ConnectionString–Eigenschaft oder in Ihrer Provider-Dokumentation.

Anmerkung Falls MS Remote als Provider für das RDS.DataControl–Objekt angegeben wird, würde dies ein vierstufiges Szenario ergeben. Szenarien mit mehr als drei Stufen sind jedoch nicht getestet worden und sollten auch nicht erforderlich sein.

DataControl Eine Objektvariable, die ein RDS.DataControl-Objekt darstellt.


ConnectionString-Eigenschaft (ADO)

ConnectionString-Eigenschaft

Gibt die Informationen an, die zum Einrichten einer Verbindung mit einer Datenquelle verwendet werden.

Einstellungen und Rückgabewerte

Legt einen Wert vom Datentyp String fest oder gibt einen solchen zurück.

Hinweise

Verwenden Sie die ConnectionString-Eigenschaft zur Festlegung einer Datenquelle, indem Sie eine Verbindungszeichenfolge übergeben, die detaillierte Angaben in Form einer Reihe von durch Semikolons abgetrennten Argument = Wert-Anweisungen enthält.

ADO unterstützt fünf Argumente für die ConnectionString-Eigenschaft. Alle anderen Argumente werden direkt an den Provider übergeben, ohne von ADO verarbeitet zu werden. ADO unterstützt folgende Argumente.

Argument | Beschreibung
Provider= | Legt den Namen eines Providers fest, der für die Verbindung verwendet wird.
File Name= | Legt den Namen einer providerspezifischen Datei fest (z. B. ein dauerhaftes Datenquellobjekt), die die voreingestellten Verbindungsinformationen enthält.
Remote Provider= | Legt den Namen eines Providers fest, der beim Öffnen einer clientbasierten Verbindung verwendet wird. (Nur Remote Data Service.)
Remote Server= | Legt den Namen des Servers fest, der beim Öffnen einer clientbasierten Verbindung verwendet wird. (Nur Remote Data Service.)
URL= | Gibt die Verbindungszeichenfolge in Form eines absoluten URLs an, der auf eine Ressource (z. B. eine Datei oder ein Verzeichnis) verweist.

Nachdem Sie die ConnectionString-Eigenschaft festgelegt und das Connection-Objekt geöffnet haben, kann der Provider den Inhalt der Eigenschaft ändern, z. B. durch Zuordnen der ADO-definierten Argumentnamen zu ihren Provideräquivalenten.

Die ConnectionString-Eigenschaft übernimmt automatisch den Wert, der für das ConnectionString-Argument der Open-Methode verwendet wird. Daher kann die aktuelle ConnectionString-Eigenschaft während des Aufrufs der Open-Methode überschrieben werden.

Da das File Name-Argument ADO veranlasst, den zugeordneten Provider zu laden, können das Provider- und das File Name-Argument nicht zusammen übergeben werden.

Die ConnectionString-Eigenschaft bietet Schreib-/Lesezugriff, wenn die Verbindung geschlossen ist. Bei geöffneter Verbindung ist sie schreibgeschützt.

Mehrfachangaben eines Arguments in der ConnectionString–Eigenschaft werden ignoriert. In solchen Fällen wird die letzte Instanz des Arguments verwendet.

Verwenden von Remote Data Service In einem clientbasierten Connection-Objekt kann die ConnectionString-Eigenschaft nur die Parameter Remote Provider und Remote Server enthalten.


ConnectionTimeout-Eigenschaft (ADO)

ConnectionTimeout-Eigenschaft

Zeigt an, wie lange bei der Einrichtung einer Verbindung gewartet wird, bevor der Versuch abgebrochen und ein Fehler ausgelöst wird.

Einstellungen und Rückgabewerte

Legt einen Wert vom Datentyp Long fest oder gibt diesen Wert zurück. Dieser Wert zeigt in Sekunden an, wie lange auf das Öffnen der Verbindung gewartet wird. Der Standardwert ist 15.

Hinweise

Verwenden Sie die ConnectionTimeout-Eigenschaft in einem Connection-Objekt, falls durch den Netzwerkverkehr oder die starke Serverbeanspruchung verursachte Verzögerungen den Abbruch des Verbindungsaufbaus erforderlich machen. Falls das in der ConnectionTimeout-Eigenschaftseinstellung definierte Zeitintervall vor dem Öffnen der Verbindung abläuft, tritt ein Fehler auf und ADO bricht den Versuch ab. Wenn Sie die Eigenschaft auf Null (0) festlegen, wartet ADO solange, bis die Verbindung geöffnet ist. Vergewissern Sie sich, dass der Provider, für den Sie Code schreiben, die ConnectionTimeout-Funktionalität unterstützt.

Die ConnectionTimeout-Eigenschaft bietet Schreib-/Lesezugriff, wenn die Verbindung geschlossen ist. Sie ist schreibgeschützt, wenn die Verbindung geöffnet ist.


Count-Eigenschaft (ADO)

Count-Eigenschaft

Gibt die Anzahl der Objekte in einer Auflistung an.

Rückgabewert

Gibt einen Wert vom Datentyp Long zurück.

Hinweise

Verwenden Sie die Count-Eigenschaft, um zu bestimmen, wie viele Objekte in einer gegebenen Auflistung vorhanden sind.

Da das Aufzählen der Elemente in einer Auflistung mit Null (0) beginnt, sollten Sie stets Schleifen programmieren, die mit dem 'nullten' Element beginnen und mit dem Wert der Count-Eigenschaft minus 1 enden. Wenn beim Verwenden von Microsoft Visual Basic ohne Prüfen der Count-Eigenschaft ein Schleifendurchlauf durch die Elemente einer Auflistung durchgeführt werden soll, verwenden Sie den For Each...Next-Befehl.

Ist die Count-Eigenschaft Null, enthält die Auflistung keine Objekte.


CursorLocation-Eigenschaft (ADO)

CursorLocation-Eigenschaft

Gibt den Standort der Cursorfunktion an.

Einstellungen und Rückgabewerte

Legt einen Wert vom Datentyp Long fest, der auf einen der CursorLocationEnum-Werte gesetzt werden kann, oder gibt einen solchen zurück.

Hinweise

Durch diese Eigenschaft können Sie zwischen verschiedenen Cursorbibliotheken wählen, auf die der Provider zugreifen kann. Normalerweise haben Sie die Wahl zwischen der Verwendung einer clientbasierten Cursorbibliothek und einer auf dem Server gespeicherten Bibliothek.

Diese Eigenschaftseinstellung beeinflusst eingerichtete Verbindungen erst, nachdem die Eigenschaft festgelegt wurde. Das Ändern der CursorLocation-Eigenschaft hat keine Auswirkungen auf bestehende Verbindungen.

Cursor, die von der Execute-Methode zurückgegeben werden, übernehmen diese Einstellung. Recordset–Objekte übernehmen diese Einstellung automatisch aus den zugeordneten Verbindungen.

In einem Connection-Objekt oder einem geschlossenen Recordset-Objekt bietet die Eigenschaft Schreib-/Lesezugriff, während sie in einem geöffneten Recordset-Objekt schreibgeschützt ist.

Verwenden von Remote Data Service In einem clientbasierten Recordset- oder Connection-Objekt kann die CursorLocation-Eigenschaft nur auf adUseClient gesetzt werden.


CursorType-Eigenschaft (ADO)

CursorType-Eigenschaft

Gibt den Typ des in einem Recordset-Objekt verwendeten Cursors an.

Einstellungen und Rückgabewerte

Legt einen CursorTypeEnum-Wert fest oder gibt einen solchen zurück. Der Standardwert ist adOpenForwardOnly.

Hinweise

Verwenden Sie die CursorType-Eigenschaft, um den Cursortyp festzulegen, der beim Öffnen des Recordset-Objekts verwendet werden soll.

Die Einstellung adUseStatic wird nur dann unterstützt, wenn die CursorLocation-Eigenschaft auf adUseClient gesetzt ist. Wird ein nicht unterstützter Wert festgelegt, tritt kein Fehler auf. Stattdessen wird die nächste unterstützte CursorType-Eigenschaft verwendet.

Falls ein Provider den gewünschten Cursortyp nicht unterstützt, gibt er möglicherweise einen anderen Cursortyp zurück. Die CursorType-Eigenschaft wird auf den aktuell verwendeten Cursortyp gesetzt, wenn das Recordset-Objekt geöffnet ist. Verwenden Sie die Supports-Methode, um eine bestimmte Funktionalität des zurückgegebenen Cursors zu überprüfen. Nach dem Schließen des Recordset-Objekts wird die CursorType-Eigenschaft wieder auf die ursprüngliche Einstellung zurückgesetzt.

In der folgenden Tabelle ist die für die einzelnen Cursortypen erforderliche Funktionalität des Providers aufgeführt (gekennzeichnet durch die Konstanten der Supports-Methode).

Für ein Recordset-Objekt mit diesem CursorType | Muss die Supports-Methode den Wert "True" für alle folgenden Konstanten zurückgeben
adOpenForwardOnly | Keine
adOpenKeyset | adBookmark, adHoldRecords, adMovePrevious, adResync
adOpenDynamic | adMovePrevious
adOpenStatic | adBookmark, adHoldRecords, adMovePrevious, adResync

Anmerkung Obwohl Supports(adUpdateBatch) für dynamische und Vorwärts-Cursor den Wert True besitzen kann, sollten Sie für Stapelaktualisierungen entweder nur einen Cursor vom Typ 'Schlüsselgruppe' oder nur einen statischen Cursor verwenden. Setzen Sie die LockType-Eigenschaft auf adLockBatchOptimistic und die CursorLocation-Eigenschaft auf adUseClient, um den für Stapelaktualisierungen benötigten Cursordienst für OLE DB zu aktivieren.

Die CursorType-Eigenschaft bietet Schreib-/Lesezugriff, wenn das Recordset-Objekt geschlossen ist. Andernfalls ist die Eigenschaft schreibgeschützt.

Verwenden von Remote Data Service In einem clientbasierten Recordset-Objekt kann die CursorType-Eigenschaft nur auf adOpenStatic gesetzt werden.


DataMember-Eigenschaft (ADO)

DataMember-Eigenschaft

Gibt den Namen des Datenelements an, das von dem Objekt abgerufen werden soll, auf das die DataSource-Eigenschaft verweist.

Einstellungen und Rückgabewerte

Legt einen Wert vom Datentyp String fest oder gibt einen solchen zurück. Die Groß-/Kleinschreibung wird bei diesem Namen nicht berücksichtigt.

Hinweise

Diese Eigenschaft wird verwendet, um datengebundene Steuerelemente mit der Datenumgebung zu erstellen. Die Datenumgebung verwaltet Datenauflistungen (Datenquellen), die benannte Objekte (Datenelemente) enthalten, welche als Recordset-Objekt dargestellt werden.

Die Eigenschaften DataMember und DataSource müssen zusammen verwendet werden.

Die DataMember-Eigenschaft bestimmt, welches von der DataSource-Eigenschaft angegebene Objekt als Recordset-Objekt dargestellt wird. Das Recordset-Objekt muss geschlossen sein, wenn diese Eigenschaft festgelegt wird. Ein Fehler wird ausgelöst, wenn die DataMember-Eigenschaft nicht vor der DataSource-Eigenschaft festgelegt oder wenn der DataMember-Name durch das in der DataSource-Eigenschaft angegebene Objekt nicht erkannt wird.

Verwendung

Dim rs as New ADODB.Recordset
rs.DataMember = "Command"     ' Name des Rowsets für die Bindung
Set rs.DataSource = myDE      ' Name des Objekts, das ein IRowset enthält


DataSource-Eigenschaft (ADO)

DataSource-Eigenschaft

Gibt ein Objekt an, das Daten enthält, die als Recordset-Objekt dargestellt werden sollen.

Hinweise

Diese Eigenschaft wird verwendet, um datengebundene Steuerelemente mit der Datenumgebung zu erstellen. Die Datenumgebung verwaltet Datenauflistungen (Datenquellen), die benannte Objekte (Datenelemente) enthalten, welche als Recordset-Objekt dargestellt werden.

Die Eigenschaften DataMember und DataSource müssen zusammen verwendet werden.

Das Objekt, auf das verwiesen wird, muss die IDataSource-Schnittstelle implementieren und eine IRowset-Schnittstelle enthalten.

Verwendung

Dim rs as New ADODB.Recordset
rs.DataMember = "Command"     ' Name des Rowsets für die Bindung
Set rs.DataSource = myDE      ' Name des Objekts, das ein IRowset enthält


DefaultDatabase-Eigenschaft (ADO)

DefaultDatabase-Eigenschaft

Gibt die Standarddatenbank für ein Connection-Objekt an.

Einstellungen und Rückgabewerte

Legt einen Wert vom Datentyp String fest oder gibt einen solchen Wert zurück. Dieser Wert repräsentiert den Namen einer durch den Provider zur Verfügung gestellten Datenbank.

Hinweise

Verwenden Sie die DefaultDatabase-Eigenschaft, um den Namen der Standarddatenbank für ein bestimmtes Connection-Objekt festzulegen oder zu ermitteln.

Wenn eine Standarddatenbank vorhanden ist, verwenden SQL-Zeichenfolgen eventuell eine nicht geeignete Syntax, um auf Objekte in dieser Datenbank zuzugreifen. Um auf Objekte in einer anderen als der durch die DefaultDatabase-Eigenschaft festgelegten Datenbank zuzugreifen, müssen Sie die Objektnamen mit dem gewünschten Datenbanknamen versehen. Nach Herstellung der Verbindung schreibt der Provider die Information über die Standarddatenbank in die DefaultDatabase-Eigenschaft. Einige Provider lassen nur eine Datenbank pro Verbindung zu. In solchen Fällen kann die DefaultDatabase-Eigenschaft nicht geändert werden.

Möglicherweise unterstützen einige Datenquellen und Provider dieses Feature nicht. In diesen Fällen wird ein Fehler oder eine leere Zeichenfolge zurückgegeben.

Verwenden von Remote Data Service Diese Eigenschaft steht in einem clientbasierten Connection-Objekt nicht zur Verfügung.


DefinedSize-Eigenschaft (ADO)

DefinedSize-Eigenschaft

Gibt den Umfang der in einem Field-Objekt speicherbaren Daten an.

Rückgabewert

Gibt einen Wert vom Datentyp Long zurück, der die definierte Größe eines Feldes als Anzahl von Bytes darstellt.

Hinweise

Verwenden Sie die DefinedSize-Eigenschaft, um die Datenkapazität eines Field-Objekts zu bestimmen.

Die Eigenschaften DefinedSize und ActualSize unterscheiden sich. Angenommen, ein Field-Objekt mit einem deklarierten Typ von adVarChar und einem DefinedSize-Eigenschaftswert von 50 enthält ein einzelnes Zeichen. Der Wert, den die ActualSize-Eigenschaft des Feldes zurückgibt, ist gerade die Länge des einzelnen Zeichens in Bytes.


Description-Eigenschaft (ADO)

Description-Eigenschaft

Beschreibt ein Error-Objekt.

Rückgabewert

Gibt einen String–Wert zurück, der eine Beschreibung des Fehlers enthält.

Hinweise

Verwenden Sie die Description-Eigenschaft, um eine kurze Beschreibung des Fehlers zu erhalten. Zeigen Sie diese Eigenschaft an, um den Benutzer auf einen Fehler aufmerksam zu machen, den Sie nicht beheben können oder möchten. Die Zeichenfolge stammt entweder von ADO oder von einem Provider.

Provider sind für das Übergeben von spezifischem Fehlertext an ADO verantwortlich. ADO fügt der Errors-Auflistung für jeden erhaltenen Providerfehler oder jede erhaltene Warnung ein Error-Objekt hinzu. Verwenden Sie die Errors-Auflistung, um die durch den Provider übergebenen Fehlermeldungen zu protokollieren.


Direction-Eigenschaft (ADO)

Direction-Eigenschaft

Zeigt an, ob der Parameter einen Eingabeparameter, einen Ausgabeparameter oder beides darstellt bzw. ob es sich bei dem Parameter um den Rückgabewert einer gespeicherten Prozedur handelt.

Einstellungen und Rückgabewerte

Legt einen ParameterDirectionEnum-Wert fest oder gibt einen solchen zurück.

Hinweise

Verwenden Sie die Direction-Eigenschaft, um festzulegen, wie ein Parameter an eine Prozedur übergeben oder von einer Prozedur zurückgegeben wird. Die Direction-Eigenschaft bietet Schreib-/Lesezugriff. Durch diese Eigenschaft können Sie mit Providern arbeiten, die diese Informationen nicht liefern, oder Sie können diese Informationen festlegen, wenn ADO keinen zusätzlichen Aufruf des Providers zum Abrufen von Parameterinformationen durchführen soll.

Nicht alle Provider können die Richtung des Informationsflusses von Parametern in ihren gespeicherten Prozeduren bestimmen. In diesen Fällen müssen Sie die Direction-Eigenschaft vor dem Ausführen der Abfrage festlegen.


EditMode-Eigenschaft (ADO)

EditMode-Eigenschaft

Gibt den Bearbeitungsstatus des aktuellen Datensatzes an.

Rückgabewert

Gibt einen EditModeEnum-Wert zurück.

Hinweise

ADO verwaltet einen Bearbeitungspuffer, der dem aktuellen Datensatz zugeordnet ist. Diese Eigenschaft gibt an, ob Änderungen an diesem Puffer vorgenommen wurden oder ob ein neuer Datensatz erstellt wurde. Verwenden Sie die EditMode-Eigenschaft, um den Bearbeitungsstatus des aktuellen Datensatzes zu ermitteln. Sie können überprüfen, ob noch nicht gespeicherte Änderungen vorhanden sind, falls ein Bearbeitungsvorgang unterbrochen wurde, und bestimmen, ob Sie die Update- oder CancelUpdate-Methode verwenden müssen.

Eine ausführliche Beschreibung der EditMode-Eigenschaft unter Berücksichtigung der unterschiedlichen Bearbeitungsbedingungen finden Sie im Hilfethema für die AddNew-Methode.

Anmerkung EditMode kann nur bei definiertem aktuellen Datensatz einen gültigen Wert zurückgeben. Falls BOF oder EOF den Wert True haben oder der aktuelle Datensatz gelöscht worden ist, gibt EditMode einen Fehler zurück.


EOS-Eigenschaft (ADO)

EOS-Eigenschaft

Zeigt an, ob die aktuelle Position auf das Ende des Datenstroms weist.

Rückgabewerte

Gibt einen Wert vom Datentyp Boolean zurück, der anzeigt, ob die aktuelle Position auf das Ende des Datenstroms weist. EOS liefert True, falls sich keine Datenbytes mehr im Datenstrom befinden. Der Rückgabewert ist False, wenn hinter der aktuellen Position noch weitere Datenbytes verfügbar sind.

Um auf das Ende des Datenstroms zu positionieren, verwenden Sie die SetEOS-Methode. Zur Ermittlung der aktuellen Position dient die Position-Eigenschaft.


ExecuteOptions-Eigenschaft (RDS)

Gibt an, ob asynchrone Ausführung aktiviert ist.

Einstellungen und Rückgabewerte

Legt einen der folgenden Werte fest oder gibt einen der Werte zurück:

Konstante | Beschreibung
adcExecSync | Führt die nächste Aktualisierung des Recordset-Objekts synchron aus.
adcExecAsync | Standardeinstellung. Führt die nächste Aktualisierung des Recordset-Objekts asynchron aus.

Anmerkung Jede clientbasierte ausführbare Datei, in der diese Konstanten verwendet werden, muss Deklarationen für die Konstanten zur Verfügung stellen. Die gewünschten Konstantendeklarationen können aus der Datei Adcvbs.inc im Ordner C:\Programme\Gemeinsame Dateien\system\MSADC kopiert und an geeigneter Stelle wieder eingefügt werden.

Hinweise

Ist die ExecuteOptions-Eigenschaft auf adcExecAsync gesetzt, so wird der nächste Refresh-Aufruf im Recordset des RDS.DataControl-Objekts asynchron ausgeführt.

Wenn Sie Reset, Refresh, SubmitChanges, CancelUpdate oder Recordset aufrufen, während eine weitere asynchrone Operation ausgeführt wird, kann dadurch unter Umständen das Recordset des RDS.DataControl-Objekts geändert werden, was zu einem Fehler führt.

Sofern während der Ausführung einer asynchronen Operation ein Fehler auftritt, ändert sich der Wert der ReadyState-Eigenschaft des RDS.DataControl-Objekts von adcReadyStateLoaded in adcReadyStateComplete. Der Wert der Recordset-Eigenschaft bleibt Nothing.


FetchOptions-Eigenschaft (RDS)

Gibt den Typ des asynchronen Abrufs an.

Einstellungen und Rückgabewerte

Legt einen der folgenden Werte fest oder gibt einen der Werte zurück:

Konstante | Beschreibung
adcFetchUpFront | Alle Datensätze des Recordset-Objekts werden abgerufen, bevor die Anwendung die Kontrolle zurückerhält. Es wird also das vollständige Recordset-Objekt abgerufen, bevor die Anwendung eine Aktion mit dem Objekt durchführen kann.
adcFetchBackground | Die Kontrolle kann an die Anwendung zurückgegeben werden, sobald der erste Stapel von Datensätzen abgerufen wurde. Ein nachfolgender Lesevorgang des Recordset-Objekts, der versucht, auf einen Datensatz zuzugreifen, der im ersten Stapel nicht abgerufen wurde, wird solange aufgeschoben, bis der Abruf des betreffenden Datensatzes tatsächlich erfolgt ist. Zu diesem Zeitpunkt wird die Kontrolle an die Anwendung zurückgegeben.
adcFetchAsync | Standardeinstellung. Die Anwendung erhält unmittelbar die Kontrolle zurück, während der Abruf der Datensätze im Hintergrund durchgeführt wird. Wenn die Anwendung versucht, einen noch nicht abgerufenen Datensatz zu lesen, wird der Datensatz gelesen, der dem gesuchten Datensatz am nächsten ist. Die Kontrolle wird anschließend sofort zurückgegeben und der Anwendung angezeigt, dass das aktuelle Ende des Recordset-Objekts erreicht wurde. Beispielsweise wird durch den Aufruf der MoveLast-Methode die aktuelle Datensatzposition auf den letzten abgerufenen Datensatz verschoben, obwohl das Recordset-Objekt noch mit weiteren Datensätzen aufgefüllt wird.

Anmerkung Jede clientbasierte ausführbare Datei, in der diese Konstanten verwendet werden, muss Deklarationen für die Konstanten zur Verfügung stellen. Die gewünschten Konstantendeklarationen können aus der Datei Adcvbs.inc im Ordner C:\Programme\Gemeinsame Dateien\system\MSADC kopiert und an geeigneter Stelle wieder eingefügt werden.

Hinweise

In einer Webanwendung ist die Verwendung von adcFetchAsync (dem Standardwert) sinnvoll, da dies zu einer Leistungsverbesserung führt. Bei einer kompilierten Clientanwendung empfiehlt es sich in der Regel, adcFetchBackground zu verwenden.


Filter-Eigenschaft (ADO)

Filter-Eigenschaft

Gibt einen Filter für die Daten in einem Recordset-Objekt an.

Einstellungen und Rückgabewerte

Legt einen Wert vom Datentyp Variant fest oder gibt einen solchen Wert zurück. Dieser Wert kann eines der folgenden Elemente enthalten:

  • Kriterienzeichenfolge - eine Zeichenfolge, die aus einer oder mehreren einzelnen Klauseln besteht, die durch die Operatoren AND oder OR verkettet sind.

  • Array mit Lesezeichen - ein Array mit eindeutigen Lesezeichenwerten, die auf Datensätze im Recordset-Objekt verweisen.

  • Ein FilterGroupEnum-Wert.

Hinweise

Verwenden Sie die Filter-Eigenschaft, um ausgewählte Datensätze in einem Recordset-Objekt auszublenden. Das gefilterte Recordset-Objekt wird zum aktuellen Cursor. Dies wirkt sich auf andere Eigenschaften aus, die auf dem aktuellen Cursor basierende Werte zurückgeben, wie z. B. AbsolutePosition, AbsolutePage, RecordCount und PageCount. Denn durch das Festlegen der Filter-Eigenschaft auf einen bestimmten Wert wird der aktuelle Datensatz auf den ersten Datensatz positioniert, der dem neuen Wert entspricht.

Die Kriterienzeichenfolge besteht aus Klauseln in der Form Feldname-Operator-Wert (z. B. "LastName = 'Schmidt'"). Zusammengesetzte Klauseln können durch Verketten einzelner Klauseln mit AND (z. B., "LastName = 'Schmidt' AND FirstName = 'Jan'") oder OR (z. B., "LastName = 'Schmidt' OR LastName = 'Meier'") erstellt werden. Verwenden Sie die folgenden Richtlinien für Kriterienzeichenfolgen:

  • Feldname muss ein gültiger Feldname aus dem Recordset-Objekt sein. Falls der Feldname Leerstellen enthält, müssen Sie den Namen in eckige Klammern einschließen.

  • Operator muss einer der folgenden Operatoren sein: <, >, <=, >=, <>, = oder LIKE.

  • Wert ist der Wert, der mit den Feldwerten verglichen wird (z. B. 'Schmidt', #8/24/95#, 12,345 oder $50,00). Verwenden Sie einfache Anführungszeichen bei Zeichenfolgen und Nummernzeichen (#) bei Datumswerten. Für Zahlen können Sie Dezimalpunkte, Währungszeichen und Exponentialzahlnotation verwenden. Wenn Operator gleich LIKE ist, kann Wert Platzhalterzeichen enthalten. Nur die Platzhalterzeichen Sternchen (*) und Prozentzeichen (%) sind zulässig. Sie müssen das letzte Zeichen in der Zeichenfolge sein. Wert kann nicht Null sein.

    Anmerkung Einfache Anführungszeichen (') werden innerhalb des Filterwertes durch jeweils zwei aufeinander folgende einfache Anführungszeichen repräsentiert. Um beispielsweise nach der Zeichenfolge O'Malley zu filtern, muss die entsprechende Kriterienzeichenfolge "col1 = 'O''Malley'" lauten. Sollen einfache Anführungszeichen am Anfang und am Ende des Filterwertes stehen, muss die Zeichenfolge in Nummernzeichen (#) eingeschlossen werden. Um beispielsweise nach '1' zu filtern, muss die Kriterienzeichenfolge "col1 = #'1'#" lauten.

  • AND hat keinen Vorrang vor OR und umgekehrt. Klauseln können innerhalb von Klammern zusammengefasst werden. Sie können durch OR verbundene Klauseln jedoch nicht zunächst in einer Gruppe zusammenfassen und diese Gruppe dann mit einer anderen Klausel verbinden, die ein AND enthält (wie im folgenden Beispiel dargestellt).
    (LastName = 'Schmidt' OR LastName = 'Meier') AND FirstName = 'Jan'

  •
Dieser Filter wird stattdessen in der folgenden Form erstellt:
    (LastName = 'Schmidt' AND FirstName = 'Jan') OR (LastName = 'Meier' AND FirstName = 'Jan')

    •

  •
In einer LIKE-Klausel kann ein Platzhalter am Anfang und Ende des Musters (z. B; LastName Like '*mit*') oder nur am Ende des Musters (z. B. LastName Like 'Schm*') verwendet werden.
    •

Die Filterkonstanten vereinfachen das Auflösen einzelner Datensatzkonflikte während des Stapelaktualisierungsmodus, indem z. B. nur solche Datensätze angezeigt werden, die während des letzten Aufrufs der UpdateBatch-Methode betroffen waren.

Das Festlegen der Filter-Eigenschaft selbst könnte aufgrund eines Konflikts mit den zugrunde liegenden Daten fehlschlagen (wenn z. B. ein Datensatz bereits von einem anderen Benutzer gelöscht wurde). In diesem Fall gibt der Provider Warnmeldungen an die Errors-Auflistung zurück, ohne die Programmausführung jedoch anzuhalten. Ein Laufzeitfehler tritt nur auf, wenn es Konflikte mit allen angeforderten Datensätzen gibt. Verwenden Sie die Status-Eigenschaft, um festzustellen, wo sich Datensätze mit Konflikten befinden.

Das Festlegen der Filter-Eigenschaft auf eine Zeichenfolge mit Nulllänge ("") hat denselben Effekt wie das Verwenden der adFilterNone-Konstante.

Sobald die Filter-Eigenschaft festgelegt ist, wird die aktuelle Datensatzposition auf den ersten Datensatz in der gefilterten Untermenge der Datensätze im Recordset-Objekt verschoben. In ähnlicher Weise wird nach dem Löschen der Filter-Eigenschaft die aktuelle Datensatzposition auf den ersten Datensatz im Recordset-Objekt verschoben.

Eine Erklärung der Lesezeichenwerte, aus denen Sie ein Array zur Verwendung mit der Filter-Eigenschaft aufbauen können, finden Sie im Hilfethema für die Bookmark-Eigenschaft.


FilterColumn-Eigenschaft (RDS)

Gibt die Spalte an, auf die die Filterkriterien angewendet werden sollen.

Syntax

DataControl.FilterColumn = String

Parameter

DataControl Eine Objektvariable, die ein RDS.DataControl-Objekt darstellt.

String Ein Wert vom Datentyp String, der die Spalte angibt, auf die die Filterkriterien angewendet werden sollen. Die Filterkriterien werden mit der FilterCriterion-Eigenschaft festgelegt.

Hinweise

Die Eigenschaften SortColumn, SortDirection, FilterValue, FilterCriterion und FilterColumn stellen Sortier- und Filterfunktionen für den clientbasierten Zwischenspeicher zur Verfügung. Die Sortierfunktion sortiert Datensätze nach Werten aus einer Spalte. Die Filterfunktion zeigt eine Untermenge der Datensätze auf der Grundlage von Suchkriterien an, während das vollständige Recordset-Objekt im Zwischenspeicher verbleibt. Die Reset-Methode führt die Kriterien aus und ersetzt das aktuelle Recordset-Objekt durch ein aktualisierbares Recordset-Objekt.


FilterCriterion-Eigenschaft (RDS)

Gibt den im Filterwert zu verwendenden Auswertungsoperator an.

Syntax

DataControl.FilterCriterion = String

Parameter

DataControl Eine Objektvariable, die ein RDS.DataControl-Objekt darstellt.

String Ein Wert vom Datentyp String, der den Auswertungsoperator der FilterValue-Eigenschaft für die Datensätze festlegt. Es kann sich hierbei um einen der folgenden Operatoren handeln: <, <=, >, >=, = oder <>.

Hinweise

Die Eigenschaften SortColumn, SortDirection, FilterValue, FilterCriterion und FilterColumn FilterColumn stellen Sortier- und Filterfunktionen für den clientbasierten Zwischenspeicher zur Verfügung. Die Sortierfunktion sortiert Datensätze nach Werten aus einer Spalte. Die Filterfunktion zeigt eine Untermenge der Datensätze auf der Grundlage von Suchkriterien an, während das vollständige Recordset-Objekt im Zwischenspeicher verbleibt. Die Reset-Methode führt die Kriterien aus und ersetzt das aktuelle Recordset-Objekt durch ein aktualisierbares Recordset-Objekt.

Der Operator "!=" ist für FilterCriterion nicht gültig. Verwenden Sie stattdessen "<>".

Wenn sowohl die Filter- als auch die Sortiereigenschaften festgelegt sind und die Reset-Methode aufgerufen wird, wird das Rowset zunächst gefiltert und anschließend sortiert. Bei aufsteigenden Sortiervorgängen befinden sich die Nullwerte an der Spitze, bei absteigenden Sortiervorgängen befinden sie sich am Ende (aufsteigendes Sortieren ist das Standardverhalten).


FilterValue-Eigenschaft (RDS)

Gibt den Wert an, nach dessen Maßgabe die Datensätze gefiltert werden sollen.

Syntax

DataControl.FilterValue = String

Parameter

DataControl Eine Objektvariable, die ein RDS.DataControl-Objekt darstellt.

String Ein Wert vom Datentyp String, der einen Datenwert angibt, mit dem die Datensätze gefiltert werden (z. B. 'Programmierer' oder 125).

Hinweise

Die Eigenschaften SortColumn, SortDirection, FilterValue, FilterCriterion und FilterColumn stellen Sortier- und Filterfunktionen für den clientbasierten Zwischenspeicher zur Verfügung. Die Sortierfunktion sortiert Datensätze nach Werten aus einer Spalte. Die Filterfunktion zeigt eine Untermenge der Datensätze auf der Grundlage von Suchkriterien an, während das vollständige Recordset-Objekt im Zwischenspeicher verbleibt. Die Reset-Methode führt die Kriterien aus und ersetzt das aktuelle Recordset-Objekt durch ein aktualisierbares Recordset-Objekt.

Null-Werte führen zu dem Fehler "Typen unverträglich".


Handler-Eigenschaft (RDS)

Gibt den Namen eines serverbasierten Anpassungsprogramms (Handler) an, mit dem die Funktionalität von RDSServer.DataFactory erweitert wird, sowie alle vom Handler verwendeten Parameter.

Syntax

DataControl.Handler = String

Parameter

DataControl Eine Objektvariable, die ein RDS.DataControl-Objekt darstellt.

String Ein Wert vom Datentyp String, der den Namen des Handlers sowie sämtliche Parameter enthält, wobei die einzelnen Elemente durch Kommas voneinander getrennt werden (z. B., "handlerName,parm1,parm2,...,parm N").

Hinweise

Diese Eigenschaft unterstützt Anpassungen. Dazu muss die CursorLocation–Eigenschaft auf adUseClient gesetzt sein.

Der Name des Handlers und die zugehörigen Parameter (sofern vorhanden) werden durch Kommas (",") voneinander getrennt. Ein nicht vorhersehbares Verhalten resultiert, wenn an einer beliebigen Stelle innerhalb des String-Wertes ein Semikolon (";") enthalten ist. Sie können einen eigenen Handler schreiben und verwenden, sofern diese die IDataFactoryHandler-Schnittstelle unterstützt.

Der Name des standardmäßigen Handlers ist MSDFMAP.Handler. Der Standardparameter ist eine Anpassungsdatei mit der Bezeichnung MSDFMAP.INI. Verwenden Sie diese Eigenschaft, um vom Serveradministrator erstellte alternative Anpassungsdateien aufzurufen.

Alternativ zum Setzen der Handler-Eigenschaft kann ein Handler mitsamt der zugehörigen Parameter auch über die ConnectionString-Eigenschaft festgelegt werden und zwar mit einer Zuweisung der Form "Handler=handlerName,parm1,parm2,...;".


HelpContext-, HelpFile-Eigenschaften (ADO)

HelpContext-, HelpFile-Eigenschaften

Geben die Hilfedatei und das Hilfethema zu einem bestimmten Error-Objekt an.

Rückgabewerte

  • HelpContextID - Gibt eine Kontext-ID als Wert vom Datentyp Long für ein Thema in einer Hilfedatei zurück.

  • HelpFile - Gibt einen Wert vom Datentyp String zurück, der einen vollständigen Pfad zu einer Hilfedatei repräsentiert.

Hinweise

Wenn in der HelpFile-Eigenschaft eine Hilfedatei angegeben ist, wird das in HelpContext angegebene Hilfethema mithilfe der HelpContext-Eigenschaft automatisch angezeigt. Ist kein passendes Hilfethema verfügbar, dann wird von der HelpContext-Eigenschaft Null (0) und von der HelpFile-Eigenschaft eine Zeichenfolge mit Nulllänge ("") zurückgegeben.


Index-Eigenschaft (ADO)

Index-Eigenschaft

Gibt den Namen des für ein Recordset-Objekt derzeit gültigen Indexes an.

Einstellungen und Rückgabewerte

Legt einen Wert vom Datentyp String fest oder gibt einen solchen Wert zurück. Dieser Wert repräsentiert den Indexnamen.

Hinweise

Der von der Index-Eigenschaft genannte Index muss zuvor in der Basistabelle, die dem Recordset-Objekt zugrunde liegt, angegeben worden sein. Der Index muss also per Programm als ein ADOX Index-Objekt oder bei Erstellung der Basistabelle deklariert worden sein.

Ein Laufzeitfehler tritt auf, wenn der Index nicht festgelegt werden kann. Die Index–Eigenschaft kann nicht gesetzt werden

  • innerhalb eines WillChangeRecordset- oder eines RecordsetChangeComplete-Ereignis-Handlers

  • falls das Recordset–Objekt gerade eine Operation ausführt (was sich der Einstellung der State-Eigenschaft entnehmen lässt).

  • wenn für das Recordset–Objekt ein Filter unter Verwendung der Filter–Eigenschaft definiert worden ist.

Ein Setzen der Index-Eigenschaft ist bei geschlossenem Recordset immer möglich. Allerdings kann dieses nicht geöffnet werden, oder der Index wird nicht benutzbar sein, wenn der zugrunde liegende Provider keine Indizes unterstützt.

Nach erfolgreicher Indexzuordnung ändert sich möglicherweise die aktuelle Zeilenposition. Dies löst eine Aktualisierung der AbsolutePosition–Eigenschaft aus, und es werden die Ereignisse WillChangeRecordset, RecordsetChangeComplete, WillMove und MoveComplete generiert.

Wenn eine Indexzuordnung möglich ist und die LockType-Eigenschaft einen der Werte adLockPessimistic oder adLockOptimistic besitzt, wird automatisch eine UpdateBatch-Operation ausgeführt. Auf diese Weise werden die aktuellen und betroffenen Gruppen freigegeben. Ein eventuell vorhandener Filter wird ebenfalls freigegeben und die aktuelle Zeilenposition geändert und auf die erste Zeile des neu geordneten Recordset-Objekts gesetzt.

Die Index-Eigenschaft wird zusammen mit der Seek-Methode verwendet. Unterstützt der zugrunde liegende Provider die Index–Eigenschaft und daher auch die Seek-Methode nicht, sollten Sie erwägen, stattdessen die Find-Methode zu verwenden. Stellen Sie fest, ob der zugrunde liegende Provider Indizes mit der Supports (adIndex)-Methode unterstützt.

Die integrierte Index-Eigenschaft hat nichts mit der dynamischen Optimize-Eigenschaft zu tun, obwohl beide Indizes betreffen.


InternetTimeout-Eigenschaft (RDS)

Zeigt die Anzahl an Millisekunden an, die bis zum Ablaufen des Zeitlimits einer Anforderung vergehen.

Einstellungen und Rückgabewerte

Legt einen Wert vom Datentyp Long fest oder gibt einen solchen Wert zurück. Dieser Wert repräsentiert das Zeitlimit für die Durchführung einer Anforderung in Millisekunden.

Hinweise

Diese Eigenschaft betrifft nur Anforderungen, die mit dem HTTP- oder dem HTTPS-Protokoll gesendet wurden.

Die Ausführung von Anforderungen in einer Umgebung mit drei Ebenen benötigt unter Umständen mehrere Minuten. Verwenden Sie diese Eigenschaft, um zusätzliche Zeit für Anforderungen festzulegen, deren Ausführung einen längeren Zeitraum benötigt.


IsolationLevel-Eigenschaft (ADO)

IsolationLevel-Eigenschaft

Zeigt die Isolationsebene für ein Connection-Objekt an.

Einstellungen und Rückgabewerte

Legt einen IsolationLevelEnum-Wert fest oder gibt einen solchen zurück. Der Standardwert ist adXactChaos.

Hinweise

Verwenden Sie die IsolationLevel-Eigenschaft, um die Isolationsebene eines Connection-Objekts festzulegen. Die neue Einstellung wirkt sich erst beim nächsten Aufruf der BeginTrans-Methode aus. Falls die von Ihnen angeforderte Isolationsebene nicht zur Verfügung steht, gibt der Provider gegebenenfalls die nächsthöhere Isolationsebene zurück.

Die IsolationLevel-Eigenschaft bietet Schreib-/Lesezugriff.

Verwenden von Remote Data Service In einem clientbasierten Connection-Objekt kann die IsolationLevel-Eigenschaft nur auf adXactUnspecified gesetzt werden.

Da Benutzer nicht verbundene Recordset-Objekte in einem clientbasierten Zwischenspeicher bearbeiten, können aufgrund gleichzeitiger Zugriffe Probleme auftreten. Wenn beispielsweise zwei verschiedene Personen versuchen, denselben Datensatz zu aktualisieren, ermöglicht Remote Data Service dies nur dem Benutzer, der als Erster auf den Datensatz zugegriffen hat. Die Aktualisierungsanforderung der zweiten Person schlägt fehl, und ein Fehler tritt auf.


Item-Eigenschaft (ADO)

Item-Eigenschaft

Verweist (über Namen oder Ordinalzahl) auf ein bestimmtes Element einer Auflistung.

Syntax

Set object = collection.Item ( Index )

Rückgabewert

Gibt einen Objektverweis zurück.

Parameter

Index Ein Ausdruck vom Datentyp Variant, dessen Auswertung entweder den Namen oder die Ordinalzahl eines Objekts in einer Auflistung ergibt.

Hinweise

Verwenden Sie die Item-Eigenschaft, um ein bestimmtes Objekt in einer Auflistung zurückzugeben. Wenn Item kein Objekt in der Auflistung finden kann, das dem Argument Index entspricht, tritt ein Fehler auf. Einige Auflistungen unterstützen benannte Objekte nicht. Für diese Auflistungen müssen Sie Ordinalzahlverweise verwenden.

Die Item-Eigenschaft ist die Standardeigenschaft für alle Auflistungen. Daher sind die folgenden Syntaxformen austauschbar:

collection.Item (Index)

collection (Index)


LineSeparator-Eigenschaft (ADO)

LineSeparator-Eigenschaft

Gibt das Binärzeichen an, das als Zeilentrennzeichen in Stream-Objekten für Textdatenströme verwendet werden soll.

Einstellungen und Rückgabewerte

Legt einen LineSeparatorsEnum–Wert fest oder gibt einen solchen Wert zurück. Dieser Wert repräsentiert das im Stream-Objekt verwendete Zeilentrennzeichen. Der Standardwert ist adCRLF.

Hinweise

Die LineSeparator-Eigenschaft dient der Erkennung von Zeilen beim Lesen des Inhalts eines textuellen Stream-Objekts. Zeilen können mithilfe der SkipLine-Methode übersprungen werden.

Die LineSeparator–Eigenschaft wird nur in Verbindung mit Text-Stream-Objekten verwendet (Type hat in diesem Fall den Wert adTypeText). Die Eigenschaft wird ignoriert, falls Type die Einstellung adTypeBinary besitzt.


LockType-Eigenschaft (ADO)

LockType-Eigenschaft

Zeigt die Art der Sperrung an, die während des Bearbeitens auf Datensätze gelegt wird.

Einstellungen und Rückgabewerte

Legt einen LockTypeEnum-Wert fest oder gibt einen solchen zurück. Der Standardwert ist adLockReadOnly.

Hinweise

Legen Sie vor dem Öffnen eines Recordset-Objekts die LockType-Eigenschaft fest, um anzugeben, welchen Sperrtyp der Provider beim Öffnen des Objekts verwenden sollte. Lesen Sie die verwendete Eigenschaft aus, um den Sperrtyp zurückzugeben, der in einem geöffneten Recordset-Objekt verwendet wird.

Unter Umständen unterstützt ein Provider nicht alle Sperrtypen. Wenn ein Provider die gewünschte LockType-Einstellung nicht unterstützt, wird sie durch einen anderen Sperrtyp ersetzt. Verwenden Sie zum Bestimmen der aktuell in einem Recordset-Objekt verfügbaren Sperrfunktionen die Supports-Methode mit adUpdate und adUpdateBatch.

Die adLockPessimistic-Einstellung wird nicht unterstützt, wenn die CursorLocation-Eigenschaft auf adUseClient gesetzt ist. Wird versucht, einen nicht unterstützten Wert festzulegen, führt dies zu keinem Fehler. Stattdessen wird die nächste unterstützte LockType-Eigenschaft verwendet.

Die LockType-Eigenschaft bietet Schreib-/Lesezugriff, wenn das Recordset-Objekt geschlossen ist. Sie ist schreibgeschützt, wenn es geöffnet ist.

Verwenden von Remote Data Service In einem clientbasierten Recordset-Objekt kann die LockType-Eigenschaft nur auf adLockOptimisticBatch festgelegt werden.


MarshalOptions-Eigenschaft (ADO)

MarshalOptions-Eigenschaft

Gibt an, welche Datensätze durch Marshalling an den Server zurückgegeben werden.

Einstellungen und Rückgabewerte

Legt einen MarshalOptionsEnum-Wert fest oder gibt einen solchen zurück. Der Standardwert ist adMarshalAll.

Hinweise

In einem clientbasierten Recordset-Objekt werden die auf dem Client geänderten Datensätze durch ein als Marshalling bezeichnetes Verfahren zurück auf den Server der mittleren Ebene oder den Webserver geschrieben. Bei diesem Verfahren werden Parameter für Schnittstellenmethoden gepackt und über Thread- oder Prozessgrenzen hinweg gesendet. Das Festlegen der MarshalOptions-Eigenschaft kann die Leistung verbessern, wenn geänderte Remotedaten durch Marshalling zu Aktualisierungszwecken zurück an den Server der mittleren Ebene oder den Webserver gesendet werden.

Verwenden von Remote Data Service Diese Eigenschaft wird nur in einem clientbasierten Recordset-Objekt verwendet.


MaxRecords-Eigenschaft (ADO)

MaxRecords-Eigenschaft

Gibt die maximale Anzahl der Datensätze an, die aus einer Abfrage an ein Recordset-Objekt zurückgegeben werden.

Einstellungen und Rückgabewerte

Legt einen Wert vom Datentyp Long fest oder gibt einen solchen Wert zurück. Dieser Wert stellt die Obergrenze für die Zahl der zurückgegebenen Datensätze dar. Der Standardwert ist Null (keine Begrenzung).

Hinweise

Verwenden Sie die MaxRecords-Eigenschaft, um die Anzahl der Datensätze einzuschränken, die der Provider von der Datenquelle zurückgibt. Die Voreinstellung für die Eigenschaft ist Null (0), der Provider gibt also alle gewünschten Datensätze zurück.

Die MaxRecords-Eigenschaft bietet Schreib-/Lesezugriff, wenn das Recordset-Objekt geschlossen ist. Sie ist schreibgeschützt, wenn es geöffnet ist.


Mode-Eigenschaft (ADO)

Mode-Eigenschaft

Gibt die verfügbaren Berechtigungen für das Ändern von Daten in einem Connection-, Record- oder Stream-Objekt an.

Einstellungen und Rückgabewerte

Legt einen ConnectModeEnum-Wert fest oder gibt einen solchen zurück. Der Standardwert für ein Connection–Objekt ist adModeUnknown. Für ein Record–Objekt ist adModeRead der Standardwert. Der Standardwert für ein Stream-Objekt, das einer zugrunde liegenden Datenquelle zugeordnet ist (und mit einem URL als Quelle oder als Standard-Stream eines Record-Objekts geöffnet wurde) ist adReadOnly. Für ein Stream–Objekt, das nicht mit einer zugrunde liegenden Datenquelle (im Speicher instanziiert) verknüpft ist, lautet der Standardwert adModeUnknown.

Hinweise

Verwenden Sie die Mode-Eigenschaft, um die vom Provider momentan verwendeten Zugriffsberechtigungen für die aktuelle Verbindung festzulegen oder zurückzugeben. Sie können die Mode-Eigenschaft nur festlegen, wenn das Connection-Objekt geschlossen ist.

Falls bei einem Stream–Objekt der Zugriffsmodus nicht definiert ist, wird er von der Quelle übernommen, die zum Öffnen des Stream–Objekts verwendet wurde. Wird ein Stream–Objekt beispielsweise von einem Record–Objekt geöffnet, arbeitet es standardmäßig in demselben Modus wie das Record-Objekt.

Die Eigenschaft bietet Schreib-/Lesezugriff, wenn das Objekt geschlossen ist. Sie ist schreibgeschützt, wenn das Objekt geöffnet ist.

Verwenden von Remote Data Service In einem clientbasierten Recordset-Objekt kann die Mode-Eigenschaft nur auf adModeUnknown festgelegt werden.


Name-Eigenschaft (ADO)

Name-Eigenschaft

Gibt den Namen eines Objekts an.

Einstellungen und Rückgabewerte

Legt einen Wert vom Datentyp String fest oder gibt einen solchen Wert zurück. Der Wert repräsentiert den Namen eines Objekts.

Hinweise

Verwenden Sie die Name-Eigenschaft, um einem Command-, Property-, Field- oder Parameter-Objekt einen Namen zuzuweisen oder den Namen eines dieser Objekte abzurufen.

Der Wert bietet in einem Command-Objekt Schreib-/Lesezugriff, ist in einem Property-Objekt jedoch schreibgeschützt.

Bei einem Field-Objekt ist die Name–Eigenschaft in der Regel schreibgeschützt. Aber bei neuen Field–Objekten, die zur Fields–Auflistung eines Record–Objekts hinzugefügt wurden, bietet die Name–Eigenschaft erst dann Lese/Schreibzugriff, wenn die Value–Eigenschaft des Field–Objekts bereits mit einem Wert belegt und das neue Field-Objekt erfolgreich vom Datenprovider durch einen Aufruf der Update-Methode der Fields-Auflistung hinzugefügt worden ist.

Bei Parameter-Objekten, die zur Parameters-Auflistung noch nicht hinzugefügt wurden, bietet die Name-Eigenschaft Schreib-/Lesezugriff. Bei hinzugefügten Parameter-Objekten und allen anderen Objekten ist die Name-Eigenschaft schreibgeschützt. Namen können innerhalb einer Auflistung mehrmals verwendet werden.

Sie können die Name-Eigenschaft eines Objekts durch einen Ordinalverweis abrufen. Danach können Sie anhand des Namens direkt auf das Objekt verweisen. Wenn rstMain.Properties(20).Name z. B. Updatability enthält, können Sie sich nachfolgend auf diese Eigenschaft als rstMain.Properties("Updatability") beziehen.


NativeError-Eigenschaft (ADO)

NativeError-Eigenschaft

Gibt den providerspezifischen Fehlercode für ein gegebenes Error-Objekt an.

Rückgabewert

Gibt einen Wert vom Datentyp Long zurück, der den Fehlercode anzeigt.

Hinweise

Verwenden Sie die NativeError-Eigenschaft, um die datenbankspezifischen Fehlerinformationen für ein bestimmtes Error-Objekt abzurufen. Wenn Sie z. B. den Microsoft ODBC-Provider für OLE DB mit einer Microsoft SQL Server-Datenbank verwenden, werden systemeigene Fehlercodes, die ihren Ursprung im SQL-Server haben, über ODBC und den ODBC-Provider an die NativeError-Eigenschaft von ADO übergeben.


Number-Eigenschaft (ADO)

Number-Eigenschaft

Gibt die Nummer an, durch die ein Error-Objekt eindeutig gekennzeichnet wird.

Rückgabewert

Gibt einen Wert vom Datentyp Long zurück, bei dem es sich um eine der ErrorValueEnum-Konstanten handeln kann.

Hinweise

Verwenden Sie die Number-Eigenschaft, um den aufgetretenen Fehler zu bestimmen. Der Wert der Eigenschaft ist eine eindeutige Zahl, die der Fehlerbedingung entspricht.

Die Errors-Auflistung gibt einen HRESULT-Wert in hexadezimalen Format (z. B. 0x80004005) oder als Wert vom Datentyp Long (z. B. 2147467259) zurück. Diese HRESULT-Werte können von Komponenten einer unteren Ebene wie z. B. OLE DB oder sogar OLE selbst stammen. Weitere Informationen über diese Nummern finden Sie in Kapitel 16 der OLE DB Programmer's Reference.


NumericScale-Eigenschaft (ADO)

NumericScale-Eigenschaft

Gibt die Skalierung der numerischen Werte in einem Parameter- oder Field-Objekt an.

Einstellungen und Rückgabewerte

Legt einen Wert vom Datentyp Byte fest oder gibt einen solchen Wert zurück. Dieser Wert gibt die Anzahl der Dezimalstellen an, bis zu denen numerische Werte aufgeschlüsselt werden.

Hinweise

Verwenden Sie die NumericScale-Eigenschaft, um die Anzahl der Ziffern nach dem Komma zu bestimmen, mit der die Werte für ein numerisches Parameter- oder Field-Objekt dargestellt werden.

Für Parameter-Objekte bietet die NumericScale-Eigenschaft Schreib-/Lesezugriff.

Für Field-Objekte ist die NumericScale-Eigenschaft in der Regel schreibgeschützt. Aber bei neuen Field–Objekten, die zur Fields–Auflistung eines Record–Objekts hinzugefügt wurden, bietet die NumericScale–Eigenschaft erst dann Lese/Schreibzugriff, wenn die Value–Eigenschaft des Field–Objekts bereits mit einem Wert belegt und das neue Field-Objekt erfolgreich vom Datenprovider durch einen Aufruf der Update-Methode der Fields-Auflistung hinzugefügt worden ist.


OriginalValue-Eigenschaft (ADO)

OriginalValue-Eigenschaft

Gibt den Wert eines Field-Objekts an, der im Datensatz gespeichert war, bevor Änderungen an dem Feld vorgenommen wurden.

Rückgabewert

Gibt einen Wert vom Datentyp Variant zurück, der den Inhalt repräsentiert, den ein Feld vor eventuell vorgenommen Änderungen hatte.

Hinweise

Verwenden Sie die OriginalValue-Eigenschaft, um den ursprünglichen Feldwert für ein Feld aus dem aktuellen Datensatz zurückzugeben.

Im Modus für sofortige Aktualisierung (der Provider schreibt Änderungen in die zugrunde liegende Datenquelle, nachdem Sie die Update-Methode aufrufen) gibt die OriginalValue-Eigenschaft den Feldwert zurück, der vor etwaigen Änderungen (seit dem letzten Aufruf der Update-Methode) vorhanden war. Es ist derselbe Wert, den die CancelUpdate-Methode zum Ersetzen der Value-Eigenschaft verwendet.

Im Stapelaktualisierungsmodus (hier speichert der Provider mehrere Änderungen im Zwischenspeicher und schreibt diese nur dann in die zugrunde liegende Datenquelle, wenn Sie die UpdateBatch-Methode aufrufen) gibt die OriginalValue-Eigenschaft den Feldwert zurück, der vor der Durchführung der Änderungen (seit dem letzten Aufruf der UpdateBatch-Methode) vorhanden war. Es handelt sich um denselben Wert, den die CancelBatch-Methode zum Ersetzen der Value-Eigenschaft verwendet. Wenn Sie diese Eigenschaft zusammen mit der UnderlyingValue-Eigenschaft verwenden, können Sie aus Stapelaktualisierungen resultierende Konflikte auflösen.

Datensatz

Bei Record-Objekten liefert die OriginalValue–Eigenschaft einen leeren Wert für Felder, die vor dem Aufruf der Update-Methode hinzugefügt wurden.


PageCount-Eigenschaft (ADO)

PageCount-Eigenschaft

Gibt an, wie viele Datenseiten das Recordset-Objekt enthält.

Rückgabewert

Gibt einen Wert vom Datentyp Long zurück, der die Anzahl der Datenseiten im Recordset-Objekt anzeigt.

Hinweise

Verwenden Sie die PageCount-Eigenschaft, um die Anzahl der Datenseiten im Recordset-Objekt zu ermitteln. Seiten sind Gruppen von Datensätzen, deren Größe der Einstellung der PageSize-Eigenschaft entspricht. Selbst wenn die letzte Seite unvollständig ist, weil sie z. B. weniger Datensätze enthält, als in der PageSize-Eigenschaft angegeben sind, zählt sie als zusätzliche Seite für die PageCount-Eigenschaft. Falls das Recordset-Objekt diese Eigenschaft nicht unterstützt, beträgt der Wert -1, um anzuzeigen, dass PageCount nicht bestimmbar ist.

Weitere Informationen über die Funktionalität von Seiten finden Sie in den Hilfethemen für die Eigenschaften PageSize und AbsolutePage.


PageSize-Eigenschaft (ADO)

PageSize-Eigenschaft

Gibt an, aus wie vielen Datensätzen eine Seite im Recordset-Objekt besteht.

Einstellungen und Rückgabewerte

Legt einen Wert vom Datentyp Long fest oder gibt einen solchen Wert zurück. Dieser Wert zeigt an, wie viele Datensätze sich auf einer Seite befinden. Der Standardwert ist 10.

Hinweise

Verwenden Sie die PageSize-Eigenschaft, um die Anzahl der Datensätze zu ermitteln, aus denen eine logische Datenseite besteht. Wenn Sie die Seitengröße ermittelt haben, können Sie die AbsolutePage-Eigenschaft verwenden, um sich zum ersten Datensatz einer bestimmten Seite zu bewegen. Dies ist hilfreich bei Webservern, die Benutzern das seitenweise Navigieren durch Daten ermöglichen, wobei mehrere Datensätze gleichzeitig angezeigt werden können.

Die Eigenschaft kann jederzeit gesetzt werden. Ihr Wert wird verwendet, um die Position des ersten Datensatzes einer bestimmten Seite zu berechnen.


ParentURL-Eigenschaft (ADO)

ParentURL-Eigenschaft

Gibt die Zeichenfolge einer absoluten URL-Adresse an, die auf das dem aktuellen Record–Objekt übergeordnete Record-Objekt verweist.

Rückgabewert

Gibt einen Wert vom Datentyp String zurück, der den URL des übergeordneten Record-Objekts repräsentiert.

Hinweise

Die ParentURL–Eigenschaft ist abhängig von der Datenquelle, die beim Öffnen des Record-Objekts verwendet wird. Das Record–Objekt könnte beispielsweise unter Verwendung einer Quelle geöffnet werden, die einen relativen Pfadnamen eines Verzeichnisses enthält, auf das die ActiveConnection-Eigenschaft verweist.

Angenommen, "second" ist ein Ordner unterhalb von "first". Das Record–Objekt wird mit den folgenden Anweisungen geöffnet:

record.ActiveConnection = "http://first"
record.Open "second"

Die ParentURL–Eigenschaft hat nun den Wert "http://first", also denselben Wert wie ActiveConnection.

Die Datenquelle kann aber auch durch einen absoluten URL gegeben sein, beispielsweise durch "http://first/second". Die ParentURL–Eigenschaft hat dann den Wert "http://first", was der Ebene oberhalb von "second" entspricht.

Die Eigenschaft kann in folgenden Fällen einen Nullwert zurückgeben:

  • Es existiert kein übergeordnetes Objekt für das aktuelle Objekt. Beispielsweise trifft dies für ein Record–Objekt zu, das ein Stammverzeichnis repräsentiert.

  • Das Record–Objekt repräsentiert eine Einheit, die nicht mithilfe eines URLs angegeben werden kann, z. B. eine Zeile eines Recordset–Objekts, das aus einer Datenbank abgeleitet wurde.

Die Eigenschaft ist schreibgeschützt.

Anmerkung Die Eigenschaft wird nur von Dokumentenquellenprovidern wie z. B. dem Microsoft OLE DB-Provider für Internet Publishing unterstützt. Weitere Informationen hierzu finden Sie unter dem Hilfethema Datensätze und vom Provider verwaltete Felder.


Position-Eigenschaft (ADO)

Position-Eigenschaft

Zeigt die aktuelle Position innerhalb eines Stream–Objekts an.

Einstellungen und Rückgabewerte

Legt einen Wert vom Datentyp Long fest oder gibt einen solchen Wert zurück. Dieser Wert zeigt den (als Anzahl der Bytes gemessenen) Abstand zwischen der aktuellen Position und dem Anfang des Datenstroms an. Der Standardwert ist 0 und repräsentiert das erste Byte im Datenstrom.

Hinweise

Die aktuelle Position kann auf eine Stelle hinter dem Ende des Datenstroms verschoben werden. Wenn Sie bei Festlegung der aktuellen Position auf eine Stelle hinter dem Ende des Datenstroms positionieren, wird der Wert der Size–Eigenschaft des Stream–Objekts entsprechend erhöht. Alle auf diese Weise neu hinzugefügten Bytes sind auf Null (0) gesetzt.

Anmerkungen Position bemisst immer nach Bytes. Bei Text-Datenströmen mit Multibyte-Zeichensätzen müssen Sie die Positionsangabe mit der Zeichengröße multiplizieren, um die Ordnungszahl eines Zeichens zu ermitteln. Bei Verwendung eines 2-Byte-Zeichensatzes beispielsweise befindet sich das erste Zeichen an Position 0, das zweite Zeichen an Position 2, das dritte Zeichen an Position 4 usw.

Negative Werte sind nicht möglich, um etwa die aktuelle Position eines Stream-Objekts zu ändern. Zur Festlegung der Position-Eigenschaft sind nur positive Zahlen zulässig.

Bei schreibgeschützten Stream–Objekten generiert ADO keinen Fehler, wenn Position auf einen Wert gesetzt wird, der größer als der Wert der Size–Eigenschaft des Stream-Objekts ist. Denn diese Festlegung ändert weder die Größe noch den Inhalt des Stream-Objekts in irgendeiner Weise. Allerdings sollte eine solche Zuweisung vermieden werden, denn sie führt dazu, dass Position einen unbrauchbaren Wert enthält.


Precision-Eigenschaft (ADO)

Precision-Eigenschaft

Gibt den Genauigkeitsgrad für die numerischen Werte in einem Parameter-Objekt oder für numerische Field-Objekte an.

Einstellungen und Rückgabewerte

Legt einen Wert vom Datentyp Byte fest oder gibt einen solchen Wert zurück. Dieser Wert gibt die maximale Anzahl von Ziffern an, die zur Darstellung numerischer Werte verwendet werden.

Hinweise

Verwenden Sie die Precision-Eigenschaft, um die maximale Anzahl von Ziffern zu bestimmen, mit der die Werte für ein numerisches Parameter– oder Field-Objekt dargestellt werden.

Bei Parameter-Objekten ist Schreib-/Lesezugriff auf den Wert möglich.

Bei Field–Objekten ist die Precision–Eigenschaft in der Regel schreibgeschützt. Aber bei neuen Field–Objekten, die zur Fields–Auflistung eines Record–Objekts hinzugefügt wurden, bietet die Precision–Eigenschaft erst dann Lese/Schreibzugriff, wenn die Value–Eigenschaft des Field–Objekts bereits mit einem Wert belegt und das neue Field-Objekt erfolgreich vom Datenprovider durch einen Aufruf der Update-Methode der Fields-Auflistung hinzugefügt worden ist.


Prepared-Eigenschaft (ADO)

Prepared-Eigenschaft

Gibt an, ob eine kompilierte Version eines Befehls vor dessen Ausführung gespeichert werden soll.

Einstellungen und Rückgabewerte

Legt einen Boolean–Wert fest oder gibt einen solchen Wert zurück. Ein Wert von True zeigt an, dass der Befehl vorverarbeitet werden soll.

Hinweise

Verwenden Sie die Prepared–Eigenschaft, wenn der Provider eine vorverarbeitete (oder kompilierte) Version der Abfrage, die in der CommandText-Eigenschaft festgelegt ist, vor der ersten Ausführung des Command-Objekts speichern soll. Dies kann die erste Ausführung eines Befehls verlangsamen. Sobald der Provider jedoch einen Befehl kompiliert hat, verwendet er für alle nachfolgenden Ausführungen die kompilierte Version des Befehls. Hierdurch wird die Leistung verbessert.

Wenn die Eigenschaft den Wert False hat, führt der Provider das Command–Objekt direkt aus, ohne eine kompilierte Version zu erstellen.

Unterstützt der Provider die Befehlsvorverarbeitung nicht, wird möglicherweise ein Fehler zurückgegeben, sobald diese Eigenschaft auf den Wert True gesetzt wird. Wenn kein Fehler zurückgegeben wird, wird die Anforderung zum Vorbereiten des Befehls ignoriert. Die Prepared–Eigenschaft wird dann auf den Wert False festgelegt.


Provider-Eigenschaft (ADO)

Provider-Eigenschaft

Gibt den Namen des Providers für ein Connection-Objekt an.

Einstellungen und Rückgabewerte

Legt einen Wert vom Datentyp String fest oder gibt einen solchen Wert zurück. Dieser Wert repräsentiert den Namen des Providers.

Hinweise

Verwenden Sie die Provider–Eigenschaft, um den Namen des Providers für eine Verbindung festzulegen oder zu ermitteln. Diese Eigenschaft kann auch durch den Inhalt der ConnectionString-Eigenschaft oder des ConnectionString-Arguments der Open-Methode festgelegt werden. Allerdings kann das mehrfache Festlegen eines Providers während des Aufrufs der Open-Methode unvorhersehbare Ergebnisse zur Folge haben. Falls kein Provider festgelegt ist, wird die Eigenschaft standardmäßig mit MSDASQL (Microsoft OLE DB-Provider für ODBC) vorbelegt.

Die Provider-Eigenschaft bietet Schreib-/Lesezugriff, wenn die Verbindung geschlossen ist, und sie ist schreibgeschützt, wenn die Verbindung geöffnet ist. Die Einstellung wirkt sich erst aus, wenn Sie entweder das Connection–Objekt öffnen oder auf die Properties-Auflistung des Connection–Objekts zugreifen. Eine ungültige Einstellung führt zu einem Fehler.


ReadyState-Eigenschaft (RDS)

Gibt den aktuellen Zustand eines DataControl-Objekts beim Abrufen von Daten in das dazugehörige Recordset-Objekt an.

Einstellungen und Rückgabewerte

Legt einen der folgenden Werte fest oder gibt einen der Werte zurück:

Wert | Beschreibung
adcReadyStateLoaded | Die aktuelle Abfrage wird momentan noch ausgeführt, und es wurden keine Zeilen abgerufen. Das Recordset des DataControl-Objekts ist nicht verfügbar.
adcReadyStateInteractive | Eine erste durch die aktuelle Abfrage abgerufene Gruppe von Zeilen wurde im Recordset des DataControl-Objekts gespeichert und ist verfügbar. Die übrigen Zeilen werden momentan noch abgerufen.
adcReadyStateComplete | Alle von der aktuellen Abfrage abgerufenen Zeilen wurden im Recordset des DataControl-Objekts gespeichert und sind verfügbar. Dieser Zustand liegt auch vor, wenn eine Operation wegen eines Fehlers abgebrochen wurde oder wenn das Recordset-Objekt nicht initialisiert ist.

Anmerkung Jede clientbasierte ausführbare Datei, in der diese Konstanten verwendet werden, muss Deklarationen für die Konstanten zur Verfügung stellen. Die gewünschten Konstantendeklarationen können aus der Datei Adcvbs.inc im Ordner C:\Programme\Gemeinsame Dateien\System\msdac kopiert und an geeigneter Stelle wieder eingefügt werden.

Hinweise

Verwenden Sie das onReadyStateChange-Ereignis zur Überwachung von Änderungen der ReadyStateChange-Eigenschaft während einer asynchronen Abfrageoperation. Das ist effizienter als das regelmäßige Prüfen des Wertes der Eigenschaft.

Wenn während der Ausführung einer asynchronen Operation ein Fehler auftritt, ändert die ReadyState-Eigenschaft ihren Wert in adcReadyStateComplete und die State-Eigenschaft wechselt von adStateExecuting zu adStateClosed. Der Wert der Value-Eigenschaft des Recordset-Objekts bleibt Nothing.


RecordCount-Eigenschaft (ADO)

RecordCount-Eigenschaft

Gibt die Anzahl der Datensätze in einem Recordset-Objekt an.

Rückgabewert

Gibt einen Wert vom Datentyp Long zurück, der die Anzahl der Datensätze im Recordset-Objekt anzeigt.

Hinweise

Verwenden Sie die RecordCount-Eigenschaft, um die Anzahl der Datensätze in einem Recordset-Objekt festzustellen. Die Eigenschaft gibt -1 zurück, wenn ADO die Anzahl der Datensätze nicht bestimmen kann oder wenn der gegebene Typ von Provider bzw. Cursor die RecordCount–Eigenschaft nicht unterstützen. Das Lesen der RecordCount-Eigenschaft bei geschlossenem Recordset-Objekt verursacht einen Fehler.

Wenn das Recordset-Objekt die ungefähre Positionierung oder die Verwendung von Lesezeichen unterstützt, wenn also Supports (adApproxPosition) oder Supports (adBookmark) den Wert True zurückgibt, stellt der Wert dieser Eigenschaft die exakte Anzahl der Datensätze im Recordset-Objekt dar, unabhängig davon, ob alle Datensätze geladen wurden. Falls das Recordset-Objekt die ungefähre Positionierung nicht unterstützt, kann der Zugriff auf diese Eigenschaft einen erheblichen Verbrauch an Ressourcen verursachen, da alle Datensätze abgerufen und gezählt werden müssen, damit ein präziser RecordCount-Wert zurückgegeben werden kann.

Es hängt vom Cursortyp des Recordset-Objekts ab, ob die Anzahl der Datensätze bestimmt werden kann. Die RecordCount-Eigenschaft gibt -1 für einen Vorwärtscursor, das tatsächliche Zählergebnis für einen statischen oder Keyset-gesteuerten Cursor und entweder -1 oder das tatsächliche Zählergebnis für einen dynamischen Cursor zurück, je nach Datenquelle.


Recordset- und SourceRecordset-Eigenschaften (RDS)

Gibt das von einem benutzerdefinierten Geschäftsobjekt zurückgegebene Recordset–Objekt an.

Syntax

DataControl.SourceRecordset = Recordset

Recordset = DataControl.Recordset

Parameter

DataControl Eine Objektvariable, die ein RDS.DataControl-Objekt darstellt.

Recordset Eine Objektvariable, die ein Recordset-Objekt darstellt.

Hinweise

Sie können die SourceRecordset-Eigenschaft auf ein Recordset-Objekt festlegen, das von einem benutzerdefinierten Geschäftsobjekt zurückgegeben wurde.

Diese Eigenschaften ermöglichen einer Anwendung die Verwaltung des Bindungsprozesses mithilfe eines benutzerdefinierten Verfahrens. Die Anwendung erhält ein in einem Recordset-Objekt enthaltenes Rowset. Auf diese Weise ist eine direkte Interaktion mit dem Recordset-Objekt sowie das Durchführen von Aktionen möglich, wie z. B. das Festlegen von Eigenschaften oder das Durchlaufen des Inhalts eines Recordset-Objekts.

Der Schreibzugriff auf die SourceRecordset-Eigenschaft bzw. der Lesezugriff auf die Recordset-Eigenschaft kann zur Laufzeit im Skripterstellungscode erfolgen.

Die SourceRecordset-Eigenschaft ist lesegeschützt, wohingegen Recordset eine schreibgeschützte Eigenschaft ist.


RecordType-Eigenschaft (ADO)

RecordType-Eigenschaft

Gibt den Typ des Record-Objekts an.

Rückgabewert

Gibt einen RecordTypeEnum-Wert zurück.

Hinweise

Die RecordType-Eigenschaft ist schreibgeschützt.


Server-Eigenschaft (RDS)

Gibt den Namen für Internet-Informationsdienste (IIS) und das Kommunikationsprotokoll an.

Sie können die Server-Eigenschaft zur Entwurfszeit in den OBJECT-Tags des RDS.DataControl-Objekts oder zur Laufzeit im Skripterstellungscode festlegen.

Syntax

Protokoll | Syntax zur Entwurfszeit
HTTP | <PARAM NAME="Server" VALUE="http://awebsrvr:port">
HTTPS | <PARAM NAME="Server" VALUE="https://awebsrvr:port">
DCOM | <PARAM NAME="Server" VALUE="computername">
In-process | <PARAM NAME="Server" VALUE="">

Protokoll | Syntax zur Laufzeit
HTTP | DataControl.Server="http://awebsrvr:port"
HTTPS | DataControl.Server="https://awebsrvr:port"
DCOM | DataControl.Server="computername"
In-process | DataControl.Server=""

Parameter

awebsrvr oder computername Ein String–Wert, der eine Internet- oder Intranet-Adresse oder einen Computernamen enthält, sofern sich der Server auf einem Remotecomputer befindet, oder eine leere Zeichenfolge, falls der Server auf dem lokalen Computer installiert ist.

port Optional. Ein Anschluss, über den die Verbindung mit einem IIS-Server hergestellt wird. Die Anschlussnummer wird im Internet Explorer (klicken Sie im Menü Extras auf Internetoptionen und dann auf die Registerkarte Verbindungen) oder in IIS festgelegt.

DataControl Eine Objektvariable, die ein RDS.DataControl-Objekt darstellt.

Hinweise

Der Server ist die Instanz, welche die RDS.DataControl–Anforderung (eine Abfrage oder eine Aktualisierung) verarbeitet. Standardmäßig werden alle Anforderungen durch das RDSServer.DataFactory-Objekt, die MSDFMAP.Handler-Komponente und die MSDFMAP.INI-Datei auf dem angegebenen Server verarbeitet. Achten Sie beim Wechsel des Servers darauf, die Einstellungen der alten und neuen MSDFMAP.INI-Datei in Einklang miteinander zu bringen. Inkompatibilitäten können dazu führen, dass Anforderungen, die auf dem einen Server erfolgreich durchgeführt werden können, auf einem anderen Server fehlschlagen.


Size-Eigenschaft (ADO)

Size-Eigenschaft

Gibt die maximale Größe eines Parameter-Objekts in Bytes oder Zeichen an.

Einstellungen und Rückgabewerte

Legt einen Wert vom Datentyp Long fest oder gibt einen solchen zurück. Dieser Wert repräsentiert die maximale Größe eines Wertes in einem Parameter-Objekt in Bytes oder Zeichen.

Hinweise

Verwenden Sie die Size-Eigenschaft, um die maximale Größe für Werte zu ermitteln, mit denen die Value-Eigenschaft eines Parameter-Objekts belegt oder die aus ihr gelesen werden können.

Wenn Sie einen Datentyp variabler Länge für ein Parameter-Objekt (z. B. ein beliebiger String-Typ wie adVarChar) festlegen, müssen Sie die Size-Eigenschaft des Objekts festlegen, bevor es an die Parameters-Auflistung angehängt wird. Andernfalls tritt ein Fehler auf.

Sofern Sie das Parameter-Objekt bereits an die Parameters-Auflistung eines Command-Objekts angehängt haben und nun seinen Typ in einen Datentyp variabler Länge ändern, müssen Sie die Size-Eigenschaft des Parameter-Objekts vor dem Ausführen des Command-Objekts festlegen. Andernfalls tritt ein Fehler auf.

Wenn Sie die Refresh-Methode zum Anfordern von Parameterinformationen vom Provider verwenden und ein oder mehrere Parameter-Objekte variabler Länge zurückgegeben werden, kann ADO den Speicher für die Parameter auf der Grundlage ihrer maximalen potenziellen Größe zuordnen. Dies kann während der Ausführung einen Fehler auslösen. Zur Vermeidung eines solchen Fehlers sollten Sie die Size-Eigenschaft für diese Parameter unbedingt vor dem Ausführen des Befehls festlegen.

Die Size-Eigenschaft bietet Schreib-/Lesezugriff.


Size-Eigenschaft (ADO Stream-Objekt)

Gibt die Größe des Datenstroms in Bytes an.

Rückgabewerte

Gibt einen Wert vom Datentyp Long zurück, der die Größe des Datenstroms in Bytes anzeigt. Der Standardwert ist entweder die Größe des Datenstroms oder –1, falls die Größe des Datenstroms nicht bekannt ist.

Hinweise

Size kann nur in Verbindung mit geöffneten Stream-Objekten verwendet werden.

Anmerkung In einem Stream–Objekt kann jede beliebige Anzahl von Bits gespeichert werden, eingeschränkt nur durch den Umfang der gegebenen Systemressourcen. Enthält das Stream–Objekt mehr Datenbits als durch einen Wert vom Datentyp Long darstellbar sind, wird der Wert von Size auf eine entsprechende Größe gekürzt und gibt daher die Länge des Stream-Inhalts nicht mehr genau wieder.


Sort-Eigenschaft (ADO)

Sort-Eigenschaft

Gibt einen oder mehrere Feldnamen an, nach denen die Sortierung im Recordset-Objekt durchgeführt wird. Außerdem wird festgelegt, ob die einzelnen Felder in aufsteigender oder absteigender Reihenfolge sortiert werden.

Einstellungen und Rückgabewerte

Legt einen String–Wert fest oder gibt einen solchen zurück. Dieser Wert repräsentiert die Feldnamen des Recordset–Objekts, nach denen sortiert werden soll. Die Namen sind voneinander durch Kommas getrennt. Jeder Name kann optional ein Leerzeichen und eines der Schlüsselwörter ASC oder DESC nach sich ziehen, welche eine Sortierung des Feldes in aufsteigender bzw. absteigender Reihenfolge festlegen. Wenn kein Schlüsselwort angegeben ist, wird das Feld standardmäßig in aufsteigender Reihenfolge sortiert.

Hinweise

Diese Eigenschaft setzt voraus, dass die CursorLocation–Eigenschaft auf adUseClient gesetzt ist. Für jedes in der Sort-Eigenschaft festgelegte Feld wird ein temporärer Index erstellt, sofern noch kein Index vorhanden ist.

Der Sortiervorgang ist effizient, da die Daten nicht physisch neu geordnet werden, sondern lediglich der Zugriff darauf in der Sortierreihenfolge erfolgt.

Durch das Festlegen der Sort-Eigenschaft auf eine leere Zeichenfolge wird die ursprüngliche Reihenfolge der Zeilen wiederhergestellt. Temporäre Indizes werden gelöscht. Vorhandene Indizes werden nicht gelöscht.

Angenommen, ein Recordset–Objekt enthält drei Felder mit den Namen Vorname, MittlereInitiale und Nachname. Wenn Sie die Sort–Eigenschaft mit der Zeichenfolge "Nachname DESC, Vorname ASC" belegen, wird der Inhalt des Recordset–Objekts zunächst nach dem Nachnamen in absteigender und anschließend nach dem Vornamen in aufsteigender Reihenfolge sortiert. Die mittlere Initiale wird ignoriert.

Kein Feld darf mit "ASC" oder "DESC" benannt werden, denn diese Namen würden einen Konflikt mit den Schlüsselwörtern ASC und DESC provozieren. Geben Sie einem Feld mit einem Namen, bei dem ein Konflikt auftreten würde, einen Alias. Verwenden Sie zu diesem Zweck in der Abfrage, die das Recordset zurückgibt, das Schlüsselwort AS.


SortColumn-Eigenschaft (RDS)

Gibt die Spalte an, nach der die Datensätze sortiert werden sollen.

Syntax

DataControl.SortColumn = String

Parameter

DataControl Eine Objektvariable, die ein RDS.DataControl-Objekt darstellt.

String Ein Wert vom Datentyp String, der den Namen oder Alias der Spalte darstellt, nach der die Datensätze sortiert werden.

Hinweise

Die Eigenschaften SortColumn, SortDirection, FilterValue, FilterCriterion und FilterColumn stellen Sortier- und Filterfunktionen für den clientbasierten Zwischenspeicher zur Verfügung. Die Sortierfunktion sortiert Datensätze nach Werten einer Spalte. Die Filterfunktion zeigt eine Untermenge der Datensätze auf der Grundlage von Suchkriterien an, während das vollständige Recordset-Objekt im Zwischenspeicher verbleibt. Die Reset-Methode führt die Kriterien aus und ersetzt das aktuelle Recordset-Objekt durch ein aktualisierbares Recordset-Objekt.

Um eine Sortierung in einem Recordset-Objekt vorzunehmen, müssen zunächst alle durchgeführten Änderungen gespeichert werden. Bei einem RDS.DataControl-Objekt kann dazu die SubmitChanges-Methode verwendet werden. Wenn beispielsweise das von Ihnen verwendete RDS.DataControl-Objekt die Bezeichnung "ADC1" trägt, würde folgender Code verwendet: ADC1.SubmitChanges. Wird ein Recordset-Objekt von ADO verwendet, kann die UpdateBatch-Methode dieses Objekts verwendet werden. Die Verwendung der UpdateBatch-Methode wird für Recordset-Objekte empfohlen, die mit der CreateRecordset-Methode erstellt wurden. Codebeispiele: myRS.UpdateBatch oder ADC1.Recordset.UpdateBatch.


SortDirection-Eigenschaft (RDS)

Gibt an, ob eine Sortierung in auf- oder absteigender Reihenfolge erfolgen soll.

Syntax

DataControl.SortDirection = value

Parameter

DataControl Eine Objektvariable, die ein RDS.DataControl-Objekt darstellt.

Value Ein Boolean–Wert. Die Einstellung True legt die aufsteigende Sortierreihenfolge fest. False gibt die absteigende Reihenfolge an.

Hinweise

Die Eigenschaften SortColumn, SortDirection, FilterValue, FilterCriterion und FilterColumn stellen Sortier- und Filterfunktionen für den clientbasierten Zwischenspeicher zur Verfügung. Die Sortierfunktion sortiert Datensätze nach Werten einer Spalte. Die Filterfunktion zeigt eine Untermenge der Datensätze auf der Grundlage von Suchkriterien an, während das vollständige Recordset-Objekt im Zwischenspeicher verbleibt. Die Reset-Methode führt die Kriterien aus und ersetzt das aktuelle Recordset-Objekt durch ein aktualisierbares Recordset-Objekt.


Source-Eigenschaft (ADO Error-Objekt)

Gibt den Namen des Objekts oder der Anwendung an, das/die ursprünglich einen Fehler ausgelöst hat.

Rückgabewert

Legt einen Wert vom Datentyp String fest oder gibt einen solchen zurück. Dieser Wert repräsentiert den Namen eines Objekts oder einer Anwendung.

Hinweise

Verwenden Sie die Source-Eigenschaft eines Error-Objekts, um den Namen des Objekts oder der Anwendung zu bestimmen, das/die ursprünglich einen Fehler ausgelöst hat. Hierbei kann es sich um den Klassennamen oder die Programm-ID des Objekts handeln. Bei in ADODB generierten Fehlern lautet der Eigenschaftswert ADODB.Objektname. Dabei ist Objektname der Name des Objekts, das den Fehler ausgelöst hat. Bei Fehlern, die von ADOX und ADO MD ausgelöst wurden, hat der Wert die Form ADOX.Objektname bzw. ADOMD.Objektname.

Anhand der Fehlerdaten, welche die Eigenschaften Source, Number und Description der Error-Objekte dokumentieren, können Sie Code erstellen, der eine geeignete Fehlerbehandlung ermöglicht.

Die Source-Eigenschaft ist für Error-Objekte schreibgeschützt.


Source-Eigenschaft (ADO Record-Objekt)

Verweist auf die Einheit, die durch das Record–Objekt repräsentiert wird.

Einstellungen und Rückgabewerte

Legt einen Wert vom Datentyp Variant fest oder gibt einen solchen zurück. Dieser Wert verweist auf die durch das Record-Objekt repräsentierte Einheit.

Hinweise

Die Source–Eigenschaft gibt das Source-Argument der Open-Methode des Record-Objekts zurück. Der Rückgabewert kann eine Zeichenfolge mit einem absoluten oder relativen URL enthalten. Mit einem absoluten URL lässt sich das Record-Objekt direkt öffnen, ohne dass zuvor die ActiveConnection–Eigenschaft gesetzt werden muss. In diesem Fall wird ein implizites Connection-Objekt angelegt.

Die Source-Eigenschaft kann auch einen Verweis auf einen bereits geöffneten Recordset enthalten. Durch diesen Verweis wird ein Record–Objekt geöffnet, das die aktuelle Zeile des Recordset-Objekts repräsentiert.

Ist gleichzeitig auch die ActiveConnection–Eigenschaft definiert, muss die Source–Eigenschaft auf ein Objekt verweisen, das innerhalb des Gültigkeitsbereichs der festgelegten Verbindung existiert. So muss beispielsweise in hierarchisch strukturierten Namespaces die mit einem absoluten URL belegte Source–Eigenschaft auf einen Knoten verweisen, der sich innerhalb des Gültigkeitsbereichs des Knotens befindet, den der URL der Verbindungszeichenfolge bezeichnet. Wenn die Source–Eigenschaft einen relativen URL enthält, wird dieser im Kontext der Einstellung der ActiveConnection-Eigenschaft ausgewertet.

Die Source-Eigenschaft bietet Schreib-/Lesezugriff, wenn das Record-Objekt geschlossen ist. Sie ist schreibgeschützt, während das Objekt geöffnet ist.


Source-Eigenschaft (ADO Recordset-Objekt)

Gibt die Datenquelle für ein Recordset-Objekt an.

Einstellungen und Rückgabewerte

Legt einen Wert vom Datentyp String oder einen Verweis auf ein Command-Objekt fest. Gibt nur einen Wert vom Datentyp String zurück, der die Quelle des Recordset-Objekts bezeichnet.

Hinweise

Verwenden Sie die Source-Eigenschaft, um eine Datenquelle für ein Recordset-Objekt unter Verwendung eines der folgenden Elemente festzulegen: eine Command-Objektvariable, eine SQL-Anweisung, eine gespeicherte Prozedur oder ein Tabellenname.

Wenn Sie die Source-Eigenschaft eines Command-Objekts festlegen, übernimmt die ActiveConnection-Eigenschaft des Recordset-Objekts den Wert der ActiveConnection-Eigenschaft für das gegebene Command-Objekt. Der Lesezugriff auf die Source-Eigenschaft liefert jedoch kein Command-Objekt, sondern den Wert der CommandText-Eigenschaft des Command-Objekts, dessen Source-Eigenschaft festgelegt wird.

Falls es sich bei der Source-Eigenschaft um eine SQL-Anweisung, eine gespeicherte Prozedur oder einen Tabellennamen handelt, können Sie die Leistung optimieren, indem Sie das entsprechende Options-Argument beim Aufruf der Open-Methode übergeben.

Die Source-Eigenschaft bietet Schreib-/Lesezugriff für geschlossene Recordset-Objekte, und sie ist schreibgeschützt für geöffnete Recordset-Objekte.


SQL-Eigenschaft (RDS)

Gibt die Abfragezeichenfolge an, die zum Abrufen des Recordset-Objekts verwendet wird.

Sie können die SQL-Eigenschaft zur Entwurfszeit in den OBJECT-Tags des RDS.DataControl-Objekts oder zur Laufzeit im Skripterstellungscode festlegen.

Syntax

Entwurfszeit: <PARAM NAME="SQL" VALUE="QueryString">

Laufzeit: DataControl.SQL = "QueryString"

Parameter

QueryString Ein String, der eine gültige SQL-Datenanforderung enthält.

DataControl Eine Objektvariable, die ein RDS.DataControl-Objekt darstellt.

Hinweise

Im Allgemeinen handelt es sich dabei um eine SQL-Anweisung (die den Dialekt des Datenbankservers verwendet), wie z. B. "Select * from NewTitle". Um sicherzustellen, dass die Datensätze genau übereinstimmen und korrekt aktualisiert werden, darf eine aktualisierbare Abfrage kein langes Binärfeld oder ein berechnetes Feld enthalten.

Die SQL-Eigenschaft ist optional, wenn ein benutzerdefiniertes serverbasiertes Geschäftsobjekt die Daten für den Client abruft.


SQLState-Eigenschaft (ADO)

SQLState-Eigenschaft

Gibt den SQL-Zustand für ein gegebenes Error-Objekt an.

Rückgabewert

Gibt einen Wert vom Datentyp String mit fünf Zeichen zurück, der den Konventionen des ANSI SQL-Standards entspricht und den Fehlercode darstellt.

Hinweise

Verwenden Sie die SQLState-Eigenschaft, um den fünf Zeichen umfassenden Fehlercode zu lesen, den der Provider zurückgibt, wenn ein Fehler während der Verarbeitung einer SQL-Anweisung auftritt. Wenn Sie z. B. den Microsoft OLE DB Provider für ODBC mit einer Microsoft SQL Server-Datenbank verwenden, haben die Fehlercodes für den SQL-Zustand ihren Ursprung in ODBC. Dabei liegen ihnen Fehler zugrunde, die entweder spezifisch für ODBC sind oder ihren Ursprung im Microsoft SQL Server haben und dann den ODBC-Fehlern zugeordnet werden. Diese Fehlercodes sind im ANSI SQL-Standard dokumentiert, können durch unterschiedliche Datenquellen jedoch verschieden implementiert sein.


State-Eigenschaft (ADO)

State-Eigenschaft

Gibt für alle anwendbaren Objekte an, ob der Status des jeweiligen Objekts 'geöffnet' oder 'geschlossen' ist.

Sofern die mit dieser Eigenschaft versehenen Objekte eine asynchrone Methode ausführen, gibt die Eigenschaft an, ob der aktuelle Status des jeweiligen Objekts 'verbindend', 'ausführend' oder 'abrufend' ist.

Rückgabewert

Gibt einen Wert vom Datentyp Long zurück, der ein ObjectStateEnum-Wert sein kann. Der Standardwert ist adStateClosed.

Hinweise

Mit der State-Eigenschaft kann der aktuelle Zustand eines gegebenen Objekts jederzeit ermittelt werden.

Die State-Eigenschaft eines Objekts kann eine Kombination von Werten darstellen. Beispielsweise besitzt diese Eigenschaft während der Ausführung einer Anweisung einen kombinierten Wert, der sich aus adStateOpen und adStateExecuting zusammensetzt.

Die State-Eigenschaft ist schreibgeschützt.


Status-Eigenschaft (ADO Field-Objekt)

Gibt den Zustand eines Field-Objekts an.

Rückgabewert

Gibt einen FieldStatusEnum-Wert zurück. Der Standardwert ist adFieldOK.

Hinweise

Für Felder eines Recordset-Objekts liefert die Eigenschaft immer adFieldOK.

An den Fields–Auflistungen des Record–Objekts vorgenommene Hinzufügungen und Löschungen werden bis zum Aufruf der Update-Methode zwischengespeichert. Die Status–Eigenschaft ermöglicht es festzustellen, welche Felder erfolgreich hinzugefügt oder gelöscht wurden.

Zur Leistungsverbesserung werden Schemaänderungen so lange zwischengespeichert, bis ein Aufruf von Update erfolgt. Anschließend werden die Änderungen per optimistischer Stapelaktualisierung festgeschrieben. Falls die Update-Methode nicht aufgerufen wird, erfolgt keine Aktualisierung des Servers. Bei fehlgeschlagener Aktualisierung wird ein Fehler zurückgegeben, und die Status–Eigenschaft zeigt die kombinierten Statuscode-Werte für Operation und Fehler an, beispielweise eine Kombination wie adFieldPendingInsert OR adFieldPermissionDenied. Über die Status–Eigenschaft eines jeden Field–Objekts kann dann ermittelt werden, warum das Field–Objekt nicht hinzugefügt, geändert oder gelöscht wurde. Status liefert nur für die Record.Fields–Auflistung sinnvolle Aussagen, nicht aber für die Recordset.Fields-Auflistung.

Zwei Probleme können beim Hinzufügen, Ändern und Löschen eines Field-Objekts auftreten. Wenn der Benutzer ein Field–Objekt löscht, wird es für die Entfernung aus der Fields–Auflistung vorgemerkt. Falls die nachfolgende Update–Operation einen Fehler zurückgibt, weil der Benutzer versucht hat, ohne ausreichende Berechtigung das Field–Objekt zu löschen, zeigt dieses Field–Objekt den Statuswert adFieldPermissionDenied OR adFieldPendingDelete an. Mit einem Aufruf der CancelUpdate-Methode werden die ursprünglichen Werte wiederhergestellt und die Status–Eigenschaft auf adFieldOK gesetzt. Ein ähnlicher Fall kann sich ergeben, wenn die Update-Methode einen Fehler zurückgibt, weil ein neues Field–Objekt hinzugefügt und mit einem unzulässigen Wert belegt wurde. In diesem Fall existiert das neue Field–Objekt innerhalb der Fields–Auflistung und besitzt einen Statuswert aus adFieldPendingInsert und möglicherweise noch adFieldCantCreate. Sie können dann einen geeigneten Wert für das neue Field–Objekt eintragen und Update erneut aufrufen. Beachten Sie, dass ein Aufruf von Resync stattdessen eine neue Abfrage an den Provider initiieren würde.


Status-Eigenschaft (ADO Recordset-Objekt)

Gibt den Status des aktuellen Datensatzes in Bezug auf Stapelaktualisierungen oder andere Mehrfachoperationen an.

Rückgabewert

Gibt eine Summe aus einem oder mehreren RecordStatusEnum-Werten zurück.

Hinweise

Verwenden Sie die Status-Eigenschaft, um zu ermitteln, welche Änderungen für Datensätze anstehen, die während der Stapelaktualisierung bearbeitet wurden. Sie können außerdem die Status-Eigenschaft verwenden, um den Status von Datensätzen zu bestimmen, deren Verarbeitung im Rahmen von Mehrfachoperationen fehlschlägt, wie es z. B. bei Aufrufen der Methoden Resync, UpdateBatch oder CancelBatch für ein Recordset-Objekt oder als Folge einer Belegung der Filter-Eigenschaft eines Recordset-Objekts durch ein Array mit Lesezeichen geschehen kann. Mithilfe dieser Eigenschaft können Sie feststellen, warum ein bestimmter Datensatz nicht erfolgreich verarbeitet wurde, und diesen Konflikt entsprechend lösen.


StayInSync-Eigenschaft (ADO)

StayInSync-Eigenschaft

Gibt in einem hierarchischen Recordset-Objekt an, ob der Verweis auf die zugrunde liegenden untergeordneten Datensätze (ein Kapitel) sich ändert, wenn die Position der übergeordneten Zeile sich ändert.

Einstellungen und Rückgabewerte

Legt einen booleschen Wert fest oder gibt einen solchen zurück. Der Standardwert ist True. Gilt True, dann wird das Kapitel aktualisiert, wenn die Zeilenposition des übergeordneten Recordset-Objekts sich ändert; gilt False, dann verweist das Kapitel weiterhin auf die Daten im vorhergehenden Kapitel, selbst wenn die Zeilenposition des übergeordneten Recordset-Objekts sich geändert hat.

Hinweise

Diese Eigenschaft gilt für hierarchische Recordsets, wie z. B. die durch den Microsoft Data Shaping Service für OLE DB unterstützten Recordset und muss auf das übergeordnete Recordset-Objekt gesetzt werden, bevor das untergeordnete Recordset-Objekt abgerufen wird. Die Eigenschaft erleichtert das Navigieren innerhalb hierarchischer Recordsets.


Type-Eigenschaft (ADO)

Type-Eigenschaft

Gibt den Operationstyp oder Datentyp eines Parameter-, Field- oder Property-Objekts an.

Einstellungen und Rückgabewerte

Legt einen DataTypeEnum-Wert fest oder gibt einen solchen zurück.

Hinweise

Für Parameter-Objekte bietet die Type-Eigenschaft Schreib-/Lesezugriff. Bei neuen Field–Objekten, die zur Fields–Auflistung eines Record–Objekts hinzugefügt wurden, bietet die Type–Eigenschaft erst dann Lese/Schreibzugriff, wenn die Value–Eigenschaft des Field–Objekts mit einem Wert belegt und das neue Field-Objekt erfolgreich vom Datenprovider durch einen Aufruf der Update-Methode zur Fields-Auflistung hinzugefügt worden ist.

Bei allen anderen Objekten ist die Type-Eigenschaft schreibgeschützt.


Type-Eigenschaft (ADO Stream-Objekt)

Gibt den Typ der im Stream–Objekt enthaltenen (binären oder textuellen) Daten an.

Einstellungen und Rückgabewerte

Legt einen StreamTypeEnum–Wert fest oder gibt einen solchen zurück. Dieser Wert repräsentiert den Typ der im Stream-Objekt enthaltenen Daten. Der Standardwert ist adTypeText. Handelt es sich jedoch bei den zuerst in einen neu angelegten leeren Datenstrom geschriebenen Daten um Binärdaten, wird die Type–Belegung des Stream-Objekts in adTypeBinary geändert.

Hinweise

Die Type–Eigenschaft bietet Lese-/Schreibzugriff nur für den Fall, dass die aktuelle Position auf den Anfang des Stream–Inhalts weist (Position hat den Wert 0). Für alle anderen Position-Werte ist die Eigenschaft schreibgeschützt.


UnderlyingValue-Eigenschaft (ADO)

UnderlyingValue-Eigenschaft

Gibt den aktuellen Wert eines Field-Objekts in der Datenbank an.

Rückgabewert

Gibt einen Variant–Wert zurück, der den Wert eines Field-Objekts darstellt.

Hinweise

Verwenden Sie die UnderlyingValue-Eigenschaft, um den aktuellen Feldwert aus der Datenbank zurückzugeben. Der Feldwert in der UnderlyingValue-Eigenschaft ist der Wert, der Ihrer Transaktion angezeigt wird und bei dem es sich um das Ergebnis einer vor kurzem durchgeführten Aktualisierung durch eine andere Transaktion handeln kann. Dieser Wert kann sich von der OriginalValue-Eigenschaft unterscheiden, die den ursprünglich an das Recordset-Objekt übergebenen Wert widerspiegelt.

Die genannte Verwendung ähnelt einem Aufruf der Resync-Methode. Die UnderlyingValue-Eigenschaft gibt jedoch nur den Wert für ein bestimmtes Feld aus dem aktuellen Datensatz zurück. Es ist derselbe Wert, den die Resync-Methode zum Ersetzen der Value-Eigenschaft verwendet.

Wenn Sie diese Eigenschaft zusammen mit der OriginalValue-Eigenschaft verwenden, können Sie die aus Stapelaktualisierungen resultierenden Konflikte auflösen.

Datensatz

Bei Record-Objekten liefert diese Eigenschaft einen leeren Wert für Felder, die vor dem Aufruf von Update hinzugefügt wurden.


URL-Eigenschaft (RDS)

Gibt eine Zeichenfolge an, die einen relativen oder absoluten URL darstellt.

Sie können die URL-Eigenschaft zur Entwurfszeit in den OBJECT-Tags des RDS.DataControl-Objekts oder zur Laufzeit im Skripterstellungscode festlegen.

Syntax

Entwurfszeit: <PARAM NAME="URL" VALUE="Server">

Laufzeit: DataControl.URL="Server"

Parameter

Server Ein Wert vom Datentyp String, der eine gültige URL-Adresse enthält.

DataControl Eine Objektvariable, die ein DataControl-Objekt darstellt.

Hinweise

In der Regel bezeichnet der URL eine Active Server Page (.asp-Datei), die ein Recordset-Objekt generieren und zurückgeben kann. Deshalb ist der Benutzer in der Lage, ein Recordset–Objekt zu erhalten, ohne das serverbasierte DataFactory–Objekt aufrufen oder ein benutzerdefiniertes Geschäftsobjekt programmieren zu müssen.

Wenn die URL–Eigenschaft definiert ist, übergibt SubmitChanges alle Änderungen an die durch den URL bezeichnete Instanz.


Value-Eigenschaft (ADO)

Value-Eigenschaft

Gibt den Wert an, der einem Field-, Parameter- oder Property-Objekt zugewiesen ist.

Einstellungen und Rückgabewerte

Legt einen Wert vom Datentyp Variant fest oder gibt einen solchen zurück. Dieser Wert repräsentiert den Wert eines Objekts. Der Standardwert hängt von der Type-Eigenschaft ab.

Hinweise

Verwenden Sie die Value-Eigenschaft, um Daten von Field-Objekten, Parameterwerte von Parameter-Objekten oder Eigenschaftseinstellungen von Property-Objekten festzulegen oder zurückzugeben. Ob die Value-Eigenschaft Schreib-/Lesezugriff bietet oder ob sie schreibgeschützt ist, hängt von zahlreichen Faktoren ab - weitere Informationen zu den jeweiligen Objekten erhalten Sie unter den entsprechenden Themen.

ADO ermöglicht mit der Value-Eigenschaft das Zuweisen und Zurückgeben von Binärdaten variabler Länge.

Anmerkung Bei Parameter-Objekten liest ADO die Value-Eigenschaft lediglich einmal vom Provider. Enthält ein Befehl einen Parameter, dessen Value-Eigenschaft undefiniert ist, und erstellen Sie von diesem Befehl ein Recordset-Objekt, dann sollten Sie darauf achten, das Recordset-Objekt zu schließen, bevor Sie die Value-Eigenschaft abrufen. Andernfalls ist bei einigen Providern die Value-Eigenschaft möglicherweise leer und enthält nicht den richtigen Wert.

Bei neuen Field–Objekten, die zur Fields–Auflistung eines Record–Objekts hinzugefügt wurden, muss zunächst die Value–Eigenschaft gesetzt sein, bevor andere Field-Eigenschaften definiert werden können. Zuerst muss der Value–Eigenschaft ein bestimmter Wert zugewiesen und anschließend die Update–Methode der Fields–Auflistung aufgerufen werden. Anschließend kann der Zugriff auf andere Eigenschaften wie z. B. Type oder Attributes erfolgen.


Version-Eigenschaft (ADO)

Version-Eigenschaft

Gibt die ADO-Versionsnummer an.

Rückgabewert

Gibt einen Wert vom Datentyp String zurück, der die Version anzeigt.

Hinweise

Verwenden Sie die Version-Eigenschaft, um die Versionsnummer der ADO-Implementierung zurückzugeben.

Die Version des Providers steht als dynamische Eigenschaft in der Properties-Auflistung zur Verfügung.


Dynamische Eigenschaften von ADO

Dynamische Eigenschaften können den Properties-Auflistungen der Objekte Connection, Command oder Recordset hinzugefügt werden. Bei der Quelle für diese Eigenschaften handelt es sich entweder um einen Datenprovider, wie z. B. der OLE DB-Provider für SQL Server, oder um einen Serviceprovider, wie z. B. der Microsoft Cursordienst für OLE-DB. Weitere Informationen über eine bestimmte dynamische Eigenschaft finden Sie in der Dokumentation zum entsprechenden Datenprovider oder Serviceprovider.

Der Index dynamischer Eigenschaften von ADO stellt für jede dynamische Eigenschaft eines Standard-OLE DB-Providers einen Querverweis zwischen den ADO- und den OLE DB-Namen bereit.

Die folgenden dynamischen Eigenschaften sind von besonderem Interesse. Sie sind in den oben erwähnten Quellen ebenfalls dokumentiert. Spezielle Funktionen im Zusammenhang mit ADO sind in den unten aufgelisteten Hilfethemen von ADO dokumentiert.

Dynamische Eigenschaften von ADO - Zusammenfassung

Eigenschaft | Beschreibung
Optimize | Gibt an, ob über diesem Feld ein Index erstellt werden soll.
Prompt | Legt fest, ob der OLE DB-Provider den Benutzer nach Informationen für die Initialisierung fragen soll.
Reshape Name | Gibt einen Namen für das Recordset-Objekt an.
Resync Command | Gibt eine vom Benutzer zur Verfügung gestellte Befehlszeichenfolge an, die von der Resync-Methode zum Aktualisieren der Daten in der Tabelle verwendet wird, die in der dynamischen Eigenschaft Unique Table angegeben wurde.
Unique Table, Unique Schema, Unique Catalog | Unique Table - Gibt den Namen derjenigen Basistabelle an, in der Aktualisieren, Einfügen und Löschen erlaubt ist. Unique Schema - Gibt das Schema oder den Namen des Eigentümers der Tabelle an. Unique Catalog - Gibt den Katalog oder den Namen der Datenbank an, in dem/der die Tabelle enthalten ist.
Update Resync | Gibt an, ob der UpdateBatch-Methode eine Operation mit einer impliziten Resync-Methoden folgt, und, wenn ja, den Geltungsbereich dieser Operation.


Index dynamischer Eigenschaften von ADO

Datenprovider, Serviceprovider und Servicekomponenten können den Properties-Auflistungen der nicht geöffneten Connection- und Recordset-Objekte dynamische Eigenschaften hinzufügen. Ein vorgegebener Provider kann auch Eigenschaften einfügen, wenn diese Objekte geöffnet sind. Einige dieser Eigenschaften sind im Abschnitt Dynamische Eigenschaften von ADO aufgelistet. Im Abschnitt Verwenden von Providern mit ADO sind unter den speziellen Providern mehrere dieser Eigenschaften aufgelistet.

In der Tabelle unten finden Sie für jede dynamische Eigenschaft eines Standard-OLE DB-Providers eine Zuordnung von ADO- und OLE DB-Namen. Von Ihren Providern werden eventuell mehr Eigenschaften als die hier aufgeführten hinzugefügt. Spezielle Informationen über providerspezifische dynamische Eigenschaften finden Sie in der entsprechenden Dokumentation des Providers.

Die OLE DB Programmer's Reference verweist mit dem Begriff "Beschreibung" auf Namen von ADO-Eigenschaften. Weitere Informationen zu diesen Standardeigenschaften finden Sie in der OLE DB Programmer's Reference. Suchen Sie den Namen der OLE DB-Eigenschaft im Index, oder schlagen Sie unter den folgenden Themen nach:

  • Anhang C: OLE DB-Eigenschaften

  • Unterstützte Eigenschaften für den Cursordienst

  • Unterstützte Eigenschaften für den Persistence Provider

  • Unterstützte OLE DB-Eigenschaften für den Remoting Provider

Hinweise

Beachten Sie die in diesem Querverweis verwendeten Zahlen:

(1) Diese Eigenschaft ist ein boolesches Attribut. Es zeigt an, ob die benannte Schnittstelle verwendet werden soll. Falls vorhanden, wird der Name der entsprechenden OLE DB-Eigenschaft aufgeführt.

(2) Die "mit einem Lesezeichen versehbare" ADO-Eigenschaft wird intern erzeugt, um eine Rückwärtskompatibilität zu erhalten. Die Eigenschaft wird der OLE DB-Eigenschaft DBPROP_IROWSETLOCATE zugeordnet. Dies ist die Eigenschaft, welche der ADO-Eigenschaft IRowsetLocate entspricht.

(3) Der ADO-Eigenschaftenname "Hidden Columns" lautet anders als die OLE DB-Eigenschaftennamenbeschreibung "Hidden Columns Count".

(4) Trifft nicht zu.

Dynamische Verbindungseigenschaften

ADO-Eigenschaftenname OLE DB-Eigenschaftenname
Active Sessions

DBPROP_ACTIVESESSIONS

Asynchable Abort

DBPROP_ASYNCTXNABORT

Asynchable Commit

DBPROP_ASYNCTNXCOMMIT

Autocommit Isolation Levels

DBPROP_SESS_AUTOCOMMITISOLEVELS

Catalog Location

DBPROP_CATALOGLOCATION

Catalog Term

DBPROP_CATALOGTERM

Column Definition

DBPROP_COLUMNDEFINITION

Connect Timeout

DBPROP_INIT_TIMEOUT

Current Catalog

DBPROP_CURRENTCATALOG

Data Source

DBPROP_INIT_DATASOURCE

Data Source Name

DBPROP_DATASOURCENAME

Data Source Object Threading Model

DBPROP_DSOTHREADMODEL

DBMS Name

DBPROP_DBMSNAME

DBMS Version

DBPROP_DBMSVER

Extended Properties

DBPROP_INIT_PROVIDERSTRING

GROUP BY Support

DBPROP_GROUPBY

Heterogeneous Table Support

DBPROP_HETEROGENEOUSTABLES

Identifier Case Sensitivity

DBPROP_IDENTIFIERCASE

Initial Catalog

DBPROP_INIT_CATALOG

Isolation Levels

DBPROP_SUPPORTEDTXNISOLEVELS

Isolation Retention

DBPROP_SUPPORTEDTXNISORETAIN

Locale Identifier

DBPROP_INIT_LCID

Location

DBPROP_INIT_LOCATION

Maximum Index Size

DBPROP_MAXINDEXSIZE

Maximum Row Size

DBPROP_MAXROWSIZE

Maximum Row Size Includes BLOB

DBPROP_MAXROWSIZEINCLUDESBLOB

Maximum Tables in SELECT

DBPROP_MAXTABLESINSELECT

Mode

DBPROP_INIT_MODE

Multiple Parameter Sets

DBPROP_MULTIPLEPARAMSETS

Multiple Results

DBPROP_MULTIPLERESULTS

Multiple Storage Objects

DBPROP_MULTIPLESTORAGEOBJECTS

Multi-Table Update

DBPROP_MULTITABLEUPDATE

NULL Collation Order

DBPROP_NULLCOLLATION

NULL Concatenation Behavior

DBPROP_CONCATNULLBEHAVIOR

OLE DB Services

DBPROP_INIT_OLEDBSERVICES

OLE DB Version

DBPROP_PROVIDEROLEDBVER

OLE Object Support

DBPROP_OLEOBJECTS

Open Rowset Support

DBPROP_OPENROWSETSUPPORT

ORDER BY Columns in Select List

DBPROP_ORDERBYCOLUMNSINSELECT

Output Parameter Availability

DBPROP_OUTPUTPARAMETERAVAILABILITY

Pass By Ref Accessors

DBPROP_BYREFACCESSORS

Password

DBPROP_AUTH_PASSWORD

Persist Security Info

DBPROP_AUTH_PERSIST_SENSITIVE_AUTHINFO

Persistent ID Type

DBPROP_PERSISTENTIDTYPE

Prepare Abort Behavior

DBPROP_PREPAREABORTBEHAVIOR

Prepare Commit Behavior

DBPROP_PREPARECOMMITBEHAVIOR

Procedure Term

DBPROP_PROCEDURETERM

Prompt

DBPROP_INIT_PROMPT

Provider Friendly Name

DBPROP_PROVIDERFRIENDLYNAME

Provider Name

DBPROP_PROVIDERFILENAME

Provider Version

DBPROP_PROVIDERVER

Read-Only Data Source

DBPROP_DATASOURCEREADONLY

Rowset Conversions on Command

DBPROP_ROWSETCONVERSIONSONCOMMAND

Schema Term

DBPROP_SCHEMATERM

Schema Usage

DBPROP_SCHEMAUSAGE

SQL Support

DBPROP_SQLSUPPORT

Structured Storage

DBPROP_STRUCTUREDSTORAGE

Subquery Support

DBPROP_SUBQUERIES

Table Term

DBPROP_TABLETERM

Transaction DDL

DBPROP_SUPPORTEDTXNDDL

User ID

DBPROP_AUTH_USERID

User Name

DBPROP_USERNAME

Window Handle

DBPROP_INIT_HWND

Dynamische "Recordset"-Eigenschaften

ADO-Eigenschaftenname OLE DB-Eigenschaftenname
IAccessor

DBPROP_IACCESSOR (1)

IChapteredRowset

(1)

IColumnsInfo

DBPROP_ICOLUMNSINFO (1)

IColumnsRowset

DBPROP_ICOLUMNSROWSET (1)

IConnectionPointContainer

DBPROP_ICONNECTIONPOINTCONTAINER (1)

IConvertType

(1)

ILockBytes

DBPROP_ILOCKBYTES (1)

IRowset

DBPROP_IROWSET (1)

IDBAsynchStatus

DBPROP_IDBASYNCHSTATUS (1)

IParentRowset

(1)

IRowsetChange

DBPROP_IROWSETCHANGE (1)

IRowsetExactScroll

(1)

IRowsetFind

DBPROP_IROWSETFIND (1)

IRowsetIdentity

DBPROP_IROWSETIDENTITY (1)

IRowsetInfo

DBPROP_IROWSETINFO (1)

IRowsetLocate

DBPROP_IROWSETLOCATE (1)

IRowsetRefresh

DBPROP_IROWSETREFRESH (1)

IRowsetResynch

(1)

IRowsetScroll

DBPROP_IROWSETSCROLL (1)

IRowsetUpdate

DBPROP_IROWSETUPDATE (1)

IRowsetView

DBPROP_IROWSETVIEW (1)

IRowsetIndex

DBPROP_IROWSETINDEX (1)

ISequentialStream

DBPROP_ISEQUENTIALSTREAM (1)

IStorage

DBPROP_ISTORAGE (1)

IStream

DBPROP_ISTREAM (1)

ISupportErrorInfo

DBPROP_ISUPPORTERRORINFO (1)

Access Order

DBPROP_ACCESSORDER

Append-Only Rowset

DBPROP_APPENDONLY

Asynchronous Rowset Processing

DBPROP_ROWSET_ASYNCH

Auto Recalc

DBPROP_ADC_AUTORECALC

Background Fetch Size

DBPROP_ASYNCHFETCHSIZE

Background Thread Priority

DBPROP_ASYNCHTHREADPRIORITY

Batch Size

DBPROP_ADC_BATCHSIZE

Blocking Storage Objects

DBPROP_BLOCKINGSTORAGEOBJECTS

Bookmark Type

DBPROP_BOOKMARKTYPE

Bookmarkable

DBPROP_IROWSETLOCATE (2)

Bookmarks Ordered

DBPROP_ORDEREDBOOKMARKS

Cache Child Rows

DBPROP_ADC_CACHECHILDROWS

Cache Deferred Columns

DBPROP_CACHEDEFERRED

Change Inserted Rows

DBPROP_CHANGEINSERTEDROWS

Column Privileges

DBPROP_COLUMNRESTRICT

Column Set Notification

DBPROP_NOTIFYCOLUMNSET

Column Writable

DBPROP_MAYWRITECOLUMN

Command Time Out

DBPROP_COMMANDTIMEOUT

Cursor Engine Version

DBPROP_ADC_CEVER

Defer Column

DBPROP_DEFERRED

Delay Storage Object Updates

DBPROP_DELAYSTORAGEOBJECTS

Fetch Backwards

DBPROP_CANFETCHBACKWARDS

Filter Operations

DBPROP_FILTERCOMPAREOPS

Find Operations

DBPROP_FINDCOMPAREOPS

Hidden Columns (Count)

DBPROP_HIDDENCOLUMNS (3)

Hold Rows

DBPROP_CANHOLDROWS

Immobile Rows

DBPROP_IMMOBILEROWS

Initial Fetch Size

DBPROP_ASYNCHPREFETCHSIZE

Literal Bookmarks

DBPROP_LITERALBOOKMARKS

Literal Row Identity

DBPROP_LITERALIDENTITY

Maintain Change Status

DBPROP_ADC_MAINTAINCHANGESTATUS

Maximum Open Rows

DBPROP_MAXOPENROWS

Maximum Pending Rows

DBPROP_MAXPENDINGROWS

Maximum Rows

DBPROP_MAXROWS

Memory Usage

DBPROP_MEMORYUSAGE

Notification Granularity

DBPROP_NOTIFICATIONGRANULARITY

Notification Phases

DBPROP_NOTIFICATIONPHASES

Objects Transacted

DBPROP_TRANSACTEDOBJECT

Others' Changes Visible

DBPROP_OTHERUPDATEDELETE

Others' Inserts Visible

DBPROP_OTHERINSERT

Own Changes Visible

DBPROP_OWNUPDATEDELETE

Own Inserts Visible

DBPROP_OWNINSERT

Preserve on Abort

DBPROP_ABORTPRESERVE

Preserve on Commit

DBPROP_COMMITPRESERVE

Private1

(4)

Quick Restart

DBPROP_QUICKRESTART

Reentrant Events

DBPROP_REENTRANTEVENTS

Remove Deleted Rows

DBPROP_REMOVEDELETED

Report Multiple Changes

DBPROP_REPORTMULTIPLECHANGES

Reshape Name

DBPROP_ADC_RESHAPENAME

Resync Command

DBPROP_ADC_CUSTOMRESYNCH

Return Pending Inserts

DBPROP_RETURNPENDINGINSERTS

Row Delete Notification

DBPROP_NOTIFYROWDELETE

Row First Change Notification

DBPROP_NOTIFYROWFIRSTCHANGE

Row Insert Notification

DBPROP_NOTIFYROWINSERT

Row Privileges

DBPROP_ROWRESTRICT

Row Resynchronization Notification

DBPROP_NOTIFYROWRESYNCH

Row Threading Model

DBPROP_ROWTHREADMODEL

Row Undo Change Notification

DBPROP_NOTIFYROWUNDOCHANGE

Row Undo Delete Notification

DBPROP_NOTIFYROWUNDODELETE

Row Undo Insert Notification

DBPROP_NOTIFYROWUNDOINSERT

Row Update Notification

DBPROP_NOTIFYROWUPDATE

Rowset Fetch Position Change Notification

DBPROP_NOTIFYROWSETFETCHPOSITIONCHANGE

Rowset Release Notification

DBPROP_NOTIFYROWSETRELEASE

Scroll Backwards

DBPROP_CANSCROLLBACKWARDS

Server Cursor

DBPROP_SERVERCURSOR

Skip Deleted Bookmarks

DBPROP_BOOKMARKSKIPPED

Strong Row Identity

DBPROP_STRONGIDENTITY

Unique Catalog

DBPROP_ADC_UNIQUECATALOG

Unique Rows

DBPROP_UNIQUEROWS

Unique Schema

DBPROP_ADC_UNIQUESCHEMA

Unique Table

DBPROP_ADC_UNIQUETABLE

Updatability

DBPROP_UPDATABILITY

Update Criteria

DBPROP_ADC_UPDATECRITERIA

Update Resync

DBPROP_ADC_UPDATERESYNC

Use Bookmarks

DBPROP_BOOKMARKS


Optimize-Eigenschaft - Dynamisch (ADO)

Gibt an, ob über einem Feld ein Index erstellt werden soll.

Einstellungen und Rückgabewerte

Legt einen booleschen Wert fest oder gibt diesen zurück, durch den angezeigt wird, ob ein Index erstellt werden soll.

Hinweise

Ein Index kann die Leistung von Operationen verbessern, die Werte in einem Recordset-Objekt suchen oder sortieren. Der Index ist eine ADO-interne Funktion. Sie können nicht explizit auf ihn zugreifen oder in der Anwendung benutzen.

Um einen Index über einem Feld zu erstellen, setzen Sie die Optimize-Eigenschaft auf den Wert True. Um den Index zu löschen, setzen Sie diese Eigenschaft auf False.

Bei Optimize handelt es sich um eine dynamische Eigenschaft, die an die Properties-Auflistung des Field-Objekts angehängt wird, wenn die CursorLocation-Eigenschaft auf adUseClient gesetzt wird.

Verwendung

Dim rs As New Recordset
Dim fld As Field
rs.CursorLocation = adUseClient      'Enable index creation
rs.Fields.Append "Field1", adChar, 35, adFldIsNullable
rs.Open
Set fld = rs.Fields(0)
fld.Properties("Optimize") = True    'Create an index
fld.Properties("Optimize") = False   'Delete an index


Prompt-Eigenschaft - Dynamisch (ADO)

Legt fest, ob der OLE DB-Provider den Benutzer nach Informationen für die Initialisierung fragen soll.

Einstellungen und Rückgabewerte

Legt einen ConnectPromptEnum-Wert fest und gibt diesen zurück.

Hinweise

Prompt ist eine dynamische Eigenschaft, die vom OLE DB-Provider an die Properties-Auflistung des Connection-Objekts angehängt werden kann. Um nach Informationen für die Initialisierung zu fragen, wird dem Benutzer vom OLE DB-Provider normalerweise ein Dialogfeld angezeigt.

Dynamische Eigenschaften eines Connection-Objekts gehen verloren, wenn die Connection geschlossen wird. Um einen von den Voreinstellungen abweichenden Wert zu verwenden, muss die Prompt-Eigenschaft vor dem Wiederherstellen der Connection zurückgesetzt werden.

Anmerkung Geben Sie in Situationen, in denen der Benutzer nicht auf den Dialog im Dialogfeld antworten kann, nicht an, dass der Provider den Benutzer zu einer Eingabe auffordern soll. So kann der Benutzer z. B. nicht antworten, wenn die Anwendung auf einem Serversystem statt auf dem Client des Benutzers ausgeführt wird oder wenn die Anwendung auf einem System ausgeführt wird, an dem kein Benutzer angemeldet ist. In diesen Fällen wartet die Anwendung unendlich lange auf eine Antwort und reagiert scheinbar nicht mehr.

Verwendung

Set cn = New Connection
cn.Provider = "SQLOLEDB"
cn.Properties("Prompt") = adPromptNever    ' do not prompt the user


Reshape Name-Eigenschaft - Dynamisch (ADO)

Gibt einen Namen für das Recordset-Objekt an.

Rückgabewerte

Gibt einen Wert vom Datentyp String zurück, der den Namen des Recordset-Objekts enthält.

Hinweise

Namen bleiben so lange bestehen, wie die Verbindung besteht, oder bis das Recordset-Objekt geschlossen wird.

Die Reshape Name-Eigenschaft wird hauptsächlich mit dem Restrukturierungs-Feature des Microsoft Data Shaping Service für OLE DB-Serviceprovider verwendet. Namen müssen eindeutig sein, damit sie an der Restrukturierung teilnehmen können.

Diese Eigenschaft ist schreibgeschützt, kann aber bei der Erstellung eines Recordset-Objekts indirekt festgelegt werden. Wenn beispielsweise eine Klausel eines SHAPE-Befehls ein Recordset-Objekt erstellt und ihm mit dem Schlüsselwort "AS" einen Aliasnamen gibt, dann wird der Alias der Reshape Name-Eigenschaft zugewiesen. Wenn kein Alias deklariert wird oder ein Konflikt des Alias mit einem bereits vorhandenen Namen auftritt, dann wird der Reshape Name-Eigenschaft ein Name zugewiesen, der von dem Data Shaping Service erzeugt wird.

Verwenden Sie die Reshape Name-Eigenschaft, wenn Sie in einem SHAPE-Befehl auf ein Recordset-Objekt Bezug nehmen wollen, oder wenn Sie seinen Namen nicht kennen, da er vom Data Shaping Service erzeugt wurde. In diesem Fall könnten Sie einen SHAPE-Befehl erzeugen, indem Sie die Zeichenfolge, die von der Reshape Name-Eigenschaft zurückgegeben wird, links und rechts mit dem Befehl verketten.

Bei Reshape Name handelt es sich um eine dynamische Eigenschaft, die an die Properties-Auflistung des Recordset-Objekts angehängt wird, wenn die CursorLocation-Eigenschaft auf adUseClient gesetzt wird.


Resync Command-Eigenschaft - Dynamisch (ADO)

Gibt eine vom Benutzer zur Verfügung gestellte Befehlszeichenfolge an, die von der Resync-Methode zum Aktualisieren der Daten in der Tabelle ausgegeben wird, die in der dynamischen Eigenschaft Unique Table angegeben wurde.

Einstellungen und Rückgabewerte

Legt einen Wert vom Datentyp String fest oder gibt diesen Wert zurück, bei dem es sich um eine Befehlszeichenfolge handelt.

Hinweise

Das Recordset-Objekt ist das Ergebnis einer JOIN-Operation, die über mehrere Basistabellen ausgeführt wurde. Welche Zeilen betroffen sind, hängt von dem AffectRecords-Parameter der Resync-Methode ab. Wenn die Unique Table- und Resync Command-Eigenschaften nicht festgelegt sind, wird die Resync-Standardmethode ausgeführt.

Die Befehlszeichenfolge der Resync Command-Eigenschaft ist ein parametrisierter Befehl oder eine gespeicherte Prozedur, welche die zu aktualisierende Zeile eindeutig identifiziert und eine einzelne Zeile zurückgibt. Diese enthält dieselbe Anzahl und Reihenfolge der Spalten wie die zu aktualisierende Zeile. Die Befehlszeichenfolge enthält einen Parameter für jede Primärschlüsselspalte in der Unique Table. Anderenfalls wird ein Laufzeitfehler zurückgegeben. Die Parameter werden automatisch mit Primärschlüsselwerten aus der zu aktualisierenden Zeile ausgefüllt.

Im Folgenden finden Sie zwei auf SQL basierende Beispiele:

1) Das Recordset wird durch einen Befehl definiert:

SELECT * FROM Customers JOIN Orders ON
    Customers.CustomerID = Orders.CustomerID
    WHERE city = ‘Seattle‚
    ORDER BY CustomerID

Die Resync Command-Eigenschaft ist wie folgt festgelegt:

"SELECT * FROM
    (SELECT * FROM Customers JOIN Orders
    ON Customers.CustomerID = Orders.CustomerID
    city = ‘Seattle‚ ORDER BY CustomerID)
WHERE Orders.OrderID = ?"

Die Unique Table ist Orders, und ihr Primärschlüssel, OrderID, ist parametrisiert. Die Subselektion bietet einen einfachen Weg, in einem Programm sicherzustellen, dass die gleiche Anzahl und Reihenfolge der Spalten zurückgegeben wird wie durch den ursprünglichen Befehl.

2) Das Recordset wird durch eine gespeicherte Prozedur definiert:

CREATE PROC Custorders @CustomerID char(5) AS
SELECT * FROM Customers JOIN Orders ON
Customers.CustomerID = Orders.CustomerID
WHERE Customers.CustomerID = @CustomerID

Die Resync-Methode sollte die folgende gespeicherte Prozedur ausführen:

CREATE PROC CustordersResync @ordid int AS
SELECT * FROM Customers JOIN Orders ON
Customers.CustomerID = Orders.CustomerID
WHERE Orders.ordid  = @ordid

Die Resync Command-Eigenschaft ist wie folgt festgelegt:

"{call CustordersResync (?)}"

Wieder ist Orders die Unique Table, und ihr Primärschlüssel, OrderID, ist parametrisiert.

Bei Resync Command handelt es sich um eine dynamische Eigenschaft, die an die Properties-Auflistung des Recordset-Objekts angehängt wird, wenn die CursorLocation-Eigenschaft auf adUseClient gesetzt wird.


Unique Table-, Unique Schema-, Unique Catalog-Eigenschaften - Dynamisch (ADO)

Ermöglicht Ihnen die genaue Kontrolle über Änderungen an einer bestimmten Basistabelle in einem Recordset-Objekt, die durch eine JOIN-Operation über mehrere Basistabellen gebildet wurde.

  • Unique Table gibt den Namen derjenigen Basistabelle an, in der Aktualisieren, Einfügen und Löschen erlaubt sind.

  • Unique Schema gibt das Schema oder den Namen des Eigentümers der Tabelle an.

  • Unique Catalog gibt den Katalog oder den Namen der Datenbank an, in dem/der die Tabelle enthalten ist.

Einstellungen und Rückgabewerte

Legt einen Wert vom Datentyp String fest oder gibt diesen Wert zurück, bei dem es sich um den Namen einer Tabelle, eines Schemas oder eines Katalogs handelt.

Hinweise

Die gewünschte Basistabelle wird durch ihren Katalog-, Schema- und Tabellennamen eindeutig identifiziert. Wenn die Unique Table-Eigenschaft festgelegt wurde, werden die Werte der Unique Schema- oder Unique Catalog-Eigenschaften zum Auffinden der Basistabelle verwendet. Es ist sinnvoll, aber nicht unbedingt erforderlich, dass entweder die Unique Schema- oder die Unique Catalog-Eigenschaft oder beide Eigenschaften festgelegt werden, bevor die Unique Table-Eigenschaft festgelegt wird.

Der Primärschlüssel der Unique Table wird als Primärschlüssel des gesamten Recordset-Objekts behandelt. Dieser Schlüssel wird für alle Methoden verwendet, die einen Primärschlüssel erfordern.

Solange Unique Table gilt, wirkt die Delete-Methode nur auf die benannte Tabelle. Die AddNew-, Resync-, Update- und UpdateBatch-Methoden beeinflussen alle entsprechenden zugrunde liegenden Basistabellen des Recordset.

Unique Table muss vor dem Ausführen von benutzerdefinierten Neusynchronisierungen angegeben werden. Falls Unique Table nicht angegeben wurde, hat die Resync Command-Eigenschaft keine Wirkung.

Wenn eine eindeutige Basistabelle nicht gefunden werden kann, hat dies einen Laufzeitfehler zur Folge.

Diese dynamischen Eigenschaften werden alle an die Properties-Auflistung des Recordset-Objekts angehängt, wenn die CursorLocation-Eigenschaft auf adUseClient gesetzt wird.


Update Resync-Eigenschaft - Dynamisch (ADO)

Gibt an, ob die UpdateBatch-Methode von einer impliziten Resync-Methodenoperation gefolgt ist, und wenn ja, den Umfang dieser Operation.

Einstellungen und Rückgabewerte

Legt einen oder mehrere der ADCPROP_UPDATERESYNC_ENUM-Werte fest oder gibt diese zurück.

Hinweise

Diese Eigenschaft ist nur anwendbar, wenn die dynamische Eigenschaft Unique Table festgelegt wurde.

Die folgenden Kombinationen von ADCPROP_UPDATERESYNC_ENUM-Werten können gleichzeitig verwendet werden:

  • adResyncAutoIncrement und adResyncConflicts

  • adResyncAutoIncrement und adResyncInserts

  • adResyncAll, adResyncUpdates, adResyncInserts und adResyncConflicts

Die Konstante adResyncConflicts speichert die Resync-Werte als zugrunde liegende Werte, überschreibt aber keine anstehenden Änderungen.

Bei Update Resync handelt es sich um eine dynamische Eigenschaft, die an die Properties-Auflistung des Recordset-Objekts angehängt wird, wenn die CursorLocation-Eigenschaft auf adUseClient gesetzt wird.


ADO-Methoden

Zusammenfassung der Methoden für ADO

Methode | Beschreibung
AddNew | Erstellen eines neuen Datensatzes für ein aktualisierbares Recordset-Objekt
Append | Hängt ein Objekt an eine Auflistung an. Wenn es sich um eine Fields-Auflistung handelt, kann ein neues Field-Objekt erstellt werden, bevor es an die Auflistung angehängt wird
AppendChunk | Anhängen von Daten an ein Field- oder Parameter-Objekt, das langen Text oder Binärdaten enthält
BeginTrans, CommitTrans und RollbackTrans | Verwalten von Transaktionsverarbeitung in einem Connection-Objekt wie folgt: BeginTrans – Beginnen einer neuen Transaktion. CommitTrans – Speichern aller Änderungen und Beenden der aktuellen Transaktion. Diese Transaktionsmethode kann auch eine neue Transaktion starten. RollbackTrans – Abbrechen aller Änderungen und Beenden der aktuellen Transaktion. Diese Transaktionsmethode kann auch eine neue Transaktion starten.
Cancel (ADO) | Abbrechen der Ausführung eines anstehenden, asynchronen Methodenaufrufs
Cancel (RDS) | Abbrechen der Ausführung eines anstehenden, asynchronen Methodenaufrufs
CancelBatch | Bricht eine anstehende Stapelaktualisierung ab.
CancelUpdate (ADO) | Abbrechen vorgenommener Änderungen in der aktuellen oder neuen Zeile eines Recordset-Objekts oder der Fields-Auflistung eines Recordset-Objekts vor Aufrufen der Update-Methode
CancelUpdate (RDS) | Abbrechen vorgenommener Änderungen der aktuellen oder neuen Zeile eines Recordset-Objekts
Clear | Entfernt alle Error-Objekte aus der Errors-Auflistung.
Clone | Erstellen eines Duplikats eines Recordset-Objekts aus einem vorhandenen Recordset-Objekt; Optional können Sie den Schreibschutz für das Duplikat festlegen.
Close | Schließt ein geöffnetes Objekt sowie alle abhängigen Objekte.
CompareBookmarks | Vergleicht zwei Lesezeichen und gibt eine Anzeige ihrer relativen Werte zurück.
ConvertToString (RDS) | Konvertiert ein Recordset in eine MIME-Zeichenfolge, die die Recordset-Daten darstellt.
CopyRecord | Kopiert eine Datei oder ein Verzeichnis und seine Inhalte zu einem anderen Speicherplatz.
CopyTo | Kopieren einer angegebenen Anzahl von Zeichen oder Bytes eines Stream (vom Typ abhängig) in ein anderes Stream-Objekt
CreateObject (RDS) | Erstellen des Proxys für das Zielgeschäftsobjekt und Rückgabe eines Zeigers auf das Zielgeschäftsobjekt
CreateParameter | Erstellen eines neuen Parameter-Objekts mit den angegebenen Eigenschaften
CreateRecordset (RDS) | Erstellen eines leeren, nicht verbundenen Recordset-Objekts
Delete (ADO Parameters Collection) | Löschen eines Objekts aus der Parameters-Auflistung
Delete (ADO Parameters Collection) | Löschen eines Objekts aus der Fields-Auflistung
Delete (ADO Recordset) | Löscht den aktuellen Datensatz oder eine Gruppe von Datensätzen.
DeleteRecord | Löscht eine Datei oder ein Verzeichnis und alle seine Unterverzeichnisse.
Execute (ADO Command) | Ausführen der Abfrage, der SQL-Anweisung oder der gespeicherten Prozedur, die in der CommandText-Eigenschaft angegeben wurde
Execute (ADO Connection) | Ausführen der angegebenen Abfrage, der SQL-Anweisung, der gespeicherten Prozedur oder des providerspezifischen Textes
Find | Suchen der Zeile in einem Recordset-Objekt, die den angegebenen Kriterien entspricht
Flush | Veranlasst den Inhalt des Stream, im ADO-Puffer des zugrunde liegenden Objekts zu verbleiben, mit dem der Stream verbunden ist.
GetChildren | Gibt ein Recordset zurück, dessen Zeilen die Dateien und Unterverzeichnisse im Verzeichnis darstellen, das durch dieses Record–Objekt dargestellt wird
GetChunk | Rückgabe des gesamten Inhalts oder einer Teilmenge des Inhalts eines Field-Objekts, das langen Text oder Binärdaten enthält.
GetRows | Abrufen mehrerer Datensätze eines Recordset-Objekts in ein Array
GetString | Rückgabe des Recordset-Objekts als eine Zeichenfolge
LoadFromFile | Laden des Inhalts einer vorhandenen Datei in einen Stream
Move | Verschieben der Position des aktuellen Datensatzes in einem Recordset-Objekt
MoveFirst, MoveLast, MoveNext, and MovePrevious (ADO) | Wechseln zum ersten, letzten, nächsten oder vorherigen Datensatz in einem angegebenen Recordset-Objekt und Definieren dieses Datensatzes als den aktuellen Datensatz
MoveFirst, MoveLast, MoveNext, MovePrevious (RDS) | Wechseln zum ersten, letzten, nächsten oder vorherigen Datensatz in einem angegebenen Recordset-Objekt
MoveRecord | Verschiebt eine Datei oder ein Verzeichnis und seine Inhalte zu einem anderen Speicherplatz.
NextRecordset | Löschen des aktuellen Recordset-Objekts und Rückgabe des nächsten Recordsets, wobei eine Reihe von Befehlen ausgeführt wird
Open (ADO Connection) | Öffnen einer Verbindung mit einer Datenquelle
Open (ADO Record) | Öffnen eines bestehendes Record–Objekts oder Erstellen einer neuen Datei oder eines neuen Verzeichnisses.
Open (ADO Recordset) | Öffnen eines Cursors
Open (ADO Stream) | Öffnen eines Stream-Objekts, um Datenströme binärer oder Textdateien zu verändern
OpenSchema | Anfordern von Informationen über das Datenbankschema vom Provider
Query (RDS) | Verwenden einer gültigen SQL-Abfragezeichenfolge, um ein Recordset-Objekt zurückzugeben
Read | Lesen einer angegebenen Anzahl von Bytes aus einem Stream-Objekt
ReadText | Lesen einer angegebenen Anzahl von Zeichen aus einem Text eines Stream-Objekts
Refresh (ADO) | Aktualisierung der Objekte in einer Auflistung, um Objekte aufzunehmen, die vom Provider erhältlich und für ihn spezifisch sind
Refresh (RDS) | Durchführen einer erneuten Abfrage der in der Connect-Eigenschaft angegebenen Datenquelle und Aktualisieren der Abfrageergebnisse
Requery | Aktualisieren der Daten in einem Recordset-Objekt, indem die Abfrage, auf der das Objekt basiert, erneut ausgeführt wird
Reset (RDS) | Durchführen des Sortierens oder Filterns in einem clientseitigen Recordset abhängig von den angegebenen Sortier- und Filtereigenschaften
Resync | Aktualisieren der Daten im aktuellen Recordset-Objekt oder in der Fields-Auflistung eines Record-Objekts aus der zugrunde liegenden Datenbank
Save | Speichern des Recordsets in einer Datei oder einem Stream-Objekt
SaveToFile | Speichern des binären Inhalts eines Stream in einer Datei
Seek | Durchsuchen des Indexes eines Recordset-Objekts, um schnell die Zeile zu finden, die den angegebenen Werten entspricht, und Verändern der aktuellen Zeilenposition entsprechend
SetEOS | Festlegen der Position, die das Ende des Datenstroms darstellt
SkipLine | Überspringen einer vollständigen Zeile, wenn ein Textstrom gelesen wird
SubmitChanges (RDS) | Übermitteln anstehender Änderungen des lokal zwischengespeicherten, aktualisierbaren Recordset-Objekts zu der Datenquelle, die in der Connect-Eigenschaft angegeben wurde
Supports | Bestimmen, ob ein angegebenes Recordset-Objekt einen bestimmten Funktionstyp unterstützt
Update | Speichern vorgenommener Änderungen der aktuellen Zeile eines Recordset-Objekts oder der Fields-Auflistung eines Record-Objekts
UpdateBatch | Speichern aller anstehenden Stapelaktualisierungen in der Datenbank
Write | Schreiben binärer Daten in ein Stream-Objekt
WriteText | Schreiben einer angegebenen Textzeichenfolge in ein Stream-Objekt


AddNew-Methode (ADO)

AddNew-Methode

Erstellt einen neuen Datensatz für ein aktualisierbares Recordset-Objekt.

Syntax

recordset.AddNew FieldList, Values

Parameter

recordset Ein Recordset-Objekt.

FieldList Optional. Ein einzelner Name oder ein Array mit Namen oder Ordinalpositionen der Felder in dem neuen Datensatz.

Values Optional. Ein einzelner Wert oder ein Array mit Werten für die Felder im neuen Datensatz. Wenn Fieldlist ein Array ist, muss Values ebenfalls ein Array (mit der gleichen Anzahl an Elementen) sein; andernfalls tritt ein Fehler auf. Die Reihenfolge der Feldnamen muss der Reihenfolge der Feldwerte in jedem Array entsprechen.

Hinweise

Verwenden Sie die AddNew-Methode, um einen neuen Datensatz zu erstellen und zu initialisieren. Verwenden Sie die Supports-Methode zusammen mit adAddNew (ein CursorOptionEnum-Wert), um zu überprüfen, ob Sie Datensätze zum aktuellen Recordset-Objekt hinzufügen können.

Nachdem Sie die AddNew-Methode aufgerufen haben, wird der neue Datensatz zum aktuellen Datensatz und bleibt aktuell, nachdem Sie die Update-Methode aufgerufen haben. Wenn das Recordset-Objekt Lesezeichen nicht unterstützt, ist der Zugriff auf den neuen Datensatz eventuell nicht möglich, sobald zu einem anderen Datensatz gewechselt wurde. Abhängig vom verwendeten Cursortyp ist unter Umständen ein Aufruf der Requery-Methode erforderlich, um einen Zugriff auf den neuen Datensatz zu ermöglichen.

Wenn Sie AddNew aufrufen, während Sie den aktuellen Datensatz bearbeiten oder einen neuen Datensatz hinzufügen, ruft ADO die Update-Methode auf, um alle Änderungen zu speichern, und erstellt dann den neuen Datensatz.

Das Verhalten der AddNew-Methode hängt vom Aktualisierungsmodus des Recordset-Objekts ab und davon, ob Sie die Fieldlist- und Values-Argumente übergeben haben.

Im Modus für sofortige Aktualisierung, in dem der Provider Änderungen sofort in die zugrunde liegende Datenquelle schreibt, sobald Sie die Update-Methode aufrufen, legt das Aufrufen der AddNew-Methode ohne Argumente die EditMode-Eigenschaft auf adEditAdd (ein EditModeEnum-Wert) fest. Der Provider speichert alle Feldwertänderungen lokal im Cache. Das Aufrufen der Update-Methode überträgt den neuen Datensatz in die Datenbank und setzt die EditMode-Eigenschaft auf adEditNone (ein EditModeEnum-Wert) zurück. Wenn Sie die Fieldlist- und Values-Argumente übergeben, überträgt ADO den neuen Datensatz sofort in die Datenbank (ein Aufruf von Update ist nicht erforderlich); der EditMode-Eigenschaftswert ändert sich dabei nicht (adEditNone).

Im Stapelaktualisierungsmodus (in dem der Provider mehrere Änderungen im Cache speichert und sie nur dann in die zugrunde liegende Datenquelle schreibt, wenn Sie die UpdateBatch-Methode aufrufen) legt das Aufrufen der AddNew-Methode ohne Argumente die EditMode-Eigenschaft auf adEditAdd fest. Der Provider speichert alle Feldwertänderungen lokal im Cache. Das Aufrufen der Update-Methode fügt den neuen Datensatz zum aktuellen Recordset hinzu und setzt die EditMode-Eigenschaft auf adEditNone zurück. Der Provider überträgt die Änderungen zu der zugrunde liegenden Datenbank jedoch erst dann, wenn Sie die UpdateBatch-Methode aufrufen. Wenn Sie die Fieldlist- und Values-Argumente übergeben, übergibt ADO den neuen Datensatz an den Provider zum Speichern in einem Cache. Sie müssen die UpdateBatch-Methode aufrufen, um den neuen Datensatz an die zugrunde liegende Datenbank zu übergeben.

Wenn die dynamische Eigenschaft Unique Table festgelegt ist und das Recordset-Objekt das Ergebnis einer ausgeführten JOIN-Operation auf mehreren Tabellen ist, können durch die AddNew-Methode nur Felder in die Tabelle eingefügt werden, die in der Unique Table-Eigenschaft genannt sind.


Append-Methode (ADO)

Append-Methode

Hängt ein Objekt an eine Auflistung an. Wenn es sich um eine Fields-Auflistung handelt, kann ein neues Field-Objekt erstellt werden, bevor es an die Auflistung angehängt wird.

Syntax

collection.Append object

fields.Append Name, Type, DefinedSize, Attrib, FieldValue

Parameter

collection Ein Auflistungsobjekt.

fields Ein Fields-Auflistungsobjekt.

object Eine Objektvariable, die das anzuhängende Objekt darstellt.

Name Ein Wert vom Datentyp String, der den Namen des neuen Fields-Objekts beinhaltet und nicht mit dem Namen anderer Objekte in fields übereinstimmen darf.

Type Ein DataTypeEnum-Wert mit dem Standardwert adEmpty ist, welcher den Datentyp des neuen Feldes bestimmt. Die folgenden Datentypen werden von ADO nicht unterstützt und sollten nicht verwendet werden, wenn Sie neue Felder an ein Recordset-Objekt anhängen: adIDispatch, adIUnknown, adVariant.

DefinedSize Optional. Ein Wert vom Datentyp Long, der die festgelegte Zeichen- oder Bytegröße des neuen Feldes darstellt. Der Standardwert für diesen Parameter wird vom Type-Wert abgeleitet. Felder mit einer DefinedSize größer als 255 Bytes werden als Spalten variabler Längen behandelt. (Der Standardwert für DefinedSize ist nicht angegeben.)

Attrib Optional. Ein FieldAttributeEnum-Wert, dessen Standardwert adFldDefault ist, der Attribute für das neue Textfeld festlegt. Wenn dieser Wert nicht angegeben wurde, enthält das Feld vom Type-Wert abgeleitete Attribute.

FieldValue Optional. Ein Wert vom Datentyp Variant, der den Wert des neuen Feldes darstellt. Wenn nicht anders angegeben, dann wird dem Feld der Wert Null angefügt.

Hinweise

Parameters-Auflistung

Sie müssen die Type-Eigenschaft eines Parameter-Objekts festlegen, bevor Sie es der Parameters-Auflistung anhängen können. Wenn Sie einen Datentyp variabler Länge auswählen, müssen Sie außerdem die Size-Eigenschaft auf einen Wert setzen, der größer als Null ist.

Durch Angeben der Parameter können Sie selbst die Abfragen an den Provider minimieren und daraus folgend die Leistung verbessern, wenn Sie gespeicherte Prozeduren oder parametrisierte Abfragen verwenden. Sie müssen jedoch die Eigenschaften der Parameter kennen, die mit der gespeicherten Prozedur oder der parametrisierten Abfrage verbunden sind, die Sie aufrufen möchten.

Verwenden Sie die CreateParameter-Methode, um Parameter-Objekte mit den entsprechenden Eigenschaftseinstellungen zu erstellen. Verwenden Sie die Append-Methode, um sie der Parameters-Auflistung hinzuzufügen. Hiermit können Sie Parameterwerte festlegen und zurückgeben, ohne den Provider für den Erhalt der Parameterinformationen aufzurufen. Wenn Sie für einen Provider schreiben, der keine Parameterinformationen zur Verfügung stellt, müssen Sie diese Methode zum manuellen Auffüllen der Parameters-Auflistung verwenden, damit überhaupt Parameter verwendet werden können.

Fields-Auflistung

Der Parameter FieldValue ist nur gültig, wenn ein Field-Objekt zu einem Record-Objekt hinzugefügt wird, nicht an ein Recordset-Objekt. Mit einem Record-Objekt können Sie Felder anhängen und gleichzeitig Werte zur Verfügung stellen. Sie sollten mit einem Recordset-Objekt ein Feld erstellen, während das Recordset geschlossen ist, danach öffnen Sie das Recordset und weisen die Werte zu den Feldern zu.

Anmerkungen Für ein neues Field-Objekt, das an die Fields-Auflistung eines Record-Objekts angehängt werden soll, muss die Value-Eigenschaft festgelegt werden, bevor andere Field-Eigenschaften angegeben werden können. Zuerst muss ein bestimmter Wert für die Value-Eigenschaft zugewiesen werden und die Update-Methode der Fields-Auflistung aufgerufen werden. Danach können andere Eigenschaften, wie z. B. Type oder Attributes, zugewiesen werden.

Field-Objekte der folgenden Datentypen (DataTypeEnum) können nicht an die Fields-Auflistung angehängt werden und rufen einen Fehler hervor: adArray, adChapter, adEmpty, adPropVariant und adUserDefined. Ebenso werden die folgenden Datentypen nicht von ADO unterstützt: adIDispatch, adIUnknown und adVariant. Diese Typen rufen keinen Fehler hervor, wenn sie angefügt werden, die Verwendung kann jedoch unvorhersehbare Ergebnisse erzeugen, einschließlich Speicherverlusten.

Recordset

Wenn Sie die CursorLocation-Eigenschaft nicht festlegen, bevor Sie die Append-Methode aufrufen, wird CursorLocation automatisch auf adUseClient (ein CursorLocationEnum-Wert) festgelegt, wenn die Open-Methode des Recordset-Objekts aufgerufen wird.

Wird die Append-Methode auf der Fields-Auflistung auf einem geöffneten Recordset aufgerufen oder auf einem Recordset, bei dem die ActiveConnection-Eigenschaft festgelegt wurde, wird ein Laufzeitfehler hervorgerufen. Sie können Felder nur an ein Recordset-Objekt anhängen, das nicht geöffnet ist und noch nicht mit einer Datenquelle verbunden worden ist. In der Regel ist das der Fall, wenn ein Recordset-Objekt mit der CreateRecordset-Methode erstellt wird oder einer Objektvariablen zugewiesen wird.

Record

Wird die Append-Methode auf der Fields-Auflistung auf einem geöffneten Record aufgerufen, wurde kein Laufzeitfehler hervorgerufen. Das neue Feld wird der Fields-Aufzählung des Record-Objekts hinzugefügt. Wurde der Record von einem Recordset abgeleitet, dann wird das neue Feld nicht in der Fields-Auflistung des Recordset-Objekts angezeigt.

Ein nicht vorhandenes Feld kann erstellt und an die Fields-Auflistung angehängt werden, indem dem Feldobjekt ein Wert zugewiesen wird, als ob es bereits in der Auflistung bestehen würde. Die Zuweisung löst das automatische Erstellen und Anhängen des Field-Objekts aus, dann wird die Zuweisung abgeschlossen.

Nach dem Anhängen eines Field-Objekts an die Fields-Auflistung eines Record-Objekts rufen Sie zum Speichern der Änderung die Update-Methode der Fields-Auflistung auf.


AppendChunk-Methode (ADO)

AppendChunk-Methode

Hängt Daten an ein Field- oder Parameter-Objekt an, das langen Text oder Binärdaten enthält.

Syntax

object.AppendChunk Data

Parameter

object Ein Field- oder Parameter-Objekt.

Data Ein Wert vom Datentyp Variant, der die Daten enthält, die an das Objekt angehängt werden sollen.

Hinweise

Verwenden Sie die AppendChunk-Methode für ein Field- oder Parameter-Objekt, um es mit langen Binär- oder Zeichendaten zu füllen. Wenn der Systemspeicher begrenzt ist, können Sie die AppendChunk-Methode dazu verwenden, die Daten statt im Ganzen Stück für Stück zu verarbeiten.

Feld

Wenn das adFldLong-Bit in der Attributes-Eigenschaft eines Field-Objekts auf True festgelegt wurde, können Sie die AppendChunk-Methode für dieses Feld verwenden.

Der erste AppendChunk-Aufruf eines Field-Objekts schreibt Daten in das Feld, wobei alle vorhandenen Daten überschrieben werden. Durch nachfolgende Aufrufe von AppendChunk werden zu den vorhandenen Daten weitere hinzugefügt. Wenn Sie Daten an ein Feld anhängen und dann den Wert eines anderen Feldes im aktuellen Datensatz festlegen oder lesen, geht ADO davon aus, dass das Anhängen von Daten an das erste Feld abgeschlossen wurde. Wenn Sie die AppendChunk-Methode für das erste Feld erneut aufrufen, interpretiert ADO den Aufruf als neue AppendChunk-Operation und überschreibt die vorhandenen Daten. Die AppendChunk-Operation wird durch das Zugreifen auf Felder in anderen Recordset-Objekten, die keine Duplikate des ersten Recordset-Objekts sind, nicht unterbrochen.

Wenn bei einem AppendChunk-Aufruf eines Field-Objekts kein aktueller Datensatz vorhanden ist, tritt ein Fehler auf.

Anmerkung Die AppendChunk-Methode arbeitet nicht bei Field-Objekten eines Record-Objekts. Es werden keine Operationen durchgeführt, und es wird ein Laufzeitfehler hervorgerufen.

Parameter

Falls das adFldLong-Bit in der Attributes-Eigenschaft eines Parameter-Objekts auf True festgelegt wurde, können Sie die AppendChunk-Methode für diesen Parameter verwenden.

Der erste AppendChunk-Aufruf eines Parameter-Objekts schreibt Daten in den Parameter, wobei alle vorhandenen Daten überschrieben werden. Nachfolgende AppendChunk-Aufrufe eines Parameter-Objekts fügen zu den vorhandenen Parameterdaten weitere hinzu. Durch einen AppendChunk-Aufruf, der den Wert Null übergibt, werden alle Parameterdaten verworfen.


BeginTrans-, CommitTrans- und RollbackTrans-Methode (ADO)

Mit diesen Transaktionsmethoden wird das Verwalten der Transaktionsverarbeitung innerhalb eines Connection-Objekts wie folgt durchgeführt:

  • BeginTrans - beginnt eine neue Transaktion

  • CommitTrans - speichert alle Änderungen und beendet die aktuelle Transaktion; diese Transaktionsmethode kann auch eine neue Transaktion starten

  • RollbackTrans - bricht alle im Verlauf der aktuellen Transaktion vorgenommenen Änderungen ab und beendet die Transaktion; diese Transaktionsmethode kann auch eine neue Transaktion starten

Syntax

level = object.BeginTrans()

object.BeginTrans

object.CommitTrans

object.RollbackTrans

Rückgabewert

Die BeginTrans-Methode kann als Funktion aufgerufen werden, die eine Long-Variable zurückgibt, durch die die Schachtelungstiefe der Transaktion angegeben wird.

Parameter

object Ein Connection-Objekt.

Verbindung

Verwenden Sie diese Methoden in Verbindung mit einem Connection-Objekt, wenn Sie eine Reihe von Änderungen speichern oder abbrechen möchten, die Sie an den Quelldaten als einzelne Einheit vorgenommen haben. Um z. B. Geld zwischen Konten zu transferieren, subtrahieren Sie einen Betrag von einem Konto und fügen den gleichen Betrag zu einem anderen Konto hinzu. Wenn eine der Aktualisierungen fehlschlägt, sind die Kontostände nicht mehr abgeglichen. Die Durchführung dieser Änderungen innerhalb einer geöffneten Transaktion gewährleistet, dass entweder alle oder keine der Änderungen vorgenommen werden.

Anmerkung Nicht alle Provider unterstützen Transaktionen. Überprüfen Sie, dass die durch den Provider festgelegte Eigenschaft Transaction DDL in der Properties-Auflistung des Connection-Objekts angezeigt wird. Dadurch wird angegeben, dass der Provider Transaktionen unterstützt. Unterstützt der Provider keine Transaktionen, wird beim Aufrufen dieser Methoden ein Fehler zurückgegeben.

Wenn Sie die BeginTrans-Methode aufrufen, werden vorgenommene Änderungen vom Provider erst dann unmittelbar durchgeführt, wenn Sie die CommitTrans- oder die RollbackTrans-Methode aufrufen, um die Transaktion zu beenden.

Bei Providern, die geschachtelte Transaktionen unterstützen, startet das Aufrufen der BeginTrans-Methode innerhalb einer geöffneten Transaktion eine neue, geschachtelte Transaktion. Der Rückgabewert zeigt die Ebene der Schachtelung an: Ein Rückgabewert von 1 zeigt an, dass Sie eine Transaktion der oberen Ebene geöffnet haben (d. h., dass die Transaktion nicht innerhalb einer anderen Transaktion geschachtelt ist), ein Rückgabewert von 2 zeigt an, dass Sie eine Transaktion der zweiten Ebene (eine Transaktion, die innerhalb einer Transaktion der oberen Ebene geschachtelt ist) geöffnet haben usw. Das Aufrufen von CommitTrans oder RollbackTrans hat lediglich Einfluss auf die zuletzt geöffnete Transaktion; Sie müssen die aktuelle Transaktion schließen oder einen Rollback ausführen, bevor Sie übergeordnete Transaktionen auflösen können.

Das Aufrufen der CommitTrans-Methode speichert Änderungen, die innerhalb einer geöffneten Transaktion vorgenommen wurden, in der Verbindung und beendet die Transaktion. Das Aufrufen der RollbackTrans-Methode kehrt alle innerhalb einer geöffneten Transaktion vorgenommen Änderungen um und beendet die Transaktion. Wenn keine geöffnete Transaktion vorhanden ist, löst das Aufrufen dieser Methoden einen Fehler aus.

In Abhängigkeit von der Attributes-Eigenschaft des Connection-Objekts wird durch das Aufrufen der CommitTrans- oder RollbackTrans-Methode u. U. automatisch eine neue Transaktion gestartet. Wenn die Attributes-Eigenschaft auf adXactCommitRetaining festgelegt ist, startet der Provider nach einem CommitTrans-Aufruf automatisch eine neue Transaktion. Wenn die Attributes-Eigenschaft auf adXactAbortRetaining festgelegt ist, startet der Provider nach einem RollbackTrans-Aufruf automatisch eine neue Transaktion.

Remote Data Service

Die BeginTrans-, CommitTrans- und RollbackTrans-Methoden stehen in einem clientseitigen Connection-Objekt nicht zur Verfügung.


Cancel-Methode (ADO)

Cancel-Methode

Bricht die Ausführung eines anstehenden, asynchronen Methodenaufrufs ab.

Syntax

object.Cancel

Hinweise

Verwenden Sie die Cancel-Methode, um die Ausführung eines asynchronen Methodenaufrufs zu beenden (d. h., die Methode wurde mit der Option adAsyncConnect, adAsyncExecute oder adAsyncFetch aufgerufen).

In der folgenden Tabelle werden die Aufgaben aufgeführt, die bei Verwendung der Cancel-Methode für einen bestimmten Objekttyp beendet werden.

Ist das Objekt ein ... 		Wird der letzte asynchrone Aufruf für diese Methode beendet mit ...
Command Execute
Connection | Execute oder Open
Record | CopyRecord, DeleteRecord, MoveRecord oder Open


Cancel-Methode (RDS)

Bricht die Ausführung eines anstehenden, asynchronen Methodenaufrufs ab.

Syntax

RDS.DataControl.Cancel

Hinweise

Beim Aufrufen der Cancel-Methode wird die ReadyState-Eigenschaft automatisch auf adcReadyStateLoaded festgelegt, und das Recordset-Objekt enthält keine Einträge.


CancelBatch-Methode (ADO)

CancelBatch-Methode

Bricht eine anstehende Stapelaktualisierung ab.

Syntax

recordset.CancelBatch AffectRecords

Parameter

AffectRecords Optional. Ein AffectEnum-Wert, der anzeigt, wie viele Datensätze durch die CancelBatch-Methode beeinflusst werden.

Hinweise

Verwenden Sie die CancelBatch-Methode, um alle in einem Recordset-Objekt anstehenden Aktualisierungen im Stapelaktualisierungsmodus abzubrechen. Falls das Recordset-Objekt von einem Provider verarbeitet wird, der Aktualisierungen sofort durchführt, löst das Aufrufen von CancelBatch ohne adAffectCurrent einen Fehler aus.

Wenn Sie den aktuellen Datensatz bearbeiten oder einen neuen Datensatz hinzufügen, ruft ADO beim Aufrufen von CancelBatch zuerst die CancelUpdate-Methode auf, um alle im Cache enthaltenen Änderungen abzubrechen. Danach werden alle anstehenden Änderungen im Recordset-Objekt abgebrochen.

Es ist möglich, dass der aktuelle Datensatz nach einem Aufruf von CancelBatch unbestimmbar ist. Dies ist insbesondere dann der Fall, wenn Sie gerade einen neuen Datensatz hinzugefügt haben. Aus diesem Grund empfiehlt es sich, die Position des aktuellen Datensatzes nach dem Aufrufen von CancelBatch auf einen bekannten Speicherplatz im Recordset-Objekt festzulegen. Rufen Sie z. B. die MoveFirst-Methode auf.

Falls der Versuch, die anstehenden Aktualisierungen abzubrechen, aufgrund eines Konflikts mit den zugrunde liegenden Daten fehlschlägt (z. B., weil ein Datensatz von einem anderen Benutzer gelöscht wurde), gibt der Provider Warnmeldungen an die Errors-Auflistung zurück, ohne jedoch die Programmausführung anzuhalten. Ein Laufzeitfehler tritt nur auf, wenn es Konflikte mit allen angeforderten Datensätzen gibt. Verwenden Sie die Filter- (adFilterAffectedRecords) und die Status-Eigenschaft, um festzustellen, wo sich Datensätze mit Konflikten befinden.


CancelUpdate-Methode (ADO)

CancelUpdate-Methode

Bricht vorgenommene Änderungen in der aktuellen oder neuen Zeile eines Recordset-Objekts oder der Fields-Auflistung eines Record-Objekts vor Aufrufen der Update-Methode ab.

Syntax

recordset.CancelUpdate

record.Fields.CancelUpdate

Hinweise

Recordset

Verwenden Sie die CancelUpdate-Methode, um alle an der aktuellen Zeile vorgenommen Änderungen oder eine neu hinzugefügte Zeile zu verwerfen. Nach dem Aufruf der Update-Methode können Sie Änderungen in der aktuellen Zeile oder in einer neuen Zeile nicht abbrechen, es sei denn, die Änderungen sind entweder Teil einer Transaktion, auf der Sie mithilfe der RollbackTrans-Methode einen Rollback ausführen können, oder Teil einer Stapelaktualisierung. Im Fall der Stapelaktualisierung können Sie die Update-Methode mit der CancelUpdate- oder CancelBatch-Methode abbrechen.

Falls Sie beim Aufrufen der CancelUpdate-Methode eine neue Zeile hinzufügen, wird die Zeile, die vor dem Aufrufen der AddNew-Methode aktuell war, erneut zur aktuellen Zeile.

Wurde die aktuelle Zeile nicht geändert oder keine neue Zeile hinzugefügt, löst das Aufrufen der CancelUpdate-Methode einen Fehler aus.

Record

Die CancelUpdate-Methode bricht alle anstehenden Einfügungen oder Löschvorgänge des Field-Objekts ab, bricht anstehende Aktualisierungen vorhandener Felder ab und stellt wieder ihre originalen Werte her. Die Status-Eigenschaft aller Felder in der Fields-Auflistung wird auf adFieldOK festgelegt.


CancelUpdate-Methode (RDS)

Bricht vorgenommene Änderungen der aktuellen oder neuen Zeile eines Recordset-Objekts ab.

Syntax

DataControl.CancelUpdate

Parameter

DataControl Eine Objektvariable, die ein RDS.DataControl-Objekt darstellt.

Hinweise

Der Cursordienst für OLE DB enthält sowohl eine Kopie der Originalwerte als auch einen Cache mit den Änderungen. Beim Aufrufen der CancelUpdate-Methode wird der Cache mit den Änderungen geleert, und alle gebundenen Steuerelemente werden mit den Originaldaten aktualisiert.


Clear-Methode (ADO)

Clear-Methode

Entfernt alle Error-Objekte aus der Errors-Auflistung.

Syntax

Errors.Clear

Hinweise

Verwenden Sie die Clear-Methode für die Errors-Auflistung, um alle vorhandenen Error-Objekte aus der Auflistung zu entfernen. Wenn ein Fehler auftritt, löscht ADO automatisch die Errors-Auflistung und füllt sie basierend auf dem neuen Fehler mit Error-Objekten.

Einige Eigenschaften und Methoden geben Warnmeldungen zurück, die als Error-Objekte in der Errors-Auflistung angezeigt werden, ohne die Programmausführung jedoch anzuhalten. Bevor Sie die Resync-, UpdateBatch- oder CancelBatch-Methoden bei einem Recordset-Objekt, die Open-Methode bei einem Connection-Objekt oder die Filter-Eigenschaft bei einem Recordset-Objekt aufrufen, rufen Sie die Clear-Methode in der Errors-Auflistung auf. Dadurch können Sie die Count-Eigenschaft der Errors-Auflistung lesen, um nach zurückgegebenen Warnmeldungen zu suchen.


Clone-Methode (ADO)

Clone-Methode

Erstellt ein Duplikat eines Recordset-Objekts aus einem vorhandenen Recordset-Objekt. Optional können Sie den Schreibschutz für das Duplikat festlegen.

Syntax

Set rstDuplicate = rstOriginal.Clone (LockType)

Rückgabewert

Gibt eine Referenz auf ein Recordset-Objekt zurück.

Parameter

rstDuplicate Eine Objektvariable, die das Recordset-Objekt anzeigt, von dem ein Duplikat erstellt werden soll.

rstOriginal Eine Objektvariable, die das zu duplizierende Recordset-Objekt bestimmt.

LockType Optional. Ein LockTypeEnum-Wert, der entweder den Sperrungstyp des ursprünglichen Recordset-Objekts oder ein schreibgeschütztes Recordset-Objekt angibt. AdLockUnspecified oder adLockReadOnly sind gültige Werte.

Hinweise

Verwenden Sie die Clone-Methode zum Erstellen mehrerer doppelter Recordset-Objekte, insbesondere dann, wenn Sie mehrere aktuelle Datensätze in einer gegebenen Gruppe von Datensätzen verwalten möchten. Das Verwenden der Clone-Methode ist effizienter als das Erstellen und Öffnen eines neuen Recordset-Objekts mit derselben Definition wie das Original.

Der aktuelle Datensatz eines neu erstellten Duplikats wird auf den ersten Datensatz festgelegt.

Änderungen an einem Recordset-Objekt werden ungeachtet des Cursor-Typs in all seinen Duplikaten angezeigt. Nachdem die Requery-Methode auf dem ursprünglichen Recordset-Objekt ausgeführt wurde, werden die Duplikate nicht mehr mit dem Original synchronisiert.

Durch das Schließen des ursprünglichen Recordset-Objekts werden die Kopien nicht automatisch geschlossen. Ebenso wird durch das Schließen einer Kopie weder das Original noch eine der anderen Kopien geschlossen.

Sie können nur ein Recordset-Objekt verdoppeln, das Lesezeichen unterstützt. Die Werte für Lesezeichen sind austauschbar; d. h., die Referenz auf ein Lesezeichen aus einem Recordset-Objekt bezieht sich auf denselben Datensatz in jedem seiner Duplikate.


Close-Methode (ADO)

Close-Methode

Schließt ein geöffnetes Objekt sowie alle abhängigen Objekte.

Syntax

object.Close

Hinweise

Verwenden Sie die Close-Methode, um ein Connection-, ein Record-, ein Recordset- oder ein Stream-Objekt zu schließen, damit alle zugeordneten Systemressourcen freigegeben werden. Das Schließen eines Objekts entfernt dieses nicht aus dem Speicher. Sie können seine Eigenschaftseinstellungen ändern und es zu einem späteren Zeitpunkt öffnen. Um ein Objekt völlig aus dem Speicher zu löschen, legen Sie nach dem Schließen des Objekts die Objektvariable auf Nothing (in Visual Basic) fest.

Verbindung

Das Verwenden der Close-Methode zum Schließen eines Connection-Objekts schließt auch alle aktiven Recordset-Objekte, die der Verbindung zugeordnet sind. Ein Command-Objekt, das mit dem zu schließenden Connection-Objekt verbunden ist, bleibt bestehen. Es ist jedoch nicht länger einem Connection-Objekt zugeordnet, d. h., die ActiveConnection-Eigenschaft wird auf Nothing festgelegt. Darüber hinaus werden in der Parameters-Auflistung des Command-Objekts alle durch den Provider festgelegten Parameter gelöscht.

Sie können die Open-Methode später aufrufen, um die Verbindung zu derselben oder einer anderen Datenquelle wiederherzustellen. Solange das Connection-Objekt geschlossen ist, löst das Aufrufen einer anderen Methode, die eine geöffnete Verbindung zur Datenquelle erfordert, einen Fehler aus.

Wenn ein Connection-Objekt geschlossen wird, während geöffnete Recordset-Objekte in der Verbindung vorhanden sind, wird auf allen anstehenden Änderungen in allen Recordset-Objekten ein Rollback ausgeführt. Das explizite Schließen eines Connection-Objekts (das Aufrufen der Close-Methode) während einer Transaktion löst einen Fehler aus. Wenn ein Connection-Objekt während einer Transaktion aus dem Gültigkeitsbereich herausfällt, führt ADO automatisch einen Rollback auf der Transaktion aus.

Recordset, Record, Stream

Beim Verwenden der Close-Methode zum Schließen eines Recordset-, Record- oder Stream-Objekts werden die zugeordneten Daten und alle exklusiven Zugriffsrechte für dieses bestimmte Objekt freigegeben. Sie können später die Open-Methode aufrufen, um das Objekt mit denselben oder modifizierten Attributen erneut zu öffnen.

Wenn das Recordset-Objekt geschlossen wurde, löst das Aufrufen von Methoden, die einen aktiven Cursor erfordern, einen Fehler aus.

Bei einem Bearbeitungsvorgang mit einem Provider, der Änderungen sofort aktualisiert, löst das Aufrufen der Close-Methode einen Fehler aus. Rufen Sie stattdessen zunächst die Update- oder die CancelUpdate-Methode auf. Wenn Sie das Recordset-Objekt während des Stapelaktualisierungsmodus schließen, gehen alle seit dem letzten Aufrufen der UpdateBatch-Methode vorgenommenen Änderungen verloren.

Wenn Sie die Clone-Methode zum Erstellen von Kopien eines geöffneten Recordset-Objekts verwenden, werden andere Kopien durch das Schließen des Originals oder eines Duplikats nicht beeinflusst.


CompareBookmarks-Methode (ADO)

CompareBookmarks-Methode

Vergleicht zwei Lesezeichen und gibt eine Anzeige ihrer relativen Werte zurück.

Syntax

result = recordset.CompareBookmarks(Bookmark1, Bookmark2)

Rückgabewert

Gibt einen CompareEnum-Wert zurück, der die relative Zeilenposition von zwei Datensätzen, die durch ihre Lesezeichen dargestellt werden, angibt.

Parameter

Lesezeichen1 Das Lesezeichen der ersten Zeile.

Lesezeichen2 Das Lesezeichen der zweiten Zeile.

Hinweise

Die Lesezeichen müssen für dasselbe Recordset-Objekt oder ein Recordset-Objekt und sein Duplikat gelten. Ein zuverlässiger Vergleich von Lesezeichen aus unterschiedlichen Recordset-Objekten ist nicht möglich, selbst wenn diese anhand derselben Quelle oder mit demselben Befehl erstellt wurden. Außerdem können keine Lesezeichen für ein Recordset-Objekt verglichen werden, dessen zugrunde liegender Provider keine Vergleiche unterstützt.

Eine Zeile in einem Recordset-Objekt wird durch ein Lesezeichen eindeutig bestimmt. Verwenden Sie die Bookmark-Eigenschaft der aktuellen Zeile, um das entsprechende Lesezeichen zu erhalten.

Ein Lesezeichen, das ungültig ist oder unkorrekt formatiert, ruft einen Fehler hervor.


ConvertToString-Methode (RDS)

Konvertiert ein Recordset-Objekt in eine MIME-Zeichenfolge, welche die Recordsetdaten darstellt.

Syntax

DataFactory.ConvertToString(Recordset)

Parameter

DataFactory Eine Objektvariable, die ein RDSServer.DataFactory-Objekt darstellt.

Recordset Eine Objektvariable, die ein Recordset-Objekt darstellt.

Hinweise

Verwenden Sie bei ASP-Dateien die ConvertToString-Methode, um das Recordset-Objekt in einer auf dem Server generierten HTML-Seite einzubetten, die dann zu einem Clientcomputer gesendet wird.

ConvertToString lädt zunächst das Recordset-Objekt in Cursor Service-Tabellen und generiert dann einen Datenstrom im MIME-Format.

Auf dem Client kann die MIME-Zeichenfolge dann mithilfe von Remote Data Service in ein voll funktionsfähiges Recordset-Objekt zurückkonvertiert werden. Auf diese Weise können problemlos bis zu 400 Datenzeilen mit bis zu 1024 Byte je Zeile verarbeitet werden. Diese Methode sollte nicht für das Streaming von BLOB-Daten und umfangreichen Ergebnismengen über HTTP verwendet werden. Die Zeichenfolge wird für die Übertragung nicht komprimiert. Daher benötigt der Transport umfangreicher Datensätze über HTTP einen sehr langen Zeitraum im Vergleich zu dem optimal für die Übertragung geeigneten Tablegram-Format, das von RDS (Remote Data Service) als systemeigenes Transportprotokollformat definiert und bereitgestellt wird.

Anmerkung Wenn Sie Active Server Pages zum Einbetten der ausgegebenen MIME-Zeichenfolge in einer HTML-Clientseite verwenden, beachten Sie bitte, dass Versionen von VBScript, die vor Version 2.0 veröffentlicht wurden, die Zeichenfolgengröße auf 32 KB begrenzen. Wird diese Begrenzung überschritten, wird ein Fehler zurückgegeben. Verwenden Sie einen relativ geringen Abfragebereich, wenn Sie MIME-Daten über ASP-Dateien einbetten. Zu diesem Zweck können Sie die neueste Version von VBScript von der Microsoft Windows Script Technologies-Website downloaden.


CopyRecord-Methode (ADO)

CopyRecord-Methode

Kopiert eine Datei oder ein Verzeichnis und seine Inhalte zu einem anderen Speicherplatz.

Syntax

CopyRecord (Source, Destination, UserName, Password, Options, Async)

Parameter

Source Optional. Ein Wert vom Datentyp String, der ein URL enthält, der die Datei oder das Verzeichnis angibt, das kopiert werden soll. Wurde Source ausgelassen oder eine leere Zeichenfolge angegeben, wird die Datei oder das Verzeichnis kopiert werden, das durch dieses Record-Objekt dargestellt wird.

Destination Optional. Ein Wert vom Datentyp String mit einem URL, der den Speicherplatz angibt, wohin Source kopiert wird.

UserName Optional. Ein Wert vom Datentyp String, der die Benutzer-ID enthält, die bei Bedarf den Zugriff zu Destination ermöglicht.

Password Optional. Ein Wert vom Datentyp String, der das ggf. benötigte Kennwort enthält, das den UserName überprüft.

Options Optional. Ein CopyRecordOptionsEnum-Wert, der einen Standardwert von adCopyUnspecified hat. Legt das Verhalten dieser Methode fest.

Async Optional. Ein boolescher Wert, der bei True bestimmt, dass diese Operation asynchron sein soll.

Rückgabewert

Ein Wert vom Datentyp String, der in der Regel den Wert von Destination zurückgibt. Der exakt zurückgegebene Wert ist jedoch providerabhängig.

Hinweise

Die Werte von Source und Destination dürfen nicht identisch sein, sonst tritt ein Laufzeitfehler auf. Zumindest einer der drei Bestandteile, Server, Pfad und Ressource, muss unterschiedlich sein.

Alle Unterverzeichnisse von Source werden rekursiv kopiert, sofern adCopyNonRecursive angegeben wurde. Bei einer rekursiven Operation darf Destination kein Unterverzeichnis von Source sein, sonst wird die Operation nicht beendet.

Diese Methode leert eine vorhandene Datei oder ein vorhandenes Verzeichnis, wenn Destination auf diese verweist, sofern adCopyOverWrite angegeben wurde.

Wichtig Verwenden Sie die adCopyOverWrite-Option umsichtig. Das Angeben dieser Option wird z. B. das Verzeichnis löschen und mit der Datei überschreiben, wenn eine Datei in ein Verzeichnis kopiert wird.


CopyTo-Methode (ADO)

CopyTo-Methode

Kopiert eine angegebene Anzahl von Zeichen oder Bytes eines Stream-Objekts (von der Type-Eigenschaft abhängig) in ein anderes Stream-Objekt.

Syntax

Stream.CopyTo DestStream, NumChars

Parameter

DestStream Eine Objektvariable, die eine Referenz zu einem offenen Stream-Objekt enthält. Das aktuelle Stream-Objekt wird zum durch DestStream angegebenen Stream-Zielobjekt kopiert. Das Stream-Zielobjekt muss bereits geöffnet sein. Wenn nicht, tritt ein Laufzeitfehler auf.

Anmerkung Der Parameter DestStream kann kein Proxy eines Stream-Objekts sein, weil das den Zugriff auf eine private Schnittstelle des Stream-Objekts erfordert, die nicht vom Client entfernt werden kann.

NumChars Optional. Ein Wert vom Datentyp Integer, der die Anzahl der Bytes oder Zeichen bestimmt, die von der aktuellen Position im Quell-Stream in den Ziel-Stream kopiert werden. Der Standardwert ist -1; er bestimmt, dass alle Zeichen oder Bytes von der aktuellen Position bis zur EOS-Eigenschaft kopiert werden.

Hinweise

Die Methode kopiert die angegebene Anzahl von Zeichen oder Bytes, beginnend von der aktuellen Position, die durch die Position-Eigenschaft angegeben wird. Ist die angegebene Anzahl größer als die bis EOS verfügbare Anzahl von Bytes, dann werden nur Zeichen oder Bytes von der aktuellen Position bis EOS kopiert. Ist der Wert von NumChars -1 oder wurde er ausgelassen, werden alle Zeichen oder Bytes beginnend von der aktuellen Position kopiert.

Sind vorhandene Zeichen oder Bytes im Zielstrom, wird aller Inhalt über den Punkt hinweg, wo die Kopie endet, übriggelassen; der Inhalt wird nicht abgeschnitten. Position wird sofort zum Byte, wenn das letzte Byte kopiert wurde. Wenn Sie diese Bytes abschneiden möchten, rufen Sie die SetEOS-Methode auf.

Die CopyTo-Methode sollte verwendet werden, um Daten zu einem Ziel-Stream desselben Typs wie der Quell-Stream zu kopieren (ihre Type-Eigenschaftseinstellungen sind beide adTypeText oder beide adTypeBinary). Für Stream-Textobjekte können Sie die Charset-Eigenschaftseinstellung des Ziel-Stream ändern, um Daten von einem Zeichensatz in einen anderen zu konvertieren. Stream-Textobjekte können auch erfolgreich in ein binäres Stream-Objekt kopiert werden, aber binäre Stream-Objekte können nicht in ein Stream-Textobjekt kopiert werden.


CreateObject-Methode (RDS)

Erstellt den Proxy für das Zielgeschäftsobjekt und gibt einen Zeiger darauf zurück. Der Proxy führt das Packen und Marshalling von Daten zum serverseitigen Stub für die Kommunikation mit dem Geschäftsobjekt durch, um Anforderungen und Daten über das Internet zu senden. Für prozessinterne Komponentenobjekte werden keine Proxies verwendet, so dass nur ein Zeiger zum Objekt bereitgestellt wird.

Syntax

Remote Data Service unterstützt die folgenden Protokolle: HTTP, HTTPS (HTTP über Secure Socket Layer), DCOM und prozessinterne Protokolle.

Protokoll | Syntax
HTTP | Set object = DataSpace.CreateObject("ProgId", "http://awebsrvr")
HTTPS | Set object = DataSpace.CreateObject("ProgId", "https://awebsrvr")
DCOM | Set object = DataSpace.CreateObject("ProgId", "computername")
In-process | Set object = DataSpace.CreateObject("ProgId", "")

Parameter

Object Eine Objektvariable, die ein Objekt des in ProgID angegebenen Typs ergibt.

DataSpace Eine Objektvariable, die ein RDS.DataSpace-Objekt darstellt, das zum Erstellen einer Instanz des neuen Objekts verwendet wird.

ProgID Ein Wert vom Datentyp String, der den Programmbezeichner enthält, mit der ein serverseitiges Geschäftsobjekt angegeben wird, das die Geschäftsregeln der Anwendung implementiert.

EinWebserver oder Computername Ein Wert vom Datentyp String, der einen URL darstellt, mit dem der IIS-Webserver (Internet-Informationsdienste) angegeben wird, auf dem eine Instanz des Geschäftsobjekts für den Server erstellt wird.

Hinweise

Beim HTTP-Protokoll handelt es sich um das Standard-Webprotokoll. HTTPS ist ein sicheres Webprotokoll. Verwenden Sie das DCOM-Protokoll, wenn ein lokales Netzwerk ohne HTTP ausgeführt wird. Das prozessinterne Protokoll ist eine lokale DLL (Dynamic Link Library); es verwendet kein Netzwerk.


CreateParameter-Methode (ADO)

CreateParameter-Methode

Erstellt ein neues Parameter-Objekt mit den angegebenen Eigenschaften.

Syntax

Set parameter = command.CreateParameter (Name, Type, Direction, Size, Value)

Rückgabewert

Gibt ein Parameter-Objekt zurück.

Parameter

Name Optional. Ein Wert vom Datentyp String, der den Namen des Parameter-Objekts enthält.

Type Optional. Ein DataTypeEnum-Wert, der den Datentyp des Parameter-Objekts bestimmt.

Direction Optional. Ein ParameterDirectionEnum-Wert, der den Typ des Parameter-Objekts bestimmt.

Size Optional. Ein Wert vom Datentyp Long, der die maximale Länge für den Parameterwert in Zeichen oder Byte bestimmt.

Value Optional. Eine Variable vom Datentyp Variant, die den Wert für das Parameter-Objekt festlegt.

Hinweise

Verwenden Sie die CreateParameter-Methode, um ein neues Parameter-Objekt mit angegebenem Namen, Typ, Richtung, Größe und Wert zu erstellen. Alle Werte, die Sie in den Argumenten übergeben, werden in die entsprechenden Parameter-Eigenschaften geschrieben.

Diese Methode hängt das Parameter-Objekt nicht automatisch an die Parameters-Auflistung eines a Command-Objekts an. Dadurch können Sie zusätzliche Eigenschaften festlegen, deren Werte ADO auf ihre Gültigkeit überprüft, wenn Sie das Parameter-Objekt an die Auflistung anhängen.

Wenn Sie einen Datentyp variabler Länge im Type-Argument angeben, müssen Sie entweder ein Size-Argument übergeben oder die Size-Eigenschaft des Parameter-Objekts festlegen, bevor Sie es an die Parameters-Auflistung anhängen; andernfalls tritt ein Fehler auf.

Wenn Sie einen numerischen Datentyp (adNumeric oder adDecimal) im Type-Argument angeben, dann müssen Sie auch die NumericScale- und Precision-Eigenschaften festlegen.


CreateRecordset-Methode (RDS)

Erstellt ein leeres, nicht verbundenes Recordset-Objekt.

Syntax

object.CreateRecordset(ColumnInfos)

Parameter

Object Eine Objektvariable, die ein RDSServer.DataFactory- oder ein RDS.DataControl-Objekt darstellt.

ColumnsInfos Ein Variant-Array von Attributen, das jede im Recordset-Objekt erstellte Spalte definiert. Jede Spaltendefinition enthält ein Array mit vier erforderlichen Attributen.

Attribut | Beschreibung
Name | Name der Spaltenüberschrift
Type | Ganze Zahl des Datentyps
Size | Ganzzahliger Wert für die Größe in Zeichen, unabhängig vom Datentyp.
Nullability | Boolescher Wert

Das Set der Spaltenarrays wird dann in einem Array gruppiert, welches das Recordset-Objekt definiert.

Hinweise

Das serverseitige Geschäftsobjekt kann das ausgegebene Recordset mit Daten eines Datenproviders auffüllen, der OLE DB nicht unterstützt. Hierbei kann es sich z. B. um eine Betriebssystemdatei handeln, die Lagerkontingente enthält.

In der folgenden Tabelle sind die DataTypeEnum-Werte aufgeführt, die von der CreateRecordset-Methode unterstützt werden. Die angegebene Zahl ist die Verweisnummer, anhand derer Felder definiert werden.

Jeder dieser Datentypen besitzt entweder eine feste oder eine variable Länge. Datentypen mit fester Länge sollten durch eine Größe von -1 definiert werden, da die Größe vorher bestimmt wurde und eine Größendefinition weiterhin erforderlich ist. Die Größe variabler Datentypen kann zwischen 1 und 32767 liegen.

Bei einigen Datentypen der Variable muss der Typ durch den in der Ersetzung-Spalte angegebenen Typ ausgetauscht werden. Die Ersetzungen werden erst angezeigt, nachdem das Recordset-Objekt erstellt und gefüllt wurde. Dann können Sie ggf. auf den tatsächlichen Datentyp prüfen.

Länge | Konstante | Zahl | Ersetzung
Fest | adTinyInt | 16 |
Fest | adSmallInt | 2 |
Fest | adInteger | 3 |
Fest | adBigInt | 20 |
Fest | adUnsignedTinyInt | 17 |
Fest | adUnsignedSmallInt | 18 |
Fest | adUnsignedInt | 19 |
Fest | adUnsignedBigInt | 21 |
Fest | adSingle | 4 |
Fest | adDouble | 5 |
Fest | adCurrency | 6 |
Fest | adDecimal | 14 |
Fest | adNumeric | 131 |
Fest | adBoolean | 11 |
Fest | adError | 10 |
Fest | adGuid | 72 |
Fest | adDate | 7 |
Fest | adDBDate | 133 |
Fest | adDBTime | 134 |
Fest | adDBTimestamp | 135 | 7
Variabel | adBSTR | 8 | 130
Variabel | adChar | 129 | 200
Variabel | adVarChar | 200 |
Variabel | adLongVarChar | 201 | 200
Variabel | adWChar | 130 |
Variabel | adVarWChar | 202 | 130
Variabel | adLongVarWChar | 203 | 130
Variabel | adBinary | 128 |
Variabel | adVarBinary | 204 |
Variabel | adLongVarBinary | 205 | 204


Delete-Methode (ADO Parameters-Auflistung)

Löscht ein Objekt aus der Parameters-Auflistung.

Syntax

Parameters.Delete Index

Parameter

Index Ein Wert vom Datentyp String, der den Namen des zu löschenden Objekts oder die Ordinalposition (Index) des Objekts in der Auflistung enthält.

Hinweise

Das Verwenden der Delete-Methode in einer Auflistung ermöglicht es, eines der Objekte aus der Auflistung zu entfernen. Diese Methode steht nur für die Parameters-Auflistung eines Command-Objekts zur Verfügung. Sie müssen die Name-Eigenschaft des Parameter-Objekts oder seinen Auflistungsindex verwenden, wenn Sie die Delete-Methode aufrufen - eine Objektvariable ist kein gültiges Argument.


Delete-Methode (ADO Fields-Auflistung)

Löscht ein Objekt aus der Fields-Auflistung.

Syntax

Fields.Delete Field

Parameter

Field Ein Wert vom Datentyp Variant, der das zu löschende Field-Objekt kennzeichnet. Dieser Parameter kann der Name des Field-Objekts oder die Ordinalposition der Field-Objekts selbst sein.

Hinweise

Das Aufrufen der Fields.Delete-Methode in einem geöffneten Recordset-Objekt führt zu einem Laufzeitfehler.


Delete-Methode (ADO Recordset)

Löscht den aktuellen Datensatz oder eine Gruppe von Datensätzen.

Syntax

recordset.Delete AffectRecords

Parameter

AffectRecords Ein AffectEnum-Wert, der die Anzahl der durch die Delete-Methode beeinflussten Datensätze bestimmt. Der Standardwert ist adAffectCurrent.

Anmerkung adAffectAll und adAffectAllChapters sind für Delete keine gültigen Argumente.

Hinweise

Das Verwenden der Delete-Methode markiert den aktuellen Datensatz oder eine Gruppe von Datensätzen in einem Recordset-Objekt zum Löschen. Falls das Recordset-Objekt das Löschen des Datensatzes nicht zulässt, tritt ein Fehler auf. Wenn Sie sich im Modus für sofortige Aktualisierung befinden, erfolgen die Löschvorgänge in der Datenbank sofort. Andernfalls werden die Datensätze zum Löschen im Cache markiert. Die tatsächliche Löschoperation findet beim Aufrufen der UpdateBatch-Methode statt. (Verwenden Sie die Filter-Eigenschaft, um die gelöschten Datensätze anzuzeigen.)

Das Abrufen von Feldwerten aus dem gelöschten Datensatz löst einen Fehler aus. Nach dem Löschen des aktuellen Datensatzes bleibt der gelöschte Datensatz aktiv, bis Sie zu einem anderen Datensatz wechseln. Sobald Sie den gelöschten Datensatz verlassen, ist ein Zugriff auf diesen Datensatz nicht mehr möglich.

Wenn Sie Löschvorgänge in einer Transaktion schachteln, können Sie gelöschte Datensätze mit der RollbackTrans-Methode wieder herstellen. Falls Sie sich im Stapelaktualisierungsmodus befinden, können Sie eine anstehende Löschoperation oder eine Gruppe von anstehenden Löschoperationen mit der CancelBatch-Methode abbrechen.

Falls der Versuch, Datensätze zu löschen, aufgrund eines Konflikts mit den zugrunde liegenden Daten fehlschlägt (z. B., weil ein Datensatz bereits von einem anderen Benutzer gelöscht wurde), gibt der Provider Warnmeldungen an die Errors-Auflistung aus, ohne die Programmausführung jedoch anzuhalten. Ein Laufzeitfehler tritt nur auf, wenn es Konflikte mit allen angeforderten Datensätzen gibt.

Wenn die dynamische Eigenschaft auf die Unique Table-Eigenschaft festgelegt ist und das Recordset-Objekt das Ergebnis einer auf mehreren Tabellen ausgeführten JOIN-Operation ist, werden durch die Delete-Methode nur Zeilen aus der Tabelle gelöscht, die in der Unique Table-Eigenschaft genannt ist.


DeleteRecord-Methode (ADO)

DeleteRecord-Methode

Löscht eine Datei oder ein Verzeichnis und alle seine Unterverzeichnisse.

Syntax

DeleteRecord Source, Async

Parameter

Source Optional. Ein Wert vom Datentyp String, der einen URL enthält, der die Datei oder das Verzeichnis angibt, das gelöscht werden soll. Wurde Source ausgelassen oder eine leere Zeichenfolge angegeben, wird die Datei oder das Verzeichnis gelöscht, das durch dieses Record-Objekt dargestellt wird.

Async Optional. Ein boolescher Wert, der bei True bestimmt, dass die Löschoperation asynchron sein soll.

Hinweise

Operationen an durch dieses Record-Objekt dargestellten Dateien oder Verzeichnissen können nach Durchführung der Methode fehlschlagen. Nach Aufruf von DeleteRecord sollte das Record-Objekt geschlossen werden, da das Verhalten des Record-Objekts unvorhersehbar werden kann, abhängig davon, wann der Provider das Record-Objekt mit der Datenquelle aktualisiert.

Wurde dieses Record-Objekt von einem Recordset-Objekt erhalten, dann werden die Ergebnisse dieser Operation nicht sofort im Recordset wiedergegeben. Aktualisiert das Recordset-Objekt durch Schließen und erneutes Öffnen oder durch Ausführen der Requery-, Update- und Resync-Methoden des Recordset-Objekts.


Execute-Methode (ADO Command)

Führt die Abfrage, die SQL-Anweisung oder die gespeicherte Prozedur aus, die in der CommandText-Eigenschaft angegeben ist.

Syntax

Für ein Command-Objekt, das Zeilen zurückgibt:

Set recordset = command.Execute( RecordsAffected, Parameters, Options )

Für ein Command-Objekt, das keine Zeilen zurückgibt:

command.Execute RecordsAffected, Parameters, Options

Rückgabewert

Gibt eine Referenz auf ein Recordset-Objekt zurück.

Parameter

RecordsAffected Optional. Eine Long-Variable, an die der Provider die Anzahl von Datensätzen zurückgibt, auf die sich die Operation ausgewirkt hat. Der Parameter RecordsAffected gilt nur für Aktionsabfragen oder gespeicherte Prozeduren. RecordsAffected gibt die Anzahl von Datensätzen nicht zurück, die von einer Abfrage, die Ergebnisse zurückgegeben hat, oder einer gespeicherten Prozedur zurückgegeben wurden. Zum Erhalten dieser Informationen verwenden Sie die RecordCount-Eigenschaft.

Parameters Optional. Ein Variant-Array von Parameterwerten, das mit einer SQL-Anweisung übergeben wird. (Ausgabeparameter geben keine richtigen Werte zurück, wenn sie in diesem Argument übergeben werden.)

Options Optional. Ein Wert vom Datentyp Long, der angibt, wie der Provider die CommandText-Eigenschaft des Command-Objekts auswerten soll. Es können ein oder mehrere CommandTypeEnum- oder ExecuteOptionEnum-Werte sein.

Hinweise

Durch Verwenden der Execute-Methode in einem Command-Objekt wird die Abfrage ausgeführt, die in der CommandText-Eigenschaft des Objekts angegeben ist. Falls die CommandText-Eigenschaft eine Abfrage angibt, die Zeilen zurückgibt, werden alle von der Ausführung erzeugten Ergebnisse in einem neuen Recordset-Objekt gespeichert. Wenn der Befehl eine Abfrage ist, die keine Zeilen zurückgibt, gibt der Provider ein geschlossenes Recordset-Objekt zurück. In einigen Anwendungssprachen können Sie diesen Rückgabewert ignorieren, falls kein Recordset-Objekt gewünscht ist.

Falls die Abfrage Parameter enthält, werden die aktuellen Werte für die Parameter des Command-Objekts verwendet, sofern diese nicht mit den Parameterwerten außer Kraft gesetzt werden, die mit dem Execute-Aufruf übergeben wurden. Sie können eine Untergruppe der Parameter außer Kraft setzen, indem Sie neue Werte für einige der Parameter auslassen, wenn Sie die Execute-Methode aufrufen. Die Reihenfolge, in der Sie die Parameter angeben, entspricht der Reihenfolge, die von der Methode für die Übergabe verwendet wird. Wenn z. B. vier (oder mehr) Parameter vorhanden sind und Sie neue Werte nur für den ersten und vierten Parameter übergeben möchten, würden Sie Array(var1,,,var4) als Parameters-Argument übergeben.

Anmerkung Ausgabeparameter geben keine richtigen Werte aus, wenn sie im Parameters-Argument übergeben werden.

Nach Abschluss dieser Operation wird ein ExecuteComplete-Ereignis ausgegeben.


Execute-Methode (ADO Connection)

Führt die angegebene Abfrage, die SQL-Anweisung, die gespeicherte Prozedur oder einen providerspezifischen Text aus.

Syntax

Für eine Befehlszeichenfolge, die keine Zeilen zurückgibt:

connection.Execute CommandText, RecordsAffected, Options

Für eine Befehlszeichenfolge, die Zeilen zurückgibt:

Set recordset = connection.Execute (CommandText, RecordsAffected, Options)

Rückgabewert

Gibt eine Referenz auf ein Recordset-Objekt zurück.

Parameter

CommandText Ein Wert vom Datentyp String, der die auszuführende SQL-Anweisung, den Tabellennamen, die gespeicherte Prozedur, einen URL oder den providerspezifischen Text enthält.

RecordsAffected Optional. Eine Variable vom Datentyp Long, an die der Provider die Anzahl der Datensätze zurückgibt, auf die sich die Operation ausgewirkt hat.

Options Optional. Ein Wert vom Datentyp Long, der angibt, wie der Provider das CommandText-Argument auswerten soll. Es können ein oder mehrere CommandTypeEnum- oder ExecuteOptionEnum-Werte sein.

Hinweise

Durch Verwenden der Execute-Methode in einem Connection-Objekt wird die Abfrage ausgeführt, die Sie im CommandText-Argument in der angegebenen Verbindung an die Methode übergeben haben. Falls das CommandText-Argument eine Abfrage festlegt, die Zeilen zurückgibt, werden alle von der Ausführung erzeugten Ergebnisse in einem neuen Recordset-Objekt gespeichert. Wenn der Befehl eine Abfrage ist, die keine Zeilen zurückgibt, gibt der Provider ein geschlossenes Recordset-Objekt zurück.

Das zurückgegebene Recordset-Objekt ist immer ein schreibgeschützter Vorwärts-Cursor. Wenn Sie ein Recordset-Objekt mit einer größeren Funktionalität benötigen, erstellen Sie zunächst ein Recordset-Objekt mit den gewünschten Eigenschaftseinstellungen. Verwenden Sie anschließend die Open-Methode des Recordset-Objekts, um die Abfrage auszuführen und den gewünschten Cursortyp zurückzugeben.

Die Inhalte des CommandText-Arguments sind providerspezifisch und können eine Standard-SQL-Syntax oder jedes bestimmte Befehlsformat besitzen, das vom Provider unterstützt wird.

Nach Abschluss dieser Operation wird ein ExecuteComplete-Ereignis ausgegeben.


Find-Methode (ADO)

Find-Methode

Sucht in einem Recordset-Objekt nach dem Datensatz, der den angegebenen Kriterien entspricht. Optional kann die Suchrichtung, die Startzeile und das Offset der Startzeile angegeben werden. Ist das Kriterium erfüllt, wird der gefundene Datensatz zur aktuellen Zeilenposition. Andernfalls wird der Zeiger auf das Ende (oder den Anfang) des Recordset festgelegt.

Syntax

Find (Criteria, SkipRows, SearchDirection, Start)

Parameter

Criteria Ein Wert vom Datentyp String, der eine Anweisung enthält, mit der der in der Suche zu verwendende Spaltenname, Vergleichsoperator und Wert angegeben wird.

SkipRows Optional. Ein Wert vom Datentyp Long mit einem Standardwert von Null, der den Zeilenoffset der aktuellen Zeile oder das Start-Lesezeichen angibt, an dem mit der Suche begonnen wird. Standardmäßig beginnt die Suche an der aktuellen Zeile.

SearchDirection Optional. Ein SearchDirectionEnum-Wert, der angibt, ob in der aktuellen Zeile oder in der nächsten in Suchrichtung verfügbaren Zeile mit der Suche begonnen werden soll. Eine erfolglose Suche stoppt am Ende des Recordset-Objekts, wenn der Wert adSearchForward ist. Eine erfolglose Suche stoppt am Anfang des Recordset-Objekts, wenn der Wert adSearchBackward ist.

Start Optional. Ein Variant-Lesezeichen, das als Startposition für die Suche dient.

Hinweise

In Criteria kann nur ein einspaltiger Name angegeben werden. Diese Methode unterstützt keine mehrspaltigen Suchen.

Der Vergleichsoperator im Criteria-Argument kann ">" (größer als), "<" (kleiner als), "=" (gleich) ">=" (größer gleich), "<=" (kleiner gleich), "<>" (ungleich) oder "like" (Mustervergleich) sein.

Der Wert in Criteria kann eine Zeichenfolge, eine Fließkommazahl oder ein Datum sein. Zeichenfolgenwerte werden durch einfache Anführungszeichen oder "#"-Marken (Nummernzeichen) getrennt (z. B. "state = 'WA'" oder "state = #WA#"). Datenwerte werden durch "#"-Marken (Nummernzeichen) abgetrennt (z. B. "start_date > #7/22/97#").

Ist der Vergleichsoperator "like", kann der Zeichenfolgenwert ein Sternchen (*) enthalten, um ein oder mehrere Vorkommnisse eines Zeichens oder einer Teilzeichenfolge zu suchen. Beispielsweise werden für "state like 'M*'" Maine und Massachusetts als Übereinstimmungen gefunden. Sie können auch führende und nachstehende Sternchen verwenden, um eine in den Werten enthaltene Teilzeichenfolge zu finden. Beispielsweise werden für "state like '*as*'" Alaska, Arkansas und Massachusetts als Übereinstimmungen gefunden.

Sternchen können nur am Ende einer Criteria-Zeichenfolge oder am Anfang und am Ende einer Criteria-Zeichenfolge verwendet werden, wie oben gezeigt. Sie können das Sternchen nicht als führenden Platzhalter ('*str') oder eingebetteten Platzhalter ('s*r') verwenden. Das wird zu einem Fehler führen.

Anmerkung Ein Fehler tritt auf, wenn eine aktuelle Zeilenposition nicht vor Aufruf der Find-Methode festgelegt wurde. Eine Methode, die eine Zeilenposition festlegt, wie z. B. die MoveFirst-Methode, sollte vor dem Aufrufen der Find-Methode aufgerufen werden.


Flush-Methode (ADO)

Flush-Methode

Zwingt den Inhalt des Stream-Objekts, im ADO-Puffer eines zugrunde liegenden Objekts zu verbleiben, das mit dem Stream verbunden ist.

Syntax

Stream.Flush

Hinweise

Diese Methode kann verwendet werden, um den Inhalt eines Datenstrompuffers an das zugrunde liegende Objekt, das durch den URL dargestellt wird und die Quelle des Stream-Objekts ist, zu senden. Diese Methode sollte aufgerufen werden, wenn Sie sichergehen möchten, dass alle am Inhalt des Stream-Objekts vorgenommenen Änderungen geschrieben werden. Mit ADO ist es normalerweise nicht notwendig, Flush aufzurufen, weil ADO so viel wie möglich kontinuierlich seinen Puffer im Hintergrund leert. Änderungen am Inhalt des Stream-Objekts werden automatisch vorgenommen; bis zum Aufruf von Flush werden sie nicht zwischengespeichert.

Das Schließen eines Stream mit der Close-Methode leert automatisch den Inhalt eines Stream-Objekts; es ist daher nicht notwendig, explizit Flush unmittelbar vor Close aufzurufen.


GetChildren-Methode (ADO)

GetChildren-Methode

Gibt ein Recordset-Objekt zurück, dessen Zeilen die Dateien und Unterverzeichnisse im Verzeichnis darstellen, das durch dieses Record-Objekt dargestellt wird.

Syntax

Set recordset = record.GetChildren

Rückgabewert

Ein Recordset-Objekt, für das jede Zeile eine Datei oder ein Verzeichnis darstellt.

Hinweise

Der Provider bestimmt, welche Spalten im zurückgegebenen Recordset-Objekt vorhanden sind. Ein Dokumentenquellenprovider gibt z. B. immer ein Recordset-Objekt einer Ressource zurück.


GetChunk-Methode (ADO)

GetChunk-Methode

Gibt den gesamten Inhalt oder eine Teilmenge des Inhalts eines Field-Objekts zurück, das langen Text oder Binärdaten enthält.

Syntax

variable = field.GetChunk( Size )

Rückgabewert

Gibt einen Wert vom Datentyp Variant zurück.

Parameter

Size Ein Ausdruck vom Datentyp Long, der der abzurufenden Byte- oder Zeichenanzahl entspricht, die Sie abrufen möchten.

Hinweise

Verwenden Sie die GetChunk-Methode in einem Field-Objekt, um einen Teil der bzw. alle langen Binär- oder Zeichendaten abzurufen. Bei beschränktem Systemspeicher können Sie die GetChunk-Methode verwenden, um Werte mit erweiterter Länge in Teilen statt in ihrer Gesamtheit zu bearbeiten.

Die durch einen Aufruf von GetChunk zurückgegebenen Daten werden Variable zugewiesen. Falls Size größer als die vorhandenen Daten ist, gibt die GetChunk-Methode nur die vorhandenen Daten zurück, ohne Variable mit Leerstellen aufzufüllen. Falls das Feld leer ist, gibt die GetChunk-Methode einen Null-Wert zurück.

Jeder nachfolgende Aufruf von GetChunk ruft die Daten von der Stelle an ab, an welcher der vorhergehende GetChunk-Aufruf aufgehört hat. Wenn Sie Daten jedoch aus einem Feld abrufen und dann den Wert eines anderen Feldes in dem aktuellen Datensatz festlegen oder lesen, geht ADO davon aus, dass Sie das Abrufen der Daten aus dem ersten Feld abgeschlossen haben. Wenn Sie die GetChunk-Methode für das erste Feld erneut aufrufen, interpretiert ADO den Aufruf als eine neue GetChunk-Operation und beginnt mit dem Lesen am Anfang der Daten. Die GetChunk-Operation wird durch das Zugreifen auf Felder in anderen Recordset-Objekten, die keine Duplikate des ersten Recordset-Objekts sind, nicht unterbrochen.

Falls das adFldLong-Bit in der Attributes-Eigenschaft eines Field-Objekts auf True eingestellt ist, können Sie die GetChunk-Methode für dieses Feld verwenden.

Falls kein aktueller Datensatz vorhanden ist, wenn Sie die GetChunk-Methode in einem Field-Objekt verwenden, tritt Fehler 3021 (keine aktuellen Datensätze) auf.

Anmerkung Die GetChunk-Methode funktioniert nicht bei Field-Objekten eines Record-Objekts. Es werden keine Operationen durchgeführt, und es wird ein Laufzeitfehler hervorgerufen.


GetRows-Methode (ADO)

GetRows-Methode

Ruft mehrere Datensätze eines Recordset-Objekts in ein Array ab.

Syntax

array = recordset.GetRows( Rows, Start, Fields )

Rückgabewert

Gibt eine Variant-Variable zurück, deren Wert ein zweidimensionales Array ist.

Parameter

Rows Optional. Ein GetRowsOptionEnum-Wert, der die Anzahl abzurufender Datensätze anzeigt. Der Standardwert ist adGetRowsRest.

Start Optional. Ein Wert vom Datentyp String oder Variant, der das Lesezeichen für den Datensatz ergibt, bei dem die GetRows-Operation beginnen soll. Sie können auch einen BookmarkEnum-Wert verwenden.

Fields Optional. Eine Variable vom Datentyp Variant, die einen einzelnen Feldnamen, eine Ordinalposition, ein Array mit Feldnamen oder Ordinalpositionszahlen darstellt. ADO gibt nur die Daten in diesen Feldern zurück.

Hinweise

Verwenden Sie die GetRows-Methode, um Datensätze aus einem Recordset in ein zweidimensionales Array zu kopieren. Der erste Index kennzeichnet das Feld und der zweite die Datensatznummer. Die Array-Variable erhält automatisch die richtige Größe, wenn die GetRows-Methode die Daten zurückgibt.

Wenn Sie keinen Wert für das Rows-Argument angeben, ruft die GetRows-Methode automatisch alle Datensätze im Recordset-Objekt ab. Falls Sie mehr Datensätze anfordern, als vorhanden sind, gibt GetRows nur die Anzahl der verfügbaren Datensätze zurück.

Falls das Recordset-Objekt Lesezeichen unterstützt, können Sie angeben, bei welchem Datensatz die GetRows-Methode den Datenabruf beginnen soll, indem Sie den Wert der Bookmark-Eigenschaft dieses Datensatzes in das Start-Argument übergeben.

Wenn Sie die Felder beschränken möchten, die der GetRows-Aufruf zurückgibt, können Sie im Fields-Argument entweder einen einzelnen Feldnamen, eine einzelne Feldnummer oder ein Array mit Feldnamen bzw. -nummern übergeben.

Nachdem Sie GetRows aufgerufen haben, wird der nächste ungelesene Datensatz zum aktuellen Datensatz. Falls es keine weiteren Datensätze gibt, wird die EOF-Eigenschaft auf True festgelegt.


GetString-Methode (ADO)

GetString-Methode

Gibt das Recordset-Objekt als eine Zeichenfolge zurück.

Syntax

Set Variant = recordset.GetString(StringFormat, NumRows, ColumnDelimiter, RowDelimiter, NullExpr)

Rückgabewert

Gibt das Recordset-Objekt als eine Variant-Variable (BSTR) mit Zeichenfolgenwerten zurück.

Parameter

StringFormat Ein StringFormatEnum-Wert, der festlegt, wie das Recordset-Objekt in eine Zeichenfolge konvertiert werden soll. Die Parameter RowDelimiter, ColumnDelimiter und NullExpr werden nur mit einem StringFormat von adClipString verwendet.

NumRows Optional. Die Anzahl der Zeilen, die im Recordset konvertiert werden sollen. Wenn NumRows nicht angegeben wurde oder wenn es größer als die Gesamtanzahl der Zeilen im Recordset ist, werden alle Zeilen im Recordset konvertiert.

ColumnDelimiter Optional. Sofern angegeben, wird ein Trennzeichen zwischen den Spalten verwendet, andernfalls das Tabstoppzeichen.

RowDelimiter Optional. Sofern angegeben, wird ein Trennzeichen zwischen den Zeilen verwendet, andernfalls das Zeichen für Wagenrücklauf.

NullExpr Optional. Sofern angegeben, wird anstelle eines Null-Wertes ein Ausdruck verwendet, andernfalls die leere Zeichenfolge.

Hinweise

In der Zeichenfolge werden zwar Zeilendaten, jedoch keine Strukturdaten gespeichert. Daher kann ein Recordset unter Verwendung dieser Zeichenfolge nicht erneut geöffnet werden.

Diese Methode entspricht der GetClipString-Methode in RDO.


LoadFromFile-Methode (ADO)

LoadFromFile-Methode

Lädt den Inhalt einer vorhandenen Datei in ein Stream-Objekt.

Syntax

Stream.LoadFromFile FileName

Parameter

FileName Ein Wert vom Datentyp String, der den Namen einer in den Stream zu ladenden Datei enthält. FileName kann einen gültigen Pfad und Namen im UNC-Format enthalten. Ist die angegebene Datei nicht vorhanden, tritt ein Laufzeitfehler auf.

Hinweise

Diese Methode kann zum Laden des Inhalts einer lokalen Datei in ein Stream-Objekt verwendet werden. Diese Methode kann zum Laden des Inhalts einer lokalen Datei auf einen Server verwendet werden.

Das Stream-Objekt muss vor den Aufrufen von LoadFromFile bereits geöffnet sein. Diese Methode verändert die Bindung des Stream-Objekts nicht; es bleibt an das durch den URL angegebene Objekt gebunden, mit dem das Stream-Objekt original geöffnet wurde. LoadFromFile überschreibt den aktuellen Inhalt des Stream-Objekts mit den von der Datei gelesenen Daten.

Vorhandene Bytes im Stream-Objekt werden mit dem Inhalt der Datei überschrieben. Der durch LoadFromFile erzeugten EOS-Eigenschaft folgend, werden zuvor vorhandene und verbleibende Bytes abgeschnitten.

Nach dem Aufruf von LoadFromFile wird die aktuelle Position auf den Anfang des Streams festgelegt (Position-Eigenschaft ist 0).


Move-Methode (ADO)

Move-Methode

Verschiebt die Position des aktuellen Datensatzes in einem Recordset-Objekt.

Syntax

recordset.Move NumRecords, Start

Parameter

NumRecords Ein Long-Ausdruck, der die Anzahl der Datensätze festlegt, um welche die aktuelle Datensatzposition verschoben werden soll

Start Optional. Ein Wert vom Datentyp String oder Variant, der ein Lesezeichen ergibt. Sie können auch einen BookmarkEnum-Wert verwenden.

Hinweise

Die Move-Methode wird von allen Recordset-Objekten unterstützt.

Falls das NumRecords-Argument größer als Null ist, wird die aktuelle Datensatzposition in Vorwärtsrichtung (in Richtung des Recordset-Endes) verschoben. Falls NumRecords kleiner als Null ist, wird die aktuelle Datensatzposition rückwärts (in Richtung des Recordset-Anfangs) verschoben.

Falls der Aufruf von Move die aktuelle Datensatzposition an eine Stelle vor dem ersten Datensatz verschieben würde, legt ADO den aktuellen Datensatz auf die Position vor dem ersten Datensatz im Recordset fest (die BOF-Eigenschaft ist True). Der Versuch, sich rückwärts zu bewegen, wenn die BOF-Eigenschaft bereits den Wert True besitzt, löst einen Fehler aus.

Falls der Aufruf von Move die aktuelle Datensatzposition an eine Stelle nach dem letzten Datensatz verschieben würde, legt ADO den aktuellen Datensatz auf die Position nach dem letzten Datensatz im Recordset fest (die EOF-Eigenschaft ist True). Der Versuch, sich vorwärts zu bewegen, wenn die EOF-Eigenschaft bereits den Wert True besitzt, löst einen Fehler aus.

Das Aufrufen der Move-Methode aus einem leeren Recordset-Objekt löst einen Fehler aus.

Wenn Sie das Start-Argument übergeben, verläuft das Verschieben relativ zum Datensatz mit diesem Lesezeichen, falls das Recordset-Objekt Lesezeichen unterstützt. Falls nicht angegeben, verläuft das Verschieben relativ zum aktuellen Datensatz.

Wenn Sie die CacheSize-Eigenschaft zum lokalen Cachen von Datensätzen des Providers verwenden, dann veranlasst dies ADO bei der Übergabe eines NumRecords-Arguments, das die aktuelle Datensatzposition zwischengespeicherter Datensätze aus der aktuellen Gruppe hinaus verschiebt, eine neue Gruppe von Datensätzen, beginnend mit dem Zieldatensatz, abzurufen. Die CacheSize-Eigenschaft bestimmt die Größe der neu abgerufenen Gruppe. Der Zieldatensatz ist der erste abgerufene Datensatz.

Falls das Recordset-Objekt nur vorwärts gerichtet ist, kann der Benutzer so lange ein NumRecords-Argument unter Null übergeben, wie sich das Ziel innerhalb der aktuellen Menge der zwischengespeicherten Datensätze befindet. Falls der Aufruf von Move die aktuelle Datensatzposition zu einem Datensatz vor dem ersten zwischengespeicherten Datensatz verschiebt, tritt ein Fehler auf. Daher kann es vorteilhafter sein, den Datensatzcache eines Providers zu verwenden, der ein Blättern in beide Richtungen unterstützt, als den Datensatzcache eines Providers, der nur das vorwärts gerichtete Blättern unterstützt. Da zwischengespeicherte Datensätze in den Speicher geladen werden, sollten Sie möglichst nicht mehr Datensätze als nötig zwischenspeichern. Selbst wenn ein ausschließlich vorwärts gerichtetes Recordset-Objekt auf diese Weise Verschiebungen in Rückwärtsrichtung unterstützt, wird das Aufrufen der MovePrevious-Methode für jedes ausschließlich vorwärts gerichtete Recordset-Objekt weiterhin einen Fehler auslösen.


MoveFirst-, MoveLast-, MoveNext- und MovePrevious-Methoden (ADO)

MoveFirst-, MoveLast-, MoveNext- und MovePrevious-Methoden

Wechselt zum ersten, letzten, nächsten oder vorherigen Datensatz in einem angegebenen Recordset-Objekt und definiert diesen Datensatz als den aktuellen Datensatz.

Syntax

recordset.{MoveFirst | MoveLast | MoveNext | MovePrevious}

Hinweise

Verwenden Sie die MoveFirst-Methode, um die aktuelle Datensatzposition zum ersten Datensatz im Recordset zu verschieben.

Verwenden Sie die MoveLast-Methode, um die aktuelle Datensatzposition zum letzten Datensatz im Recordset zu verschieben. Das Recordset-Objekt muss Lesezeichen oder rückwärts gerichtete Bewegungen des Cursors unterstützen; andernfalls löst der Aufruf der Methode einen Fehler aus.

Verwenden Sie die MoveNext-Methode, um die aktuelle Datensatzposition um einen Datensatz vorwärts (in Richtung des Recordset-Endes) zu verschieben. Falls der aktuelle Datensatz der letzte Datensatz ist und Sie die MoveNext-Methode aufrufen, legt ADO den aktuellen Datensatz an die Position nach dem letzten Datensatz im Recordset fest (EOF ist True). Der Versuch, sich vorwärts zu bewegen, wenn die EOF-Eigenschaft bereits den Wert True besitzt, löst einen Fehler aus.

In den Fällen, in denen das Recordset-Objekt gefiltert oder sortiert wurde und die aktuellen Daten des Datensatzes geändert werden, kann sich die Position auch verändern. In solchen Fällen arbeitet die MoveNext-Methode normal, aber Sie sollten beachten, dass die Position einen Datensatz vorwärts von der neuen Position verschoben wird, nicht von der alten Position. Ändern der Daten im aktuellen Datensatz, dass der Datensatz beispielsweise an das Ende des sortierten Recordset-Objekts verschoben wird, würde z. B. bedeuten, dass das Aufrufen von MoveNext in der ADO-Einstellung des aktuellen Datensatzes auf der Position nach dem letzten Datensatz im Recordset resultiert (EOF = True).

Verwenden Sie die MovePrevious-Methode, um die aktuelle Datensatzposition einen Datensatz zurück zu verschieben (in Richtung des Recordset-Anfangs). Das Recordset-Objekt muss Lesezeichen oder rückwärts gerichtete Cursorbewegungen unterstützen; andernfalls löst der Aufruf der Methode einen Fehler aus. Falls der aktuelle Datensatz der erste Datensatz ist und Sie die MovePrevious-Methode aufrufen, legt ADO den aktuellen Datensatz auf die Position vor dem ersten Datensatz im Recordset fest (BOF ist True). Der Versuch, sich rückwärts zu bewegen, wenn die BOF-Eigenschaft bereits den Wert True besitzt, löst einen Fehler aus. Falls das Recordset-Objekt weder Lesezeichen noch rückwärts gerichtete Cursorbewegungen unterstützt, löst die MovePrevious-Methode einen Fehler aus.

Falls das Recordset ausschließlich vorwärts gerichtet ist und Sie Vorwärts- und Rückwärtsblättern unterstützen möchten, können Sie die CacheSize-Eigenschaft verwenden, um einen Datensatzcache zu erstellen, der rückwärts gerichtete Cursorbewegungen durch die Move-Methode unterstützt. Da zwischengespeicherte Datensätze in den Speicher geladen werden, sollten Sie möglichst nicht mehr Datensätze als nötig zwischenspeichern. Sie können die MoveFirst-Methode in einem ausschließlich vorwärts gerichteten Recordset-Objekt aufrufen. In diesem Fall führt der Provider gegebenenfalls erneut den Befehl aus, mit dem das Recordset-Objekt erzeugt wurde.


MoveFirst-, MoveLast-, MoveNext- und MovePrevious-Methoden (RDS)

Wechselt zum ersten, letzten, nächsten oder vorherigen Datensatz in einem angegebenen Recordset-Objekt.

Syntax

DataControl.Recordset.{MoveFirst | MoveLast | MoveNext | MovePrevious}

Parameter

DataControl Eine Objektvariable, die ein DataControl-Objekt darstellt.

Hinweise

Sie können die Move-Methoden bei dem RDS.DataControl-Objekt verwenden, um sich durch die Datensätze in den datengebundenen Steuerelementen einer Webseite zu bewegen. Angenommen, Sie zeigen z. B. ein Recordset in einer Tabelle an, indem Sie es an ein RDS.DataControl-Objekt binden. Sie können dann die Schaltflächen für den ersten, vorhergehenden, nächsten und letzten Datensatz einfügen, die Benutzer verwenden können, um zum entsprechenden Datensatz im angezeigten Recordset zu gelangen. Zu diesem Zweck rufen Sie die MoveFirst-, MoveLast-, MoveNext- und MovePrevious-Methoden des RDS.DataControl-Objekts in den OnClick-Prozeduren für die entsprechenden Schaltflächen auf. Unter Beispielanwendung Address Book wird dieses Verfahren näher erläutert.


MoveRecord-Methode (ADO)

MoveRecord-Methode

Verschiebt eine Datei oder ein Verzeichnis und seine Inhalte zu einem anderen Speicherplatz.

Syntax

MoveRecord (Source, Destination, UserName, Password, Options, Async)

Parameter

Source Optional. Ein Wert vom Datentyp String mit einem URL, der das Record-Objekt kennzeichnet, das verschoben werden soll. Wurde Source ausgelassen oder eine leere Zeichenfolge angegeben, wird die Datei oder das Verzeichnis verschoben, das durch diesen Record dargestellt wird.

Destination Optional. Ein Wert vom Datentyp String mit einem URL, der den Speicherplatz angibt, wohin Source verschoben wird.

UserName Optional. Ein Wert vom Datentyp String, der die Benutzer-ID enthält, die bei Bedarf den Zugriff zu Destination ermöglicht.

Password Optional. Ein Wert vom Datentyp String, der das Kennwort enthält, das bei Bedarf UserName überprüft.

Options Optional. Ein MoveRecordOptionsEnum-Wert, dessen Standardwert adMoveUnspecified ist. Legt das Verhalten dieser Methode fest.

Async Optional. Ein boolescher Wert, der bei True bestimmt, dass diese Operation asynchron sein soll.

Rückgabewert

Ein Wert vom Datentyp String. In der Regel wird der Wert von Destination zurückgegeben. Der exakt zurückgegebene Wert ist jedoch providerabhängig.

Hinweise

Die Werte von Source und Destination dürfen nicht identisch sein, sonst tritt ein Laufzeitfehler auf. Zumindest einer der drei Bestandteile, Server-, Pfad- und Ressourcenname, muss unterschiedlich sein.

Diese Methode aktualisiert alle Hypertextlinks in den verschobenen Dateien, sofern durch Options nichts anderes angegeben wurde. Diese Methode leert eine vorhandene Datei oder ein vorhandenes Verzeichnis, wenn Destination auf diese verweist, sofern adMoveOverWrite angegeben wurde.

Anmerkung Verwenden Sie die adMoveOverWrite-Option umsichtig. Das Angeben dieser Option wird z. B. das Verzeichnis löschen und mit der Datei überschreiben, wenn eine Datei in ein Verzeichnis verschoben wird.

Bestimmte Attribute des Record-Objekts, wie z. B. die ParentURL-Eigenschaft, werden nach Beendigung dieser Operation nicht aktualisiert. Aktualisieren Sie die Eigenschaften des Record-Objekts durch Schließen des Record, und öffnen Sie es dann erneut mit dem URL des Speicherplatzes, wohin die Datei oder das Verzeichnis verschoben wurde.

Wurde dieses Record-Objekt von einem Recordset-Objekt erhalten, wird der neue Speicherplatz der verschobenen Datei oder des Verzeichnisses nicht unmittelbar im Recordset angezeigt. Aktualisieren Sie Recordset durch Schließen und erneutes Öffnen.


NextRecordset-Methode (ADO)

NextRecordset-Methode

Löscht das aktuelle Recordset-Objekt und gibt das nächste Recordset durch das Ausführen einer Reihe von Befehlen zurück.

Syntax

Set recordset2 = recordset1.NextRecordset( RecordsAffected )

Rückgabewert

Gibt ein Recordset-Objekt zurück. Im Syntaxmodell kann es sich bei Recordset1 und Recordset2 um dasselbe Recordset-Objekt handeln. Sie können jedoch auch unterschiedliche Objekte verwenden. Wenn Sie unterschiedliche Recordset-Objekte verwenden, ruft das Zurückstellen der ActiveConnection-Eigenschaft auf das originale Recordset (recordset1), nachdem NextRecordset aufgerufen wurde, einen Fehler hervor.

Parameter

RecordsAffected Optional. Eine Long-Variable, an die der Provider die Anzahl von Datensätzen zurückgibt, auf die sich die aktuelle Operation ausgewirkt hat.

Anmerkung Dieser Parameter gibt nur die Anzahl der Datensätze zurück, auf die sich eine Operation ausgewirkt hat; er gibt keine Zählung der Datensätze aus einer ausgewählten Anweisung zurück, die zum Generieren des Recordset verwendet wurde.

Hinweise

Verwenden Sie die NextRecordset-Methode, um die Ergebnisse des nächsten Befehls einer zusammengesetzten Befehlsanweisung oder die Ergebnisse einer gespeicherten Prozedur, die mehrere Ergebnisse zurückgibt, zurückzugeben. Wenn Sie ein Recordset-Objekt basierend auf einer zusammengesetzten Befehlsanweisung (z. B. "SELECT * FROM table1;SELECT * FROM table2") durch Verwenden der Execute-Methode in einem Command-Objekt oder der Open-Methode in einem Recordset öffnen, führt ADO nur den ersten Befehl aus und gibt die Ergebnisse an recordset zurück. Um auf die Ergebnisse von nachfolgenden Befehlen in der Anweisung zuzugreifen, rufen Sie die NextRecordset-Methode auf.

Solange zusätzliche Ergebnisse vorhanden sind und das Recordset, das die zusammengesetzte Befehlsanweisung enthält, nicht über Prozessgrenzen hinweg durch Marshallinged zurückgegeben wird, gibt die NextRecordset-Methode weiterhin Recordset-Objekte zurück. Das zurückgegebene Recordset-Objekt wird leer sein, wenn ein Befehl, der Zeilen zurückgibt, keine Datensätze zurückgibt. Überprüfen Sie in diesem Fall, ob die BOF- und EOF-Eigenschaften beide True sind. Wenn ein Befehl, der keine Zeilen zurückgibt, erfolgreich ausgeführt wurde, wird das zurückgegebene Recordset-Objekt geschlossen. Dies können Sie durch Testen der State-Eigenschaft in Recordset überprüfen. Wenn keine weiteren Ergebnisse vorhanden sind, wird recordset auf Nothing festgelegt.

Verwenden von Remote Data Service Die NextRecordset-Methode steht auf einem clientseitigen Recordset-Objekt nicht zur Verfügung.

Bei einem Bearbeitungsvorgang im Modus für sofortige Aktualisierung löst das Aufrufen der NextRecordset-Methode einen Fehler aus. Rufen Sie deshalb zunächst die Update- oder die CancelUpdate-Methode auf.

Um Parameter für mehrere Befehle in der zusammengesetzten Anweisung zu übergeben, füllen Sie die Parameters-Auflistung oder übergeben ein Array mit dem ursprünglichen Open- oder Execute-Aufruf; die Parameter müssen in der Auflistung oder dem Array in derselben Reihenfolge angeordnet sein, wie die entsprechenden Befehle in den Befehlsreihen. Sie müssen das Lesen aller Ergebnisse beenden, bevor Ausgabeparameterwerte gelesen werden können.

Wenn Sie die NextRecordset-Methode aufrufen, führt ADO nur den nächsten Befehl in der Anweisung aus. Falls Sie das Recordset-Objekt explizit schließen, bevor Sie die schrittweise Bearbeitung der gesamten Befehlsanweisung durchführen, führt ADO die verbleibenden Befehle nicht aus.


Open-Methode (ADO Connection)

Öffnet eine Verbindung mit einer Datenquelle.

Syntax

connection.Open ConnectionString, UserID, Password, Options

Parameter

ConnectionString Optional. Ein Wert vom Datentyp String, der die Verbindungsinformationen enthält. Einzelheiten zu den gültigen Einstellungen finden Sie unter ConnectionString-Eigenschaft.

UserID Optional. Ein Wert vom Datentyp String, der einen Benutzernamen enthält, der beim Herstellen der Verbindung verwendet wird.

Password Optional. Ein Wert vom Datentyp String, der ein Kennwort enthält, das beim Herstellen der Verbindung verwendet wird.

Options Optional. Ein ConnectOptionEnum-Wert, der bestimmt, ob die Rückgabe durch diese Methode erfolgen sollte, nachdem die Verbindung hergestellt wurde (synchron) oder bevor sie hergestellt wurde (asynchron).

Hinweise

Das Verwenden der Open-Methode in einem Connection-Objekt stellt die physische Verbindung mit einer Datenquelle her. Nachdem diese Methode erfolgreich abgeschlossen wurde, ist die Verbindung aktiv. Sie können nun Befehle darin verwenden und die Ergebnisse verarbeiten.

Verwenden Sie das optionale ConnectionString-Argument, um eine Verbindungszeichenfolge anzugeben, die entweder eine Serie von Anweisungen der Form Argument = Wert enthält, wobei die Anweisungen durch Semikolon getrennt sind, oder aber eine durch einen URL bezeichnete Datei oder eine Verzeichnisressource. Die ConnectionString-Eigenschaft übernimmt automatisch den Wert, der für das ConnectionString-Argument verwendet wird. Deshalb können Sie entweder die ConnectionString-Eigenschaft des Connection-Objekts festlegen, bevor Sie es öffnen, oder Sie verwenden das ConnectionString-Argument, um die aktuellen Verbindungsparameter während des Aufrufs der Open-Methode festzulegen oder zu überschreiben.

Wenn Sie Benutzer- und Kennwortinformationen sowohl im ConnectionString-Argument als auch in den optionalen UserID- und Password-Argumenten übergeben, überschreiben die UserID- und Password-Argumente die in ConnectionString festgelegten Werte.

Wenn Sie diese Operationen in einem geöffneten Connection-Objekt abgeschlossen haben, verwenden Sie die Close-Methode, um alle zugeordneten Systemressourcen freizugeben. Das Schließen eines Objekts entfernt dieses nicht aus dem Speicher. Sie können seine Eigenschaftseinstellungen ggf. ändern und die Open-Methode verwenden, um es später erneut zu öffnen. Um ein Objekt vollständig aus dem Speicher zu entfernen, legen Sie die Objektvariable auf Nothing fest.

Verwendung von Remote Data Service Bei Verwendung in einem clientseitigen Connection-Objekt richtet die Open-Methode erst dann tatsächlich eine Verbindung mit dem Server ein, wenn ein Recordset in dem Connection-Objekt geöffnet wurde.


Open-Methode (ADO Record)

Öffnet ein bestehendes Record-Objekt oder erstellt eine neue Datei oder ein neues Verzeichnis.

Syntax

Open Source, ActiveConnection, Mode, CreateOptions, Options, UserName, Password

Parameter

Source Optional. Ein Wert vom Datentyp Variant, der den URL der durch dieses Record-Objekt dargestellten Einheit oder eine Zeile eines offenen Recordset-Objekts darstellt.

ActiveConnection Optional. Ein Wert vom Datentyp Variant, der die Verbindungszeichenfolge oder das offene Connection-Objekt darstellt, das die Datei oder Verzeichnisse (also den Kontext) angibt, über welche nachfolgende Record-Operationen angewendet werden.

Mode Optional. Ein ConnectModeEnum-Wert, dessen Standardwert adModeUnknown ist, der den Zugriffsmodus für das resultierende Record-Objekt angibt.

CreateOptions Optional. Ein RecordCreateOptionsEnum-Wert, dessen Standardwert adFailIfNotExists ist, der angibt, ob eine bestehende Datei oder ein bestehendes Verzeichnis geöffnet werden soll oder eine neue Datei oder ein neues Verzeichnis erstellt werden soll. Wenn der Standardwert festgelegt wird, wird der Zugriffsmodus von der Mode-Eigenschaft angefordert.

Options Optional. Ein RecordOpenOptionsEnum-Wert, dessen Standardwert adOpenRecordUnspecified ist, der Optionen zum Öffnen des Record angibt. Diese Werte können kombiniert werden.

UserName Optional. Ein Wert vom Datentyp String, der die Benutzer-ID enthält, die nötigenfalls den Zugriff auf die mit Source angegebene Quelle ermöglicht.

Password Optional. Ein Wert vom Datentyp String, der das Kennwort enthält, das nötigenfalls UserName bestätigt.

Hinweise

Source kann sein:

  • Ein absoluter URL - Source zeigt eine bestehende Datei oder ein bestehendes Verzeichnis an. Wurde ActiveConnection nicht bestimmt, dann wird Source verwendet, um ein Connection-Objekt implizit zu erstellen.

  • Ein relativer URL - In diesem Fall legt ActiveConnection den Kontext fest, in dem der relative URL definiert wurde, und muss ein gültiges Connection-Objekt, einen absoluten URL oder ein Record-Objekt enthalten, das ein Verzeichnis darstellt.

  • Ein offenes Recordset-Objekt - Das offene Record-Objekt stellt die aktuelle Zeile im Recordset dar. Sie können ein lokales Record unter Verwendung eines Proxy eines Recordset nicht öffnen, wie z. B. das durch ein bereitgestelltes benutzerdefiniertes Geschäftsobjekt auf der mittleren Ebene.

    Der Anwender muss das Recordset an der gewünschten Zeile vor Öffnen des Record-Objekts positionieren.

    Das Record-Objekt übernimmt den sofortigen Aktualisierungs- oder Stapelaktualisierungsmodus des Recordset-Objekts. Im Stapelmodus werden die am Record-Objekt vorgenommenen Änderungen an die Datenquelle übermittelt, wenn die UpdateBatch-Methode auf dem Recordset aufgerufen wird.

    Die Fields-Auflistung des Recordset-Objekts kann als Zugriff auf die OriginalValue- und UnderlyingValue-Eigenschaften der Felder in Bezug zu den Record- und Recordset-Objekten verwendet werden. Es gibt jedoch keine Möglichkeit, diese Feldeigenschaften anzusehen, sie existieren nur auf dem Record-Objekt.

    CreateOptions kann nicht verwendet werden, wenn die Quelle ein Recordset-Objekt ist, da es nicht möglich ist, neue Zeilen direkt in einem Recordset zu erstellen.

    Das offene Recordset kann den neuen Record nicht wiedergeben, bis das Recordset geschlossen und erneut geöffnet wurde.

    Ein Laufzeitfehler tritt auf, wenn das Recordset an BOF oder EOF positioniert wird, keine Zeilen enthält, der zugrunde liegende Provider Record-Objekte nicht unterstützt oder CreateOptions bestimmt wurde.

Wenn das Record-Objekt eine Einheit darstellt, auf die nicht mit einem URL zugegriffen werden kann (z. B. eine Zeile eines Recordset, abgeleitet aus einer Datenbank), dann sind die beiden Werte, die ParentURL-Eigenschaft und das Feld, auf das mit adRecordURL zugegriffen wird, konstant Null.

Verwendung

Die folgende gültige Open-Anweisung verwendet die Website, sample.microsoft.com, nur als ein Beispiel eines URL.

In der ersten Anweisung ist die Quelle der URL eines Ordners. Eine Verbindung wird implizit aus dem URL erstellt.

Dim Record As ADODB.Record
Set Record = New ADODB.Record
Record.Open "http://sample.microsoft.com/myfolder/"

In der zweiten Anweisung ist die Quelle ein URL im Kontext der gegebenen Verbindungszeichenfolge. Das Schlüsselwort "URL=" gibt an, dass die Verbindungszeichenfolge ein URL ist.

Dim Record As ADODB.Record
Set Record = New ADODB.Record
Record.Open "mysubfolder", "URL=http://sample.microsoft.com/myfolder/"

In der dritten Anweisung ist die Quelle ein relativer URL im Kontext des gegebenen, offenen Connection-Objekts.

Dim Connection As ADODB.Connection
Dim Record As ADODB.Record
Set Connection = New ADODB.Connection
Set Record = New ADODB.Record
Connection.Open "URL=http://sample.microsoft.com/myfolder/"
Record.Open "mydoc.doc", Connection

In der vierten Anweisung ist die Quelle ein relativer URL im Kontext eines offenen Record-Objekts, das ein Verzeichnis darstellt.

Dim Record As ADODB.Record
Dim anotherRecord As ADODB.Record
Set Record = New ADODB.Record
Set anotherRecord = New ADODB.Record
anotherRecord.Open "http://sample.microsoft.com/myfolder/"
Record.Open "mydoc.doc", anotherRecord

In der fünften Anweisung ist die Quelle eine aktuelle Zeile eines offenen Recordset. Wird das URL-Schlüsselwort im Connection-Parameter der Open-Methode für ein Recordset verwendet, sollten Sie adCmdTableDirect im Options-Parameter angeben.

Dim Recordset As ADODB.Recordset
Set Recordset = New ADODB.Recordset
Recordset.Open "mydoc.doc", _
   "URL=http://sample.microsoft.com/myfolder/",,,adCmdTableDirect
Recordset.MoveLast()
Record.Open Recordset


Open-Methode (ADO Recordset)

Öffnet einen Cursor.

Syntax

recordset.Open Source, ActiveConnection, CursorType, LockType, Options

Parameter

Source Optional. Ein Wert vom Datentyp Variant, der ein gültiges Command-Objekt, eine SQL-Anweisung, einen Tabellennamen, einen Aufruf einer gespeicherten Prozedur, einen URL oder den Namen einer Datei oder eines Stream-Objekts ergibt, der ein dauerhaft gespeichertes Recordset enthält.

ActiveConnection Optional. Entweder ein Wert vom Datentyp Variant, der einen gültigen variablen Namen des Connection-Objekts ergibt, oder ein Wert vom Datentyp String, der ConnectionString-Parameter enthält.

CursorType Optional. Ein CursorTypeEnum-Wert, der den Cursortyp bestimmt, den der Provider beim Öffnen des Recordset-Objekts verwendet. Der Standardwert ist adOpenForwardOnly.

LockType Optional. Ein LockTypeEnum-Wert, der bestimmt, welches Sperrverfahren (Parallelität) der Provider beim Öffnen des Recordset-Objekts verwenden soll. Der Standardwert ist adLockReadOnly.

Options Optional. Ein Wert vom Datentyp Long, der angibt, wie der Provider das Source-Argument auswertet, wenn dieses kein Command-Objekt darstellt, oder angibt, dass das Recordset aus einer Datei wiederhergestellt wird, in der es vorher gespeichert war. Es können eine oder mehrere CommandTypeEnum- oder ExecuteOptionEnum-Werte sein.

Anmerkung Wenn Sie ein Recordset von einem Stream öffnen, der ein dauerhaft gespeichertes Recordset enthält, welches einen ExecuteOptionEnum-Wert des adAsyncFetchNonBlocking verwendet, hat das keinen Effekt; das Abrufen wird synchron und blockiert werden.

Hinweise

Das Verwenden der Open-Methode in einem Recordset-Objekt öffnet einen Cursor, der Datensätze aus einer Basistabelle, die Ergebnisse einer Abfrage oder ein zuvor gespeichertes Recordset darstellt.

Verwenden Sie das optionale Source-Argument, um eine Datenquelle anzugeben, die eines der folgenden Elemente verwendet: eine Command-Objektvariable, eine SQL-Anweisung, eine gespeicherte Prozedur, einen Tabellennamen, einen URL oder einen vollständigen Pfadnamen einer Datei. Handelt es sich bei Source um den Pfadnamen einer Datei, so kann dieser Pfad vollständig sein ("c:\dir\file.rst"), er kann relativ sein ("..\file.rst"), oder er kann ein URL sein ("http://files/file.rst").

Das ActiveConnection-Argument entspricht der ActiveConnection-Eigenschaft und gibt an, in welcher Verbindung das Recordset-Objekt geöffnet wird. Wenn Sie eine Verbindungsdefinition für dieses Argument übergeben, öffnet ADO eine neue Verbindung unter Verwendung der festgelegten Parameter. Sie können den Wert dieser Eigenschaft nach dem Öffnen des Recordset ändern, um Aktualisierungen an einen anderen Provider zu senden. Sie können diese Eigenschaft jedoch auch auf Nothing (in Microsoft Visual Basic) festlegen, um die Verbindung des Recordset zu allen Providern zu trennen.

Für die weiteren Argumente, die den Eigenschaften eines Recordset-Objekts (Source, CursorType und LockType) direkt entsprechen, ist die Beziehung der Argumente zu den Eigenschaften wie folgt:

  • Die Eigenschaft ist eine Lese-/Schreibeigenschaft, bevor das Recordset-Objekt geöffnet wird.

  • Die Eigenschaftseinstellungen werden verwendet, sofern Sie die entsprechenden Argumente nicht beim Ausführen der Open-Methode übergeben. Wenn Sie ein Argument übergeben, überschreibt es die entsprechende Eigenschaftseinstellung. Diese wird dann mit dem Argumentwert aktualisiert.

  • Nachdem Sie das Recordset-Objekt geöffnet haben, werden diese Eigenschaften schreibgeschützt.

    Anmerkung Die ActiveConnection-Eigenschaft ist schreibgeschützt für Recordset-Objekte, deren Source-Eigenschaft auf ein gültiges Command-Objekt festgelegt ist, selbst wenn das Recordset-Objekt nicht geöffnet ist.

Wenn Sie gleichzeitig ein Command-Objekt im Source-Argument und ein ActiveConnection-Argument übergeben, tritt ein Fehler auf. Die ActiveConnection-Eigenschaft des Command-Objekts muss bereits auf ein gültiges Connection-Objekt oder eine Verbindungszeichenfolge festgelegt sein.

Wenn Sie ein anderes Element als ein Command-Objekt im Source-Argument übergeben, können Sie das Options-Argument verwenden, um die Auswertung des Source-Arguments zu optimieren. Falls das Options-Argument nicht definiert ist, werden Sie ggf. eine verminderte Leistung feststellen, da ADO Aufrufe an den Provider durchführen muss, um zu bestimmen, ob es sich bei dem Argument um eine SQL-Anweisung, eine gespeicherte Prozedur, einen URL oder einen Tabellennamen handelt. Wenn Sie wissen, welchen Source-Typ Sie verwenden, wird ADO durch das Festlegen des Options-Arguments angewiesen, direkt zum jeweiligen Code zu springen. Falls das Options-Argument nicht mit dem Source-Typ übereinstimmt, tritt ein Fehler auf.

Wenn Sie ein Stream-Objekt im Source-Argument übergeben, sollten Sie keine Informationen in die anderen Argumente übergeben. Dieses Vorgehen wird einen Fehler auslösen. Die ActiveConnection-Information wird nicht zurückgehalten, wenn ein Recordset aus einem Stream geöffnet wird.

Der Standardwert für das Options-Argument ist adCommandFile, sofern dem Recordset keine Verbindung zugeordnet ist. Dies ist in der Regel bei dauerhaft gespeicherten Recordset-Objekten der Fall.

Wenn die Datenquelle keine Datensätze zurückgibt, legt der Provider sowohl für die BOF- als auch die EOF-Eigenschaft den Wert true fest. Die aktuelle Datensatzposition ist nicht definiert. Sie können zu diesem leeren Recordset-Objekt weiter neue Daten hinzufügen, falls der Cursortyp dies zulässt.

Wenn Sie die Operationen in einem geöffneten Recordset-Objekt abgeschlossen haben, verwenden Sie die Close-Methode, um alle zugeordneten Systemressourcen freizugeben. Das Schließen eines Objekts entfernt dieses nicht aus dem Speicher. Sie können seine Eigenschaftseinstellungen ggf. ändern und die Open-Methode verwenden, um es später erneut zu öffnen. Um ein Objekt vollständig aus dem Speicher zu entfernen, legen Sie die Objektvariable auf Nothing fest.

Rufen Sie vor dem Festlegen der ActiveConnection-Eigenschaft die Open-Methode ohne Operanden auf, um eine Instanz eines Recordset zu erstellen, das durch Anhängen von Feldern an die Fields-Auflistung des Recordset erstellt wurde.

Wenn Sie die CursorLocation-Eigenschaft auf adUseClient festgelegt haben, können Sie Zeilen asynchron abrufen. Dazu haben Sie zwei Möglichkeit: Die empfohlene Methode ist, Options auf adAsyncFetch festzulegen. Alternativ können Sie die dynamische Eigenschaft "Asynchrone Rowset-Verarbeitung" in der Properties-Auflistung verwenden, aber damit zusammenhängende abgerufene Ereignisse können verloren gehen, wenn Sie den Options-Parameter nicht auf adAsyncFetch festlegen.

Anmerkung Beim MS Remote-Provider wird das Abrufen im Hintergrund nur durch den Options-Parameter der Open-Methode unterstützt.


Open-Methode (ADO Stream)

Öffnet ein Stream-Objekt, um binäre oder Textdatenströme zu ändern

Syntax

Stream.Open Source, Mode, OpenOptions, UserName, Password

Parameter

Source Optional. Ein Wert vom Datentyp Variant, der die Datenquelle für den Stream angibt. Source kann eine absolute URL-Zeichenkette enthalten, die auf einen bestehenden Knoten in einer bekannten Struktur zeigt, wie z. B. ein E-Mail- oder Dateisystem. Ein URL sollte unter Verwendung des URL-Schlüsselwortes ("URL=http://server/folder") bestimmt werden. Alternativ kann Source einen Verweis auf ein bereits offenes Record-Objekt enthalten, das den voreingestellten Stream, der mit dem Record zusammenhängt, öffnet. Wurde Source nicht bestimmt, wird ein Stream instanziiert und geöffnet, standardmäßig nicht verbunden mit einer zugrunde liegenden Quelle.

Mode Optional. Ein ConnectModeEnum-Wert, der den Zugriffsmodus (z. B. Lese-/Schreibzugriff oder schreibgeschützt) für den resultierenden Stream angibt. Der Standardwert ist adModeUnknown. Weitere Informationen über die Zugriffsmodi finden Sie unter der Mode-Eigenschaft. Wurde Mode nicht bestimmt, wird es durch das Quellobjekt weitergegeben. Wurde das Source-Record beispielsweise im schreibgeschützten Modus geöffnet, wird das Stream standardmäßig auch im schreibgeschützten Modus gestartet.

OpenOptions Optional. Ein StreamOpenOptionsEnum-Wert. Der Standardwert ist adOpenStreamUnspecified.

UserName Optional. Ein Wert vom Datentyp String, der die ID des Benutzers enthält, der nötigenfalls auf das Stream-Objekt zugreift.

Password Optional. Ein Wert vom Datentyp String, der das Kennwort enthält, das nötigenfalls zum Zugriff auf das Stream-Objekt dient.

Hinweise

Wird ein Record-Objekt übergeben, während der Quellparameter, die Benutzer-ID und das Kennwort nicht verwendet werden, weil auf das Record-Objekt zugegriffen wird, ist es bereits verfügbar. Der Modus des Record-Objekts wird an das Stream-Objekt übertragen.

Wurde Source nicht bestimmt, enthält das geöffnete Stream keine Daten und hat einen Size-Wert von Null. Um den Verlust von Daten zu verhindern, die in den Stream geschrieben werden, wenn der Stream geschlossen wird, speichern Sie den Stream mit der CopyTo- oder SaveToFile-Methode oder auf einem anderen Speicherplatz.

Während der Stream nicht geöffnet ist, können alle schreibgeschützten Eigenschaften des Stream gelesen werden. Wurde der Stream asynchron geöffnet, werden alle nachfolgenden Operationen (anders als das Überprüfen des Status und anderer schreibgeschützter Eigenschaften) blockiert, bis die Open-Operation beendet wurde.


OpenSchema-Methode (ADO)

OpenSchema-Methode

Fordert Informationen zum Datenbankschema vom Provider an.

Syntax

Set recordset = connection.OpenSchema (QueryType, Criteria, SchemaID)

Rückgabewerte

Gibt ein Recordset-Objekt zurück, das die Schemainformation enthält. Das Recordset wird als schreibgeschützter, statischer Cursor geöffnet. Der QueryType bestimmt, welche Zeilen im Recordset-Objekt angezeigt werden.

Parameter

QueryType Ein SchemaEnum-Wert, der den Typ der auszuführenden Schemaabfrage darstellt.

Criteria Optional. Ein Array mit Abfrageeinschränkungen für jede QueryType-Option (wie in SchemaEnum angegeben).

SchemaID Der globale eindeutige Bezeichner (Globally Unique Identifier, GUID) für eine Abfrage eines Providerschemas, der nicht durch die OLE DB-Angabe definiert ist. Dieser Parameter wird benötigt, wenn QueryType auf adSchemaProviderSpecific festgelegt ist, andernfalls wird er nicht verwendet.

Hinweise

Die OpenSchema-Methode gibt selbst-erläuternde Informationen über die Datenquelle zurück, z. B. über die Tabellen in der Datenquelle, die Spalten in den Tabellen und den unterstützten Datentyp.

Das QueryType-Argument ist ein GUID, der die zurückgegebenen Spalten (Schemas) kennzeichnet. Die OLE DB-Spezifikation hat eine vollständige Schemaliste.

Das Criteria-Argument begrenzt die Ergebnisse der Schemaabfrage. Criteria gibt ein Array von Werten an, die in eine zugehörige Spaltenuntermenge, beschränkende Spalten genannt, im resultierenden Recordset-Objekt auftreten müssen.

Die Konstante adSchemaProviderSpecific wird für das QueryType-Argument verwendet, wenn der Provider eigene nichtstandardisierte Schemaabfragen definiert, die nicht in der obigen Liste enthalten sind. Bei Verwendung dieser Konstante wird das SchemaID-Argument verwendet, um die GUID der Schemaabfrage zum Ausführen zu übergeben. Wenn QueryType auf adSchemaProviderSpecific gesetzt ist, SchemaID jedoch nicht zur Verfügung steht, tritt ein Fehler auf.

Es ist nicht erforderlich, dass Provider alle OLE DB-Standardschemaabfragen unterstützen. Die OLE DB-Spezifikation erfordert insbesondere nur adSchemaTables, adSchemaColumns und adSchemaProviderTypes. Der Provider muss jedoch für diese Schemaabfragen die in der obigen Tabelle aufgeführten Criteria-Einschränkungen nicht unterstützen.

Verwenden von Remote Data Service Die OpenSchema-Methode steht in einem clientbasierten (ADOR) Connection-Objekt nicht zur Verfügung.

Anmerkung In Visual Basic können Spalten mit einer 4 Byte umfassenden Ganzzahl ohne Vorzeichen (DBTYPE UI4) im Recordset, die von der OpenSchema-Methode im Connection-Objekt zurückgegeben werden, nicht mit anderen Variablen verglichen werden. Weitere Informationen zu OLE DB-Datentypen finden Sie im Kapitel 13 und Anhang A des Microsoft OLE DB-Programmierhandbuchs.


Query-Methode (RDS)

Verwendet eine gültige SQL-Abfragezeichenfolge, um ein Recordset-Objekt zurückzugeben.

Syntax

Set Recordset = DataFactory.Query(Connection, Query)

Parameter

Recordset Eine Objektvariable, die ein Recordset-Objekt darstellt.

DataFactory Eine Objektvariable, die ein RDSServer.DataFactory-Objekt darstellt.

Connection Ein Wert vom Datentyp String, der die Serververbindungsinformationen enthält. Dies ähnelt der Connect-Eigenschaft.

Query Ein Wert vom Datentyp String, der die SQL-Abfrage enthält.

Hinweise

Die Abfrage sollte den SQL-Dialekt des Datenbankservers verwenden. Wenn bei der ausgeführten Abfrage ein Fehler auftritt, wird ein Ergebnisstatus zurückgegeben. Die Query-Methode führt keine Syntaxüberprüfung der Query-Zeichenfolge durch.


Read-Methode (ADO)

Read-Methode

Liest eine bestimmte Anzahl von Bytes aus einem Stream-Objekt.

Syntax

Variant = Stream.Read ( NumBytes )

Parameter

NumBytes Optional. Ein Wert vom Datentyp Long, der die Anzahl der Bytes angibt, die aus der Datei gelesen werden, oder den StreamReadEnum-Wert adReadAll, welcher der Standardwert ist.

Rückgabewert

Die Read-Methode liest eine bestimmt Anzahl von Bytes oder den vollständigen Stream aus einem Stream-Objekt und gibt die resultierenden Daten als ein Variant zurück.

Hinweise

Es werden nur die vorhandenen Bytes zurückgegeben, wenn NumBytes größer als die im Stream verbleibende Anzahl von Bytes ist. Die gelesenen Daten werden nicht bis zur Übereinstimmung mit der durch NumBytes bestimmten Länge aufgefüllt. Verbleiben keine zu lesenden Bytes, wird ein Variant mit dem Wert Null zurückgegeben. Die Read-Methode kann nicht zum Rückwärtslesen verwendet werden.

Anmerkung NumBytes misst immer Bytes. Für Stream-Textobjekte verwenden Sie ReadText.


ReadText-Methode (ADO)

ReadText-Methode

Liest eine bestimmt Anzahl von Zeichen aus einem Text eines Stream-Objekts.

Syntax

String = Stream.ReadText ( NumChars )

Parameter

NumChars Optional. Ein Wert vom Datentyp Long, der die Anzahl der aus der Datei zu lesenden Merkmale oder einen StreamReadEnum-Wert angibt. Der Standardwert ist adReadAll.

Rückgabewert

Die ReadText-Methode liest eine bestimmte Anzahl von Merkmalen, eine vollständige Linie oder einen vollständigen Stream eines Stream-Objekts und gibt die resultierende Zeichenkette zurück.

Hinweise

Es werden nur die vorhandenen Merkmale zurückgegeben, wenn NumChar größer als die im Stream verbleibende Anzahl von Merkmalen ist. Die gelesene Zeichenfolge wird nicht bis zur Übereinstimmung mit der durch NumChar bestimmten Länge aufgefüllt. Verbleiben keine zu lesenden Merkmale, wird ein Variant mit dem Wert Null zurückgegeben. Die ReadText-Methode kann nicht zum Rückwärtslesen verwendet werden.

Die ReadText-Methode wird mit Textstrom verwendet (Type ist adTypeText). Für binären Datenstrom verwenden Sie die Read-Methode.


Refresh-Methode (ADO)

Refresh-Methode

Aktualisiert die Objekte in einer Auflistung, um Objekte aufzunehmen, die vom Provider erhältlich und für ihn spezifisch sind.

Syntax

collection.Refresh

Hinweise

Die Refresh-Methode führt abhängig von der Auflistung, aus der Sie sie aufrufen, verschiedene Aufgaben aus.

Parameter

Durch Verwenden der Refresh-Methode in einer Parameters-Auflistung eines Command-Objekts werden vom Provider Parameterinformationen für die gespeicherte Prozedur oder für die parametrisierte Abfrage abgerufen, die im Command-Objekt angegeben sind. Die Auflistung bleibt für Provider, die Aufrufe gespeicherter Prozeduren oder parametrisierte Abfragen nicht unterstützen, leer.

Sie sollten die ActiveConnection-Eigenschaft des Command-Objekts auf ein gültiges Connection-Objekt, die CommandText-Eigenschaft auf einen gültigen Befehl und die CommandType-Eigenschaft auf adCmdStoredProc festlegen, bevor Sie die Refresh-Methode aufrufen.

Wenn Sie auf die Parameters-Auflistung zugreifen, bevor Sie die Refresh-Methode aufrufen, ruft ADO automatisch diese Methode auf und füllt die Auflistung auf.

Anmerkung Wenn Sie die Refresh-Methode verwenden, um Parameterinformationen vom Provider zu erhalten und ein oder mehrere Parameter-Datentypobjekte mit variabler Länge zurückgegeben werden, weist ADO unter Umständen den Parametern abhängig von ihrer maximal möglichen Größe Arbeitsspeicher zu. Dies kann während der Ausführung zu einem Fehler führen. Die Size-Eigenschaft für diese Parameter sollte vor dem Aufrufen der Execute-Methode explizit festgelegt werden, um Fehler zu vermeiden.

Fields

Das Verwenden der Refresh-Methode in der Fields-Auflistung hat keine sichtbare Wirkung. Um Änderungen an der zugrunde liegenden Datenbankstruktur abzurufen, muss entweder die Requery-Methode oder, falls das Recordset-Objekt keine Lesezeichen unterstützt, die MoveFirst-Methode verwendet werden.

Eigenschaften

Durch Verwenden der Refresh-Methode in einer Properties-Auflistung wird bei einigen Objekten die Auflistung mit den dynamischen Eigenschaften aufgefüllt, die der Provider offen legt. Diese Eigenschaften enthalten Informationen zur besonderen Funktionalität eines Providers, die über die von ADO unterstützten integrierten Eigenschaften hinausgehen.


Refresh-Methode (RDS)

Führt eine erneute Abfrage der in der Connect-Eigenschaft festgelegten Datenquelle durch und aktualisiert die Abfrageergebnisse.

Syntax

DataControl.Refresh

Parameter

DataControl Eine Objektvariable, die ein RDS.DataControl-Objekt darstellt.

Hinweise

Vor dem Verwenden der Refresh-Methode müssen die Eigenschaften Connect, Server und SQL festgelegt werden. Alle datengebundenen Steuerelemente auf dem Formular, denen ein RDS.DataControl-Objekt zugeordnet ist, spiegeln den neuen Satz an Datensätzen wider. Alle bereits vorhandenen Recordset-Objekte werden freigegeben, und jegliche nicht gespeicherten Änderungen werden verworfen. Die Refresh-Methode verwendet automatisch den ersten Datensatz als aktuellen Datensatz.

Beim Arbeiten mit Daten ist es ratsam, die Refresh-Methode in regelmäßigen Abständen aufzurufen. Wenn Sie Daten abrufen und diese einige Zeit auf dem Clientcomputer belassen, ist es möglich, dass diese Daten an Aktualität verlieren. Möglicherweise schlagen alle von Ihnen vorgenommenen Änderungen fehl, da andere Personen u. U. den Datensatz geändert und Änderungen vor Ihnen übermittelt haben.


Requery-Methode (ADO)

Requery-Methode

Aktualisiert die Daten in einem Recordset-Objekt, indem die Abfrage, auf der das Objekt basiert, erneut ausgeführt wird.

Syntax

recordset.Requery Options

Parameter

Options Optional. Eine Bitmaske, die einen ExecuteOptionEnum-Wert enthält, der diese Operation betrifft. Wenn dieser Parameter auf adAsyncExecute festgelegt ist, wird diese Operation asynchron ausgeführt. Nach ihrem Abschluss wird ein RecordsetChangeComplete-Ereignis ausgegeben.

Hinweise

Verwenden Sie die Requery-Methode, um den gesamten Inhalt eines Recordset-Objekts aus der Datenquelle zu aktualisieren, indem Sie den ursprünglichen Befehl erneut verwenden und die Daten ein zweites Mal abrufen. Das Aufrufen dieser Methode entspricht dem aufeinander folgenden Aufruf der Methoden Close und Open. Falls Sie den gerade aktuellen Datensatz bearbeiten oder einen neuen Datensatz hinzufügen, tritt ein Fehler auf.

Während das Recordset-Objekt geöffnet ist, sind die Eigenschaften schreibgeschützt, die den Typ des Cursors (CursorType, LockType, MaxRecords usw.) bestimmen. Deshalb kann die Requery-Methode nur den aktuellen Cursor aktualisieren. Um eine beliebige Cursoreigenschaft zu ändern und die Ergebnisse anzuzeigen, müssen Sie die Close-Methode verwenden, damit die Eigenschaften wieder Lese-/Schreibeigenschaften werden. Sie können die Eigenschaftseinstellungen dann ändern und die Open-Methode aufrufen, um den Cursor erneut zu öffnen.


Reset-Methode (RDS)

Führt das Sortieren oder Filtern in einem clientbasierten Recordset abhängig von den festgelegten Sortier- und Filtereigenschaften durch.

Syntax

DataControl.Reset(value)

Parameter

DataControl Eine Objektvariable, die ein RDS.DataControl-Objekt darstellt.

value Optional. Ein boolescher Wert, der true (Standard) ist, wenn ein Filtern des aktuellen "gefilterten" Rowset durchgeführt werden soll. False gibt an, dass das Filtern im ursprünglichen Rowset durchgeführt wird. Hierdurch werden alle vorher festgelegten Filteroptionen entfernt.

Hinweise

Die Eigenschaften SortColumn, SortDirection, FilterValue, FilterCriterion und FilterColumn stellen Sortier- und Filterfunktionalitäten im clientbasierten Zwischenspeicher zur Verfügung. Die Sortierfunktion sortiert Datensätze nach Werten aus einer Spalte. Die Filterfunktion zeigt eine Teilmenge der Datensätze auf der Grundlage eines Suchkriteriums an, während das vollständige Recordset im Zwischenspeicher verbleibt. Die Reset-Methode führt die Kriterien aus und ersetzt das aktuelle Recordset-Objekt durch ein aktualisierbares Recordset-Objekt.

Müssen noch Änderungen an den Originaldaten durchgeführt werden, die noch nicht übermittelt wurden, schlägt die Reset-Methode fehl. Verwenden Sie zunächst die SubmitChanges-Methode, um alle Änderungen in einem Recordset mit Lese-/Schreibberechtigung zu speichern, und dann die Reset-Methode, um die Datensätze zu sortieren oder zu filtern.

Sollen auf das Rowset mehrere Filter angewendet werden, können Sie das optionale boolesche Argument mit der Reset-Methode verwenden. Im folgenden Beispiel ist dieses Verfahren dargestellt:

ADC.SQL = "Select au_lname from authors"
ADC.Refresh    ' Das neue Rowset abrufen.

ADC.FilterColumn = "au_lname"
ADC.FilterCriterion = "<"
ADC.FilterValue = "'M'"
ADC.Reset         ' Rowset enthält jetzt alle Nachnamen < "M".

ADC.FilterCriterion = ">"
ADC.FilterValue = "'F'"
' Passing True is not necessary, because it is the
' default filter on the current "filtered" rowset.
ADC.Reset(TRUE)     ' Rowset enthält jetzt alle
                    ' Nachnamen < "M" und > "F".

ADC.FilterCriterion = ">"
ADC.FilterValue = "'T'"
' Auf dem ursprünglichen Rowset filtern und die vorherigen
' Filteroptionen verwerfen.
ADC.Reset(FALSE)   ' Rowset enthält jetzt alle Nachnamen > "T".


Resync-Methode (ADO)

Resync-Methode

Aktualisiert die Daten im aktuellen Recordset-Objekt oder in der Fields-Auflistung eines Record-Objekts aus der zugrunde liegenden Datenbank

Syntax

Recordset.Resync AffectRecords, ResyncValues

Record.Fields.Resync ResyncValues

Parameter

AffectRecords Optional. Ein AffectEnum-Wert, der die Anzahl der durch die Resync-Methode beeinflussten Datensätze bestimmt. Der Standardwert ist adAffectAll. Mit der Resync-Methode der Fields-Auflistung eines Record-Objekts ist dieser Wert nicht verfügbar.

ResyncValues Optional. Ein ResyncEnum-Wert, der angibt, ob zugrunde liegende Werte überschrieben werden. Der Standardwert ist adResyncAllValues.

Hinweise

Recordset

Verwenden Sie die Resync-Methode, um die Datensätze im aktuellen Recordset-Objekt mit der zugrunde liegenden Datenbank neu zu synchronisieren. Dies ist hilfreich, wenn Sie entweder einen statischen oder einen Vorwärts-Cursor verwenden, aber alle Änderungen in der zugrunde liegenden Datenbank angezeigt werden sollen.

Wenn Sie die CursorLocation-Eigenschaft auf adUseClient festlegen, ist Resync nur für nicht schreibgeschützte Recordset-Objekte verfügbar.

Im Gegensatz zur Requery-Methode führt die Resync-Methode den zugrunde liegenden Befehl des Recordset-Objekts nicht noch einmal aus. Neue Datensätze in der zugrunde liegenden Datenbank werden nicht angezeigt.

Falls der Versuch, eine neue Synchronisierung durchzuführen, aufgrund eines Konflikts mit den zugrunde liegenden Daten scheitert (z. B., weil ein Datensatz von einem anderen Benutzer gelöscht wurde), gibt der Provider Warnmeldungen an die Errors-Auflistung zurück, und ein Laufzeitfehler tritt auf. Verwenden Sie die Filter-Eigenschaft (adFilterConflictingRecords) und die Status-Eigenschaft, um festzustellen, wo sich Datensätze mit Konflikten befinden.

Wenn die dynamischen Eigenschaften Unique Table und Resync Command eingestellt sind, und das Recordset-Objekt das Ergebnis eines ausgeführten Verbundvorgangs auf mehreren Tabellen ist, dann führt die Resync-Methode den in der Resync Command-Eigenschaft gegebenen Befehl nur in der Tabelle aus, die in der Unique Table-Eigenschaft genannt ist.

Fields

Verwenden Sie die Resync-Methode, um die Werte der Fields-Auflistung eines Record-Objekts mit der zugrunde liegenden Datenquelle neu zu synchronisieren. Die Count-Eigenschaft wird durch diese Methode nicht beeinflusst.

Die Eigenschaften UnderlyingValue, Value und OriginalValue des Field-Objekts in der Auflistung werden synchronisiert, wenn ResyncValues auf adResyncAllValues festgelegt wurde (der Standardwert). Es wird nur die UnderlyingValue-Eigenschaft synchronisiert, wenn ResyncValues auf adResyncUnderlyingValues festgelegt wurde.

Der Wert der Status-Eigenschaft für jedes Field-Objekt beeinflusst zum Zeitpunkt des Aufrufs auch das Verhalten von Resync. Resync hat auf Field-Objekte mit einem Status-Wert von adFieldPendingUnknown oder adFieldPendingInsert keine Auswirkung. Für Status-Wert von adFieldPendingChange oder adFieldPendingDelete synchronisiert Resync Datenwerte von Feldern, die in der Datenquelle weiterhin vorhanden sind.

Resync ändert keine Status-Werte von Field-Objekten, außer es tritt ein Fehler auf, wenn Resync aufgerufen wird. Der Provider wird z. B. einen geeigneten Status-Wert für das Field-Objekt zurückgeben, beispielsweise adFieldDoesNotExist, wenn das Feld nicht länger vorhanden ist. Der zurückgegebene Status-Wert kann logisch mit dem Wert der Status-Eigenschaft kombiniert werden.


Save-Methode (ADO)

Save-Methode

Speichert das Recordset in einer Datei oder einem Stream-Objekt.

Syntax

recordset.Save Destination, PersistFormat

Parameter

Destination Optional. Ein Wert vom Datentyp Variant, der den vollständigen Pfadnamen der Datei darstellt, wo das Recordset-Objekt gespeichert wurde, oder ein Verweis auf ein Stream-Objekt.

PersistFormat Optional. Ein PersistFormatEnum-Wert, der angibt, in welchem Format das Recordset gespeichert werden soll (XML oder ADTG). Der Standardwert ist adPersistADTG.

Hinweise

Die Save-Methode kann nur in einem geöffneten Recordset aufgerufen werden. Verwenden Sie die Open-Methode, um das Recordset zu einem späteren Zeitpunkt aus Destination wiederherzustellen.

Wenn die Filter-Eigenschaft für das Recordset aktiv ist, werden nur die Zeilen gespeichert, auf die bei festgelegtem Filter zugegriffen werden kann. Ist das Recordset hierarchisch, dann wird das aktuelle untergeordnete Recordset und die diesem untergeordneten Datensätze gespeichert, ebenso wie die übergeordneten Recordset-Objekte. Wurde die Save-Methode eines untergeordneten Recordset-Objekts aufgerufen, werden dieser Datensatz und alle seine untergeordneten Datensätze gespeichert, jedoch nicht die übergeordneten Datensätze.

Wenn Sie das erste Mal das Recordset sichern, ist es optional, Destination anzugeben. Wenn Sie Destination nicht angeben, wird eine neue Datei mit einem Namen erstellt, der den Wert der Source-Eigenschaft des Recordset festlegt.

Übergehen Sie Destination, wenn Sie nach der ersten Sicherung Save aufrufen, sonst tritt ein Laufzeitfehler auf. Wenn Sie danach Save mit einem neuen Wert für Destination aufrufen, wird das Recordset-Objekt im neuen Ziel gespeichert. Das neue Ziel und das ursprüngliche Ziel sind jedoch beide geöffnet.

Save schließt Recordset oder Destination nicht, so dass Sie weiterhin mit dem Recordset-Objekt arbeiten und die letzten Änderungen speichern können. Destination bleibt so lange geöffnet, bis das Recordset-Objekt geschlossen wird. Während dieser Zeit können andere Anwendungen Destination lesen, aber nicht schreibend darauf zugreifen.

Aus Sicherheitsgründen erlaubt die Save-Methode nur die Verwendung niedriger und benutzerdefinierter Sicherheitseinstellungen über ein Skript, das von Microsoft Internet Explorer ausgeführt wird. Nähere Einzelheiten zu Sicherheitsfragen finden Sie unter "ADO und RDS - Sicherheitsfragen in Microsoft Internet Explorer" unter ActiveX Data Objects (ADO) Technical Articles in Microsoft Data Access Technical Articles.

Wenn die Save-Methode während einer asynchronen Abruf-, Ausführungs- oder Aktualisierungsoperation des Recordset aufgerufen wird, wartet Save, bis die asynchrone Operation abgeschlossen ist.

Datensätze werden beginnend mit der ersten Zeile des Recordset-Objekts gespeichert. Wenn die Save-Methode beendet ist, wird die aktuelle Zeilenposition zur ersten Zeile des Recordset-Objekts bewegt.

Die besten Ergebnisse erzielen Sie, wenn Sie die CursorLocation-Eigenschaft bei Save auf adUseClient festlegen. Unterstützt der Provider nicht die gesamte Funktionalität, die zum Speichern von Recordset-Objekten notwendig ist, dann stellt der Cursordienst diese Funktionalität zur Verfügung.

Wurde ein Recordset-Objekt mit der auf adUseServer festgelegten CursorLocation-Eigenschaft erhalten, wird die Aktualisierungsmöglichkeit des Recordset-Objekts begrenzt. In der Regel sind nur Aktualisierungen von Einzeltabellen, Einfügungen und Löschungen erlaubt, abhängig von der Funktionalität des Providers. Die Resync-Methode ist für diese Konfiguration ebenfalls nicht verfügbar.

Anmerkung Von ADO wird das Sichern eines Recordset-Objekts mit Fields vom Typ adVariant, adIDispatch oder adIUnknown nicht unterstützt und kann unvorhersehbare Ergebnisse hervorrufen.

Da der Destination-Parameter jedes Objekt annimmt, das die OLE DB IStream-Schnittstelle unterstützt, können Sie ein Recordset-Objekt direkt im ASP Response-Objekt speichern. Weitere Informationen finden Sie im Dauerhaftigkeitsszenario für XML-Recordsets.

Sie können ein Recordset auch im XML-Format für eine Instanz eines MSXML DOM-Objekts speichern, wie im folgenden Visual Basic Code gezeigt:

Dim xDOM As New MSXML.DOMDocument
Dim rsXML As New ADODB.Recordset
Dim sSQL As String, sConn As String

sSQL = "SELECT customerid, companyname, contactname FROM customers"
sConn="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\Programme" & _
        "\Gemeinsame Dateien\System\msadc\samples\NWind.mdb"
rsXML.Open sSQL, sConn
rsXML.Save xDOM, adPersistXML   ' Recordset direkt in eine DOM-Struktur
                                ' speichern.
...

Anmerkung Zwei Einschränkungen treten auf, wenn hierarchische Recordset-Objekte (Datenstrukturierung) im XML-Format gespeichert werden. Sie können nicht im XML-Format speichern, wenn das hierarchische Recordset-Objekt anstehende Aktualisierungen enthält, und Sie können kein parametrisiertes, hierarchisches Recordset-Objekt speichern.


SaveToFile-Methode (ADO)

SaveToFile-Methode

Speichert den binären Inhalt eines Stream in eine Datei.

Syntax

Stream.SaveToFile FileName, SaveOptions

Parameter

FileName Ein Wert vom Datentyp String, der den vollständigen Namen der Datei enthält, in die der Inhalt des Stream gespeichert wird. Sie können auf alle gültigen lokalen Speicherplätze oder auf Speicherplätze, auf die Sie mit dem UNC-Wert Zugriff haben, speichern.

SaveOptions Ein SaveOptionsEnum-Wert, der angibt, ob mit SaveToFile eine neue Datei erstellt werden soll, wenn sie noch nicht vorhanden ist. Der Standardwert ist adSaveCreateNotExists. Mit diesen Optionen können Sie angeben, dass ein Fehler auftritt, wenn die bestimmte Datei nicht vorhanden ist. Sie können auch angeben, dass SaveToFile die aktuellen Inhalte einer vorhandenen Datei überschreibt.

Anmerkung Wenn Sie eine vorhandene Datei überschreiben (wenn adSaveCreateOverwrite festgelegt wurde), schneidet SaveToFile alle Bytes aus der original vorhandenen Datei ab, die dem neuen EOS entspricht.

Hinweise

SaveToFile kann zum Kopieren der Inhalte eines Stream-Objekts in einer lokalen Datei verwendet werden. Dabei ist keine Änderung in den Inhalten oder den Eigenschaften des Stream-Objekts aufgetreten. Das Stream-Objekt muss vor dem Aufrufen von SaveToFile geöffnet sein.

Diese Methode ändert die Verbindung des Stream-Objekts zu seiner zugrunde liegenden Quelle nicht. Das Stream-Objekt bleibt mit dem originalen URL verbunden, welcher seine Quelle ist, wenn es offen ist.

Nach dem SaveToFile-Vorgang wird die aktuelle Position (Position) im Stream an den Anfang des Stream (0) festgelegt.


Seek-Methode (ADO)

Seek-Methode

Durchsucht den Index eines Recordset-Objekts, um schnell die Zeile zu finden, die den angegebenen Werten entspricht und ändert die aktuelle Zeilenposition entsprechend.

Syntax

recordset.Seek KeyValues, SeekOption

Parameter

KeyValues Ein Array von Werten vom Datentyp Variant. Ein Index besteht aus einer oder mehreren Spalten, und das Array enthält einen Wert, der mit jeder dieser Spalten verglichen werden kann.

SeekOption Ein SeekEnum-Wert, der die Art des durchzuführenden Vergleichs zwischen den Indexspalten und den entsprechenden KeyValues angibt.

Hinweise

Verwenden Sie die Seek-Methode zusammen mit der Index-Eigenschaft, wenn der zugrunde liegende Provider Indizes bei einem Recordset-Objekt nicht unterstützt. Verwenden Sie die Supports (adSeek)-Methode, um zu bestimmen, ob der zugrunde liegende Provider Seek unterstützt, und die Supports(adIndex)-Methode, um zu bestimmen, ob der zugrunde liegende Provider Indizes unterstützt. (Der OLE DB Provider für Microsoft Jet unterstützt beispielsweise Seek und Index.)

Findet Seek die gewünschte Zeile nicht, dann tritt kein Fehler auf, und die Zeile wird am Ende des Recordset positioniert. Legen Sie die Index-Eigenschaft auf den gewünschten Index fest, bevor Sie diese Methode ausführen.

Diese Methode wird nur mit dem serverbasierten Cursor unterstützt. Seek wird nicht unterstützt, wenn der Wert der CursorLocation-Eigenschaft des Recordset-Objekts adUseClient ist.

Diese Methode kann nur verwendet werden, wenn das Recordset-Objekt mit einem CommandTypeEnum-Wert von adCmdTableDirect geöffnet wurde.


SetEOS-Methode (ADO)

SetEOS-Methode

Legt die Position fest, die das Ende des Stream darstellt.

Syntax

Stream.SetEOS

Hinweise

SetEOS aktualisiert den Wert der EOS-Eigenschaft, indem die aktuelle Position das Ende des Stream wird. Der aktuellen Position folgende Bytes oder Merkmale werden abgeschnitten.

Sie können diese Bytes oder Merkmale durch Festlegen der neuen Endposition des Stream mit SetEOS abschneiden, seit Write, WriteText und CopyTo keine extra Werte in vorhandenen Stream-Objekten abschneiden.

Vorsicht Wenn Sie EOS (Ende des Stream) an einer Position vor dem aktuellen Ende des Stream festlegen, werden Sie alle Daten nach der neuen EOS-Position verlieren.


SkipLine-Methode (ADO)

SkipLine-Methode

Überspringt eine vollständige Linie, wenn ein Textdatenstrom gelesen wird.

Syntax

Stream.SkipLine

Hinweise

Alle Merkmale bis zum und einschließlich des nächsten Zeilentrennzeichens werden übersprungen. Der Standardwert des LineSeparator ist adCRLF. Wenn Sie versuchen, hinter EOS zu springen, wird die aktuelle Position einfach am EOS sein.

Die SkipLine-Methode wird mit Textdatenströmen verwendet (Type ist adTypeText).


SubmitChanges-Methode (RDS)

Übermittelt anstehende Änderungen des lokal zwischengespeicherten, aktualisierbaren Recordset-Objekts zur Datenquelle, die in der Connect-Eigenschaft oder der URL-Eigenschaft festgelegt wurde

Syntax

DataControl.SubmitChanges

DataFactory.SubmitChanges Connection, Recordset

Parameter

DataControl Eine Objektvariable, die ein RDS.DataControl-Objekt darstellt.

DataFactory Eine Objektvariable, die ein RDSServer.DataFactory-Objekt darstellt.

Connection Ein Wert vom Datentyp String, der die mit der Connect-Eigenschaft des RDS.DataControl-Objekts erstellte Verbindung darstellt.

Recordset Eine Objektvariable, die ein Recordset-Objekt darstellt.

Hinweise

Die Connect-, Server- und SQL-Eigenschaften müssen festgelegt werden, bevor die SubmitChanges-Methode mit dem RDS.DataControl-Objekt verwendet werden kann.

Wird die CancelUpdate-Methode aufgerufen, nachdem SubmitChanges für dasselbe Recordset-Objekt aufgerufen wurde, schlägt der CancelUpdate-Aufruf fehl, da die Änderungen bereits vorgenommen wurden.

Nur die geänderten Datensätze werden zur Bearbeitung übergeben. Entweder werden alle Änderungen erfolgreich durchgeführt oder alle Änderungen schlagen fehl.

Sie können SubmitChanges nur mit dem voreingestellten RDSServer.DataFactory-Objekt verwenden. Diese Methode kann nicht für benutzerdefinierte Geschäftsobjekte verwendet werden.

Wurde die URL-Eigenschaft festgelegt, wird SubmitChanges Änderungen in den durch URL bestimmten Speicherplatz übermitteln.


Supports-Methode (ADO)

Supports-Methode

Bestimmt, ob ein festgelegtes Recordset-Objekt einen bestimmten Funktionstyp unterstützt.

Syntax

boolean = recordset.Supports( CursorOptions )

Rückgabewert

Gibt einen booleschen Wert zurück, der angibt, ob alle durch das CursorOptions-Argument festgelegten Features durch den Provider unterstützt werden.

Parameter

CursorOptions Ein Ausdruck vom Datentyp Long, der aus einem oder mehreren CursorOptionEnum-Werten besteht.

Hinweise

Verwenden Sie die Supports-Methode, um zu bestimmen, welche Funktionstypen ein Recordset-Objekt unterstützt. Falls das Recordset-Objekt die Features unterstützt, deren Konstanten sich in CursorOptions befinden, gibt die Supports-Methode den Wert true zurück. Andernfalls wird false zurückgegeben.

Anmerkung Obwohl die Supports-Methode für eine angegebene Funktionalität den Wert true zurückgeben kann, wird hierdurch nicht sichergestellt, dass der Provider das Feature auf jeden Fall zur Verfügung stellen kann. Die Supports-Methode informiert nur darüber, ob der Provider die angegebene Funktionalität unterstützt, vorausgesetzt, bestimmte Bedingungen werden eingehalten. Die Supports-Methode kann z. B. angeben, dass ein Recordset-Objekt Aktualisierungen unterstützt, selbst wenn der Cursor auf einem mehrfachen Tabellenverbund basiert, bei dem einige Spalten nicht aktualisierbar sind.


Update-Methode (ADO)

Update-Methode

Speichert vorgenommene Änderungen der aktuellen Zeile eines Recordset-Objekts oder der Fields-Auflistung eines Record-Objekts.

Syntax

Recordset.Update Fields, Values

record.Fields.Update

Parameter

Fields Optional. Ein Wert vom Datentyp Variant, der einen einzelnen Namen darstellt, oder ein Array von Werten vom Datentyp Variant, das Namen oder Ordinalpositionen des Feldes oder der Felder abbildet, die geändert werden sollen.

Values Optional. Ein Wert vom Datentyp Variant, der einen einzelnen Wert darstellt, oder ein Array von Werten vom Datentyp Variant, das Werte für das Feld oder die Felder im aktualisierten Datensatz abbildet.

Hinweise

Recordset

Verwenden Sie die Update-Methode, um alle Änderungen zu speichern, die Sie am aktuellen Datensatz eines Recordset-Objekts seit dem Aufrufen der AddNew-Methode oder seit dem Ändern von beliebigen Feldwerten in einem vorhandenen Datensatz vorgenommen haben. Das Recordset-Objekt muss Aktualisierungen unterstützen.

Um die Feldwerte festzulegen, führen Sie eines der folgenden Verfahren durch:

  • Weisen Sie der Value-Eigenschaft eines Field-Objekts Werte zu, und rufen Sie die Update-Methode auf.

  • Übergeben Sie einen Feldnamen und einen Wert als Argumente mit dem Update-Aufruf.

  • Übergeben Sie ein Array mit Feldnamen und ein Array mit Werten mit dem Update-Aufruf.

Wenn Sie Arrays mit Feldern und Werten verwenden, muss in beiden Arrays die gleiche Anzahl von Elementen enthalten sein. Darüber hinaus muss die Reihenfolge der Feldnamen mit der Reihenfolge der Feldwerte übereinstimmen. Falls die Anzahl und Reihenfolge von Feldern und Werten nicht übereinstimmt, tritt ein Fehler auf.

Sollte das Recordset-Objekt Stapelaktualisierungen unterstützen, können Sie mehrere Änderungen an einem oder mehreren Datensätzen lokal zwischenspeichern, bis Sie die UpdateBatch-Methode aufrufen. Falls Sie den aktuellen Datensatz bearbeiten oder einen neuen Datensatz hinzufügen, wenn Sie die UpdateBatch-Methode aufrufen, ruft ADO automatisch die Update-Methode auf, um alle anstehenden Änderungen am aktuellen Datensatz zu speichern und dann alle Änderungen an den Provider zu übergeben.

Wenn Sie den Datensatz, den Sie hinzufügen oder bearbeiten, vor dem Aufrufen der Update-Methode verlassen, ruft ADO automatisch Update auf, um die Änderungen zu speichern. Sie müssen die CancelUpdate-Methode aufrufen, falls Sie Änderungen, die Sie am aktuellen Datensatz vorgenommen haben, abbrechen oder einen neu hinzugefügten Datensatz verwerfen möchten.

Der aktuelle Datensatz bleibt aktuell, nachdem Sie die Update-Methode aufgerufen haben.

Ist die dynamische Eigenschaft Unique Table festgelegt, und ist das Recordset-Objekt das Ergebnis eines ausgeführten Verbundvorgangs auf mehreren Tabellen, dann kann durch die Update-Methode kein Primärschlüssel dieser Tabellen aktualisiert werden. Darüber hinaus können mit der Update-Methode nur Felder in der Tabelle aktualisiert werden, die in der Unique Table-Eigenschaft angegeben sind.

Record

Die Update-Methode beendet Ergänzungen, Löschungen und Aktualisierungen in Feldern der Fields-Auflistung eines Recordset-Objekts.

Mit der Delete-Methode gelöschte Felder werden beispielsweise zum Löschen sofort markiert, verbleiben aber in der Auflistung. Um diese Felder aus der Auflistung des Providers tatsächlich zu löschen, muss die Update-Methode aufgerufen werden.


UpdateBatch-Methode (ADO)

UpdateBatch-Methode

Speichert alle anstehenden Stapelaktualisierungen in der Datenbank.

Syntax

recordset.UpdateBatch AffectRecords

Parameter

AffectRecords Optional. Ein AffectEnum-Wert, der anzeigt, wie viele Datensätze durch die UpdateBatch-Methode beeinflusst werden.

Hinweise

Verwenden Sie die UpdateBatch-Methode, wenn Sie ein Recordset-Objekt im Stapelaktualisierungsmodus ändern, um alle Änderungen, die Sie in einem Recordset-Objekt vorgenommen haben, an die zugrunde liegende Datenbank zu übertragen.

Sollte das Recordset-Objekt Stapelaktualisierungen unterstützen, können Sie mehrere Änderungen an einem oder mehreren Datensätzen lokal zwischenspeichern, bis Sie die UpdateBatch-Methode aufrufen. Falls Sie den aktuellen Datensatz bearbeiten oder einen neuen Datensatz hinzufügen, wenn Sie die UpdateBatch-Methode aufrufen, ruft ADO automatisch die Update-Methode auf, um alle anstehenden Änderungen des aktuellen Datensatzes zu speichern und dann alle Änderungen an den Provider zu übergeben. Sie sollten den Stapelaktualisierungsmodus nur mit einem Keyset-Cursor oder einem statischen Cursor verwenden.

Anmerkung Sind keine sichtbaren Datensätze im aktuellen Recordset vorhanden (wie z. B. ein Filter, für den keine Datensätze übereinstimmen), ruft das Angeben von adAffectGroup als den Wert für diesen Parameter einen Fehler hervor.

Falls der Versuch, Änderungen zu übertragen, in den Datensätzen aufgrund eines Konflikts mit den zugrunde liegenden Daten scheitert (z. B., weil ein Datensatz bereits von einem anderen Benutzer gelöscht wurde), gibt der Provider Warnmeldungen an die Errors-Auflistung zurück, und ein Laufzeit-Fehler tritt auf. Verwenden Sie die Filter-Eigenschaft (adFilterAffectedRecords) und die Status-Eigenschaft, um festzustellen, wo sich Datensätze mit Konflikten befinden.

Verwenden Sie die CancelBatch-Methode, um alle anstehenden Stapelaktualisierungen abzubrechen.

Sind die dynamischen Eigenschaften Unique Table und Update Resync festgelegt, und ist das Recordset-Objekt das Ergebnis eines ausgeführten Verbundvorgangs auf mehreren Tabellen, dann wird nach Ausführen der UpdateBatch-Methode implizit die Resync-Methode ausgeführt. Dies hängt von den Einstellungen der Update Resync-Eigenschaft ab.

Die Reihenfolge, in der die individuellen Aktualisierungen eines Stapels in der Datenquelle durchgeführt werden, ist nicht notwendigerweise die gleiche, wie die Reihenfolge, in der sie im lokalen Recordset-Objekt durchgeführt wurden. Die Aktualisierungsreihenfolge ist vom Provider abhängig. Nehmen Sie dies in ein Konto, wenn Sie Aktualisierungen codieren, die miteinander verwandt sind, wie z. B. Fremdschlüsseleinschränkungen in einer Einfügung oder Aktualisierung.


Write-Methode (ADO)

Write-Methode

Schreibt binäre Daten in ein Stream-Objekt.

Syntax

Stream.Write Buffer

Parameter

Buffer Ein Wert vom Datentyp Variant, der ein Array aus zu schreibenden Bytes enthält.

Hinweise

Bestimmte Bytes werden in das Stream-Objekt geschrieben, ohne eingreifende Leerzeichen zwischen jedem Byte.

Die aktuelle Position wird auf das Byte festgelegt, das den geschriebenen Daten folgt. Die Write-Methode schneidet die restlichen Daten in einem Stream nicht ab. Wenn Sie diese Bytes abschneiden möchten, rufen Sie SetEOS auf.

Wenn Sie hinter die aktuelle EOS-Position schreiben, wird die Size des Stream-Objekts vergrößert, um alle neuen Bytes zu enthalten, und EOS wird auf das neue, letzte Byte des Stream bewegt.


WriteText-Methode (ADO)

WriteText-Methode

Schreibt eine bestimmte Textzeichenfolge in ein Stream-Objekt.

Syntax

Stream.WriteText Data, Options

Parameter

Data Ein Wert vom Datentyp String, der den zu schreibenden Text in Zeichen enthält.

Options Optional. Ein StreamWriteEnum-Wert, der angibt, ob ein Zeilentrennzeichen am Ende der bestimmten Zeichenfolge geschrieben werden muss.

Hinweise

Bestimmte Zeichenfolgen werden in das Stream-Objekt ohne eingreifende Leerzeichen oder Merkmale zwischen jedem Byte geschrieben.

Die aktuelle Position wird auf das Merkmal festgelegt, das den geschriebenen Daten folgt. Die WriteText-Methode schneidet die restlichen Daten in einem Stream nicht ab. Wenn Sie diese Merkmale abschneiden möchten, rufen Sie SetEOS auf.

Wenn Sie hinter die aktuelle EOS-Position schreiben, wird die Size des Stream-Objekts vergrößert, um alle neuen Merkmale zu enthalten, und EOS wird auf das neue, letzte Byte des Stream bewegt.


ADO-Ereignisse

ADO-Ereignisse - Zusammenfassung

Ereignis | Beschreibung
BeginTransComplete | Wird nach der BeginTrans-Operation aufgerufen.
CommitTransComplete | Wird nach der CommitTrans-Operation aufgerufen.
ConnectComplete | Wird nach Beginn einer Verbindung aufgerufen.
Disconnect | Wird nach Beendigung einer Verbindung aufgerufen.
EndOfRecordset | Wird aufgerufen, wenn Sie sich zu einer Zeile bewegen möchten, die hinter dem Ende des Recordset-Objekts liegt.
ExecuteComplete | Wird aufgerufen, nachdem die Ausführung eines Befehls beendet wurde.
FetchComplete | Wird aufgerufen, nachdem alle Datensätze in einer lang andauernden, asynchronen Operation in das Recordset-Objekt abgerufen wurden.
FetchProgress | Wird während einer lang andauernden, asynchronen Operation regelmäßig aufgerufen, um die Anzahl der aktuell in das Recordset-Objekt abgerufenen Zeilen anzugeben.
FieldChangeComplete | Wird aufgerufen, nachdem der Wert eines Field-Objekts oder mehrerer Field-Objekte verändert wurde.
InfoMessage | Wird immer dann aufgerufen, wenn während einer ConnectionEvent-Operation eine Warnung auftritt.
MoveComplete | Wird aufgerufen, nachdem die aktuelle Position im Recordset-Objekt verändert wurde.
onError (RDS) | Wird immer dann aufgerufen, wenn ein Fehler während einer Operation auftritt.
onReadyStateChange (RDS) | Wird immer dann aufgerufen, wenn sich der Wert der ReadyState-Eigenschaft verändert.
RecordChangeComplete | Wird aufgerufen, nachdem sich ein Datensatz oder mehrere Datensätze verändert haben.
RecordsetChangeComplete | Wird aufgerufen, nachdem sich das Recordset-Objekt verändert hat.
RollbackTransComplete | Wird nach der RollbackTrans-Operation aufgerufen.
WillChangeField | Wird aufgerufen, bevor eine anstehende Operation den Wert eines Field-Objekts oder mehrerer Field-Objekte im Recordset-Objekt verändert.
WillChangeRecord | Wird aufgerufen, bevor sich ein Datensatz oder mehrere Datensätze (Zeilen) im Recordset-Objekt verändern.
WillChangeRecordset | Wird aufgerufen, bevor eine anstehende Operation das Recordset-Objekt verändert.
WillConnect | Wird vor Beginn einer Verbindung aufgerufen.
WillExecute | Wird unmittelbar vor dem Ausführen eines anstehenden Befehls für diese Verbindung aufgerufen und bietet den Benutzern die Möglichkeit, die anstehenden Ausführungsparameter zu überprüfen und zu ändern.
WillMove | Das WillMove-Ereignis wird aufgerufen, bevor eine anstehende Operation die aktuelle Position im Recordset-Objekt verändert.


BeginTransComplete-, CommitTransComplete- und RollbackTransComplete-Ereignisse (ADO)

BeginTransComplete-, CommitTransComplete- und RollbackTransComplete-Ereignisse

Diese Ereignisse werden aufgerufen, nachdem die zugeordnete Operation in dem Connection-Objekt beendet wurde.

  • Das BeginTransComplete-Ereignis wird nach der BeginTrans-Operation aufgerufen.

  • Das CommitTransComplete-Ereignis wird nach der CommitTrans-Operation aufgerufen.

  • Das RollbackTransComplete-Ereignis wird nach der RollbackTrans-Operation aufgerufen.

Syntax

BeginTransComplete TransactionLevel, pError, adStatus, pConnection

CommitTransComplete pError, adStatus, pConnection

RollbackTransComplete pError, adStatus, pConnection

Parameter

TransactionLevel Ein Wert vom Datentyp Long, der die neue Transaktionsebene der BeginTrans-Operation, die dieses Ereignis ausgelöst hat, enthält.

pError Ein Error-Objekt. Es beschreibt den aufgetretenen Fehler, wenn EventStatusEnum den Wert adStatusErrorsOccurred hat; andernfalls ist es nicht festgelegt.

adStatus Ein EventStatusEnum-Statuswert. Beim Aufruf dieser Ereignisse wird dieser Parameter auf adStatusOK festgelegt, wenn die das Ereignis auslösende Operation erfolgreich war. Wenn die Operation fehlgeschlagen ist, wird der Parameter hingegen auf adStatusErrorsOccurred festgelegt.

Legen Sie diesen Parameter auf adStatusUnwantedEvent fest, bevor das Ereignis zurückgegeben wird, um nachfolgende Benachrichtigungen zu verhindern.

pConnection Das Connection-Objekt, für das dieses Ereignis aufgetreten ist.

Hinweise

In Visual C++ können mehrere Connection-Objekte dieselbe Methode zur Ereignisbehandlung gemeinsam verwenden. Die Methode bestimmt anhand des zurückgegebenen Connection-Objekts, welches Objekt das Ereignis ausgelöst hat.

Ist die Attributes-Eigenschaft auf adXactCommitRetaining oder adXactAbortRetaining festgelegt, wird eine neue Transaktion gestartet, nachdem eine Transaktion durchgeführt oder ein Rollback auf sie ausgeführt wurde. Verwenden Sie das BeginTransComplete-Ereignis, um alle Ereignisse außer dem ersten Ereignis beim Starten einer Transaktion zu ignorieren.


ConnectComplete- und Disconnect-Ereignisse (ADO)

ConnectComplete- und Disconnect-Ereignisse

Das ConnectComplete-Ereignis wird aufgerufen, nachdem eine Verbindung begonnen wurde. Das Disconnect-Ereignis wird aufgerufen, nachdem eine Verbindung beendet wurde.

Syntax

ConnectComplete pError, adStatus, pConnection

Disconnect adStatus, pConnection

Parameter

pError Ein Error-Objekt. Es beschreibt den aufgetretenen Fehler, wenn adStatus den Wert adStatusErrorsOccurred hat; andernfalls ist es nicht festgelegt.

adStatus Ein EventStatusEnum-Wert, der immer adStatusOK zurückgibt.

Wenn ConnectComplete aufgerufen wird, ist dieser Parameter auf adStatusCancel festgelegt, wenn ein WillConnect-Ereignis den Abbruch einer anstehenden Verbindung angefordert hat.

Legen Sie diesen Parameter auf adStatusUnwantedEvent fest, bevor eines der Ereignisse zurückgegeben wird, um nachfolgende Benachrichtigungen zu verhindern. Das Schließen und erneute Öffnen des Connection-Objekts hat jedoch zur Folge, dass diese Ereignisse erneut auftreten.

pConnection Das Connection-Objekt, für das dieses Ereignis aufgetreten ist.


EndOfRecordset-Ereignis (ADO)

EndOfRecordset-Ereignis

Das EndOfRecordset-Ereignis wird aufgerufen, wenn Sie sich zu einer Zeile bewegen möchten, die hinter dem Ende des Recordset-Objekts liegt.

Syntax

EndOfRecordset fMoreData, adStatus, pRecordset

Parameter

fMoreData Ein Wert vom Typ VARIANT_BOOL, der bei Festlegung auf VARIANT_TRUE zeigt, dass dem Recordset-Objekt mehr Zeilen hinzugefügt wurden.

adStatus Ein EventStatusEnum-Statuswert.

Beim Aufruf von EndOfRecordset wird dieser Parameter auf adStatusOK festgelegt, wenn die das Ereignis auslösende Operation erfolgreich war. Wenn das Ereignis den Abbruch dieser das Ereignis auslösenden Operation nicht anfordern kann, wird der Parameter hingegen auf adStatusCantDeny festgelegt.

Legen Sie diesen Parameter auf adStatusUnwantedEvent fest, bevor EndOfRecordset zurückgegeben wird, um nachfolgende Benachrichtigungen zu verhindern.

pRecordset Ein Recordset-Objekt. Das Recordset-Objekt, für das dieses Ereignis aufgetreten ist.

Hinweise

Ein EndOfRecordset-Ereignis kann auftreten, falls die MoveNext-Operation fehlschlägt.

Der Ereignishandler wird aufgerufen, wenn ein Versuch gemacht wird, sich hinter das Ende des Recordset-Objekts zu bewegen, beispielsweise als Folge des Aufrufs von MoveNext. In diesem Ereignis können Sie jedoch weitere Datensätze von der Datenbank abfragen und sie an das Ende des Recordset-Objekts anhängen. In diesem Fall wird fMoreData auf VARIANT_TRUE festgelegt und EndOfRecordset zurückgeben. Rufen Sie anschließend MoveNext erneut auf, um auf die neu abgerufenen Datensätze zuzugreifen.


ExecuteComplete-Ereignis (ADO)

ExecuteComplete-Ereignis

Das ExecuteComplete-Ereignis wird aufgerufen, nachdem die Ausführung eines Befehls beendet wurde.

Syntax

ExecuteComplete RecordsAffected, pError, adStatus, pCommand, pRecordset, pConnection

Parameter

RecordsAffected Ein Wert vom Datentyp Long, der die Anzahl der durch den Befehl betroffenen Datensätze anzeigt.

pError Ein Error-Objekt. Es beschreibt den aufgetretenen Fehler, wenn adStatus den Wert adStatusErrorsOccurred hat; andernfalls ist es nicht festgelegt.

adStatus Ein EventStatusEnum-Statuswert. Wird dieses Ereignis aufgerufen, wird dieser Parameter auf adStatusOK festgelegt, wenn die das Ereignis auslösende Operation erfolgreich war. Wenn die Operation fehlgeschlagen ist, wird der Parameter hingegen auf adStatusErrorsOccurred festgelegt.

Legen Sie diesen Parameter auf adStatusUnwantedEvent fest, bevor dieses Ereignis zurückgegeben wird, um nachfolgende Benachrichtigungen zu verhindern.

pCommand Das Command-Objekt, das ausgeführt wurde. Es enthält ein Command-Objekt, selbst wenn Connection.Execute oder Recordset.Open aufgerufen wird, ohne dass ein Command-Objekt explizit erstellt wurde. In diesen Fällen wird das Command-Objekt intern durch ADO erstellt.

pRecordset Ein Recordset-Objekt, das das Ergebnis des ausgeführten Befehls ist. Dieses Recordset-Objekt kann leer sein.

pConnection Ein Connection-Objekt. Die Verbindung, über die die Operation ausgeführt wurde.

Hinweise

Ein ExecuteComplete-Ereignis kann aufgrund der Methoden Connection.Execute, Command.Execute, Recordset.Open, Recordset.Requery oder Recordset.NextRecordset auftreten.


FetchComplete-Ereignis (ADO)

FetchComplete-Ereignis

Das FetchComplete-Ereignis wird aufgerufen, nachdem alle Datensätze in einer länger andauernden, asynchronen Operation in das Recordset-Objekt abgerufen wurden.

Syntax

FetchComplete pError, adStatus, pRecordset

Parameter

pError Ein Error-Objekt. Es beschreibt den aufgetretenen Fehler, wenn adStatus den Wert adStatusErrorsOccurred hat; andernfalls ist es nicht festgelegt.

adStatus Ein EventStatusEnum-Statuswert. Wird dieses Ereignis aufgerufen, wird dieser Parameter auf adStatusOK festgelegt, wenn die das Ereignis auslösende Operation erfolgreich war. Wenn die Operation fehlgeschlagen ist, wird der Parameter hingegen auf adStatusErrorsOccurred festgelegt.

Legen Sie diesen Parameter auf adStatusUnwantedEvent fest, bevor dieses Ereignis zurückgegeben wird, um nachfolgende Benachrichtigungen zu verhindern.

pRecordset Ein Recordset-Objekt. Das Objekt, für das die Datensätze abgerufen wurden.

Hinweise

Für die Verwendung des FetchComplete-Ereignisses mit Microsoft Visual Basic ist Visual Basic, Version 6.0 oder später, erforderlich.


FetchProgress-Ereignis (ADO)

FetchProgress-Ereignis

Das FetchProgress-Ereignis wird während einer länger andauernden, asynchronen Operation regelmäßig aufgerufen, um die Anzahl der aktuell in das Recordset-Objekt abgerufenen weiteren Zeilen anzugeben.

Syntax

FetchProgress Progress, MaxProgress, adStatus, pRecordset

Parameter

Progress Ein Wert vom Datentyp Long, der die aktuelle Anzahl der von der Abrufoperation abgerufenen Datensätze anzeigt.

MaxProgress Ein Wert vom Datentyp Long, der die maximale Anzahl von Datensätzen anzeigt, die beim Abrufen erwartet wird.

adStatus Ein EventStatusEnum-Statuswert.

pRecordset Ein Recordset-Objekt, das das Objekt ist, für das die Datensätze abgerufen werden.

Hinweise

Wenn FetchProgress mit einem untergeordneten Recordset-Objekt verwendet wird, beachten Sie, dass die Werte der Parameter Progress und MaxProgress vom zugrunde liegenden Rowset des Cursordienstes abgeleitet wurden. Die zurückgegebenen Werte stellen die absolute Anzahl der Datensätze im zugrunde liegenden Rowset dar, nicht nur die Anzahl der Datensätze im aktuellen Kapitel.

Anmerkung Für die Verwendung des FetchProgress-Ereignisses mit Microsoft Visual Basic ist Visual Basic, Version 6.0 oder später, erforderlich.


InfoMessage-Ereignis (ADO)

InfoMessage-Ereignis

Das InfoMessage-Ereignis wird immer dann aufgerufen, wenn während einer ConnectionEvent-Operation eine Warnung auftritt.

Syntax

InfoMessage pError, adStatus, pConnection

Parameter

pError Ein Error-Objekt. Dieser Parameter enthält alle zurückgegebenen Fehler. Wenn mehrere Fehler zurückgegeben werden, verwenden Sie zum Finden der Fehler die Errors-Auflistung.

adStatus Ein EventStatusEnum-Statuswert. Wenn eine Warnung auftritt, wird adStatus auf adStatusOK festgelegt, und die Warnung ist in pError enthalten.

Legen Sie diesen Parameter auf adStatusUnwantedEvent fest, bevor dieses Ereignis zurückgegeben wird, um nachfolgende Benachrichtigungen zu verhindern.

pConnection Ein Connection-Objekt. Die Verbindung, bei der die Warnung auftrat. Warnungen können beispielsweise beim Öffnen eines Connection-Objekts oder beim Ausführen eines Command-Objekts auf einem Connection-Objekt auftreten.


onError-Ereignis (RDS)

Das onError-Ereignis wird immer dann aufgerufen, wenn ein Fehler in einer Operation auftritt.

Syntax

onError SCode, Description, Source, CancelDisplay

Parameter

SCode Eine Ganzzahl, die den Statuscode des Fehlers anzeigt.

Description Ein Wert vom Datentyp String, der eine Beschreibung des Fehlers anzeigt.

Source Ein Wert vom Datentyp String, der die Abfrage oder den Befehl anzeigt, die oder der den Fehler ausgelöst hat.

CancelDisplay Ein boolescher Wert, der bei Festlegen auf True verhindert, dass der Fehler in einem Dialogfeld angezeigt wird.


onReadyStateChange-Ereignis (RDS)

Das onReadyStateChange-Ereignis wird immer dann aufgerufen, wenn sich der Wert der ReadyState-Eigenschaft verändert.

Syntax

onReadyStateChange

Parameter

Keine

Hinweise

Die ReadyState-Eigenschaft zeigt den Fortschritt eines RDS.DataControl-Objekts beim asynchronen Abrufen von Daten in sein Recordset-Objekt. Verwenden Sie das onReadyStateChange-Ereignis, um jede auftretende Veränderung in der ReadyState-Eigenschaft zu überwachen. Dies ist effizienter, als regelmäßig den Wert der Eigenschaft zu prüfen.


WillChangeField- und FieldChangeComplete-Ereignisse (ADO)

WillChangeField- und FieldChangeComplete-Ereignisse

Das WillChangeField-Ereignis wird aufgerufen, bevor eine anstehende Operation den Wert eines Field-Objekts oder mehrerer Field-Objekte im Recordset-Objekt verändert. Das FieldChangeComplete-Ereignis wird aufgerufen, nachdem sich der Wert eines Field-Objekts oder mehrerer Field-Objekte verändert hat.

Syntax

WillChangeField cFields, Fields, adStatus, pRecordset

FieldChangeComplete cFields, Fields, pError, adStatus, pRecordset

Parameter

cFields Ein Wert vom Datentyp Long, der die Anzahl der Field-Objekte in Fields anzeigt.

Fields Ein Array mit Elementen vom Datentyp Variant, die Field-Objekte mit anstehenden Veränderungen erhalten.

pError Ein Error-Objekt. Es beschreibt den aufgetretenen Fehler, wenn adStatus den Wert adStatusErrorsOccurred hat; andernfalls ist es nicht festgelegt.

adStatus Ein EventStatusEnum-Statuswert.

Beim Aufruf des WillChangeField-Ereignisses wird dieser Parameter auf adStatusOK festgelegt, wenn die das Ereignis auslösende Operation erfolgreich war. Wenn dieses Ereignis den Abbruch der anstehenden Operation nicht anfordern kann, wird der Parameter hingegen auf adStatusCantDeny festgelegt.

Beim Aufruf des FieldChangeComplete-Ereignisses ist dieser Parameter auf adStatusOK festgelegt, wenn die das Ereignis auslösende Operation erfolgreich war. Wenn die Operation fehlgeschlagen ist, wird der Parameter auf adStatusErrorsOccurred festgelegt.

Legen Sie diesen Parameter auf adStatusCancel fest, bevor WillChangeField zurückgegeben wird, um den Abbruch der anstehenden Operation anzufordern.

Legen Sie diesen Parameter auf adStatusUnwantedEvent fest, bevor FieldChangeComplete zurückgegeben wird, um nachfolgende Benachrichtigungen zu verhindern.

pRecordset Ein Recordset-Objekt. Das Recordset-Objekt, für das dieses Ereignis aufgetreten ist.

Hinweise

Ein WillChangeField- oder FieldChangeComplete-Ereignis kann auftreten, wenn die Value-Eigenschaft festgelegt wird und die Update-Methode mit den Feld- und Wertarray-Parametern aufgerufen wird.


WillChangeRecord- und RecordChangeComplete-Ereignisse (ADO)

WillChangeRecord- und RecordChangeComplete-Ereignisse

Das WillChangeRecord-Ereignis wird aufgerufen, bevor sich ein Datensatz oder mehrere Datensätze (Zeilen) im Recordset-Objekt verändern. Das RecordChangeComplete-Ereignis wird aufgerufen, nachdem sich ein Datensatz oder mehrere Datensätze verändert haben.

Syntax

WillChangeRecord adReason, cRecords, adStatus, pRecordset

RecordChangeComplete adReason, cRecords, pError, adStatus, pRecordset

Parameter

adReason Ein EventReasonEnum-Wert, der den Grund des Ereignisses angibt. Sein Wert kann adRsnAddNew, adRsnDelete, adRsnUpdate, adRsnUndoUpdate, adRsnUndoAddNew, adRsnUndoDelete oder adRsnFirstChange sein.

cRecords Ein Wert vom Datentyp Long, der die Anzahl der veränderten (betroffenen) Datensätze angibt.

pError Ein Error-Objekt. Es beschreibt den aufgetretenen Fehler, wenn adStatus den Wert adStatusErrorsOccurred hat; andernfalls ist es nicht festgelegt.

adStatus Ein EventStatusEnum-Statuswert.

Beim Aufruf von WillChangeRecord wird dieser Parameter auf adStatusOK festgelegt, wenn die das Ereignis auslösende Operation erfolgreich war. Wenn dieses Ereignis den Abbruch der anstehenden Operation nicht anfordern kann, wird der Parameter hingegen auf adStatusCantDeny festgelegt.

Beim Aufruf des RecordChangeComplete-Ereignisses ist dieser Parameter auf adStatusOK festgelegt, wenn die das Ereignis auslösende Operation erfolgreich war. Wenn die Operation fehlgeschlagen ist, wird der Parameter auf adStatusErrorsOccurred festgelegt.

Legen Sie diesen Parameter vor der Rückgabe von WillChangeRecord auf adStatusCancel fest, um den Abbruch der Operation anzufordern, durch die das Ereignis ausgelöst wurde.

Legen Sie diesen Parameter auf adStatusUnwantedEvent fest, bevor RecordChangeComplete zurückgegeben wird, um nachfolgende Benachrichtigungen zu verhindern.

pRecordset Ein Recordset-Objekt. Das Recordset-Objekt, für das dieses Ereignis aufgetreten ist.

Hinweise

Ein WillChangeRecord- oder RecordChangeComplete-Ereignis kann für das erste geänderte Feld in einer Zeile aufgrund der folgenden Recordset-Operationen stattfinden: Die Update-, Delete-, CancelUpdate-, AddNew-, UpdateBatch- und CancelBatch-Methoden. Der Wert der CursorType-Eigenschaft des Recordset-Objekts bestimmt, welche Operationen die Ereignisse stattfinden lassen.

Während des WillChangeRecord-Ereignisses ist die Filter-Eigenschaft des Recordset-Objekts auf adFilterAffectedRecords festgelegt. Sie können diese Eigenschaft während der Verarbeitung des Ereignisses nicht verändern.


WillChangeRecordset- und RecordsetChangeComplete-Ereignisse (ADO)

WillChangeRecordset- und RecordsetChangeComplete-Ereignisse

Das WillChangeRecordset-Ereignis wird aufgerufen, bevor eine anstehende Operation das Recordset-Objekt verändert. Das RecordsetChangeComplete-Ereignis wird aufgerufen, nachdem sich das Recordset-Objekt verändert hat.

Syntax

WillChangeRecordset adReason, adStatus, pRecordset

RecordsetChangeComplete adReason, pError, adStatus, pRecordset

Parameter

adReason Ein EventReasonEnum-Wert, der den Grund des Ereignisses angibt. Sein Wert kann adRsnRequery, adRsnResynch, adRsnClose oder adRsnOpen sein.

adStatus Ein EventStatusEnum-Statuswert.

Beim Aufruf von WillChangeRecordset wird dieser Parameter auf adStatusOK festgelegt, wenn die das Ereignis auslösende Operation erfolgreich war. Wenn dieses Ereignis den Abbruch der anstehenden Operation nicht anfordern kann, wird der Parameter hingegen auf adStatusCantDeny festgelegt.

Beim Aufruf von RecordsetChangeComplete wird dieser Parameter auf adStatusOK festgelegt, wenn die das Ereignis auslösende Operation erfolgreich war. Wenn die Operation fehlgeschlagen ist, wird der Parameter auf adStatusErrorsOccurred festgelegt oder auf adStatusCancel, wenn die Operation abgebrochen wurde, die dem vorhergehenden angenommenen WillChangeRecordset-Ereignis zugeordnet war.

Legen Sie diesen Parameter auf adStatusCancel fest, bevor WillChangeRecordset zurückgegeben wird, um den Abbruch der anstehenden Operation anzufordern.

Legen Sie diesen Parameter auf adStatusUnwantedEvent fest, bevor WillChangeRecordset oder RecordsetChangeComplete zurückgegeben wird, um nachfolgende Benachrichtigungen zu verhindern.

pError Ein Error-Objekt. Es beschreibt den aufgetretenen Fehler, wenn adStatus den Wert adStatusErrorsOccurred hat; andernfalls ist es nicht festgelegt.

pRecordset Ein Recordset-Objekt. Das Recordset-Objekt, für das dieses Ereignis aufgetreten ist.

Hinweise

Ein WillChangeRecordset- oder RecordsetChangeComplete-Ereignis kann aufgrund der folgenden Requery- oder Open-Methoden des Recordset-Objekts stattfinden.

Wenn der Provider keine Lesezeichen unterstützt, findet eine RecordsetChange-Ereignisbenachrichtigung jedes Mal dann statt, wenn vom Provider neue Zeilen abgerufen werden. Wie häufig dieses Ereignis auftritt, hängt von der RecordsetCacheSize-Eigenschaft ab.


WillConnect-Ereignis (ADO)

WillConnect-Ereignis

Das WillConnect-Ereignis wird vor dem Beginn einer Verbindung aufgerufen.

Syntax

WillConnect ConnectionString, UserID, Password, Options, adStatus, pConnection

Parameter

ConnectionString Ein Wert vom Datentyp String, der Verbindungsinformationen für die anstehende Verbindung enthält.

UserID Ein Wert vom Datentyp String, der einen Benutzernamen für die anstehende Verbindung enthält.

Password Ein Wert vom Datentyp String, der ein Kennwort für die anstehende Verbindung enthält.

Options Ein Wert vom Datentyp Long, der anzeigt, wie der Provider ConnectionString auswerten soll. Die einzige Option ist adAsyncOpen.

adStatus Ein EventStatusEnum-Statuswert.

Wird das Ereignis aufgerufen, wird dieser Parameter standardmäßig auf adStatusOK festgelegt. Wenn das Ereignis den Abbruch der anstehenden Operation nicht anfordern kann, wird der Parameter hingegen auf adStatusCantDeny festgelegt.

Legen Sie diesen Parameter auf adStatusUnwantedEvent fest, bevor dieses Ereignis zurückgegeben wird, um nachfolgende Benachrichtigungen zu verhindern. Legen Sie diesen Parameter auf adStatusCancel fest, um die Verbindungsoperation anzufordern, die den Abbruch dieser Benachrichtigung ausgelöst hat.

pConnection Das Connection-Objekt, für das diese Ereignisbenachrichtigung gilt. Veränderungen des Parameters des Connection-Objekts durch den WillConnect-Ereignishandler haben keine Auswirkung auf das Connection-Objekt.

Hinweise

Beim Aufruf von WillConnect sind die Parameter ConnectionString, UserID, Password und Options auf die Werte festgelegt, die durch die Operation vorgegeben werden, die das Ereignis (die anstehende Verbindung) ausgelöst hat; sie können vor der Rückkehr des Ereignisses geändert werden. WillConnect kann eine Anforderung zurückgeben, die anstehende Verbindung abzubrechen.

Beim Abbruch dieses Ereignisses wird ConnectComplete aufgerufen, wobei der Parameter adStatus auf adStatusErrorsOccurred festgelegt wird.


WillExecute-Ereignis (ADO)

WillExecute-Ereignis

Das WillExecute-Ereignis wird unmittelbar vor dem Ausführen eines anstehenden Befehls für diese Verbindung aufgerufen.

Syntax

WillExecute Source, CursorType, LockType, Options, adStatus, pCommand, pRecordset, pConnection

Parameter

Source Ein Wert vom Datentyp String, der einen SQL-Befehl oder den Namen einer gespeicherten Prozedur enthält.

CursorType Ein CursorTypeEnum-Wert, der den Typ des Cursors für das zu öffnende Recordset-Objekt enthält. Mit diesem Parameter können Sie den Cursor während einer Open-Operation eines Recordset-Objekts zu einem beliebigen Typ verändern. CursorType wird für jede andere Operation ignoriert.

LockType Ein LockTypeEnum-Wert, der den Sperrtyp für das zu öffnende Recordset-Objekt enthält. Mit diesem Parameter können Sie die Sperrung während einer Recordset Open-Operation zu jedem beliebigen Typ verändern. LockType wird für jede andere Operation ignoriert.

Options Ein Wert vom Datentyp Long, der Optionen anzeigt, mit denen der Befehl ausgeführt oder das Recordset-Objekt geöffnet werden kann.

adStatus Ein EventStatusEnum-Statuswert, der bei Aufruf dieses Ereignisses adStatusCantDeny oder adStatusOK sein kann. Ist der Wert adStatusCantDeny, kann dieses Ereignis den Abbruch der anstehenden Operation nicht anfordern.

Legen Sie diesen Parameter auf adStatusUnwantedEvent fest, bevor dieses Ereignis zurückgegeben wird, um nachfolgende Benachrichtigungen zu verhindern. Legen Sie den Parameter hingegen auf adStatusCancel fest, um den Abbruch der Operation anzufordern, durch die das Ereignis ausgelöst wurde.

pCommand Das Command-Objekt, für das diese Ereignisbenachrichtigung gilt.

pRecordset Das Recordset-Objekt, für das diese Ereignisbenachrichtigung gilt.

pConnection Das Connection-Objekt, für das diese Ereignisbenachrichtigung gilt.

Hinweise

Ein WillExecute-Ereignis kann aufgrund von Connection. Execute-, Command. Execute- oder Recordset. Open-Methoden stattfinden. Der Parameter pConnection sollte immer eine gültige Referenz auf ein Connection-Objekt enthalten. Wenn das Ereignis aufgrund von Connection.Execute stattfindet, werden die Parameter pRecordset und pCommand auf Nothing festgelegt. Wenn das Ereignis aufgrund von Recordset.Open stattfindet, referenziert der Parameter pRecordset auf das Recordset-Objekt, und der Parameter pCommand wird auf Nothing festgelegt. Wenn das Ereignis aufgrund von Command.Execute stattfindet, referenziert der Parameter pCommand auf das Command-Objekt, und der Parameter pRecordset wird auf Nothing festgelegt.

WillExecute gestattet Ihnen, die anstehenden Ausführungsparameter zu überprüfen und zu ändern. Dieses Ereignis kann eine Anforderung für den Abbruch des anstehenden Befehls zurückgeben.


WillMove- und MoveComplete-Ereignisse (ADO)

WillMove- und MoveComplete-Ereignisse

Das WillMove-Ereignis wird aufgerufen, bevor eine anstehende Operation die aktuelle Position im Recordset-Objekt verändert. Das MoveComplete-Ereignis wird aufgerufen, nachdem die aktuelle Position im Recordset-Objekt verändert wurde.

Syntax

WillMove adReason, adStatus, pRecordset

MoveComplete adReason, pError, adStatus, pRecordset

Parameter

adReason Ein EventReasonEnum-Wert, der den Grund des Ereignisses angibt. Sein Wert kann adRsnMoveFirst, adRsnMoveLast, adRsnMoveNext, adRsnMovePrevious, adRsnMove oder adRsnRequery sein.

pError Ein Error-Objekt. Es beschreibt den aufgetretenen Fehler, wenn adStatus den Wert adStatusErrorsOccurred hat; andernfalls ist es nicht festgelegt.

adStatus Ein EventStatusEnum-Statuswert.

Beim Aufruf von WillMove wird dieser Parameter auf adStatusOK festgelegt, wenn die das Ereignis auslösende Operation erfolgreich war. Wenn dieses Ereignis den Abbruch der anstehenden Operation nicht anfordern kann, wird der Parameter hingegen auf adStatusCantDeny festgelegt.

Beim Aufruf von MoveComplete ist dieser Parameter auf adStatusOK festgelegt, wenn die das Ereignis auslösende Operation erfolgreich war. Wenn die Operation fehlgeschlagen ist, wird der Parameter hingegen auf adStatusErrorsOccurred festgelegt.

Legen Sie diesen Parameter auf adStatusCancel fest, bevor WillMove zurückgegeben wird, um den Abbruch der anstehenden Operation anzufordern. Legen Sie diesen Parameter auf adStatusUnwantedEvent fest, bevor MoveComplete zurückgegeben wird, um nachfolgende Benachrichtigungen zu verhindern.

pRecordset Ein Recordset-Objekt. Das Recordset-Objekt, für das dieses Ereignis aufgetreten ist.

Hinweise

Ein WillMove- oder MoveComplete-Ereignis kann aufgrund der folgenden Recordset-Operationen stattfinden: Open-, Move-, MoveFirst-, MoveLast-, MoveNext-, MovePrevious-, AddNew- und Requery-Methoden. Diese Ereignisse können aufgrund der folgenden Eigenschaften stattfinden: Filter, Index, Bookmark, AbsolutePage und AbsolutePosition. Diese Ereignisse finden ebenfalls statt, wenn ein untergeordnetes Recordset-Objekt verbundene Recordset-Ereignisse besitzt und das übergeordnete Recordset-Objekt verschoben wird.


ADO-Aufzählungskonstanten

Als Hilfe für das Debuggen führen die ADO-Aufzählungskonstanten für jede Konstante einen Wert auf. Dieser Wert ist jedoch lediglich eine Empfehlung und kann je nach der Version von ADO variieren. Der Code sollte nur vom Namen und nicht vom tatsächlichen Wert der einzelnen Aufzählungskonstanten abhängen.

Zusammenfassung der ADO-Aufzählungskonstanten

Aufzählung | Beschreibung
ADCPROP_ASYNCTHREADPRIORITY_ENUM | Gibt für ein Recordset-Objekt von RDS die Ausführungspriorität des asynchronen Threads an, der die Daten abruft.
ADCPROP_AUTORECALC_ENUM | Gibt an, wann der MSDataShape-Provider Aggregate erneut berechnet und Spalten in einem hierarchischen Recordset-Objekt berechnet.
ADCPROP_UPDATECRITERIA_ENUM | Gibt an, welche Felder zum Erkennen von Konflikten während einer Aktualisierung mit teilweisem Sperren einer Zeile der Datenquelle mit einem Recordset-Objekt verwendet werden können.
ADCPROP_UPDATERESYNC_ENUM | Gibt an, ob auf die UpdateBatch-Methode eine implizite Resync-Methodenoperation folgt, und wenn ja, wird der Umfang dieser Operation angegeben.
AffectEnum | Gibt an, ob Datensätze durch eine Operation beeinflusst werden.
BookmarkEnum | Gibt ein Lesezeichen an, das kennzeichnet, wo die Operation beginnen soll.
CommandTypeEnum | Gibt an, wie ein Befehlsargument interpretiert werden soll.
CompareEnum | Gibt die relative Position zweier Datensätze an, die durch ihre Lesezeichen dargestellt werden.
ConnectModeEnum | Gibt die verfügbaren Berechtigungen für die Änderung von Daten in einem Connection-Objekt an, öffnet ein Record-Objekt oder gibt Werte für die Mode-Eigenschaft des Record- und Stream–Objekts an.
ConnectOptionEnum | Gibt an, ob die Open-Methode eines Connection-Objekts zurückgegeben werden soll, nachdem (synchron) oder bevor (asynchron) die Verbindung eingerichtet wurde.
ConnectPromptEnum | Gibt an, ob ein Dialogfeld zum Eingeben fehlender Parameter angezeigt werden soll, wenn eine Verbindung mit einer ODBC-Datenquelle hergestellt wird.
CopyRecordOptionsEnum | Gibt das Verhalten der CopyRecord-Methode an.
CursorLocationEnum | Gibt den Speicherort des Cursormoduls an.
CursorOptionEnum | Gibt an, welche Funktion die Supports-Methode testen sollte.
CursorTypeEnum | Gibt den in einem Recordset-Objekt verwendeten Cursortyp an.
DataTypeEnum | Gibt den Datentyp von Field, Parameter oder Property an.
EditModeEnum | Gibt den Bearbeitungsstatus eines Datensatzes an.
ErrorValueEnum | Gibt den Typ des Laufzeitfehlers von ADO an.
EventReasonEnum | Gibt den Grund für das Auftreten eines Ereignisses an.
EventStatusEnum | Gibt den aktuellen Status der Ausführung eines Ereignisses an.
ExecuteOptionEnum | Gibt an, wie ein Provider einen Befehl ausführen soll.
FieldEnum | Gibt die speziellen Felder an, auf die in der Fields-Auflistung eines Record-Objekts verwiesen wird.
FieldAttributeEnum | Gibt ein oder mehrere Attribute eines Field–Objekts an.
FilterGroupEnum | Gibt die Gruppe der Datensätze an, die aus einem Recordset-Objekt gefiltert wurden.
GetRowsOptionEnum | Gibt an, wie viele Datensätze aus einem Recordset-Objekt abgerufen werden.
IsolationLevelEnum | Gibt die Transaktionsebene für ein Connection-Objekt an.
LineSeparatorsEnum | Gibt das als Zeilentrennzeichen in einem Stream–Objekt verwendete Zeichen an.
LockTypeEnum | Gibt die Art der Sperre an, die während des Bearbeitens auf Datensätze gelegt wird.
MarshalOptionsEnum | Gibt an, welche Datensätze an den Server zurückgegeben werden sollen.
MoveRecordOptionsEnum | Gibt das Verhalten der MoveRecord–Methode des Record–Objekts an.
ObjectStateEnum | Gibt an, ob ein Objekt geöffnet oder geschlossen wird, stellt eine Verbindung zu einer Datenquelle her, führt einen Befehl aus oder ruft Daten ab.
ParameterAttributesEnum | Gibt die Attribute eines Parameter–Objekts an.
ParameterDirectionEnum | Gibt an, ob das Parameter-Objekt einen Eingabeparameter, einen Ausgabeparameter oder beides darstellt bzw. ob es sich bei dem Parameter um den Rückgabewert einer gespeicherten Prozedur handelt.
PersistFormatEnum | Gibt das Format an, in dem das Recordset–Objekt gespeichert wird.
PositionEnum | Gibt die aktuelle Position des Datensatzzeigers in einem Recordset-Objekt an.
PropertyAttributesEnum | Gibt die Attribute eines Property–Objekts an.
RecordCreateOptionsEnum | Gibt für die Open–Methode des Record–Objekts an, ob ein vorhandenes Record-Objekt geöffnet oder ein neues Record-Objekt erstellt werden soll.
RecordOpenOptionsEnum | Gibt Optionen zum Öffnen eines Record–Objekts an. Diese Werte können mithilfe des OR-Operators kombiniert werden.
RecordStatusEnum | Gibt den Status eines Datensatzes in Bezug auf Stapelaktualisierungen oder andere umfangreiche Vorgänge an.
RecordTypeEnum | Gibt den Typ des Record-Objekts an.
ResyncEnum | Gibt an, ob zugrunde liegende Werte durch Aufrufen von Resync außer Kraft gesetzt werden.
SaveOptionsEnum | Gibt an, ob eine Datei erstellt oder überschrieben werden soll, wenn der Speichervorgang aus einem Stream–Objekt vorgenommen wird. Die Werte können mit einem AND-Operator kombiniert werden.
SchemaEnum | Gibt den Typ des Schemas des Recordset-Objekts an, der die OpenSchema–Methode abruft.
SearchDirectionEnum | Gibt die Richtung einer Datensatzsuche innerhalb eines Recordset–Objekts an.
SeekEnum | Gibt den Ausführungstyp von Seek an.
StreamOpenOptionsEnum | Gibt Optionen zum Öffnen eines Stream–Objekts an. Die Werte können mit einem AND-Operator kombiniert werden.
StreamReadEnum | Gibt an, ob das gesamte Stream-Objekt oder die nächste Zeile aus dem Stream–Objekt gelesen werden soll.
StreamTypeEnum | Gibt den in einem Stream–Objekt gespeicherten Datentyp an.
StreamWriteEnum | Gibt an, ob ein Zeilentrennzeichen an die in ein Stream–Objekt geschriebene Zeichenfolge angehängt wird.
StringFormatEnum | Gibt das Format an, wenn ein Recordset-Objekt als eine Zeichenfolge abgerufen wird.
XactAttributeEnum | Gibt die Transaktionsattribute eines Connection–Objekts an.


ADCPROP_ASYNCTHREADPRIORITY_ENUM

Gibt für ein Recordset-Objekt von RDS die Ausführungspriorität des asynchronen Threads an, der die Daten abruft.

Verwenden Sie diese Konstanten mit der dynamischen Eigenschaft Background Thread Priority des Recordset-Objekts, auf die im Index der dynamischen Eigenschaften von ADO-nach-OLE DB verwiesen wird und die in der Dokumentation unter Microsoft Cursordienst für OLE DB beschrieben ist.

Konstante | Wert | Beschreibung
adPriorityAboveNormal | 4 | Legt die Priorität zwischen normaler und höchster fest.
adPriorityBelowNormal | 2 | Legt die Priorität zwischen niedrigster und normaler fest.
adPriorityHighest | 5 | Legt die höchstmögliche Priorität fest.
adPriorityLowest | 1 | Legt die niedrigstmögliche Priorität fest.
adPriorityNormal | 3 | Legt die normale Priorität fest.

ADO/WFC-Äquivalent

Paket: com.ms.wfc.data

Konstante
AdoEnums.AdcPropAsyncThreadPriority.ABOVENORMAL
AdoEnums.AdcPropAsyncThreadPriority.BELOWNORMAL
AdoEnums.AdcPropAsyncThreadPriority.HIGHEST
AdoEnums.AdcPropAsyncThreadPriority.LOWEST
AdoEnums.AdcPropAsyncThreadPriority.NORMAL


ADCPROP_AUTORECALC_ENUM

Gibt an, wenn der MSDataShape-Provider Aggregate erneut berechnet und Spalten in einem hierarchischen Recordset-Objekt berechnet.

Die Konstanten werden nur mit dem MSDataShape- Provider und der dynamischen Eigenschaft Auto Recalc des Recordset-Objekts verwendet, auf die im Index der dynamischen Eigenschaften von ADO verwiesen wird und die in der Dokumentation zu Microsoft Cursordienst für OLE DB oder Microsoft Data Shaping Service für OLE DB beschrieben wird.

Konstante | Wert | Beschreibung
adRecalcAlways | 1 | Standard. Berechnet immer dann erneut, wenn der MSDataShape-Provider Werte bestimmt, welche die abhängigen berechneten Spalten geändert haben.
adRecalcUpFront | 0 | Berechnet nur, wenn anfangs das hierarchische Recordset-Objekt erstellt wird.

ADO/WFC-Äquivalent

Diese Konstanten besitzen keine ADO/WFC-Äquivalente.


ADCPROP_UPDATECRITERIA_ENUM

  • Gibt an, welche Felder zum Erkennen von Konflikten während einer Aktualisierung mit teilweisem Sperren einer Zeile der Datenquelle mit einem Recordset-Objekt verwendet werden können.

Verwenden Sie diese Konstanten mit der dynamischen Eigenschaft Update Criteria des Recordset-Objekts, auf die im Index der dynamischen Eigenschaften von ADO verwiesen wird und die in der Dokumentation Microsoft Cursordienst für OLE DB dokumentiert wird.

Konstante | Wert | Beschreibung
adCriteriaAllCols | 1 | Erkennt Konflikte, wenn eine Spalte der Quelldatenzeile verändert wurde.
adCriteriaKey | 0 | Erkennt Konflikte, wenn die Kennspalte der Quelldatenzeile verändert wurde, was bedeutet, dass die Zeile gelöscht wurde.
adCriteriaTimeStamp | 3 | Erkennt Konflikte, wenn die Zeitangabe der Quelldatenzeile verändert wurde, was bedeutet, dass auf die Zeile zugegriffen wurde, nachdem das Recordset-Objekt abgefordert wurde.
adCriteriaUpdCols | 2 | Erkennt Konflikte, wenn Spalten der Quelldatenzeile, die aktualisierten Felder des Recordset-Objekts entsprechen, verändert wurde.

ADO/WFC-Äquivalent

Paket: com.ms.wfc.data

Konstante
AdoEnums.AdcPropUpdateCriteria.ALLCOLS
AdoEnums.AdcPropUpdateCriteria.KEY
AdoEnums.AdcPropUpdateCriteria.TIMESTAMP
AdoEnums.AdcPropUpdateCriteria.UPDCOLS


ADCPROP_UPDATERESYNC_ENUM

Gibt an, ob auf die UpdateBatch-Methode eine implizite Resync-Methodenoperation folgt, und wenn ja, wird der Umfang dieser Operation angegeben.

Konstante | Wert | Beschreibung
adResyncAll | 15 | Ruft Resync für jede Zeile auf, bei der Änderungen anstehen.
adResyncAutoIncrement | 1 | Standard. Versucht den neuen Identifizierungswert für Spalten abzurufen, die automatisch durch die Datenquelle erhöht oder entwickelt werden, wie z. B. AutoNumber-Felder von Microsoft Jet oder Identity-Spalten von Microsoft SQL Server.
adResyncConflicts | 2 | Ruft Resync für alle Zeilen auf, in denen die Update- oder Delete-Operation wegen eines Parallelitätskonflikts fehlgeschlagen ist.
adResyncInserts | 8 | Ruft Resync für alle erfolgreich eingegebenen Zeilen auf. Spaltenwerte von Primärschlüsseln werden nicht neu synchronisiert. Stattdessen werden Inhalte neu eingegebener Zeilen basierend auf dem vorhandenen Primärschlüsselwert neu synchronisiert. Wurde der Primärschlüsselwert verändert, fragt Resync die Inhalte der anvisierten Zeile nicht ab. Für eine automatische Erhöhung des Primärschlüsselwerts rufen Sie zuerst UpdateBatch mit adResyncAutoIncrement auf, um den durch die Datenquelle entwickelten Primärschlüsselwert abzurufen.
adResyncNone | 0 | Ruft Resync nicht auf.
adResyncUpdates | 4 | Ruft Resync für alle erfolgreich aktualisierten Zeilen auf.


AffectEnum

Gibt an, welche Datensätze durch eine Operation beeinflusst werden.

Konstante | Wert | Beschreibung
adAffectAll 3 Wird kein Filter auf das Recordset-Objekt angewendet, werden alle Datensätze beeinflusst.

Wurde die Filter-Eigenschaft auf ein String-Kriterium festgelegt (z. B. "Author='Smith'"), beeinflusst die Operation sichtbare Datensätze im aktuellen Abschnitt.

Wurde die Filter-Eigenschaft auf ein Mitglied von FilterGroupEnum oder ein Array von Lesezeichen festgelegt, beeinflusst die Operation alle Zeilen des Redordset-Objekts.

Anmerkung adAffectAll ist im Visual Basic Objekt-Browser verborgen.
adAffectAllChapters | 4 | Beeinflusst alle Datensätze in allen gleichgestellten Abschnitten des Recordset-Objekts, einschließlich der, die durch einen aktuell angewendeten Filter nicht sichtbar sind.
adAffectCurrent | 1 | Beeinflusst nur den aktuellen Datensatz.
adAffectGroup | 2 | Beeinflusst nur Datensätze, die der aktuellen Filter-Eigenschaftseinstellung entsprechen. Sie müssen die Filter-Eigenschaft auf einen FilterGroupEnum–Wert oder ein Array von Lesezeichen festlegen, um diese Option anzuwenden.

ADO/WFC-Äquivalent

Paket: com.ms.wfc.data

Konstante
AdoEnums.Affect.ALL
AdoEnums.Affect.ALLCHAPTERS
AdoEnums.Affect.CURRENT
AdoEnums.Affect.GROUP


BookmarkEnum

Gibt ein Lesezeichen an, das kennzeichnet, wo die Operation beginnen soll.

Konstante | Wert | Beschreibung
adBookmarkCurrent | 0 | Startet beim aktuellen Datensatz.
adBookmarkFirst | 1 | Startet beim ersten Datensatz
adBookmarkLast | 2 | Startet beim letzten Datensatz.

ADO/WFC-Äquivalent

Paket: com.ms.wfc.data

Konstante
AdoEnums.Bookmark.CURRENT
AdoEnums.Bookmark.FIRST
AdoEnums.Bookmark.LAST


CommandTypeEnum

Gibt an, wie ein Befehlsargument interpretiert werden soll.

Konstante | Wert | Beschreibung
adCmdUnspecified | -1 | Gibt nicht den Typ des Befehlsarguments an.
adCmdText | 1 | Wertet CommandText als Textdefinition eines Befehls oder als Aufruf einer gespeicherten Prozedur aus.
adCmdTable | 2 | Wertet CommandText als Tabellennamen aus, dessen Spalten vollzählig von einer intern generierten SQL-Abfrage zurückgegeben werden.
adCmdStoredProc | 4 | Wertet CommandText als Namen einer gespeicherten Prozedur aus.
adCmdUnknown | 8 | Standard. Gibt an, dass der in der CommandText-Eigenschaft verwendete Befehlstyp unbekannt ist.
adCmdFile | 256 | Wertet CommandText als Dateinamen eines dauerhaft gespeicherten Recordset-Objekts aus.
adCmdTableDirect | 512 | Wertet CommandText als Tabellennamen aus, dessen Spalten vollzählig zurückgegeben werden.

ADO/WFC-Äquivalent

Paket: com.ms.wfc.data

Konstante
AdoEnums.CommandType.UNSPECIFIED
AdoEnums.CommandType.TEXT
AdoEnums.CommandType.TABLE
AdoEnums.CommandType.STOREDPROC
AdoEnums.CommandType.UNKNOWN
AdoEnums.CommandType.FILE
AdoEnums.CommandType.TABLEDIRECT


CompareEnum

Gibt die relative Position zweier Datensätze an, die durch ihre Lesezeichen dargestellt werden.

Konstante | Wert | Beschreibung
adCompareEqual | 1 | Zeigt an, dass die Lesezeichen gleich sind.
adCompareGreaterThan | 2 | Zeigt an, dass sich das erste Lesezeichen hinter dem zweiten befindet.
adCompareLessThan | 0 | Zeigt an, dass sich das erste Lesezeichen vor dem zweiten befindet.
adCompareNotComparable | 4 | Zeigt an, dass die Lesezeichen nicht verglichen werden können.
adCompareNotEqual | 3 | Zeigt an, dass die Lesezeichen nicht gleich und nicht sortiert sind.

ADO/WFC-Äquivalent

Paket: com.ms.wfc.data

Konstante
AdoEnums.Compare.EQUAL
AdoEnums.Compare.GREATERTHAN
AdoEnums.Compare.LESSTHAN
AdoEnums.Compare.NOTCOMPARABLE
AdoEnums.Compare.NOTEQUAL


ConnectModeEnum

Gibt die verfügbaren Berechtigungen für die Änderung von Daten in einem Connection-Objekt an, öffnet ein Record-Objekt oder gibt Werte für die Mode-Eigenschaft des Record- und Stream–Objekts an.

Konstante | Wert | Beschreibung
adModeRead | 1 | Zeigt schreibgeschützte Berechtigungen an.
adModeReadWrite | 3 | Zeigt Schreib-/Leseberechtigungen an.
adModeRecursive | 0x400000 | Wird in Verbindung mit den anderen *ShareDeny*–Werten (adModeShareDenyNone, adModeShareDenyWrite oder adModeShareDenyRead) zur Weiterleitung von freigegebenen Einschränkungen auf alle untergeordneten Datensätze des aktuellen Record-Objekts verwendet. Dies bleibt wirkungslos, wenn das Record-Objekt keine untergeordneten Datensätze besitzt. Es tritt ein Laufzeitfehler auf, wenn es nur mit adModeShareDenyNone verwendet wird. Es kann jedoch in Kombination von adModeShareDenyNone mit anderen Werten verwendet werden. Beispielsweise können Sie "adModeRead OR adModeShareDenyNone OR adModeRecursive" verwenden.
adModeShareDenyNone | 16 | Gestattet anderen Benutzern, eine Verbindung mit Berechtigungen herzustellen. Weder der Lese- noch der Schreibzugriff kann anderen Benutzern verweigert werden.
adModeShareDenyRead | 4 | Verhindert das Herstellen einer Verbindung mit Leseberechtigungen durch andere Benutzer.
adModeShareDenyWrite | 8 | Verhindert das Herstellen einer Verbindung mit Schreibberechtigungen durch andere Benutzer.
adModeShareExclusive | 12 | Verhindert das Herstellen einer Verbindung durch andere Benutzer.
adModeUnknown | 0 | Standard. Gibt an, dass die Berechtigungen noch nicht festgelegt wurden oder nicht bestimmt werden können.
adModeWrite | 2 | Gibt Nur-Lese-Berechtigungen an.

ADO/WFC-Äquivalent

Paket: com.ms.wfc.data

Konstante
AdoEnums.ConnectMode.READ
AdoEnums.ConnectMode.READWRITE
(There is no equivalent of AdoEnums.ConnectMode.RECURSIVE)
AdoEnums.ConnectMode.SHAREDENYNONE
AdoEnums.ConnectMode.SHAREDENYREAD
AdoEnums.ConnectMode.SHAREDENYWRITE
AdoEnums.ConnectMode.SHAREEXCLUSIVE
AdoEnums.ConnectMode.UNKNOWN
AdoEnums.ConnectMode.WRITE


ConnectOptionEnum

Gibt an, ob die Open-Methode eines Connection-Objekts zurückgegeben werden soll, nachdem (synchron) oder bevor (asynchron) die Verbindung eingerichtet wurde.

Konstante | Wert | Beschreibung
adAsyncConnect | 16 | Öffnet die Verbindung asynchron. Mithilfe des ConnectComplete-Ereignisses kann bestimmt werden, wann die Verbindung verfügbar ist.
adConnectUnspecified | -1 | Standard. Öffnet die Verbindung synchron.

ADO/WFC-Äquivalent

Paket: com.ms.wfc.data

Konstante
AdoEnums.ConnectOption.ASYNCCONNECT
AdoEnums.ConnectOption.CONNECTUNSPECIFIED


ConnectPromptEnum

Gibt an, ob ein Dialogfeld zum Eingeben fehlender Parameter angezeigt werden soll, wenn eine Verbindung mit einer Datenquelle hergestellt wird.

Konstante | Wert | Beschreibung
adPromptAlways | 1 | Dialogfeld wird immer angezeigt.
adPromptComplete | 2 | Dialogfeld wird angezeigt, wenn weitere Informationen erforderlich sind.
adPromptCompleteRequired | 3 | Dialogfeld wird angezeigt, wenn weitere Informationen erforderlich sind, aber keine optionalen Parameter zulässig sind.
adPromptNever | 4 | Dialogfeld wird nie angezeigt.

ADO/WFC-Äquivalent

Paket: com.ms.wfc.data

Konstante
AdoEnums.ConnectPrompt.ALWAYS
AdoEnums.ConnectPrompt.COMPLETE
AdoEnums.ConnectPrompt.COMPLETEREQUIRED
AdoEnums.ConnectPrompt.NEVER


CopyRecordOptionsEnum

Legt das Verhalten der CopyRecord-Methode fest.

Konstante | Wert | Beschreibung
adCopyAllowEmulation | 4 | Zeigt an, dass der Sourceprovider versucht, mithilfe der download und upload-Operationen die Kopie in Destination zu simulieren, falls diese Methode fehlschlägt. Wenn es auf einem anderen Server ist oder von einem anderen Provider bedient wird, dann in Source. Beachten Sie, dass durch verschiedene Providerfähigkeiten Leistungen behindert werden oder Daten verloren gehen können.
adCopyNonRecursive | 2 | Kopiert das aktuelle Verzeichnis, aber keines der Unterverzeichnisse in das Ziel. Diese Operation ist nicht rekursiv.
adCopyOverWrite | 1 | Überschreibt die Datei oder das Verzeichnis, wenn Destination auf eine vorhandene Datei oder ein Verzeichnis zeigt.
adCopyUnspecified | -1 | Standard. Führt die Standardkopieroperation aus: Die Operation schlägt fehl, wenn die Zieldatei oder das Zielverzeichnis bereits vorhanden ist, wobei die Operation rekursiv ist.

ADO/WFC-Äquivalent

Diese Konstanten besitzen keine ADO/WFC-Äquivalente.


CursorLocationEnum

Gibt den Speicherplatz des Cursormoduls an.

Konstante | Wert | Beschreibung
adUseClient | 3 | Verwendet einen clientbasierten Cursor, der durch eine lokale Cursorbibliothek zur Verfügung gestellt wird. Lokale Cursorsdienste lassen häufig eine Vielzahl von Features zu, die bei treibergestützten Cursorn nicht zulässig sind. Daher kann die Verwendung dieser Einstellung im Hinblick auf die zu aktivierenden Features von Vorteil sein. Um die Abwärtskompatibilität zu gewährleisten, wird ebenfalls das gleichwertige adUseClientBatch unterstützt.
adUseNone | 1 | Verwendet keine Cursordienste. (Diese Konstante ist überflüssig, sie wird nur angezeigt, um die Abwärtskompatibilität zu gewährleisten.)
adUseServer | 2 | Standard. Verwendet die durch Datenprovider oder Treiber zur Verfügung gestellten Cursor. Diese Cursor sind zum Teil sehr flexibel und ermöglichen eine zusätzliche Sensibilität gegenüber Änderungen, die von anderen Benutzern an der Datenquelle vorgenommen werden. Einige Features von Microsoft Cursordienst für OLE DB (z. B. nicht zugeordnete Recordset-Objekte) können jedoch mit serverbasierten Cursorn nicht simuliert werden, diese Features stehen bei dieser Einstellung nicht zur Verfügung.

ADO/WFC-Äquivalent

Paket: com.ms.wfc.data

Konstante
AdoEnums.CursorLocation.CLIENT
AdoEnums.CursorLocation.NONE
AdoEnums.CursorLocation.SERVER


CursorOptionEnum

Gibt an, welche Funktion die Supports-Methode testen soll.

Konstante | Wert | Beschreibung
adAddNew | 0x1000400 | Unterstützt die AddNew–Methode, um neue Datensätze hinzuzufügen.
adApproxPosition | 0x4000 | Unterstützt die AbsolutePosition- und AbsolutePage-Eigenschaften.
adBookmark | 0x2000 | Unterstützt die Bookmark-Eigenschaft, um auf bestimmte Datensätze zuzugreifen.
adDelete | 0x1000800 | Unterstützt die Delete–Methode, um Datensätze zu löschen.
adFind | 0x80000 | Unterstützt die Find–Methoden, um eine Zeile in einem Recordset–Objekt zu ermitteln.
adHoldRecords | 0x100 | Ruft mehr Datensätze ab oder ändert die nächste Position, ohne alle anstehenden Änderungen abzuschließen.
adIndex | 0x100000 | Unterstützt die Index–Eigenschaft, um einen Index zu benennen.
adMovePrevious | 0x200 | Unterstützt die MoveFirst- und MovePrevious-Methoden sowie die Move- oder GetRows-Methode, um die aktuelle Datensatzposition rückwärts zu verschieben, ohne dass Lesezeichen benötigt werden.
adNotify | 0x40000 | Zeigt an, dass der zugrunde liegende Datenprovider Benachrichtigungen unterstützt (welche bestimmen, ob Recordset-Ereignisse unterstützt werden).
adResync | 0x20000 | Unterstützt die Resync–Methode, um den Cursor mit den Daten zu aktualisieren, die in der zugrunde liegenden Datenbank angezeigt werden.
adSeek | 0x200000 | Unterstützt die Seek–Methoden, um eine Zeile in einem Recordset–Objekt zu ermitteln.
adUpdate | 0x1008000 | Unterstützt die Update–Methode, um vorhandene Daten zu verändern.
adUpdateBatch | 0x10000 | Unterstützt Stapelaktualisierungen (UpdateBatch- und CancelBatch-Methoden), um Gruppen von Änderungen an den Provider zu übertragen.

ADO/WFC-Äquivalent

Paket: com.ms.wfc.data

Konstante
AdoEnums.CursorOption.ADDNEW
AdoEnums.CursorOption.APPROXPOSITION
AdoEnums.CursorOption.BOOKMARK
AdoEnums.CursorOption.DELETE
AdoEnums.CursorOption.FIND
AdoEnums.CursorOption.HOLDRECORDS
AdoEnums.CursorOption.INDEX
AdoEnums.CursorOption.MOVEPREVIOUS
AdoEnums.CursorOption.NOTIFY
AdoEnums.CursorOption.RESYNC
AdoEnums.CursorOption.SEEK
AdoEnums.CursorOption.UPDATE
AdoEnums.CursorOption.UPDATEBATCH


CursorTypeEnum

Gibt den in einem Recordset-Objekt verwendeten Cursortyp an.

Konstante | Wert | Beschreibung
adOpenDynamic | 2 | Verwendet einen dynamischen Cursor. Von anderen Benutzern vorgenommene Zusätze, Änderungen und Löschvorgänge können angezeigt werden. Alle Bewegungsarten durch das Recordset–Objekt sind zulässig, mit Ausnahme von Lesezeichen (sofern der Provider diese nicht unterstützt).
adOpenForwardOnly | 0 | Standard. Verwendet einen Cursor vom Typ Vorwärts. Dieser Cursor ist identisch mit einem statischen Cursor, mit dem Unterschied, dass ein Durchsuchen der Datensätze nur in Vorwärtsrichtung möglich ist. Dadurch wird die Leistung verbessert, wenn nur ein einziger Durchlauf durch ein Recordset-Objekt durchgeführt werden muss.
adOpenKeyset | 1 | Verwendet einen Cursor von Typ Keyset. Ähnelt einem dynamischen Cursor, mit dem Unterschied, dass von anderen Benutzern hinzugefügte Datensätze nicht angezeigt werden können, obwohl ein Zugriff auf von anderen Benutzern gelöschte Datensätze von Ihrem Recordset-Objekt aus nicht möglich ist. Von anderen Benutzern vorgenommene Datenänderungen können weiterhin angezeigt werden.
adOpenStatic | 3 | Verwendet einen statischen Cursor. Eine statische Kopie einer Gruppe von Datensätzen, anhand derer Daten gesucht und Berichte entwickelt werden können. Von anderen Benutzern vorgenommene Zusätze, Änderungen oder Löschvorgänge können nicht angezeigt werden.
adOpenUnspecified | -1 | Gibt keinen Cursortyp an

ADO/WFC-Äquivalent

Paket: com.ms.wfc.data

Konstante
AdoEnums.CursorType.DYNAMIC
AdoEnums.CursorType.FORWARDONLY
AdoEnums.CursorType.KEYSET
AdoEnums.CursorType.STATIC
AdoEnums.CursorType.UNSPECIFIED


DataTypeEnum

Gibt den Datentyp von einem Field, eines Parameter oder einer Property an. Der entsprechende OLE DB-Typanzeiger ist in der Spalte Beschreibung der folgenden Tabelle in Klammern angegeben. Weitere Informationen zu OLE DB-Datentypen finden Sie in Kapitel 13 und in Anhang A der OLE DB Programmer's Reference.

Konstante | Wert | Beschreibung
AdArray (gilt nicht für ADOX) | 0x2000 | Ein Flagwert, immer in Kombination mit einer anderen Datentypkonstanten, der ein Array dieses anderen Datentyps kennzeichnet.
adBigInt | 20 | Zeigt eine 8 Byte umfassende ganze Zahl mit Vorzeichen (DBTYPE_I8) an.
adBinary | 128 | Zeigt einen Binärwert (DBTYPE_BYTES) an.
adBoolean | 11 | Zeigt einen booleschen Wert (DBTYPE_BOOL) an.
adBSTR | 8 | Zeigt eine mit Nullzeichen endende Zeichenfolge (Unicode) (DBTYPE_BSTR) an.
adChapter | 136 | Zeigt einen 4 Byte langen Chapter-Wert zum Bezeichnen von Zeilen in einem untergeordneten Rowset-Objekt (DBTYPE_HCHAPTER) an.
adChar | 129 | Zeigt einen Zeichenfolgenwert (DBTYPE_STR) an.
adCurrency | 6 | Zeigt einen Currency-Wert (DBTYPE_CY) an. Eine Währungsangabe (Currency) ist eine Festkommazahl mit vier Stellen hinter dem Komma. Sie wird als 8 Byte umfassende ganze Zahl mit Vorzeichen, skaliert mit 10.000, gespeichert.
adDate | 7 | Zeigt einen Datumswert (DBTYPE_DATE) an. Ein Datum wird als Wert vom Datentyp Double gespeichert, dessen Integeranteil die Anzahl der Tage seit dem 30. Dezember 1899 darstellt. Bei dem Bruchteil des Double handelt es sich um den Bruchteil des Tages.
adDBDate | 133 | Zeigt einen Datumswert (jjjjmmtt) (DBTYPE_DBDATE) an.
adDBTime | 134 | Zeigt einen Zeitwert (hhmmss) (DBTYPE_DBTIME) an.
adDBTimeStamp | 135 | Zeigt einen Timestamp mit Datum und Zeit (jjjjmmtthhmmss plus ein Bruch in Milliardstel) (DBTYPE_DBTIMESTAMP) an.
adDecimal | 14 | Zeigt einen genauen numerischen Wert mit fester Genauigkeit und Skalierung (DBTYPE_DECIMAL) an.
adDouble | 5 | Zeigt einen Gleitkommawert doppelter Genauigkeit (DBTYPE_R8) an.
adEmpty | 0 | Gibt an, dass kein Wert vorhanden ist (DBTYPE_EMPTY).
adError | 10 | Zeigt einen 32-Bit-Fehlercode (DBTYPE_ERROR) an.
adFileTime | 64 | Zeigt einen 64 Bit umfassenden Wert, der die Anzahl der seit dem 1. Januar 1601 verstrichenen 100-Nanosekunden-Intervalle darstellt (DBTYPE_FILETIME) an.
adGUID | 72 | Zeigt einen global eindeutigen Bezeichner (Globally Unique Identifier, GUID) (DBTYPE_GUID) an.
adIDispatch | 9 | Zeigt einen Zeiger auf eine IDispatch-Schnittstelle in einem COM-Objekt (DBTYPE_IDISPATCH) an. Anmerkung Dieser Datentyp wird von ADO zz. nicht unterstützt. Seine Verwendung kann zu unvorhersehbaren Ergebnissen führen.
adInteger | 3 | Zeigt eine 4 Byte umfassende ganze Zahl mit Vorzeichen (DBTYPE_I4) an.
adIUnknown | 13 | Zeigt einen Zeiger auf eine IUnknown-Schnittstelle in einem COM-Objekt (DBTYPE_IUNKNOWN) an. Anmerkung Dieser Datentyp wird von ADO zz. nicht unterstützt. Seine Verwendung kann zu unvorhersehbaren Ergebnissen führen.
adLongVarBinary | 205 | Zeigt einen Binärwert vom Datentyp Long (nur Parameter-Objekt) an.
adLongVarChar | 201 | Zeigt einen Zeichenfolgenwert vom Datentyp Long (nur Parameter-Objekt) an.
adLongVarWChar | 203 | Zeigt einen mit Nullzeichen endenden Unicode-Zeichenfolgenwert vom Datentyp Long (nur Parameter-Objekt) an.
adNumeric | 131 | Zeigt einen genauen numerischen Wert mit fester Genauigkeit und Skalierung (DBTYPE_NUMERIC) an.
adPropVariant | 138 | Zeigt einen PROPVARIANT-Wert für die Automatisierung (DBTYPE_PROP_VARIANT) an.
adSingle | 4 | Zeigt einen Gleitkommawert einfacher Genauigkeit (DBTYPE_R4) an.
adSmallInt | 2 | Zeigt eine 2 Byte umfassende Ganzzahl mit Vorzeichen (DBTYPE_I2) an.
adTinyInt | 16 | Zeigt eine 1 Byte umfassende Ganzzahl mit Vorzeichen (DBTYPE_I1) an.
adUnsignedBigInt | 21 | Zeigt eine 8 Byte umfassende Ganzzahl ohne Vorzeichen (DBTYPE_UI8) an.
adUnsignedInt | 19 | Zeigt eine 4 Byte umfassende Ganzzahl ohne Vorzeichen (DBTYPE_UI4) an.
adUnsignedSmallInt | 18 | Zeigt eine 2 Byte umfassende Ganzzahl ohne Vorzeichen (DBTYPE_UI2) an.
adUnsignedTinyInt | 17 | Zeigt eine 1 Byte umfassende Ganzzahl ohne Vorzeichen (DBTYPE_UI1) an.
adUserDefined | 132 | Zeigt eine benutzerdefinierte Variable (DBTYPE_UDT) an.
adVarBinary | 204 | Zeigt einen Binärwert (nur Parameter-Objekt) an.
adVarChar | 200 | Zeigt einen Zeichenfolgenwert (nur Parameter-Objekt) an.
adVariant | 12 | Zeigt einen Wert vom Datentyp Variant für die Automatisierung (DBTYPE_VARIANT) an. Anmerkung Dieser Datentyp wird von ADO zz. nicht unterstützt. Seine Verwendung kann zu unvorhersehbaren Ergebnissen führen.
adVarNumeric | 139 | Zeigt einen numerischen Wert (nur Parameter-Objekt) an.
adVarWChar | 202 | Zeigt eine mit Nullzeichen endende Unicode-Zeichenfolge (nur Parameter-Objekt) an.
adWChar | 130 | Zeigt eine mit Nullzeichen endende Unicode-Zeichenfolge (DBTYPE_WSTR) an.

ADO/WFC-Äquivalent

Paket: com.ms.wfc.data

Konstante
AdoEnums.DataType.ARRAY
AdoEnums.DataType.BIGINT
AdoEnums.DataType.BINARY
AdoEnums.DataType.BOOLEAN
AdoEnums.DataType.BSTR
AdoEnums.DataType.CHAPTER
AdoEnums.DataType.CHAR
AdoEnums.DataType.CURRENCY
AdoEnums.DataType.DATE
AdoEnums.DataType.DBDATE
AdoEnums.DataType.DBTIME
AdoEnums.DataType.DBTIMESTAMP
AdoEnums.DataType.DECIMAL
AdoEnums.DataType.DOUBLE
AdoEnums.DataType.EMPTY
AdoEnums.DataType.ERROR
AdoEnums.DataType.FILETIME
AdoEnums.DataType.GUID
AdoEnums.DataType.IDISPATCH
AdoEnums.DataType.INTEGER
AdoEnums.DataType.IUNKNOWN
AdoEnums.DataType.LONGVARBINARY
AdoEnums.DataType.LONGVARCHAR
AdoEnums.DataType.LONGVARWCHAR
AdoEnums.DataType.NUMERIC
AdoEnums.DataType.PROPVARIANT
AdoEnums.DataType.SINGLE
AdoEnums.DataType.SMALLINT
AdoEnums.DataType.TINYINT
AdoEnums.DataType.UNSIGNEDBIGINT
AdoEnums.DataType.UNSIGNEDINT
AdoEnums.DataType.UNSIGNEDSMALLINT
AdoEnums.DataType.UNSIGNEDTINYINT
AdoEnums.DataType.USERDEFINED
AdoEnums.DataType.VARBINARY
AdoEnums.DataType.VARCHAR
AdoEnums.DataType.VARIANT
AdoEnums.DataType.VARNUMERIC
AdoEnums.DataType.VARWCHAR
AdoEnums.DataType.WCHAR


EditModeEnum

Gibt den Bearbeitungsstatus eines Datensatzes an.

Konstante | Wert | Beschreibung
adEditNone | 0 | Zeigt an, dass derzeit keine Bearbeitung stattfindet.
adEditInProgress | 1 | Zeigt an, dass Daten im aktuellen Datensatz geändert, aber noch nicht gespeichert wurden.
adEditAdd | 2 | Zeigt an, dass die AddNew-Methode aufgerufen wurde und dass der aktuelle Datensatz im Kopierpuffer ein neuer Datensatz ist, der noch nicht in der Datenbank gespeichert wurde.
adEditDelete | 4 | Zeigt an, dass der aktuelle Datensatz gelöscht wurde.

ADO/WFC-Äquivalent

Paket: com.ms.wfc.data

Konstante
AdoEnums.EditMode.NONE
AdoEnums.EditMode.INPROGRESS
AdoEnums.EditMode.ADD
AdoEnums.EditMode.DELETE


ErrorValueEnum

Gibt den Typ des Laufzeitfehlers von ADO an.

Es werden drei Formen von Fehlernummern aufgelistet:

  • Positive Dezimalzahl - die beiden niederwertigen Bytes der vollständigen Nummer im Dezimalformat. Diese Nummer wird im Standarddialogfeld für Fehlernummern in Visual Basic angezeigt. Beispiel: Laufzeitfehler '3707'.

  • Negative Dezimalzahl - die Dezimalübersetzung der vollständigen Fehlernummer.

  • Hexadezimalzahl - die vollständige Fehlernummer in hexadezimaler Darstellung. Die entsprechende Anwendung von Windows ist in der vierten Stelle codiert. Der Anwendungscode für ADO betreffende Fehlernummern ist A, z. B.: 0x800A0E7B.

Anmerkung An die ADO-Anwendung können auch OLE DB-Fehler übergeben werden. Diese Fehler können normalerweise am Code 4 für die Windows-Anwendung erkannt werden, z. B. 0x8004.... Weitere Informationen zu diesen Nummern finden Sie in Kapitel 16 des OLE DB Programmer's Reference.

Konstante | Wert | Beschreibung
adErrBoundToCommand | 3707 -2146824581 0x800A0E7B | Die ActiveConnection-Eigenschaft eines Recordset-Objekts kann nicht geändert werden, wenn dessen Quelle ein Command-Objekt ist.
adErrCannotComplete | 3732 -2146824556 0x800A0E94 | Der Server kann den Vorgang nicht abschließen.
adErrCantChangeConnection | 3748 -2146824540 0x800A0EA4 | Verbindung verweigert. Die neue Verbindung hat andere Eigenschaften als die bereits verwendete.
adErrCantChangeProvider | 3220 -2146825068 0X800A0C94 | Der angegebene Provider unterscheidet sich von dem bereits verwendeten.
adErrCantConvertvalue | 3724 -2146824564 0x800A0E8C | Die Datenwerte können aus anderen Gründen als Zeichendiskrepanz oder Datenüberlauf nicht konvertiert werden. Die Konvertierung würde z. B. abgeschnittene Daten enthalten.
adErrCantCreate | 3725 -2146824563 0x800A0E8D | Die Datenwerte können nicht abgerufen oder gesetzt werden, da der Datentyp des Feldes unbekannt ist, oder die Ressourcen des Providers zur Durchführung des Vorgangs nicht ausreichen.
adErrCatalogNotSet | 3747 -2146824541 0x800A0EA3 | Der Vorgang erfordet einen gültigen ParentCatalog.
adErrColumnNotOnThisRow | 3726 -2146824562 0x800A0E8E | Der Datensatz enthält dieses Feld nicht.
adErrDataConversion | 3421 -2146824867 0x800A0D5D | Die Anwendung verwendet für den aktuellen Vorgang einen Wert vom falschen Typ.
adErrDataOverflow | 3721 -2146824567 0x800A0E89 | Der Datenwert ist zu groß, um von dem Datentyp des Feldes repräsentiert zu werden.
adErrDelResOutOfScope | 3738 -2146824550 0x800A0E9A | Der URL des zu löschenden Objekts befindet sich außerhalb des aktuellen Datensatzbereiches.
adErrDenyNotSupported | 3750 -2146824538 0x800A0EA6 | Der Provider unterstützt keine Freigabeeinschränkungen.
adErrDenyTypeNotSupported | 3751 -2146824537 0x800A0EA7 | Der Provider unterstützt die angeforderten Freigabeeinschränkungen nicht.
adErrFeatureNotAvailable | 3251 -2146825037 0x800A0CB3 | Das Objekt oder der Provider kann den angeforderten Vorgang nicht ausführen.
adErrFieldsUpdateFailed | 3749 -2146824539 0x800A0EA5 | Fehler bei der Aktualisierung der Felder. Überprüfen Sie die Statuseigenschaften der einzelnen Field-Objekte, um nähere Informationen zu finden.
adErrIllegalOperation | 3219 -2146825069 0x800A0C93 | Die angeforderte Operation ist in diesem Zusammenhang nicht zugelassen.
adErrIntegrityViolation | 3719 -2146824569 0x800A0E87 | Die Datenwerte sind unvereinbar mit der Integritätseinschränkung des Feldes.
adErrInTransaction | 3246 -2146825042 0x800A0CAE | Ein Verbindungsobjekt kann während einer Transaktion nicht explizit geschlossen werden.
adErrInvalidArgument | 3001 -2146825287 0x800A0BB9 | Die Argumente sind vom falschen Typ, liegen außerhalb des Gültigkeitsbereiches oder sind miteinander unvereinbar.
adErrInvalidConnection | 3709 -2146824579 0x800A0E7D | Ein Vorgang mit einem Objekt, das auf eine geschlossene oder ungültige Verbindung verweist, ist nicht zulässig.
adErrInvalidParamInfo | 3708 -2146824580 0x800A0E7C | Ein Parameterobjekt ist nicht ordnungsgemäß definiert. Inkonsistente oder unvollständige Informationen wurden angegeben.
adErrInvalidTransaction | 3714 -2146824574 0x800A0E82 | Die Koordinierungstransaktion ist ungültig oder wurde nicht begonnen.
adErrInvalidURL | 3729 -2146824559 0x800A0E91 | Der URL enthält ungültige Zeichen. Bitte überprüfen Sie die Eingabe.
adErrItemNotFound | 3265 -2146825023 0x800A0CC1 | Ein Objekt, das dem angeforderten Namen oder dem Ordinalverweis entspricht, kann nicht gefunden werden.
adErrNoCurrentRecord | 3021 -2146825267 0x800A0BCD | Entweder BOF oder EOF ist True, oder der aktuelle Datensatz wurde gelöscht. Die angeforderte Operation benötigt einen aktuellen Datensatz.
adErrNotExecuting | 3715 -2146824573 0x800A0E83 | Der Vorgang kann nicht ausgeführt werden, während keine Ausführung stattfindet.
adErrNotReentrant | 3710 -2146824578 0x800A0E7E | Der Vorgang kann nicht ausgeführt werden, während ein Ereignis verarbeitet wird.
adErrObjectClosed | 3704 -2146824584 0x800A0E78 | Der Vorgang ist für ein geschlossenes Objekt nicht zugelassen.
adErrObjectInCollection | 3367 -2146824921 0x800A0D27 | Das Objekt befindet sich bereits in einer Auflistung. Anfügen nicht möglich.
adErrObjectNotSet | 3420 -2146824868 0x800A0D5C | Das Objekt ist nicht mehr gültig.
adErrObjectOpen | 3705 -2146824583 0x800A0E79 | Der Vorgang ist für ein geöffnetes Objekt nicht zugelassen.
adErrOpeningFile | 3002 -2146825286 0x800A0BBA | Die Datei konnte nicht geöffnet werden.
adErrOperationCancelled | 3712 -2146824576 0x800A0E80 | Die Operation wurde vom Benutzer abgebrochen.
adErrOutOfSpace | 3734 -2146824554 0x800A0E96 | Der Vorgang kann nicht ausgeführt werden. Dem Provider steht nicht genug Speicherplatz zur Verfügung.
adErrPermissionDenied | 3720 -2146824568 0x800A0E88 | Keine ausreichende Zugriffsberechtigung, um in dieses Feld zu schreiben.
adErrPropConflicting | 3742 -2146824546 0x800A0E9E | Der Wert der Eigenschaft verletzt den Wert einer verbundenen Eigenschaft.
adErrPropInvalidColumn | 3739 -2146824549 0x800A0E9B | Die Eigenschaft bezieht sich nicht auf das angegebene Feld.
adErrPropInvalidOption | 3740 -2146824548 0x800A0E9C | Das Attribut der Eigenschaft ist ungültig.
adErrPropInvalidValue | 3741 -2146824547 0x800A0E9D | Der Wert der Eigenschaft ist ungültig. Bitte überprüfen Sie die Rechtschreibung des Wertes.
adErrPropNotAllSettable | 3743 -2146824545 0x800A0E9F | Die Eigenschaft ist schreibgeschützt und kann nicht festgelegt werden.
adErrPropNotSet | 3744 -2146824544 0x800A0EA0 | Der optionale Eigenschaftswert wurde nicht festgelegt.
adErrPropNotSettable | 3745 -2146824543 0x800A0EA1 | Der schreibgeschützte Wert der Eigenschaft wurde nicht festgelegt.
adErrPropNotSupported | 3746 -2146824542 0x800A0EA2 | Der Provider unterstützt die Eigenschaft nicht.
adErrProviderFailed | 3000 -2146825288 0x800A0BB8 | Der Provider konnte den Vorgang nicht ausführen.
adErrProviderNotFound | 3706 -2146824582 0x800A0E7A | Der Provider kann nicht gefunden werden. Möglicherweise ist er nicht richtig installiert worden.
adErrReadFile | 3003 -2146825285 0x800A0BBB | Die Datei konnte nicht gelesen werden.
adErrResourceExists | 3731 -2146824557 0x800A0E93 | Der Kopiervorgang kann nicht ausgeführt werden. Das vom URL benannte Objekt existiert bereits. Geben Sie adCopyOverwrite an, um das Objekt zu ersetzen.
adErrResourceLocked | 3730 -2146824558 0x800A0E92 | Das von diesem URL repräsentierte Objekt wird von einem oder mehreren anderen Prozessen gesperrt. Bitte warten Sie, bis der Vorgang beendet ist und versuchen Sie es dann erneut.
adErrResourceOutOfScope | 3735 -2146824553 0x800A0E97 | Der Ursprungs-URL oder der Ziel-URL ist außerhalb des aktuellen Datensatzbereiches.
adErrSchemaViolation | 3722 -2146824566 0x800A0E8A | Der Datentyp ist unvereinbar mit dem Datentyp oder mit den Einschränkungen des Feldes.
adErrSignMismatch | 3723 -2146824565 0x800A0E8B | Die Konvertierung scheiterte, da der Datenwert unterzeichnet und der Datentyp des Feldes, der von dem Provider benutzt wird, nicht unterzeichnet war.
adErrStillConnecting | 3713 -2146824575 0x800A0E81 | Der Vorgang kann nicht ausgeführt werden, während ein asynchrone Verbindung aufgenommen wird.
adErrStillExecuting | 3711 -2146824577 0x800A0E7F | Der Vorgang kann nicht verarbeitet werden, während ein asynchroner Befehl ausgeführt wird.
adErrTreePermissionDenied | 3728 -2146824560 0x800A0E90 | Die Zugangsberechtigungen reichen nicht aus, um die Verzeichnisstruktur oder die Unterstruktur zu errreichen.
adErrUnavailable | 3736 -2146824552 0x800A0E98 | Der Vorgang konnte nicht abgeschlossen werden und der Status ist unverfügbar. Das Feld ist möglicherweise nicht verfügbar oder der Vorgang wurde nicht begonnen.
adErrUnsafeOperation | 3716 -2146824572 0x800A0E84 | Die Sicherheitseinstellungen dieses Computers lassen den Zugriff auf eine Datenquelle in einer anderen Domäne nicht zu.
adErrURLDoesNotExist | 3727 -2146824561 0x800A0E8F | Entweder der Ursprungs-URL oder der Ausgangspunkt des Ziel-URLs ist nicht vorhanden.
adErrURLNamedRowDoesNotExist | 3737 -2146824551 0x800A0E99 | Ein mit diesem URL benannter Datensatz existiert nicht.
adErrVolumeNotFound | 3733 -2146824555 0x800A0E95 | Der Provider kann das vom URL angegebene Speichergerät nicht finden. Bitte überprüfen Sie die Eingabe.
adErrWriteFile | 3004 -2146825284 0x800A0BBC | Die Datei konnte nicht beschrieben werden.
adWrnSecurityDialog | 3717 -2146824571 0x800A0E85 | Nur für die interne Verwendung. Nicht verwenden.
adWrnSecurityDialogHeader | 3718 -2146824570 0x800A0E86 | Nur für die interne Verwendung. Nicht verwenden.

ADO/WFC-Äquivalent

Paket: com.ms.wfc.data

Es sind nur die folgenden Untermengen der ADO/WFC-Äquivalente definiert:

Konstante
AdoEnums.ErrorValue.BOUNDTOCOMMAND
AdoEnums.ErrorValue.DATACONVERSION
AdoEnums.ErrorValue.FEATURENOTAVAILABLE
AdoEnums.ErrorValue.ILLEGALOPERATION
AdoEnums.ErrorValue.INTRANSACTION
AdoEnums.ErrorValue.INVALIDARGUMENT
AdoEnums.ErrorValue.INVALIDCONNECTION
AdoEnums.ErrorValue.INVALIDPARAMINFO
AdoEnums.ErrorValue.ITEMNOTFOUND
AdoEnums.ErrorValue.NOCURRENTRECORD
AdoEnums.ErrorValue.NOTEXECUTING
AdoEnums.ErrorValue.NOTREENTRANT
AdoEnums.ErrorValue.OBJECTCLOSED
AdoEnums.ErrorValue.OBJECTINCOLLECTION
AdoEnums.ErrorValue.OBJECTNOTSET
AdoEnums.ErrorValue.OBJECTOPEN
AdoEnums.ErrorValue.OPERATIONCANCELLED
AdoEnums.ErrorValue.PROVIDERNOTFOUND
AdoEnums.ErrorValue.STILLCONNECTING
AdoEnums.ErrorValue.STILLEXECUTING
AdoEnums.ErrorValue.UNSAFEOPERATION


EventReasonEnum

Gibt den Grund für das Auftreten eines Ereignisses an.

Konstante | Wert | Beschreibung
adRsnAddNew | 1 | Eine Operation hat einen neuen Datensatz hinzugefügt.
adRsnClose | 9 | Eine Operation hat das Recordset geschlossen.
adRsnDelete | 2 | Eine Operation hat einen Datensatz gelöscht.
adRsnFirstChange | 11 | Eine Operation hat einen Datensatz erstmalig geändert.
adRsnMove | 10 | Eine Operation hat den Datensatzzeiger innerhalb des Recordset-Objekts verschoben.
adRsnMoveFirst | 12 | Eine Operation hat den Datensatzzeiger zum ersten Datensatz im Recordset verschoben
adRsnMoveLast | 15 | Eine Operation hat den Datensatzzeiger zum letzten Datensatz im Recordset verschoben.
adRsnMoveNext | 13 | Eine Operation hat den Datensatzzeiger zum nächsten Datensatz im Recordset verschoben.
adRsnMovePrevious | 14 | Eine Operation hat den Datensatzzeiger zum vorhergehenden Datensatz im Recordset verschoben.
adRsnRequery | 7 | Eine Operation hat das Recordset erneut abgefragt.
adRsnResynch | 8 | Eine Operation hat das Recordset mit der Datenbank neu synchronisiert.
adRsnUndoAddNew | 5 | Eine Operation hat das Hinzufügen eines neuen Datensatzes rückgängig gemacht.
adRsnUndoDelete | 6 | Eine Operation hat das Löschen eines Datensatzes rückgängig gemacht.
adRsnUndoUpdate | 4 | Eine Operation hat das Aktualisieren eines Datensatzes rückgängig gemacht.
adRsnUpdate | 3 | Eine Operation hat einen vorhandenen Datensatz aktualisiert.

ADO/WFC-Äquivalent

Paket: com.ms.wfc.data

Konstante
AdoEnums.EventReason.ADDNEW
AdoEnums.EventReason.CLOSE
AdoEnums.EventReason.DELETE
AdoEnums.EventReason.FIRSTCHANGE
AdoEnums.EventReason.MOVE
AdoEnums.EventReason.MOVEFIRST
AdoEnums.EventReason.MOVELAST
AdoEnums.EventReason.MOVENEXT
AdoEnums.EventReason.MOVEPREVIOUS
AdoEnums.EventReason.REQUERY
AdoEnums.EventReason.RESYNCH
AdoEnums.EventReason.UNDOADDNEW
AdoEnums.EventReason.UNDODELETE
AdoEnums.EventReason.UNDOUPDATE
AdoEnums.EventReason.UPDATE


EventStatusEnum

Gibt den aktuellen Status der Ausführung eines Ereignisses an.

Konstante | Wert | Beschreibung
adStatusCancel | 4 | Fordet den Abbruch der Operation, die das Auftreten des Ereignisses ausgelöst hat.
adStatusCantDeny | 3 | Zeigt an, dass die Operation nicht das Abbrechen der anstehenden Operation fordern kann.
adStatusErrorsOccurred | 2 | Zeigt an, dass die Operation, die das Ereignis ausgelöst hat, aufgrund eines oder mehrerer Fehler fehlgeschlagen ist.
adStatusOK | 1 | Zeigt an, dass die Operation, die das Ereignis ausgelöst hat, erfolgreich war.
adStatusUnwantedEvent | 5 | Verhindert weitere Benachrichtigungen, bevor die Ausführung der Ereignismethode beendet wurde.

ADO/WFC-Äquivalent

Paket: com.ms.wfc.data

Konstante
AdoEnums.EventStatus.CANCEL
AdoEnums.EventStatus.CANTDENY
AdoEnums.EventStatus.ERRORSOCCURRED
AdoEnums.EventStatus.OK
AdoEnums.EventStatus.UNWANTEDEVENT


ExecuteOptionEnum

Gibt an, wie ein Provider einen Befehl ausführen soll.

Konstante | Wert | Beschreibung
adAsyncExecute | 0x10 | Zeigt an, dass der Befehl asynchron ausgeführt werden sollte.
adAsyncFetch | 0x20 | Zeigt an, dass die nach der in der CacheSize-Eigenschaft angegebenen Anfangsmenge verbleibenden Zeilen asynchron abgerufen werden sollen.
adAsyncFetchNonBlocking 0x40 Zeigt an, dass der Hauptthread während des Abrufs nie blockiert ist. Wenn die angeforderte Zeile nicht abgerufen worden ist, wird die aktuelle Zeile automatisch ans Ende der Datei verschoben.

Wenn Sie ein Recordset aus einem Stream öffnen, der ein dauerhaft gespeichertes Recordset enthält, hat adAsyncFetchNonBlocking keine Wirkung. Die Operation wird synchron ausgeführt und blockiert.

adAsynchFetchNonBlocking hat keine Wirkung, wenn das Recordset mithilfe der Option adCmdTableDirect geöffnet wurde.
adExecuteNoRecords 0x80 Zeigt an, dass es sich beim Befehlstext um einen Befehl oder eine gespeicherte Prozedur handelt, der bzw. die keine Zeilen zurückgibt (z. B. ein Befehl, der nur Daten einfügt). Werden Zeilen abgerufen, so werden diese verworfen und nicht zurückgegeben. Wird immer mit den CommandTypeEnum-Werten adCmdText oder adCmdStoredProc kombiniert.

adExecuteNoRecords kann nur als optionaler Parameter an die Command-Methode oder die Connection Execute-Methode übertragen werden. Wird es als Argument mit dem Command-Objekt verwendet, generiert die CommandType-Eigenschaft einen Fehler.
adOptionUnspecified | -1 | Zeigt an, dass der Befehl nicht angegeben ist.

ADO/WFC-Äquivalent

Paket: com.ms.wfc.data

Konstante
AdoEnums.ExecuteOption.ASYNCEXECUTE
AdoEnums.ExecuteOption.ASYNCFETCH
AdoEnums.ExecuteOption.ASYNCFETCHNONBLOCKING
AdoEnums.ExecuteOption.NORECORDS
AdoEnums.ExecuteOption.UNSPECIFIED


FieldEnum

Gibt die speziellen Felder an, auf die in einer Fields-Auflistung eines Record-Objekts Bezug genommen wird.

Hinweise

Diese Konstanten stellen eine "Abkürzung" für den Zugriff auf spezielle Felder bereit, die mit einem Record verknüpft sind. Rufen Sie das Field-Objekt von der Fields-Auflistung ab, und gewinnen Sie anschließend seine Inhalte mithilfe der Value-Eigenschaft des Field-Objekts.

Konstante | Wert | Beschreibung
adDefaultStream | -1 | Verweist auf das Feld, das das mit einem Record verknüpfte Stream-Standardobjekt enthält.
adRecordURL | -2 | Verweist auf das Feld, das die absolute URL-Zeichenfolge für das aktuelle Record enthält.


FieldAttributeEnum

Gibt ein oder mehrere Attribute eines Field-Objekts an.

Konstante | Wert | Beschreibung
adFldCacheDeferred | 0x1000 | Zeigt an, dass der Provider Feldwerte zwischenspeichert und weitere Lesevorgänge aus dem Cache erfolgen.
adFldFixed | 0x10 | Zeigt an, dass das Feld Daten mit fester Länge enthält.
adFldIsChapter | 0x2000 | Zeigt an, dass das Feld einen Chapter-Wert enthält, der ein bestimmtes untergeordnetes Recordset in Bezug zu diesem übergeordneten Feld angibt. Normalerweise werden Chapter-Felder zusammen mit der Datenstrukturierung oder mit Filtern verwendet.
adFldIsCollection | 0x40000 | Zeigt an, dass im Feld angegeben wird, dass die vom Datensatz dargestellte Ressource eine Auflistung weiterer Ressourcen (wie z. B. ein Ordner) und keine einfache Ressource (wie z. B. eine Textdatei) ist.
adFldIsDefaultStream | 0x20000 | Zeigt an, dass das Feld den Standarddatenstrom für die durch den Datensatz dargestellte Ressource enthält. Der Standarddatenstrom kann z. B. der HTML-Inhalt eines Stammordners in einer Website sein, der beim Angeben des Stamm-URLs automatisch aufgerufen wird.
adFldIsNullable | 0x20 | Zeigt an, dass das Feld Null-Werte akzeptiert.
adFldIsRowURL | 0x10000 | Zeigt an, dass das Feld den URL enthält, der die Ressource des durch den Datensatz dargestellten Datenspeichers benennt.
adFldKeyColumn | 0x8000 | Zeigt an, dass es sich bei dem Feld um den Primärschlüssel des zugrunde liegende Rowsets handelt. Kann außerdem anzeigen, dass das Feld Teil eines zusammengesetzten Primärschlüssels ist.
adFldLong | 0x80 | Zeigt an, dass es sich bei dem Feld um ein Binärfeld vom Datentyp Long handelt. Zeigt außerdem an, dass Sie die Methoden AppendChunk und GetChunk verwenden können.
adFldMayBeNull | 0x40 | Zeigt an, dass Sie Null-Werte aus dem Feld lesen können.
adFldMayDefer | 0x2 | Zeigt an, dass das Feld zurückgestellt ist, d. h., die Feldwerte werden nicht mit dem gesamten Datensatz aus der Datenquelle abgerufen, es sei denn, Sie greifen explizit darauf zu.
adFldNegativeScale | 0x4000 | Zeigt an, dass das Feld einen numerischen Wert aus einer Spalte darstellt, die negative Skalierungswerte unterstützt. Die Skalierung wird durch die NumericScale-Eigenschaft angegeben.
adFldRowID | 0x100 | Zeigt an, dass das Feld einen dauerhaften Zeilenbezeichner enthält, auf den nicht geschrieben werden kann und dessen einzige Aufgabe im Erkennen der Zeile besteht (wie z. B. eine Datensatznummer, einen eindeutigen Bezeichner usw.).
adFldRowVersion | 0x200 | Zeigt an, dass das Feld eine Art von Zeit- oder Datumsstempel enthält, mit dem Aktualisierungen nachverfolgt werden.
adFldUnknownUpdatable | 0x8 | Zeigt an, dass der Provider nicht bestimmen kann, ob Sie in das Feld schreiben können.
adFldUnspecified | -1 | Zeigt an, dass der Provider die Feldattribute nicht angibt.
adFldUpdatable | 0x4 | Zeigt an, dass Sie in das Feld schreiben können.

ADO/WFC-Äquivalent

Paket: com.ms.wfc.data

Konstante
AdoEnums.FieldAttribute.CACHEDEFERRED
AdoEnums.FieldAttribute.FIXED
AdoEnums.FieldAttribute.ISNULLABLE
AdoEnums.FieldAttribute.KEYCOLUMN
AdoEnums.FieldAttribute.LONG
AdoEnums.FieldAttribute.MAYBENULL
AdoEnums.FieldAttribute.MAYDEFER
AdoEnums.FieldAttribute.NEGATIVESCALE
AdoEnums.FieldAttribute.ROWID
AdoEnums.FieldAttribute.ROWVERSION
AdoEnums.FieldAttribute.UNKNOWNUPDATABLE
AdoEnums.FieldAttribute.UNSPECIFIED
AdoEnums.FieldAttribute.UPDATABLE


FieldStatusEnum

Gibt den Status eines Field-Objekts an.

Die adFieldPending*-Werte zeigen die Operation an, durch die der Status festgelegt wurde. Diese Werte können mit anderen Statuswerten kombiniert werden.

Konstante | Wert | Beschreibung
adFieldAlreadyExists | 26 | Zeigt an, dass das angegebene Feld bereits vorhanden ist.
adFieldBadStatus | 12 | Zeigt an, dass ein ungültiger Statuswert von ADO an den OLE DB-Provider gesendet wurde. Mögliche Ursachen sind z. B. ein OLE DB 1.0- oder OLE DB 1.1-Provider oder eine ungültige Kombination aus Value und Status.
adFieldCannotComplete | 20 | Zeigt an, dass der Server des von Source angegebenen URLs die Operation nicht abschließen konnte.
adFieldCannotDeleteSource | 23 | Zeigt an, dass eine Struktur oder eine Substruktur während einer Verschiebeoperation an einen neuen Speicherort verschoben wurden, die Quelle jedoch nicht gelöscht werden konnte.
adFieldCantConvertValue | 2 | Zeigt an, dass das Feld nicht ohne Datenverlust abgerufen oder gespeichert werden kann.
adFieldCantCreate | 7 | Zeigt an, dass das Feld nicht hinzugefügt werden konnte, da der Provider eine Begrenzung überschritten hat (z. B. die Anzahl der zulässigen Felder).
adFieldDataOverflow | 6 | Zeigt an, dass die vom Provider zurückgegebenen Daten zu einem Überlauf für den Datentyp des Feldes geführt haben.
adFieldDefault | 13 | Zeigt an, dass beim Festlegen der Daten der Standardwert für das Feld verwendet wurde.
adFieldDoesNotExist | 16 | Zeigt an, dass das angegebene Feld nicht vorhanden ist.
adFieldIgnore | 15 | Zeigt an, dass dieses Feld beim Festlegen der Datenwerte in der Quelle übersprungen wurde. Vom Provider wurde kein Wert festgelegt.
adFieldIntegrityViolation | 10 | Zeigt an, dass das Feld nicht geändert werden kann, da es sich um eine berechnetes oder abgeleitetes Element handelt.
adFieldInvalidURL | 17 | Zeigt an, dass im URL der Datenquelle ungültige Zeichen enthalten sind.
adFieldIsNull | 3 | Zeigt an, dass der Provider einen Null-Wert zurückgegeben hat.
adFieldOK | 0 | Standard. Zeigt an, dass das Feld erfolgreich hinzugefügt oder gelöscht wurde.
adFieldOutOfSpace | 22 | Zeigt an, dass dem Provider nicht genügend Speicherplatz zur Verfügung steht, um eine Verschiebe- oder Kopieroperation abzuschließen.
adFieldPendingChange | 0x40000 | Zeigt entweder an, dass das Feld gelöscht wurde und dann möglicherweise mit einem anderen Datentyp wieder hinzugefügt wurde, oder dass der Wert des Feldes geändert wurde, das vorher den Status adFieldOK hatte. Die endgültige Form des Feldes ändert die Fields-Auflistung, nachdem die Update-Methode aufgerufen wurde.
adFieldPendingDelete | 0x20000 | Zeigt an, dass durch die Delete-Operation der Status festgelegt wurde. Das Feld wurde zum Löschen aus der Fields-Auflistung markiert, nachdem die Update-Methode aufgerufen wurde.
adFieldPendingInsert | 0x10000 | Zeigt an, dass durch die Append-Operation der Status festgelegt wurde. Das Feld wurde zum Hinzufügen zur Fields-Auflistung markiert, nachdem die Update-Methode aufgerufen wurde.
adFieldPendingUnknown | 0x80000 | Zeigt an, dass der Provider nicht bestimmen kann, durch welche Operation der Feldstatus festgelegt wurde.
adFieldPendingUnknownDelete | 0x100000 | Zeigt an, dass der Provider nicht bestimmen kann, durch welche Operation der Feldstatus festgelegt wurde, und dass das Feld aus der Fields-Auflistung gelöscht wird, nachdem die Update-Methode aufgerufen wurde.
adFieldPermissionDenied | 9 | Zeigt an, dass das Feld nicht geändert werden kann, da es als schreibgeschützt definiert wurde.
adFieldReadOnly | 24 | Zeigt an, dass das Feld in der Datenquelle als schreibgeschützt definiert wurde.
adFieldResourceExists | 19 | Zeigt an, dass der Provider die Operation nicht ausführen konnte, da am Ziel-URL bereits ein Objekt vorhanden ist, das nicht überschrieben werden kann.
adFieldResourceLocked | 18 | Zeigt an, dass der Provider die Operation nicht ausführen konnte, da die Datenquelle durch eine oder mehrere andere Anwendungen oder Prozesse gesperrt ist.
adFieldResourceOutOfScope | 25 | Zeigt an, dass ein Ursprungs- oder Ziel-URL außerhalb des Bereichs des aktuellen Datensatzes liegt.
adFieldSchemaViolation | 11 | Zeigt an, dass der Wert die Datenquellenschema-Einschränkungen für das Feld verletzt hat.
adFieldSignMismatch | 5 | Zeigt an, dass der vom Provider zurückgegebene Datenwert ein Vorzeichen besitzt, der Datentyp des ADO-Feldwertes jedoch keines.
adFieldTruncated | 4 | Zeigt an, dass die Daten für die Variablenlängen beim Lesen von der Datenquelle abgeschnitten wurden.
adFieldUnavailable | 8 | Zeigt an, dass der Provider beim Lesen von der Datenquelle den Wert nicht bestimmen konnte. So wurde z. B. die Zeile gerade angelegt, der Standardwert für die Spalte war nicht verfügbar, und ein neuer Wert wurde noch nicht angegeben.
adFieldVolumeNotFound | 21 | Zeigt an, dass der Provider die Position des vom URL angezeigten Speichervolumens nicht ermitteln konnte.

ADO/WFC-Äquivalent

Diese Konstanten besitzen keine ADO/WFC-Äquivalente.


FilterGroupEnum

Gibt die Gruppe von Datensätzen an, die aus einem Recordset zu filtern sind.

Konstante | Wert | Beschreibung
adFilterAffectedRecords | 2 | Filtert nur die Datensätze zur Anzeige, die von dem letzten Delete-, Resync-, UpdateBatch- oder CancelBatch-Aufruf betroffen sind.
adFilterConflictingRecords | 5 | Filtert nur die Datensätze zur Anzeige, die die letzte Stapelaktualisierung nicht erfolgreich abgeschlossen haben.
adFilterFetchedRecords | 3 | Filtert nur die Datensätze im aktuellen Cache zur Anzeige, d. h. die Ergebnisse des letzten Aufrufs zum Abrufen von Datensätzen aus der Datenbank.
adFilterNone | 0 | Entfernt den aktuellen Filter und stellt alle Datensätze für die Anzeige wieder her.
adFilterPendingRecords | 1 | Filtert nur die Datensätze zur Anzeige, die sich geändert haben, aber noch nicht an den Server gesendet wurden. Nur für den Stapelaktualisierungsmodus anwendbar.

ADO/WFC-Äquivalent

Paket: com.ms.wfc.data

Konstante
AdoEnums.FilterGroup.AFFECTEDRECORDS
AdoEnums.FilterGroup.CONFLICTINGRECORDS
AdoEnums.FilterGroup.FETCHEDRECORDS
AdoEnums.FilterGroup.NONE
AdoEnums.FilterGroup.PENDINGRECORDS


GetRowsOptionEnum

Gibt an, wie viele Datensätze aus einem Recordset abzurufen sind.

Konstante | Wert | Beschreibung
adGetRowsRest | -1 | Ruft den Rest der Datensätze im Recordset ab, entweder von der aktuellen Position oder von einem Lesezeichen, das vom Parameter Start der GetRows-Methode angegeben wird.

ADO/WFC-Äquivalent

Paket: com.ms.wfc.data

Konstante
AdoEnums.GetRowsOption.REST


IsolationLevelEnum

Gibt die Stufe der Transaktionsisolation für ein Connection-Objekt an.

Konstante | Wert | Beschreibung
adXactUnspecified | -1 | Zeigt an, dass der Provider eine andere Isolationsstufe als angegeben verwendet, diese Stufe jedoch nicht bestimmt werden kann.
adXactChaos | 16 | Zeigt an, dass anstehende Änderungen durch Transaktionen einer höheren Isolationsstufe nicht überschrieben werden können.
adXactBrowse | 256 | Zeigt an, dass Sie in einer Transaktion die nicht übernommenen Änderungen aus anderen Transaktionen anzeigen können.
adXactReadUncommitted | 256 | Entspricht adXactBrowse.
adXactCursorStability | 4096 | Zeigt an, dass Sie in einer Transaktion Änderungen aus anderen Transaktionen nur anzeigen können, nachdem diese übernommen wurden.
adXactReadCommitted | 4096 | Entspricht adXactCursorStability.
adXactRepeatableRead | 65536 | Zeigt an, dass Sie in einer Transaktion keine Änderungen einsehen können, die in anderen Transaktionen vorgenommen wurden. Das erneute Abfragen kann jedoch neue Recordset-Objekte liefern.
adXactIsolated | 1048576 | Zeigt an, dass Transaktionen isoliert von anderen Transaktionen durchgeführt werden.
adXactSerializable | 1048576 | Entspricht adXactIsolated.

ADO/WFC-Äquivalent

Paket: com.ms.wfc.data

Konstante
AdoEnums.IsolationLevel.UNSPECIFIED
AdoEnums.IsolationLevel.CHAOS
AdoEnums.IsolationLevel.BROWSE
AdoEnums.IsolationLevel.READUNCOMMITTED
AdoEnums.IsolationLevel.CURSORSTABILITY
AdoEnums.IsolationLevel.READCOMMITTED
AdoEnums.IsolationLevel.REPEATABLEREAD
AdoEnums.IsolationLevel.ISOLATED
AdoEnums.IsolationLevel.SERIALIZABLE


LineSeparatorsEnum

Gibt das Zeichen an, das als Zeilentrennzeichen in Stream-Textobjekten verwendet wird.

Konstante | Wert | Beschreibung
adCR | 13 | Zeigt einen Wagenrücklauf an.
adCRLF | -1 | Standard. Zeigt einen Wagenrücklauf als Zeilenvorschub an.
adLF | 10 | Zeigt einen Zeilenvorschub an.

ADO/WFC-Äquivalent

Diese Konstanten besitzen keine ADO/WFC-Äquivalente.


LockTypeEnum

Gibt die Art der Sperre an, die während des Bearbeitens auf Datensätze gelegt wird.

Konstante | Wert | Beschreibung
adLockBatchOptimistic | 4 | Zeigt Stapelaktualisierungen mit teilweisen Sperren an. Dies ist für den Stapelaktualisierungsmodus erforderlich.
adLockOptimistic | 3 | Zeigt die Verwendung von teilweisen Sperren an, Datensatz für Datensatz. Der Provider verwendet teilweise Sperren, bei denen Datensätze nur gesperrt werden, wenn Sie die Update-Methode aufrufen.
adLockPessimistic | 2 | Zeigt die Verwendung von vollständigen Sperren an, Datensatz für Datensatz. Der Provider führt die notwendigen Schritte aus, um das erfolgreiche Bearbeiten der Datensätze sicherzustellen, üblicherweise, indem er Datensätze in der Datenquelle sofort nach dem Bearbeiten sperrt.
adLockReadOnly | 1 | Zeigt schreibgeschützte Datensätze an. Sie können die Daten nicht ändern.
adLockUnspecified | -1 | Gibt keine Art der Sperre an. Bei Duplikaten wird das Duplikat mit der gleichen Art der Sperre wie das Original erstellt.

ADO/WFC-Äquivalent

Paket: com.ms.wfc.data

Konstante
AdoEnums.LockType.BATCHOPTIMISTIC
AdoEnums.LockType.OPTIMISTIC
AdoEnums.LockType.PESSIMISTIC
AdoEnums.LockType.READONLY
AdoEnums.LockType.UNSPECIFIED


MarshalOptionsEnum

Gibt an, welche Datensätze an den Server zurückgegeben werden sollen.

Konstante | Wert | Beschreibung
adMarshalAll | 0 | Standard. Gibt alle Zeilen an den Server zurück.
adMarshalModifiedOnly | 1 | Gibt nur geänderte Zeilen an den Server zurück.

ADO/WFC-Äquivalent

Paket: com.ms.wfc.data

Konstante
AdoEnums.MarshalOptions.ALL
AdoEnums.MarshalOptions.MODIFIEDONLY


MoveRecordOptionsEnum

Gibt das Verhalten der MoveRecord-Methode des Record-Objekts an.

Konstante | Wert | Beschreibung
adMoveUnspecified | -1 | Standard. Führt die Standardverschiebeoperation aus: Die Operation schlägt fehl, wenn die Zieldatei oder das Zielverzeichnis bereits vorhanden sind und durch die Operation Hypertextlinks aktualisiert werden.
adMoveOverWrite | 1 | Überschreibt die Zieldatei oder das Zielverzeichnis, sogar wenn sie bereits vorhanden sind.
adMoveDontUpdateLinks | 2 | Ändert das Standardverhalten der MoveRecord-Methode, indem die Hypertextlinks der Quelle Record nicht aktualisiert werden. Das Standardverhalten hängt von den Fähigkeiten des Providers ab. Durch eine Verschiebeoperation werden Links aktualisiert, falls der Provider dazu in der Lage ist. Falls der Provider keine Links festsetzen kann oder wenn der Wert nicht angegeben wurde, wird die Verschiebung auch dann erfolgreich ausgeführt, wenn Links nicht festgesetzt wurden.
adMoveAllowEmulation | 4 | Fordert, dass der Provider versucht, die Verschiebung zu simulieren (durch Operationen wie das Downloaden, Uploaden und Löschen). Falls der Versuch, das Record zu verschieben, fehlschlägt, da sich der Ziel-URL auf einem anderen Server befindet oder von einem anderen Provider als der Quelle bedient wird, kann dies aufgrund unterschiedlicher Fähigkeiten der Provider beim Verschieben von Ressourcen zwischen Providern zu einer größeren Wartezeit oder zu Datenverlust führen.

ADO/WFC-Äquivalent

Diese Konstanten besitzen keine ADO/WFC-Äquivalente.


ObjectStateEnum

Gibt an, ob ein Objekt geöffnet oder geschlossen ist, sich mit einer Datenquelle verbindet, einen Befehl ausführt oder Daten abruft.

Konstante | Wert | Beschreibung
adStateClosed | 0 | Zeigt an, dass das Objekt geschlossen ist.
adStateOpen | 1 | Zeigt an, dass das Objekt geöffnet ist.
adStateConnecting | 2 | Zeigt an, dass sich das Objekt verbindet.
adStateExecuting | 4 | Zeigt an, dass das Objekt einen Befehl ausführt.
adStateFetching | 8 | Zeigt an, dass die Zeilen des Objekts abgerufen werden.

ADO/WFC-Äquivalent

Paket: com.ms.wfc.data

Konstante
AdoEnums.ObjectState.CLOSED
AdoEnums.ObjectState.OPEN
AdoEnums.ObjectState.CONNECTING
AdoEnums.ObjectState.EXECUTING
AdoEnums.ObjectState.FETCHING


ParameterAttributesEnum

Gibt die Attribute eines Parameter–Objekts an.

Konstante | Wert | Beschreibung
adParamSigned | 16 | Zeigt an, dass der Parameter Werte mit Vorzeichen akzeptiert.
adParamNullable | 64 | Zeigt an, dass der Parameter Null-Werte akzeptiert.
adParamLong | 128 | Zeigt an, dass der Parameter Binärdaten vom Wert Long akzeptiert.

ADO/WFC-Äquivalent

Paket: com.ms.wfc.data

Konstante
AdoEnums.ParameterAttributes.SIGNED
AdoEnums.ParameterAttributes.NULLABLE
AdoEnums.ParameterAttributes.LONG


ParameterDirectionEnum

Gibt an, ob der Parameter einen Eingabeparameter, einen Ausgabeparameter oder beides darstellt bzw. ob es sich bei dem Parameter um den Rückgabewert einer gespeicherten Prozedur handelt.

Konstante | Wert | Beschreibung
adParamInput | 1 | Standard. Zeigt an, dass der Parameter einen Eingabeparameter darstellt.
adParamInputOutput | 3 | Zeigt an, dass der Parameter sowohl einen Eingabe- als auch einen Ausgabeparameter darstellt.
adParamOutput | 2 | Zeigt an, dass der Parameter einen Ausgabeparameter darstellt.
adParamReturnValue | 4 | Zeigt an, dass der Parameter einen Rückgabewert darstellt.
adParamUnknown | 0 | Zeigt an, dass die Parameterrichtung unbekannt ist.

ADO/WFC-Äquivalent

Paket: com.ms.wfc.data

Konstante
AdoEnums.ParameterDirection.INPUT
AdoEnums.ParameterDirection.INPUTOUTPUT
AdoEnums.ParameterDirection.OUTPUT
AdoEnums.ParameterDirection.RETURNVALUE
AdoEnums.ParameterDirection.UNKNOWN


PersistFormatEnum

Gibt das Format an, in dem ein Recordset–Objekt gespeichert wird.

Konstante | Wert | Beschreibung
adPersistADTG | 0 | Zeigt das Microsoft Advanced Data TableGram-Format (ADTG) an.
adPersistXML | 1 | Zeigt das Extensible Markup Language-Format (XML) an.

ADO/WFC-Äquivalent

Paket: com.ms.wfc.data

Konstante
AdoEnums.PersistFormat.ADTG
AdoEnums.PersistFormat.XML


PositionEnum

Gibt die aktuelle Position des Datensatzzeigers in einem Recordset-Objekt an.

Konstante | Wert | Beschreibung
adPosBOF | -2 | Zeigt an, dass der aktuelle Datensatzzeiger sich bei BOF befindet (d. h., die BOF-Eigenschaft besitzt den Wert True).
adPosEOF | -3 | Zeigt an, dass der aktuelle Datensatzzeiger sich bei EOF befindet (d. h., die EOF-Eigenschaft besitzt den Wert True).
adPosUnknown | -1 | Zeigt entweder an, dass das Recordset-Objekt leer oder die aktuelle Position unbekannt ist oder dass der Provider die AbsolutePage- oder AbsolutePosition-Eigenschaft nicht unterstützt.

ADO/WFC-Äquivalent

Paket: com.ms.wfc.data

Konstante
AdoEnums.Position.BOF
AdoEnums.Position.EOF
AdoEnums.Position.UNKNOWN


PropertyAttributesEnum

Gibt die Attribute eines Property–Objekts an.

Konstante | Wert | Beschreibung
adPropNotSupported | 0 | Zeigt an, dass die Eigenschaft vom Provider nicht unterstützt wird.
adPropRequired | 1 | Zeigt an, dass der Benutzer einen Wert für diese Eigenschaft angeben muss, bevor die Datenquelle initialisiert wird.
adPropOptional | 2 | Zeigt an, dass der Benutzer keinen Wert für diese Eigenschaft angeben muss, bevor die Datenquelle initialisiert wird.
adPropRead | 512 | Zeigt an, dass der Benutzer die Eigenschaft lesen kann.
adPropWrite | 1024 | Zeigt an, dass der Benutzer die Eigenschaft festlegen kann.

ADO/WFC-Äquivalent

Paket: com.ms.wfc.data

Konstante
AdoEnums.PropertyAttributes.NOTSUPPORTED
AdoEnums.PropertyAttributes.REQUIRED
AdoEnums.PropertyAttributes.OPTIONAL
AdoEnums.PropertyAttributes.READ
AdoEnums.PropertyAttributes.WRITE


RecordCreateOptionsEnum

Gibt an, ob für die Open–Methode des Record–Objekts ein bestehendes Record–Objekt geöffnet oder ein neues Record-Objekt erstellt werden soll. Die Werte können mit einem AND-Operator kombiniert werden.

Konstante | Wert | Beschreibung
adCreateCollection | 0x2000 | Erstellt ein neues Record-Objekt am durch den Parameter Source angegebenen Knoten, anstatt ein bestehendes Record-Objekt zu öffnen. Zeigt die Quelle auf einen bestehenden Knoten, dann tritt ein Laufzeitfehler auf. Es sei denn, adCreateCollection wird mit adOpenIfExists oder adCreateOverwrite kombiniert.
adCreateNonCollection | 0 | Erstellt ein neues Record-Objekt vom Datentyp adSimpleRecord
adCreateOverwrite | 0x4000000 | Ändert die Erstellungsflags adCreateCollection, adCreateNonCollection und adCreateStructDoc. Wurde OR mit diesem Wert und einem der Erstellungsflagwerte verwendet und zeigt der Quell-URL auf einen vorhandenen Knoten oder ein Record-Objekt, wird das vorhandene Record-Objekt überschrieben und ein neues an seiner Stelle erstellt. Dieser Wert kann nicht zusammen mit adOpenIfExists verwendet werden.
adCreateStructDoc | 0x80000000 | Erstellt ein neues Record-Objekt vom Datentyp adStructDoc, anstatt ein vorhandenes Record-Objekt zu öffnen.
adFailIfNotExists | -1 | Standard. Führt zu einem Laufzeitfehler, wenn Source auf einen nicht existierenden Knoten zeigt.
adOpenIfExists | 0x2000000 | Ändert die Erstellungsflags adCreateCollection, adCreateNonCollection und adCreateStructDoc. Wurde OR mit diesem Wert und einem der Erstellungsflagwerte verwendet und zeigt der Quell-URL auf einen vorhandenen Knoten oder ein Record-Objekt, muss der Provider das vorhandene Record-Objekt öffnen, anstatt ein neues zu erstellen. Dieser Wert kann nicht zusammen mit adCreateOverwrite verwendet werden.

ADO/WFC-Äquivalent

Diese Konstanten besitzen keine ADO/WFC-Äquivalente.


RecordOpenOptionsEnum

Gibt Optionen zum Öffnen eines Record–Objekts an. Diese Werte können mithilfe der OR-Verknüpfung kombiniert werden.

Konstante | Wert | Beschreibung
adDelayFetchFields | 0x8000 | Zeigt dem Provider an, dass die dem Record-Objekt zugeordneten Felder zunächst nicht abgerufen werden müssen, aber beim ersten Versuch, auf das Feld zuzugreifen, abgerufen werden können. Das durch das Fehlen dieses Flags angezeigte Standardverhalten ruft alle Felder des Record-Objekts ab.
adDelayFetchStream | 0x4000 | Zeigt dem Provider an, dass der dem Record-Objekt zugeordnete Standardstrom zunächst nicht abgerufen werden muss. Das durch das Fehlen dieses Flags angezeigte Standardverhalten ruft den dem Record-Objekt zugeordneten Standarddatenstrom ab.
adOpenAsync | 0x1000 | Zeigt an, dass das Record-Objekt im asynchronen Modus geöffnet wurde.
adOpenRecordUnspecified | -1 | Standard. Zeigt an, dass keine Optionen angegeben sind.
adOpenSource | 0x800000 | Wenn die Quelle auf einen Knoten zeigt, der ein ausführbares Skript enthält (z. B. eine ASP-Seite), wird ein die Quelle enthaltendes Record-Objekt geöffnet und nicht der ausgeführte Inhalt. Dieser Wert ist nur mit nicht aufgelisteten Datensätzen gültig.

ADO/WFC-Äquivalent

Diese Konstanten besitzen keine ADO/WFC-Äquivalente.


RecordStatusEnum

Gibt den Status eines Datensatzes in Bezug auf Stapelaktualisierungen oder andere umfangreiche Vorgänge an.

Konstante | Wert | Beschreibung
adRecCanceled | 0x100 | Zeigt an, dass der Datensatz nicht gespeichert wurde, da die Operation abgebrochen wurde.
adRecCantRelease | 0x400 | Zeigt an, dass der neue Datensatz nicht gespeichert wurde, da der vorhandene Datensatz gesperrt wurde.
adRecConcurrencyViolation | 0x800 | Zeigt an, dass der Datensatz nicht gespeichert wurde, da vollständige Parallelität verwendet wurde.
adRecDBDeleted | 0x40000 | Zeigt an, dass der Datensatz bereits aus der Datenquelle gelöscht wurde.
adRecDeleted | 0x4 | Zeigt an, dass der Datensatz gelöscht wurde.
adRecIntegrityViolation | 0x1000 | Zeigt an, dass der Datensatz nicht gespeichert wurde, da vom Benutzer Integritätseinschränkungen verletzt wurden.
adRecInvalid | 0x10 | Zeigt an, dass der Datensatz nicht gespeichert wurde, da das entsprechende Lesezeichen ungültig ist.
adRecMaxChangesExceeded | 0x2000 | Zeigt an, dass der Datensatz nicht gespeichert wurde, da zu viele ausstehende Änderungen vorhanden waren.
adRecModified | 0x2 | Zeigt an, dass der Datensatz geändert wurde.
adRecMultipleChanges | 0x40 | Zeigt an, dass der Datensatz nicht gespeichert wurde, da dies mehrere Datensätze beeinflusst hätte.
adRecNew | 0x1 | Zeigt an, dass Datensatz neu ist.
adRecObjectOpen | 0x4000 | Zeigt an, dass der Datensatz nicht gespeichert wurde, da ein Konflikt mit einem geöffneten Speicherobjekt besteht.
adRecOK | 0 | Zeigt an, dass der Datensatz erfolgreich aktualisiert wurde.
adRecOutOfMemory | 0x8000 | Zeigt an, dass der Datensatz nicht gespeichert wurde, da nicht genügend Speicherplatz zur Verfügung steht.
adRecPendingChanges | 0x80 | Zeigt an, dass der Datensatz nicht gespeichert wurde, da er sich auf eine noch ausstehende Einfügung bezieht.
adRecPermissionDenied | 0x10000 | Zeigt an, dass der Datensatz nicht gespeichert wurde, da der Benutzer nicht über ausreichende Berechtigungen verfügt.
adRecSchemaViolation | 0x20000 | Zeigt an, dass der Datensatz nicht gespeichert wurde, da er die Struktur der zugrunde liegenden Datenbank verletzt.
adRecUnmodified | 0x8 | Zeigt an, dass der Datensatz nicht geändert wurde.

ADO/WFC-Äquivalent

AdoEnums.RecordStatus.

Paket: com.ms.wfc.data

Konstante
AdoEnums.RecordStatus.CANCELED
AdoEnums.RecordStatus.CANTRELEASE
AdoEnums.RecordStatus.CONCURRENCYVIOLATION
AdoEnums.RecordStatus.DBDELETED
AdoEnums.RecordStatus.DELETED
AdoEnums.RecordStatus.INTEGRITYVIOLATION
AdoEnums.RecordStatus.INVALID
AdoEnums.RecordStatus.MAXCHANGESEXCEEDED
AdoEnums.RecordStatus.MODIFIED
AdoEnums.RecordStatus.MULTIPLECHANGES
AdoEnums.RecordStatus.NEW
AdoEnums.RecordStatus.OBJECTOPEN
AdoEnums.RecordStatus.OK
AdoEnums.RecordStatus.OUTOFMEMORY
AdoEnums.RecordStatus.PENDINGCHANGES
AdoEnums.RecordStatus.PERMISSIONDENIED
AdoEnums.RecordStatus.SCHEMAVIOLATION
AdoEnums.RecordStatus.UNMODIFIED


RecordTypeEnum

Gibt den Typ des Record-Objekts an.

Konstante | Wert | Beschreibung
adSimpleRecord | 0 | Zeigt einen einfachen Datensatz an (enthält keine untergeordneten Knoten).
adCollectionRecord | 1 | Zeigt einen Auflistung von Datensätzen an (enthält untergeordnete Knoten).
adStructDoc | 2 | Zeigt eine spezielle Art der Auflistung der Datensätze an, die durch COM strukturierte Dokumente darstellt.

ADO/WFC-Äquivalent

Diese Konstanten besitzen keine ADO/WFC-Äquivalente.


ResyncEnum

Gibt an, ob zugrunde liegende Werte durch den Aufruf Resync überschrieben werden.

Konstante | Wert | Beschreibung
adResyncAllValues | 2 | Standard. Überschreibt Daten und bricht ausstehende Aktualisierungen ab.
adResyncUnderlyingValues | 1 | Überschreibt Daten nicht und bricht ausstehenden Aktualisierungen nicht ab.

ADO/WFC-Äquivalent

Paket: com.ms.wfc.data

Konstante
AdoEnums.Resync.ALLVALUES
AdoEnums.Resync.UNDERLYINGVALUES


SaveOptionsEnum

Gibt an, ob eine Datei beim Speichern aus einem Stream–Objekt erstellt oder überschrieben werden soll. Die Werte können mit einem AND-Operator kombiniert werden.

Konstante | Wert | Beschreibung
adSaveCreateNotExist | 1 | Standard. Erstellt eine neue Datei, wenn die durch den Parameter FileName angebene Datei noch nicht vorhanden ist.
adSaveCreateOverwrite | 4 | Überschreibt die Datei mit den Daten aus dem aktuell geöffneten Stream-Objekt, wenn die durch den Parameter FileName angegebene Datei bereits vorhanden ist.

ADO/WFC-Äquivalent

Diese Konstanten besitzen keine ADO/WFC-Äquivalente.


SchemaEnum

Gibt den Schematyp des Recordset-Objekts an, dass die OpenSchema–Methode abruft.

Hinweise

Zusätzliche Informationen zu den Funktionen und Spalten, die für die ADO-Konstanten zurückgegeben werden, finden Sie in den Themen von Anhang B in der OLE DB Programmer's Reference. Der Name jedes Themas wird in Klammern in der Spalte Beschreibung der folgenden Tabelle aufgeführt.

Zusätzliche Informationen zu den Funktionen und Spalten, die für die ADO MD-Konstanten zurückgegeben werden, finden Sie im Kapitel 22 von OLE DB für OLAP. Der Name jeder Überschrift wird in Klammern und mit einem Platzhalter (*) markiert in der Spalte Beschreibung der folgenden Tabelle aufgeführt.

Übersetzen Sie die Datentypen der Spalten in der OLE DB-Dokumentation in ADO-Datentypen mit Bezug auf die Spalte Beschreibung des ADO-Themas DataTypeEnum. Beispielsweise ist ein OLE DB-Datentyp von DBTYPE_WSTR äquivalent zu adWChar des ADO-Datentyps.

ADO generiert schematische Ergebnisse für die Konstanten adSchemaDBInfoKeywords und adSchemaDBInfoLiterals. ADO erstellt ein Recordset-Objekt und füllt dann jede Zeile mit den Werten aus, die durch die IDBInfo::GetKeywords- und IDBInfo::GetLiteralInfo–Methoden zurückgegeben wurden. Zusätzliche Informationen zu diesen Methoden finden Sie im Abschnitt IDBInfo im OLE DB Programmer's Reference.

Konstante | Wert | Beschreibung | Eingeschränkte Spalten
adSchemaAsserts | 0 | Gibt die im Katalog definierten Assertions zurück, die im Besitz eines gegebenen Benutzers sind. (ASSERTIONS-Rowset) | CONSTRAINT_CATALOG CONSTRAINT_SCHEMA CONSTRAINT_NAME
adSchemaCatalogs | 1 | Gibt die physikalische Attribute zurück, die den aus dem DBMS zugreifbaren Katalogen zugeordnet sind. (ASSERTIONS-Rowset) | CATALOG_NAME
adSchemaCharacterSets | 2 | Gibt die im Katalog definierten Zeichensätze zurück, auf die ein gegebener Benutzer zugreifen kann. (CHARACTER_SETS-Rowset) | CHARACTER_SET_CATALOG CHARACTER_SET_SCHEMA CHARACTER_SET_NAME
adSchemaCheckConstraints | 5 | Gibt die im Katalog definierten Prüfeinschränkungen zurück, die im Besitz eines gegebenen Benutzers sind. (CHECK_CONSTRAINTS-Rowset) | CONSTRAINT_CATALOG CONSTRAINT_SCHEMA CONSTRAINT_NAME
adSchemaCollations | 3 | Gibt die im Katalog definierten Zeichen-Sortierreihenfolgen zurück, auf die ein gegebener Benutzer zugreifen kann. (COLLATIONS-Rowset) | COLLATION_CATALOG COLLATION_SCHEMA COLLATION_NAME
adSchemaColumnPrivileges | 13 | Gibt die im Katalog definierten Berechtigungen auf Tabellenspalten zurück, die für einen gegebenen Benutzer verfügbar sind oder durch ihn erteilt werden. (COLUMN_PRIVILEGES-Rowset) | TABLE_CATALOG TABLE_SCHEMA TABLE_NAME COLUMN_NAME GRANTOR GRANTEE
adSchemaColumns | 4 | Gibt die im Katalog definierten Tabellenspalten (einschließlich Ansichten) zurück, auf die ein gegebener Benutzer zugreifen kann. (COLUMNS-Rowset) | TABLE_CATALOG TABLE_SCHEMA TABLE_NAME COLUMN_NAME
adSchemaColumnsDomainUsage | 11 | Gibt die im Katalog definierten Spalten zurück, die von einer im Katalog definierten Domäne abhängig und im Besitz eines gegebenen Benutzers sind. (COLUMN_DOMAIN_USAGE-Rowset) | DOMAIN_CATALOG DOMAIN_SCHEMA DOMAIN_NAME COLUMN_NAME
adSchemaConstraintColumnUsage | 6 | Gibt die im Katalog definierten Spalten zurück, die von referenziellen Einschränkungen, eindeutigen Einschränkungen, Prüfeinschränkungen und Assertions verwendet werden und im Besitz eines gegebenen Benutzers sind. (CONSTRAINT_COLUMN_USAGE-Rowset) | TABLE_CATALOG TABLE_SCHEMA TABLE_NAME COLUMN_NAME
adSchemaConstraintTableUsage | 7 | Gibt die im Katalog definierten Tabellen zurück, die von referenziellen Einschränkungen, eindeutigen Einschränkungen, Prüfeinschränkungen und Assertions verwendet werden und im Besitz eines gegebenen Benutzers sind. (CONSTRAINT_TABLE_USAGE-Rowset) | TABLE_CATALOG TABLE_SCHEMA TABLE_NAME
adSchemaCubes | 32 | Gibt Informationen über Cubes in einem Schema zurück (oder den Katalog, wenn der Provider Schemas nicht unterstützt). (CUBES-Rowset*) | CATALOG_NAME SCHEMA_NAME CUBE_NAME
adSchemaDBInfoKeywords | 30 | Gibt eine Liste providerspezifischer Schlüsselwörter zurück. (IDBInfo::GetKeywords *) | <None>
adSchemaDBInfoLiterals | 31 | Gibt eine Liste providerspezifischer Literalzeichen zurück, die in Textbefehlen verwendet werden. (IDBInfo::GetLiteralInfo *) | <None>
adSchemaDimensions | 33 | Gibt Informationen über die Dimensionen in einem gegebenen Cube zurück. Jede Dimension verfügt über eine Zeile. (DIMENSIONS-Rowset *) | CATALOG_NAME SCHEMA_NAME CUBE_NAME DIMENSION_NAME DIMENSION_UNIQUE_NAME
adSchemaForeignKeys | 27 | Gibt Spalten der Fremdschlüssel zurück, die im Katalog durch einen gegebenen Benutzer definiert sind. (FOREIGN_KEYS-Rowset) | PK_TABLE_CATALOG PK_TABLE_SCHEMA PK_TABLE_NAME FK_TABLE_CATALOG FK_TABLE_SCHEMA FK_TABLE_NAME
adSchemaHierarchies | 34 | Gibt Informationen über die in einer Dimension verfügbaren Hierarchien zurück. (HIERARCHIES-Rowset *) | CATALOG_NAME SCHEMA_NAME CUBE_NAME DIMENSION_UNIQUE_NAME HIERARCHY_NAME HIERARCHY_UNIQUE_NAME
adSchemaIndexes | 12 | Gibt die im Katalog definierten Indizes zurück, die im Besitz eines gegebenen Benutzers sind. (INDEXES-Rowset) | TABLE_CATALOG TABLE_SCHEMA INDEX_NAME TYPE TABLE_NAME
adSchemaKeyColumnUsage | 8 | Gibt die im Katalog definierten Spalten zurück, die als Schlüssel durch einen gegebenen Benutzer eingeschränkt werden. (KEY_COLUMN_USAGE-Rowset) | CONSTRAINT_CATALOG CONSTRAINT_SCHEMA CONSTRAINT_NAME TABLE_CATALOG TABLE_SCHEMA TABLE_NAME COLUMN_NAME
adSchemaLevels | 35 | Gibt Informationen über die in einer Dimension verfügbaren Ebenen zurück. (LEVELS-Rowset*) | CATALOG_NAME SCHEMA_NAME CUBE_NAME DIMENSION_UNIQUE_NAME HIERARCHY_UNIQUE_NAME LEVEL_NAME LEVEL_UNIQUE_NAME
adSchemaMeasures | 36 | Gibt Informationen über die verfügbaren Measures zurück. (MEASURES-Rowset *) | CATALOG_NAME SCHEMA_NAME CUBE_NAME MEASURE_NAME MEASURE_UNIQUE_NAME
adSchemaMembers | 38 | Gibt Informationen über die verfügbaren Elemente zurück. (MEMBERS-Rowset *) | CATALOG_NAME SCHEMA_NAME CUBE_NAME DIMENSION_UNIQUE_NAME HIERARCHY_UNIQUE_NAME LEVEL_UNIQUE_NAME LEVEL_NUMBER MEMBER_NAME MEMBER_UNIQUE_NAME MEMBER_CAPTION MEMBER_TYPE Baumoperator (Weitere Informationen finden Sie in der OLE DB for OLAP Programmer's Reference)
adSchemaPrimaryKeys | 28 | Gibt die Spalten der Primärschlüssel zurück, die im Katalog durch einen gegebenen Benutzer definiert werden. (PRIMARY_KEYS-Rowset) | PK_TABLE_CATALOG PK_TABLE_SCHEMA PK_TABLE_NAME
adSchemaProcedureColumns | 29 | Gibt Informationen über die von Prozeduren zurückgegeben Spalten von Rowsets zurück. (PROCEDURE_COLUMNS-Rowset) | PROCEDURE_CATALOG PROCEDURE_SCHEMA PROCEDURE_NAME COLUMN_NAME
adSchemaProcedureParameters | 26 | Gibt Informationen über die Parameter und die Rückgabecodes von Prozeduren zurück. (PROCEDURE_PARAMETERS-Rowset) | PROCEDURE_CATALOG PROCEDURE_SCHEMA PROCEDURE_NAME PARAMETER_NAME
adSchemaProcedures | 16 | Gibt die im Katalog definierten Prozeduren zurück, die im Besitz eines gegebenen Benutzers sind. (PROCEDURES-Rowset) | PROCEDURE_CATALOG PROCEDURE_SCHEMA PROCEDURE_NAME PROCEDURE_TYPE
adSchemaProperties | 37 | Gibt Informationen über die verfügbaren Eigenschaften für jede Ebene der Dimension zurück. (PROPERTIES-Rowset *) | CATALOG_NAME SCHEMA_NAME CUBE_NAME DIMENSION_UNIQUE_NAME HIERARCHY_UNIQUE_NAME LEVEL_UNIQUE_NAME MEMBER_UNIQUE_NAME PROPERTY_TYPE PROPERTY_NAME
adSchemaProviderSpecific | -1 | Wird verwendet, wenn der Provider seine eigenen, nicht standardisierten Schemaabfragen definiert. | <Provider specific>
adSchemaProviderTypes | 22 | Gibt die vom Datenprovider unterstützten Basisdatentypen zurück. (PROVIDER_TYPES-Rowset) | DATA_TYPE BEST_MATCH
adSchemaReferentialConstraints | 9 | Gibt die im Katalog definierten referenziellen Einschränkungen zurück, die im Besitz eines gegebenen Benutzers sind. (REFERENTIAL_CONSTRAINTS-Rowset) | CONSTRAINT_CATALOG CONSTRAINT_SCHEMA CONSTRAINT_NAME
adSchemaSchemata | 17 | Gibt die Schemas (Datenbankobjekte) zurück, die im Besitz eines gegebenen Benutzers sind. (SCHEMATA-Rowset) | CATALOG_NAME SCHEMA_NAME SCHEMA_OWNER
adSchemaSQLLanguages | 18 | Gibt die Übereinstimmungsebenen, Optionen und Dialekte zurück, die durch die im Katalog definierten Verarbeitungsdaten der SQL-Implementierung unterstützt werden. (SQL_LANGUAGES-Rowset) | <None>
adSchemaStatistics | 19 | Gibt die im Katalog definierten Statistiken zurück, die im Besitz eines gegebenen Benutzers sind. (STATISTICS-Rowset) | TABLE_CATALOG TABLE_SCHEMA TABLE_NAME
adSchemaTableConstraints | 10 | Gibt die im Katalog definierten Tabelleneinschränkungen zurück, die im Besitz eines gegebenen Benutzers sind. (TABLE_CONSTRAINTS-Rowset) | CONSTRAINT_CATALOG CONSTRAINT_SCHEMA CONSTRAINT_NAME TABLE_CATALOG TABLE_SCHEMA TABLE_NAME CONSTRAINT_TYPE
adSchemaTablePrivileges | 14 | Gibt die im Katalog definierten Berechtigungen für Tabellen zurück, die für einen gegebenen Benutzer verfügbar sind oder von ihm erteilt werden. (TABLE_PRIVILEGES-Rowset) | TABLE_CATALOG TABLE_SCHEMA TABLE_NAME GRANTOR GRANTEE
adSchemaTables | 20 | Gibt die im Katalog definierten Tabellen (einschließlich der Ansichten) zurück, die im Besitz eines gegebenen Benutzers sind. (TABLES-Rowset) | TABLE_CATALOG TABLE_SCHEMA TABLE_NAME TABLE_TYPE
adSchemaTranslations | 21 | Gibt die im Katalog definierten Zeichenübersetzungen zurück, auf die ein gegebenen Benutzer zugreifen kann. (TRANSLATIONS-Rowset) | TRANSLATION_CATALOG TRANSLATION_SCHEMA TRANSLATION_NAME
adSchemaTrustees | 39 | Reserviert für zukünftige Verwendung. |
adSchemaUsagePrivileges | 15 | Gibt die im Katalog definierten USAGE-Berechtigungen für Objekte zurück, auf die ein gegebener Benutzer zugreifen kann oder die von ihm erteilt werden. (USAGE_PRIVILEGES-Rowset) | OBJECT_CATALOG OBJECT_SCHEMA OBJECT_NAME OBJECT_TYPE GRANTOR GRANTEE
adSchemaViewColumnUsage | 24 | Gibt die Spalten zurück, von denen die im Katalog definierten angezeigten Tabellen abhängen, die im Besitz eines gegebenen Benutzers sind. (VIEW_COLUMN_USAGE-Rowset) | VIEW_CATALOG VIEW_SCHEMA VIEW_NAME
adSchemaViews | 23 | Gibt die im Katalog definierten Ansichten zurück, auf die ein gegebener Benutzer zugreifen kann. (VIEWS-Rowset) | TABLE_CATALOG TABLE_SCHEMA TABLE_NAME
adSchemaViewTableUsage | 25 | Gibt die Tabellen zurück, von denen die im Katalog definierten angezeigten Tabellen abhängen, die im Besitz eines gegebenen Benutzers sind. (VIEW_TABLE_USAGE-Rowset) | VIEW_CATALOG VIEW_SCHEMA VIEW_NAME

ADO/WFC-Äquivalent

Paket: com.ms.wfc.data

Konstante
AdoEnums.Schema.ASSERTS
AdoEnums.Schema.CATALOGS
AdoEnums.Schema.CHARACTERSETS
AdoEnums.Schema.CHECKCONSTRAINTS
AdoEnums.Schema.COLLATIONS
AdoEnums.Schema.COLUMNPRIVILEGES
AdoEnums.Schema.COLUMNS
AdoEnums.Schema.COLUMNSDOMAINUSAGE
AdoEnums.Schema.CONSTRAINTCOLUMNUSAGE
AdoEnums.Schema.CONSTRAINTTABLEUSAGE
AdoEnums.Schema.CUBES
AdoEnums.Schema.DBINFOKEYWORDS
AdoEnums.Schema.DBINFOLITERALS
AdoEnums.Schema.DIMENSIONS
AdoEnums.Schema.FOREIGNKEYS
AdoEnums.Schema.HIERARCHIES
AdoEnums.Schema.INDEXES
AdoEnums.Schema.KEYCOLUMNUSAGE
AdoEnums.Schema.LEVELS
AdoEnums.Schema.MEASURES
AdoEnums.Schema.MEMBERS
AdoEnums.Schema.PRIMARYKEYS
AdoEnums.Schema.PROCEDURECOLUMNS
AdoEnums.Schema.PROCEDUREPARAMETERS
AdoEnums.Schema.PROCEDURES
AdoEnums.Schema.PROPERTIES
AdoEnums.Schema.PROVIDERSPECIFIC
AdoEnums.Schema.PROVIDERTYPES
AdoEnums.Schema.REFERENTIALCONTRAINTS
AdoEnums.Schema.SCHEMATA
AdoEnums.Schema.SQLLANGUAGES
AdoEnums.Schema.STATISTICS
AdoEnums.Schema.TABLECONSTRAINTS
AdoEnums.Schema.TABLEPRIVILEGES
AdoEnums.Schema.TABLES
AdoEnums.Schema.TRANSLATIONS
AdoEnums.Schema.TRUSTEES
AdoEnums.Schema.USAGEPRIVILEGES
AdoEnums.Schema.VIEWCOLUMNUSAGE
AdoEnums.Schema.VIEWS
AdoEnums.Schema.VIEWTABLEUSAGE


SearchDirectionEnum

Gibt die Richtung einer Datensatzsuche innerhalb eines Recordset–Objekts an.

Konstante | Wert | Beschreibung
adSearchBackward | -1 | Sucht rückwärts und stoppt am Anfang des Recordset-Objekts. Wird keine Übereinstimmung gefunden, wird der Datensatzzeiger bei BOF positioniert.
adSearchForward | 1 | Sucht vorwärts und stoppt am Ende des Recordset-Objekts. Wird keine Übereinstimmung gefunden, wird der Datensatzzeiger bei EOF positioniert.

ADO/WFC-Äquivalent

Paket: com.ms.wfc.data

Konstante
AdoEnums.SearchDirection.BACKWARD
AdoEnums.SearchDirection.FORWARD


SeekEnum

Gibt den Ausführungstyp von Seek an.

Konstante | Wert | Beschreibung
adSeekFirstEQ | 1 | Sucht den ersten Schlüssel, der gleich KeyValues ist.
adSeekLastEQ | 2 | Sucht den letzten Schlüssel, der gleich KeyValues ist.
adSeekAfterEQ | 4 | Sucht entweder einen Schlüssel, der gleich KeyValues ist, oder sucht ihn in dem Bereich, der direkt auf eine Übereinstimmung folgt.
adSeekAfter | 8 | Sucht einen Schlüssel in dem Bereich, der direkt auf eine Übereinstimmung mit KeyValues folgt.
adSeekBeforeEQ | 16 | Sucht entweder einen Schlüssel, der gleich KeyValues ist, oder sucht ihn in dem Bereich, der einer Übereinstimmung direkt vorangeht.
adSeekBefore | 32 | Sucht einen Schlüssel in dem Bereich, der einer Übereinstimmung mit KeyValues direkt vorangeht.

ADO/WFC-Äquivalent

Paket: com.ms.wfc.data

Konstante
AdoEnums.Seek.FIRSTEQ
AdoEnums.Seek.LASTEQ
AdoEnums.Seek.AFTEREQ
AdoEnums.Seek.AFTER
AdoEnums.Seek.BEFOREEQ
AdoEnums.Seek.BEFORE


StreamOpenOptionsEnum

Gibt Optionen zum Öffnen eines Stream–Objekts an. Die Werte können mit einem OR-Operator kombiniert werden.

Konstante | Wert | Beschreibung
adOpenStreamAsync | 1 | Öffnet das Stream-Objekt im asynchronen Modus.
adOpenStreamFromRecord | 4 | Identifiziert den Inhalt des Parameters Source an als ein bereits offenes Record–Objekt. Das Standardverhalten behandelt Source als einen URL, der direkt auf einen Knoten in der Struktur zeigt. Der Standarddatenstrom, der diesem Knoten zugeordnet ist, wird geöffnet.
adOpenStreamUnspecified | -1 | Standard. Gibt an, dass das Stream-Objekt mit den Standardoptionen geöffnet wird.

ADO/WFC-Äquivalent

Diese Konstanten besitzen keine ADO/WFC-Äquivalente.


StreamReadEnum

Gibt an, ob der gesamte Datenstrom oder die nächste Zeile aus einem Stream–Objekt gelesen werden sollen.

Konstante | Wert | Beschreibung
adReadAll | -1 | Standard. Liest alle Bytes aus dem Datenstrom von der aktuellen Position aus vorwärts bis zum EOS–Marker. Dies ist der einzig gültige StreamReadEnum–Wert für binäre Datenströme (Type ist adTypeBinary).
adReadLine | -2 | Liest die nächste Zeile aus dem Datenstrom (bestimmt durch die LineSeparator-Eigenschaft).

ADO/WFC-Äquivalent

Diese Konstanten besitzen keine ADO/WFC-Äquivalente.


StreamTypeEnum

Gibt den in einem Stream–Objekt gespeicherten Datentyp an.

Konstante | Wert | Beschreibung
adTypeBinary | 1 | Gibt binäre Daten an.
adTypeText | 2 | Standard. Gibt Textdaten an, die in den Zeichensätzen durch Charset angegeben werden.

ADO/WFC-Äquivalent

Diese Konstanten besitzen keine ADO/WFC-Äquivalente.


StreamWriteEnum

Gibt an, ob ein Zeilentrennzeichen an die in ein Stream–Objekt geschriebene Zeichenfolge angehängt wird.

Konstante | Wert | Beschreibung
adWriteChar | 0 | Standard. Schreibt die (durch den Parameter Data) angegebene Textzeichenfolge in das Stream-Objekt.
adWriteLine | 1 | Schreibt eine Textzeichenfolge und ein Zeilentrennzeichen in ein Stream-Objekt. Wurde die LineSeparator–Eigenschaft nicht definiert, wird ein Laufzeitfehler zurückgegeben.

ADO/WFC-Äquivalent

Diese Konstanten besitzen keine ADO/WFC-Äquivalente.


StringFormatEnum

Gibt das Format an, wenn ein Recordset-Objekt als eine Zeichenfolge abgerufen wird.

Konstante | Wert | Beschreibung
adClipString | 2 | Trennt Zeilen durch RowDelimiter, Spalten durch ColumnDelimiter und Null-Werte durch NullExpr von einander ab. Diese drei Parameter der GetString-Methode sind nur mit einem StringFormat von adClipString gültig.

ADO/WFC-Äquivalent

Paket: com.ms.wfc.data

Konstante
AdoEnums.StringFormat.CLIPSTRING


XactAttributeEnum

Gibt die Transaktionsattribute eines Connection–Objekts an.

Konstante | Wert | Beschreibung
adXactAbortRetaining | 262144 | Führt zurückgehaltene Abbrüche aus, d. h., das Aufrufen von RollbackTrans startet automatisch eine neue Transaktion. Dies wird nicht von allen Providern unterstützt.
adXactCommitRetaining | 131072 | Führt zurückgehaltene Übergaben aus, d. h., das Aufrufen von CommitTrans startet automatisch eine neue Transaktion. Dies wird nicht von allen Providern unterstützt.

ADO/WFC-Äquivalent

Paket: com.ms.wfc.data

Konstante
AdoEnums.XactAttribute.ABORTRETAINING
AdoEnums.XactAttribute.COMMITRETAINING


ADO-Fehler

Weitere Informationen zu bestimmten Fehlermeldungen finden Sie unter den folgenden Themen:

  • ADO-Fehlercodes

  • RDS.DataControl-Fehlercodes

  • Internet Explorer-Fehlercodes

  • Internet-Informationsdienste-Fehlercodes


ADO-Fehlercodes

Zusätzlich zu den Provider-Fehlern, die in den Error-Objekten der Errors-Auflistung zurückgegeben werden, kann ADO Fehler an den Ausnahmebehandlungsmechanismus Ihrer Laufzeitumgebung zurückgeben. Verwenden Sie zum Erfassen von ADO-Fehlern den Fehlerbehebungsmechanismus bei Fehlern Ihrer Programmiersprache, wie z. B. die On Error-Anweisung in Visual Basic, den try-catch-Block in Visual C++ oder Visual J++.

Die Liste der ADO-Fehlercodes finden Sie unter ErrorValueEnum.


DataControl-Fehlercodes

In der folgenden Tabelle sind die Fehlercodes des RDS.DataControl-Objekts aufgeführt. Gezeigt werden die positive dezimale Übersetzung der unteren zwei Bytes, die negative dezimale Übersetzung des vollständigen Fehlercodes und die hexadezimalen Werte.

RDS.DataControl-Fehlercodes | Zahl | Beschreibung
IDS_AsyncPending | 4107 -2146824175 0x800A1011 | Die Operation kann nicht ausgeführt werden, während eine asynchrone Operation auf die Bearbeitung wartet
IDS_BadInlineTablegram | 4105 -2146824183 0x800A1009 | Ungültiges Inline-Tablegram.
IDS_CantConnect | 4099 -2146824189 0x800A1003 | Die Serververbindung konnte nicht hergestellt werden.
IDS_CantCreateObject | 4100 -2146824188 0x800A1004 | Das Geschäftsobjekt konnte nicht erstellt werden.
IDS_CantFindDataspace | 4102 -2146824186 0x800A1006 | Die Dataspace-Eigenschaft ist ungültig.
IDS_CantInvokeMethod | 4101 -2146824187 0x800A1005 | Eine Methode des Geschäftsobjekts konnte nicht ausgeführt werden.
IDS_CrossDomainWarning | 4112 -2146824170 0x800A1016 | Diese Seite greift auf eine Datenquelle in einer anderen Domäne zu. Wollen Sie das zulassen? Um diese Nachricht im Internet Explorer zu vermeiden, fügen Sie in der Registerkarte Sicherheit des Internetoptionen-Dialogs eine sichere Website zu Ihrer Zone für Vertrauenswürdige Sites hinzu.
IDS_InvalidADCClientVersion | 4106 -2146824176 0x800A1010 | Ungültige RDS-Clientversion: der Client ist aktueller als der Server.
IDS_INVALIDARG | 5376 -2147019520 0x80071500 | Mindestens ein Argument ist ungültig.
IDS_InvalidBindings | 4097 -2146824191 0x800A1001 | Fehler bei der Bindings-Eigenschaft.
IDS_InvalidParam | 4110 -2146824172 0x800A1014 | Mindestens ein Argument ist ungültig.
IDS_NOINTERFACE | 5377 -2147019519 0x80071501 | Die Schnittstelle wird nicht unterstützt.
IDS_NotReentrant | 4111 -2146824171 0x800A1015 | Die Anfrage kann nicht ausgeführt werden, während der Event-Handler noch einen Vorgang verarbeitet.
IDS_ObjectNotSafe | 4103 -2146824185 0x800A1007 | Die Sicherheitseinstellungen dieses Computers verhindern die Erstellung eines Geschäftsobjekts.
IDS_RecordsetNotOpen | 4109 -2146824173 0x800A1013 | Das Recordset ist nicht geöffnet.
IDS_ResetInvalidField | 4108 -2146824174 0x800A1012 | Die für SortColumn oder FilterColumn angegebene Spalte ist nicht vorhanden.
IDS_RowsetNotUpdateable | 4104 -2146824184 0x800A1008 | Rowset nicht aktualisierbar.
IDS_UnexpectedError | 4351 -2146823937 0x800A10FF | Unerwarteter Fehler.
IDS_UpdatesFailed | 4098 -2146824190 0x800A1002 | Die Datenbank konnte nicht aktualisiert werden.
IDS_URLMONNotFound | 4119 -2146824169 0x800A1017 | Die DataControl URL-Eigenschaft erfordert die Systemdatei Urlmon.dll, die nicht gefunden werden kann.


Internet Explorer-Fehlercodes

In der folgenden Tabelle sind die Internet Explorer-Fehlercodes aufgeführt, die beim Verwenden von Remote Data Service auftreten können. Gezeigt werden die positive dezimale Übersetzung der unteren zwei Bytes, die negative dezimale Übersetzung des vollständigen Fehlercodes und die hexadezimalen Werte.

Internet Explorer-Fehler (Wininet) | Zahl | Beschreibung
IDS_WinInet_CantConnect | 8195 -2146820093 0x800A2003 | Internetclientfehler: Serververbindung konnte nicht hergestellt werden.
IDS_WinInet_ ConnectionReset | 12031 -2146816257 0x800A2EFF | Internetclientfehler: Verbindung zurückgesetzt.
IDS_WinInet_Error | 8193 -2146820095 0x800A2001 | Fehler des Internetclients.
IDS_WinInet_ InvalidServerResponse | 8430 -2146819858 0x800A20EE | Internetclientfehler: Ungültige Serverrückmeldung.
IDS_WinInet_ SSLPostLimitation | 8196 -2146820092 0x800A2004 | Internetclientfehler: SSL-Fehler (möglicherweise Übertragungslimit von 32 KB Daten).
IDS_WinInet_Timeout | 8194 -2146820094 0x800A2002 | Internetclientfehler: Zeitlimit für Anforderung erreicht.


Internet-Informationsdienste-Fehlercodes

In der folgenden Tabelle sind die Internet-Informationsdienste-Fehlercodes aufgeführt, die beim Verwenden von Remote Data Service auftreten können. Gezeigt werden die positive dezimale Übersetzung der unteren zwei Bytes, die negative dezimale Übersetzung des vollständigen Fehlercodes und die hexadezimalen Werte.

Internet-Informationsdienste-Fehler | Zahl | Beschreibung
IDS_IIS_AccessDenied | 8208 -2146820080 0x800A2010 | Internetserverfehler: Zugriff verweigert.
IDS_IIS_ObjectNotFound | 8209 -2146820079 0x800A2011 | Internetserverfehler: Objekt/Modul nicht gefunden.
IDS_IIS_RequestForbidden | 8210 -2146820078 0x800A2012 | Internetserverfehler: Anforderung ungültig.
IDS_IIS_UnexpectedError | 8447 -2146819841 0x800A20FF | Internetserverfehler.


Programmieren mit ADO

ADO ist eine Komponente mit COM-Automatisierungsschnittstellen, die in Verbindung mit vielen Programmiersprachen verwendet werden kann, unter anderem mit Microsoft Visual Basic, VBScript, JScript, Visual C++ und Visual J++. Bei der Installation dieser Werkzeuge und auch anderer Anwendungen wie z. B. Microsoft® Office® und Microsoft SQL Server wird jeweils eine eigene ADO-Version mitinstalliert. Die neueste Version von ADO ist separat in Form der Microsoft Data Access Components verfügbar. In der Microsoft Data Access-Website können Sie weiterführende Informationen dazu finden.

Die ADO-Bibliothek trägt den Dateinamen msado15.dll und das Präfix der Programm-ID (ProgID) lautet "ADODB". Um z. B. explizit auf ein ADO-Recordset-Objekt zu verweisen, verwenden Sie den Ausdruck ADOB.Recordset.

Weitere Informationen zum Programmieren mit ADO unter den Bedingungen verschiedener Entwicklungsumgebungen können Sie den folgenden Themen entnehmen:

  • Verwenden von ADO mit Microsoft Visual Basic

  • Verwenden von ADO mit Skriptsprachen

  • Verwenden von ADO mit Microsoft Visual C++

  • Verwenden von ADO mit Microsoft Visual J++


Verwenden von ADO mit Microsoft Visual Basic

Das Einrichten eines ADO-Projekts und das Schreiben von ADO-Code erfolgt mit Visual Basic auf ähnliche Weise wie mit Visual Basic für Applikationen. Dieses Hilfethema behandelt die Verwendung von ADO sowohl mit Visual Basic als auch mit Visual Basic für Applikationen und benennt die eventuell vorhandenen Unterschiede.

Erstellen eines ADO-Projekts

Das Projekt muss einen Verweis auf die ADO-Bibliothek besitzen.

So richten Sie in Microsoft Visual Basic einen Verweis auf ADO ein:

  1. Wählen Sie in Visual Basic im Menü Projekt den Befehl Verweise.

  2. Wählen Sie in der Liste den Eintrag Microsoft ActiveX Data Objects x.x Library aus Stellen Sie sicher, dass außerdem zumindest auch die folgenden Bibliotheken ausgewählt sind:
    • Visual Basic For Applications

    • Visual Basic runtime objects and procedures

    • Visual Basic objects and procedures

    • OLE Automation
  3. Klicken Sie auf OK.

Sie können ADO ebenso problemlos auch mit Visual Basic für Applikationen verwenden, beispielsweise in Microsoft Access.

So richten Sie in Microsoft Access einen Verweis auf ADO ein:

  1. Wählen Sie in Microsoft Access im Datenbank-Fenster auf der Registerkarte Module ein Modul aus, oder erstellen Sie ein neues.

  2. Wählen Sie im Menü Extras den Befehl Verweise.

  3. Wählen Sie in der Liste den Eintrag Microsoft ActiveX Data Objects x.x Library aus Stellen Sie sicher, dass außerdem zumindest auch die folgenden Bibliotheken ausgewählt sind:
    • Visual Basic For Applications

    • Microsoft Access 8.0 Object Library (oder höher)

    • Microsoft DAO 3.5 Object Library (oder höher)
  4. Klicken Sie auf OK.

Erstellen von ADO-Objekten in Visual Basic

Um eine Automatisierungsvariable und eine Objektinstanz für diese Variable zu erstellen, können Sie auf zweierlei Art verfahren: Sie können Dim oder CreateObject verwenden.

Dim

Sie können mit Dim und dem Schlüsselwort New neue ADO-Objekte in einem Schritt deklarieren und instanziieren:

Dim conn As New ADODB.Connection

Alternativ kann die mit der Dim-Anweisung gegebene Deklarierung und Objektinstanziierung auch in zwei Schritten erfolgen:

Dim conn As ADODB.Connection
Set conn = New ADODB.Connection

Anmerkung Die explizite Verwendung der ProgID ADODB innerhalb der Dim-Anweisung ist nicht erforderlich, sofern zum Projekt der richtige Verweis auf die ADO-Bibliothek hinzugefügt wurde. Allerdings stellt die Verwendung der ProgID sicher, dass sich keine Namenskonflikte mit anderen Bibliotheken ergeben.

Sofern Sie beispielsweise innerhalb desselben Projekts sowohl Verweise auf ADO als auch auf DAO einbinden, sollten Sie einen Qualifizierer zur Angabe des gewünschten Objektmodells verwenden, wenn Sie Recordset-Objekte instanziieren, wie der folgende Code illustriert:

Dim adoRS As ADODB.Recordset
Dim daoRS As DAO.Recordset

CreateObject

Bei Verwendung der CreateObject-Methode müssen Deklarierung und Objektinstanziierung in zwei getrennten Schritten erfolgen:

Dim conn1
Set conn1 = CreateObject("ADODB.Connection") As Object

Mit CreateObject instanziierte Objekte werden dynamisch gebunden. Sie sind also nicht streng typisiert, und die Anweisungsergänzung (durch automatische Elementauflistung) ist deaktiviert. Die Verwendung dieser Methode ermöglicht es jedoch, die Referenzierung der ADO-Bibliothek über das Projekt zu umgehen und spezielle Versionen von Objekten zu instanziieren. Beispiel:

Set conn1 = CreateObject("ADODB.Connection.2.0") As Object

Dasselbe können Sie auch erreichen, indem Sie einen Verweis auf die Version 2.0 der ADO-Typbibliothek erstellen und dann das Objekt erstellen.

Die Instanziierung von Objekten mit der CreateObject-Methode ist in der Regel langsamer als die Objektinstanziierung unter Verwendung der Dim-Anweisung.

Visual Basic-Beispiele

Zur ADO-Dokumentation gehören zahlreiche in Visual Basic formulierte Beispiele. Weitere Informationen dazu finden Sie unter dem Hilfethema ADO-Codebeispiele in Microsoft Visual Basic.


Verwenden von ADO mit Skriptsprachen

Innerhalb einer Skripting-Umgebung ermöglicht ADO das Offenlegen von Daten über serverbasiertes Skripting. Bei einem solchen Szenario werden ADO, der zugrunde liegende OLE DB-Provider sowie alle anderen Komponenten, die für den Zugriff auf einen gegebenen Datenspeicher erforderlich sind, auf einem Server installiert, auf dem auch IIS (Internet Information Services, Internet-Informationsdienste) eingerichtet ist. ADO ist dann eine Komponente, auf die unter Verwendung von Active Server Pages (ASP) in einem Skript zugegriffen wird, das beispielsweise HTML generieren kann. Dieser HTML-Inhalt kann über HTTP zu einem als Client dienenden Webbrowser gesendet werden. Durch den Einsatz von Skripting ist die Webseite in der Lage, Aktionsanforderungen zurück an das serverbasierte Skript zu senden und auf diese Weise bestimmte Daten zu aktualisieren, zu durchsuchen oder anzuzeigen.

Ein erwähnenswerter Unterschied zwischen Skripting-basierten ADO-Code und ADO-Code ohne Skripting-Umgebung betrifft die gegebenenfalls verwendete ODBC-Datenquelle. Bei Anwendungen ohne Skripting können Sie einen Benutzer-DSN im ODBC-Datenquellen-Administrator erstellen. Für Skripte, die unter IIS ausgeführt werden, muss ein System-DSN definiert werden, da andernfalls die Skripte die von Ihnen erstellte Datenquelle nicht erkennen werden. Dies gilt für jede Skripting-basierte ADO-Anwendung, die über Microsoft IIS auf Microsoft OLE DB-Provider für ODBC zugreift.

Die folgenden Themen enthalten eingehendere Informationen zur Verwendung von ADO in Kombination mit Skriptsprachen:

  • ADO und VBScript

  • ADO und JScript


ADO und VBScript

Erstellen eines ADO-Projekts

Da VBScript keine Typbibliotheken unterstützt, brauchen Sie keinen Verweis auf ADO in das Projekt aufzunehmen. Folglich werden auch die zugehörigen Merkmale wie etwa die Anweisungsergänzung (per automatischer Elementauflistung) nicht unterstützt. Außerdem sind die ADO-Aufzählungskonstanten standardmäßig in VBScript nicht definiert.

ADO stellt jedoch die folgenden zwei Include-Dateien mit Definitionen für VBScript zur Verfügung:

  • Für serverbasiertes Skripting ist Adovbs.inc zu verwenden. Diese Datei ist standardmäßig im Ordner C:\Programme\Gemeinsame Dateien\System\ado\ installiert.

  • Für clientbasiertes Skripting ist Adcvbs.inc zu verwenden. Diese Datei ist standardmäßig im Ordner C:\Programme\Gemeinsame Dateien\System\msdac\ installiert.

Sie können die Konstantendefinitionen dieser Dateien entweder kopieren und in die ASP-Seiten einfügen oder - sofern Sie serverbasierte Skripte einsetzen - die Datei Adovbs.inc in einen Ordner Ihrer Website kopieren und anschließend innerhalb einer ASP-Seite folgendermaßen darauf Bezug nehmen:

<!--#include File="adovbs.inc"-->

Erstellen von ADO-Objekten in VBScript

Sie können in VBScript nicht die Dim-Anweisung verwenden, um Objekte einem bestimmten Typ zuzuordnen. VBScript unterstützt auch nicht die New-Syntax, welche zusammen mit der Dim-Anweisung in Visual Basic für Applikationen verwendet wird. Sie müssen folgenden Aufruf der CreateObject-Funktion verwenden:

Dim Rs1
Set Rs1 = Server.CreateObject( "ADODB.Recordset" )

VBScript-Beispiele

Der folgende Code bietet ein allgemeines Beispiel für serverbasierte VBScript-Programmierung in einer Active Server Page-Datei (ASP):

<%  @LANGUAGE="VBSCRIPT" %>
<%  Option Explicit %>
<!--#include File="adovbs.inc"-->
<HTML>
    <BODY BGCOLOR="White" topmargin="10" leftmargin="10">

    <!-- Hier Ihren ASP-Code einfügen -->
<%
Dim Source
Dim Connect
Dim Rs1

Source = "SELECT * FROM Authors"
Connect = "Provider=sqloledb;Data Source=srv;" & _
    "Initial Catalog=Pubs;User Id=sa;Password=;"

Set Rs1 = Server.CreateObject( "ADODB.Recordset" )
Rs1.Open Source, Connect, adOpenForwardOnly
Response.Write("Success!")
%>
    </BODY>
</HTML>

In der ADO-Dokumentation sind andere in VBScript formulierte Beispiele zu speziellen Themen vorhanden. Weitere Informationen dazu finden Sie unter dem Hilfethema ADO-Codebeispiele in Microsoft Visual Basic Scripting Edition

Unterschiede zwischen VBScript und Visual Basic

Die Verwendung von ADO mit VBScript ähnelt in vielerlei Hinsicht der Verwendung von ADO mit Visual Basic. Dazu gehört auch der Gebrauch der Syntax. Allerdings gibt es einige wichtige Unterschiede:

  • VBScript unterstützt nur den Variant-Datentyp, der unterschiedliche Typen von Daten repräsentieren kann. Sie können die von Ihnen benötigten Daten in einer Variant-Variablen speichern. Aufgrund der von VBScript vorgenommenen Typanpassung werden diese Daten in der gewünschten Weise funktionieren. VBScript erkennt den von ADO benötigten Datentyp und konvertiert den Wert vom Datentyp Variant entsprechend.

  • Die Verwendung der Anweisung on error goto <Zeilenmarke> ist innerhalb von VBScript nicht möglich.

  • VBScript unterstützt einige der integrierten Visual Basic-Funktionen, wie z. B. Msgbox, Date und IsNumeric. Da VBScript jedoch eine Teilmenge von Visual Basic darstellt, werden nicht alle integrierten Funktionen unterstützt. So unterstützt VBScript beispielsweise nicht die Format-Funktion und auch nicht die Funktionen zum Lesen und Schreiben von Dateien.


ADO und JScript

Erstellen eines ADO-Projekts

Da JScript keine Typbibliotheken unterstützt, brauchen Sie keinen Verweis auf ADO in das Projekt aufzunehmen. Folglich werden auch die zugehörigen Merkmale wie etwa die Anweisungsergänzung (per automatischer Elementauflistung) nicht unterstützt. Außerdem sind die ADO-Aufzählungskonstanten standardmäßig in JScript nicht definiert.

ADO stellt jedoch die folgenden zwei Include-Dateien mit Definitionen für JScript zur Verfügung:

  • Für serverbasiertes Skripting ist Adojavas.inc zu verwenden. Diese Datei ist standardmäßig im Ordner C:\Programme\Gemeinsame Dateien\System\ado\ installiert.

  • Für clientbasiertes Skripting ist Adcjavas.inc zu verwenden. Diese Datei ist standardmäßig im Ordner C:\Programme\Gemeinsame Dateien\System\msdac\ installiert.

Sie können die Konstantendefinitionen dieser Dateien entweder kopieren und in die ASP-Seiten einfügen oder - sofern Sie serverbasierte Skripte einsetzen - die Datei Adojavas.inc in einen Ordner Ihrer Website kopieren und anschließend innerhalb einer ASP-Seite folgendermaßen darauf Bezug nehmen:

<!--#include File="adojavas.inc"-->

Erstellen von ADO-Objekten in JScript

Sie müssen folgenden Aufruf der CreateObject-Funktion verwenden:

var Rs1;
Rs1 = Server.CreateObject("ADODB.Recordset");

JScript-Beispiel

Der folgende Code bietet ein allgemeines Beispiel für die serverbasierte JScript-Programmierung in einer Active Server Page-Datei (ASP), die ein Recordset-Objekt öffnet:

<%  @LANGUAGE="JScript" %>
<!--#include File="adojavas.inc"-->
<HTML>
<BODY BGCOLOR="White" topmargin="10" leftmargin="10">
<%
var Source = "SELECT * FROM Authors";
var Connect =  "Provider=sqloledb;Data Source=srv;" +
    "Initial Catalog=Pubs;User Id=sa;Password=;"
var Rs1 = Server.CreateObject( "ADODB.Recordset.2.5" );
Rs1.Open(Source,Connect,adOpenForwardOnly);
Response.Write("Success!");
%>
</BODY>
</HTML>


Verwenden von ADO mit Microsoft Visual C++

Weitere Informationen zum Verwenden von ADO mit Visual C++ finden Sie unter:

  • So verwenden Benutzer von Visual C++ die ADO-Dokumentation

  • Visual C++-Erweiterungen für ADO

  • Syntaxindex (COM): ADO für Visual C++

  • Syntaxindex (#import): ADO für Visual C++


So verwenden Benutzer von Visual C++ die ADO-Dokumentation

Die API-Referenz von ADO beschreibt die Funktionalität der API (Application Programming Interface) von ADO unter Verwendung einer Microsoft Visual Basic-ähnlichen Syntax. Obwohl die Referenz sich an alle Benutzer richtet, ist doch zu berücksichtigen, dass ADO-Progammierer unterschiedliche Sprachen verwenden, also beispielsweise Visual Basic, Visual C++ (mit und ohne #import-Direktive) sowie Visual J++ (mit dem ADO/WFC-Klassenpaket).

Um dieser Vielfalt gerecht zu werden, stellen die Syntaxindizes der ADO-Schnittstelle für Visual C++ die Visual C++-sprachspezifische Syntax unter Verwendung von Querverweisen bereit, die zu allgemeinen Beschreibungen von Funktionalität, Parametern, Fehlerbehandlung usw. in der API-Referenz führen.

ADO ist mithilfe von COM-Schnittstellen (Component Object Model) implementiert. Allerdings ist für Programmierer die Handhabung von COM mit einigen Programmiersprachen einfacher als mit anderen Sprachen. Beispielsweise werden in Visual Basic fast alle Details der COM-Programmierung implizit behandelt, während Visual C++-Programmierer sich um diese Details selbst kümmern müssen.

Die folgenden Abschnitte fassen die Details für C- und C++-Programmierer zusammen, die die ADO-Programmierung und die #import-Direktive verwenden. Dabei liegt der Schwerpunkt auf COM-spezifischen Datentypen (Variant, BSTR und SafeArray) und der Fehlerbehandlung (_com_error).

Verwenden der #import-Compilerdirektive

Die #import-Compilerdirektive von Visual C++ vereinfacht das Arbeiten mit den Methoden und Eigenschaften von ADO. Die Direktive übernimmt den Namen einer Datei, die eine Typbibliothek enthält, beispielsweise die ADO-DLL (Msado15.dll), und generiert Headerdateien, die typedef-Deklarationen enthalten. Diese Deklarationen werden auch als intelligente Zeiger für Schnittstellen und Aufzählungskonstanten bezeichnet. Jede Schnittstelle ist in eine Klasse eingeschlossen.

Für jede Operation innerhalb einer Klasse (also bei jedem Aufruf einer Methode oder Eigenschaft) existiert eine Deklaration für den direkten Aufruf der Operation (sozusagen die "Reinform" der Operation) sowie eine weitere Deklaration, um die Rawoperation aufzurufen und einen COM-Fehler auszulösen, wenn die Operation fehlschlägt. Betrifft die Operation eine Eigenschaft, so gibt es in der Regel eine Compilerdirektive, die eine alternative Syntax für die Operation generiert, die der Visual Basic-Syntax ähnelt.

Operationen, die den Wert einer Eigenschaft abrufen, haben Namen in der Form Get Property. Operationen, die den Wert einer Eigenschaft festlegen, haben Namen in der Form Put Property. Operationen, die den Wert einer Eigenschaft mit einem Zeiger auf ein ADO-Objekt festlegen, haben Namen in der Form PutRef Property.

Der Wert einer Eigenschaft kann mithilfe von Aufrufen der folgenden Art festgelegt oder abgerufen werden:

variable = objectPtr->GetProperty(); // Eigenschaftswert abrufen
objectPtr->PutProperty(value);       // Eigenschaftswert festlegen
objectPtr->PutRefProperty(&value);   // Eigenschaft mit Objektzeiger
                                     // festlegen

Verwenden von Property-Direktiven

Die __declspec(property...)-Compilerdirektive ist eine Microsoft-spezifische Erweiterung der C-Sprache, die für eine Funktion, die als Eigenschaft verwendet wird, eine alternative Syntax deklariert. Das führt dazu, dass die Werte einer Eigenschaft auf ähnliche Weise festgelegt und abgerufen werden können wie in Visual Basic. Beispielsweise kann eine Eigenschaft folgendermaßen festgelegt und abgerufen werden:

objectPtr->property = value;        // Eigenschaftswert festlegen
variable = objectPtr->property;     // Eigenschaftswert abrufen

Beachten Sie, dass für Folgendes kein Code mehr erforderlich ist:

objectPtr->PutProperty(value);      // Eigenschaftswert festlegen
variable = objectPtr->GetProperty;  // Eigenschaftswert abrufen

Der Compiler generiert die geeigneten Get Property-, Put Property- oder PutRef Property-Aufrufe in Abhängigkeit von der jeweils deklarierten alternativen Syntax und im Hinblick darauf, ob die Eigenschaft lese- oder schreibgeschützt ist.

Die __declspec(property...)-Compilerdirektive kann für eine Funktion nur get, put oder get und put als alternative Syntax deklarieren. Schreibgeschützte Operationen haben nur eine get-Deklaration, Nur-Schreiben-Operationen nur eine put-Deklaration. Operationen mit Lese- und Schreibzugriff haben sowohl get- als auch put-Deklarationen.

Es sind nur zwei Deklarationen mit dieser Direktive möglich, aber jede Eigenschaft kann drei Eigenschaftsfunktionen haben: Get Property, Put Property und PutRef Property. In diesem Fall besitzen nur zwei Formen der Eigenschaft eine alternative Syntax.

Die ActiveConnection-Eigenschaft des Command-Objekts ist beispielsweise mit einer alternativen Syntax für Get ActiveConnection und PutRef ActiveConnection deklariert. Die PutRef-Syntax stellt eine gute Wahl dar, da in der Praxis normalerweise beabsichtigt wird, der Eigenschaft ein geöffnetes Connection-Objekt (d. h. einen Zeiger auf ein Connection-Objekt) zuzuweisen. Andererseits besitzt das Recordset-Objekt Get ActiveConnection-, Put ActiveConnection- und PutRef ActiveConnection-Operationen, aber keine alternative Syntax.

Auflistungen, die GetItem-Methode und die Item-Eigenschaft

ADO definiert mehrere Auflistungen, zu denen Fields, Parameters, Properties und Errors gehören. In Visual C++ gibt die GetItem(index)-Methode ein Element der Auflistung zurück. Index ist ein Wert vom Datentyp Variant, der entweder einen numerischen Index des Elements innerhalb der Auflistung oder eine Zeichenfolge mit dem Namen des Elements darstellt.

Die __declspec(property...)-Compilerdirektive deklariert zu jeder GetItem()-Basismethode einer Auflistung als alternative Syntax die Item-Eigenschaft. Die alternative Syntax verwendet eckige Klammern und ähnelt einem Feldverweis. Im Allgemeinen haben beide Formen folgendes Aussehen:

collectionPtr->GetItem(index);
collectionPtr->Item[index];

Beispielsweise soll einem Feld eines Recordset-Objekts mit dem Namen rs ein Wert zugewiesen werden, und zwar abgeleitet von der Authors-Tabelle der Pubs-Datenbank. Verwenden Sie die Item()-Eigenschaft, um auf das dritte Field-Objekt der Fields-Auflistung des Recordset-Objekts zuzugreifen. (Auflistungen werden bei Null (0) beginnend indiziert, dabei wird angenommen, dass au_fname der Name des dritten Feldes ist.) Anschließend wird die Value()-Methode für das Field-Objekt aufgerufen, um dem Objekt eine Zeichenfolge als Wert zuzuweisen.

Dieser Vorgang kann in Visual Basic auf die folgenden vier Arten ausgedrückt werden (die letzten beiden Formen sind Visual Basic-spezifisch und ohne Äquivalent in anderen Sprachen):

rs.Fields.Item(2).Value = "value"
rs.Fields.Item("au_fname").Value = "value"
rs(2) = "value"
rs!au_fname = "value"

Das Äquivalent aus Visual C++ zu den ersten beiden Formen lautet:

rs->Fields->GetItem(2)->PutValue("value");
rs->Fields->GetItem("au_fname")->PutValue("value");

-oder- (in der alternativen Syntax der Value-Eigenschaft dargestellt):

rs->Fields->Item[2]->Value = "value";
rs->Fields->Item["au_fname"]->Value = "value";

COM-spezifische Datentypen

In der Regel besitzt jeder in der API-Referenz von ADO erwähnte Visual Basic-Datentyp ein gleichwertiges Gegenstück in Visual C++. Das schließt Standarddatentypen ein, so entspricht unsigned char dem Datentyp Byte in Visual Basic, short dem Datentyp Integer und long dem Datentyp Long. Den Syntaxindizes können Sie entnehmen, welche Datentypen für die Operanden einer gegebenen Methode oder Eigenschaft erforderlich sind.

Die Ausnahmen von dieser Regel bilden die COM-spezifischen Datentypen Variant, BSTR und SafeArray.

Variant

Variant bezeichnet einen strukturierten Datentyp, der als Elemente einen Wert und einen Datentyp enthält. Ein Variant-Datentyp kann Werte einer Vielzahl anderer Datentypen enthalten, einschließlich einem weiteren Variant-Datentyp, BSTR, Boolean, IDispatch- oder IUnknown-Zeiger, Währungs- und Datumsangaben. COM stellt Methoden bereit, die die Konvertierung von einem Datentyp in den anderen vereinfachen.

Die _variant_t-Klasse schließt den Variant-Datentyp ein und verwaltet ihn.

Wenn in der API-Referenz von ADO beschrieben ist, dass Operanden einer Methode oder Eigenschaft einen Wert übernehmen, ist in der Regel gemeint, dass der Wert in einer _variant_t-Klasse übergeben wird.

Diese Regel gilt explizit dann, wenn im Parameter-Abschnitt in den Themen der API-Referenz von ADO steht, dass es sich bei dem Operanden um einen Wert vom Datentyp Variant handelt. Ausgenommen davon sind die Fälle, in denen die Dokumentation explizit darauf verweist, dass für den Operandenwert ein Standarddatentyp verwendet wird, beispielsweise Long oder Byte oder eine Aufzählung. Eine weitere Ausnahme betrifft Operanden mit Werten vom Datentyp String.

BSTR

BSTR (Basic STRing) ist ein strukturierter Datentyp, der eine Zeichenfolge und die Länge der Zeichenfolge enthält. COM stellt Methoden zum Zuweisen, Bearbeiten und Freigeben von BSTR zur Verfügung.

Die _bstr_t-Klasse schließt den BSTR-Datentyp ein und verwaltet ihn.

Wenn in der API-Referenz von ADO beschrieben ist, dass eine Methode oder Eigenschaft einen Wert vom Datentyp String übernimmt, ist gemeint, dass der Wert in Form einer _bstr_t-Klasse übergeben wird

Konvertieren der _variant_t- und _bstr_t-Klassen

Es ist häufig nicht erforderlich, eine _variant_t- oder _bstr_t-Klasse in einem Argument explizit zu einer Operation zu codieren. Wenn die _variant_t- oder die _bstr_t-Klasse einen Konstruktor besitzt, der dem Datentyp des Arguments entspricht, wird der Compiler den geeigneten _variant_t- bzw. _bstr_t-Wert generieren.

Wenn das Argument jedoch nicht eindeutig ist und sein Datentyp mehr als einem Konstruktor entspricht, muss das Argument in den geeigneten Datentyp konvertiert werden, damit der richtige Konstruktor aufgerufen wird.

Die Deklaration der Recordset::Open-Methode lautet beispielsweise folgendermaßen:

    HRESULT Open (
        const _variant_t & Source,
        const _variant_t & ActiveConnection,
        enum CursorTypeEnum CursorType,
        enum LockTypeEnum LockType,
        long Options );

Das ActiveConnection-Argument übernimmt einen Verweis auf ein _variant_t-Objekt, der in Form einer Verbindungszeichenfolge oder eines Zeigers auf ein geöffnetes Connection-Objekt codiert werden kann.

Der richtige _variant_t-Wert wird implizit erstellt, wenn Sie eine Zeichenfolge wie z. B. "DSN=pubs;uid=sa;pwd=;" oder einen Zeiger wie z. B. "(IDispatch *) pConn" übergeben.

Sie können einen _variant_t-Wert, der z. B. einen Zeiger wie "_variant_t((IDispatch *) pConn, true)" enthält, auch explizit codieren. Die Konvertierung, (IDispatch *), löst die Mehrdeutigkeit auf, die aus der Übereinstimmung mit einem anderen Konstruktor resultiert, der einen Zeiger auf eine IUnknown-Schnittstelle übernimmt.

Es ist eine entscheidende, aber selten erwähnte Tatsache, dass ADO eine IDispatch-Schnittstelle ist. Immer dann, wenn ein Zeiger auf ein ADO-Objekt als Wert vom Datentyp Variant übergeben werden muss, muss der Zeiger in einen Zeiger auf eine IDispatch-Schnittstelle konvertiert werden.

In dem zuletzt erwähnten Fall wird das zweite boolesche Argument des Konstruktors mit dem optionalen Standardwert true codiert. Dieses Argument veranlasst den Variant-Konstruktor, seine AddRef()-Methode aufzurufen. Dieser Aufruf kompensiert den Umstand, dass ADO automatisch die _variant_t::Release()-Methode aufruft, wenn der Aufruf der ADO-Methode oder -Eigenschaft abgeschlossen ist.

SafeArray

SafeArray ist ein strukturierter Datentyp, der ein Feld aus anderen Datentypen enthält. SafeArray wird sicher (englisch: safe) genannt, da es Informationen über die Grenzen jeder Felddimension enthält und den Zugriff auf Feldelemente innerhalb dieser Grenzwerte beschränkt.

Wenn in der API-Referenz von ADO beschrieben ist, dass eine Methode oder Eigenschaft ein Array übernimmt bzw. zurückgibt, ist damit gemeint, dass ein Wert vom Typ SafeArray und nicht ein C/C++-spezifischer Array übergeben oder zurückgegeben wird.

Der zweite Parameter der OpenSchema-Methode des Connection-Objekts erfordert z. B ein Feld mit Werten vom Datentyp Variant. Die Werte vom Datentyp Variant müssen als Elemente eines SafeArray-Datentyps übergeben und der SafeArray-Datentyp selbst muss als Wert eines anderen Variant-Datentyps festgelegt werden. Genau dieser andere Variant-Datentyp wird als zweites Argument an OpenSchema übergeben.

Weiterhin ist z. B. das erste Argument der Find-Methode ein Variant-Datentyp, dessen Wert ein eindimensionaler SafeArray ist. Jedes der ersten beiden optionalen Argumente der AddNew-Methode ist ein eindimensionaler SafeArray-Datentyp. Des Weiteren ist der Rückgabewert der GetRows-Methode ein Variant-Datentyp mit einem zweidimensionalen SafeArray als Wert.

Fehlende Parameter und Standardparameter

Visual Basic ermöglicht das Weglassen von Parametern in Methoden. Beispielsweise besitzt die Open-Methode des Recordset-Objekts fünf Parameter, Sie können jedoch Parameter an Zwischenstellen überspringen und die am Ende stehenden Parameter weglassen. Je nach Datentyp des fehlenden Operanden wird ein Standardwert vom Typ BSTR oder Variant ersetzt.

In C/C++ müssen alle Operanden angegeben werden. Wenn Sie das Fehlen eines Parameters, dessen Datentyp eine Zeichenfolge ist, angeben möchten, geben Sie eine _bstr_t mit einer leeren Zeichenfolge an. Soll das Fehlen eines Parameters, dessen Datentyp ein Variant ist, angezeigt werden, können Sie eine _variant_t mit einem Wert vom Typ DISP_E_PARAMNOTFOUND und einem Typ VT_ERROR angeben. Eine andere Möglichkeit besteht darin, die gleichwertige _variant_t-Konstante vtMissing anzugeben, die über die #import-Direktive bereitgestellt wird.

Drei Methoden stellen Ausnahmen zu der normalen Verwendung von vtMissing dar. Es handelt sich um die Execute-Methoden des Connection- und des Command-Objekts sowie um die NextRecordset-Methode des Recordset-Objekts. Die Methoden haben folgende Signaturen:

_RecordsetPtr Execute( _bstr_t CommandText, VARIANT * RecordsAffected,
        long Options );  // Verbindung
_RecordsetPtr Execute( VARIANT * RecordsAffected, VARIANT * Parameters,
        long Options );  // Befehl
_RecordsetPtr NextRecordset( VARIANT * RecordsAffected );
// Recordset

Die Parameter RecordsAffected und Parameters sind Zeiger auf einen Variant-Datentyp. Parameters ist ein Eingabeparameter, der die Adresse eines Variant-Datentyps bezeichnet, der einen einzelnen Parameter oder ein Array mit Parametern enthält. Diese Parameter sollen den gerade ausgeführten Befehl verändern. RecordsAffected ist ein Ausgabeparameter, der die Adresse eines Variant-Datentyps angibt, in dem die Anzahl der Datensätze zurückgegeben wird, auf die sich die Methode auswirkt.

In der Execute-Methode des Command-Objekts kann durch das Festlegen von Parameters auf &vtMissing (empfohlen) oder auf den Nullzeiger (Null bzw. Null (0)) angegeben werden, dass keine Parameter angegeben wurden. Falls Parameters auf den Nullzeiger festgelegt wird, ersetzt die Methode intern das Äquivalent von vtMissing und schließt die Operation ab.

In allen genannten Methoden kann durch Festlegen von RecordsAffected auf den Nullzeiger angezeigt werden, dass die Datensätze, auf die sich die Methode auswirkt, nicht zurückgegeben werden sollen. In diesem Fall ist der Nullzeiger weniger ein fehlender Parameter, sondern eher ein Hinweis darauf, dass die Methode die Anzahl der Datensätze, auf die sich die Methode auswirkt, ignorieren soll.

Für diese drei Methoden ist daher ein Code wie der folgende zulässig:

pConnection->Execute("commandText", NULL, adCmdText);
pCommand->Execute(NULL, NULL, adCmdText);
pRecordset->NextRecordset(NULL);

Fehlerbehandlung

In COM geben die meisten Operationen einen HRESULT-Rückgabecode zurück, der anzeigt, ob eine Funktion erfolgreich abgeschlossen wurde. Die #import-Direktive generiert für jede Rawmethode oder Eigenschaft Wrappercode und überprüft das zurückgegebene HRESULT. Weist HRESULT auf eine fehlgeschlagene Operation hin, löst der Wrappercode einen COM-Fehler aus, indem er _com_issue_errorex() aufruft und dabei den HRESULT-Rückgabecode als Argument übergibt. COM-Fehlerobjekte können innerhalb eines try-catch-Blockes gefunden werden. (Aus Effizienzgründen sollten Sie einen Verweis auf ein _com_error-Objekt auffangen.)

Beachten Sie, dass es sich um ADO-Fehler handelt. Diese Fehler ergeben sich aus einer fehlgeschlagenen ADO-Operation. Fehler, die vom zugrunde liegende Provider zurückgegeben werden, werden als Error-Objekte in der Errors-Auflistung des Connection-Objekts angezeigt.

Die #import-Direktive erstellt nur für die in der ADO-DLL deklarierten Methoden und Eigenschaften Fehlerbehandlungsroutinen. Allerdings können Sie denselben Fehlerbehandlungsmechanismus nutzen, indem Sie ein eigenes Makro oder eine eigene Inlinefunktionen zur Fehlerprüfung schreiben. Entsprechende Beispiele finden Sie unter dem Thema Visual C++-Erweiterungen oder im Code der folgenden Abschnitte.

Visual C++-Äquivalente zu den Visual Basic-Konventionen

Die folgenden Ausführungen stellen eine Zusammenfassung der verschiedenen in Visual Basic codierten Konventionen der ADO-Dokumentation und ihre Äquivalenten in Visual C++ dar.

Deklarieren eines ADO-Objekts

In Visual Basic wird eine ADO-Objektvariable (in diesem Beispiel für ein Recordset-Objekt) auf folgende Weise deklariert:

Dim rst As ADODB.Recordset

Die ADODB.Recordset-Klausel gibt die Programm-ID des Recordset-Objekts an, wie sie in der Registrierung definiert ist. Eine neue Instanz eines Record-Objekts wird folgendermaßen deklariert:

Dim rst As New ADODB.Recordset

-oder-

Dim rst As ADODB.Recordset
Set rst = New ADODB.Recordset

In Visual C++ generiert die #import-Direktive für alle ADO-Objekte Deklarationen auf der Basis intelligenter Zeiger. Beispielsweise hat eine Variable, die auf ein _Recordset-Objekt verweist, den Typ _RecordsetPtr. Sie wird auf folgende Weise deklariert:

_RecordsetPtr  rs;

Eine Variable, die auf eine neue Instanz eines _Recordset-Objekts verweist, wird folgendermaßen deklariert:

_RecordsetPtr  rs("ADODB.Recordset");

-oder-

_RecordsetPtr  rs;
rs.CreateInstance("ADODB.Recordset");

-oder-

_RecordsetPtr  rs;
rs.CreateInstance(__uuidof(_Recordset));

Nach dem Aufruf der CreateInstance-Methode kann die Variable in folgender Weise verwendet werden:

rs->Open(...);

Beachten Sie, dass in dem einen Fall der "."-Operator verwendet wird, als ob die Variable eine Instanz einer Klasse darstellt (rs.CreateInstance), während in dem anderen Fall der "->"-Operator verwendet wird, als ob die Variable einen Zeiger auf eine Schnittstelle darstellt (rs->Open).

Eine Variable kann auf zwei Arten verwendet werden, da der "->"-Operator entsprechend überladen wurde, um einer Klasseninstanz zu ermöglichen, sich wie ein Zeiger auf eine Schnittstelle zu verhalten. Ein privates Klassenelement der Instanzvariablen enthält einen Zeiger auf die _Recordset-Schnittstelle. Der "->"-Operator gibt diesen Zeiger zurück, und dieser zurückgegebene Zeiger ermöglicht dann den Zugriff auf die Elemente des _Recordset-Objekts.

Codieren eines fehlenden String-Parameters

Wenn Sie für einen fehlenden String-Operanden in Visual Basic Code schreiben müssen, lassen Sie den Operanden einfach weg. In Visual C++ muss der Operand angegeben werden. Schreiben Sie Code für eine _bstr_t-Klasse, die als Wert eine leere Zeichenfolge hat.

_bstr_t strMissing(L"");

Codieren eines fehlenden Variant-Parameters

Wenn Sie für einen fehlenden Variant-Operand in Visual Basic Code schreiben müssen, lassen Sie den Operanden einfach weg. In Visual C++ müssen alle Operanden angegeben werden. Schreiben Sie Code für einen fehlenden Variant-Parameter, wobei _variant_t auf einen speziellen Wert, DISP_E_PARAMNOTFOUND, und einen speziellen Typ, VT_ERROR, festgelegt ist. Oder geben Sie vtMissing an, das eine gleichwertige, vordefinierte Konstante darstellt, die über die #import-Direktive bereitgestellt wird.

_variant_t  vtMissingYours(DISP_E_PARAMNOTFOUND, VT_ERROR);

-oder-

...vtMissing...;

Deklarieren eines Variant

In Visual Basic wird ein Variant mit der Dim-Anweisung folgendermaßen deklariert:

Dim VariableName As Variant

In Visual C++ müssen Sie eine Variable vom Typ _variant_t deklarieren. Weiter unten sind einige schematische _variant_t-Deklarationen aufgeführt.

Anmerkung Diese Deklarationen bieten nur einen groben Eindruck darüber, was Sie in Ihren eigenen Programmen codieren würden. Weitere Informationen finden Sie in den weiter unten angeführten Beispielen und in der Visual C++-Dokumentation.

_variant_t  VariableName(value);
_variant_t  VariableName((data type cast) value);
_variant_t  VariableName(value, VT_DATATYPE);
_variant_t  VariableName(interface * value, bool fAddRef = true);

Verwenden von Variant-Arrays

In Visual Basic können Variant-Arrays mithilfe der Dim-Anweisung deklariert werden. Sie können aber auch die Array-Funktion verwenden, wie das folgende Beispiel zeigt:

Public Sub ArrayOfVariants
Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim fld As ADODB.Field

cn.Open "DSN=pubs", "sa", ""
rs = cn.OpenSchema(adSchemaColumns, _
                     Array(Empty, Empty, "authors", Empty))
For Each fld in rs.Fields
   Debug.Print "Name = "; fld.Name
Next fld
rs.Close
cn.Close
End Sub

Das folgende Visual C++-Beispiel demonstriert die Verwendung von SafeArray in Verbindung mit einer _variant_t.

Anmerkungen Die folgenden Anmerkungen beziehen sich auf die entsprechenden kommentierten Abschnitte des Codebeispiels.

  1. Auch hier wird wieder die TESTHR()-Inlinefunktion definiert, um die Vorteile des bereits bestehenden Fehlerbehandlungsmechanismus zu nutzen.

  2. Es wird nur ein eindimensionaler Array benötigt. Sie können daher SafeArrayCreateVector statt der allgemeineren SAFEARRAYBOUND-Deklaration und der SafeArrayCreate-Funktion verwenden. Bei Verwendung von SafeArrayCreate würde der entsprechende Code folgendermaßen aussehen:
       SAFEARRAYBOUND   sabound[1];
   sabound[0].lLbound = 0;
   sabound[0].cElements = 4;
   pSa = SafeArrayCreate(VT_VARIANT, 1, sabound);
  3. Das durch die Aufzählungskonstante adSchemaColumns identifizierte Schema ist mit den folgenden vier Einschränkungsspalten verbunden:
    TABLE_CATALOG
    TABLE_SCHEMA
    TABLE_NAME
    COLUMN_NAME
    Folglich wird ein Array aus Werten vom Datentyp Variant mit vier Elementen erstellt. Anschließend wird ein Einschränkungswert angegeben, der der dritten Spalte (TABLE_NAME) entspricht.

    Das zurückgegebene Recordset-Objekt besteht aus mehreren Spalten, einer Teilmenge der Einschränkungsspalten. Für jede zurückgegebene Zeile müssen die Werte der Einschränkungsspalten mit den entsprechenden Einschränkungswerten übereinstimmen.

  4. Benutzer, die sich mit SafeArray auskennen, werden vielleicht überrascht feststellen, dass ein Aufruf von SafeArrayDestroy() vor dem Ende der Sequenz fehlt. Tatsächlich würde das Aufrufen von SafeArrayDestroy() in diesem Fall zu einer Laufzeitausnahme führen. Denn der Destruktor für vtCriteria ruft VariantClear() auf, wenn _variant_t den Gültigkeitsbereich verlässt, was zur Freigabe von SafeArray führt. Ein Aufrufen von SafeArrayDestroy ohne manuelles Löschen von _variant_t würde den Destruktor veranlassen, einen ungültigen SafeArray-Zeiger zu löschen.

    Bei einem Aufruf von SafeArrayDestroy würde der entsprechende Code folgendermaßen aussehen:

       TESTHR(SafeArrayDestroy(pSa));
   vtCriteria.vt = VT_EMPTY;
   vtCriteria.parray = NULL;

    Es ist jedoch einfacher, _variant_t das Verwalten von SafeArray zu überlassen.

#import "c:\Programme\Gemeinsame Dateien\System\ADO\msado15.dll" \
   no_namespace rename("EOF", "EndOfFile")
#include <stdio.h>

// Anmerkung 1
inline void TESTHR( HRESULT _hr )
   { if FAILED(_hr) _com_issue_error(_hr); }

void main(void)
{
   CoInitialize(NULL);
   try
   {
   _RecordsetPtr   pRs("ADODB.Recordset");
   _ConnectionPtr  pCn("ADODB.Connection");
   _variant_t      vtTableName("authors"),
                   vtCriteria;
   long            ix[1];
   SAFEARRAY       *pSa = NULL;

   pCn->Open("DSN=pubs;User ID=sa;pwd=;Provider=MSDASQL;", "", "",
               adConnectUnspecified);
// Anmerkung 2, Anmerkung 3
   pSa = SafeArrayCreateVector(VT_VARIANT, 1, 4);
   if (!pSa) _com_issue_error(E_OUTOFMEMORY);

// TABLE_NAME im dritten Arrayelement (Index gleich 2) angeben.

   ix[0] = 2;
   TESTHR(SafeArrayPutElement(pSa, ix, &vtTableName));

//   Es gibt keinen Variant-Konstruktor für SafeArray, daher müssen Sie
//   den Typ (SafeArray von Variant) und Wert (Zeiger auf ein SafeArray)
//   manuell festlegen.

   vtCriteria.vt = VT_ARRAY | VT_VARIANT;
   vtCriteria.parray = pSa;

   pRs = pCn->OpenSchema(adSchemaColumns, vtCriteria, vtMissing);

   long limit = pRs->GetFields()->Count;
   for (long x = 0; x < limit; x++)
      printf("%d: %s\n", x+1,
         ((char*) pRs->GetFields()->Item[x]->Name));
// Anmerkung 4
   pRs->Close();
   pCn->Close();
   }
   catch (_com_error &e)
   {
   printf("Error:\n");
   printf("Code = %08lx\n", e.Error());
   printf("Code meaning = %s\n", (char*) e.ErrorMessage());
   printf("Source = %s\n", (char*) e.Source());
   printf("Description = %s\n", (char*) e.Description());
   }
   CoUninitialize();
}

Verwenden von GetProperty, PutProperty und PutRefProperty

In Visual Basic ist der Name einer Eigenschaft nicht durch die Angabe der Zugriffsart (Abrufen, Zuordnen oder Zuordnen eines Verweises) qualifiziert.

Public Sub GetPutPutRef
Dim rs As New ADODB.Recordset
Dim cn As New ADODB.Connection
Dim sz as Integer
cn.Open "Provider=sqloledb;Data Source=yourserver;" & _
         "Initial Catalog=pubs;User Id=sa;Password=;"
rs.PageSize = 10
sz = rs.PageSize
rs.ActiveConnection = cn
rs.Open "authors",,adOpenStatic
' ...
rs.Close
cn.Close
End Sub

Das folgende Visual C++-Beispiel demonstriert die Verwendung von Get Property, Put Property und PutRef Property.

Anmerkungen Die folgenden Anmerkungen beziehen sich auf die entsprechenden kommentierten Abschnitte des Codebeispiels.

  1. Dieses Beispiel verwendet zwei Arten eines fehlenden Zeichenfolgenarguments: Eine explizite Konstante mit dem Namen strMissing und eine Zeichenfolge, die der Compiler verwendet, um ein temporäres _bstr_t zu erstellen, das im Gültigkeitsbereich der Open-Methode vorhanden ist.

  2. Es ist nicht nötig, den Operanden von rs->PutRefActiveConnection(cn) in (IDispatch *) zu konvertieren, da der Operand bereits den Typ (IDispatch *) hat.
#import "c:\Programme\Gemeinsame Dateien\System\ADO\msado15.dll" \
   no_namespace rename("EOF", "EndOfFile")
#include <stdio.h>

void main(void)
{
   CoInitialize(NULL);
   try
   {
      _ConnectionPtr  cn("ADODB.Connection");
      _RecordsetPtr   rs("ADODB.Recordset");
      _bstr_t         strMissing(L"");
      long            oldPgSz = 0,
                      newPgSz = 5;

// Anmerkung 1
      cn->Open("Provider=sqloledb;Data Source=a-tima10;"
         "Initial Catalog=pubs;User Id=sa;Password=;",
         strMissing, "",
         adConnectUnspecified);

      oldPgSz = rs->GetPageSize();
   // - oder -
      oldPgSz = rs->PageSize;

      rs->PutPageSize(newPgSz);
   // - oder -
      rs->PageSize = newPgSz;

// Anmerkung 2
      rs->PutRefActiveConnection( cn );
      rs->Open("authors", vtMissing, adOpenStatic, adLockReadOnly,
               adCmdTable);
      printf("Original pagesize = %d, new pagesize = %d\n", oldPgSz,
               rs->GetPageSize());
      rs->Close();
      cn->Close();
   }
   catch (_com_error &e)
   {
      printf("Description = %s\n", (char*) e.Description());
   }
   ::CoUninitialize();
}

Verwenden von GetItem(x) und Item[x]

Das folgende Visual Basic-Beispiel zeigt die Standardsyntax und die alternative Syntax für Item().

Public Sub GetItemItem
Dim rs As New ADODB.Recordset
Dim name as String
rs = rs.Open "authors", "DSN=pubs;", adOpenDynamic, _
         adLockBatchOptimistic, adTable
name = rs(0)
' - oder -
name = rs.Fields.Item(0)
rs(0) = "Test"
rs.UpdateBatch
' name wiederherstellen
rs(0) = name
rs.UpdateBatch
rs.Close
End Sub

In diesem Visual C++-Beispiel wird die Verwendung von Item gezeigt.

Anmerkung Die folgende Anmerkung bezieht sich auf die entsprechenden kommentierten Abschnitte des Codebeispiels.

  1. Beim Zugreifen auf die Auflistung mit Item muss der Index (die 2) in einen long-Datentyp konvertiert werden, damit ein geeigneter Konstruktor aufgerufen wird.
#import "c:\Programme\Gemeinsame Dateien\System\ADO\msado15.dll" \
   no_namespace rename("EOF", "EndOfFile")
#include <stdio.h>

void main(void)
{
   CoInitialize(NULL);
   try {
      _RecordsetPtr   rs("ADODB.Recordset");
      _variant_t      vtFirstName;

      rs->Open("authors",
               "Provider=sqloledb;Data Source=a-tima10;"
               "Initial Catalog=pubs;User Id=sa;Password=;",
               adOpenStatic, adLockOptimistic, adCmdTable);
      rs->MoveFirst();

// Anmerkung 1. Ein Feld abrufen.
      vtFirstName = rs->Fields->GetItem((long)2)->GetValue();
   // - oder -
      vtFirstName = rs->Fields->Item[(long)2]->Value;

      printf( "First name = '%s'\n", (char*) ((_bstr_t) vtFirstName));

      rs->Fields->GetItem((long)2)->Value = L"TEST";
      rs->Update(vtMissing, vtMissing);

   // Namen wiederherstellen
      rs->Fields->GetItem((long)2)->PutValue(vtFirstName);
      // - oder -
      rs->Fields->GetItem((long)2)->Value = vtFirstName;
      rs->Update(vtMissing, vtMissing);
      rs->Close();
   }
   catch (_com_error &e)
   {
      printf("Description = '%s'\n", (char*) e.Description());
   }
   ::CoUninitialize();
}

Konvertieren von Zeigern auf ADO-Objekte mit (IDispatch *)

Das folgende Visual C++-Beispiel zeigt die Verwendung von (IDispatch *) bei der Konvertierung von Zeigern auf ADO-Objekte.

Anmerkungen Die folgenden Anmerkungen beziehen sich auf die entsprechenden kommentierten Abschnitte des Codebeispiels.

  1. In einem explizit codierten Variant-Datentyp wird ein geöffnetes Connection-Objekt angegeben. Dann wird eine Konvertierung in (IDispatch *) durchgeführt, damit der richtige Konstruktor aufgerufen wird. Außerdem wird der zweite _variant_t-Parameter auf den Standardwert true festgelegt, so dass der Objektreferenzzähler den richtigen Wert aufweist, wenn die Recordset::Open-Operation endet.

  2. Der Ausdruck (bstr t) ist keine Konvertierung, sondern ein _variant_t-Operator, der eine _bstr_t-Zeichenfolge aus dem Variant-Datentyp extrahiert, der von Value zurückgegeben wird.

    Auch der Ausdruck (char *) ist keine Konvertierung, sondern ein _bstr_t-Operator, der einen Zeiger auf die eingeschlossene Zeichenfolge in einem _bstr_t-Objekt extrahiert.

    Dieser Abschnitt des Codes zeigt einige nützliche Verhaltensweisen der _variant_t- und _bstr_t-Operatoren.

#import "c:\Programme\Gemeinsame Dateien\System\ADO\msado15.dll" \
no_namespace rename("EOF", "EndOfFile")

#include <stdio.h>

void main(void)
{
   CoInitialize(NULL);
   try
   {
      _ConnectionPtr pConn("ADODB.Connection");
      _RecordsetPtr  pRst("ADODB.Recordset");

      pConn->Open("Provider=sqloledb;Data Source=a-tima10;"
         "Initial Catalog=pubs;User Id=sa;Password=;",
         "", "", adConnectUnspecified);
// Anmerkung 1
      pRst->Open(
         "authors",
         _variant_t((IDispatch *) pConn, true),
         adOpenStatic,
         adLockReadOnly,
         adCmdTable);
      pRst->MoveLast();
// Anmerkung 2
      printf("Last name is '%s %s'\n",
            (char*) ((_bstr_t) pRst->GetFields()->GetItem("au_fname")->GetValue()),
            (char*) ((_bstr_t) pRst->Fields->Item["au_lname"]->Value));

      pRst->Close();
      pConn->Close();
   }
   catch (_com_error &e)
   {
      printf("Description = '%s'\n", (char*) e.Description());
   }
::CoUninitialize();
}


Visual C++-Erweiterungen für ADO

Eine der aufwändigsten Arbeiten für Visual C++-Programmierer beim Abrufen von Daten mit ADO besteht darin, als VARIANT-Datentyp zurückgegebene Daten in einen C++-Datentyp zu konvertieren und anschließend die konvertierten Daten in einer Klasse oder Struktur zu speichern. Abgesehen davon, dass diese Aufgabe sehr mühsam ist, wird durch das Abrufen von C++-Daten über einen VARIANT-Datentyp auch die Leistung vermindert.

ADO stellt eine Schnittstelle zur Verfügung, die das Abrufen von Daten in systemeigene C/C++-Datentypen unterstützt, ohne dass ein VARIANT-Datentyp verwendet werden muss; außerdem verfügt es auch über Präprozessormakros, durch die die Verwendung der Schnittstelle vereinfacht wird. Das Ergebnis ist ein flexibles Werkzeug, das einfach zu verwenden und sehr leistungsstark ist.

In einem häufig vorkommenden C/C++-Clientszenario wird ein Datensatz in einem Recordset-Objekt an eine C/C++-Struktur oder -Klasse gebunden, die systemeigene C/C++-Typen enthält. Wenn Sie Daten des Typs VARIANT verwenden, müssen Sie Konvertierungscode schreiben, der VARIANT-Daten in systemeigene C/C++-Typen konvertiert. Die Visual C++-Erweiterungen für ADO sind dazu bestimmt, dieses Szenario für Visual C++-Programmierer erheblich zu vereinfachen.

Weitere Informationen zu den Visual C++-Erweiterungen für ADO finden Sie unter den folgenden Themen:

  • Verwenden der Visual C++-Erweiterungen für ADO

  • Headerdatei der Visual C++-Erweiterungen im Detail

  • ADO mit Visual C++-Erweiterungen (Beispiel)


Verwenden der Visual C++-Erweiterungen für ADO

Die IADORecordBinding-Schnittstelle

Durch die Microsoft Visual C++-Erweiterungen für ADO werden die Felder eines Recordset-Objekts an C/C++-Variablen gebunden. Immer dann, wenn sich die aktuelle Zeile des gebundenen Recordset-Objekts ändert, werden die Inhalte aller gebundenen Felder des Recordset in die C/C++-Variablen kopiert. Gegebenenfalls werden die kopierten Daten in den deklarierten Datentyp der C/C++-Variable konvertiert.

Die BindToRecordset-Methode der IADORecordBinding-Schnittstelle bindet Felder an C/C++-Variablen. Die AddNew-Methode fügt eine neue Zeile zum gebundenen Recordset hinzu. Die Update-Methode füllt die Felder in neuen Zeilen des Recordset auf oder aktualisiert Felder in bereits vorhandenen Zeilen mit den Werten der C/C++-Variablen.

Die IADORecordBinding-Schnittstelle ist durch das Recordset-Objekt implementiert. Sie brauchen die Implementierung nicht selbst zu codieren.

Bindungseinträge

Durch die Visual C++-Erweiterungen für ADO werden die Felder eines Recordset-Objekts bestimmten C/C++-Variablen zugeordnet. Die Definition einer Zuordnung eines Feldes zu einer Variablen wird Bindungseintrag genannt. Makros stellen Bindungseinträge für numerische Variablen, Variablen mit fester Länge und Variablen mit variabler Länge zur Verfügung. Die Bindungseinträge und C/C++-Variablen sind in einer Klasse deklariert, die sich aus der zu den Visual C++-Erweiterungen gehörenden Klasse CADORecordBinding ableitet. Die CADORecordBinding-Klasse ist intern durch die Makros für die Bindungseinträge definiert.

ADO ordnet die Parameter dieser Makros intern einer DBBINDING-Struktur von OLE DB zu und erstellt ein Accessor-Objekt von OLE DB, um die Datenbewegungen und -konvertierungen zwischen Feldern und Variablen zu verwalten. Mit OLE DB definierte Daten bestehen aus drei Teilen: Einem Puffer, in dem die Daten gespeichert sind, einem Status, der anzeigt, ob der Inhalt eines Feldes erfolgreich im Puffer gespeichert wurde bzw. wie der Variableninhalt in dem Feld wiederhergestellt werden sollte, sowie der Länge der Daten. (Weitere Informationen hierzu finden Sie in Chapter 6: Getting and Setting Data der OLE DB Programmer's Reference.)

Headerdatei

Schließen Sie die folgende Datei in Ihre Anwendung ein, damit Sie die Visual C++-Erweiterungen für ADO verwenden können:

#include <icrsint.h>

Binden von Recordset-Feldern

So binden Sie Recordset-Felder an C/C++-Variablen

  1. Erstellen Sie eine von der CADORecordsetBinding-Klasse abgeleitete Klasse.

  2. Legen Sie in der abgeleiteten Klasse die Bindungseinträge und die entsprechenden C/C++-Variablen fest. Setzen Sie die Bindungseinträge zwischen die Makros BEGIN_ADO_BINDING und END_ADO_BINDING. Schließen Sie die Makroaufrufe nicht mit Kommas oder Semikolons ab. Geeignete Begrenzungszeichen werden automatisch von jedem Makro festgelegt.

    Geben Sie einen Bindungseintrag für jedes Feld an, das einer C/C++-Variable zugeordnet werden soll. Verwenden Sie dazu das geeignete Element aus der mit ADO_FIXED_LENGTH_ENTRY, ADO_NUMERIC_ENTRY und ADO_VARIABLE_LENGTH_ENTRY gegebenen Gruppe von Makros.

  3. Erstellen Sie in der Anwendung eine Instanz der von CADORecordsetBinding abgeleiteten Klasse. Rufen Sie die IADORecordBinding-Schnittstelle aus dem Recordset-Objekts ab. Rufen Sie dann die BindToRecordset-Methode auf, um die Recordset-Felder an die C/C++-Variablen zu binden.

Weitere Informationen hierzu finden Sie unter Visual C++-Erweiterungen für ADO (Beispiel).

Schnittstellenmethoden

Die IADORecordBinding-Schnittstelle umfasst drei Methoden, BindToRecordset, AddNew und Update. Das einzige Argument für jede dieser Methoden ist ein Zeiger auf eine Instanz der von CADORecordBinding abgeleiteten Klasse. Deshalb können die Methoden AddNew und Update keinen Parameter ihrer gleichnamigen ADO-Methoden angeben.

Syntax

Die BindToRecordset-Methode verknüpft die Recordset-Felder mit C/C++-Variablen.

BindToRecordset(CADORecordBinding *binding)

Die AddNew-Methode ruft ihre gleichnamige Entsprechung auf, die AddNew-Methode von ADO, um eine neue Zeile zum Recordset hinzuzufügen.

AddNew(CADORecordBinding *binding)

Die Update-Methode ruft ihre gleichnamige Entsprechung auf, die Update-Methode von ADO, um das Recordset-Objekt zu aktualisieren.

Update(CADORecordBinding *binding)

Makros für Bindungseinträge

Die Makros für Bindungseinträge definieren die Verknüpfung eines Recordset-Feldes mit einer Variablen. Ein Makro am Anfang und ein zweites Makro am Ende begrenzen die Gruppe der Bindungseinträge.

Gruppen von Makros werden für Daten mit fester Länge wie z. B. adDate oder adBoolean, für numerische Daten wie z. B. adTinyInt, adInteger oder adDouble, und für Daten mit variabler Länge wie z. B. adChar, adVarChar oder adVarBinary zur Verfügung gestellt. Alle numerischen Typen außer adVarNumeric sind ebenfalls Datentypen fester Länge. Jede Gruppe verwendet andere Parameter, so dass uninteressante Bindungsinformationen ausgeschlossen werden können.

(Weitere Informationen hierzu finden Sie in Anhang A: Datentypen der OLE DB Programmer's Reference.)

Startmakro für Bindungseinträge

BEGIN_ADO_BINDING(Class)

Daten fester Länge

ADO_FIXED_LENGTH_ENTRY(Ordinal, DataType, Buffer, Status, Modify)
ADO_FIXED_LENGTH_ENTRY2(Ordinal, DataType, Buffer, Modify)

Numerische Daten

ADO_NUMERIC_ENTRY(Ordinal, DataType, Buffer, Precision, Scale, Status,
Modify)
ADO_NUMERIC_ENTRY2(Ordinal, DataType, Buffer, Precision, Scale, Modify)

Daten variabler Länge

ADO_VARIABLE_LENGTH_ENTRY(Ordinal, DataType, Buffer, Size, Status,
Length, Modify)
ADO_VARIABLE_LENGTH_ENTRY2(Ordinal, DataType, Buffer, Size, Status,
Modify)
ADO_VARIABLE_LENGTH_ENTRY3(Ordinal, DataType, Buffer, Size, Length,
Modify)
ADO_VARIABLE_LENGTH_ENTRY4(Ordinal, DataType, Buffer, Size, Modify)

Endmakro für Bindungseinträge

END_ADO_BINDING()

Parameter | Beschreibung
Class | Klasse, in der die Bindungseinträge und die C/C++-Variablen definiert sind.
Ordinal | Ordinalzahl für das Recordset-Feld, das der C/C++-Variablen entspricht. Die Zählung beginnt mit 1.
DataType | ADO-Datentypäquivalent der C/C++-Variablen (unter DataTypeEnum ist eine Liste der zulässigen Datentypen zu finden). Der Wert des Recordset-Feldes wird gegebenenfalls in diesen Datentyp konvertiert.
Buffer | Name der C/C++-Variablen, in der der Wert des Recordset-Feldes gespeichert wird.
Size | Maximale Größe von Buffer in Bytes. Falls Buffer eine Zeichenfolge mit variabler Länge enthalten soll, muss Platz für ein terminierendes Nullzeichen vorhanden sein.
Status | Name einer Variablen, die anzeigt, ob Buffer einen gültigen Inhalt hat und ob die Umwandlung des Feldinhalts in einen DataType-Wert erfolgreich verlaufen ist. Die zwei wichtigsten Werte für diese Variable sind adFldOK, der anzeigt, dass die Konvertierung erfolgreich war, und adFldNull, der anzeigt, dass das Feld den Wert Null hatte (und nicht einfach leer war). Die für Status möglichen Werte sind in der nachfolgenden Tabelle zu den Statuswerten aufgelistet.
Modify | Ein boolesches Attribut. TRUE zeigt an, dass ADO das entsprechende Recordset-Feld mit dem in Buffer enthaltenen Wert aktualisieren darf. Legen Sie den booleschen Parameter modify auf TRUE fest, damit ADO das gebundene Feld aktualisieren kann, und auf FALSE, wenn Sie das Feld nur überprüfen, aber nicht ändern möchten.
Precision | Anzahl der Ziffern, die in einer numerischen Variable dargestellt werden können.
Scale | Anzahl der Dezimalstellen in einer numerischen Variable.
Length | Name einer vier Byte langen Variablen, die die tatsächliche Länge der in Buffer gespeicherten Daten enthält.

Status-Werte

Der Werte der Status-Variablen gibt an, ob der Inhalt eines Feldes erfolgreich in eine Variable kopiert wurde.

Beim Festlegen von Daten kann Status auf adFldNull festgelegt werden, um anzuzeigen, dass das Recordset-Feld auf Null festgelegt werden sollte.

Konstante | Wert | Beschreibung
adFldOK | 0 | Ein Feldwert ungleich Null wurde zurückgegeben.
adFldBadAccessor | 1 | Angegebene Bindung ist ungültig.
adFldCantConvertValue | 2 | Wert konnte nicht konvertiert werden (jedoch nicht wegen unverträglicher Vorzeichen oder Datenüberlauf).
adFldNull | 3 | Zeigt beim Abrufen eines Feldinhalts an, dass ein Null-Wert zurückgegeben wurde. Zeigt beim Festlegen eines Feldes an, dass das Feld auf Null festgelegt werden sollte, wenn das Feld selbst den Null-Wert nicht codieren kann (beispielsweise ein Array mit Zeichen oder ein Integer).
adFldTruncated | 4 | Daten mit variabler Länge oder numerischer Daten wurden abgeschnitten.
adFldSignMismatch | 5 | Wert hat ein Vorzeichen, während der Datentyp kein Vorzeichen hat.
adFldDataOverFlow | 6 | Wert ist zu groß, um in Variable des gegebenen Datentyps gespeichert zu werden.
adFldCantCreate | 7 | Unbekannter Spaltentyp, Feld bereits geöffnet.
adFldUnavailable | 8 | Feldwert konnte nicht bestimmt werden, z. B. in einem neuen, nicht verknüpften Feld ohne Standardwert.
adFldPermissionDenied | 9 | Keine Berechtigung für den Schreibzugriff auf Daten beim Aktualisieren.
adFldIntegrityViolation | 10 | Feldwert würde beim Aktualisieren die Spaltenintegrität verletzen.
adFldSchemaViolation | 11 | Feldwert würde beim Aktualisieren das Spaltenschema verletzen.
adFldBadStatus | 12 | Ungültiger Statusparameter während Aktualisierung.
adFldDefault | 13 | Beim Aktualisieren wurde ein Standardwert verwendet.


Headerdatei der Visual C++-Erweiterungen im Detail

Die im Folgenden aufgelistete Headerdatei icrsint.h zeigt die Details der Schnittstelle, mit deren Hilfe Clients Felder eines Recordset-Objekts in Variablen abrufen können, die in einer von CADORecordBinding abgeleiteten Klasse definiert sind. Für jedes Feld, auf das zugegriffen werden soll, muss ein ADO-Bindungsmakro angegeben werden.

#ifndef _ICRSINT_H_
#define _ICRSINT_H_

#include <olectl.h>
#include <stddef.h>

// vorwärts
class CADORecordBinding;

#define classoffset(base, derived) ((DWORD)(static_cast<base*>((derived*)8))-8)

enum ADOFieldStatusEnum
{
    adFldOK = 0,
    adFldBadAccessor = 1,
    adFldCantConvertValue = 2,
    adFldNull = 3,
    adFldTruncated = 4,
    adFldSignMismatch = 5,
    adFldDataOverFlow = 6,
    adFldCantCreate = 7,
    adFldUnavailable = 8,
    adFldPermissionDenied = 9,
    adFldIntegrityViolation = 10,
    adFldSchemaViolation = 11,
    adFldBadStatus = 12,
    adFldDefault = 13
};

typedef struct stADO_BINDING_ENTRY
{
    ULONG      ulOrdinal;
    WORD       wDataType;
    BYTE       bPrecision;
    BYTE       bScale;
    ULONG      ulSize;
    ULONG      ulBufferOffset;
    ULONG      ulStatusOffset;
    ULONG      ulLengthOffset;
    ULONG      ulADORecordBindingOffSet;
    BOOL       fModify;
} ADO_BINDING_ENTRY;

#define BEGIN_ADO_BINDING(cls) public: \
    typedef cls ADORowClass; \
    const ADO_BINDING_ENTRY* STDMETHODCALLTYPE GetADOBindingEntries() { \
    static const ADO_BINDING_ENTRY rgADOBindingEntries[] = {

//
// Nicht numerische Daten fester Länge
//
#define ADO_FIXED_LENGTH_ENTRY(Ordinal, DataType, Buffer, Status, Modify)\
    {Ordinal, \
    DataType, \
    0, \
    0, \
    0, \
    offsetof(ADORowClass, Buffer), \
    offsetof(ADORowClass, Status), \
    0, \
    classoffset(CADORecordBinding, ADORowClass), \
    Modify},

#define ADO_FIXED_LENGTH_ENTRY2(Ordinal, DataType, Buffer, Modify)\
    {Ordinal, \
    DataType, \
    0, \
    0, \
    0, \
    offsetof(ADORowClass, Buffer), \
    0, \
    0, \
    classoffset(CADORecordBinding, ADORowClass), \
    Modify},

//
// Numerische Daten
//
#define ADO_NUMERIC_ENTRY(Ordinal, DataType, Buffer, Precision, Scale, Status, Modify)\
    {Ordinal, \
    DataType, \
    Precision, \
    Scale, \
    0, \
    offsetof(ADORowClass, Buffer), \
    offsetof(ADORowClass, Status), \
    0, \
    classoffset(CADORecordBinding, ADORowClass), \
    Modify},

#define ADO_NUMERIC_ENTRY2(Ordinal, DataType, Buffer, Precision, Scale, Modify)\
    {Ordinal, \
    DataType, \
    Precision, \
    Scale, \
    0, \
    offsetof(ADORowClass, Buffer), \
    0, \
    0, \
    classoffset(CADORecordBinding, ADORowClass), \
    Modify},

//
// Daten variabler Länge
//
#define ADO_VARIABLE_LENGTH_ENTRY(Ordinal, DataType, Buffer, Size, Status, Length, Modify)\
    {Ordinal, \
    DataType, \
    0, \
    0, \
    Size, \
    offsetof(ADORowClass, Buffer), \
    offsetof(ADORowClass, Status), \
    offsetof(ADORowClass, Length), \
    classoffset(CADORecordBinding, ADORowClass), \
    Modify},

#define ADO_VARIABLE_LENGTH_ENTRY2(Ordinal, DataType, Buffer, Size, Status, Modify)\
    {Ordinal, \
    DataType, \
    0, \
    0, \
    Size, \
    offsetof(ADORowClass, Buffer), \
    offsetof(ADORowClass, Status), \
    0, \
    classoffset(CADORecordBinding, ADORowClass), \
    Modify},

#define ADO_VARIABLE_LENGTH_ENTRY3(Ordinal, DataType, Buffer, Size, Length, Modify)\
    {Ordinal, \
    DataType, \
    0, \
    0, \
    Size, \
    offsetof(ADORowClass, Buffer), \
    0, \
    offsetof(ADORowClass, Length), \
    classoffset(CADORecordBinding, ADORowClass), \
    Modify},

#define ADO_VARIABLE_LENGTH_ENTRY4(Ordinal, DataType, Buffer, Size, Modify)\
    {Ordinal, \
    DataType, \
    0, \
    0, \
    Size, \
    offsetof(ADORowClass, Buffer), \
    0, \
    0, \
    classoffset(CADORecordBinding, ADORowClass), \
    Modify},

#define END_ADO_BINDING()   {0, adEmpty, 0, 0, 0, 0, 0, 0, 0, FALSE}};\
    return rgADOBindingEntries;}

//
// Schnittstelle, die von der Client-'Datensatz'-Klasse unterstützt
// werden muss. Die ADO-Bindungseinträge stellen die Implementierung für
// diese Schnittstelle bereit.
//
class CADORecordBinding
{
public:
    STDMETHOD_(const ADO_BINDING_ENTRY*, GetADOBindingEntries) (VOID) PURE;
};

//
// Schnittstelle, die es dem Client ermöglicht, einen Datensatz
// in Klassendatenmitglieder hinein abzurufen.
//
struct __declspec(uuid("00000544-0000-0010-8000-00aa006d2ea4")) IADORecordBinding;
DECLARE_INTERFACE_(IADORecordBinding, IUnknown)
{
public:
    STDMETHOD(BindToRecordset) (CADORecordBinding *pAdoRecordBinding) PURE;
    STDMETHOD(AddNew) (CADORecordBinding *pAdoRecordBinding) PURE;
    STDMETHOD(Update) (CADORecordBinding *pAdoRecordBinding) PURE;
};

#endif // !_ICRSINT_H_


ADO mit Visual C++-Erweiterungen (Beispiel)

Das folgende Programm zeigt, wie Werte aus Feldern abgerufen und in C/C++-Variablen konvertiert werden.

Dieses Beispiel nutzt außerdem die Vorteile der so genannten intelligenten Zeiger, die automatisch die COM-spezifischen Details handhaben, die mit dem Aufruf von QueryInterface und des Referenzzählers für die IADORecordBinding-Schnittstelle verbunden sind.

Ohne intelligente Zeiger würde der Code folgendermaßen aussehen:

IADORecordBinding   *picRs = NULL;
...
TESTHR(pRs->QueryInterface(
          __uuidof(IADORecordBinding), (LPVOID*)&picRs));
...
if (picRs) picRs->Release();

Bei Verwendung intelligenter Zeiger wird der IADOrecordBindingPtr-Typ mit der folgenden Anweisung von der IADORecordBinding-Schnittstelle abgeleitet:

_COM_SMARTPTR_TYPEDEF(IADORecordBinding, __uuidof(IADORecordBinding));

Eine Instanziierung dieses Zeigers erfolgt z. B. folgendermaßen:

IADORecordBindingPtr picRs(pRs);

Da die Visual C++-Erweiterungen durch das Recordset-Objekt implementiert sind, übernimmt der Konstruktor des intelligenten Zeigers picRs als Argument den _RecordsetPtr-Zeiger pRs. Der Konstruktor ruft QueryInterface mit pRs auf, um einen Zeiger auf die IADORecordBinding-Schnittstelle zu finden.

// Beispiel für Visual C++-Erweiterungen
#import "c:\Programme\Gemeinsame Dateien\System\ADO\msado15.dll" \
   no_namespace rename("EOF", "EndOfFile")

#include <stdio.h>
#include <icrsint.h>
_COM_SMARTPTR_TYPEDEF(IADORecordBinding, __uuidof(IADORecordBinding));

inline void TESTHR(HRESULT _hr) { if FAILED(_hr) _com_issue_error(_hr); }

class CCustomRs : public CADORecordBinding
{
BEGIN_ADO_BINDING(CCustomRs)
   ADO_VARIABLE_LENGTH_ENTRY2(2, adVarChar, m_ch_fname,
                        sizeof(m_ch_fname), m_ul_fnameStatus, false)
   ADO_VARIABLE_LENGTH_ENTRY2(4, adVarChar, m_ch_lname,
                        sizeof(m_ch_lname), m_ul_lnameStatus, false)
END_ADO_BINDING()
public:
   CHAR    m_ch_fname[22];
   CHAR    m_ch_lname[32];
   ULONG   m_ul_fnameStatus;
   ULONG   m_ul_lnameStatus;
};

void main(void)
{
   ::CoInitialize(NULL);
   try
      {
      _RecordsetPtr pRs("ADODB.Recordset");
      CCustomRs rs;
      IADORecordBindingPtr picRs(pRs);

      pRs->Open("SELECT * FROM Employee ORDER BY lname",
         "dsn=pubs;uid=sa;pwd=;",
         adOpenStatic, adLockOptimistic, adCmdText);

      TESTHR(picRs->BindToRecordset(&rs));

      while (!pRs->EndOfFile)
         {
      // Daten in den Variablen der C++-Instanz CCustomRs verarbeiten.
         printf("Name = %s %s\n",
            (rs.m_ul_fnameStatus == adFldOK ? rs.m_ch_fname: "<Error>"),
            (rs.m_ul_lnameStatus == adFldOK ? rs.m_ch_lname: "<Error>"));

      // Zur nächsten Zeile im Recordset wechseln.
      // Felder in der neuen Zeile werden automatisch
      // in den Variablen der C++-Instanz CCustomRs platziert.

         pRs->MoveNext();
         }
      }
   catch (_com_error &e )
      {
      printf("Error:\n");
      printf("Code = %08lx\n", e.Error());
      printf("Meaning = %s\n", e.ErrorMessage());
      printf("Source = %s\n", (LPCSTR) e.Source());
      printf("Description = %s\n", (LPCSTR) e.Description());
      }
   ::CoUninitialize();
}


Syntaxindex (COM): ADO für Visual C++

Das ADO-Sprachverzeichnis verwendet die Programmiersprache Microsoft Visual Basic, um die Syntax der Methoden und Eigenschaften von ADO zu erläutern. Dieser Index bietet einen Querverweis auf die Teile des ADO-Sprachverzeichnisses, die auf Microsoft Visual C++ basieren.

Falls Sie die #import-Direktive in Ihrer Anwendung verwenden, wird eine Headerdatei generiert, mit der Sie eine Syntax verwenden können, die der von Microsoft Visual Basic verwendeten Syntax ähnelt. Eigenschaftsnamen in der Form get_PropertyName und put_PropertyName können so behandelt werden, als seien sie einfach als PropertyName deklariert. Eine Eigenschaft kann dann wie ein Datenelement statt wie eine Funktion behandelt werden.

Alle Methoden, Eigenschaften und Ereignisse sind Funktionen, die HRESULT zurückgeben, das Sie darauf überprüfen können, ob die Funktion erfolgreich ausgeführt wurde.

Für die folgenden Elemente wird die Visual C++-Syntax der dazugehörigen Methoden und Eigenschaften aufgelistet:

  • ADO-Auflistungen

  • Command-Objekt

  • Connection-Objekt

  • Error-Objekt

  • Field-Objekt

  • Parameter-Objekt

  • Record-Objekt

  • Recordset-Objekt

  • Stream-Objekt


Auflistungen (Syntax von ADO für Visual C++)

Parameter

Methoden

Append(IDispatch *Object)

Delete(VARIANT Index)

Refresh(void)

Eigenschaften

get_Count(long *c)

get_Item(VARIANT Index, _ADOParameter **ppvObject)

Fields-Auflistung

Methoden

Append(BSTR bstrName, DataTypeEnum Type, long DefinedSize,
            FieldAttributeEnum Attrib)

Delete(VARIANT Index)

Refresh(void)

Eigenschaften

get_Count(long *c)

get_Item(VARIANT Index, ADOField **ppvObject)

Errors-Auflistung

Methoden

Clear(void)

Refresh(void)

Eigenschaften

get_Count(long *c)

get_Item(VARIANT Index, ADOError **ppvObject)

Eigenschaften

Methoden

Refresh(void)

Eigenschaften

get_Count(long *c)

get_Item(VARIANT Index, ADOProperty **ppvObject)


Command-Objekt (Syntax von ADO für Visual C++)

Methoden

Cancel(void)

CreateParameter(BSTR Name, DataTypeEnum Type,
                        ParameterDirectionEnum Direction, long Size, VARIANT Value,
                        _ADOParameter **ppiprm)

Execute(VARIANT *RecordsAffected, VARIANT *Parameters, long Options,
            _ADORecordset **ppirs)

Eigenschaften

get_ActiveConnection(_ADOConnection **ppvObject)
put_ActiveConnection(VARIANT vConn)
putref_ActiveConnection(_ADOConnection *pCon)

get_CommandText(BSTR *pbstr)
put_CommandText(BSTR bstr)

get_CommandTimeout(LONG *pl)
put_CommandTimeout(LONG Timeout)

get_CommandType(CommandTypeEnum *plCmdType)
put_CommandType(CommandTypeEnum lCmdType)

get_Name(BSTR *pbstrName)
put_Name(BSTR bstrName)

get_Prepared(VARIANT_BOOL *pfPrepared)
put_Prepared(VARIANT_BOOL fPrepared)

get_State(LONG *plObjState)

get_Parameters(ADOParameters **ppvObject)


Connection-Objekt (Syntax von ADO für Visual C++)

Methoden

BeginTrans(long *TransactionLevel)

CommitTrans(void)

RollbackTrans(void)

Cancel(void)

Close(void)

Execute(BSTR CommandText, VARIANT *RecordsAffected, long Options,
            _ADORecordset **ppiRset)

Open(BSTR ConnectionString, BSTR UserID, BSTR Password, long Options)

OpenSchema(SchemaEnum Schema, VARIANT Restrictions, VARIANT SchemaID,
             _ADORecordset **pprset)

Eigenschaften

get_Attributes(long *plAttr)
put_Attributes(long lAttr)

get_CommandTimeout(LONG *plTimeout)
put_CommandTimeout(LONG lTimeout)

get_ConnectionString(BSTR *pbstr)
put_ConnectionString(BSTR bstr)

get_ConnectionTimeout(LONG *plTimeout)
put_ConnectionTimeout(LONG lTimeout)

get_CursorLocation(CursorLocationEnum *plCursorLoc)
put_CursorLocation(CursorLocationEnum lCursorLoc)

get_DefaultDatabase(BSTR *pbstr)
put_DefaultDatabase(BSTR bstr)

get_IsolationLevel(IsolationLevelEnum *Level)
put_IsolationLevel(IsolationLevelEnum Level)

get_Mode(ConnectModeEnum *plMode)
put_Mode(ConnectModeEnum lMode)

get_Provider(BSTR *pbstr)
put_Provider(BSTR Provider)

get_State(LONG *plObjState)

get_Version(BSTR *pbstr)

get_Errors(ADOErrors **ppvObject)

Ereignisse

BeginTransComplete(LONG TransactionLevel, ADOError *pError,
                        EventStatusEnum *adStatus, _ADOConnection *pConnection)

CommitTransComplete(ADOError *pError, EventStatusEnum *adStatus,
                        _ADOConnection *pConnection)

ConnectComplete(ADOError *pError, EventStatusEnum *adStatus,
                    _ADOConnection *pConnection)

Disconnect(EventStatusEnum *adStatus, _ADOConnection *pConnection)

ExecuteComplete(LONG RecordsAffected, ADOError *pError,
                    EventStatusEnum *adStatus, _ADOCommand *pCommand,
                    _ADORecordset *pRecordset, _ADOConnection *pConnection)

InfoMessage(ADOError *pError, EventStatusEnum *adStatus,
                _ADOConnection *pConnection)

RollbackTransComplete(ADOError *pError, EventStatusEnum *adStatus,
                            _ADOConnection *pConnection)

WillConnect(BSTR *ConnectionString, BSTR *UserID, BSTR *Password,
                    long *Options, EventStatusEnum *adStatus,
                    _ADOConnection *pConnection)

WillExecute(BSTR *Source, CursorTypeEnum *CursorType,
                    LockTypeEnum *LockType, long *Options,
                    EventStatusEnum *adStatus, _ADOCommand *pCommand,
                    _ADORecordset *pRecordset, _ADOConnection *pConnection)


Error-Objekt (Syntax von ADO für Visual C++)

Eigenschaften

get_Description(BSTR *pbstr)

get_NativeError(long *pl)

get_Number(long *pl)

get_Source(BSTR *pbstr)

get_SQLState(BSTR *pbstr)


Field-Objekt (Syntax von ADO für Visual C++)

Methoden

AppendChunk(VARIANT Data)

GetChunk(long Length, VARIANT *pvar)

Eigenschaften

get_ActualSize(long *pl)

get_Attributes(long *pl)
put_Attributes(long lAttributes)

get_DataFormat(IUnknown **ppiDF)
put_DataFormat(IUnknown *piDF)

get_DefinedSize(long *pl)
put_DefinedSize(long lSize)

get_Name(BSTR *pbstr)

get_NumericScale(BYTE *pbNumericScale)
put_NumericScale(BYTE bScale)

get_OriginalValue(VARIANT *pvar)

get_Precision(BYTE *pbPrecision)
put_Precision(BYTE bPrecision)

get_Type(DataTypeEnum *pDataType)
put_Type(DataTypeEnum DataType)

get_UnderlyingValue(VARIANT *pvar)

get_Value(VARIANT *pvar)
put_Value(VARIANT Val)


Parameter-Objekt (Syntax von ADO für Visual C++)

Methoden

AppendChunk(VARIANT Val)

Eigenschaften

get_Attributes(LONG *plParmAttribs)
put_Attributes(LONG lParmAttribs)

get_Direction(ParameterDirectionEnum *plParmDirection)
put_Direction(ParameterDirectionEnum lParmDirection)

get_Name(BSTR *pbstr)
put_Name(BSTR bstr)

get_NumericScale(BYTE *pbScale)
put_NumericScale(BYTE bScale)

get_Precision(BYTE *pbPrecision)
put_Precision(BYTE bPrecision)

get_Size(long *pl)
put_Size(long l)

get_Type(DataTypeEnum *psDataType)
put_Type(DataTypeEnum sDataType)

get_Value(VARIANT *pvar)
put_Value(VARIANT val)


Record-Objekt (Syntax von ADO für Visual C++)

Methoden

Cancel(void)

Close(void)

CopyRecord(BSTR Source, BSTR Destination, BSTR UserName, BSTR Password,
                CopyRecordOptionsEnum Options, VARIANT_BOOL Async, BSTR
                *pbstrNewURL)

DeleteRecord(BSTR Source, VARIANT_BOOL Async)

GetChildren(_ADORecordset **ppRSet)

MoveRecord(BSTR Source, BSTR Destination, BSTR UserName, BSTR Password,
                MoveRecordOptionsEnum Options, VARIANT_BOOL Async, BSTR
                *pbstrNewURL)

Open(VARIANT Source, VARIANT ActiveConnection, ConnectModeEnum Mode,
            RecordCreateOptionsEnum CreateOptions, RecordOpenOptionsEnum
            Options, BSTR UserName, BSTR Password)

Eigenschaften

get_ActiveConnection(VARIANT *pvar)
put_ActiveConnection(BSTR bstrConn)
putref_ActiveConnection(_ADOConnection *Con)

get_Fields(ADOFields **ppFlds)

get_Mode(ConnectModeEnum *pMode)
put_Mode(ConnectModeEnum Mode)

get_ParentURL(BSTR *pbstrParentURL)

get_RecordType(RecordTypeEnum *pType)

get_Source(VARIANT *pvar)
put_Source(BSTR Source)
putref_Source(IDispatch *Source)

get_State(ObjectStateEnum *pState)


Recordset-Objekt (Syntax von ADO für Visual C++)

Methoden

AddNew(VARIANT FieldList, VARIANT Values)

Cancel(void)

CancelBatch(AffectEnum AffectRecords)

CancelUpdate(void)

Clone(LockTypeEnum LockType, _ADORecordset **ppvObject)

Close(void)

CompareBookmarks(VARIANT Bookmark1, VARIANT Bookmark2,
                            CompareEnum *pCompare)

Delete(AffectEnum AffectRecords)

Find(BSTR Criteria, LONG SkipRecords, SearchDirectionEnum SearchDirection,
        VARIANT Start)

GetRows(long Rows, VARIANT Start, VARIANT Fields, VARIANT *pvar)

GetString(StringFormatEnum StringFormat, long NumRows, BSTR ColumnDelimeter,
                BSTR RowDelimeter, BSTR NullExpr, BSTR *pRetString)

Move(long NumRecords, VARIANT Start)

MoveFirst(void)

MoveLast(void)

MoveNext(void)

MovePrevious(void)

NextRecordset(VARIANT *RecordsAffected, _ADORecordset **ppiRs)

Open(VARIANT Source, VARIANT ActiveConnection, CursorTypeEnum CursorType,
            LockTypeEnum LockType, LONG Options)

Requery(LONG Options)

Resync(AffectEnum AffectRecords, ResyncEnum ResyncValues)

Save(BSTR FileName, PersistFormatEnum PersistFormat)

Supports(CursorOptionEnum CursorOptions, VARIANT_BOOL *pb)

Update(VARIANT Fields, VARIANT Values)

UpdateBatch(AffectEnum AffectRecords)

Eigenschaften

get_AbsolutePage(PositionEnum *pl)
put_AbsolutePage(PositionEnum Page)

get_AbsolutePosition(PositionEnum *pl)
put_AbsolutePosition(PositionEnum Position)

get_ActiveCommand(IDispatch **ppCmd)

get_ActiveConnection(VARIANT *pvar)
put_ActiveConnection(VARIANT vConn)
putref_ActiveConnection(IDispatch *pconn)

get_BOF(VARIANT_BOOL *pb)

get_Bookmark(VARIANT *pvBookmark)
put_Bookmark(VARIANT vBookmark)

get_CacheSize(long *pl)
put_CacheSize(long CacheSize)

get_CursorLocation(CursorLocationEnum *plCursorLoc)
put_CursorLocation(CursorLocationEnum lCursorLoc)

get_CursorType(CursorTypeEnum *plCursorType)
put_CursorType(CursorTypeEnum lCursorType)

get_DataMember(BSTR *pbstrDataMember)
put_DataMember(BSTR bstrDataMember)

get_DataSource(IUnknown **ppunkDataSource)
putref_DataSource(IUnknown *punkDataSource)

get_EditMode(EditModeEnum *pl)

get_EOF(VARIANT_BOOL *pb)

get_Filter(VARIANT *Criteria)
put_Filter(VARIANT Criteria)

get_LockType(LockTypeEnum *plLockType)
put_LockType(LockTypeEnum lLockType)

get_MarshalOptions(MarshalOptionsEnum *peMarshal)
put_MarshalOptions(MarshalOptionsEnum eMarshal)

get_MaxRecords(long *plMaxRecords)
put_MaxRecords(long lMaxRecords)

get_PageCount(long *pl)

get_PageSize(long *pl)
put_PageSize(long PageSize)

get_RecordCount(long *pl)

get_Sort(BSTR *Criteria)
put_Sort(BSTR Criteria)

get_Source(VARIANT *pvSource)
put_Source(BSTR bstrConn)
putref_Source(IDispatch *pcmd)

get_State(LONG *plObjState)

get_Status(long *pl)

get_StayInSync(VARIANT_BOOL *pbStayInSync)
put_StayInSync(VARIANT_BOOL bStayInSync)

get_Fields(ADOFields **ppvObject)

Ereignisse

EndOfRecordset(VARIANT_BOOL *fMoreData, EventStatusEnum *adStatus,
                        _ADORecordset *pRecordset)

FetchComplete(ADOError *pError, EventStatusEnum *adStatus,
                        _ADORecordset *pRecordset)

FetchProgress(long Progress, long MaxProgress, EventStatusEnum *adStatus,
                        _ADORecordset *pRecordset)

FieldChangeComplete(LONG cFields, VARIANT Fields, ADOError *pError,
                        EventStatusEnum *adStatus, _ADORecordset *pRecordset)

MoveComplete(EventReasonEnum adReason, ADOError *pError,
                        EventStatusEnum *adStatus, _ADORecordset *pRecordset)

RecordChangeComplete(EventReasonEnum adReason, LONG cRecords,
                        ADOError *pError, EventStatusEnum *adStatus,
                        _ADORecordset *pRecordset)
RecordsetChangeComplete(EventReasonEnum adReason, ADOError *pError,
                        EventStatusEnum *adStatus, _ADORecordset *pRecordset)

WillChangeField(LONG cFields, VARIANT Fields, EventStatusEnum *adStatus,
                        _ADORecordset *pRecordset)

WillChangeRecord(EventReasonEnum adReason, LONG cRecords,
                        EventStatusEnum *adStatus, _ADORecordset *pRecordset)

WillChangeRecordset(EventReasonEnum adReason, EventStatusEnum *adStatus,
                        _ADORecordset *pRecordset)

WillMove(EventReasonEnum adReason, EventStatusEnum *adStatus,
                        _ADORecordset *pRecordset)


Stream-Objekt (Syntax von ADO für Visual C++)

Methoden

Cancel(void)

Close(void)

CopyTo(_ADOStream *DestStream, LONG CharNumber = -1)

Flush(void)

LoadFromFile(BSTR FileName)

Open(VARIANT Source, ConnectModeEnum Mode, StreamOpenOptionsEnum Options,
            BSTR UserName, BSTR Password)

Read(long NumBytes, VARIANT *pVal)

ReadText(long NumChars, BSTR *pbstr)

SaveToFile(BSTR FileName, SaveOptionsEnum Options = adSaveCreateNotExist)

SetEOS(void)

SkipLine(void)

Write(VARIANT Buffer)

WriteText(BSTR Data, StreamWriteEnum Options = adWriteChar)

Eigenschaften

get_Charset(BSTR *pbstrCharset)
put_Charset(BSTR Charset)

get_EOS(VARIANT_BOOL *pEOS)

get_LineSeparator(LineSeparatorEnum *pLS)
put_LineSeparator(LineSeparatorEnum LineSeparator)

get_Mode(ConnectModeEnum *pMode)
put_Mode(ConnectModeEnum Mode)

get_Position(LONG *pPos)
put_Position(LONG Position)

get_Size(LONG *pSize)

get_State(ObjectStateEnum *pState)

get_Type(StreamTypeEnum *pType)
put_Type(StreamTypeEnum Type)


Syntaxindex (#import): ADO für Visual C++

Das ADO-Sprachverzeichnis verwendet die Programmiersprache Microsoft Visual Basic, um die Syntax der Methoden und Eigenschaften von ADO zu erläutern. Dieser Index bietet einen Querverweis auf die Teile des ADO-Sprachverzeichnisses, die auf Microsoft Visual C++ und der #import-Direktive basieren.

Dieser spezielle Index wurde abgeleitet, indem ein Programm kompiliert wurde, das unter Verwendung der #import-Direktive die ADO-DLL einbindet, und indem anschließend die generierte Datei *.tlh neu formatiert wurde. Dabei blieben nur Informationen über Methoden, Eigenschaften und Ereignisse erhalten. Die für jede Eigenschaft deklarierte alternative Syntax ist in Form der entsprechenden __declspec(property...)-Direktive aufgelistet.

Es wird ausdrücklich empfohlen, unter So verwenden Benutzer von Visual C++ die ADO-Dokumentation nachzulesen, um weitere Informationen zu erhalten.

Für die folgenden Elemente wird die mit der #import-Direktive bearbeitete Visual C++-Syntax der dazugehörigen Methoden und Eigenschaften aufgelistet:

  • ADO-Auflistungen

  • Command-Objekt

  • Connection-Objekt

  • Error-Objekt

  • Field-Objekt

  • Parameter-Objekt

  • Property-Objekt

  • Record-Objekt

  • Recordset-Objekt

  • Stream-Objekt

  • Connection-Ereignisse

  • Recordset-Ereignisse


Auflistungen (Syntax von ADO für Visual C++ unter Verwendung von #import)

Es ist nützlich zu wissen, dass Auflistungen bestimmte häufig verwendete Methoden und Eigenschaften erben.

Alle Auflistungen erben die Count-Eigenschaft und die Refresh-Methode, und alle Auflistungen fügen die Item-Eigenschaft hinzu. Die Errors-Auflistung fügt die Clear-Methode hinzu. Die Parameters-Auflistung erbt die Methoden Append und Delete, während die Fields-Auflistung die Methoden Append, Delete und Update hinzufügt.

Properties-Auflistung

Methoden

HRESULT Refresh( );

Eigenschaften

long GetCount( );
__declspec(property(get=GetCount)) long Count;

PropertyPtr GetItem( const _variant_t & Index );
__declspec(property(get=GetItem)) PropertyPtr Item[];

Errors-Auflistung

Methoden

HRESULT Clear( );

HRESULT Refresh( );

Eigenschaften

long GetCount( );
__declspec(property(get=GetCount)) long Count;

PropertyPtr GetItem( const _variant_t & Index );
__declspec(property(get=GetItem)) PropertyPtr Item[];

Parameters-Auflistung

Methoden

HRESULT Append( IDispatch * Object );

HRESULT Delete( const _variant_t & Index );

HRESULT Refresh( );

Eigenschaften

long GetCount( );
__declspec(property(get=GetCount)) long Count;

PropertyPtr GetItem( const _variant_t & Index );
__declspec(property(get=GetItem)) PropertyPtr Item[];

Fields-Auflistung

Methoden

HRESULT Append( _bstr_t Name, enum DataTypeEnum Type, long DefinedSize,
    enum FieldAttributeEnum Attrib, const _variant_t & FieldValue =
    vtMissing );

HRESULT Delete( const _variant_t & Index );

HRESULT Refresh( );

HRESULT Update( );

Eigenschaften

long GetCount( );
__declspec(property(get=GetCount)) long Count;

PropertyPtr GetItem( const _variant_t & Index );
__declspec(property(get=GetItem)) PropertyPtr Item[];


Command-Objekt (Syntax von ADO für Visual C++ unter Verwendung von #import)

Methoden

HRESULT Cancel( );

_RecordsetPtr Execute( VARIANT * RecordsAffected, VARIANT
    * Parameters, long Options );

_ParameterPtr CreateParameter( _bstr_t Name, enum
    DataTypeEnum Type, enum ParameterDirectionEnum Direction, long Size,
    const _variant_t & Value = vtMissing );

Eigenschaften

_ConnectionPtr GetActiveConnection( );
void PutRefActiveConnection( struct _Connection * ppvObject );
void PutActiveConnection( const _variant_t & ppvObject );
__declspec(property(get=GetActiveConnection,put=PutRefActiveConnection))
    _ConnectionPtr ActiveConnection;

_bstr_t GetCommandText( );
void PutCommandText( _bstr_t pbstr );
__declspec(property(get=GetCommandText,put=PutCommandText)) _bstr_t
    CommandText;

long GetCommandTimeout( );
void PutCommandTimeout( long pl );
__declspec(property(get=GetCommandTimeout,put=PutCommandTimeout)) long
    CommandTimeout;

void PutCommandType( enum CommandTypeEnum plCmdType );
enum CommandTypeEnum GetCommandType( );
__declspec(property(get=GetCommandType,put=PutCommandType)) enum
    CommandTypeEnum CommandType;

VARIANT_BOOL GetPrepared( );
void PutPrepared( VARIANT_BOOL pfPrepared );
__declspec(property(get=GetPrepared,put=PutPrepared)) VARIANT_BOOL
    Prepared;

ParametersPtr GetParameters( );
__declspec(property(get=GetParameters)) ParametersPtr
    Parameters;

_bstr_t GetName( );
void PutName( _bstr_t pbstrName );
__declspec(property(get=GetName,put=PutName)) _bstr_t Name;

long GetState( );
__declspec(property(get=GetState)) long State;


Connection-Objekt (Syntax von ADO für Visual C++ unter Verwendung von #import)

Methoden

HRESULT Cancel( );

HRESULT Close( );

_RecordsetPtr Execute( _bstr_t CommandText, VARIANT *
    RecordsAffected,     long Options );

long BeginTrans( );
HRESULT CommitTrans( );
HRESULT RollbackTrans( );

HRESULT Open( _bstr_t ConnectionString, _bstr_t UserID,
    _bstr_t Password,     long Options );

_RecordsetPtr OpenSchema( enum SchemaEnum Schema, const
    _variant_t &     Restrictions = vtMissing, const _variant_t &
    SchemaID = vtMissing );

Eigenschaften

_bstr_t GetConnectionString( );
void PutConnectionString( _bstr_t pbstr );
__declspec(property(get=GetConnectionString,put=PutConnectionString))
    _bstr_t ConnectionString;

long GetCommandTimeout( );
void PutCommandTimeout( long plTimeout );
__declspec(property(get=GetCommandTimeout,put=PutCommandTimeout)) long
    CommandTimeout;

long GetConnectionTimeout( );
void PutConnectionTimeout( long plTimeout );
__declspec(property(get=GetConnectionTimeout,put=PutConnectionTimeout))
    long ConnectionTimeout;

_bstr_t GetVersion( );
__declspec(property(get=GetVersion)) _bstr_t Version;

ErrorsPtr GetErrors( );
__declspec(property(get=GetErrors)) ErrorsPtr Errors;

_bstr_t GetDefaultDatabase( );
void PutDefaultDatabase( _bstr_t pbstr );
__declspec(property(get=GetDefaultDatabase,put=PutDefaultDatabase))
    _bstr_t DefaultDatabase;

enum IsolationLevelEnum GetIsolationLevel( );
void PutIsolationLevel( enum IsolationLevelEnum Level );
__declspec(property(get=GetIsolationLevel,put=PutIsolationLevel)) enum
    IsolationLevelEnum IsolationLevel;

long GetAttributes( );
void PutAttributes( long plAttr );
__declspec(property(get=GetAttributes,put=PutAttributes)) long
    Attributes;

enum CursorLocationEnum GetCursorLocation( );
void PutCursorLocation( enum CursorLocationEnum plCursorLoc );
__declspec(property(get=GetCursorLocation,put=PutCursorLocation)) enum
    CursorLocationEnum CursorLocation;

enum ConnectModeEnum GetMode( );
void PutMode( enum ConnectModeEnum plMode );
__declspec(property(get=GetMode,put=PutMode)) enum ConnectModeEnum
    Mode;

_bstr_t GetProvider( );
void PutProvider( _bstr_t pbstr );
__declspec(property(get=GetProvider,put=PutProvider)) _bstr_t
    Provider;

long GetState( );
__declspec(property(get=GetState)) long State;


Error-Objekt (Syntax von ADO für Visual C++ unter Verwendung von #import)

Eigenschaften

_bstr_t GetDescription( );
__declspec(property(get=GetDescription)) _bstr_t Description;

long GetHelpContext( );
__declspec(property(get=GetHelpContext)) long HelpContext;

_bstr_t GetHelpFile( );
__declspec(property(get=GetHelpFile)) _bstr_t HelpFile;

long GetNativeError( );
__declspec(property(get=GetNativeError)) long NativeError;

long GetNumber( );
__declspec(property(get=GetNumber)) long Number;

_bstr_t GetSource( );
__declspec(property(get=GetSource)) _bstr_t Source;

_bstr_t GetSQLState( );
__declspec(property(get=GetSQLState)) _bstr_t SQLState;


Field-Objekt (Syntax von ADO für Visual C++ unter Verwendung von #import)

Methoden

HRESULT AppendChunk( const _variant_t & Data );

_variant_t GetChunk( long Length );

Eigenschaften

long GetActualSize( );
__declspec(property(get=GetActualSize)) long ActualSize;

long GetAttributes( );
void PutAttributes( long pl );
__declspec(property(get=GetAttributes,put=PutAttributes)) long     Attributes;

IUnknownPtr GetDataFormat( );
void PutRefDataFormat( IUnknown * ppiDF );
__declspec(property(get=GetDataFormat,put=PutRefDataFormat)) IunknownPtr
    DataFormat;

long GetDefinedSize( );
void PutDefinedSize( long pl );
__declspec(property(get=GetDefinedSize,put=PutDefinedSize)) long
    DefinedSize;

_bstr_t GetName( );
__declspec(property(get=GetName)) _bstr_t Name;

unsigned char GetNumericScale( );
void PutNumericScale( unsigned char pbNumericScale );
__declspec(property(get=GetNumericScale,put=PutNumericScale)) unsigned
    char NumericScale;

_variant_t GetOriginalValue( );
__declspec(property(get=GetOriginalValue)) _variant_t OriginalValue;

unsigned char GetPrecision( );
void PutPrecision( unsigned char pbPrecision );
__declspec(property(get=GetPrecision,put=PutPrecision)) unsigned char
    Precision;

enum DataTypeEnum GetType( );
void PutType( enum DataTypeEnum pDataType );
__declspec(property(get=GetType,put=PutType)) enum DataTypeEnum Type;

_variant_t GetUnderlyingValue( );
__declspec(property(get=GetUnderlyingValue)) _variant_t UnderlyingValue;

_variant_t GetValue( );
void PutValue( const _variant_t & pvar );
__declspec(property(get=GetValue,put=PutValue)) _variant_t Value;


Parameter-Objekt (Syntax von ADO für Visual C++ unter Verwendung von #import)

Methoden

HRESULT AppendChunk( const _variant_t & Val );

Eigenschaften

long GetAttributes( );
void PutAttributes( long plParmAttribs );
__declspec(property(get=GetAttributes,put=PutAttributes)) long
    Attributes;

enum ParameterDirectionEnum GetDirection( );
void PutDirection( enum ParameterDirectionEnum plParmDirection );
__declspec(property(get=GetDirection,put=PutDirection)) enum
    ParameterDirectionEnum Direction;

_bstr_t GetName( );
void PutName( _bstr_t pbstr );
__declspec(property(get=GetName,put=PutName)) _bstr_t Name;

unsigned char GetNumericScale( );
void PutNumericScale( unsigned char pbScale );
__declspec(property(get=GetNumericScale,put=PutNumericScale)) unsigned
    char NumericScale;

unsigned char GetPrecision( );
void PutPrecision( unsigned char pbPrecision );
__declspec(property(get=GetPrecision,put=PutPrecision)) unsigned char
    Precision;

long GetSize( );
void PutSize( long pl );
__declspec(property(get=GetSize,put=PutSize)) long Size;

enum DataTypeEnum GetType( );
void PutType( enum DataTypeEnum psDataType );
__declspec(property(get=GetType,put=PutType)) enum DataTypeEnum Type;

_variant_t GetValue( );
void PutValue( const _variant_t & pvar );
__declspec(property(get=GetValue,put=PutValue)) _variant_t Value;


Property-Objekt (Syntax von ADO für Visual C++ unter Verwendung von #import)

Eigenschaften

long GetAttributes( );
void PutAttributes( long plAttributes );
__declspec(property(get=GetAttributes,put=PutAttributes)) long
    Attributes;

_bstr_t GetName( );
__declspec(property(get=GetName)) _bstr_t Name;

enum DataTypeEnum GetType( );
__declspec(property(get=GetType)) enum DataTypeEnum Type;

_variant_t GetValue( );
void PutValue( const _variant_t & pval );
__declspec(property(get=GetValue,put=PutValue)) _variant_t Value;


Record-Objekt (Syntax von ADO für Visual C++ unter Verwendung von #import)

Methoden

HRESULT Cancel( );

HRESULT Close( );

_bstr_t CopyRecord( _bstr_t Source, _bstr_t Destination,
    _bstr_t     UserName, _bstr_t Password, enum CopyRecordOptionsEnum
    Options,     VARIANT_BOOL Async );

HRESULT DeleteRecord( _bstr_t Source, VARIANT_BOOL Async );

_RecordsetPtr GetChildren( );

_bstr_t MoveRecord( _bstr_t Source, _bstr_t Destination,
    _bstr_t     UserName, _bstr_t Password, enum MoveRecordOptionsEnum
    Options,     VARIANT_BOOL Async );

HRESULT Open( const _variant_t & Source, const _variant_t
&     ActiveConnection, enum ConnectModeEnum Mode, enum
    RecordCreateOptionsEnum CreateOptions, enum RecordOpenOptionsEnum
    Options, _bstr_t UserName, _bstr_t Password );

Eigenschaften

_variant_t GetActiveConnection( );
void PutActiveConnection( _bstr_t pvar );
void PutRefActiveConnection( struct _Connection * pvar );

FieldsPtr GetFields( );
__declspec(property(get=GetFields)) FieldsPtr Fields;

enum ConnectModeEnum GetMode( );
void PutMode( enum ConnectModeEnum pMode );
__declspec(property(get=GetMode,put=PutMode)) enum ConnectModeEnum Mode;

_bstr_t GetParentURL( );
__declspec(property(get=GetParentURL)) _bstr_t ParentURL;

enum RecordTypeEnum GetRecordType( );
__declspec(property(get=GetRecordType)) enum RecordTypeEnum
    RecordType;

_variant_t GetSource( );
void PutSource( _bstr_t pvar );
void PutRefSource( IDispatch * pvar );

enum ObjectStateEnum GetState( );
__declspec(property(get=GetState)) enum ObjectStateEnum State;


Recordset-Objekt (Syntax von ADO für Visual C++ unter Verwendung von #import)

Methoden

HRESULT AddNew( const _variant_t & FieldList = vtMissing,
    const     _variant_t & Values = vtMissing );

HRESULT Cancel( );

HRESULT CancelBatch( enum AffectEnum AffectRecords );

HRESULT CancelUpdate( );

_RecordsetPtr Clone( enum LockTypeEnum LockType );

HRESULT Close( );

enum CompareEnum CompareBookmarks( const _variant_t
    & Bookmark1, const     _variant_t & Bookmark2 );

HRESULT Delete( enum AffectEnum AffectRecords );

HRESULT Find( _bstr_t Criteria, long SkipRecords, enum
    SearchDirectionEnum SearchDirection, const _variant_t & Start =
    vtMissing );

_variant_t GetRows( long Rows, const _variant_t & Start =
    vtMissing, const _variant_t & Fields = vtMissing );

_bstr_t GetString( enum
    StringFormatEnum StringFormat, long NumRows,     _bstr_t
    ColumnDelimeter, _bstr_t RowDelimeter, _bstr_t NullExpr );

HRESULT Move( long NumRecords, const _variant_t & Start =
    vtMissing );

HRESULT MoveFirst( );
HRESULT MoveLast( );
HRESULT MoveNext( );
HRESULT MovePrevious( );

_RecordsetPtr NextRecordset( VARIANT * RecordsAffected );

HRESULT Open( const _variant_t & Source, const _variant_t &
    ActiveConnection, enum CursorTypeEnum CursorType, enum LockTypeEnum
    LockType, long Options );

HRESULT Requery( long Options );

HRESULT Update( const _variant_t & Fields = vtMissing, const
    _variant_t &     Values = vtMissing );

HRESULT UpdateBatch( enum AffectEnum AffectRecords );

HRESULT Resync( enum AffectEnum AffectRecords, enum
    ResyncEnum     ResyncValues );

HRESULT Save( const _variant_t & Destination, enum
    PersistFormatEnum     PersistFormat );

HRESULT Seek( const _variant_t & KeyValues, enum SeekEnum
    SeekOption );

VARIANT_BOOL Supports( enum CursorOptionEnum CursorOptions );

Eigenschaften

enum PositionEnum GetAbsolutePage( );
void PutAbsolutePage( enum PositionEnum pl );
__declspec(property(get=GetAbsolutePage,put=PutAbsolutePage)) enum
    PositionEnum AbsolutePage;

enum PositionEnum GetAbsolutePosition( );
void PutAbsolutePosition( enum PositionEnum pl );
__declspec(property(get=GetAbsolutePosition,put=PutAbsolutePosition))
    enum PositionEnum AbsolutePosition;

IDispatchPtr GetActiveCommand( );
__declspec(property(get=GetActiveCommand)) IDispatchPtr ActiveCommand;

void PutRefActiveConnection( IDispatch * pvar );
void PutActiveConnection( const _variant_t & pvar );
_variant_t GetActiveConnection( );

enum CursorLocationEnum GetCursorLocation( );
void PutCursorLocation( enum CursorLocationEnum plCursorLoc );
__declspec(property(get=GetCursorLocation,put=PutCursorLocation)) enum
    CursorLocationEnum CursorLocation;

VARIANT_BOOL GetBOF( );
__declspec(property(get=GetBOF)) VARIANT_BOOL BOF;

VARIANT_BOOL GetEndOfFile( ); // Actually, GetEOF. Renamed in #import.
__declspec(property(get=GetEndOfFile)) VARIANT_BOOL EndOfFile;

_variant_t GetBookmark( );
void PutBookmark( const _variant_t & pvBookmark );
__declspec(property(get=GetBookmark,put=PutBookmark)) _variant_t
    Bookmark;

long GetCacheSize( );
void PutCacheSize( long pl );
__declspec(property(get=GetCacheSize,put=PutCacheSize)) long
    CacheSize;

enum CursorTypeEnum GetCursorType( );
void PutCursorType( enum CursorTypeEnum plCursorType );
__declspec(property(get=GetCursorType,put=PutCursorType)) enum
    CursorTypeEnum CursorType;

_bstr_t GetDataMember( );
void PutDataMember( _bstr_t pbstrDataMember );
__declspec(property(get=GetDataMember,put=PutDataMember)) _bstr_t
    DataMember;

IUnknownPtr GetDataSource( );
void PutRefDataSource( IUnknown * ppunkDataSource );
__declspec(property(get=GetDataSource,put=PutRefDataSource)) IUnknownPtr
    DataSource;

enum EditModeEnum GetEditMode( );
__declspec(property(get=GetEditMode)) enum EditModeEnum EditMode;

FieldsPtr GetFields( );
__declspec(property(get=GetFields)) FieldsPtr Fields;

_variant_t GetFilter( );
void PutFilter( const _variant_t & Criteria );
__declspec(property(get=GetFilter,put=PutFilter)) _variant_t Filter;

_bstr_t GetIndex( );
void PutIndex( _bstr_t pbstrIndex );
__declspec(property(get=GetIndex,put=PutIndex)) _bstr_t Index;

enum LockTypeEnum GetLockType( );
void PutLockType( enum LockTypeEnum plLockType );
__declspec(property(get=GetLockType,put=PutLockType)) enum LockTypeEnum
    LockType;

enum MarshalOptionsEnum GetMarshalOptions( );
void PutMarshalOptions( enum MarshalOptionsEnum peMarshal );
__declspec(property(get=GetMarshalOptions,put=PutMarshalOptions)) enum
    MarshalOptionsEnum MarshalOptions;

long GetMaxRecords( );
void PutMaxRecords( long plMaxRecords );
__declspec(property(get=GetMaxRecords,put=PutMaxRecords)) long
    MaxRecords;

long GetPageCount( );
__declspec(property(get=GetPageCount)) long PageCount;

long GetPageSize( );
void PutPageSize( long pl );
__declspec(property(get=GetPageSize,put=PutPageSize)) long PageSize;

long GetRecordCount( );
__declspec(property(get=GetRecordCount)) long RecordCount;

_bstr_t GetSort( );
void PutSort( _bstr_t Criteria );
__declspec(property(get=GetSort,put=PutSort)) _bstr_t Sort;

void PutRefSource( IDispatch * pvSource );
void PutSource( _bstr_t pvSource );
_variant_t GetSource( );

long GetState( );
__declspec(property(get=GetState)) long State;

long GetStatus( );
__declspec(property(get=GetStatus)) long Status;

VARIANT_BOOL GetStayInSync( );
void PutStayInSync( VARIANT_BOOL pbStayInSync );
__declspec(property(get=GetStayInSync,put=PutStayInSync)) VARIANT_BOOL
    StayInSync;


Stream-Objekt (Syntax von ADO für Visual C++ unter Verwendung von #import)

Methoden

HRESULT Cancel( );

HRESULT Close( );

HRESULT CopyTo( struct _Stream * DestStream, int CharNumber );

HRESULT Flush( );

HRESULT LoadFromFile( _bstr_t FileName );

HRESULT Open( const _variant_t & Source, enum
    ConnectModeEnum Mode, enum     StreamOpenOptionsEnum Options, _bstr_t
    UserName, _bstr_t Password );

_variant_t Read( long NumBytes );

_bstr_t ReadText( long NumChars );

HRESULT SaveToFile( _bstr_t FileName, enum SaveOptionsEnum
    Options );

HRESULT SetEOS( );

HRESULT SkipLine( );

HRESULT Write( const _variant_t & Buffer );

HRESULT WriteText( _bstr_t Data, enum StreamWriteEnum
    Options );

Eigenschaften

_bstr_t GetCharset( );
void PutCharset( _bstr_t pbstrCharset );
__declspec(property(get=GetCharset,put=PutCharset)) _bstr_t Charset;

VARIANT_BOOL GetEOS( );
__declspec(property(get=GetEOS)) VARIANT_BOOL EOS;

enum LineSeparatorEnum GetLineSeparator( );
void PutLineSeparator( enum LineSeparatorEnum pLS );
__declspec(property(get=GetLineSeparator,put=PutLineSeparator)) enum
    LineSeparatorEnum LineSeparator;

enum ConnectModeEnum GetMode( );
void PutMode( enum ConnectModeEnum pMode );
__declspec(property(get=GetMode,put=PutMode)) enum ConnectModeEnum Mode;

long GetPosition( );
void PutPosition( long pPos );
__declspec(property(get=GetPosition,put=PutPosition)) long Position;

long GetSize( );
__declspec(property(get=GetSize)) long Size;

enum ObjectStateEnum GetState( );
__declspec(property(get=GetState)) enum ObjectStateEnum State;

enum StreamTypeEnum GetType( );
void PutType( enum StreamTypeEnum ptype );
__declspec(property(get=GetType,put=PutType)) enum StreamTypeEnum Type;


Connection-Ereignisse (Syntax von ADO für Visual C++ unter Verwendung von #import)

Ereignisse

HRESULT InfoMessage( struct Error * pError, enum
    EventStatusEnum *     adStatus, struct _Connection * pConnection );

HRESULT BeginTransComplete( long TransactionLevel,
    struct Error * pError, enum EventStatusEnum * adStatus, struct
    _Connection * pConnection );

HRESULT CommitTransComplete( struct Error *
    pError, enum EventStatusEnum     * adStatus, struct _Connection *
    pConnection );

HRESULT RollbackTransComplete( struct Error *
    pError, enum     EventStatusEnum * adStatus, struct _Connection *
    pConnection );

HRESULT WillExecute( BSTR * Source, enum
    CursorTypeEnum * CursorType,
    enum LockTypeEnum * LockType, long * Options, enum EventStatusEnum *
    adStatus, struct _Command * pCommand, struct _Recordset * pRecordset,
    struct _Connection * pConnection );

HRESULT ExecuteComplete( long RecordsAffected, struct
    Error * pError,     enum EventStatusEnum * adStatus, struct _Command
    * pCommand, struct     _Recordset * pRecordset, struct _Connection *
    pConnection );

HRESULT WillConnect( BSTR * ConnectionString, BSTR *
    UserID, BSTR *     Password, long * Options, enum EventStatusEnum *
    adStatus, struct     _Connection * pConnection );

HRESULT ConnectComplete( struct Error *
    pError, enum EventStatusEnum *     adStatus, struct _Connection *
    pConnection );

HRESULT Disconnect( enum EventStatusEnum *
    adStatus, struct _Connection *     pConnection );


Recordset-Ereignisse (Syntax von ADO für Visual C++ unter Verwendung von #import)

Ereignisse

HRESULT WillChangeField( long cFields, const
    _variant_t & Fields, enum     EventStatusEnum * adStatus, struct
    _Recordset * pRecordset );

HRESULT FieldChangeComplete( long cFields, const
    _variant_t & Fields,     struct Error * pError, enum EventStatusEnum
    * adStatus, struct     _Recordset * pRecordset );

HRESULT WillChangeRecord( enum EventReasonEnum
    adReason, long cRecords,     enum EventStatusEnum * adStatus, struct
    _Recordset * pRecordset );

HRESULT RecordChangeComplete( enum EventReasonEnum
    adReason, long     cRecords, struct Error * pError, enum
    EventStatusEnum * adStatus,     struct _Recordset * pRecordset );

HRESULT WillChangeRecordset( enum EventReasonEnum
    adReason, enum     EventStatusEnum * adStatus, struct _Recordset *
    pRecordset );

HRESULT RecordsetChangeComplete( enum
    EventReasonEnum adReason, struct     Error * pError, enum
    EventStatusEnum * adStatus, struct _Recordset *     pRecordset );

HRESULT WillMove( enum EventReasonEnum adReason, enum
    EventStatusEnum *     adStatus, struct _Recordset * pRecordset );

HRESULT MoveComplete( enum EventReasonEnum adReason, struct
    Error *     pError, enum EventStatusEnum * adStatus, struct
    _Recordset * pRecordset );

HRESULT EndOfRecordset( VARIANT_BOOL * fMoreData, enum
    EventStatusEnum *     adStatus, struct _Recordset * pRecordset );

HRESULT FetchProgress( long Progress, long MaxProgress,
    enum     EventStatusEnum * adStatus, struct _Recordset * pRecordset );

HRESULT FetchComplete( struct Error * pError, enum
    EventStatusEnum *     adStatus, struct _Recordset * pRecordset );


Verwenden von ADO mit Microsoft Visual J++

Sie können ADO unter Verwendung von Microsoft Visual J++ auf folgende Weise implementieren:

  • Bei Verwendung von Visual J++ 6.0 (oder höher) mithilfe von ADO für Windows Foundation Classes.

  • Bei Verwendung von Visual J++ 1.x mithilfe des Java-Typbibliothek-Assistenten.

  • Mithilfe der Dienstprogramme des Microsoft SDK für Java.

Weitere Informationen über die Verwendung von ADO mit Visual J++ finden Sie unter:

  • Java-Schnittstellenklassen für ADO

  • Syntaxindex: ADO für WFC


ADO für Windows Foundation Classes (ADO/WFC)

ADO wurde im Hinblick auf Microsoft Visual J++ 6.0 mit Erweiterungen ausgestattet, die ein Zusammenwirken mit den Windows Foundation Classes (WFC) ermöglichen und im Folgenden beschrieben werden. Es wurden eine Reihe von Java-Klassen implementiert, die die ADO-Schnittstellen erweitern und Benachrichtigungen erstellen, die für den Java-Programmierer von Interesse sind. Außerdem zeigen die Java-Klassen Funktionen an, die Java-Typen an den Benutzer zurückgeben. Zum Zwecke der Leistungsverbesserung greift die Java-Klasse direkt auf die systemeigenen Datentypen des Rowset-Objekts von OLE DB zu und reicht sie an den Java-Programmierer als Java-Datentypen weiter, ohne sie vorher in einem Zwischenschritt aus dem oder in den Variant-Typ umzuwandeln. ADO ist außerdem dahingehend erweitert worden, dass Ereignisbenachrichtigungen im WFC-Kontext zu handhaben sind.

ADO für Windows Foundation Classes (ADO/WFC) unterstützt alle standardmäßigen ADO-Methoden, -Eigenschaften, -Objekte und -Ereignisse. Allerdings erweisen sich Operationen, für die ein Wert vom Datentyp Variant als Parameter erforderlich ist und die in einer Sprache wie Microsoft Visual Basic besonders leistungsfähig sind, in einer Sprache wie Visual J++ als leistungsschwächer. Aus diesem Grund stellt ADO/WFC auch Zugriffsfunktionen für das Field-Objekt zur Verfügung, die systemeigene Java-Datentypen anstelle von Variant-Datentypen verwenden.

Weitere Informationen zu ADO/WFC-Pakete finden Sie in der ADO-Dokumentation unter dem Thema Syntaxindex: ADO für WFC.

Verwandte Informationen in der Visual J++-Dokumentation finden Sie auf der Webseite Converting Visual Basic ADO Examples to Visual J++.


Verwenden von ADO mit dem Java-Typbibliothek-Assistenten

Der Java-Typbibliothek-Assistent ist ein Feature von Visual J++ 1.x, das in das Menü Extras der Entwicklungsumgebung integriert ist. Sein Zweck ist es, eine Typbibliothek zu durchsuchen und eine Java-Schnittstelle zu erstellen, die den Zugriff auf COM-Objekte ermöglicht. In Visual J++ 6.0 ist der Java-Typbibliothek-Assistent durch ADO für Windows Foundation Classes ersetzt worden.

Der Java-Typbibliothek-Assistent liefert ähnliche Ergebnisse wie die Befehlszeilenprogramme, die Bestandteil des Microsoft SDK für Java sind. Allerdings ist bei den vom Assistenten generierten Schnittstellenklassen kein Einzelschritt-Debugging möglich, wie es die Klassenkapselungen erlauben, die vom Microsoft SDK für Java generiert werden.

Der Java-Typbibliothek-Assistent generiert die Klassen in folgendem Verzeichnis: \<Windows-Verzeichnis>\Java\trustlib\msado15. Die Datei Summary.txt, die sich in dem Verzeichnis befindet, in dem die Klassen generiert wurden, enthält eine Übersicht der generierten Klassendefinitionen.

Der Java-Typbibliothek-Assistent konvertiert Aufzählungstypen, die er in einer Typbibliothek vorfindet, in den INT-Typ (Integer). Außerdem definiert er für jeden Aufzählungstyp der Typbibliothek eine entsprechende Schnittstelle. Die Werte eines ADO-Aufzählungstyps können mithilfe der folgenden Syntax angegeben werden:

msado15.<Enum Name>.<constant Name>

Ein Beispiel hierfür zeigt das folgende Codefragment, in dem die CommandType–Eigenschaft eines Command-Objekts festgelegt wird:

Cmd1.putCommandType( msado15.CommandTypeEnum.adCmdStoredProc );

Eine andere Möglichkeit besteht in der Vererbung der Kapselung für den Aufzählungstyp, die der Java-Typbibliothek-Assistent generiert. In diesem Fall könnten Sie in der Syntax das Präfix "msado15." weglassen. Allerdings müsste die Klasse von jedem Java-Objekt und jeder Aufzählungstypschnittstelle erben, auf das/die sie verweist, damit der Verweis auf "msado15." am Anfang aller ADO-Objekte und Aufzählungswerte entfallen kann.

Weiteren Beispielcode finden Sie unter dem Hilfethema Java-Schnittstellenklassen für ADO.

So führen Sie den Java-Typbibliothek-Assistenten in Visual J++ Version 1.x aus:

  1. Wählen Sie Java-Typbibliothek-Assistent im Menü Extras aus.

  2. Markieren Sie in der Liste den Eintrag Microsoft ActiveX Data Objects Library, und klicken Sie dann auf OK. Diese Aktion generiert (gegebenenfalls von neuem) die Dateien im \trustlib-Verzeichnis für ADO (dessen Pfad standardmäßig c:\winnt\java\trustlib\msado15 lautet). Wenn Sie unter Verwendung von Microsoft SDK für Java bereits Klassen für ADO generiert haben, werden diese durch die vom Java-Typbibliothek-Assistenten generierten Klassen ersetzt.

  3. Um diese Dateien zu verwenden, öffnen Sie Ihr Projekt in Visual J++. Wählen Sie im Menü Projekt den Befehl Dem Projekt hinzufügen. Wählen Sie die Option Dateien und fügen Sie alle im \trustlib-Verzeichnis angelegten JAVA-Dateien zu dem Projekt hinzu. (Das \trustlib-Verzeichnis ist standardmäßig über den Pfad c:\winnt\java\trustlib\msado15 definiert.)


Verwenden von ADO mit dem Microsoft SDK für Java

Microsoft SDK für Java ist das Entwicklerpaket für die Microsoft Internet Explorer-Umgebung. Es stellt Tools, Informationen und Beispiele zur Verfügung, die Ihnen bei der Entwicklung von Java-Programmen und –Applets auf der Basis von JDK 1.1 und Microsoft Win32® Virtual Machine (Microsoft VM) behilflich sein sollen. Microsoft SDK für Java ist nicht an Microsoft Visual J++ gebunden und kann von folgender Internetadresse gedownloadet werden: http://www.microsoft.com/Java.

Das Dienstprogramm Jactivex.exe generiert Klassen aus einer Typbibliothek, kann jedoch nur über die MS-DOS-Eingabeaufforderung aufgerufen werden. Dieses Feature ist nicht in die Visual J++-Entwicklungsumgebung integriert. Anders als die vom Java-Typbibliothek-Assistenten generierten Klassen können die vom SDK erstellten Klassen per Einzelschritt-Debugging analysiert werden. Diese Möglichkeit ist nützlich, wenn es im Rahmen der Fehlerbehandlung herauszufinden gilt, wie der gegebene Code die ADO-Schnittstellenklassen verwendet.

Der beschriebene Mechanismus liest die ADO-Typbibliothek und generiert Klassen, die Sie innerhalb einer Anwendung instanziieren können. Die generierten Klassen werden im folgenden Verzeichnis abgelegt: \<Windows-Verzeichnis>\Java\trustlib\msado15.

Hinsichtlich des Quellcodes ist das Erstellen einer ADO-Anwendung mithilfe des Microsoft SDK für Java im Wesentlichen identisch mit dem Erstellen einer ADO-Anwendung unter Verwendung des Java-Typbibliothek-Assistenten. Entsprechenden Beispielcode finden Sie unter dem Hilfethema Java-Schnittstellenklassen für ADO. Der einzige signifikante Unterschied besteht in der Art und Weise, wie Sie zuerst die Schnittstellenklassen generieren. Dieses Vorgehen ist im Folgenden beschrieben.

So erstellen Sie ein ADO-Projekt mit dem Microsoft SDK für Java

  1. Führen Sie den folgenden Befehl über die Eingabeaufforderung aus. Sie müssen dabei den gesamten Pfad für das \Bin-Verzeichnis des Microsoft SDK für Java festlegen oder den Befehl von diesem Verzeichnis aus ausführen. Gewöhnlich wird der Microsoft SDK für Java in demselben Verzeichnis wie Visual Studio installiert. Bei der folgenden Angabe handelt es sich um einen einzigen Befehl.
    \<Pfad für DevStudio>\<Pfad für Java SDK>\bin\JactiveX.exe /javatlb "C:\Programme\Gemeinsame Dateien\System\ADO\msado15.dll"
  2. Führen Sie den folgenden Befehl aus, um die generierten Klassen zu kompilieren. Der Schalter /g:t aktiviert das Generieren von Debugging-Symbolen, mit deren Hilfe Sie die .Java-Symbole zur Verfolgung des Programmablaufs verwenden können. Sie sollten den Schalter bei der Erzeugung von Freigabeversionen weglassen.
    jvc /g:t c:\<Windows-Verzeichnis>\Java\trustlib\msado15\*.Java
  3. Um diese Dateien zu verwenden, öffnen Sie Ihr Projekt in Visual J++. Wählen Sie im Menü Projekt den Befehl Dem Projekt hinzufügen. Wählen Sie die Option Dateien und fügen Sie alle im \trustlib\msado15-Verzeichnis angelegten .JAVA-Dateien zu Ihrem Projekt hinzu.


Java-Schnittstellenklassen für ADO

Der folgende Code deklariert eine Instanz der ADO Recordset–Schnittstellenklasse und initialisiert sie. Alle Vorgänge erfolgen innerhalb einer einzigen Codezeile. Außerdem deklariert der Code für jedes der Argumente der Open-Methode eine Variable, insbesondere für LockType und CursorType (da Java keine Unterstützung für Aufzählungstypen bietet). Der Code öffnet und schließt das Recordset-Objekt. Durch Festlegen von Rs1 auf Null wird lediglich erreicht, dass die Variable freigegeben wird, wenn Java seine systematisch und periodisch erfolgende Freigabe nicht genutzter Objekte durchführt.

public static void main( String args[])
{
    msado15._Recordset   Rs1 = new msado15.Recordset();
    Variant Source     = new Variant( "SELECT * FROM Authors" );
    Variant Connect    = new Variant( "DSN=AdoDemo;UID=admin;PWD=;" );
    int     LockType   = msado15.CursorTypeEnum.adOpenForwardOnly;
    int     CursorType = msado15.LockTypeEnum.adLockReadOnly;
    int     Options    = -1;

    Rs1.Open( Source, Connect, LockType,  CursorType, Options );
    Rs1.Close();
    Rs1 = null;

    System.out.println( "Success!\n" );
}


Syntaxindex: ADO für WFC (ADO/WFC)

Das ADO-Sprachverzeichnis verwendet die Programmiersprache Microsoft Visual Basic, um die Syntax der Methoden und Eigenschaften von ADO zu erläutern. Der folgende Index bietet einen Querverweis zu den Themen zum ADO-Sprachverzeichnis, die auf Microsoft Visual J++ und ADO für Windows Foundation Classes (ADO/WFC) basieren. Verwenden Sie bei Unterschieden in der Syntax die Funktionssignaturen in diesem Index und nicht die Syntaxlisten im entsprechenden Thema des Sprachverzeichnisses.

Für folgende Elemente wird die Syntax der dazugehörigen Methoden und Eigenschaften aufgelistet:

ActiveX-Datenobjekte

  • ADO-Auflistungen

  • Command-Objekt

  • Connection-Objekt

  • Error-Objekt

  • Field-Objekt

  • Parameter-Objekt

  • Recordset-Objekt

Remote Data Service

  • DataSpace-Objekt

  • ObjectProxy-Objekt


Auflistungen (Syntax von ADO für WFC)

package com.ms.wfc.data

Parameter

Methoden

public void append(com.ms.wfc.data.Parameter param)
public void delete(int n)
public void delete(String s)
public void refresh()
public Parameter getItem(int n)
public Parameter getItem(String s)

Eigenschaften

public int getCount()

Fields-Auflistung

Methoden

public void append(String name, int type)
public void append(String name, int type, int definedSize)
public void append(String name, int type, int definedSize, int attrib)
public void delete(int n)
public void delete(String s)
public void refresh()
public com.ms.wfc.data.Field getItem(int n)
public com.ms.wfc.data.Field getItem(String s)

Eigenschaften

public int getCount()

Errors-Auflistung

Methoden

public void clear()
public void refresh()
public com.ms.wfc.data.Error getItem(int n)
public com.ms.wfc.data.Error getItem(String s)

Eigenschaften

public int getCount()


Command-Objekt (Syntax von ADO für WFC)

package com.ms.wfc.data

Konstruktor

public Command()
public Command(String commandtext)

Methoden

public void cancel()
public com.ms.wfc.data.Parameter createParameter(String
    Name, int Type, int Direction, int Size, Object Value)
public Recordset execute()
public Recordset execute(Object[] parameters)
public Recordset execute(Object[] parameters, int options)
public int executeUpdate(Object[] parameters)
public int executeUpdate(Object[] parameters, int options)
public int executeUpdate()

Die executeUpdate-Methode ist eine für spezielle Fälle entworfene Methode, die die zugrunde liegende execute-Methode von ADO mit bestimmten Parametern aufruft. Die executeUpdate-Methode unterstützt nicht die Rückgabe eines Recordset–Objekts. Deshalb wird der Options-Parameter der execute–Methode durch AdoEnums.ExecuteOptions.NORECORDS modifiziert. Nach Beendigung des Aufrufs der execute-Methode wird der aktualisierte RecordsAffected-Parameter an die executeUpdate-Methode zurückgegeben, die schließlich als Wert vom Datentyp int zurückgegeben wird.

Eigenschaften

public com.ms.wfc.data.Connection getActiveConnection()
public void setActiveConnection(com.ms.wfc.data.Connection con)
public void setActiveConnection(String conString)
public String getCommandText()
public void setCommandText(String command)
public int getCommandTimeout()
public void setCommandTimeout(int timeout)
public int getCommandType()
public void setCommandType(int type)
public String getName()
public void setName(String name)
public boolean getPrepared()
public void setPrepared(boolean prepared)
public int getState()
public com.ms.wfc.data.Parameter getParameter(int n)
public com.ms.wfc.data.Parameter getParameter(String n)
public com.ms.wfc.data.Parameters getParameters()
public AdoProperties getProperties()


Connection-Objekt (Syntax von ADO für WFC)

package com.ms.wfc.data

Konstruktor

public Connection()
public Connection(String connectionstring)

Methoden

public int beginTrans()
public void commitTrans()
public void rollbackTrans()
public void cancel()
public void close()
public com.ms.wfc.data.Recordset execute(String commandText)
public com.ms.wfc.data.Recordset execute(String commandText, int options)
public int executeUpdate(String commandText)
public int executeUpdate(String commandText, int options)

Die executeUpdate-Methode ist eine für spezielle Fälle entworfene Methode, die die zugrunde liegende execute-Methode von ADO mit bestimmten Parametern aufruft. Die executeUpdate-Methode unterstützt nicht die Rückgabe eines Recordset–Objekts. Deshalb wird der Options-Parameter der execute–Methode durch AdoEnums.ExecuteOptions.NORECORDS modifiziert. Nach Beendigung des Aufrufs der execute-Methode wird der aktualisierte RecordsAffected-Parameter an die executeUpdate-Methode zurückgegeben, die schließlich als Wert vom Datentyp int zurückgegeben wird.

public void open()
public void open(String connectionString)
public void open(String connectionString, String userID)
public void open(String connectionString, String userID, String password)
public void open(String connectionString, String userID, String password, int options)
public Recordset openSchema(int schema, Object[]
    restrictions, String schemaID)
public Recordset openSchema(int schema)
public Recordset openSchema(int schema, Object[] restrictions)

Eigenschaften

public int getAttributes()
public void setAttributes(int attr)
public int getCommandTimeout()
public void setCommandTimeout(int timeout)
public String getConnectionString()
public void setConnectionString(String con)
public int getConnectionTimeout()
public void setConnectionTimeout(int timeout)
public int getCursorLocation()
public void setCursorLocation(int cursorLoc)
public String getDefaultDatabase()
public void setDefaultDatabase(String db)
public int getIsolationLevel()
public void setIsolationLevel(int level)
public int getMode()
public void setMode(int mode)
public String getProvider()
public void setProvider(String provider)
public int getState()
public String getVersion()
public AdoProperties getProperties()
public com.ms.wfc.data.Errors getErrors()

Ereignisse

Weitere Informationen zu ADO/WFC-Ereignissen finden Sie unter ADO-Ereignisse in ADO/WFC.

public void addOnBeginTransComplete(ConnectionEventHandler handler)
public void removeOnBeginTransComplete(ConnectionEventHandler handler)
public void addOnCommitTransComplete(ConnectionEventHandler handler)
public void removeOnCommitTransComplete(ConnectionEventHandler handler)
public void addOnConnectComplete(ConnectionEventHandler handler)
public void removeOnConnectComplete(ConnectionEventHandler handler)
public void addOnDisconnect(ConnectionEventHandler handler)
public void removeOnDisconnect(ConnectionEventHandler handler)
public void addOnExecuteComplete(ConnectionEventHandler handler)
public void removeOnExecuteComplete(ConnectionEventHandler handler)
public void addOnInfoMessage(ConnectionEventHandler handler)
public void removeOnInfoMessage(ConnectionEventHandler handler)
public void addOnRollbackTransComplete(ConnectionEventHandler handler)
public void removeOnRollbackTransComplete(ConnectionEventHandler handler)
public void addOnWillConnect(ConnectionEventHandler handler)
public void removeOnWillConnect(ConnectionEventHandler handler)
public void addOnWillExecute(ConnectionEventHandler handler)
public void removeOnWillExecute(ConnectionEventHandler handler)


DataSpace-Objekt (Syntax von ADO für WFC)

Die createObject-Methode der DataSpace-Klasse bestimmt sowohl ein Geschäftsobjekt zur Verarbeitung von Anforderungen der Client-Anwendung (progid) als auch Kommunikationsprotokoll und –server (connection). createObject gibt ein ObjectProxy–Objekt zurück, das den Server repräsentiert.

package com.ms.wfc.data

Konstruktor

public DataSpace()

Methoden

public static ObjectProxy DataSpace.createObject(String
    progid, String connection)

Eigenschaften

public static int getInternetTimeout()
public static void setInternetTimeout(int plInetTimeout)


Error-Objekt (Syntax von ADO für WFC)

package com.ms.wfc.data

Eigenschaften

public String getDescription()
public int getNativeError()
public int getNumber()
public String getSource()
public String getSQLState()


Field-Objekt (Syntax von ADO für WFC)

package com.ms.wfc.data

Methoden

public void appendChunk(byte[] bytes)
public void appendChunk(char[] chars)
public void appendChunk(String chars)
public byte[] getByteChunk(int len)
public char[] getCharChunk(int len)
public String getStringChunk(int len)

Eigenschaften

public int getActualSize()
public int getAttributes()
public void setAttributes(int pl)
public com.ms.com.IUnknown getDataFormat()
public void setDataFormat(com.ms.com.IUnknown format)

(Weitere Informationen finden Sie in der Microsoft Visual J++ WFC-Referenzdokumentation für die com.ms.wfc.data.IdataFormat-Schnittstelle.)

public int getDefinedSize()
public void setDefinedSize(int pl)
public String getName()
public int getNumericScale()
public void setNumericScale(byte pbNumericScale)
public Variant getOriginalValue()
public int getPrecision()
public void setPrecision(byte pbPrecision)
public int getType()
public void setType(int pDataType)
public Variant getUnderlyingValue()
public Variant getValue()
public void setValue(Variant value)
public AdoProperties getProperties()

Field-Zugriffsmethoden

Die Value-Eigenschaft eines Field-Objekts fragt den Inhalt des Objekts ab bzw. legt diesen fest. Der Inhalt ist als Variant dargestellt, ein Objekttyp, dem ein Wert und einer von mehreren Datentypen zugewiesen werden kann.

ADO/WFC implementiert die Value-Eigenschaft mit der getValue-Methode, die ein Variant–Objekt zurückgibt, sowie mit der setValue-Methode, die einen Wert vom Datentyp Variant als Argument verwendet. Variant–Werte sind in bestimmten Sprachen, wie z. B. Microsoft Visual Basic, sehr effizient. Sie können jedoch in Microsoft Visual J++ eine besseres Leistungsverhalten erzielen, wenn Sie systemeigene Java-Datentypen verwenden.

Zusätzlich zur Value-Eigenschaft stellt ADO/WFC Zugriffsmethoden zur Verfügung, die Java-Datentypen zum Abfragen und Festlegen des Inhalts von Field-Objekten verwenden. Die Namen der meisten dieser Methoden haben das Format get Datentyp oder set Datentyp.

Es gibt zwei erwähnenswerte Ausnahmen: Eine der getObject-Methoden gibt ein in eine angegebene Klasse umgewandeltes Objekt zurück. Es existiert keine getNull-Eigenschaft; stattdessen gibt es eine isNull-Eigenschaft, die einen booleschen Wert zurückgibt, der anzeigt, ob das Feld den Wert Null hat.

public native boolean getBoolean();
public void setBoolean(boolean v)
public native byte getByte();
public void setByte(byte v)
public native byte[] getBytes();
public void setBytes(byte[] v)
public native double getDouble();
public void setDouble(double v)
public native float getFloat();
public void setFloat(float v)
public native int getInt();
public void setInt(int v)
public native long getLong();
public void setLong(long v)
public native short getShort();
public void setShort(short v)
public native String getString();
public void setString(String v)
public native boolean isNull();
public void setNull()
public Object getObject()
public Object getObject(Class c)
public void setObject(Object value)


ObjectProxy-Objekt (Syntax von ADO für WFC)

Ein ObjectProxy-Objekt repräsentiert einen Server und wird von der createObject-Methode des DataSpace-Objekts zurückgegeben. Die ObjectProxy-Klasse beinhaltet eine einzige Methode, die call-Methode, die ihrerseits eine Methode auf dem Server aufrufen und ein aus diesem Aufruf resultierendes Objekt zurückgeben kann.

package com.ms.wfc.data

Methoden

Call-Methode (Syntax von ADO für WFC)

Ruft eine Methode auf dem vom ObjectProxy-Objekt repräsentierten Server auf. Optional können Argumente der Methode als Objektarray übergeben werden.

Syntax

public Object ObjectProxy.call( String method )
public Object ObjectProxy.call( String method, Object[] args)

Rückgabewerte

Object Ein aus dem Aufruf der Methode resultierendes Objekt.

Parameter

ObjectProxy Ein ObjectProxy-Objekt, das den Server repräsentiert.

method Eine Zeichenfolge, die den Namen der auf dem Server aufzurufenden Methode enthält.

args Optional. Ein Array mit Objekten, die Argumente der Methode auf dem Server sind. Java-Datentypen werden automatisch in Datentypen konvertiert, die für die Verwendung auf dem Server geeignet sind.


Parameter-Objekt (Syntax von ADO für WFC)

package com.ms.wfc.data

Konstruktor

public Parameter()
public Parameter(String name)
public Parameter(String name, int type)
public Parameter(String name, int type, int dir)
public Parameter(String name, int type, int dir, int size)
public Parameter(String name, int type, int dir, int size, Object value)

Methoden

public void appendChunk(byte[] bytes)
public void appendChunk(char[] chars)
public void appendChunk(String chars)

Eigenschaften

public int getAttributes()
public void setAttributes(int attr)
public int getDirection()
public void setDirection(int dir)
public String getName()
public void setName(String name)
public int getNumericScale()
public void setNumericScale(int scale)
public int getPrecision()
public void setPrecision(int prec)
public int getSize()
public void setSize(int size)
public int getType()
public void setType(int type)
public com.ms.com.Variant getValue()
public void setValue(Object v)
public AdoProperties getProperties()

Parameter-Zugriffsmethoden

Die Value-Eigenschaft eines Parameter-Objekts fragt den Inhalt des Objekts ab bzw. legt diesen fest. Der Inhalt ist als Variant dargestellt, ein Objekttyp, dem ein Wert und einer von mehreren Datentypen zugewiesen werden kann.

ADO/WFC implementiert die Value-Eigenschaft mit der getValue-Methode, die ein Variant–Objekt zurückgibt, sowie mit der setValue-Methode, die einen Wert vom Datentyp Variant als Argument verwendet. Werte vom Datentyp Variant sind in bestimmten Sprachen, wie z. B. Microsoft Visual Basic, sehr effizient. Sie können jedoch in Microsoft Visual J++ eine besseres Leistungsverhalten erzielen, wenn Sie systemeigene Java-Datentypen verwenden.

Zusätzlich zur Value-Eigenschaft stellt ADO/WFC Zugriffsmethoden zur Verfügung, die Java-Datentypen zum Abfragen und Festlegen des Inhalts von Parameter-Objekten verwenden. Die Namen der meisten dieser Methoden haben das Format get Datentyp oder set Datentyp.

Es gibt eine erwähnenswerte Ausnahme: Es existiert keine getNull-Eigenschaft; stattdessen gibt es eine isNull-Eigenschaft, die einen booleschen Wert zurückgibt, der anzeigt, ob das Feld den Wert Null hat.

public boolean getBoolean()
public void setBoolean(boolean v)
public byte getByte()
public void setByte(byte v)
public double getDouble()
public void setDouble(double v)
public float getFloat()
public void setFloat(float v)
public int getInt()
public void setInt(int v)
public long getLong()
public void setLong(long v)
public short getShort()
public void setShort(short v)
public String getString()
public void setString(String v)
public boolean isNull()
public void setNull()


Recordset-Objekt (Syntax von ADO für WFC)

package com.ms.wfc.data

Konstruktoren

public Recordset()
public Recordset(Object r)

Methoden

public void addNew(Object[] fieldList, Object[] valueList)
public void addNew(Object[] valueList)
public void addNew()
public void cancel()
public void cancelBatch(int affectRecords)
public void cancelBatch()
public void cancelUpdate()
public Object clone()
public Object clone(int lockType)
public void close()
public int compareBookmarks(Object bookmark1, Object bookmark2)
public void delete(int affectRecords)
public void delete()
public void find(String criteria)
public void find(String criteria, int SkipRecords)
public void find(String criteria, int SkipRecords, int searchDirection)
public void find(String criteria, int SkipRecords, int searchDirection, Object bmkStart)
public Object[][] getRows(int Rows, Object bmkStart, Object[] fieldList)
public void move(int numRecords)
public void move(int numRecords, Object bmkStart)
public void moveFirst()
public void moveLast()
public void moveNext()
public void movePrevious()
public Recordset nextRecordset()
public Recordset nextRecordset(int[] recordsAffected)
public void open()
public void open(Object source)
public void open(Object source, Object activeConnection)
public void open(Object source, Object activeConnection, int cursorType)
public void open(Object source, Object activeConnection, int cursorType,
                        int lockType)
public void open(Object source, Object activeConnection, int cursorType,
                        int lockType, int options)
public void requery()
public void requery(int options)
public void resync()
public void resync(int affectRecords, int resyncValues)
public void save(String fileName)
public void save(String fileName, int persistFormat)
public boolean supports(int cursorOptions)
public void update()
public void update(Object[] valueList)
public void update(Object[] fieldList, Object[] valueList)
public void updateBatch()
public void updateBatch(int affectRecords)

Eigenschaften

public int getAbsolutePage()
public void setAbsolutePage(int page)
public int getAbsolutePosition()
public void setAbsolutePosition(int pos)
public Command getActiveCommand()
public Connection getActiveConnection()
public void setActiveConnection(String conn)
public void setActiveConnection(com.ms.wfc.data.Connection c)
public boolean getBOF()
public boolean getEOF()
public Object getBookmark()
public void setBookmark(Object bmk)
public int getCacheSize()
public void setCacheSize(int size)
public int getCursorLocation()
public void setCursorLocation(int cursorLoc)
public int getCursorType()
public void setCursorType(int cursorType)
public String getDataMember()
public void setDataMember(String pbstrDataMember)
public Iunknown getDataSource()
public void setDataSource(IUnknown dataSource)
public int getEditMode()
public Object getFilter()
public void setFilter(Object filter)
public int getLockType()
public void setLockType(int lockType)
public int getMarshalOptions()
public void setMarshalOptions(int options)
public int getMaxRecords()
public void setMaxRecords(int maxRecords)
public int getPageCount()
public int getPageSize()
public void setPageSize(int pageSize)
public int getRecordCount()
public String getSort()
public void setSort(String criteria)
public String getSource()
public void setSource(String query)
public void setSource(com.ms.wfc.data.Command command)
public int getState()
public int getStatus()
public boolean getStayInSync()
public void setStayInSync(boolean pbStayInSync)
public com.ms.wfc.data.Field getField(int n)
public com.ms.wfc.data.Field getField(String n)
public com.ms.wfc.data.Fields getFields()
public AdoProperties getProperties()

Ereignisse

Weitere Informationen zu ADO/WFC-Ereignissen finden Sie unter ADO-Ereignisse in ADO/WFC.

public void addOnEndOfRecordset(RecordsetEventHandler handler)
public void removeOnEndOfRecordset(RecordsetEventHandler handler)
public void addOnFetchComplete(RecordsetEventHandler handler)
public void removeOnFetchComplete(RecordsetEventHandler handler)
public void addOnFetchProgress(RecordsetEventHandler handler)
public void removeOnFetchProgress(RecordsetEventHandler handler)
public void addOnFieldChangeComplete(RecordsetEventHandler handler)
public void removeOnFieldChangeComplete(RecordsetEventHandler handler)
public void addOnMoveComplete(RecordsetEventHandler handler)
public void removeOnMoveComplete(RecordsetEventHandler handler)
public void addOnRecordChangeComplete(RecordsetEventHandler handler)
public void removeOnRecordChangeComplete(RecordsetEventHandler handler)
public void addOnRecordsetChangeComplete(RecordsetEventHandler handler)
public void removeOnRecordsetChangeComplete(RecordsetEventHandler handler)
public void addOnWillChangeField(RecordsetEventHandler handler)
public void removeOnWillChangeField(RecordsetEventHandler handler)
public void addOnWillChangeRecord(RecordsetEventHandler handler)
public void removeOnWillChangeRecord(RecordsetEventHandler handler)
public void addOnWillChangeRecordset(RecordsetEventHandler handler)
public void removeOnWillChangeRecordset(RecordsetEventHandler handler)
public void addOnWillMove(RecordsetEventHandler handler)
public void removeOnWillMove(RecordsetEventHandler handler)


ADO-Beispiele

Das MDAC-SDK enthält mehrere Beispielanwendungen, die die Verwendung von ADO- und RDS-Code veranschaulichen. Weitere Informationen zu diesen Beispielen finden Sie unter Beispielanwendungen.

In der ADO-Dokumentation finden Sie außerdem mehrsprachige Codebeispiele, die in dieser Hilfe behandelt werden. Weitere Informationen zu diesen Beispielen finden Sie unter ADO-Codebeispiele.

Es gibt viele weitere Beispielcoderessourcen. Die Visual Studio-Dokumentation und die MSDN Library enthalten eine Vielzahl von Beispielanwendungen und Dokumentation, mit deren Hilfe Sie mehr über ADO und RDS erfahren.

Visual Studio Samples

  • Visual Studio Solutions Center Web site

  • Island Hopper News Sample

  • Visual Basic Samples

  • Visual C++ Samples

  • Visual Interdev Samples

  • Visual J++ Samples

Visual Studio-Dokumentation

  • Visual Studio: Data Access and Security Strategies

  • Visual Basic: Data Access Guide

  • Visual Interdev: Integrating Databases

  • Visual J++: Accessing Data


Beispielanwendungen

In den folgenden Abschnitten werden die Beispielanwendungen beschrieben, die im Lieferumfang von MDAC für ADO und RDS enthalten sind. Anhand dieser Beispiele können die Kunden lernen, wie sie ADO und RDS einsetzen. Die Beispielanwendungen sollten jedoch nicht auf den Produktionsservern installiert werden.

Anmerkung Die in den Beispielen verwendeten Unternehmen, Namen und Daten sind immer fiktiv, wenn nicht ausdrücklich etwas anderes angegeben ist.

ADO enthält die folgenden Beispielanwendungen. Sie werden vom Microsoft Platform SDK im Ordner c:\Platform SDK\Samples\DataAccess\ado installiert.

Beispielanwendung | Beschreibung
ADOASP | Dieses Beispiel zeigt, wie ADO in Microsoft Active Server Pages verwendet wird.
ADOISAPI | Dieses Beispiel zeigt, wie ADO in C/C++ ISAPI-Erweiterungen mit Microsoft Internet-Informationsdienste verwendet wird.
ADOJAVA | Dieses Beispiel zeigt, wie ADO in Java und Java mit COM-Integration verwendet wird.
ADOVBS | Dieses Beispiel zeigt, wie ADO in Visual Basic Scripting Edition (VBScript) und HTML verwendet wird. Es veranschaulicht außerdem, wie ADO, VBScript und HTML auf dem Client zum Erstellen von Webanwendungen mit zwei oder drei Ebenen für ein Intranet verwendet werden kann.
MSDAIPP | Dieses Beispiel zeigt, wie die ADO-Objekte Record und Stream mit teilstrukturierten Daten mithilfe des Microsoft OLE DB-Provider für Internet Publishing verwendet werden können.
XML | Dieses Beispiel zeigt, wie ein Recordset im XML-Format im IIS Response-Objekt gespeichert wird, um Daten mit einem XML-Stream an einen Internetclient zu übertragen.

RDS enthält die folgenden Beispielanwendungen, die verdeutlichen, wie RDS zum Erstellen von Intranet- und Internetanwendungen genutzt wird. Sie werden im Ordner c:\Platform SDK\Samples\DataAccess\rds installiert. Bevor Sie die Anwendungen ausführen, sollten Sie für Internet-Informationsdienste ein virtuelles Stammverzeichnis mit Skript- und Ausführungsberechtigungen mit der Bezeichnung RDS einrichten, das auf das Installationsverzeichnis für die RDS-Beispiele zeigt.

Beispielanwendung | Beschreibung
RDSTest | Dieses Beispiel veranschaulicht eine einfache Einsatzmöglichkeit von RDS.
Address Book | Dieses Beispiel demonstriert die praktische Verwendung von RDS in einer einfachen Firmenverzeichnisanwendung.
Handler | Diese Beispiel veranschaulicht benutzerdefinierte DataFactory-Handler in Visual Basic und Visual C++.

Anmerkung Bei der Installation der RDS-Beispielanwendungen wird das SQL Server-Konto adcdemo mit dem Kennwort adcdemo erstellt. Möglicherweise wird eine Fehlermeldung angezeigt, dass bei der Anmeldung ein Fehler aufgetreten ist, wenn Sie die Beispielanwendungen ausführen. Setzen Sie in diesem Fall Benutzernamen und Kennwort auf die Informationen im Testkonto zurück.


ADO ASP-Beispiel

ADOASP zeigt, wie ADO in Microsoft Active Server Pages verwendet wird. Dieses Beispiel wird im Ordner c:\Platform SDK\Samples\DataAccess\ado\ASP installiert.

In diesem Beispiel werden Angaben zu Büchern, wie zum Beispiel Titel und Preise, aus der Pubs-Beispieldatenbank abgerufen. ADOASP ermöglicht Webclients, in den Titeln zu suchen und den Gesamtpreis der ausgewählten Bücher zu berechnen.

Für dieses Beispiel muss außerdem die Pubs-Beispieldatenbank in Microsoft SQL Server installiert sein.

So führen Sie ADOASP aus

  1. Kopieren Sie die ASP-, JPG- und GIF-Dateien dieses Beispiels in ein Verzeichnis mit Lese- und Ausführungsberechtigungen auf Ihrem Webservercomputer.

  2. Öffnen Sie die Datei cmpsales.asp im Webbrowser unter folgender Adresse: http://Computername/virtuelles Verzeichnis/cmpsales.asp, wobei Computername und virtuelles Verzeichnis den Computernamen bzw. das virtuelle Verzeichnis bezeichnen, das auf die in Schritt 1 kopierten Dateien zeigt.


ADO ISAPI-Beispiel

ADOISAPI zeigt, wie ADO in C/C++ ISAPI-Erweiterungen mit Microsoft Internet-Informationsdienste verwendet wird. Dieses Beispiel wird im Ordner c:\Platform SDK\Samples\DataAccess\ado\isapi installiert.

Es stellt eine Verbindung zu einer Datenbank her, ruft Daten ab, formatiert die Daten als HTML-Tabelle und gibt die Daten an den Browser des Clients zurück. Die Verbindung zur Datenbank wird in diesem Beispiel zwischengespeichert, um das Leistungsverhalten zu verbessern.

So führen Sie ADOISAPI aus

  1. Kopieren Sie die Datei isapi.dll mit Ausführungsberechtigung in ein Verzeichnis auf dem Webserver.

  2. Kopieren Sie die Datei adoisapi.htm mit Leseberechtigung in dasselbe Verzeichnis auf dem Webserver.

  3. Richten Sie auf dem Webserver einen ODBC-System-DSN mit der Bezeichnung OLE_DB_NWind_Jet ein. Zeigen Sie im Startmenü auf Programme und dann Verwaltung. Wählen Sie Datenquellen (ODBC) aus.

  4. Klicken Sie auf der Registerkarte System-DSN auf Hinzufügen. Wählen Sie in der Liste der verfügbaren Treiber Microsoft Access Driver (.mdb) aus. Klicken Sie auf Fertig stellen.

  5. Geben Sie im Dialogfeld ODBC Microsoft Access Setup in das Feld Datenquellenname die Zeichenfolge OLE_DB_NWind_Jet ein. Geben Sie MDAC SDK-Beispieldaten in das Feld Beschreibung ein.

  6. Klicken Sie unter Datenbank auf Auswählen, und suchen Sie nach <Laufwerk>:\Platform SDK\Samples\DataAccess\ado\xml. Wählen Sie Nwind.mdb aus, und klicken Sie auf OK.

  7. Klicken Sie im Dialogfeld ODBC Microsoft Access Setup auf OK. Klicken Sie im Dialogfeld ODBC-Datenquellen-Administrator erneut auf OK.

  8. Für den Importpfad von msado15.dll in Zeile 14 wird von einer Installation auf Laufwerk C: ausgegangen. Ändern Sie gegebenenfalls den Pfad auf das Laufwerk, auf dem ADO installiert ist (z. B. D:\...).

    Anmerkung Wenn Sie diese Beispielanwendung in Verbindung mit Visual C++ 6.0 verwenden, wird möglicherweise die Linkerwarnung LNK4089 angezeigt. Denn ADOISAPI wird unter Visual C++ 6.0 auf Geschwindigkeit erhöhen voreingestellt. Diese Warnungen können Sie ignorieren.


ADO Java-Beispiel

ADOJAVA zeigt, wie ADO in Java und Java mit COM-Integration verwendet wird. Dieses Beispiel wird im Ordner c:\Platform SDK\Samples\DataAccess\ado\Java installiert.

Es kann als Applet in einem Browser oder als eigenständige Anwendung ausgeführt werden. Diese Beispielanwendung öffnet ein Recordset-Objekt von ADO, zeigt den aktuellen Datensatz an und ermöglicht dem Benutzer mithilfe von Schaltflächen die Navigation in den Informationen. Darüber hinaus wird die Verwendung von Befehlszeilenparametern veranschaulicht.

So führen Sie ADOJAVA aus

  1. Dieses Beispiel verwendet den ODBC-DSN mit dem Namen OLE_DB_Nwind_Jet mit der Benutzer-ID Admin und einem leeren Kennwort. Richten Sie auf dem Webserver einen ODBC-System-DSN mit der Bezeichnung OLE_DB_NWind_Jet ein. Zeigen Sie im Startmenü auf Programme und dann Verwaltung. Wählen Sie Datenquellen (ODBC) aus.

  2. Klicken Sie auf der Registerkarte System-DSN auf Hinzufügen. Wählen Sie in der Liste der verfügbaren Treiber Microsoft Access Driver (.mdb) aus. Klicken Sie auf Fertig stellen.

  3. Geben Sie im Dialogfeld ODBC Microsoft Access Setup in das Feld Datenquellenname die Zeichenfolge OLE_DB_NWind_Jet ein. Geben Sie MDAC SDK-Beispieldaten in das Feld Beschreibung ein.

  4. Klicken Sie unter Datenbank auf Auswählen, und suchen Sie nach <Laufwerk>:\Platform SDK\Samples\DataAccess\ado\xml. Wählen Sie Nwind.mdb aus, und klicken Sie auf OK.

  5. Klicken Sie im Dialogfeld ODBC Microsoft Access Setup auf OK. Klicken Sie im Dialogfeld ODBC-Datenquellen-Administrator erneut auf OK.

  6. Öffnen Sie die Projektdatei Simpleado.vjp in Microsoft Visual J++ 6.0 oder höher.

  7. Klicken Sie im Menü Debuggen auf Start.

  8. Wenn Sie einen anderen Modus verwenden möchten, wählen Sie im Menü Projekt die Option simpleado Properties aus.

  9. Klicken Sie auf der Registerkarte Starten auf das Feld Nach Projektstart laden, und wählen Sie einen der drei Modi aus.

  10. Klicken Sie auf OK, und gehen Sie wie in Schritt 3 weiter oben beschrieben vor.


ADO VBScript-Beispiel

ADOVBS zeigt, wie ADO in Visual Basic Scripting Edition (VBScript) und HTML verwendet wird. Es veranschaulicht außerdem, wie ADO, VBScript und HTML auf dem Client zum Erstellen von Webanwendungen mit zwei oder drei Ebenen für ein Intranet verwendet werden kann. Schließlich zeigt es, wie Sie mit ADO und dem Microsoft OLE DB Remoting Provider eine aus drei Ebenen bestehende Verbindung erstellen. Dieses Beispiel wird im Ordner c:\Programme\Platform SDK\Samples\DataAccess\ado\VBS installiert.

In diesem Beispiel wird ein Teil des VBScript- und HTML-Codes zur Laufzeit generiert, um Felder basierend auf den Schemainformationen im Recordset-Objekt zu erstellen.

Von diesem Codebeispiel gibt es in diesem Verzeichnis zwei Varianten. Das erste Beispiel, ADOVBS.HTM, verwendet nur clientbasiertes Skripting. Darüber hinaus müssen ADO und ein System-DSN mit der Bezeichnung OLE_DB_NWind_Jet, der auf die MDAC SDK-MDB-Beispieldatei (Microsoft Access-Datenbank) verweist, auf dem Client installiert sein. Sie finden diese Datenbank unter c:\Platform SDK\Samples\DataAccess\ado\XML\Nwind.mdb. Dieses Beispiel veranschaulicht die direkte Verbindung zur Datenquelle vom Webclient.

Anmerkung Für dieses Beispiel ist Microsoft Internet Explorer 4.01 Service Pack 1 oder höher erforderlich. Außerdem müssen Sie für den Webserver, zu dem Sie eine Verbindung herstellen, niedrige Sicherheitseinstellungen festlegen.

Die zweite Variante dieses Beispiels, Adovbs.asp, verwendet IIS-Skripting und clientbasiertes Skripting. Es wird davon ausgegangen, dass Sie das Beispiel auf einem Computer ausführen, auf dem Internet Explorer 4.0 oder höher installiert ist.

So führen Sie ADOVBS aus

  1. Kopieren Sie die Dateien im Ordner c:\Platform SDK\Samples\DataAccess\ado\vbs in ein virtuelles Verzeichnis mit Skript- und Ausführungsberechtigungen auf Ihrem Webserver.

  2. Öffnen Sie in Internet Explorer die Seite Adovbs.asp unter der Adresse http:// Computername/virtuelles Verzeichnis/ADOVBS.ASP, wobei Computername und virtuelles Verzeichnis den Computernamen bzw. das virtuelle Verzeichnis bezeichnen, das auf die in Schritt 1 kopierten Dateien zeigt.


ADO Internet Publishing-Beispiel

MSDAIPP zeigt, wie die ADO-Objekte Record und Stream mit teilstrukturierten Daten mithilfe des Microsoft OLE DB-Provider für Internet Publishing verwendet werden können. Dieses Beispiel wird im Ordner c:\Platform SDK\Samples\DataAccess\ado\MSDAIPP installiert.

So führen Sie MSDAIPP aus

  1. Öffnen Sie das Projekt Msdaipp.vbp in Microsoft Visual Basic.

  2. Bearbeiten Sie die Zeile in der Form_Load-Prozedur von form1.frm, die auf den Server verweist. Ersetzen Sie den Wert der Zeichenfolge "http://MyServer/DAVfs/" durch den Namen Ihres Webservers und den Pfad zum Dateispeicher. Der Webserver muss die FrontPage Web Extender Client (WEC)- oder die Web Distributed Authoring and Versioning (WebDAV)-Protokollerweiterungen unterstützen.

  3. Klicken Sie im Menü Ausführen auf Starten, vollständige Kompilierung.


ADO XML-Beispiel

Das ADO XML-Beispiel zeigt, wie ein Recordset im XML-Format im IIS Response-Objekt gespeichert wird, um Daten mit einem XML-Stream an einen Internetclient zu übertragen. Dieses Beispiel wird im Ordner c:\Platform SDK\Samples\DataAccess\ado\XML installiert. Um den XML-Stream direkt an das ASP Response-Objekt zu übertragen, muss für dieses Beispiel Microsoft Internet-Informationsdienste 5.0 (IIS) oder höher installiert sein.

So führen Sie das ADO XML-Beispiel aus

  1. Erstellen Sie mit dem Internetdienste-Manager ein virtuelles Verzeichnis in IIS, das auf das XML-Verzeichnis mit den Beispieldateien zeigt. Erteilen Sie dem virtuellen Verzeichnis Skriptberechtigungen.

  2. Öffnen Sie in Internet Explorer die Adresse http://Servername/XML/default.htm, wobei Servername den Namen Ihres Webservers bezeichnet.


RDS Test-Beispiel

RDSTEST ist eine einfache ASP-Datei, die die Verwendung von RDS aufzeigt. Dieses Beispiel wird im Ordner c:\Platform SDK\Samples\DataAccess\rds\RDSTest installiert.

Anmerkung Für dieses Beispiel ist Microsoft Internet Explorer 4.01 Service Pack 1 oder höher erforderlich. Außerdem müssen Sie für den Webserver, zu dem Sie eine Verbindung herstellen, niedrige Sicherheitseinstellungen festlegen.

RDSTEST liegt im ASP-Format vor (der Name Ihres Hostservers wird automatisch eingesetzt), es kann jedoch auf einfache Weise geändert werden, so dass es als HTM-Seite angezeigt wird.

So bearbeiten Sie dieses Beispiel, damit es im HTM-Format angezeigt wird

  1. Öffnen Sie die ASP-Datei in einem Texteditor, wie z. B. Editor.

  2. Ersetzen Sie die Zeichenfolge <%=Request.ServerVariables("SERVER_NAME")%> durch den Namen Ihres Webservers.


RDS Address Book-Beispiel

Das RDS-Beispiel Address Book ist eine einfache Firmenverzeichnisanwendung. Dieses Beispiel wird im Ordner c:\Platform SDK\Samples\DataAccess\rds\AddrBook installiert.

Weitere Informationen zu dieser Anwendung finden Sie unter Beispielanwendung Address Book.

Anmerkung Für dieses Beispiel ist Microsoft Internet Explorer 4.01 Service Pack 1 oder höher erforderlich. Außerdem müssen Sie für den Webserver, zu dem Sie eine Verbindung herstellen, niedrige Sicherheitseinstellungen festlegen.

Dieses Beispiel liegt im ASP-Format vor (der Name Ihres Hostservers wird automatisch eingesetzt), es kann jedoch auf einfache Weise geändert werden, so dass es als HTM-Seite angezeigt wird.

So bearbeiten Sie dieses Beispiel, damit es im HTM-Format angezeigt wird

  1. Öffnen Sie die ASP-Datei in einem Texteditor, wie z. B. Editor.

  2. Ersetzen Sie die Zeichenfolge <%=Request.ServerVariables("SERVER_NAME")%> durch den Namen Ihres Webservers.


RDS Handler-Beispiel

Das RDS Handler-Beispiel enthält benutzerdefinierte Visual Basic- und Visual C++-DataFactory-Handler, die Sie für spezielle Anwendungen anpassen können. Dieses Beispiel wird im Ordner c:\Platform SDK\Samples\DataAccess\rds\Handler installiert.

Lesen Sie unbedingt das Hilfethema DataFactory-Anpassung, um den Code in diesem Handlerbeispiel besser zu verstehen.


ADO-Codebeispiele

Verwenden Sie die folgenden Codebeispiele, um zu erfahren, wie Sie die Objekte, Methoden, Eigenschaften und Ereignisse von ADO einsetzen können.

Anmerkung Fügen Sie das gesamte Codebeispiel in den Code-Editor ein. Wenn nur Teile der Beispiele verwendet werden oder die Absatzformatierung verloren geht, wird das Beispiel möglicherweise nicht ordnungsgemäß ausgeführt.

  • ADO-Codebeispiele in Microsoft Visual Basic

  • ADO-Codebeispiele in Microsoft Visual Basic Scripting Edition

  • ADO-Codebeispiele in Microsoft Visual C++

  • ADO-Codebeispiele in Microsoft Visual J++


ADO-Codebeispiele in Microsoft Visual Basic

Verwenden Sie die folgenden Codebeispiele, um zu erfahren, wie Sie die Methoden, Eigenschaften und Ereignisse von ADO beim Schreiben in Visual Basic einsetzen können.

Anmerkung Fügen Sie das gesamte Codebeispiel, von "Sub" bis "End Sub", in den Code-Editor ein. Wenn nur Teile der Beispiele verwendet werden oder die Absatzformatierung verloren geht, wird das Beispiel möglicherweise nicht ordnungsgemäß ausgeführt.

Methoden

  • Beispiel für die AddNew-Methode

  • Beispiel für die Append- und CreateParameter-Methoden

  • Beispiel für die AppendChunk- und GetChunk-Methoden

  • Beispiel für die BeginTrans-, CommitTrans- und RollbackTrans-Methoden

  • Beispiel für die Cancel-Methode

  • Beispiel für die Clone-Methode

  • Beispiel für die CompareBookmarks-Methode

  • Beispiel für die ConvertToString-Methode

  • Beispiel für die CopyRecord-, CopyTo- und SaveToFile-Methoden

  • Beispiel für die CreateRecordset-Methode

  • Beispiel für die Delete-Methode

  • Beispiel für die DeleteRecord- und MoveRecord-Methoden

  • Beispiel für die Execute-, Requery- und Clear-Methoden

  • Beispiel für die Find-Methode

  • Beispiel für die GetRows-Methode

  • Beispiel für die GetString-Methode

  • Beispiel für die SkipLine-Methode, EOS- und LineSeparator-Eigenschaften

  • Beispiel für die Move-Methode

  • Beispiel für die MoveFirst-, MoveLast-, MoveNext- und MovePrevious-Methoden

  • Beispiel für die NextRecordset-Methode

  • Beispiel für die Open- und Close-Methoden

  • Beispiel für die OpenSchema-Methode

  • Beispiel für die Read-, ReadText-, Write- und WriteText-Methoden

  • Beispiel für die Refresh-Methode

  • Beispiel für die Resync-Methode

  • Beispiel für die Save- und Open-Methoden

  • Beispiel für die Seek-Methode und die Index-Eigenschaft

  • Beispiel für die Supports-Methode

  • Beispiel für die Methoden Update and CancelUpdate

  • Beispiel für die UpdateBatch- und CancelBatch-Methoden

Eigenschaften

  • Beispiel für die AbsolutePage-, PageCount- und PageSize-Eigenschaften

  • Beispiel für die AbsolutePosition- und CursorLocation-Eigenschaften

  • Beispiel für die ActiveCommand-Eigenschaft

  • Beispiel für die ActiveConnection-, CommandText-, CommandTimeout-, CommandType-, Size- und Direction-Eigenschaften

  • Beispiel für die ActualSize- und DefinedSize-Eigenschaften

  • Beispiel für die Attributes- und Name-Eigenschaften

  • Beispiel für die BOF-, EOF- und Bookmark-Eigenschaften

  • Beispiel für die CacheSize-Eigenschaft

  • Beispiel für die ConnectionString-, ConnectionTimeout- und State-Eigenschaften

  • Beispiel für die Count-Eigenschaft

  • Beispiel für die CursorType-, LockType- und EditMode-Eigenschaften

  • Beispiel für die Description-, NativeError-, Number-, Source- und SQLState-Eigenschaften

  • Beispiel für die EOS- und LineSeparator-Eigenschaften, SkipLine-Methode

  • Beispiel für die Filter- und RecordCount-Eigenschaften

  • Beispiel für die Handler-Eigenschaft

  • Beispiel für die InternetTimeout-Eigenschaft

  • Beispiel für die IsolationLevel- und Mode-Eigenschaften

  • Beispiel für die Item-Eigenschaft

  • Beispiel für die MarshalOptions-Eigenschaft

  • Beispiel für die MaxRecords-Eigenschaft

  • Beispiel für die NumericScale- und Precision-Eigenschaften

  • Beispiel für die Optimize-Eigenschaft

  • Beispiel für die OriginalValue- und UnderlyingValue-Eigenschaften

  • Beispiel für die Prepared-Eigenschaft

  • Beispiel für die Provider- und DefaultDatabase-Eigenschaften

  • Beispiel für die Sort-Eigenschaft

  • Beispiel für die Source-Eigenschaft

  • Beispiel für die State-Eigenschaft

  • Beispiel für die Status-Eigenschaft

  • Beispiel für die StayInSync-Eigenschaft

  • Beispiel für die Type-Eigenschaft (Field)

  • Beispiel für die Type-Eigenschaft (Property)

  • Beispiel für die Value-Eigenschaft

  • Beispiel für die Version-Eigenschaft


Beispiel für die AbsolutePage-, PageCount- und PageSize-Eigenschaften (VB)

Public Sub AbsolutePageX()

    Dim rstEmployees As ADODB.Recordset
    Dim strCnn As String
    Dim strMessage As String
    Dim intPage As Integer
    Dim intPageCount As Integer
    Dim intRecord As Integer

    ' Ein Recordset mit einem Clientcursor
    ' für die Employees-Tabelle öffnen.
    strCnn = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=Pubs;User Id=sa;Password=; "
    Set rstEmployees = New ADODB.Recordset
    ' Den Clientcursor zum Aktivieren der AbsolutePosition-Eigenschaft
    ' verwenden.
    rstEmployees.CursorLocation = adUseClient
    rstEmployees.Open "employee", strCnn, , , adCmdTable

    ' Namen und Einstellungsdaten anzeigen, fünf Datensätze
    ' gleichzeitig.
    rstEmployees.PageSize = 5
    intPageCount = rstEmployees.PageCount
    For intPage = 1 To intPageCount
        rstEmployees.AbsolutePage = intPage
        strMessage = ""
        For intRecord = 1 To rstEmployees.PageSize
            strMessage = strMessage & _
                rstEmployees!fname & " " & _
                rstEmployees!lname & " " & _
                rstEmployees!hire_date & vbCr
            rstEmployees.MoveNext
            If rstEmployees.EOF Then Exit For
        Next intRecord
        MsgBox strMessage
    Next intPage
    rstEmployees.Close

End Sub


Beispiel für die AbsolutePosition- und CursorLocation-Eigenschaften (VB)

In diesem Beispiel wird gezeigt, wie mit der AbsolutePosition-Eigenschaft der Fortschritt einer Schleife überwacht werden kann, die alle Datensätze eines Recordset-Objekts aufzählt. Dabei wird zum Aktivieren der AbsolutePosition-Eigenschaft die CursorLocation-Eigenschaft verwendet, indem der Cursor auf einen Clientcursor gesetzt wird.

Public Sub AbsolutePositionX()

    Dim rstEmployees As ADODB.Recordset
    Dim strCnn As String
    Dim strMessage As String

    ' Ein Recordset mit einem Clientcursor für die
    ' Employees-Tabelle öffnen.
    strCnn = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=Pubs;User Id=sa;Password=; "
    Set rstEmployees = New ADODB.Recordset
    ' Den Clientcursor zum Aktivieren der AbsolutePosition-Eigenschaft
    ' verwenden.
    rstEmployees.CursorLocation = adUseClient
    rstEmployees.Open "employee", strCnn, , , adCmdTable

    ' Recordset auflisten.
    Do While Not rstEmployees.EOF
        ' Aktuelle Datensatzinformationen anzeigen.
        strMessage = "Employee: " & rstEmployees!lName & vbCr & _
            "(record " & rstEmployees.AbsolutePosition & _
            " of " & rstEmployees.RecordCount & ")"
        If MsgBox(strMessage, vbOKCancel) = vbCancel _
            Then Exit Do
        rstEmployees.MoveNext
    Loop

    rstEmployees.Close

End Sub


Beispiel für die ActiveCommand-Eigenschaft (VB)

Dieses Beispiel verdeutlicht die ActiveCommand-Eigenschaft.

Dabei wird einer Unterroutine ein Recordset-Objekt übergeben, dessen ActiveCommand-Eigenschaft verwendet wird, um den Befehlstext und -parameter darzustellen, die das Recordset-Objekt erstellt haben.

Public Sub Main()
    ActiveCommandX
End Sub

Public Sub ActiveCommandX()
Dim cnn As New ADODB.Connection
Dim cmd As New ADODB.Command
Dim rst As New ADODB.Recordset
Dim strPrompt As String, strName As String

strPrompt = "Enter an author's name (e.g., Ringer): "
strName = Trim(InputBox(strPrompt, "ActiveCommandX Example"))
cmd.CommandText = "SELECT * FROM Authors WHERE au_lname = ?"
cmd.Parameters.Append _
    cmd.CreateParameter("LastName", adChar, adParamInput, 20, strName)

cnn.Open "DSN=Pubs;Provider=MSDASQL; uid=sa; pwd=;"
cmd.ActiveConnection = cnn
Set rst = cmd.Execute(, , adCmdText)
ActiveCommandXprint rst

rst.Close
cnn.Close
End Sub

Der ActiveCommandXprint-Routine wird zwar lediglich ein Recordset-Objekt übergeben, jedoch muss sie den Befehlstext und -parameter drucken, die das Recordset-Objekt erstellt haben. Dies kann durchgeführt werden, da die ActiveCommand-Eigenschaft des Recordset-Objekts das zugeordnete Command-Objekt liefert.

Die CommandText-Eigenschaft des Command-Objekts liefert den parametrisierten Befehl, der das Recordset-Objekt erstellt hat. Die Parameters-Auflistung des Command-Objekts liefert den Wert, der für den Platzhalter des Befehlsparameters ("?") ersetzt wurde.

Anschließend wird eine Fehlermeldung oder der Name sowie die ID des Autors gedruckt.

Public Sub ActiveCommandXprint(rstp As ADODB.Recordset)
Dim strName As String

strName = rstp.ActiveCommand.Parameters.Item("LastName").Value

Debug.Print "Command text = '"; rstp.ActiveCommand.CommandText; "'"
Debug.Print "Parameter = '"; strName; "'"

If rstp.BOF = True Then
    Debug.Print "Name = '"; strName; "', not found."
Else
    Debug.Print "Name = '"; rstp!au_fname; " "; rstp!au_lname; _
            "', author ID = '"; rstp!au_id; "'"
End If

End Sub


Beispiel für die ActiveConnection-, CommandText-, CommandTimeout-, CommandType-, Size- und Direction-Eigenschaften (VB)

In diesem Beispiel werden die Eigenschaften ActiveConnection, CommandText, CommandTimeout, CommandType, Size und Direction verwendet, um eine gespeicherte Prozedur auszuführen.

Public Sub ActiveConnectionX()

    Dim cnn1 As ADODB.Connection
    Dim cmdByRoyalty As ADODB.Command
    Dim prmByRoyalty As ADODB.Parameter
    Dim rstByRoyalty As ADODB.Recordset
    Dim rstAuthors As ADODB.Recordset
    Dim intRoyalty As Integer
    Dim strAuthorID As String
    Dim strCnn As String

    ' Command-Objekt für eine gespeicherte Prozedur definieren.
    Set cnn1 = New ADODB.Connection
    strCnn = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=Pubs;User Id=sa;Password=; "
    cnn1.Open strCnn
    Set cmdByRoyalty = New ADODB.Command
    Set cmdByRoyalty.ActiveConnection = cnn1
    cmdByRoyalty.CommandText = "byroyalty"
    cmdByRoyalty.CommandType = adCmdStoredProc
    cmdByRoyalty.CommandTimeout = 15

    ' Eingabeparameter für die gespeicherte Prozedur definieren.
    intRoyalty = Trim(InputBox( _
        "Enter royalty:"))
    Set prmByRoyalty = New ADODB.Parameter
    prmByRoyalty.Type = adInteger
    prmByRoyalty.Size = 3
    prmByRoyalty.Direction = adParamInput
    prmByRoyalty.Value = intRoyalty
    cmdByRoyalty.Parameters.Append prmByRoyalty

    ' Ein Recordset durch Ausführen des Befehls erstellen.
    Set rstByRoyalty = cmdByRoyalty.Execute()

    ' Die Authors-Tabelle öffnen, um die Autorennamen
    ' zum Anzeigen abzurufen.
    Set rstAuthors = New ADODB.Recordset
    rstAuthors.Open "Authors", strCnn, , , adCmdTable

    ' Aktuelle Daten im Recordset drucken, Autorennamen
    ' aus der Authors-Tabelle hinzufügen.
    Debug.Print "Authors with " & intRoyalty & _
        " percent royalty"
    Do While Not rstByRoyalty.EOF
        strAuthorID = rstByRoyalty!au_id
        Debug.Print , rstByRoyalty!au_id & ", ";
        rstAuthors.Filter = "au_id = '" & strAuthorID & "'"
        Debug.Print rstAuthors!au_fname & " " & _
            rstAuthors!au_lname
        rstByRoyalty.MoveNext
    Loop

    rstByRoyalty.Close
    rstAuthors.Close
    cnn1.Close

End Sub


Beispiel für die ActualSize- und DefinedSize-Eigenschaften (VB)

In diesem Beispiel werden die Eigenschaften ActualSize und DefinedSize verwendet, um die definierte und die tatsächliche Feldgröße anzuzeigen.

Public Sub ActualSizeX()

    Dim rstStores As ADODB.Recordset
    Dim strCnn As String

    ' Ein Recordset für die Stores-Tabelle öffnen.
    strCnn = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=Pubs;User Id=sa;Password=; "
    Set rstStores = New ADODB.Recordset
    rstStores.Open "stores", strCnn, , , adCmdTable

    ' Das Recordset durchsuchen und den Inhalt
    ' des stor_name-Feldes, die definierte Feldgröße
    ' und die tatsächliche Größe anzeigen.
    rstStores.MoveFirst

    Do Until rstStores.EOF
        MsgBox "Store name: " & rstStores!stor_name & _
        vbCr & "Defined size: " & _
        rstStores!stor_name.DefinedSize & _
        vbCr & "Actual size: " & _
        rstStores!stor_name.ActualSize & vbCr
        rstStores.MoveNext
    Loop

    rstStores.Close

End Sub


Beispiel für die AddNew-Methode (VB)

In diesem Beispiel wird die AddNew-Methode zum Erstellen eines neuen Datensatzes mit dem angegebenen Namen verwendet.

Public Sub AddNewX()

    Dim cnn1 As ADODB.Connection
    Dim rstEmployees As ADODB.Recordset
    Dim strCnn As String
    Dim strID As String
    Dim strFirstName As String
    Dim strLastName As String
    Dim booRecordAdded As Boolean

    ' Eine Verbindung öffnen.
    Set cnn1 = New ADODB.Connection
    strCnn = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=Pubs;User Id=sa;Password=;"
    cnn1.Open strCnn

    ' Die Employees-Tabelle öffnen.
    Set rstEmployees = New ADODB.Recordset
    rstEmployees.CursorType = adOpenKeyset
    rstEmployees.LockType = adLockOptimistic
    rstEmployees.Open "employee", cnn1, , , adCmdTable

    ' Daten vom Benutzer abrufen. Die Angestellten-ID muss in der Form
    ' erste, mittlere und letzte Initiale, fünf Zahlen und ein M
    ' oder F zur Angabe des Geschlechts formatiert sein. Beispielsweise
    ' würde die Angestellten-ID für Bill Sornsin "B-S55555M" lauten.
    strID = Trim(InputBox("Enter employee ID:"))
    strFirstName = Trim(InputBox("Enter first name:"))
    strLastName = Trim(InputBox("Enter last name:"))

    ' Nur fortfahren, wenn der Benutzer tatsächlich die Initialen
    ' für den Vor- und Nachnamen eingegeben hat.
    If (strID <> "") And (strFirstName <> "") _
        And (strLastName <> "") Then

        rstEmployees.AddNew
        rstEmployees!emp_id = strID
        rstEmployees!fname = strFirstName
        rstEmployees!lname = strLastName
        rstEmployees.Update
        booRecordAdded = True

        ' Die neu hinzugefügten Daten anzeigen.
        MsgBox "New record: " & rstEmployees!emp_id & " " & _
            rstEmployees!fname & " " & rstEmployees!lname

    Else
        MsgBox "Please enter an employee ID, " & _
            "first name, and last name."
    End If

    ' Den neuen Datensatz löschen, da es sich um ein Beispiel handelt.
    cnn1.Execute "DELETE FROM employee WHERE emp_id = '" & strID & "'"

    rstEmployees.Close
    cnn1.Close

End Sub


Beispiel für die Append- und CreateParameter-Methoden (VB)

In diesem Beispiel werden die Methoden Append und CreateParameter zum Ausführen einer gespeicherten Prozedur mit einem Eingabeparameter verwendet.

Public Sub AppendX()

    Dim cnn1 As ADODB.Connection
    Dim cmdByRoyalty As ADODB.Command
    Dim prmByRoyalty As ADODB.Parameter
    Dim rstByRoyalty As ADODB.Recordset
    Dim rstAuthors As ADODB.Recordset
    Dim intRoyalty As Integer
    Dim strAuthorID As String
    Dim strCnn As String

    ' Eine Verbindung öffnen.
    Set cnn1 = New ADODB.Connection
    strCnn = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=Pubs;User Id=sa;Password=; "
    cnn1.Open strCnn
    cnn1.CursorLocation = adUseClient

    ' Ein Command-Objekt mit einem Parameter erstellen.
    Set cmdByRoyalty = New ADODB.Command
    cmdByRoyalty.CommandText = "byroyalty"
    cmdByRoyalty.CommandType = adCmdStoredProc

    ' Parameterwert abrufen und Parameter anhängen.
    intRoyalty = Trim(InputBox("Enter royalty:"))
    Set prmByRoyalty = cmdByRoyalty.CreateParameter("percentage", _
        adInteger, adParamInput)
    cmdByRoyalty.Parameters.Append prmByRoyalty
    prmByRoyalty.Value = intRoyalty

    ' Recordset durch Ausführen des Befehls erstellen.
    Set cmdByRoyalty.ActiveConnection = cnn1
    Set rstByRoyalty = cmdByRoyalty.Execute

    ' Die Authors-Tabelle öffnen, um die Autorennamen
    ' zum Anzeigen abzurufen.
    Set rstAuthors = New ADODB.Recordset
    rstAuthors.Open "Authors", cnn1, , , adCmdTable

    ' Die aktuellen Daten im Recordset drucken und die
    ' Autorennamen aus der Authors-Tabelle hinzufügen.
    Debug.Print "Authors with " & intRoyalty & " percent royalty"
    Do While Not rstByRoyalty.EOF
        strAuthorID = rstByRoyalty!au_id
        Debug.Print "    " & rstByRoyalty!au_id & ", ";
        rstAuthors.Filter = "au_id = '" & strAuthorID & "'"
        Debug.Print rstAuthors!au_fname & " " & rstAuthors!au_lname
        rstByRoyalty.MoveNext
    Loop

    rstByRoyalty.Close
    rstAuthors.Close
    cnn1.Close

End Sub


Beispiel für die AppendChunk- und GetChunk-Methoden (VB)

In diesem Beispiel werden die Methoden AppendChunk und GetChunk zum Füllen eines Bildfeldes mit Daten aus einem anderen Datensatz verwendet.

Public Sub AppendChunkX()

    Dim cnn1 As ADODB.Connection
    Dim rstPubInfo As ADODB.Recordset
    Dim strCnn As String
    Dim strPubID As String
    Dim strPRInfo As String
    Dim lngOffset As Long
    Dim lngLogoSize As Long
    Dim varLogo As Variant
    Dim varChunk As Variant

    Const conChunkSize = 100

    ' Eine Verbindung öffnen.
    Set cnn1 = New ADODB.Connection
        strCnn = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=Pubs;User Id=sa;Password=; "
    cnn1.Open strCnn

    ' Die pub_info-Tabelle öffnen.
    Set rstPubInfo = New ADODB.Recordset
    rstPubInfo.CursorType = adOpenKeyset
    rstPubInfo.LockType = adLockOptimistic
    rstPubInfo.Open "pub_info", cnn1, , , adCmdTable

    ' Ein Logo zum Kopieren anfordern.
    strMsg = "Available logos are : " & vbCr & vbCr
    Do While Not rstPubInfo.EOF
        strMsg = strMsg & rstPubInfo!pub_id & vbCr & _
            Left(rstPubInfo!pr_info, InStr(rstPubInfo!pr_info, ",") - 1) & _
            vbCr & vbCr
        rstPubInfo.MoveNext
    Loop
    strMsg = strMsg & "Enter the ID of a logo to copy:"
    strPubID = InputBox(strMsg)

    ' Logo abschnittweise in eine Variable kopieren.
    rstPubInfo.Filter = "pub_id = '" & strPubID & "'"
    lngLogoSize = rstPubInfo!logo.ActualSize
    Do While lngOffset < lngLogoSize
        varChunk = rstPubInfo!logo.GetChunk(conChunkSize)
        varLogo = varLogo & varChunk
        lngOffset = lngOffset + conChunkSize
    Loop

    ' Die Daten vom Benutzer abrufen.
    strPubID = Trim(InputBox("Enter a new pub ID" & _
                            " [must be > 9899 & < 9999]:"))
    strPRInfo = Trim(InputBox("Enter descriptive text:"))

   ' Neuen Verleger zur Publishers-Tabelle hinzufügen, um Fehler
   ' aufgrund einer Fremdschlüsselbeschränkung zu vermeiden.
   cnn1.Execute "INSERT publishers(pub_id, pub_name) VALUES('" & _
                  strPubID & "','Your Test Publisher')"

    ' Neuen Datensatz durch abschnittweises Kopieren des Logos hinzufügen.
    rstPubInfo.AddNew
    rstPubInfo!pub_id = strPubID
    rstPubInfo!pr_info = strPRInfo

    lngOffset = 0 ' Offset zurücksetzen.
    Do While lngOffset < lngLogoSize
        varChunk = LeftB(RightB(varLogo, lngLogoSize - lngOffset), _
            conChunkSize)
        rstPubInfo!logo.AppendChunk varChunk
        lngOffset = lngOffset + conChunkSize
    Loop
    rstPubInfo.Update

     ' Die neu hinzugefügten Daten anzeigen.
    MsgBox "New record: " & rstPubInfo!pub_id & vbCr & _
        "Description: " & rstPubInfo!pr_info & vbCr & _
        "Logo size: " & rstPubInfo!logo.ActualSize

    ' Die neuen Datensätze löschen, da es sich um ein Beispiel handelt.
    rstPubInfo.Requery
    cnn1.Execute "DELETE FROM pub_info " & _
        "WHERE pub_id = '" & strPubID & "'"

   cnn1.Execute "DELETE FROM publishers " & _
      "WHERE pub_id = '" & strPubID & "'"

    rstPubInfo.Close
    cnn1.Close

End Sub


Beispiel für die Attributes- und Name-Eigenschaften (VB)

In diesem Beispiel wird der Wert der Attributes-Eigenschaft für die Objekte Connection, Field und Property angezeigt. Mit der Name-Eigenschaft wird der Name jedes Field- und Property-Objekts angezeigt.

Public Sub AttributesX

    Dim cnn1 As ADODB.Connection
    Dim rstEmployees As ADODB.Recordset
    Dim fldLoop As ADODB.Field
    Dim proLoop As ADODB.Property
    Dim strCnn As String

    ' Eine Verbindung und ein Recordset öffnen.
    strCnn = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=Pubs;User Id=sa;Password=; "
    Set cnn1 = New ADODB.Connection
    cnn1.Open strCnn
    Set rstEmployees = New ADODB.Recordset
    rstEmployees.Open "employee", cnn1, , , adCmdTable

    ' Die Verbindungsattribute anzeigen.
    Debug.Print "Connection attributes = " & _
        cnn1.Attributes

    ' Die Attribute der Felder der Employees-Tabelle
    ' anzeigen.
    Debug.Print "Field attributes:"
    For Each fldLoop In rstEmployees.Fields
        Debug.Print "    " & fldLoop.Name & " = " & _
            fldLoop.Attributes
    Next fldLoop

    ' Die Felder der Employees-Tabelle anzeigen, für die
    ' NULL zulässig ist.
    Debug.Print "NULLABLE Fields:"
    For Each fldLoop In rstEmployees.Fields
        If CBool(fldLoop.Attributes And adFldIsNullable) Then
            Debug.Print "   " & fldLoop.Name
        End If
    Next fldLoop

    ' Attribute der Eigenschaften der
    ' Employees-Table anzeigen.
    Debug.Print "Property attributes:"
    For Each proLoop In rstEmployees.Properties
        Debug.Print "    " & proLoop.Name & " = " & _
            proLoop.Attributes
    Next proLoop

    rstEmployees.Close
    cnn1.Close

End Sub


Beispiel für die BeginTrans-, CommitTrans- und RollbackTrans-Methoden (VB)

In diesem Beispiel wird der Buchtyp sämtlicher Psychologiebücher in der Titles-Tabelle der Datenbank geändert. Nachdem die BeginTrans-Methode eine Transaktion ausgeführt hat, die alle an der Titles-Tabelle vorgenommenen Änderungen isoliert, speichert die CommitTrans-Methode die Änderungen. Mit der RollbackTrans-Methode können unter Verwendung der Update-Methode gespeicherte Änderungen rückgängig gemacht werden.

Public Sub BeginTransX()

    Dim cnn1 As ADODB.Connection
    Dim rstTitles As ADODB.Recordset
    Dim strCnn As String
    Dim strTitle As String
    Dim strMessage As String

    ' Verbindung öffnen.
        strCnn = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=Pubs;User Id=sa;Password=; "
    Set cnn1 = New ADODB.Connection
    cnn1.Open strCnn

    ' Titles-Tabelle öffnen.
    Set rstTitles = New ADODB.Recordset
    rstTitles.CursorType = adOpenDynamic
    rstTitles.LockType = adLockPessimistic
    rstTitles.Open "titles", cnn1, , , adCmdTable

    rstTitles.MoveFirst
    cnn1.BeginTrans

    ' Das Recordset durchlaufen und den Benutzer fragen, ob der
    ' angegebene Titel geändert werden soll.
    Do Until rstTitles.EOF
        If Trim(rstTitles!Type) = "psychology" Then
            strTitle = rstTitles!Title
            strMessage = "Title: " & strTitle & vbCr & _
            "Change type to self help?"

            ' Den Titel für das angegebene Buch
            ' ändern.
            If MsgBox(strMessage, vbYesNo) = vbYes Then
                rstTitles!Type = "self_help"
                rstTitles.Update
            End If
        End If

            rstTitles.MoveNext
    Loop

    ' Fragen, ob der Benutzer alle oben durchgeführten
    ' Änderungen bestätigen möchte.
    If MsgBox("Save all changes?", vbYesNo) = vbYes Then
        cnn1.CommitTrans
    Else
        cnn1.RollbackTrans
    End If

    ' Die aktuellen Daten im Recordset drucken.
    rstTitles.Requery
    rstTitles.MoveFirst
    Do While Not rstTitles.EOF
        Debug.Print rstTitles!Title & " - " & rstTitles!Type
        rstTitles.MoveNext
    Loop

    ' Die Originaldaten wiederherstellen, da es sich um ein
    ' Beispiel handelt.
    rstTitles.MoveFirst
    Do Until rstTitles.EOF
        If Trim(rstTitles!Type) = "self_help" Then
            rstTitles!Type = "psychology"
            rstTitles.Update
        End If
        rstTitles.MoveNext
    Loop

    rstTitles.Close
    cnn1.Close

End Sub


Beispiel für die BOF-, EOF- und Bookmark-Eigenschaften (VB)

In diesem Beispiel werden die Eigenschaften BOF und EOF verwendet, um eine Nachricht anzuzeigen, wenn der Benutzer über den ersten oder letzten Datensatz eines Recordset-Objekts hinausgehen möchte. Mit der Bookmark-Eigenschaft kann der Benutzer einen Datensatz in einem Recordset-Objekt markieren und später an diese Stelle zurückkehren.

Public Sub BOFX()

    Dim rstPublishers As ADODB.Recordset
    Dim strCnn As String
    Dim strMessage As String
    Dim intCommand As Integer
    Dim varBookmark As Variant

    ' Das Recordset mit Daten der Publishers-Tabelle öffnen.
    strCnn = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=Pubs;User Id=sa;Password=; "
    Set rstPublishers = New ADODB.Recordset
    rstPublishers.CursorType = adOpenStatic
    ' Den Clientcursor zum Aktivieren der AbsolutePosition-Eigenschaft
    ' verwenden.
    rstPublishers.CursorLocation = adUseClient
    rstPublishers.Open "SELECT pub_id, pub_name FROM publishers " & _
        "ORDER BY pub_name", strCnn, , , adCmdText

    rstPublishers.MoveFirst

    Do While True
        ' Die Informationen zum aktuellen Datensatz anzeigen
        ' und die Benutzereingabe abrufen.
        strMessage = "Publisher: " & rstPublishers!pub_name & _
            vbCr & "(record " & rstPublishers.AbsolutePosition & _
            " of " & rstPublishers.RecordCount & ")" & vbCr & vbCr & _
            "Enter command:" & vbCr & _
            "[1 - next / 2 - previous /" & vbCr & _
            "3 - set bookmark / 4 - go to bookmark]"
        intCommand = Val(InputBox(strMessage))

        Select Case intCommand
            ' Vorwärts oder zurück bewegen und BOF
            ' oder EOF auffangen.
            Case 1
                rstPublishers.MoveNext
                If rstPublishers.EOF Then
                    MsgBox "Moving past the last record." & _
                        vbCr & "Try again."
                    rstPublishers.MoveLast
                End If
            Case 2
                rstPublishers.MovePrevious
                If rstPublishers.BOF Then
                    MsgBox "Moving past the first record." & _
                        vbCr & "Try again."
                    rstPublishers.MoveFirst
                End If

            ' Das Lesezeichen für den aktuellen Datensatz speichern.
            Case 3
                varBookmark = rstPublishers.Bookmark

            ' Zu dem durch das gespeicherte Lesezeichen markierten
            ' Datensatz gehen.
            Case 4
                If IsEmpty(varBookmark) Then
                    MsgBox "No Bookmark set!"
                Else
                    rstPublishers.Bookmark = varBookmark
                End If

            Case Else
                Exit Do
        End Select

    Loop

    rstPublishers.Close

End Sub

In diesem Beispiel wird mit den Eigenschaften Bookmark und Filter eine eingeschränkte Ansicht des Recordset-Objekts erstellt. Es kann nur auf die Datensätze zugegriffen werden, auf die durch ein Array mit Lesezeichen verwiesen wird.

Public Sub BOFX2()

Dim rs As New ADODB.Recordset
Dim bmk(10)

rs.CursorLocation = adUseClient
rs.ActiveConnection = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=Pubs;User Id=sa;Password=;"

rs.Open "select * from Authors", , adOpenStatic, adLockBatchOptimistic
Debug.Print "Number of records before filtering: ", rs.RecordCount

ii = 0
While rs.EOF <> True And ii < 11
    bmk(ii) = rs.Bookmark
    ii = ii + 1
    rs.Move 2
Wend
rs.Filter = bmk
Debug.Print "Number of records after filtering: ", rs.RecordCount

rs.MoveFirst
While rs.EOF <> True
    Debug.Print rs.AbsolutePosition, rs("au_lname")
    rs.MoveNext
Wend

End Sub


Beispiel für die CacheSize-Eigenschaft (VB)

In diesem Beispiel wird die CacheSize-Eigenschaft verwendet, um die unterschiedliche Leistung bei einer Operation mit und ohne Zwischenspeicher mit 30 Datensätzen zu verdeutlichen.

Public Sub CacheSizeX()

    Dim rstRoySched As ADODB.Recordset
    Dim strCnn As String
    Dim sngStart As Single
    Dim sngEnd As Single
    Dim sngNoCache As Single
    Dim sngCache As Single
    Dim intLoop As Integer
    Dim strTemp As String

    ' Die RoySched-Tabelle öffnen.
    strCnn = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=Pubs;User Id=sa;Password=; "
    Set rstRoySched = New ADODB.Recordset
    rstRoySched.Open "roysched", strCnn, , , adCmdTable

    ' Das Recordset-Object zweimal auflisten und die
    ' verstrichene Zeit aufzeichnen.
    sngStart = Timer

    For intLoop = 1 To 2
        rstRoySched.MoveFirst

        Do While Not rstRoySched.EOF
            ' Eine einfache Operation für den Leistungstest
            ' durchführen.
            strTemp = rstRoySched!title_id
            rstRoySched.MoveNext
        Loop
    Next intLoop

    sngEnd = Timer
    sngNoCache = sngEnd - sngStart

    ' Datensätze in Gruppen von 30 Datensätzen zwischenspeichern.
    rstRoySched.MoveFirst
    rstRoySched.CacheSize = 30
    sngStart = Timer

    ' Das Recordset-Objekt zweimal auflisten und die
    ' verstrichene Zeit aufzeichnen.
    For intLoop = 1 To 2

        rstRoySched.MoveFirst
        Do While Not rstRoySched.EOF
            ' Eine einfache Operation für den
            ' Leistungstest durchführen.
            strTemp = rstRoySched!title_id
            rstRoySched.MoveNext
        Loop
    Next intLoop

    sngEnd = Timer
    sngCache = sngEnd - sngStart

    ' Leistungsergebnisse anzeigen.
    MsgBox "Caching Performance Results:" & vbCr & _
        "    No cache: " & Format(sngNoCache, _
        "##0.000") & " seconds" & vbCr & _
        "    30-record cache: " & Format(sngCache, _
        "##0.000") & " seconds"
    rstRoySched.Close

End Sub


Beispiel für die Cancel-Methode (VB)

In diesem Beispiel wird die Cancel-Methode zum Abbrechen eines in einem Connection-Objekt ausgeführten Befehls verwendet, wenn die Verbindung belegt ist.

Public Sub CancelX()

    Dim cnn1 As ADODB.Connection
    Dim strCnn As String
    Dim strCmdChange As String
    Dim strCmdRestore As String
    Dim booChanged As Boolean

    ' Eine Verbindung öffnen.
    Set cnn1 = New ADODB.Connection
        strCnn = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=Pubs;User Id=sa;Password=; "
    cnn1.Open strCnn

    ' Befehlszeichenfolgen definieren.
    strCmdChange = "UPDATE titles SET type = 'self_help' " & _
        "WHERE type = 'psychology'"
    strCmdRestore = "UPDATE titles SET type = 'psychology' " & _
        "WHERE type = 'self_help'"

    ' Eine Transaktion starten, und dann einen Befehl asynchron ausführen.
    cnn1.BeginTrans
    cnn1.Execute strCmdChange, , adAsyncExecute

    ' Dies ist eine kleine Warteschleife, sie könnte verändert werden
        For i = 1 To 10
            i = i + i
            Debug.Print i
        Next i

    ' Ausführung abbrechen, wenn der Befehl NICHT beendet wurde
    ' und für die Transaktion einen Rollback ausführen. Andernfalls
    ' die Transaktion bestätigen.
    If CBool(cnn1.State And adStateExecuting) Then
        cnn1.Cancel
        cnn1.RollbackTrans
        booChanged = False
        MsgBox "Update canceled."
    Else
        cnn1.CommitTrans
        booChanged = True
        MsgBox "Update complete."
    End If

    ' Nach Durchführung der Änderungen Daten wiederherstellen,
    ' da es sich um ein Beispiel handelt.
    If booChanged Then
        cnn1.Execute strCmdRestore
        MsgBox "Data restored."
    End If

    cnn1.Close

End Sub


Beispiel für die Clone-Methode (VB)

In diesem Beispiel wird die Clone-Methode zum Erstellen von Kopien eines Recordset-Objekts verwendet. Anschließend kann der Datensatzzeiger unabhängig auf jede einzelne Kopie gesetzt werden.

Public Sub CloneX()

    Dim arstStores(1 To 3) As ADODB.Recordset
    Dim intLoop As Integer
    Dim strSQL As String
    Dim strCnn As String
    Dim strMessage As String
    Dim strFind As String

    ' SQL-Anweisung und Verbindungszeichenfolge Variablen zuweisen.
    strSQL = "SELECT stor_name FROM Stores " & _
        "ORDER BY stor_name"
        strCnn = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=Pubs;User Id=sa;Password=; "

    ' Recordset als Recordset mit statischem Cursortyp öffnen.
    Set arstStores(1) = New ADODB.Recordset
    arstStores(1).CursorType = adOpenStatic
    arstStores(1).LockType = adLockBatchOptimistic
    arstStores(1).Open strSQL, strCnn, , , adCmdText

    ' Zwei Duplikate des ursprünglichen Recordsets erstellen.
    Set arstStores(2) = arstStores(1).Clone
    Set arstStores(3) = arstStores(1).Clone

    Do While True

        ' Array durchlaufen, wobei der Benutzer bei jedem Durchlauf
        ' eine andere Kopie desselben
        ' Recordsets sucht.
        For intLoop = 1 To 3

            ' Zur Eingabe einer Suchzeichenfolge auffordern, während
            ' angezeigt wird, wo sich der aktuelle Datensatzzeiger für
            ' jedes Recordset befindet.
            strMessage = _
                "Recordsets from stores table:" & vbCr & _
                "  1 - Original - Record pointer at " & _
                arstStores(1)!stor_name & vbCr & _
                "  2 - Clone - Record pointer at " & _
                arstStores(2)!stor_name & vbCr & _
                "  3 - Clone - Record pointer at " & _
                arstStores(3)!stor_name & vbCr & _
                "Enter search string for #" & intLoop & ":"
            strFind = Trim(InputBox(strMessage))
            If strFind = "" Then Exit Do

            ' Die Suchzeichenfoge suchen; bei keiner Übereinstimmung
            ' zum letzten Datensatz springen.
            arstStores(intLoop).Filter = "stor_name >= '" & strFind & "'"
            If arstStores(intLoop).EOF Then
                arstStores(intLoop).Filter = adFilterNone
                arstStores(intLoop).MoveLast
            End If

        Next intLoop

    Loop

    arstStores(1).Close
    arstStores(2).Close
    arstStores(3).Close

End Sub


Beispiel für die CompareBookmarks-Methode (VB)

Dieses Beispiel verdeutlicht die CompareBookmarks-Methode. Der relative Wert von Lesezeichen wird selten benötigt, es sei denn, es handelt sich um ein spezielles Lesezeichen.

Bestimmen Sie als Suchziel eine zufällige Zeile eines Recordset-Objekts aus der Authors-Tabelle. Zeigen Sie anschließend die Position der einzelnen Zeilen relativ zum Ziel an.

Public Sub Main()
    CompareBookmarksX
End Sub

Public Sub CompareBookmarksX()
Dim rst As ADODB.Recordset
Dim count As Integer
Dim target As Variant
Dim result As Long
Dim strAns As String
Dim strTitle As String
strTitle = "CompareBookmarks Example"

Set rst = New ADODB.Recordset
rst.Open "SELECT * FROM Authors", _
            "DSN=Pubs;Provider=MSDASQL; uid=sa;pwd=;", _
            adOpenStatic, adLockReadOnly, adCmdText

count = rst.RecordCount
Debug.Print "Rows in the Recordset = "; count
If count = 0 Then Exit Sub   'Exit if an empty recordset

Randomize
count = (Int(count * Rnd))   'Get position between 0 and count-1
Debug.Print "Randomly chosen row position = "; count
rst.Move count, adBookmarkFirst 'Move row to random position
target = rst.Bookmark        'Remember the mystery row.

count = 0
rst.MoveFirst
Do While Not rst.EOF         'Loop through recordset
    result = rst.CompareBookmarks(rst.Bookmark, target)
    If result = adCompareNotEqual Then
        Debug.Print "Row "; count; ": Bookmarks are not equal."
    ElseIf result = adCompareNotComparable Then
        Debug.Print "Row "; count; ": Bookmarks are not comparable."
    Else
        Select Case result
            Case adCompareLessThan
            strAns = "less than"
            Case adCompareEqual
                strAns = "equal to"
            Case adCompareGreaterThan
                strAns = "greater than"
            Case Else
                strAns = "in error comparing to"
        End Select
        Debug.Print "Row position " & count & " is " & strAns & _
                        " the target."
    End If
    count = count + 1
    rst.MoveNext
Loop

rst.Close
End Sub


Beispiel für die ConnectionString-, ConnectionTimeout- und State-Eigenschaften (VB)

Dieses Beispiel zeigt, wie Sie ein Connection-Objekt mit der ConnectionString-Eigenschaft auf unterschiedliche Art öffnen können. Darüber hinaus wird die ConnectionTimeout-Eigenschaft verwendet, um ein Zeitlimit für eine Verbindung anzugeben, und die State-Eigenschaft, um den Status der Verbindungen zu überprüfen. Zum Ausführen dieser Prozedur ist die GetState-Funktion erforderlich.

Public Sub ConnectionStringX()

    Dim cnn1 As ADODB.Connection
    Dim cnn2 As ADODB.Connection
    Dim cnn3 As ADODB.Connection
    Dim cnn4 As ADODB.Connection

    ' Eine Verbindung ohne DSN (Data Source Name) öffnen
    Set cnn1 = New ADODB.Connection
    cnn1.ConnectionString = "driver={SQL Server};" & _
        "server=bigsmile;uid=sa;pwd=pwd;database=Pubs"
    cnn1.ConnectionTimeout = 30
    cnn1.Open

    ' Eine Verbindung mit einem DSN- und ODBC-Tag öffnen.
    Set cnn2 = New ADODB.Connection
    cnn2.ConnectionString = "DSN=Pubs;UID=sa;PWD=pwd;"
    cnn2.Open

    ' Eine Verbindung mit einem DSN- und OLE DB-Tag öffnen.
    Set cnn3 = New ADODB.Connection
    cnn3.ConnectionString = "Data Source=Pubs;User ID=sa;Password=pwd;"
    cnn3.Open

    ' Eine Verbindung mit einem DSN- und einem einzelnen
    ' Argument anstelle von einer Verbindungszeichenfolge öffnen.
    Set cnn4 = New ADODB.Connection
    cnn4.Open "Pubs", "sa", "pwd"

    ' Den Verbindungsstatus anzeigen.
    MsgBox "cnn1 state: " & GetState(cnn1.State) & vbCr & _
        "cnn2 state: " & GetState(cnn2.State) & vbCr & _
        "cnn3 state: " & GetState(cnn3.State) & vbCr & _
        "cnn4 state: " & GetState(cnn4.State)

    cnn4.Close
    cnn3.Close
    cnn2.Close
    cnn1.Close

End Sub

Public Function GetState(intState As Integer) As String

    Select Case intState
        Case adStateClosed
            GetState = "adStateClosed"
        Case adStateOpen
            GetState = "adStateOpen"
    End Select

End Function


Beispiel für die ConvertToString-Methode (VB)

Public Sub ConvertToStringX()
    Dim oRDF As RDSServer.DataFactory
    Dim oRDC As RDS.DataControl
    Dim oRs As ADODB.Recordset
    Dim vString As Variant
    Dim sConnString As String
    Dim sSQL As String

    ' Ein DataFactory-Objekt erstellen.
    Set oRDF = New RDSServer.DataFactory

    ' Alle Author-Datensätze abrufen.
    sConnString = "Provider=sqloledb;" & _
                        "Data Source=(local);" & _
                        "Initial Catalog=pubs;" & _
                        "Network Library=DBMSSOCN;" & _
                        "Trusted_Connection=Yes;"
    sSQL = "Select * From authors"
    Set oRs = oRDF.Query(sConnString, sSQL)
    Debug.Print oRs.RecordCount

    ' Das Recordset in eine MIME-formatierte Zeichenfolge konvertieren.
    vString = oRDF.ConvertToString(oRs)

    ' Zeichenfolgenwert zurück in ein ADO-Recordset konvertieren.
    Set oRDC = New RDS.DataControl
    oRDC.SQL = vString
    oRDC.ExecuteOptions = adcExecSync
    oRDC.FetchOptions = adcFetchUpFront
    oRDC.Refresh
    Debug.Print oRDC.Recordset.RecordCount
End Sub


Beispiel für die CopyRecord-, CopyTo- und SaveToFile-Methoden (VB)

Dieses Beispiel verdeutlicht, wie Kopien einer Datei mithilfe eines Stream- oder Record-Objekts erstellt werden können. Eine Kopie wird in einem Webordner für Internetveröffentlichungen abgelegt. Zu den weiteren dargelegten Eigenschaften und Methoden zählen Stream Type, Open, LoadFromFile und Record Open.

Public Sub CopyRecordX()
' Variablen deklarieren
    Dim strPicturePath, strStreamPath, strStream2Path, _
        strRecordPath, strStreamURL, strRecordURL As String
    Dim objStream, objStream2 As Stream
    Dim objRecord As Record
    Dim objField As Field

    ' Objekte instanziieren
    Set objStream = New Stream
    Set objStream2 = New Stream
    Set objRecord = New Record

    ' Pfad- und URL-Zeichenfolgen initialisieren.
    strPicturePath = _
    "C:\Programme\Microsoft Office\Clipart\Popular\Checkmrk.wmf"
    strStreamPath = "\\adot20\davfs\mywmf.wmf"
    strStreamURL = "URL=http://adot20/davfs/mywmf.wmf"
    strStream2Path = "D:\samples\check2.wmf"
    strRecordPath = "\\adot20\davfs\mywmf2.wmf"
    strRecordURL = "http://adot20/davfs/mywmf2.wmf"

    ' Datei in den Datenstrom laden.
    objStream.Open
    objStream.Type = adTypeBinary
    objStream.LoadFromFile (strPicturePath)

    ' Den Datenstrom unter einem neuen Pfad und Dateinamen speichern.
    objStream.SaveToFile strStreamPath, adSaveCreateOverWrite

    ' Den Inhalt des ersten Datenstroms in den zweiten Datenstrom
    ' kopieren.
    objStream2.Open
    objStream2.Type = adTypeBinary
    objStream.CopyTo objStream2

    ' Den zweiten Datenstrom unter einem anderen Pfad speichern.
    objStream2.SaveToFile strStream2Path, adSaveCreateOverWrite

    ' Einen Datensatz unter dem URL öffnen, da strStreamPath
    ' ein Webordner ist.
    objRecord.Open "", strStreamURL

    ' Die Datensatzfelder anzeigen.
    For Each objField In objRecord.Fields
        Debug.Print objField.Name & ": " & objField.Value
    Next

    ' Den Datensatz zu einem neuen URL kopieren.
    objRecord.CopyRecord "", strRecordURL, , , adCopyOverWrite

    ' Jede Kopie der Grafik zum Anzeigen in Image-Steuerelemente laden.
    Image1.Picture = LoadPicture(strPicturePath)
    Image2.Picture = LoadPicture(strStreamPath)
    Image3.Picture = LoadPicture(strStream2Path)
    Image4.Picture = LoadPicture(strRecordPath)

    ' Bereinigen
    objStream.Close
    objStream2.Close
    objRecord.Close
End Sub


Beispiel für die Count-Eigenschaft (VB)

Dieses Beispiel zeigt die Count-Eigenschaft mit zwei Auflistungen in der Employees-Tabelle. Die Eigenschaft erhält die Anzahl der Objekte in jeder Auflistung und gibt die obere Grenze für Schleifen an, die diese Auflistungen aufzählen. Diese Auflistungen können auch ohne die Count-Eigenschaft aufgezählt werden, indem For Each...Next-Anweisungen verwendet werden.

Public Sub CountX()

    Dim rstEmployees As ADODB.Recordset
    Dim strCnn As String
    Dim intloop As Integer

    ' Ein Recordset mit Daten der Employees-Tabelle öffnen.
    strCnn = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=Pubs;User Id=sa;Password=; "
    Set rstEmployees = New ADODB.Recordset
    rstEmployees.Open "employee", strCnn, , , adCmdTable

    ' Informationen über die Fields-Auflistung drucken.
    Debug.Print rstEmployees.Fields.Count & _
        " Fields in Employee"
    For intloop = 0 To rstEmployees.Fields.Count - 1
        Debug.Print "    " & rstEmployees.Fields(intloop).Name
    Next intloop

    ' Informationen über die Properties-Auflistung drucken.
    Debug.Print rstEmployees.Properties.Count & _
        " Properties in Employee"
    For intloop = 0 To rstEmployees.Properties.Count - 1
        Debug.Print "    " & rstEmployees.Properties(intloop).Name
    Next intloop

    rstEmployees.Close

End Sub


Beispiel für die CreateRecordset-Methode (VB)

Sie können ein Recordset-Objekt erstellen und die Spalteninformationen angeben. Anschließend können Sie Daten in das Recordset-Objekt eingeben; durch das zugrunde liegende Rowset werden die Eingaben zwischengespeichert.

Das nachstehende Codebeispiel zeigt, wie Sie ein Recordset-Objekt mithilfe des RDSServer.DataFactory-Objekts festlegen. Sie können dies auch unter Verwendung des RDS.DataControl-Objekts realisieren.

Sub RsDefineShape()

    Dim vntRecordShape(3)
    Dim vntField1Shape(3)
    Dim vntField2Shape(3)
    Dim vntField3Shape(3)
    Dim vntField4Shape(3)

    ' Für jedes Feld den Namen, den Typ,
    ' die Größe angeben und ob NULL zulässig ist.

    vntField1Shape(0) = "Name"    ' Column name.
    vntField1Shape(1) = CInt(129)    ' Column type.
    vntField1Shape(2) = CInt(40)    ' Column size.
    vntField1Shape(3) = False        ' Nullable?

    vntField2Shape(0) = "Age"
    vntField2Shape (1) = CInt(3)
    vntField2Shape (2) = CInt(-1)
    vntField2Shape (3) = True

    vntField3Shape (0) = "DateOfBirth"
    vntField3Shape (1) = CInt(7)
    vntField3Shape (2) = CInt(-1)
    vntField3Shape (3) = True

    vntField4Shape (0) = "Balance"
    vntField4Shape (1) = CInt(6)
    vntField4Shape (2) = CInt(-1)
    vntField4Shape (3) = True

    ' Alle Felder in ein Array mit Arrays legen.
    vntRecordShape(0) = vntField1Shape
    vntRecordShape(1) = vntField2Shape
    vntRecordShape(2) = vntField3Shape
    vntRecordShape(3) = vntField4Shape

    ' RDSServer.DataFactory zum Erstellen eines leeren
    ' Recordsets verwenden. Dabei wird ein Variant-Array verwendet,
    ' bei dem jedes Element wiederum ein Variant-Array ist, jeweils
    ' ein Element für jede für das Recordset erforderliche
    ' Spalte.
    ' Die Elemente des inneren Arrays sind
    ' Name, Typ, Größe und ob NULL zulässig ist.

    Dim NewRs

    ' Sie sollten nur das RDS.DataControl-Objekt
    ' anstelle des RDSServer.DataFactory-Objekts verwenden. In
    ' diesem Fall würde der folgende Code Set NewRS
    ' = ADC1.CreateRecordset(vntRecordShape) lauten.
    Set NewRS = ADF.CreateRecordset(vntRecordShape)

    Dim fields(3)
    fields(0) = vntField1Shape(0)
    fields(1) = vntField2Shape (0)
    fields(2) = vntField3Shape (0)
    fields(3) = vntField4Shape (0)

    ' Das neue Recordset mit Datenwerten auffüllen.
    Dim fieldVals(3)

    ' AddNew zum Hinzufügen von Datensätzen verwenden.
    fieldVals(0) = "Joe"
    fieldVals(1) = 5
    fieldVals(2) = CDate(#1/5/96#)
    fieldVals(3) = 123.456
    NewRS.AddNew fields, fieldVals

    fieldVals(0) = "Mary"
    fieldVals(1) = 6
    fieldVals(2) = CDate(#6/5/96#)
    fieldVals(3) = 31
    NewRS.AddNew fields, fieldVals

    fieldVals(0) = "Alex"
    fieldVals(1) = 13
    fieldVals(2) = CDate(#1/6/96#)
    fieldVals(3) = 34.0001
    NewRS.AddNew fields, fieldVals

    fieldVals(0) = "Susan"
    fieldVals(1) = 13
    fieldVals(2) = CDate(#8/6/96#)
    fieldVals(3) = 0.0
    NewRS.AddNew fields, fieldVals

    NewRS.MoveFirst

    ' Für das neu erstellte und aufgefüllte Recordset
    ' die SourceRecordset-Eigenschaft
    ' RDS.DataControl festlegen, um die visuellen Steuerelemente
    ' zu binden.
    Set ADC1.SourceRecordset = NewRS

End Sub


Beispiel für die CursorType-, LockType- und EditMode-Eigenschaften (VB)

In diesem Beispiel wird gezeigt, wie die Eigenschaften CursorType und LockType vor dem Öffnen eines Recordset-Objekts gesetzt werden. Das Beispiel zeigt auch den Wert der EditMode-Eigenschaft unter verschiedenen Bedingungen. Zum Ausführen dieser Prozedur ist die EditModeOutput-Funktion erforderlich.

Public Sub EditModeX()

    Dim cnn1 As ADODB.Connection
    Dim rstEmployees As ADODB.Recordset
    Dim strCnn As String

    ' Recordset mit den Daten der Employees-Tabelle öffnen.
    Set cnn1 = New ADODB.Connection
    strCnn = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=Pubs;User Id=sa;Password=; "
    cnn1.Open strCnn

    Set rstEmployees = New ADODB.Recordset
    Set rstEmployees.ActiveConnection = cnn1
    rstEmployees.CursorLocation = adUseClient
    rstEmployees.CursorType = adOpenStatic
    rstEmployees.LockType = adLockBatchOptimistic
    rstEmployees.Open "employee", , , , adCmdTable

    ' Die EditMode-Eigenschaft mit anderem Bearbeitungsstatus
    ' anzeigen.
    rstEmployees.AddNew
    rstEmployees!emp_id = "T-T55555M"
    rstEmployees!fname = "temp_fname"
    rstEmployees!lname = "temp_lname"
    EditModeOutput "After AddNew:", rstEmployees.EditMode
    rstEmployees.UpdateBatch
    EditModeOutput "After UpdateBatch:", rstEmployees.EditMode
    rstEmployees!fname = "test"
    EditModeOutput "After Edit:", rstEmployees.EditMode
    rstEmployees.Close

    ' Den neuen Datensatz löschen, da es sich um ein Beispiel handelt.
    cnn1.Execute "DELETE FROM employee WHERE emp_id = 'T-T55555M'"

End Sub

Public Function EditModeOutput(strTemp As String, _
    intEditMode As Integer)

    ' Den Bericht auf der Grundlage des Wertes der
    ' EditMode-Eigenschaft drucken.
    Debug.Print strTemp
    Debug.Print "  EditMode = ";

    Select Case intEditMode
        Case adEditNone
            Debug.Print "adEditNone"
        Case adEditInProgress
            Debug.Print "adEditInProgress"
        Case adEditAdd
            Debug.Print "adEditAdd"
    End Select

End Function


Beispiel für die Delete-Methode (VB)

In diesem Beispiel wird die Delete-Methode zum Entfernen eines angegebenen Datensatzes aus einem Recordset-Objekt verwendet.

Public Sub DeleteX()

    Dim rstRoySched As ADODB.Recordset
    Dim strCnn As String
    Dim strMsg As String
    Dim strTitleID As String
    Dim intLoRange As Integer
    Dim intHiRange As Integer
    Dim intRoyalty As Integer

    ' Die RoySched-Tabelle öffnen.
        strCnn = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=Pubs;User Id=sa;Password=; "
    Set rstRoySched = New ADODB.Recordset
    rstRoySched.CursorLocation = adUseClient
    rstRoySched.CursorType = adOpenStatic
    rstRoySched.LockType = adLockBatchOptimistic
    rstRoySched.Open "SELECT * FROM roysched " & _
        "WHERE royalty = 20", strCnn, , , adCmdText

    ' Zu löschenden Datensatz angeben.
    strMsg = "Before delete there are " & _
        rstRoySched.RecordCount & _
        " titles with 20 percent royalty:" & vbCr & vbCr
    Do While Not rstRoySched.EOF
        strMsg = strMsg & rstRoySched!title_id & vbCr
        rstRoySched.MoveNext
    Loop
    strMsg = strMsg & vbCr & vbCr & _
        "Enter the ID of a record to delete:"
    strTitleID = UCase(InputBox(strMsg))

    ' Zum Datensatz gehen und die Daten speichern, so dass
    ' sie wiederhergestellt werden können.
    rstRoySched.Filter = "title_id = '" & strTitleID & "'"
    intLoRange = rstRoySched!lorange
    intHiRange = rstRoySched!hirange
    intRoyalty = rstRoySched!royalty

    ' Den Datensatz löschen.
    rstRoySched.Delete
    rstRoySched.UpdateBatch

    ' Die Ergebnisse anzeigen.
    rstRoySched.Filter = adFilterNone
    rstRoySched.Requery
    strMsg = ""
    strMsg = "After delete there are " & _
        rstRoySched.RecordCount & _
        " titles with 20 percent royalty:" & vbCr & vbCr
    Do While Not rstRoySched.EOF
        strMsg = strMsg & rstRoySched!title_id & vbCr
        rstRoySched.MoveNext
    Loop
    MsgBox strMsg

    ' Die Daten wiederherstellen, da es sich um ein Beispiel handelt.
    rstRoySched.AddNew
    rstRoySched!title_id = strTitleID
    rstRoySched!lorange = intLoRange
    rstRoySched!hirange = intHiRange
    rstRoySched!royalty = intRoyalty
    rstRoySched.UpdateBatch

    rstRoySched.Close

End Sub


Beispiel für die DeleteRecord- und MoveRecord-Methoden (VB)

Dieses Beispiel verdeutlicht, wie Inhalte einer in einem Webordner veröffentlichten Textdatei kopiert, verschoben, bearbeitet und gelöscht werden. Zu den weiteren verwendeten Eigenschaften und Methoden zählen GetChildren, ParentURL, Source und Flush.

Public Sub DeleteRecordX()
    ' Variablen deklarieren.
    Dim i As Integer
    Dim objStream As Stream
    Dim strLine, strChar As String

    ' Den Datenstrom instanziieren und öffnen.
    Set objStream = New Stream
    objStream.Open

    ' Zeilenvorschub als Zeilentrennzeichen festlegen.
    objStream.LineSeparator = adLF

    ' Den Textinhalt des Listenfeldes zeilenweise in
    ' den Datenstrom laden.
    For i = 0 To (List1.ListCount - 1)
        objStream.WriteText List1.List(i), adWriteLine
    Next

    ' Den gesamten Datenstrom anzeigen.
    Debug.Print "Whole Stream:"
    objStream.Position = 0
    Debug.Print objStream.ReadText

    ' Die erste Zeile anzeigen.
    Debug.Print "First Line:"
    objStream.Position = 0
    strLine = objStream.ReadText(adReadLine)
    Debug.Print strLine
    Debug.Print "Line length: " + str(Len(strLine))

    ' Eine Zeile überspringen und eine andere Zeile anzeigen.
    Debug.Print "Third Line:"
    objStream.SkipLine
    strLine = objStream.ReadText(adReadLine)
    Debug.Print strLine
    Debug.Print "Line length: " + str(Len(strLine))

    ' Das Zeilentrennzeichen auf Wagenrücklauf umschalten.
    ' Alle Elemente der Liste werden als eine Zeile betrachtet.
    ' Es wird angenommen, dass kein Wagenrücklauf in den Datenstrom
    ' geladen wurde.
    Debug.Print "Whole Stream/First Line:"
    objStream.Position = 0
    objStream.LineSeparator = adCR
    strLine = objStream.ReadText(adReadLine)
    Debug.Print strLine
    Debug.Print "Line length: " + str(Len(strLine))
    Debug.Print "Stream size: " + str(objStream.Size)

    ' EOS verwenden, um das Datenstromende zu bestimmen.
    Debug.Print "Character by character:"
    objStream.Position = 0
    Do Until objStream.EOS
        strChar = objStream.ReadText(1)
        Debug.Print strChar
    Loop
End Sub


Beispiel für die Description-, NativeError-, Number-, Source- und SQLState-Eigenschaften (VB)

In diesem Beispiel wird ein Fehler ausgelöst und aufgefangen und werden die Eigenschaften Description, HelpContext, HelpFile, NativeError, Number, Source und SQLState des resultierenden Error-Objekts angezeigt.

Public Sub DescriptionX()

    Dim cnn1 As ADODB.Connection
    Dim errLoop As ADODB.Error
    Dim strError As String

    On Error GoTo ErrorHandler

    ' Einen Fehler absichtlich auslösen.
    Set cnn1 = New ADODB.Connection
    cnn1.Open "nothing"

    Exit Sub

ErrorHandler:

    ' Die Errors-Auflistung aufzählen und die Eigenschaften
    ' jedes Error-Objekts anzeigen.
    For Each errLoop In cnn1.Errors
        strError = "Error #" & errLoop.Number & vbCr & _
            "    " & errLoop.Description & vbCr & _
            "    (Source: " & errLoop.Source & ")" & vbCr & _
            "    (SQL State: " & errLoop.SQLState & ")" & vbCr & _
            "    (NativeError: " & errLoop.NativeError & ")" & vbCr
        If errLoop.HelpFile = "" Then
            strError = strError & _
                "    No Help file available" & _
                vbCr & vbCr
        Else
            strError = strError & _
                "    (HelpFile: " & errLoop.HelpFile & ")" & vbCr & _
                "    (HelpContext: " & errLoop.HelpContext & ")" & _
                vbCr & vbCr
        End If

    Debug.Print strError
    Next

    Resume Next

End Sub


Beispiel für die EOS- und LineSeparator-Eigenschaften, SkipLine-Methode (VB)

Dieses Beispiel verdeutlicht, wie Textdatenströme jeweils zeilenweise bearbeitet und verändert werden können. Darüber hinaus werden die Auswirkungen dargelegt, wenn das Zeilentrennzeichen vom standardmäßigen Wagenrücklauf/Zeilenvorschub (adCRLF) zum einfachen Zeilenvorschub (adLF) oder Wagenrücklauf (adCR) geändert wird.

Public Sub SkipLineX()
    ' Variablen deklarieren
    Dim i As Integer
    Dim objStream As Stream
    Dim strLine, strChar As String

    ' Datenstrom instanziieren und öffnen.
    Set objStream = New Stream
    objStream.Open

    ' Zeilenvorschub als Zeilentrennzeichen festlegen.
    objStream.LineSeparator = adLF

    ' Den Textinhalt des Listenfeldes zeilenweise in
    ' den Datenstrom laden.
    For i = 0 To (List1.ListCount - 1)
        objStream.WriteText List1.List(i), adWriteLine
    Next

    ' Den gesamten Datenstrom anzeigen.
    Debug.Print "Whole Stream:"
    objStream.Position = 0
    Debug.Print objStream.ReadText

    ' Die erste Zeile anzeigen.
    Debug.Print "First Line:"
    objStream.Position = 0
    strLine = objStream.ReadText(adReadLine)
    Debug.Print strLine
    Debug.Print "Line length: " + str(Len(strLine))

    ' Eine Zeile überspringen und eine andere Zeile anzeigen.
    Debug.Print "Third Line:"
    objStream.SkipLine
    strLine = objStream.ReadText(adReadLine)
    Debug.Print strLine
    Debug.Print "Line length: " + str(Len(strLine))

    ' Das Zeilentrennzeichen auf Wagenrücklauf umschalten.
    ' Alle Elemente der Liste werden als eine Zeile betrachtet.
    ' Es wird angenommen, dass kein Wagenrücklauf
    ' in den Datenstrom geladen wurde.
    Debug.Print "Whole Stream/First Line:"
    objStream.Position = 0
    objStream.LineSeparator = adCR
    strLine = objStream.ReadText(adReadLine)
    Debug.Print strLine
    Debug.Print "Line length: " + str(Len(strLine))
    Debug.Print "Stream size: " + str(objStream.Size)

    ' EOS verwenden, um das Datenstromende zu bestimmen.
    Debug.Print "Character by character:"
    objStream.Position = 0
    Do Until objStream.EOS
        strChar = objStream.ReadText(1)
        Debug.Print strChar
    Loop
End Sub


Beispiel für die Execute-, Requery- und Clear-Methoden (VB)

In diesem Beispiel wird die Verwendung der Execute-Methode dargelegt, wenn sie von einem Command- sowie einem Connection-Objekt ausgeführt wird. Weiterhin wird die Requery-Methode zum Abrufen aktueller Daten in einem Recordset-Objekt verwendet, und mit der Clear-Methode wird der Inhalt der Errors-Auflistung gelöscht. (Auf die Errors-Auflistung wird über das Connection-Objekt des Recordsets der ActiveConnection-Eigenschaft zugegriffen.) Damit diese Prozedur ausgeführt werden kann, werden die Prozeduren ExecuteCommand und PrintOutput benötigt.

Public Sub ExecuteX()

    Dim strSQLChange As String
    Dim strSQLRestore As String
    Dim strCnn As String
    Dim cnn1 As ADODB.Connection
    Dim cmdChange As ADODB.Command
    Dim rstTitles As ADODB.Recordset
    Dim errLoop As ADODB.Error

    ' Als Befehlstext zwei auszuführende SQL-Anweisungen definieren.
    strSQLChange = "UPDATE Titles SET Type = " & _
        "'self_help' WHERE Type = 'psychology'"
    strSQLRestore = "UPDATE Titles SET Type = " & _
        "'psychology' WHERE Type = 'self_help'"

    ' Verbindung öffnen.
        strCnn = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=Pubs;User Id=sa;Password=; "
    Set cnn1 = New ADODB.Connection
    cnn1.Open strCnn

    ' Command-Objekt erstellen.
    Set cmdChange = New ADODB.Command
    Set cmdChange.ActiveConnection = cnn1
    cmdChange.CommandText = strSQLChange

    ' Titles-Tabelle öffnen.
    Set rstTitles = New ADODB.Recordset
    rstTitles.Open "titles", cnn1, , , adCmdTable

    ' Bericht über ursprüngliche Daten drucken.
    Debug.Print _
        "Data in Titles table before executing the query"
    PrintOutput rstTitles

    ' Externe Fehler aus der Errors-Auflistung löschen.
    cnn1.Errors.Clear

    ' ExecuteCommand-Subroutine zum Ausführen des cmdChange-Befehls
    ' aufrufen.
    ExecuteCommand cmdChange, rstTitles

    ' Bericht der neuen Daten drucken.
    Debug.Print _
        "Data in Titles table after executing the query"
    PrintOutput rstTitles

    ' Die Execute-Methode des Connection-Objekts verwenden, um
    ' die SQL-Anweisung zum Wiederherstellen von Daten auszuführen. Fehler
    ' auffangen und nötigenfalls die Errors-Auflistung überprüfen.
    On Error GoTo Err_Execute
    cnn1.Execute strSQLRestore, , adExecuteNoRecords
    On Error GoTo 0

    ' Die aktuellen Daten durch erneutes Abfragen des Recordsets abrufen.
    rstTitles.Requery

    ' Bericht über die wiederhergestellten Daten drucken.
    Debug.Print "Data after executing the query " & _
        "to restore the original information"
    PrintOutput rstTitles

    rstTitles.Close
    cnn1.Close

    Exit Sub

Err_Execute:

    ' Benutzer über alle Fehler informieren, die durch das Ausführen der
    ' Abfrage entstehen.
    If rstTitles.ActiveConnection.Errors.Count >= 0 Then
        For Each errLoop In rstTitles.ActiveConnection.Errors
            MsgBox "Error number: " & errLoop.Number & vbCr & _
                errLoop.Description
        Next errLoop
    End If
    Resume Next

End Sub

Public Sub ExecuteCommand(cmdTemp As ADODB.Command, _
    rstTemp As ADODB.Recordset)

    Dim errLoop As Error

    ' Das angegebene Command-Objekt ausführen. Fehler auffangen
    ' und nötigenfalls die Errors-Auflistung überprüfen.
    On Error GoTo Err_Execute
    cmdTemp.Execute
    On Error GoTo 0

    ' Die aktuellen Daten durch erneutes Abfragen des Recordsets abfragen.
    rstTemp.Requery

    Exit Sub

Err_Execute:

    ' Die Benutzer über alle Fehler informieren, die durch das Ausführen
    ' der Abfrage entstehen.
    If rstTemp.ActiveConnection.Errors.Count > 0 Then
        For Each errLoop In Errors
            MsgBox "Error number: " & errLoop.Number & vbCr & _
                errLoop.Description
        Next errLoop
    End If

    Resume Next

End Sub

Public Sub PrintOutput(rstTemp As ADODB.Recordset)

    ' Das Recordset auflisten.
    Do While Not rstTemp.EOF
        Debug.Print "  " & rstTemp!Title & _
            ", " & rstTemp!Type
        rstTemp.MoveNext
    Loop

End Sub


Beispiel für die Filter- und RecordCount-Eigenschaften (VB)

In diesem Beispiel wird die Filter-Eigenschaft zum Öffnen eines neuen Recordset-Objekts auf der Grundlage einer angegebenen Bedingung verwendet, die auf ein vorhandenes Recordset-Objekt angewendet wird. Mit der RecordCount-Eigenschaft wird die Anzahl der Datensätze in den beiden Recordset-Objekten angezeigt. Zum Ausführen dieser Prozedur ist die FilterField-Funktion erforderlich.

Public Sub FilterX()

    Dim rstPublishers As ADODB.Recordset
    Dim rstPublishersCountry As ADODB.Recordset
    Dim strCnn As String
    Dim intPublisherCount As Integer
    Dim strCountry As String
    Dim strMessage As String

    ' Ein Recordset mit Daten der Publishers-Tabelle öffnen.
    strCnn = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=Pubs;User Id=sa;Password=; "
    Set rstPublishers = New ADODB.Recordset
    rstPublishers.CursorType = adOpenStatic
    rstPublishers.Open "publishers", strCnn, , , adCmdTable

    ' Das Recordset auffüllen.
    intPublisherCount = rstPublishers.RecordCount

    ' Die Benutzereingabe abrufen.
    strCountry = Trim(InputBox( _
        "Enter a country to filter on:"))

    If strCountry <> "" Then
        ' Ein gefiltertes Recordset-Objekt öffnen.
        Set rstPublishersCountry = _
            FilterField(rstPublishers, "Country", strCountry)

        If rstPublishersCountry.RecordCount = 0 Then
            MsgBox "No publishers from that country."
        Else
            ' Die Datensatznummern für das ursprüngliche
            ' Recordset und das gefilterte Recordset-Objekt
            ' drucken.
            strMessage = "Orders in original recordset: " & _
                vbCr & intPublisherCount & vbCr & _
                "Orders in filtered recordset (Country = '" & _
                strCountry & "'): " & vbCr & _
                rstPublishersCountry.RecordCount
            MsgBox strMessage
        End If
        rstPublishersCountry.Close

    End If

End Sub

Public Function FilterField(rstTemp As ADODB.Recordset, _
    strField As String, strFilter As String) As ADODB.Recordset

    ' Einen Filter für das angegebene Recordset-Objekt festlegen und
    ' dann ein neues Recordset-Objekt öffnen.
    rstTemp.Filter = strField & " = '" & strFilter & "'"
    Set FilterField = rstTemp

End Function

Anmerkung Wenn Sie sich bereits entschieden haben, welche Daten Sie auswählen möchten, ist es in der Regel effizienter, das Recordset-Objekt mit einer SQL-Anweisung zu öffnen. In diesem Beispiel wird gezeigt, wie Sie nur ein Recordset-Objekt erstellen und Datensätze von einem bestimmten Land erhalten können.

Public Sub FilterX2()

    Dim rstPublishers As ADODB.Recordset
    Dim strCnn As String

    ' Ein neues Recordset mit den Daten der Publishers-Tabelle öffnen.
    strCnn = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=Pubs;User Id=sa;Password=; "
    Set rstPublishers = New ADODB.Recordset
    rstPublishers.CursorType = adOpenStatic
    rstPublishers.Open "SELECT * FROM publishers " & _
        "WHERE Country = 'USA'", strCnn, , , adCmdText

    ' Die aktuellen Daten im Recordset drucken.
    rstPublishers.MoveFirst
    Do While Not rstPublishers.EOF
        Debug.Print rstPublishers!pub_name & ", " & _
            rstPublishers!country
        rstPublishers.MoveNext
    Loop

    rstPublishers.Close

End Sub


Beispiel für die Find-Methode (VB)

Dieses Beispiel verwendet die Find-Methode des Recordset-Objekts, um die Anzahl der Geschäftstitel in der Pubs-Datenbank zu finden und aufzuzählen. Bei diesem Beispiel wird davon ausgegangen, dass der zugrunde liegende Provider eine ähnliche Funktionalität nicht unterstützt.

Public Sub Main()
    FindX
End Sub

Public Sub FindX()
Dim cnn As New ADODB.Connection
Dim rst As New ADODB.Recordset
Dim mark As Variant
Dim count As Integer

count = 0
cnn.Open "DSN=Pubs; Provider=MSDASQL; uid=sa; pwd=;"
rst.Open "SELECT title_id FROM titles", cnn, _
            adOpenStatic, adLockReadOnly, adCmdText

' Die Standardparameter reichen aus, um ein Recordset
' vorwärts zu durchsuchen.

rst.Find "title_id LIKE 'BU%'"

' Den aktuellen Datensatz überspringen, um zu vermeiden, dass
' dieselbe Zeile wiederholt gefunden wird.
' Das Lesezeichen ist redundant, da von der aktuellen
' Position aus gesucht wird.

Do While rst.EOF <> True    'Weiter, falls letzte Suche erfolgreich.
    Debug.Print "Title ID: "; rst!title_id
    count = count + 1        ' Den letzten gefundenen Titel mitzählen.
    mark = rst.Bookmark      ' Aktuelle Position notieren.
    rst.Find "title_id LIKE 'BU%'", 1, adSearchForward, mark
Loop

rst.Close
cnn.Close
Debug.Print "The number of business titles is " & count

End Sub


Beispiel für die GetRows-Methode (VB)

In diesem Beispiel wird die GetRows-Methode zum Abrufen einer festgelegten Anzahl von Zeilen aus einem Recordset-Objekt und zum Füllen eines Arrays mit den als Ergebnis angegebenen Daten verwendet. Die GetRows-Methode gibt in zwei Fällen weniger Daten als gewünscht zurück: Wenn entweder der EOF erreicht wurde oder die GetRows-Methode versucht hat, einen Datensatz abzurufen, der von einem anderen Benutzer gelöscht wurde. Die Funktion gibt nur im zweiten Fall den Wert False zurück. Die GetRowsOK-Funktion wird benötigt, damit diese Prozedur ausgeführt werden kann.

Public Sub GetRowsX()

    Dim rstEmployees As ADODB.Recordset
    Dim strCnn As String
    Dim strMessage As String
    Dim intRows As Integer
    Dim avarRecords As Variant
    Dim intRecord As Integer

    ' Ein Recordset mit Namen und Einstellungsdaten aus der
    ' Employees-Tabelle öffnen.
        strCnn = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=Pubs;User Id=sa;Password=; "
    Set rstEmployees = New ADODB.Recordset
    rstEmployees.Open "SELECT fName, lName, hire_date " & _
        "FROM Employee ORDER BY lName", strCnn, , , adCmdText

    Do While True
        ' Benutzereingabe für die Zeilenanzahl abrufen.
        strMessage = "Enter number of rows to retrieve."
        intRows = Val(InputBox(strMessage))

        If intRows <= 0 Then Exit Do

        ' Wenn GetRowsOK erfolgreich war, Ergebnisse drucken,
        ' wurde das Ende der Datei erreicht, nichts drucken.
        If GetRowsOK(rstEmployees, intRows, _
                avarRecords) Then
            If intRows > UBound(avarRecords, 2) + 1 Then
                Debug.Print "(Not enough records in " & _
                    "Recordset to retrieve " & intRows & _
                    " rows.)"
            End If
            Debug.Print UBound(avarRecords, 2) + 1 & _
                " records found."

            ' Die abgerufenen Daten drucken.
            For intRecord = 0 To UBound(avarRecords, 2)
                Debug.Print "  " & _
                    avarRecords(0, intRecord) & " " & _
                    avarRecords(1, intRecord) & ", " & _
                    avarRecords(2, intRecord)
            Next intRecord
        Else
            ' Unter der Annahme, dass der GetRows-Fehler auf Änderungen
            ' eines anderen Benutzers an den Daten beruhte, mit einer
            ' erneuten Abfrage das Recordset aktualisieren und erneut
            ' beginnen.
            If MsgBox("GetRows failed--retry?", _
                    vbYesNo) = vbYes Then
                rstEmployees.Requery
            Else
                Debug.Print "GetRows failed!"
                Exit Do
            End If
        End If

        ' Da GetRows den aktuellen Datensatzzeiger beim letzten
        ' Datensatz lässt, auf den zugegriffen wurde, hier den Zeiger
        ' zurück zum Anfang des Recordsets verschieben, bevor die
        ' Schleife zum nächsten Suchvorgang springt.
        rstEmployees.MoveFirst
    Loop

    rstEmployees.Close

End Sub

Public Function GetRowsOK(rstTemp As ADODB.Recordset, _
    intNumber As Integer, avarData As Variant) As Boolean

    ' Ergebnisse der GetRows-Methode im Array speichern.
    avarData = rstTemp.GetRows(intNumber)
    ' False nur zurückgeben, wenn weniger als die gewünschte
    ' Zeilenanzahl zurückgegeben wurde, jedoch nicht, wenn das
    ' Ende des Recordsets erreicht wurde.
    If intNumber > UBound(avarData, 2) + 1 And _
            Not rstTemp.EOF Then
        GetRowsOK = False
    Else
        GetRowsOK = True
    End If

End Function


Beispiel für die GetString-Methode (VB)

Dieses Beispiel verdeutlicht die GetString-Methode.

Bei diesem Beispiel wird davon ausgegangen, dass Sie ein Datenzugriffsproblem debuggen möchten und einen schnellen einfachen Weg zum Drucken des aktuellen Inhalts eines kleinen Recordset-Objekts suchen.

Public Sub Main()
    GetStringX
End Sub

Public Sub GetStringX()

Dim cnn As ADODB.Connection
Dim rst As ADODB.Recordset
Dim varOutput As Variant
Dim strQuery As String
Dim strPrompt As String

Set cnn = New ADODB.Connection
Set rst = New ADODB.Recordset
strPrompt = "Enter a state (CA, IN, KS, MD, MI, OR, TN, UT): "
strState = Trim(InputBox(strPrompt, "GetString Example"))
strQuery = "SELECT au_fname, au_lname, address, city FROM Authors " & _
                "WHERE state = '" & strState & "'"

cnn.Open "DSN=Pubs;Provider=MSDASQL; uid=sa;pwd=;"
rst.Open strQuery, cnn, adOpenStatic, adLockReadOnly, adCmdText

If rst.RecordCount > 0 Then
' Alle Standardwerte verwenden: Alle Zeilen abrufen, Tabstopps als
' Spaltentrennzeichen verwenden, Wagenrücklauf als Zeilentrennzeichen
' verwenden, leere Zeichenfolgen als NULL-Trennzeichen verwenden
    varOutput = rst.GetString(adClipString)
    Debug.Print "State = '" & strState & "'"
    Debug.Print "Name             Address             City" & vbCr
    Debug.Print varOutput
Else
    Debug.Print "No rows found for state = '" & strState & "'" & vbCr
End If

rst.Close
cnn.Close
End Sub


Beispiel für die Handler-Eigenschaft (VB)

Dieses Beispiel verdeutlicht die Handler-Eigenschaft des RDS DataControl-Objekts. (Weitere Informationen hierzu finden Sie unter DataFactory-Anpassung.)

Bei diesem Beispiel wird davon ausgegangen, dass sich die nachstehenden Abschnitte in der Parameterdatei, MSDFMAP.INI, auf dem Server befinden:

[connect AuthorDataBase]
Access=ReadWrite
Connect="DSN=Pubs"
[sql AuthorById]
SQL="SELECT * FROM Authors WHERE au_id = ?"

Der von Ihnen verwendete Code ähnelt dabei dem Nachstehenden. Der der SQL-Eigenschaft zugeordnete Befehl stimmt mit dem AuthorById-Bezeichner überein, und ruft eine Zeile für den Autor, Michael O'Leary, ab. Die Connect-Eigenschaft im Code gibt zwar die Northwind-Datenbank als Datenquelle an, jedoch wird diese Datenquelle aufgrund des connect-Abschnittes in der Datei MSDFMAP.INI überschrieben. Die Recordset-Eigenschaft des DataControl-Objekts wird einem nicht verbundenen Recordset-Objekt nur aus codepragmatischen Gründen zugeordnet.

Public Sub Main()
    HandlerX
End Sub

Public Sub HandlerX()
Dim dc As New DataControl
Dim rst As ADODB.Recordset

dc.Handler = "MSDFMAP.Handler"
dc.Server = "http://YourServer"
dc.Connect = "Data Source=Northwind"
dc.SQL = "AuthorById(267-41-2394)"
dc.Refresh                  ' Den Datensatz abrufen
Set rst = dc.Recordset      ' Ein anderes Recordset zu Hilfe nehmen
Debug.Print "Author is '" & rst!au_fname & " " & rst!au_lname & "'"

End Sub


Beispiel für die InternetTimeout-Eigenschaft (VB)

Dieses Beispiel verdeutlicht die InternetTimeout-Eigenschaft, die bei DataControl- und DataSpace-Objekten vorhanden ist. In diesem Fall wird das DataControl-Objekt verwendet und das Zeitlimit auf 20 Sekunden gesetzt.

Sub Main()
    InternetTimeoutX
End Sub

Public Sub InternetTimeoutX()
Dim dc As New DataControl
Dim rst As ADODB.Recordset

dc.Server = "http://yourServer"
dc.Connect = "DSN=Pubs"
dc.SQL = "SELECT * FROM Authors"
dc.InternetTimeout = 20000  ' Mindestens 20 Sekunden warten.
dc.Refresh
Set rst = dc.Recordset      'Ein anderes Recordset zu Hilfe nehmen
While Not rst.EOF
    Debug.Print rst!au_fname & " " & rst!au_lname
    rst.MoveNext
Wend

rst.Close
End Sub


Beispiel für die IsolationLevel- und Mode-Eigenschaften (VB)

In diesem Beispiel wird die Mode-Eigenschaft zum Öffnen einer exklusiven Verbindung verwendet. Die IsolationLevel-Eigenschaft wird zum Öffnen einer Transaktion verwendet, die getrennt von anderen Transaktionen ausgeführt wird.

Public Sub IsolationLevelX()

    Dim cnn1 As ADODB.Connection
    Dim rstTitles As ADODB.Recordset
    Dim strCnn As String

    ' Die Verbindungszeichenfolge der Variablen zuweisen.
    strCnn = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=Pubs;User Id=sa;Password=; "

    ' Die Verbindung und die Titles-Tabelle öffnen.
    Set cnn1 = New ADODB.Connection
    cnn1.Mode = adModeShareExclusive
    cnn1.IsolationLevel = adXactIsolated
    cnn1.Open strCnn

    Set rstTitles = New ADODB.Recordset
    rstTitles.CursorType = adOpenDynamic
    rstTitles.LockType = adLockPessimistic
    rstTitles.Open "Titles", cnn1, , , adCmdTable

    cnn1.BeginTrans

    ' Den Verbindungsmodus anzeigen.
    If cnn1.Mode = adModeShareExclusive Then
        MsgBox "Connection mode is exclusive."
    Else
        MsgBox "Connection mode is not exclusive."
    End If

    ' Die Isolationsstufe anzeigen.
    If cnn1.IsolationLevel = adXactIsolated Then
        MsgBox "Transaction is isolated."
    Else
        MsgBox "Transaction is not isolated."
    End If

    ' Den Typ von Psychologiebüchern ändern.
    Do Until rstTitles.EOF
        If Trim(rstTitles!Type) = "psychology" Then
            rstTitles!Type = "self_help"
            rstTitles.Update
        End If
        rstTitles.MoveNext
    Loop

    ' Aktuelle Daten im Recordset drucken.
    rstTitles.Requery
    Do While Not rstTitles.EOF
        Debug.Print rstTitles!Title & " - " & rstTitles!Type
        rstTitles.MoveNext
    Loop

    ' Die ursprünglichen Daten wiederherstellen.
    cnn1.RollbackTrans
    rstTitles.Close

    cnn1.Close

End Sub


Beispiel für die Item-Eigenschaft (VB)

Dieses Beispiel verdeutlicht, wie die Item-Eigenschaft auf Mitglieder einer Auflistung zugreift. Dieses Beispiel öffnet die Authors-Tabelle der Pubs-Datenbank mit einem parametrisierten Befehl.

Auf den Befehlsparameter, der auf die Datenbank ausgeführt wird, wird von der Parameters-Auflistung des Command-Objekts aus nach Index und Namen zugegriffen. Auf die Felder des zurückgegebenen Recordset-Objekts wird anschließend von der Fields-Auflistung des Objekts nach Index und Namen zugegriffen.

Public Sub Main()
    ItemX
End Sub

Public Sub ItemX()
Dim cnn As ADODB.Connection
Dim rst As ADODB.Recordset
Dim cmd As ADODB.Command
Dim prm As ADODB.Parameter
Dim fld As ADODB.Field
Dim ix As Integer
Dim limit As Long
Dim Column(0 To 8) As Variant

Set cnn = New ADODB.Connection
Set rst = New ADODB.Recordset
Set cmd = New ADODB.Command

' Das Array mit den Feldnamen (Spaltenamen) der Authors-Tabelle festlegen
Column(0) = "au_id"
Column(1) = "au_lname"
Column(2) = "au_fname"
Column(3) = "phone"
Column(4) = "address"
Column(5) = "city"
Column(6) = "state"
Column(7) = "zip"
Column(8) = "contract"

cmd.CommandText = "SELECT * FROM Authors WHERE state = ?"
Set prm = cmd.CreateParameter("ItemXparm", adChar, adParamInput, 2, "CA")
cmd.Parameters.Append prm

cnn.Open "DSN=Pubs;Provider=MSDASQL; uid=sa;pwd=;"
cmd.ActiveConnection = cnn
' Connection und CommandType werden weggelassen, da ein Command-Objekt
' bereitgestellt wird.
rst.Open cmd, , adOpenStatic, adLockReadOnly

Debug.Print "The Parameters collection accessed by index..."
Set prm = cmd.Parameters.Item(0)
Debug.Print "Parameter name = '"; prm.name; "', value = '"; prm.Value; _
                "'"
Debug.Print

Debug.Print "The Parameters collection accessed by name..."
Set prm = cmd.Parameters.Item("ItemXparm")
Debug.Print "Parameter name = '"; prm.name; "', value = '"; prm.Value; _
                "'"
Debug.Print

Debug.Print "The Fields collection accessed by index..."
rst.MoveFirst
limit = rst.Fields.Count - 1
For ix = 0 To limit
    Set fld = rst.Fields.Item(ix)
    Debug.Print "Field "; ix; ": Name = '"; fld.name; _
                    "', Value = '"; fld.Value; "'"
Next ix
Debug.Print

Debug.Print "The Fields collection accessed by name..."
rst.MoveFirst
For ix = 0 To 8
    Set fld = rst.Fields.Item(Column(ix))
    Debug.Print "Field name = '"; fld.name; "', Value = '"; fld.Value; "'"
Next ix

rst.Close
cnn.Close
End Sub


Beispiel für die MarshalOptions-Eigenschaft (VB)

In diesem Beispiel wird die MarshalOptions-Eigenschaft verwendet, um die Zeilen anzugeben, die zurück an den Server übertragen werden - alle Zeilen oder nur geänderte Zeilen.

Public Sub MarshalOptionsX()

    Dim rstEmployees As ADODB.Recordset
    Dim strCnn As String
    Dim strOldFirst As String
    Dim strOldLast As String
    Dim strMessage As String
    Dim strMarshalAll As String
    Dim strMarshalModified As String

    ' Ein Recordset mit Namen aus der Employees-Tabelle öffnen.
    strCnn = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=Pubs;User Id=sa;Password=; "
    Set rstEmployees = New ADODB.Recordset
    rstEmployees.CursorType = adOpenKeyset
    rstEmployees.LockType = adLockOptimistic
    rstEmployees.CursorLocation = adUseClient
    rstEmployees.Open "SELECT fname, lname " & _
        "FROM Employees ORDER BY lname", strCnn, , , adCmdText

    ' Die ursprünglichen Daten speichern.
    strOldFirst = rstEmployees!fname
    strOldLast = rstEmployees!lname

    ' Daten im Bearbeitungspuffer ändern.
    rstEmployees!fname = "Linda"
    rstEmployees!lname = "Kobara"

    ' Den Inhalt des Puffers anzeigen und Benutzereingaben abrufen.    strMessage = "Edit in progress:" & vbCr & _
        " Original data = " & strOldFirst & " " & _
        strOldLast & vbCr & " Data in buffer = " & _
        rstEmployees!fname & " " & rstEmployees!lname & vbCr & vbCr & _
        "Use Update to replace the original data with " & _
        "the buffered data in the Recordset?"
    strMarshalAll = "Would you like to send all the rows " & _
                    "in the recordset back to the server?"
    strMarshalModified = "Would you like to send only " & _
                    "modified rows back to the server?"

    If MsgBox(strMessage, vbYesNo) = vbYes Then
        If MsgBox(strMarshalAll, vbYesNo) = vbYes Then
            rstEmployees.MarshalOptions = adMarshalAll
            rstEmployees.Update
        ElseIf MsgBox(strMarshalModified, vbYesNo) = vbYes Then
            rstEmployees.MarshalOptions = adMarshalModifiedOnly
            rstEmployees.Update
        End If
    End If

    ' Die Ergebnisdaten anzeigen.
    MsgBox "Data in recordset = " & rstEmployees!fname & " " & _
        rstEmployees!lname

    ' Die ursprünglichen Daten wiederherstellen, da es sich um ein
    ' Beispiel handelt.
    If Not (strOldFirst = rstEmployees!fname And _
            strOldLast = rstEmployees!lname) Then
        rstEmployees!fname = strOldFirst
        rstEmployees!lname = strOldLast
        rstEmployees.Update
    End If

    rstEmployees.Close

End Sub


Beispiel für die MaxRecords-Eigenschaft (VB)

In diesem Beispiel wird die MaxRecords-Eigenschaft zum Öffnen eines Recordset-Objekts verwendet, das die 10 Titel mit den höchsten Kosten in der Titles-Tabelle enthält.

Public Sub MaxRecordsX()

    Dim rstTemp As ADODB.Recordset
    Dim strCnn As String

    ' Ein Recordset öffnen, das die 10 teuersten Bücher in der
    ' Titles-Tabelle enthält.
    strCnn = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=Pubs;User Id=sa;Password=; "
    Set rstTemp = New ADODB.Recordset
    rstTemp.MaxRecords = 10
    rstTemp.Open "SELECT Title, Price FROM Titles " & _
        "ORDER BY Price DESC", strCnn, , , adCmdText

    ' Den Inhalt des Recordsets anzeigen.
    Debug.Print "Top Ten Titles by Price:"

    Do While Not rstTemp.EOF
        Debug.Print "  " & rstTemp!Title & " - " & rstTemp!Price
        rstTemp.MoveNext
    Loop
    rstTemp.Close

End Sub


Beispiel für die Move-Methode (VB)

In diesem Beispiel wird die Move-Methode zum Positionieren des Datensatzzeigers auf der Grundlage einer Benutzereingabe verwendet.

Public Sub MoveX()

    Dim rstAuthors As ADODB.Recordset
    Dim strCnn As String
    Dim varBookmark As Variant
    Dim strCommand As String
    Dim lngMove As Long

    ' Ein Recordset aus der Authors-Tabelle öffnen.
        strCnn = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=Pubs;User Id=sa;Password=; "
    Set rstAuthors = New ADODB.Recordset
    rstAuthors.CursorType = adOpenStatic
    ' Einen Clientcursor verwenden, um die Verwendung der
    ' AbsolutePosition-Eigenschaft zu ermöglichen.
    rstAuthors.CursorLocation = adUseClient
    rstAuthors.Open "SELECT au_id, au_fname, au_lname, city, state " & _
        "FROM Authors ORDER BY au_lname", strCnn, , , adCmdText

    rstAuthors.MoveFirst

    Do While True
        ' Informationen über den aktuellen Datensatz anzeigen und
        ' fragen, wie viele Datensätze verschoben werden sollen.

        strCommand = InputBox( _
            "Record " & rstAuthors.AbsolutePosition & _
            " of " & rstAuthors.RecordCount & vbCr & _
            "Author: " & rstAuthors!au_fname & _
            " " & rstAuthors!au_lname & vbCr & _
            "Location: " & rstAuthors!City & _
            ", " & rstAuthors!State & vbCr & vbCr & _
            "Enter number of records to Move " & _
            "(positive or negative).")

        If strCommand = "" Then Exit Do

        ' Das Lesezeichen für den Fall speichern, dass Move zu weit vor
        ' oder zurück geht.
        varBookmark = rstAuthors.Bookmark

        ' Die Move-Methode erfordert Parameter vom Datentyp Long.
        lngMove = CLng(strCommand)
        rstAuthors.Move lngMove

        ' BOF oder EOF auffangen.
        If rstAuthors.BOF Then
            MsgBox "Too far backward! " & _
                "Returning to current record."
            rstAuthors.Bookmark = varBookmark
        End If
        If rstAuthors.EOF Then
            MsgBox "Too far forward! " & _
                "Returning to current record."
            rstAuthors.Bookmark = varBookmark
        End If
    Loop
    rstAuthors.Close

End Sub


Beispiel für die MoveFirst-, MoveLast-, MoveNext- und MovePrevious-Methoden (VB)

In diesem Beispiel werden die Methoden MoveFirst, MoveLast, MoveNext und MovePrevious verwendet, um den Datensatzzeiger eines Recordset-Objekts auf der Grundlage des übermittelten Befehls zu verschieben. Die MoveAny-Prozedur ist erforderlich, damit diese Prozedur ausgeführt werden kann.

Public Sub MoveFirstX()

    Dim rstAuthors As ADODB.Recordset
    Dim strCnn As String
    Dim strMessage As String
    Dim intCommand As Integer

    ' Ein Recordset aus der Authors-Tabelle öffnen.
        strCnn = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=Pubs;User Id=sa;Password=; "
    Set rstAuthors = New ADODB.Recordset
    rstAuthors.CursorType = adOpenStatic
    ' Einen Clientcursor zum Aktivieren der AbsolutePosition-
    ' Eigenschaft verwenden.
    rstAuthors.CursorLocation = adUseClient
    rstAuthors.Open "Authors", strCnn, , , adCmdTable

    ' Die aktuellen Datensatzinformationen anzeigen und abrufen,
    ' welche Methode der Benutzer ausgewählt hat.
    Do While True

        strMessage = "Name: " & rstAuthors!au_fName & " " & _
            rstAuthors!au_lName & vbCr & "Record " & _
            rstAuthors.AbsolutePosition & " of " & _
            rstAuthors.RecordCount & vbCr & vbCr & _
            "[1 - MoveFirst, 2 - MoveLast, " & vbCr & _
            "3 - MoveNext, 4 - MovePrevious]"
        intCommand = Val(Left(InputBox(strMessage), 1))
        If intCommand < 1 Or intCommand > 4 Then Exit Do

        ' Auf der Grundlage der Benutzereingabe eine Methode aufrufen.
        MoveAny intCommand, rstAuthors
    Loop
    rstAuthors.Close

End Sub

Public Sub MoveAny(intChoice As Integer, _
    rstTemp As Recordset)

    ' Die angegebene Methode verwenden und dabei BOF und EOF auffangen.
    Select Case intChoice
        Case 1
            rstTemp.MoveFirst
        Case 2
            rstTemp.MoveLast
        Case 3
            rstTemp.MoveNext
            If rstTemp.EOF Then
                MsgBox "Already at end of recordset!"
                rstTemp.MoveLast
            End If
        Case 4
            rstTemp.MovePrevious
            If rstTemp.BOF Then
                MsgBox "Already at beginning of recordset!"
                rstTemp.MoveFirst
            End If
    End Select

End Sub


Beispiel für die NextRecordset-Methode (VB)

In diesem Beispiel werden die Daten eines Recordsets mithilfe der NextRecordset-Methode verdeutlicht. Im Recordset wird eine Verbundbefehlsanweisung verwendet, die aus drei einzelnen SELECT-Anweisungen besteht.

Public Sub NextRecordsetX()

    Dim rstCompound As ADODB.Recordset
    Dim strCnn As String
    Dim intCount As Integer

    ' Das Verbundrecordset öffnen.
        strCnn = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=Pubs;User Id=sa;Password=; "

    Set rstCompound = New ADODB.Recordset
    rstCompound.Open "SELECT * FROM Authors; " & _
        "SELECT * FROM stores; " & _
        "SELECT * FROM jobs", strCnn, , , adCmdText

    ' Die Ergebnisse jeder SELECT-Anweisung anzeigen.
    intCount = 1
    Do Until rstCompound.State = adStateClosed
        Debug.Print "Contents of recordset #" & intCount
        Do While Not rstCompound.EOF
            Debug.Print , rstCompound.Fields(0), _
                rstCompound.Fields(1)
            rstCompound.MoveNext
        Loop

        Set rstCompound = rstCompound.NextRecordset
        intCount = intCount + 1
    Loop

End Sub


Beispiel für die NumericScale- und Precision-Eigenschaften (VB)

In diesem Beispiel werden die Eigenschaften NumericScale und Precision zum Anzeigen der numerischen Skalierung und der Genauigkeit der Felder in der Discounts-Tabelle der Pubs-Datenbank verwendet.

Public Sub NumericScaleX()

    Dim rstDiscounts As ADODB.Recordset
    Dim fldTemp As ADODB.Field
    Dim strCnn As String

    ' Das Recordset öffnen.
    strCnn = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=Pubs;User Id=sa;Password=; "
    Set rstDiscounts = New ADODB.Recordset
    rstDiscounts.Open "Discounts", strCnn, , , adCmdTable

    ' Die numerische Skala und Genauigkeit von numerischen Feldern
    ' und Feldern mit kurzen ganzen Zahlen anzeigen.
    For Each fldTemp In rstDiscounts.Fields
        If fldTemp.Type = adNumeric _
            Or fldTemp.Type = adSmallInt Then
            MsgBox "Field: " & fldTemp.Name & vbCr & _
                "Numeric scale: " & _
                    fldTemp.NumericScale & vbCr & _
                "Precision: " & fldTemp.Precision
        End If
    Next fldTemp

    rstDiscounts.Close

End Sub


Beispiel für die Open- und Close-Methoden (VB)

In diesem Beispiel werden die Methoden Open und Close in geöffneten Recordset- und Connection-Objekten verwendet.

Public Sub OpenX()

    Dim cnn1 As ADODB.Connection
    Dim rstEmployees As ADODB.Recordset
    Dim strCnn As String
    Dim varDate As Variant

    ' Eine Verbindung öffnen.
        strCnn = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=Pubs;User Id=sa;Password=; "
    Set cnn1 = New ADODB.Connection
    cnn1.Open strCnn

    ' Die Angestelltentabelle öffnen.
    Set rstEmployees = New ADODB.Recordset
    rstEmployees.CursorType = adOpenKeyset
    rstEmployees.LockType = adLockOptimistic
    rstEmployees.Open "employee", cnn1, , , adCmdTable

    ' Das Einstellungsdatum des ersten Angestelltendatensatzes einer
    ' Variablen zuweisen und das Einstellungsdatum dann ändern.
    varDate = rstEmployees!hire_date
    Debug.Print "Original data"
    Debug.Print "  Name - Hire Date"
    Debug.Print "  " & rstEmployees!fName & " " & _
        rstEmployees!lName & " - " & rstEmployees!hire_date
    rstEmployees!hire_date = #1/1/1900#
    rstEmployees.Update
    Debug.Print "Changed data"
    Debug.Print "  Name - Hire Date"
    Debug.Print "  " & rstEmployees!fName & " " & _
        rstEmployees!lName & " - " & rstEmployees!hire_date

    ' Das Recordset erneut abfragen und das Einstellungsdatum erneut
    ' festlegen.
    rstEmployees.Requery
    rstEmployees!hire_date = varDate
    rstEmployees.Update
    Debug.Print "Data after reset"
    Debug.Print "  Name - Hire Date"
    Debug.Print "  " & rstEmployees!fName & " " & _
        rstEmployees!lName & " - " & rstEmployees!hire_date

    rstEmployees.Close
    cnn1.Close

End Sub


Beispiel für die OpenSchema-Methode (VB)

In diesem Beispiel wird die OpenSchema-Methode zum Anzeigen der einzelnen Tabellennamen und -typen in der Pubs-Datenbank verwendet.

Public Sub OpenSchemaX()

    Dim cnn1 As ADODB.Connection
    Dim rstSchema As ADODB.Recordset
    Dim strCnn As String

    Set cnn1 = New ADODB.Connection
        strCnn = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=Pubs;User Id=sa;Password=; "
    cnn1.Open strCnn

    Set rstSchema = cnn1.OpenSchema(adSchemaTables)

    Do Until rstSchema.EOF
        Debug.Print "Table name: " & _
            rstSchema!TABLE_NAME & vbCr & _
            "Table type: " & rstSchema!TABLE_TYPE & vbCr
        rstSchema.MoveNext
    Loop
    rstSchema.Close

    cnn1.Close

End Sub

Im folgenden Beispiel wird die Abfragebeschränkung TABLE_TYPE im Argument Criteria der OpenSchema-Methode festgelegt. Aufgrund dessen werden nur Schemainformationen für die Ansichten zurückgegeben, die in der Pubs-Datenbank angegeben werden. Das Beispiel zeigt dann Namen und Typ(en) dieser Tabelle(n) an.

Public Sub OpenSchemaX2()

    Dim cnn2 As ADODB.Connection
    Dim rstSchema As ADODB.Recordset
    Dim strCnn As String

    Set cnn2 = New ADODB.Connection
        strCnn = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=Pubs;User Id=sa;Password=; "
    cnn2.Open strCnn

    Set rstSchema = cnn2.OpenSchema(adSchemaTables, Array(Empty, Empty, Empty, "VIEW"))

        Do Until rstSchema.EOF
            Debug.Print "Table name: " & _
                rstSchema!TABLE_NAME & vbCr & _
                "Table type: " & rstSchema!TABLE_TYPE & vbCr
            rstSchema.MoveNext
        Loop
    rstSchema.Close

    cnn2.Close

End Sub


Beispiel für die Optimize-Eigenschaft (VB)

Dieses Beispiel verdeutlicht die dynamische Optimize-Eigenschaft des Field-Objekts. Das zip-Feld in der Authors-Tabelle der Pubs-Datenbank ist nicht indiziert. Durch Setzen der Optimize-Eigenschaft im zip-Feld auf True wird ADO veranlasst, einen Index zu erstellen, der das Leistungsverhalten der Find-Methode verbessert.

Sub Main()
    OptimizeX
End Sub

Public Sub OptimizeX()
Dim rst As ADODB.Recordset

Set rst = New ADODB.Recordset
rst.CursorLocation = adUseClient        ' Indexerstellung aktivieren
rst.Open "SELECT * FROM Authors", _
            "DSN=Pubs;Provider=MSDASQL;", _
            adOpenStatic, adLockReadOnly, adCmdText
rst!zip.Properties("Optimize") = True   ' Den Index erstellen
rst.Find "zip = '94595'"                ' Akiko Yokomoto suchen
Debug.Print rst!au_fname & " " & rst!au_lname & " " & _
            rst!address & " " & rst!city & " " & rst!State
rst!zip.Properties("Optimize") = False  ' Den Index löschen

rst.Close
End Sub


Beispiel für die OriginalValue- und UnderlyingValue-Eigenschaften (VB)

In diesem Beispiel werden die Eigenschaften OriginalValue und UnderlyingValue erläutert, indem eine Nachricht angezeigt wird, wenn sich die einem Datensatz zugrunde liegenden Daten während der Stapelaktualisierung eines Recordset-Objekts verändert haben.

Public Sub OriginalValueX()

    Dim cnn1 As ADODB.Connection
    Dim rstTitles As ADODB.Recordset
    Dim fldType As ADODB.Field
    Dim strCnn As String

    ' Eine Verbindung öffnen.
    Set cnn1 = New ADODB.Connection
    strCnn = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=Pubs;User Id=sa;Password=; "
    cnn1.Open strCnn

    ' Das Recordset für die Stapelaktualisierung öffnen.
    Set rstTitles = New ADODB.Recordset
    Set rstTitles.ActiveConnection = cnn1
    rstTitles.CursorType = adOpenKeyset
    rstTitles.LockType = adLockBatchOptimistic
    rstTitles.Open "Titles"

    ' Die Feldobjektvariable für das Type-Feld festlegen.
    Set fldType = rstTitles!Type

    ' Den Typ von Psychologiebüchern ändern.
    Do Until rstTitles.EOF
        If Trim(fldType) = "psychology" Then
            fldType = "self_help"
        End If
        rstTitles.MoveNext
    Loop

    ' Eine Änderung eines anderen Benutzers durch Verwenden einer
    ' Befehlszeichenfolge zur Datenaktualisierung simulieren.
    cnn1.Execute "UPDATE Titles SET type = 'sociology' " & _
        "WHERE type = 'psychology'"

    ' Auf Änderungen überprüfen.
    rstTitles.MoveFirst
    Do Until rstTitles.EOF
        If fldType.OriginalValue <> _
            fldType.UnderlyingValue Then

            MsgBox "Data has changed!" & vbCr & vbCr & _
                "  Title ID: " & rstTitles!title_id & vbCr & _
                "  Current value: " & fldType & vbCr & _
                "  Original value: " & _
                fldType.OriginalValue & vbCr & _
                "  Underlying value: " & _
                fldType.UnderlyingValue & vbCr
        End If
        rstTitles.MoveNext
    Loop

    ' Die Aktualisierung abbrechen, da es sich um ein Beispiel handelt.
    rstTitles.CancelBatch
    rstTitles.Close

    ' Die ursprünglichen Werte wiederherstellen.
    cnn1.Execute "UPDATE Titles SET type = 'psychology' " & _
        "WHERE type = 'sociology'"

    cnn1.Close

End Sub


Beispiel für die Prepared-Eigenschaft (VB)

In diesem Beispiel wird die Prepared-Eigenschaft erläutert, indem zwei Command-Objekte geöffnet werden - ein vorverarbeitetes und ein nicht vorverarbeitetes.

Public Sub PreparedX()

    Dim cnn1 As ADODB.Connection
    Dim cmd1 As ADODB.Command
    Dim cmd2 As ADODB.Command
    Dim strCnn As String
    Dim strCmd As String
    Dim sngStart As Single
    Dim sngEnd As Single
    Dim sngNotPrepared As Single
    Dim sngPrepared As Single
    Dim intLoop As Integer

    ' Eine Verbindung öffnen.
    strCnn = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=Pubs;User Id=sa;Password=; "
    Set cnn1 = New ADODB.Connection
    cnn1.Open strCnn

    ' Zwei Command-Objekte für denselben Befehl erstellen – ein
    ' vorbereitetes und ein nicht vorbereitetes.
    strCmd = "SELECT title, type FROM Titles ORDER BY type"

    Set cmd1 = New ADODB.Command
    Set cmd1.ActiveConnection = cnn1
    cmd1.CommandText = strCmd

    Set cmd2 = New ADODB.Command
    Set cmd2.ActiveConnection = cnn1
    cmd2.CommandText = strCmd
    cmd2.Prepared = True

    ' Einen Zeitmesser festlegen und dann den unvorbereiteten Befehl
    ' 20 mal ausführen.
    sngStart = Timer
    For intLoop = 1 To 20
        cmd1.Execute
    Next intLoop
    sngEnd = Timer
    sngNotPrepared = sngEnd - sngStart

    ' Den Zeitmesser erneut festlegen und dann den vorbereiteten Befehl
    ' 20 mal ausführen.
    sngStart = Timer
    For intLoop = 1 To 20
        cmd2.Execute
    Next intLoop
    sngEnd = Timer
    sngPrepared = sngEnd - sngStart

    ' Die Leistungsergebnisse anzeigen.
    MsgBox "Performance Results:" & vbCr & _
        "    Not Prepared: " & Format(sngNotPrepared, _
        "##0.000") & " seconds" & vbCr & _
        "    Prepared: " & Format(sngPrepared, _
        "##0.000") & " seconds"

    cnn1.Close

End Sub


Beispiel für die Provider- und DefaultDatabase-Eigenschaften (VB)

In diesem Beispiel wird die Provider-Eigenschaft erläutert, indem drei Connection-Objekte mit verschiedenen Providern geöffnet werden. Es wird auch die DefaultDatabase-Eigenschaft verwendet, um die Standarddatenbank für den Microsoft ODBC-Provider anzugeben.

Public Sub ProviderX()

    Dim cnn1 As ADODB.Connection
    Dim cnn2 As ADODB.Connection
    Dim cnn3 As ADODB.Connection

    ' Eine Verbindung mithilfe des Microsoft ODBC-Providers öffnen.
    Set cnn1 = New ADODB.Connection
    cnn1.ConnectionString = "driver={SQL Server};" & _
        "server=bigsmile;uid=sa;pwd=pwd"
    cnn1.Open strCnn
    cnn1.DefaultDatabase = "Pubs"

    ' Den Provider anzeigen.
    MsgBox "Cnn1 provider: " & cnn1.Provider

    ' Eine Verbindung mithilfe des Microsoft Jet-Providers öffnen.
    Set cnn2 = New ADODB.Connection
    cnn2.Provider = "Microsoft.Jet.OLEDB.3.51"
    cnn2.Open "C:\Samples\northwind.mdb", "admin", ""

    ' Den Provider anzeigen.
    MsgBox "Cnn2 provider: " & cnn2.Provider

   ' Eine Verbindung mithilfe des Microsoft SQL Server-Providers öffnen.
    Set cnn3 = New ADODB.Connection
    cnn3.Provider = "sqloledb"
    cnn3.Open "Data Source=srv;Initial Catalog=Pubs;", "sa", ""

    ' Den Provider anzeigen.
    MsgBox "Cnn3 provider: " & cnn3.Provider

    cnn1.Close
    cnn2.Close
    cnn3.Close

End Sub


Beispiel für die Read-, ReadText-, Write- und WriteText-Methoden (VB)

Dieses Beispiel verdeutlicht, wie die Inhalte eines Textfeldes in sowohl einen Text- als auch einen binären Datenstrom (Stream-Objekt) gelesen werden. Zu den weiteren dargelegten Eigenschaften und Methoden zählen Position, Size, Charset und SetEOS.

Public Sub ReadX()
    ' Variablen deklarieren
    Dim objStream As Stream
    Dim varA As Variant
    Dim bytA() As Byte
    Dim i As Integer
    Dim strBytes As String

    ' Ein Stream-Objekt instanziieren und öffnen
    Set objStream = New Stream
    objStream.Open

    ' Den Textinhalt eines Textfeldes in den Datenstrom schreiben
    objStream.WriteText Text1.Text

    ' Den Textinhalt und die Größe des Datenstromes anzeigen
    objStream.Position = 0
    Debug.Print "Default text:"
    Debug.Print objStream.ReadText
    Debug.Print objStream.Size

    ' Den Zeichensatz wechseln und anzeigen
    objStream.Position = 0
    objStream.Charset = "Windows-1252"
    Debug.Print "New Charset text:"
    Debug.Print objStream.ReadText
    Debug.Print objStream.Size

    ' Zu einem binären Datenstrom wechseln und anzeigen
    objStream.Position = 0
    objStream.Type = adTypeBinary
    Debug.Print "Binary:"
    Debug.Print objStream.Read
    Debug.Print objStream.Size

    ' Ein Array von Bytes mit dem Text des Textfeldes laden
    ReDim bytA(Len(Text1.Text))
    For i = 1 To Len(Text1.Text)
        bytA(i - 1) = CByte(Asc(Mid(Text1.Text, i, 1)))
    Next

    ' Den Pufferinhalt in den binären Datenstrom schreiben und anzeigen
    objStream.Position = 0
    objStream.Write bytA()
    objStream.SetEOS
    objStream.Position = 0
    Debug.Print "Binary after Write:"
    Debug.Print objStream.Read
    Debug.Print objStream.Size

    ' Zu einem Textdatenstrom zurückwechseln und anzeigen
    Debug.Print "Translated back:"
    objStream.Position = 0
    objStream.Type = adTypeText
    Debug.Print objStream.ReadText
    Debug.Print objStream.Size
End Sub


Beispiel für die Refresh-Methode (VB)

In diesem Beispiel wird die Verwendung der Refresh-Methode zum Aktualisieren der Parameters-Auflistung für das Command-Objekt einer gespeicherten Prozedur verdeutlicht.

Public Sub RefreshX()

    Dim cnn1 As ADODB.Connection
    Dim cmdByRoyalty As ADODB.Command
    Dim rstByRoyalty As ADODB.Recordset
    Dim rstAuthors As ADODB.Recordset
    Dim intRoyalty As Integer
    Dim strAuthorID As String
    Dim strCnn As String

    ' Die Verbindung öffnen.
    Set cnn1 = New ADODB.Connection
        strCnn = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=Pubs;User Id=sa;Password=; "
    cnn1.Open strCnn

    ' Ein Command-Objekt für eine gespeicherte Prozedur
    ' mit einem einzelnen Parameter öffnen.
    Set cmdByRoyalty = New ADODB.Command
    Set cmdByRoyalty.ActiveConnection = cnn1
    cmdByRoyalty.CommandText = "byroyalty"
    cmdByRoyalty.CommandType = adCmdStoredProc
    cmdByRoyalty.Parameters.Refresh

    ' Den Parameterwert abrufen und den Befehl ausführen;
    ' die Ergebnisse in einem Recordset speichern.
    intRoyalty = Trim(InputBox("Enter royalty:"))
    cmdByRoyalty.Parameters(1) = intRoyalty
    Set rstByRoyalty = cmdByRoyalty.Execute()

    ' Die Authors-Tabelle öffnen, um Autorennamen zum Anzeigen abzurufen.
    Set rstAuthors = New ADODB.Recordset
    rstAuthors.Open "Authors", cnn1, , , adCmdTable

    ' Die aktuellen Daten im Recordset drucken und dabei
    ' Autorennamen aus der Authors-Tabelle hinzufügen.
    Debug.Print "Authors with " & intRoyalty & " percent royalty"
    Do While Not rstByRoyalty.EOF
        strAuthorID = rstByRoyalty!au_id
        Debug.Print "    " & rstByRoyalty!au_id & ", ";
        rstAuthors.Filter = "au_id = '" & strAuthorID & "'"
        Debug.Print rstAuthors!au_fname & " " & _
            rstAuthors!au_lname
        rstByRoyalty.MoveNext
    Loop

    rstByRoyalty.Close
    rstAuthors.Close
    cnn1.Close

End Sub


Beispiel für die Resync-Methode (VB)

In diesem Beispiel wird die Verwendung der Resync-Methode zum Aktualisieren von Daten in einem statischen Recordset verdeutlicht.

Public Sub ResyncX()

    Dim strCnn As String
    Dim rstTitles As ADODB.Recordset

    ' Die Verbindung öffnen.
        strCnn = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=Pubs;User Id=sa;Password=; "

    ' Ein Recordset für die Titles-Tabelle öffnen.
    Set rstTitles = New ADODB.Recordset
    rstTitles.CursorType = adOpenStatic
    rstTitles.LockType = adLockBatchOptimistic
    rstTitles.Open "Titles", strCnn, , , adCmdTable

    ' Den Typ des ersten Titels im Recordset ändern.
    rstTitles!Type = "database"

    ' Die Ergebnisse der Änderung anzeigen.
    MsgBox "Before resync: " & vbCr & vbCr & _
        "Title - " & rstTitles!Title & vbCr & _
        "Type - " & rstTitles!Type

    ' Erneut mit der Datenbank synchronisieren und die Ergebnisse
    ' erneut anzeigen.
    rstTitles.Resync
    MsgBox "After resync: " & vbCr & vbCr & _
        "Title - " & rstTitles!Title & vbCr & _
        "Type - " & rstTitles!Type

    rstTitles.CancelBatch
    rstTitles.Close

End Sub


Beispiel für die Save- und Open-Methoden (VB)

Die nachstehenden drei Beispiele verdeutlichen, wie die Save- und Open-Methoden zusammen verwendet werden können.

Bei diesen Beispielen wird davon ausgegangen, dass Sie auf Geschäftsreise gehen und eine Tabelle aus einer Datenbank mitnehmen möchten. Vor der Abreise greifen Sie auf die Daten in Form eines Recordset-Objekts zu und speichern sie in einem Format, mit dem Sie auf der Reise arbeiten können. Am Zielort angekommen, greifen Sie auf das nunmehr lokale nicht verbundene Recordset-Objekt zu. Sie führen Änderungen am Recordset-Objekt durch und speichern es mit den Änderungen. Nach Ihrer Rückkehr verbinden Sie sich erneut mit der Datenbank und aktualisieren diese mit den auf Ihrer Geschäftsreise durchgeführten Änderungen.

Public Sub Main()
    SaveX1
    SaveX2
    SaveX3
End Sub

Greifen Sie zunächst auf die Authors-Tabelle zu, und speichern Sie diese.

Public Sub SaveX1()
Dim rst As ADODB.Recordset
Set rst = New ADODB.Recordset

rst.Open "SELECT au_id, au_lname, au_fname, phone FROM Authors", _
         "Provider=SQLOLEDB;Data Source=MySrvr;User Id=uid;" & _
         "Password=pwd;Initial Catalog=pubs;" _
         adOpenDynamic, adLockOptimistic, adCmdText

' Das Recordset zu Illustrationszwecken im XML-Format auf eine
' Diskette speichern.
rst.Save "a:\Pubs.xml", adPersistXML

rst.Close
End Sub

Hier sind Sie am Ziel. Sie greifen auf die Authors-Tabelle des nunmehr lokalen nicht verbundenen Recordsets zu. Stellen Sie sicher, dass auf dem verwendeten Computer der MSPersist-Provider installiert ist, um auf die gespeicherte Datei, a:\Pubs.xml, zugreifen zu können.

Public Sub SaveX2()
Dim rst As ADODB.Recordset
Set rst = New ADODB.Recordset

' Zu Illustrationszwecken werden alle Parameter festgelegt.
rst.Open "a:\Pubs.xml", "Provider=MSPersist;", , , adCmdFile

' Jetzt liegt ein lokales, nicht verbundenes Recordset vor. Bearbeiten
' Sie es nach Wunsch.
'(Bei diesem Beispiel macht die Änderung keinen Unterschied.)
rst.Find "au_lname = 'Carson'"
If rst.EOF Then
    Debug.Print "Name not found."
    Exit Sub
End If

rst!city = "Berkeley"
rst.Update

' Die Änderungen zu reinen Illustrationszwecken nun im ADTG-Format
' speichern. Beachten Sie, dass die vorige Version noch auf der Diskette
' gespeichert ist, und zwar als a:\Pubs.xml.
rst.Save "a:\Pubs.adtg", adPersistADTG
rst.Close
End Sub

Dann kehren Sie zurück. Aktualisieren Sie die Datenbank mit den von Ihnen durchgeführten Änderungen.

Public Sub SaveX3()
Dim cnn As New ADODB.Connection
Dim rst As ADODB.Recordset
Set rst = New ADODB.Recordset

' Wenn kein Wert für ActiveConnection vorhanden ist, können Sie Open
' mit Standardwerten aufrufen.
rst.Open "a:\Pubs.adtg"

' Eine Verbindung zur Datenbank herstellen, das Recordset
' mit der Verbindung verknüpfen und die Datenbanktabelle
' dann mit dem veränderten Recordset aktualisieren.
cnn.Open "Provider=SQLOLEDB;Data Source=MySrvr;User Id=uid;" & _
         "Password=pwd;Initial Catalog=pubs;"
rst.ActiveConnection = cnn
rst.UpdateBatch

rst.Close
cnn.Close
End Sub


Beispiel für die Seek-Methode und die Index-Eigenschaft (VB)

Dieses Beispiel verwendet die Seek-Methode sowie die Index-Eigenschaft des Recordset-Objekts zusammen mit einer bestimmten Employee ID, um den Namen des Mitarbeiters in der Employees-Tabelle der Nwind.mdb-Datenbank zu finden.

Public Sub Main()
    SeekX
End Sub

Public Sub SeekX()
Dim rst As ADODB.Recordset
Dim strID As String
Dim strPrompt As String
strPrompt = "Enter an EmployeeID (e.g., 1 to 9)"

Set rst = New ADODB.Recordset
rst.CursorLocation = adUseServer
rst.Open "employees", _
                "Provider=Microsoft.Jet.OLEDB.4.0;" & _
                "Data Source=c:\temp\northwind.mdb;" & _
                "user id=admin;password=;", _
                adOpenKeyset, adLockReadOnly, adCmdTableDirect

' Unterstützt dieser Provider Seek und Index?
If rst.Supports(adIndex) And rst.Supports(adSeek) Then
rst.Index = "EmployeeId"
' Alle Angestellten anzeigen.
        rst.MoveFirst
        Do While rst.EOF = False
            Debug.Print rst!EmployeeID; ": "; rst!firstname; " "; _
                            rst!LastName
            rst.MoveNext
        Loop

' Den Benutzer zur Eingabe einer EmployeeID zwischen 1 und 9 auffordern.
        rst.MoveFirst
        Do
            strID = LCase(Trim(InputBox(strPrompt, "Seek Example")))
            ' Abbrechen, falls strID eine Zeichenfolge der Länge 0 ist
            ' (CANCEL, NULL, etc.)
            If Len(strID) = 0 Then Exit Do
            If Len(strID) = 1 And strID >= "1" And strID <= "9" Then
                rst.Seek Array(strID), adSeekAfterEQ
                If rst.EOF Then
                    Debug.Print "Employee not found."
                Else
                    Debug.Print strID; ": Employee='"; rst!firstname; " "; _
                    rst!LastName; "'"
                End If
            End If
        Loop
End If

rst.Close
End Sub


Beispiel für die Sort-Eigenschaft (VB)

Dieses Beispiel verwendet die Sort-Eigenschaft des Recordset-Objekts, um die Zeilen eines Recordsets aus der Authors-Tabelle der Pubs-Datenbank neu zu sortieren. Mithilfe einer sekundären Hilfsroutine werden die einzelnen Zeilen gedruckt.

Sub Main()
    SortX
End Sub

Public Sub SortX()
Dim cnn As New ADODB.Connection
Dim rst As New ADODB.Recordset

rst.CursorLocation = adUseClient
cnn.Open "DSN=Pubs;Provider=MSDASQL;uid=sa;pwd=;"
rst.Open "SELECT * FROM Authors", cnn, _
            adOpenStatic, adLockReadOnly, adCmdText
SortXprint "Initial Order", rst

rst.Sort = "au_lname ASC, au_fname ASC"
SortXprint "Last Name Ascending", rst

rst.Sort = "au_lname DESC, au_fname ASC"
SortXprint "Last Name Descending", rst

rst.Close
cnn.Close
End Sub

Dies ist die sekundäre Hilfsroutine, die den entsprechenden Titel und die Inhalte des angegebenen Recordset-Objekts druckt.

Public Sub SortXprint ( title As String, rstp As ADODB.Recordset )
Debug.Print "---------------" & title & "---------------"
Debug.Print "First Name  Last Name" & vbCr & _
                "---------------------------------------------------"
rstp.MoveFirst
While Not rstp.EOF
    Debug.Print rstp!au_fname & " " & rstp!au_lname
    rstp.MoveNext
Wend
Debug.Print
End Sub


Beispiel für die Source-Eigenschaft (VB)

In diesem Beispiel wird die Source-Eigenschaft erläutert, indem drei Recordset-Objekte geöffnet werden, die auf unterschiedlichen Datenquellen basieren.

Public Sub SourceX()

    Dim cnn1 As ADODB.Connection
    Dim rstTitles As ADODB.Recordset
    Dim rstPublishers As ADODB.Recordset
    Dim rstPublishersDirect As ADODB.Recordset
    Dim rstTitlesPublishers As ADODB.Recordset
    Dim cmdSQL As ADODB.Command
    Dim strCnn As String
    Dim strSQL As String

    ' Eine Verbindung öffnen.
    Set cnn1 = New ADODB.Connection
    strCnn = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=Pubs;User Id=sa;Password=; "
    cnn1.Open strCnn

    ' Ein Recordset auf der Grundlage eines Command-Objekts öffnen.
    Set cmdSQL = New ADODB.Command
    Set cmdSQL.ActiveConnection = cnn1
    cmdSQL.CommandText = "Select title, type, pubdate " & _
        "FROM Titles ORDER BY title"
    Set rstTitles = cmdSQL.Execute()

    ' Ein Recordset auf der Grundlage einer Tabelle öffnen.
    Set rstPublishers = New ADODB.Recordset
    rstPublishers.Open "publishers", strCnn, , , adCmdTable

    ' Ein Recordset auf der Grundlage einer Tabelle öffnen.
    Set rstPublishersDirect = New ADODB.Recordset
    rstPublishersDirect.Open "publishers", strCnn, , , adCmdTableDirect

    ' Ein Recordset auf der Grundlage einer SQL-Zeichenfolge öffnen.
    Set rstTitlesPublishers = New ADODB.Recordset
    strSQL = "SELECT title_ID AS TitleID, title AS Title, " & _
        "publishers.pub_id AS PubID, pub_name AS PubName " & _
        "FROM publishers INNER JOIN Titles " & _
        "ON publishers.pub_id = Titles.pub_id " & _
        "ORDER BY Title"
    rstTitlesPublishers.Open strSQL, strCnn, , , adCmdText

    ' Die Source-Eigenschaft verwenden, um die Quelle jedes Recordsets
    ' anzuzeigen.
    MsgBox "rstTitles source: " & vbCr & _
        rstTitles.Source & vbCr & vbCr & _
        "rstPublishers source: " & vbCr & _
        rstPublishers.Source & vbCr & vbCr & _
        "rstPublishersDirect source: " & vbCr & _
        rstPublishersDirect.Source & vbCr & vbCr & _
        "rstTitlesPublishers source: " & vbCr & _
        rstTitlesPublishers.Source

    rstTitles.Close
    rstPublishers.Close
    rstTitlesPublishers.Close
    cnn1.Close

End Sub


Beispiel für die State-Eigenschaft (VB)

In diesem Beispiel wird die State-Eigenschaft zum Anzeigen einer Nachricht verwendet, während asynchrone Verbindungen geöffnet und asynchrone Befehle ausgeführt werden.

Public Sub StateX()

    Dim cnn1 As ADODB.Connection
    Dim cnn2 As ADODB.Connection
    Dim cmdChange As ADODB.Command
    Dim cmdRestore As ADODB.Command
    Dim strCnn As String

    ' Zwei asynchrone Verbindungen öffnen und während des
    ' Verbindungsaufbaus eine Meldung anzeigen.
    Set cnn1 = New ADODB.Connection
    Set cnn2 = New ADODB.Connection
    strCnn = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=Pubs;User Id=sa;Password=; "

    cnn1.Open strCnn, , , adAsyncConnect
    While (cnn1.State = adStateConnecting)
        Debug.Print "Opening first connection...."
    Wend

    cnn2.Open strCnn, , , adAsyncConnect
    While (cnn2.State = adStateConnecting)
        Debug.Print "Opening second connection...."
    Wend

    ' Zwei Command-Objekte erstellen.
    Set cmdChange = New ADODB.Command
    cmdChange.ActiveConnection = cnn1
    cmdChange.CommandText = "UPDATE Titles SET type = 'self_help' " & _
        "WHERE type = 'psychology'"

    Set cmdRestore = New ADODB.Command
    cmdRestore.ActiveConnection = cnn2
    cmdRestore.CommandText = "UPDATE Titles SET type = 'psychology' " & _
        "WHERE type = 'self_help'"

    ' Die Befehle ausführen und während ihrer Ausführung eine Meldung
    ' anzeigen.
    cmdChange.Execute , , adAsyncExecute
    While (cmdChange.State = adStateExecuting)
        Debug.Print "Change command executing...."
    Wend

    cmdRestore.Execute , , adAsyncExecute
    While (cmdRestore.State = adStateExecuting)
        Debug.Print "Restore command executing...."
    Wend

    cnn1.Close
    cnn2.Close

End Sub


Beispiel für die Status-Eigenschaft (Field) (VB)

Das nachstehende Beispiel öffnet ein Dokument in einem Ordner mit Schreib-/Lesezugriff unter Verwendung des Internet Publishing Provider. Die Status-Eigenschaft eines Field-Objekts des Record-Objekts wird zunächst auf adFieldPendingInsert gesetzt und dann auf adFieldOk aktualisiert.

sub insert()
    Dim rec As New Record
    ' Ein Dokument mit Lese-/Schreibzugriff öffnen
    rec.Open "http://adot20/davfs/mungs", , adModeReadWrite, _
        adCreateCollection Or adOpenIfExists

    Debug.print "Append couple of fields"
    rec.Fields.Append "chektest:fld1", adWChar, 42, adFldUpdatable, "fld1"
    rec.Fields.Append "chektest:fld2", adWChar, 42, adFldUpdatable, "fld2"
    Debug.Print "status for the fields"
    Debug.Print rec.Fields("chektest:fld1").Status 'adfldpendinginsert
    Debug.Print rec.Fields("chektest:fld2").Status 'adfldpendinginsert
    rec.Fields.Update
    debug.print "Update succeeds"
    Debug.Print rec.Fields("chektest:fld1").Status
        ' adFieldOK, falls die Aktualisierung erfolgreich ist
    Debug.Print rec.Fields("chektest:fld2").Status
        ' adFieldOK falls erfolgreich
End sub

Das nachstehende Beispiel löscht ein bekanntes Field aus einem Record-Objekt, das von einem Dokument aus geöffnet wurde. Die Status-Eigenschaft wird zunächst auf adFieldOK und dann auf adFieldPendingUnknown gesetzt.

sub delete()
    Dim rec As New Record
    Dim fld As Field
    ' Ein Dokument mit Lese-/Schreibzugriff öffnen
    rec.Open "http://adot20/davfs/mungs", , adModeReadWrite, _
        adCreateCollection Or adOpenIfExists
    Debug.Print rec.Fields("chektest:fld1").status ' Sollte adFldOK sein
    ' Ein bereits in der Auflistung vorhandenes Feld löschen
    rec.Fields.Delete "chektest:fld1"
    Set fld = rec.Fields("chektest:fld1")
    Debug.Print rec.Fields("chektest:fld1").Status    ' Löschen steht aus
    rec.Fields.Update
    Debug.Print "Deleted"
    Debug.Print fld.Status    ' Unbekannt steht aus
End sub

Der nachstehende Code löscht ein Field aus einem Record-Objekt, das in einem schreibgeschützten Dokument geöffnet wurde. Status wird dabei auf adFieldPendingDelete gesetzt. Beim Anwenden der Update-Methode wird der Löschvorgang fehlschlagen und Status auf adFieldPendingDelete sowie adFieldPermissionDenied gesetzt. CancelUpdate entfernt die noch nicht abgeschlossene Status-Einstellung.

sub delete2()
    Dim rec As New Record
    Dim fld As Field
    ' Ein Dokument mit Lese-/Schreibzugriff öffnen
    rec.Open "http://adot20/davfs/mungs", , adModeReadWrite, _
        adCreateCollection Or adOpenIfExists

    Debug.Print "Try to delete something without permission"
    rec.Fields.Delete ("RESOURCE_PARSENAME")
    Set fld = rec.Fields("RESOURCE_PARSENAME")
    Debug.Print "Pending delete"
    Debug.Print fld.Status    ' Löschen steht aus
    Debug.Print "Delete should fail on Update"
    rec.Fields.Update    ' Sollte fehlschlagen
    Debug.Print fld.Status    ' Löschen steht aus und Fehler
    rec.Fields.CancelUpdate
    Debug.Print fld.Status    ' Okay
End sub


Beispiel für die Status-Eigenschaft (Recordset) (VB)

In diesem Beispiel wird die Status-Eigenschaft zum Anzeigen der Datensätze verwendet, die in einer Stapeloperation verändert wurden, bevor eine Stapelaktualisierung stattgefunden hat.

Public Sub StatusX()

    Dim rstTitles As ADODB.Recordset
    Dim strCnn As String

    ' Das Recordset für die Stapelaktualisierung öffnen.
    strCnn = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=Pubs;User Id=sa;Password=; "
    Set rstTitles = New ADODB.Recordset
    rstTitles.CursorType = adOpenKeyset
    rstTitles.LockType = adLockBatchOptimistic
    rstTitles.Open "Titles", strCnn, , , adCmdTable

    ' Den Typ von Psychologiebüchern ändern.
    Do Until rstTitles.EOF
        If Trim(rstTitles!Type) = "psychology" Then
            rstTitles!Type = "self_help"
        End If
        rstTitles.MoveNext
    Loop

    ' Titel-ID und Status anzeigen.
    rstTitles.MoveFirst
    Do Until rstTitles.EOF
        If rstTitles.Status = adRecModified Then
            Debug.Print rstTitles!title_id & " - Modified"
        Else
            Debug.Print rstTitles!title_id
        End If
        rstTitles.MoveNext
    Loop

    ' Die Aktualisierung abbrechen, da es sich um ein Beispiel handelt.
    rstTitles.CancelBatch
    rstTitles.Close

End Sub


Beispiel für die StayInSync-Eigenschaft (VB)

Dieses Beispiel verdeutlicht, wie mit der StayInSync-Eigenschaft der Zugriff auf Zeilen in einem hierarchischen Recordset erleichtert wird.

Die äußere Schleife zeigt den Vor- und Nachnamen der einzelnen Autoren, den Bundesstaat und die Identifikation an. Das angehängte Recordset-Objekt für die einzelnen Zeilen wird von der Fields-Auflistung abgerufen und automatisch von der StayInSync-Eigenschaft zu rstTitleAuthor zugeordnet, sobald sich das übergeordnete Recordset-Objekt zu einer neuen Zeile bewegt. Die innere Schleife zeigt vier Felder jeder Zeile im angehängten Recordset-Objekt an.

Public Sub Main()
    StayInSyncX
End Sub

Public Sub StayInSyncX()
Dim cnn As ADODB.Connection
Dim rst As ADODB.Recordset
Dim rstTitleAuthor As New ADODB.Recordset

Set cnn = New ADODB.Connection
Set rst = New ADODB.Recordset
cnn.Open "DSN=Pubs;Provider=MSDataShape;Data Provider=MSDASQL;"
rst.StayInSync = True
rst.Open "SHAPE  {select * from Authors} " & _
                    "APPEND ({select * from titleauthor}" & _
                    "RELATE au_id TO au_id) AS chapTitleAuthor", _
                    cnn, , , adCmdText
Set rstTitleAuthor = rst("chapTitleAuthor").Value
While Not rst.EOF
    Debug.Print rst!au_fname & " " & rst!au_lname & " " & _
                    rst!state & " " & rst!au_id
    While Not rstTitleAuthor.EOF
        Debug.Print rstTitleAuthor(0) & " " & rstTitleAuthor(1) & " " & _
                    rstTitleAuthor(2) & " " & rstTitleAuthor(3)
        rstTitleAuthor.MoveNext
    Wend
    rst.MoveNext
Wend
End Sub


Beispiel für die Supports-Methode (VB)

In diesem Beispiel wird die Supports-Methode zum Anzeigen der Optionen verwendet, die durch ein mit verschiedenen Cursortypen geöffnetes Recordset unterstützt werden. Um diese Prozedur ausführen zu können, ist die DisplaySupport-Prozedur erforderlich.

Public Sub SupportsX()

    Dim aintCursorType(4) As Integer
    Dim rstTitles As ADODB.Recordset
    Dim strCnn As String
    Dim intIndex As Integer

    ' Die Verbindung öffnen.
        strCnn = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=Pubs;User Id=sa;Password=; "

    ' Das Array mit CursorType-Konstanten auffüllen.
    aintCursorType(0) = adOpenForwardOnly
    aintCursorType(1) = adOpenKeyset
    aintCursorType(2) = adOpenDynamic
    aintCursorType(3) = adOpenStatic

    ' Ein Recordset mit jedem Wert für CursorType und
    ' optimistischen Sperren öffnen. Dann die DisplaySupport-
    ' Prozedur aufrufen, um die unterstützten Optionen anzuzeigen.
    For intIndex = 0 To 3
        Set rstTitles = New ADODB.Recordset
        rstTitles.CursorType = aintCursorType(intIndex)
        rstTitles.LockType = adLockOptimistic
        rstTitles.Open "Titles", strCnn, , , adCmdTable

        Select Case aintCursorType(intIndex)
            Case adOpenForwardOnly
                Debug.Print "ForwardOnly cursor supports:"
            Case adOpenKeyset
                Debug.Print "Keyset cursor supports:"
            Case adOpenDynamic
                Debug.Print "Dynamic cursor supports:"
            Case adOpenStatic
                Debug.Print "Static cursor supports:"
        End Select

        DisplaySupport rstTitles
        rstTitles.Close
    Next intIndex

End Sub

Public Sub DisplaySupport(rstTemp As ADODB.Recordset)

    Dim alngConstants(11) As Long
    Dim booSupports As Boolean
    Dim intIndex As Integer

    ' Das Array mit Cursoroptionskonstanten auffüllen.
    alngConstants(0) = adAddNew
    alngConstants(1) = adApproxPosition
    alngConstants(2) = adBookmark
    alngConstants(3) = adDelete
    alngConstants(4) = adFind
    alngConstants(5) = adHoldRecords
    alngConstants(6) = adMovePrevious
    alngConstants(7) = adNotify
    alngConstants(8) = adResync
    alngConstants(9) = adUpdate
    alngConstants(10) = adUpdateBatch

    For intIndex = 0 To 10
        booSupports = _
            rstTemp.Supports(alngConstants(intIndex))
        If booSupports Then
            Select Case alngConstants(intIndex)
                Case adAddNew
                    Debug.Print "   AddNew"
                Case adApproxPosition
                    Debug.Print "   AbsolutePosition and AbsolutePage"
                Case adBookmark
                    Debug.Print "   Bookmark"
                Case adDelete
                    Debug.Print "   Delete"
                Case adFind
                    Debug.Print "   Find"
                Case adHoldRecords
                    Debug.Print "   Holding Records"
                Case adMovePrevious
                    Debug.Print "   MovePrevious and Move"
                Case adNotify
                    Debug.Print "   Notifications"
                Case adResync
                    Debug.Print "   Resyncing data"
                Case adUpdate
                    Debug.Print "   Update"
                Case adUpdateBatch
                    Debug.Print "   batch updating"
            End Select
        End If
    Next intIndex

End Sub


Beispiel für die Type-Eigenschaft (Field) (VB)

In diesem Beispiel wird die Type-Eigenschaft erläutert, indem der Name der Konstanten angezeigt wird, die dem Wert der Type-Eigenschaft aller Field-Objekte in der Employees-Tabelle entspricht. Zum Ausführen dieser Prozedur ist die FieldType-Funktion erforderlich.

Public Sub TypeX()

    Dim rstEmployees As ADODB.Recordset
    Dim fldLoop As ADODB.Field
    Dim strCnn As String

    ' Das Recordset mit Daten aus der Employees-Tabelle öffnen.
    strCnn = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=Pubs;User Id=sa;Password=; "
    Set rstEmployees = New ADODB.Recordset
    rstEmployees.Open "employee", strCnn, , , adCmdTable

    Debug.Print "Fields in Employees Table:" & vbCr

    ' Die Fields-Auflistung der Employees-Tabelle aufzählen.
    For Each fldLoop In rstEmployees.Fields
        Debug.Print "  Name: " & fldLoop.Name & vbCr & _
            "  Type: " & FieldType(fldLoop.Type) & vbCr
    Next fldLoop

End Sub

Public Function FieldType(intType As Integer) As String

    Select Case intType
        Case adChar
            FieldType = "adChar"
        Case adVarChar
            FieldType = "adVarChar"
        Case adSmallInt
            FieldType = "adSmallInt"
        Case adUnsignedTinyInt
            FieldType = "adUnsignedTinyInt"
        Case adDBTimeStamp
            FieldType = "adDBTimeStamp"
    End Select

End Function


Beispiel für die Type-Eigenschaft (Property) (VB)

Dieses Beispiel verdeutlicht die Type-Eigenschaft. Es handelt sich dabei um das Modell eines Dienstprogramms zum Auflisten von Namen und Typen einer Auflistung, wie beispielsweise Properties, Fields usw.

Das Recordset-Objekt muss nicht geöffnet werden, um auf die zugehörige Properties-Auflistung zugreifen zu können; diese werden erstellt, wenn das Recordset-Objekt instanziiert wird. Jedoch werden durch Setzen der CursorLocation-Eigenschaft auf adUseClient der Properties-Auflistung des Recordset-Objekts zahlreiche dynamische Eigenschaften hinzugefügt, die das Beispiel etwas interessanter gestalten. Aus Gründen der Anschaulichkeit wird in diesem Beispiel explizit die Item-Eigenschaft verwendet, um auf die einzelnen Property-Objekte zugreifen zu können.

Public Sub Main()
    TypeX
End Sub

Public Sub TypeX()
Dim rst As ADODB.Recordset
Dim prop As ADODB.Property
Dim ix As Integer
Dim strMsg As String

Set rst = New ADODB.Recordset
rst.CursorLocation = adUseClient
For ix = 0 To rst.Properties.Count - 1
Set prop = rst.Properties.Item(ix)
Select Case prop.Type
    Case adBigInt
        strMsg = "adBigInt"
    Case adBinary
        strMsg = "adBinary"
    Case adBoolean
        strMsg = "adBoolean"
    Case adBSTR
        strMsg = "adBSTR"
    Case adChapter
        strMsg = "adChapter"
    Case adChar
        strMsg = "adChar"
    Case adCurrency
        strMsg = "adCurrency"
    Case adDate
        strMsg = "adDate"
    Case adDBDate
        strMsg = "adDBDate"
   Case adDBTime
        strMsg = "adDBTime"
    Case adDBTimeStamp
        strMsg = "adDBTimeStamp"
    Case adDecimal
        strMsg = "adDecimal"
    Case adDouble
        strMsg = "adDouble"
    Case adEmpty
        strMsg = "adEmpty"
    Case adError
        strMsg = "adError"
    Case adFileTime
        strMsg = "adFileTime"
    Case adGUID
        strMsg = "adGUID"
    Case adIDispatch
        strMsg = "adIDispatch"
    Case adInteger
        strMsg = "adInteger"
    Case adIUnknown
        strMsg = "adIUnknown"
    Case adLongVarBinary
        strMsg = "adLongVarBinary"
    Case adLongVarChar
        strMsg = "adLongVarChar"
    Case adLongVarWChar
        strMsg = "adLongVarWChar"
    Case adNumeric
        strMsg = "adNumeric"
    Case adPropVariant
        strMsg = "adPropVariant"
    Case adSingle
        strMsg = "adSingle"
    Case adSmallInt
        strMsg = "adSmallInt"
    Case adTinyInt
        strMsg = "adTinyInt"
    Case adUnsignedBigInt
        strMsg = "adUnsignedBigInt"
    Case adUnsignedInt
        strMsg = "adUnsignedInt"
    Case adUnsignedSmallInt
        strMsg = "adUnsignedSmallInt"
    Case adUnsignedTinyInt
        strMsg = "adUnsignedTinyInt"
    Case adUserDefined
        strMsg = "adUserDefined"
    Case adVarBinary
        strMsg = "adVarBinary"
    Case adVarChar
        strMsg = "adVarChar"
    Case adVariant
        strMsg = "adVariant"
    Case adVarNumeric
        strMsg = "adVarNumeric"
    Case adVarWChar
        strMsg = "adVarWChar"
    Case adWChar
        strMsg = "adWChar"
    Case Else
        strMsg = "*UNKNOWN*"
End Select
Debug.Print "Property " & ix & ": " & prop.Name & _
                ", Type = " & strMsg
Next ix
End Sub


Beispiel für die Update- und CancelUpdate-Methoden (VB)

In diesem Beispiel wird die Verwendung der Update-Methode in Verbindung mit der CancelUpdate-Methode verdeutlicht.

Public Sub UpdateX()

    Dim rstEmployees As ADODB.Recordset
    Dim strOldFirst As String
    Dim strOldLast As String
    Dim strMessage As String

    ' Das Recordset mit Namen aus der Employees-Tabelle öffnen.
        strCnn = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=Pubs;User Id=sa;Password=; "
    Set rstEmployees = New ADODB.Recordset
    rstEmployees.CursorType = adOpenKeyset
    rstEmployees.LockType = adLockOptimistic
    rstEmployees.Open "SELECT fname, lname " & _
        "FROM Employees ORDER BY lname", strCnn, , , adCmdText

    ' Die ursprünglichen Daten speichern.
    strOldFirst = rstEmployees!fname
    strOldLast = rstEmployees!lname
    ' Die Daten im Bearbeitungspuffer ändern.
    rstEmployees!fname = "Linda"
    rstEmployees!lname = "Kobara"

    ' Den Pufferinhalt anzeigen und Benutzereingaben abrufen.
    strMessage = "Edit in progress:" & vbCr & _
        "  Original data = " & strOldFirst & " " & _
        strOldLast & vbCr & "  Data in buffer = " & _
        rstEmployees!fname & " " & rstEmployees!lname & vbCr & vbCr & _
        "Use Update to replace the original data with " & _
        "the buffered data in the Recordset?"

    If MsgBox(strMessage, vbYesNo) = vbYes Then
        rstEmployees.Update
    Else
        rstEmployees.CancelUpdate
    End If

    ' Die Ergebnisdaten anzeigen.
    MsgBox "Data in recordset = " & rstEmployees!fname & " " & _
        rstEmployees!lname

    ' Die ursprünglichen Daten wiederherstellen, da es sich um ein
    ' Beispiel handelt.
    If Not (strOldFirst = rstEmployees!fname And _
            strOldLast = rstEmployees!lname) Then
        rstEmployees!fname = strOldFirst
        rstEmployees!lname = strOldLast
        rstEmployees.Update
    End If

    rstEmployees.Close

End Sub

In diesem Beispiel wird die Verwendung der Update-Methode in Verbindung mit der AddNew-Methode verdeutlicht.

Public Sub UpdateX2()

    Dim cnn1 As ADODB.Connection
    Dim rstEmployees As ADODB.Recordset
    Dim strEmpID As String
    Dim strOldFirst As String
    Dim strOldLast As String
    Dim strMessage As String

    ' Eine Verbindung öffnen.
    Set cnn1 = New ADODB.Connection
        strCnn = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=Pubs;User Id=sa;Password=; "
    cnn1.Open strCnn

    ' Das Recordset mit Daten aus der Employees-Tabelle öffnen.
    Set rstEmployees = New ADODB.Recordset
    rstEmployees.CursorType = adOpenKeyset
    rstEmployees.LockType = adLockOptimistic
    rstEmployees.Open "employee", cnn1, , , adCmdTable

    rstEmployees.AddNew
    strEmpID = "B-S55555M"
    rstEmployees!emp_id = strEmpID
    rstEmployees!fname = "Bill"
    rstEmployees!lname = "Sornsin"

    ' Den Pufferinhalt anzeigen und Benutzereingaben abrufen.
    strMessage = "AddNew in progress:" & vbCr & _
        "Data in buffer = " & rstEmployees!emp_id & ", " & _
        rstEmployees!fname & " " & rstEmployees!lname & vbCr & vbCr & _
        "Use Update to save buffer to recordset?"

    If MsgBox(strMessage, vbYesNoCancel) = vbYes Then
        rstEmployees.Update
        ' Zum neuen Datensatz gehen und die Ergebnisdaten anzeigen.
        MsgBox "Data in recordset = " & rstEmployees!emp_id & ", " & _
             rstEmployees!fname & " " & rstEmployees!lname
    Else
        rstEmployees.CancelUpdate
        MsgBox "No new record added."
    End If

    ' Die neuen Daten löschen, da es sich um ein Beispiel handelt.
    cnn1.Execute "DELETE FROM employee WHERE emp_id = '" & strEmpID & "'"

    rstEmployees.Close

End Sub


Beispiel für die UpdateBatch- und CancelBatch-Methoden (VB)

In diesem Beispiel wird die Verwendung der UpdateBatch-Methode in Verbindung mit der CancelBatch-Methode verdeutlicht.

Public Sub UpdateBatchX()

    Dim rstTitles As ADODB.Recordset
    Dim strCnn As String
    Dim strTitle As String
    Dim strMessage As String

    ' Der Variablen eine Verbindungszeichenfolge zuweisen.
        strCnn = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=Pubs;User Id=sa;Password=; "

    Set rstTitles = New ADODB.Recordset
    rstTitles.CursorType = adOpenKeyset
    rstTitles.LockType = adLockBatchOptimistic
    rstTitles.Open "Titles", strCnn, , , adCmdTable

    rstTitles.MoveFirst

    ' Das Recordset durchlaufen und vom Benutzer abfragen, ob der Typ für
    ' ein angegebenes Buch geändert werden soll.
    Do Until rstTitles.EOF
        If Trim(rstTitles!Type) = "psychology" Then
            strTitle = rstTitles!Title
            strMessage = "Title: " & strTitle & vbCr & _
                "Change type to self help?"

            If MsgBox(strMessage, vbYesNo) = vbYes Then
                rstTitles!Type = "self_help"
            End If
        End If

        rstTitles.MoveNext
    Loop

    ' Vom Benutzer abfragen, ob für alle oben vorgenommenen Änderungen
    ' ein Commit ausgeführt werden soll.
    If MsgBox("Save all changes?", vbYesNo) = vbYes Then
        rstTitles.UpdateBatch
    Else
        rstTitles.CancelBatch
    End If

    ' Die aktuellen Daten im Recordset drucken.
    rstTitles.Requery
    rstTitles.MoveFirst
    Do While Not rstTitles.EOF
        Debug.Print rstTitles!Title & " - " & rstTitles!Type
        rstTitles.MoveNext
    Loop

    ' Die ursprünglichen Werte wiederherstellen, da es sich um ein
    ' Beispiel handelt.
    rstTitles.MoveFirst
    Do Until rstTitles.EOF
        If Trim(rstTitles!Type) = "self_help" Then
            rstTitles!Type = "psychology"
        End If
        rstTitles.MoveNext
    Loop
    rstTitles.UpdateBatch

    rstTitles.Close

End Sub


Beispiel für die Value-Eigenschaft (VB)

In diesem Beispiel wird die Value-Eigenschaft mit den Objekten Field und Property erläutert, indem Feld- und Eigenschaftswerte für die Employees-Tabelle angezeigt werden.

Public Sub ValueX()

    Dim rstEmployees As ADODB.Recordset
    Dim fldLoop As ADODB.Field
    Dim prpLoop As ADODB.Property
    Dim strCnn As String

    ' Das Recordset mit Daten aus der Employees-Tabelle öffnen.
    strCnn = "Provider=sqloledb;" & _
        "Data Source=srv;Initial Catalog=Pubs;User Id=sa;Password=; "
    Set rstEmployees = New ADODB.Recordset
    rstEmployees.Open "employee", strCnn, , , adCmdTable

    Debug.Print "Field values in rstEmployees"
    ' Die Fields-Auflistung der Employees-Tabelle
    ' aufzählen.
    For Each fldLoop In rstEmployees.Fields
        ' Da Value der Standardwert von Field-Objekten
        ' ist, ist die tatsächliche Verwendung des Schlüsselwortes
        ' hier optional.
        Debug.Print "    " & fldLoop.Name & " = " & fldLoop.Value
    Next fldLoop

    Debug.Print "Property values in rstEmployees"
    ' Die Properties-Auflistung des
    ' Recordset-Objekts aufzählen.
    For Each prpLoop In rstEmployees.Properties
        ' Da Value der Standardwert von Field-Objekten
        ' ist, ist die tatsächliche Verwendung des Schlüsselwortes
        ' hier optional.
        Debug.Print "    " & prpLoop.Name & " = " & prpLoop.Value
    Next prpLoop

    rstEmployees.Close

End Sub


Beispiel für die Version-Eigenschaft (VB)

In diesem Beispiel wird die Version-Eigenschaft eines Connection-Objekts zum Anzeigen der aktuellen ADO-Version verwendet. Darüber hinaus werden zahlreiche dynamische Eigenschaften verwendet, um Folgendes anzuzeigen:

  • den aktuellen DBMS-Namen sowie die Version

  • die OLE DB-Version

  • den Providernamen und die Version

  • die ODBC-Version

  • den Namen des ODBC-Treibers und die Version.
Public Sub VersionX()

    Dim cnn1 As ADODB.Connection

    ' Die Verbindung öffnen.
    Set cnn1 = New ADODB.Connection
    strCnn = "driver={SQL Server};server=srv;" & _
        "user id=sa;password=;database=Pubs;"
    cnn1.Open strCnn

    strVersionInfo = "ADO Version: " & cnn1.Version & vbCr & _
    "DBMS Name: " & cnn1.Properties("DBMS Name") & vbCr & _
    "DBMS Version: " & cnn1.Properties("DBMS Version") & vbCr & _
    "OLE DB Version: " & cnn1.Properties("OLE DB Version") & vbCr & _
    "Provider Name: " & cnn1.Properties("Provider Name") & vbCr & _
    "Provider Version: " & cnn1.Properties("Provider Version") & vbCr & _
    "Driver Name: " & cnn1.Properties("Driver Name") & vbCr & _
    "Driver Version: " & cnn1.Properties("Driver Version") & vbCr & _
    "Driver ODBC Version: " & cnn1.Properties("Driver ODBC Version")

    MsgBox strVersionInfo

    cnn1.Close

End Sub


ADO-Codebeispiele in Microsoft Visual Basic Scripting Edition

Verwenden Sie die folgenden Codebeispiele, um zu erfahren, wie Sie die Objekte, Methoden und Eigenschaften von ADO beim Schreiben mit Visual Basic Scripting Edition (VBScript) einsetzen können.

Anmerkung Fügen Sie das gesamte Codebeispiel von Anfang bis Ende in den Code-Editor ein. Wenn nur Teile der Beispiele verwendet werden oder die Absatzformatierung verloren geht, wird das Beispiel möglicherweise nicht ordnungsgemäß ausgeführt.

Objekte

  • Beispiel für das DataControl-Objekt

  • DataSpace-Objekt

  • DataFactory-Objekt

Methoden

  • Beispiel für die AddNew-Methode

  • Beispiel für die Cancel-Methode

  • Beispiel für die CancelUpdate-Methode

  • Beispiel für die Clone-Methode

  • Beispiel für die ConvertToString-Methode

  • Beispiel für die CreateObject-Methode und das DataSpace-Objekt

  • Beispiel für die CreateObject- und Query-Methoden, DataFactory-Objekt

  • Beispiel für die CreateRecordset-Methode

  • Beispiel für die Delete-Methode

  • Beispiel für die Execute-, Requery- und Clear-Methoden

  • Beispiel für die Move-Methode

  • Beispiel für die MoveFirst-, MoveLast-, MoveNext- und MovePrevious-Methoden

  • Beispiel für die Open- und Close-Methoden

  • Beispiel für die Query-Methode

  • Beispiel für die Refresh-Methode

  • Beispiel für die SubmitChanges-Methode

Eigenschaften

  • Beispiel für die Connect-Eigenschaft

  • Beispiel für die ExecuteOptions- und FetchOptions-Eigenschaften

  • Beispiel für die FilterColumn-, FilterCriterion-, FilterValue-, SortColumn- und SortDirection-Eigenschaften, Reset-Methode

  • Beispiel für die Recordset- und SourceRecordset-Eigenschaften

  • Beispiel für die ReadyState-Eigenschaft

  • Beispiel für die Server-Eigenschaft

  • Beispiel für die SQL-Eigenschaft

  • Beispiel für die URL-Eigenschaft


Beispiel für die AddNew-Methode (VBScript)

In diesem Beispiel wird die AddNew-Methode zum Erstellen eines neuen Datensatzes mit dem angegebenen Namen verwendet.

Verwenden Sie das nachstehende Beispiel in einer ASP (Active Server Page). Zum Ansehen des voll funktionsfähigen Beispiels müssen Sie über die Datenquelle AdvWorks.mdb (wird mit dem SDK installiert) verfügen, die sich unter C:\mssdk\samples\dataaccess\rds befindet. Es handelt sich hierbei um eine Microsoft Access-Datenbankdatei.

Verwenden Sie den Befehl Suchen, um die Datei Adovbs.inc zu suchen, und verschieben Sie sie in das zu verwendende Verzeichnis. Schneiden Sie den folgenden Code aus, fügen Sie ihn in Editor oder einem anderen Texteditor wieder ein, und speichern Sie ihn unter dem Dateinamen AddNew.asp. Das Ergebnis kann in jedem Clientbrowser angezeigt werden.

Um dieses Beispiel zu Übungszwecken auszuführen, fügen Sie einen neuen fiktiven Datensatz im HTML-Formular hinzu. Klicken Sie auf Add New. Informationen zum Entfernen nicht benötigter Datensätze finden Sie im Beispiel für die Delete-Methode.

<%@Language = VBScript %>
<!-- #Include file="ADOVBS.INC" -->
<HTML>
<HEAD>
<TITLE>ADO Open Method</TITLE>
<STYLE>
<!--
TH {
    background-color: #008080;
    font-family: 'Arial Narrow','Arial',sans-serif;
    font-size: xx-small;
    color: white;
    }
TD {
    text-align: center;
    background-color: #f7efde;
    font-family: 'Arial Narrow','Arial',sans-serif;
    font-size: xx-small;
     }
-->
</STYLE>
</HEAD>
<BODY>
<FONT FACE="MS SANS SERIF" SIZE=2>
<Center><H3>ADO AddNew Method</H3>
<!-- Connection-Objekt von ADO zum Erstellen des Recordsets verwenden -->
<%
src = "C:\mssdk\samples\dataaccess\rds\advworks.mdb"
sConnStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & src
' Connection-Objekt erstellen und öffnen
Set OBJdbConn = Server.CreateObject("ADODB.Connection")
OBJdbConn.Open  sConnStr
' Recordset-Objekt erstellen und öffnen
Set RsCustomerList = Server.CreateObject("ADODB.Recordset")
RsCustomerList.ActiveConnection = OBJdbConn
RsCustomerList.CursorType = adOpenKeyset
RsCustomerList.LockType = adLockOptimistic
RsCustomerList.Source = "Customers"
RsCustomerList.Open
%>
<!—
Wenn die Seite zum ersten Mal geöffnet ist, ist die Formularauflistung zu Beginn der Dateneingabe leer.
AddNew-Methode ausführen
-->
<% If Not IsEmpty(Request.Form) Then
    If Not Request.Form("CompanyName") = "" Then
        RsCustomerList.AddNew
        RsCustomerList("CompanyName") = Request.Form("CompanyName")
        RsCustomerList("ContactLastName") = Request.Form("LastName")
        RsCustomerList("ContactFirstName") = Request.Form("FirstName")
        RsCustomerList("PhoneNumber") = Request.Form("PhoneNumber")
        RsCustomerList("City") = Request.Form("City")
        RsCustomerList("StateOrProvince") = Request.Form("State")
        RsCustomerList.Update
        RsCustomerList.MoveFirst
    End If
End If
%>

<TABLE COLSPAN=8 CELLPADDING=5 BORDER=0>

<!-- BEGIN Spaltenheaderzeile für die Customers-Tabelle -->

<TR>
<TD>Company Name</TD>
<TD>Contact Name</TD>
<TD>Phone Number</TD>
<TD>City</TD>
<TD>State/Province</TD>
</TR>
<!-- ADO-Daten aus der Customers-Tabelle anzeigen, pro Durchlauf durch das Recordset eine Zeile -->
<% Do While Not RsCustomerList.EOF %>
<TR>
  <TD> <%= RSCustomerList("CompanyName")%> </TD>
  <TD> <%= RScustomerList("ContactLastName") & ", " %>
       <%= RScustomerList("ContactFirstName") %> </TD>
  <TD> <%= RScustomerList("PhoneNumber")%> </TD>
  <TD> <%= RScustomerList("City")%> </TD>
  <TD> <%= RScustomerList("StateOrProvince")%> </TD>
</TR>
<!-- Nächste Zeile = Datensatz. Schleife ausführen und eine Zeile zur HTML-Tabelle hinzufügen. -->
<%
  RScustomerList.MoveNext
Loop
%>
</TABLE>
<HR>
<!-- Das Formular zum Eingeben neuer Datensätze übermittelt die Variablen an diese Seite zurück -->
<Form Method=Post Action="AddNew.asp" Name=Form>
<TABLE>
<TR>
<TD>Company Name:</TD>
<TD><Input Type="Text" Size="50" Name="CompanyName" Value = ""></TD>
<TR>
<TD>Contact First Name:</TD>
<TD><Input Type="Text" Size="50" Name="FirstName" Value = ""></TD>
<TR>
<TD>Contact Last Name:</TD>
<TD><Input Type="Text" Size="50" Name="LastName" Value = ""></TD>
<TR>
<TD>Contact Phone:</TD>
<TD><Input Type="Text" Size="50" Name="PhoneNumber" Value = ""></TD>
<TR>
<TD>City:</TD>
<TD><Input Type="Text" Size="50" Name="City" Value = ""></TD>
<TR>
<TD>State / Province:</TD>
<TD><Input Type="Text" Size="5" Name="State" Value = ""></TD>
<TR>
<TD><Input Type="Submit" Value="Add New">
    <Input Type="Reset" Value="Reset Form">
</TABLE>
</Form>
<%' Speicherort der Datenquelle anzeigen
Response.Write(OBJdbConn)
%>
<Script Language = "VBScript">
Sub Form_OnSubmit
    MsgBox "Sending New Record to Server",,"ADO-ASP _Example"
End Sub
</Script>
</BODY>
</HTML>


Beispiel für die Cancel-Methode (VBScript)

Das folgende Beispiel zeigt, wie die Cancel-Methode zur Laufzeit im VBScript-Code gelesen wird.

<Script Language="VBScript">
<!--
Sub cmdCancelAsync
  ADC.Cancel
   ' Beendet den derzeit ausgeführten AsyncExecute-Prozess;
   ' die ReadyState-Eigenschaft wird auf adcReadyStateLoaded
   ' und Recordset wird auf Nothing festgelegt
End Sub
-->
</Script>


Beispiel für die CancelUpdate-Methode (VBScript)

Um dieses Beispiel zu testen, schneiden Sie den Code aus und fügen ihn zwischen den Tags <Body> und </Body> in einem herkömmlichen HTML-Dokument wieder ein, das Sie unter dem Dateinamen ADCapi6.asp speichern. ASP-Skript erkennt den verwendeten Server.

<Center>
<H2>RDS API Code Examples</H2>
<HR>
<H3>Remote Data Service SubmitChanges and CancelUpdate Methods</H3>

<!-- RDS.DataControl mit zur Entwurfszeit festgelegten Parametern -->
<OBJECT classid="clsid:BD96C556-65A3-11D0-983A-00C04FC29E33"
    ID=RDS HEIGHT=1 WIDTH=1>
    <PARAM NAME="SQL" VALUE="Select * from Employee">
    <PARAM NAME="SERVER" VALUE="http://<%=Request.ServerVariables("SERVER_NAME")%>">
    <PARAM NAME="CONNECT" VALUE="Provider=SQLOLEDB;User Id=rdsdemo;Password=rdsdemo;Initial Catalog=AddrBookDB">
</OBJECT>

<TABLE DATASRC="#ADC">
<THEAD>
<TR ID="ColHeaders">
    <TH>ID</TH>
    <TH>FName</TH>
    <TH>LName</TH>
    <TH>Name</TH>
    <TH>Title</TH>
    <TH>Type</TH>
    <TH>Email</TH>
    <TH>MgrEmail</TH>
    <TH>Bldg</TH>
    <TH>Rm</TH>
    <TH>Phone</TH>
</TR>
</THEAD>

<TBODY>
<TR>
    <TD> <INPUT DATAFLD="ID" size=4> </TD>
    <TD> <INPUT DATAFLD="FirstName" size=10> </TD>
    <TD> <INPUT DATAFLD="LastName" size=10> </TD>
    <TD> <INPUT DATAFLD="Name" size=15> </TD>
    <TD> <INPUT DATAFLD="Title" size=20> </TD>
    <TD> <INPUT DATAFLD="Type" size=10> </TD>
    <TD> <INPUT DATAFLD="Email" size=10> </TD>
    <TD> <INPUT DATAFLD="ManagerEmail" size=10> </TD>
    <TD> <INPUT DATAFLD="Building" size=3> </TD>
    <TD> <INPUT DATAFLD="Room" size=5> </TD>
    <TD> <INPUT DATAFLD="Phone" size=8> </TD>
</TR>
</TBODY>
</TABLE>

<HR>
<INPUT TYPE=BUTTON NAME="SubmitChange" VALUE="Submit Changes"><INPUT TYPE=BUTTON NAME="CancelChange" VALUE="Cancel Update"><BR>
<H4>Add a new person or alter a current entry on the grid. Move off that Row. <BR>
Submit the Changes to your DBMS or cancel the updates. </H4>
</Center>
<Script Language="VBScript">
<!--
' Parameter von RDS.DataControl zur Laufzeit festlegen
Sub SubmitChange_OnClick
    RDS.SubmitChanges
    RDS.Refresh
End Sub

Sub CancelUpdate_OnClick
    RDS.CancelUpdate
End Sub
-->
</Script>


Beispiel für die Clone-Methode (VBScript)

In diesem Beispiel wird die Clone-Methode zum Erstellen von Kopien eines Recordset-Objekts verwendet. Anschließend kann der Datensatzzeiger unabhängig auf jede einzelne Kopie gesetzt werden.

Verwenden Sie das nachstehende Beispiel in einer ASP (Active Server Page). Um sich dieses voll funktionsfähige Beispiel ansehen zu können, müssen Sie einen System-DSN (Data Source Name) mit der Bezeichnung AdvWorks erstellen, wobei Sie die mit IIS installierte Datenquelle AdvWorks.mdb verwenden, die sich unter C:\InetPub\ASPSamp\AdvWorks befindet. Es handelt sich hierbei um eine Microsoft Access-Datenbankdatei. Verwenden Sie den Befehl Suchen, um die Datei Adovbs.inc zu suchen, und verschieben Sie sie in das zu verwendende Verzeichnis. Schneiden Sie den folgenden Code aus, fügen Sie ihn in Editor oder einem anderen Texteditor wieder ein, und speichern Sie ihn unter dem Dateinamen Clone.asp. Das Ergebnis kann in jedem Clientbrowser angezeigt werden.

Um dieses Beispiel zu Übungszwecken auszuführen, ändern Sie die Zeile RsCustomerList.Source = "Customers" in RsCustomerList.Source = "Products". Auf diese Weise können Sie eine umfangreichere Tabelle berechnen.

<!-- #Include file="ADOVBS.INC" -->
<% Language = VBScript %>
<HTML>
<HEAD>
<TITLE>ADO Clone Method</TITLE>
</HEAD>
<BODY>
<H3>ADO Clone Method</H3>
<!-- Connection-Objekt von ADO zum Erstellen des Recordsets verwenden -->
<%
src = "C:\mssdk\samples\dataaccess\rds\advworks.mdb"
sConnStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & src

' Connection-Objekt erstellen und öffnen
Set OBJdbConn = Server.CreateObject("ADODB.Connection")
OBJdbConn.Open  sConnStr
' Recordset-Objekt erstellen und öffnen
Set RsCustomerList = Server.CreateObject("ADODB.Recordset")
RsCustomerList.ActiveConnection = OBJdbConn
RsCustomerList.CursorType = adOpenKeyset
RsCustomerList.LockType = adLockOptimistic
RsCustomerList.Source = "Customers"
RsCustomerList.Open
%>

<!-- Schleife durch die Customers-Tabelle, bei jedem Durchlauf 1 zur Counter-Variablen addieren -->
<%
    Set MyRecordset = RSCustomerList.Clone
    Counter = 0
    Do Until MyRecordset.EOF
        Counter = Counter + 1
        MyRecordset.MoveNext
    Loop
%>
<!-- Ergebnisse anzeigen -->
<H3>There Are <%=Counter %> Records in the Customers Table</H3>
<BR><HR>
<H4>Location of DSN Datbase</H4>
<%' Speicherort der DSN-Datenquelle anzeigen
Response.Write(OBJdbConn)
%>
</BODY>
</HTML>


Beispiel für die Connect-Eigenschaft (VBScript)

Dieser Code zeigt, wie die Connect-Eigenschaft zur Entwurfszeit gesetzt wird:

<OBJECT CLASSID="clsid:BD96C556-65A3-11D0-983A-00C04FC29E33" ID="ADC1">
.
    <PARAM NAME="SQL" VALUE="Select * from Sales">
    <PARAM NAME="CONNECT" VALUE="Provider=SQLOLEDB;User Id=sa;Password=;Initial Catalog=Pubs">
    <PARAM NAME="Server" VALUE="http://MyWebServer">
.
</OBJECT>

Im folgenden Beispiel wird gezeigt, wie die Connect-Eigenschaft zur Laufzeit in VBScript-Code gesetzt wird.

Um dieses Beispiel zu testen, schneiden Sie den Code aus und fügen ihn zwischen den Tags <Body> und </Body> in einem herkömmlichen HTML-Dokument wieder ein, das Sie unter dem Dateinamen Adcapi6.asp speichern. ASP-Skript erkennt den verwendeten Server.

<H2>RDS API Code Examples </H2>
<HR>
<H3>Set Connect Property at Run Time</H3>
<!-- RDS.DataControl ohne zur Entwurfszeit festgelegte Parameter -->
<OBJECT classid="clsid:BD96C556-65A3-11D0-983A-00C04FC29E33"
    ID=RDS HEIGHT=1 WIDTH=1>
</OBJECT>

<TABLE DATASRC=#RDS>
<TBODY>
  <TR>
    <TD><SPAN DATAFLD="FirstName"></SPAN></TD>
    <TD><SPAN DATAFLD="LastName"></SPAN></TD>
  </TR>
</TBODY>
</TABLE>

SERVER: <Input Size=70 Name="txtServer" Value="http://<%=Request.ServerVariables("SERVER_NAME")%>"><BR>
CONNECT: <Input Size=70 Name="txtConnect"><BR>
SQL: <Input Size=70 Name="txtSQL" Value="Select * from Employee">
<BR>
<INPUT TYPE=BUTTON NAME="Run" VALUE="Run">
<BR>
To Fill Grid enter Connect String in middle text box, try<BR>
<B>Provider=SQLOLEDB;User Id=rdsdemo;Password=rdsdemo;Initial Catalog=AddrBookDB</B>

<Script Language="VBScript">
<!--
' Parameter von RDS.DataControl zur Laufzeit festlegen
Sub Run_OnClick
    RDS.Server = txtServer.Value
    RDS.SQL = txtSQL.Value
    RDS.Connect = txtConnect.Value
    RDS.Refresh
End Sub
-->
</Script>


Beispiel für die ConvertToString-Methode (VBScript)

Das nachstehende Beispiel verdeutlicht, wie ein Recordset-Objekt mithilfe der RDSServer.DataFactory ConvertToString-Methode in eine MIME-kodierte Zeichenfolge konvertiert wird. Anschließend wird gezeigt, wie die Zeichenfolge zurück in ein Recordset-Objekt konvertiert wird.

<HTML>
<HEAD><TITLE>ConverToString Example</TITLE><HEAD>
<BODY>

<SCRIPT LANGUAGE=VBSCRIPT>
Sub ConvertToStringX()
    Dim objRs, objDF, strServer, vString
    Const adcExecSync = 1
    Const adcFetchUpFront = 1

    ' Ersetzen Sie den Wert unten zur Verwendung ohne ASP durch Ihren
    ' Servernamen.
    strServer = "http://<%=Request.ServerVariables("SERVER_NAME")%>"

    Set objDF = RDS1.CreateObject("RDSServer.DataFactory", strServer)
    Set objRs = objDF.Query(txtConnect.Value,txtQueryRecordset.Value)

    ' Recordset in MIME-codierte Zeichenfolge konvertieren
    vString = objDF.ConvertToString(objRs)

    ' MIME-Zeichenfolge für Demonstrationszwecke anzeigen
    txtRS.value = vString

    ' MIME-Zeichenfolge mithilfe von RDS.DataControl in
    ' verwendbares ADO-Recordset konvertieren
    RDC1.SQL = vString

    RDC1.ExecuteOptions = adcExecSync
    RDC1.FetchOptions = adcFetchUpFront
    RDC1.Refresh

    MsgBox "RecordCount = " & RDC1.Recordset.RecordCount
End Sub
</SCRIPT>

Connect String:
 <INPUT TYPE=Text NAME=txtConnect SIZE=50
    VALUE="Provider=sqloledb;Initial Catalog=pubs;User Id=sa;Password=;">
 <BR>

Query:
 <INPUT TYPE=Text NAME=txtQueryRecordset SIZE=50
    VALUE="select * from jobs">
 <BR>

 <INPUT TYPE=Button VALUE="ConvertToString" OnClick="ConvertToStringX()">
 <BR>

MIME Encoded RS: <BR>
 <TEXTAREA NAME=txtRS ROWS=15 COLS=50 WRAP=virtual></TEXTAREA>

<!-- RDS.DataSpace  ID RDS1 -->
 <OBJECT ID="RDS1" WIDTH=1 HEIGHT=1
     CLASSID="CLSID:BD96C556-65A3-11D0-983A-00C04FC29E36">
 </OBJECT>

<!-- RDS.DataControl ID RDC1 -->
 <OBJECT ID="RDC1" WIDTH=1 HEIGHT=1
     CLASSID="clsid:BD96C556-65A3-11D0-983A-00C04FC29E33">
 </OBJECT>
</BODY>
</HTML>


Beispiel für die CreateRecordset-Methode (VBScript)

Mit diesem Codebeispiel wird ein serverseitiges Recordset-Objekt erstellt. Es verfügt über zwei Spalten mit jeweils vier Zeilen.

Sub CreateARecordSet
    Dim ColInfo(1), c0(3), c1(3)

    c0(0) = "Name"            ' Spaltenname.
    c0(1) = CInt(129)        ' Spaltentyp (129 = adChar).
    c0(2) = CInt(40)        ' Spaltengröße.
    c0(3) = False            ' NULL-Zulässigkeit der Spalte

    c1(0) = "Age"            ' Spaltenname.
    c1(1) = CInt(3)        ' Spaltentyp (3 = adInteger).
    c1(2) = CInt(-1)        ' Spaltengröße.
    c1(3) = True            ' NULL-Zulässigkeit der Spalte

    ' Die Spalten zur Recordset-Definition hinzufügen.
    ColInfo(0) = c0
    ColInfo(1) = c1

    ADC1.SourceRecordset = ADF1.CreateRecordset(ColInfo)
End Sub


Beispiel für das DataControl-Objekt (VBScript)

Der folgende Code zeigt, wie die RDS.DataControl-Parameter zur Entwurfszeit festgelegt und an ein datenbezogenes Steuerelement gebunden werden. Schneiden Sie diesen Code aus, fügen Sie ihn zwischen den Tags <Body> sowie </Body> in ein herkömmliches HTML-Dokument ein, das Sie unter dem Dateinamen ADCapi1.asp speichern. ASP-Skript erkennt den verwendeten Server.

<H2>RDS API Code Examples</H2>
<HR>
<H3>Remote Data Service</H3>
<TABLE DATASRC=#RDS>
<TBODY>
    <TR>
        <TD><SPAN DATAFLD="FirstName"></SPAN></TD>
        <TD><SPAN DATAFLD="LastName"></SPAN></TD>
    </TR>
</TBODY>
</TABLE>
<!-- Remote Data Services mit zur Entwurfszeit festgelegten Parametern -->

<OBJECT classid="clsid:BD96C556-65A3-11D0-983A-00C04FC29E33"
    ID=RDS>
    <PARAM NAME="SQL" VALUE="Select * from Employee for browse">
    <PARAM NAME="SERVER" VALUE="http://<%=Request.ServerVariables("SERVER_NAME")%>">
    <PARAM NAME="CONNECT" VALUE="Provider=SQLOLEDB;User Id=rdsdemo;Password=rdsdemo;Initial Catalog=AddrBookDB">
</OBJECT>

Im folgenden Beispiel wird gezeigt, wie die erforderlichen Parameter von RDS.DataControl zur Laufzeit gesetzt werden. Schneiden Sie zum Testen dieses Beispiels den Code aus, und fügen Sie ihn zwischen den Tags <Body> und </Body> eines herkömmlichen HTML-Dokuments ein, das Sie unter dem Dateinamen ADCapi2.asp speichern. ASP-Skript erkennt den verwendeten Server.

<H2>RDS API Code Examples</H2>
<HR>
<H3>Remote Data Service Run Time</H3>

<TABLE DATASRC=#RDS>
<TBODY>
  <TR>
    <TD><SPAN DATAFLD="FirstName"></SPAN></TD>
    <TD><SPAN DATAFLD="LastName"></SPAN></TD>
  </TR>
</TBODY>
</TABLE>

<!-- RDS.DataControl ohne zur Entwurfszeit festgelegte Parameter -->
<OBJECT classid="clsid:BD96C556-65A3-11D0-983A-00C04FC29E33"
    ID=RDS HEIGHT=1 WIDTH=1>
</OBJECT>
<HR>
<Input Size=70 Name="txtServer" Value="http://<%=Request.ServerVariables("SERVER_NAME")%>"><BR>
<Input Size=70 Name="txtConnect" Value="Provider=SQLOLEDB;User Id=rdsdemo;Password=rdsdemo;Initial Catalog=AddrBookDB">
<BR>
<Input Size=70 Name="txtSQL" Value="Select * from Employee">
<HR>
<INPUT TYPE=BUTTON NAME="Run" VALUE="Run"><BR>
<H4>Fill Grid with these values or change them to see data from another ODBC data source on your server</H4>

<Script Language="VBScript">
<!--
' Parameter von RDS.DataControl zur Laufzeit festlegen
Sub Run_OnClick
    RDS.Server = txtServer.Value
    RDS.SQL = txtSQL.Value
    RDS.Connect = txtConnect.Value
    RDS.Refresh
End Sub
-->
</Script>


Beispiel für das DataSpace-Objekt und die CreateObject-Methode (VBScript)

Das folgende Beispiel zeigt die Verwendung der CreateObject-Methode des RDS.DataSpace-Objekts mit dem Standard-Geschäftsobjekt RDSServer.DataFactory. Schneiden Sie zum Testen dieses Beispiels den Code aus, und fügen Sie ihn zwischen den Tags <Body> und </Body> eines herkömmlichen HTML-Dokuments ein, das Sie unter dem Dateinamen ADCapi8.asp speichern. ASP-Skript erkennt den verwendeten Server.

<H2>RDS API Code Examples</H2>
<HR>
<H3>Using Query Method of RDSServer.DataFactory</H3>

<!-- RDS.DataSpace  ID RDS1-->
<OBJECT ID="RDS1" WIDTH=1 HEIGHT=1
CLASSID="CLSID:BD96C556-65A3-11D0-983A-00C04FC29E36">
</OBJECT>

<!-- RDS.DataControl mit zur Laufzeit festgelegten Parametern -->
<OBJECT classid="clsid:BD96C556-65A3-11D0-983A-00C04FC29E33"
    ID=RDS WIDTH=1 HEIGHT=1>
</OBJECT>

<TABLE DATASRC=#RDS>
<TBODY>
  <TR>
    <TD><SPAN DATAFLD="FirstName"></SPAN></TD>
    <TD><SPAN DATAFLD="LastName"></SPAN></TD>
  </TR>
</TBODY>
</TABLE>

<HR>
<INPUT TYPE=BUTTON NAME="Run" VALUE="Run">

<H4>Click Run. The CreateObject Method of the RDS.DataSpace Object Creates an instance of the RDSServer.DataFactory.
The Query Method of the RDSServer.DataFactory is used to bring back a Recordset.</H4>

<Script Language="VBScript">
<!--
Dim DF
Dim strServer
Dim strConnect
Dim strSQL
strServer = "http://<%=Request.ServerVariables("SERVER_NAME")%>"
strConnect = "Provider=SQLOLEDB;User Id=rdsdemo;Password=rdsdemo;" & _
                  "Initial Catalog=AddrBookDB;Data Source=MyServer;"
strSQL = "Select * from Employee"

Sub Run_OnClick()
    Dim objADORs      'Recordset-Objekt erstellen
    Set DF = RDS1.CreateObject("RDSServer.DataFactory", strServer)      'Recordset abrufen
    Set objADORs = DF.Query(strConnect, strSQL)
    ' RDS.DataControl zum Binden des Recordsets an ein datengebundenes
    ' Grid-Steuerelement verwenden

    RDS.SourceRecordset = objADORs

End Sub
-->
</Script>

Das folgende Beispiel zeigt die Verwendung der CreateObject-Methode zum Erstellen einer Instanz des benutzerdefinierten Geschäftsobjekts VbBusObj.VbBusObjCls. Weiterhin wird die Skripterstellung mit Active Server Pages zum Angeben des Webservernamens verwendet. Um das vollständige Beispiel anzuzeigen, wählen Sie im Beispielanwendungsselektor in der Spalte Client Tier "VBScript in Internet Explorer" und in der Spalte Middle Tier "Custom Visual Basic Business Object" aus.

Sub Window_OnLoad()
    strServer = "http://<%=Request.ServerVariables("SERVER_NAME")%>"
    Set BO = ADS1.CreateObject("VbBusObj.VbBusObjCls", strServer)
    txtConnect.Value = "dsn=Pubs;uid=sa;pwd=;"
    txtGetRecordset.Value = "Select * From authors for Browse"
End Sub


Beispiel für das DataFactory-Objekt, die Query- und CreateObject-Methoden (VBScript)

Das folgende Beispiel erstellt unter Verwendung der CreateObject-Methode des RDS.DataSpace-Objekts ein RDSServer.DataFactory-Objekt. Schneiden Sie zum Testen dieses Beispiels den Code aus, und fügen Sie ihn zwischen den Tags <Body> und </Body> eines herkömmlichen HTML-Dokuments ein, das Sie unter dem Dateinamen ADCapi7.asp speichern. ASP-Skript erkennt den verwendeten Server.

<H2>RDS API Code Examples</H2>
<HR>
<H3>Using Query Method of RDSServer.DataFactory</H3>

<!-- RDS.DataSpace  ID RDS1-->
<OBJECT ID="RDS1" WIDTH=1 HEIGHT=1
CLASSID="CLSID:BD96C556-65A3-11D0-983A-00C04FC29E36">
</OBJECT>

<!-- RDS.DataControl mit zur Laufzeit festgelegten Parametern -->
<OBJECT classid="clsid:BD96C556-65A3-11D0-983A-00C04FC29E33"
    ID=RDS WIDTH=1 HEIGHT=1>
</OBJECT>

<TABLE DATASRC=#RDS>
<TBODY>
  <TR>
    <TD><SPAN DATAFLD="FirstName"></SPAN></TD>
    <TD><SPAN DATAFLD="LastName"></SPAN></TD>
  </TR>
</TBODY>
</TABLE>

<HR>
<INPUT TYPE=BUTTON NAME="Run" VALUE="Run">
<BR>
<H4>Click Run. The CreateObject Method of the
RDS.DataSpace Object Creates an instance of the
RDSServer.DataFactory.
The Query Method of the RDSServer.DataFactory is used
to bring back a Recordset. </H4>

<Script Language="VBScript">
<!--
Dim DF
Dim strServer
Dim strConnect
Dim strSQL

strServer = "http://<%=Request.ServerVariables("SERVER_NAME")%>"
strConnect = "Provider=SQLOLEDB;User Id=rdsdemo;Password=rdsdemo;Initial Catalog=AddrBookDB"
strSQL = "Select * from Employee"

Sub Run_OnClick()
' RDSServer.DataFactory-Objekt erstellen
    Dim objADORs
' Recordset abrufen
    Set DF = RDS1.CreateObject("RDSServer.DataFactory", strServer)
    Set objADORs = DF.Query(strConnect, strSQL)
' Parameter von RDS.DataControl zur Laufzeit festlegen
    RDS.Server = strServer
    RDS.SQL = strSQL
    RDS.Connect = strConnect
    RDS.Refresh
End Sub
-->
</Script>


Beispiel für die Delete-Methode (VBScript)

In diesem Beispiel wird die Delete-Methode zum Entfernen eines angegebenen Datensatzes aus einem Recordset-Objekt verwendet.

Verwenden Sie das nachstehende Beispiel in einer ASP (Active Server Page). Zum Ansehen des voll funktionsfähigen Beispiels müssen Sie über die Datenquelle AdvWorks.mdb (wird mit dem SDK installiert) verfügen, die sich unter C:\mssdk\samples\dataaccess\rds befindet. Es handelt sich hierbei um eine Microsoft Access-Datenbankdatei.

Verwenden Sie den Befehl Suchen, um die Datei Adovbs.inc zu suchen, und verschieben Sie sie in das zu verwendende Verzeichnis. Schneiden Sie den folgenden Code aus, fügen Sie ihn in Editor oder einem anderen Texteditor wieder ein, und speichern Sie ihn unter dem Dateinamen AddNew.asp. Das Ergebnis kann in jedem Clientbrowser angezeigt werden.

Um dieses Beispiel zu Übungszwecken auszuführen, fügen Sie mit dem AddNew-Beispiel zunächst einige Datensätze hinzu. Löschen Sie diese anschließend wieder. Das Ergebnis kann in jedem Clientbrowser angezeigt werden.

<%@ Language=VBScript %>
<!-- #Include file="ADOVBS.INC" -->
<HTML>
<HEAD>
<TITLE>ADO Delete Method</TITLE>
</HEAD>
<STYLE>
<!--
TH {
    background-color: #008080;
    font-family: 'Arial Narrow','Arial',sans-serif;
    font-size: xx-small;
    color: white;
    }
TD {
    text-align: center;
    background-color: #f7efde;
    font-family: 'Arial Narrow','Arial',sans-serif;
    font-size: xx-small;
     }
-->
</STYLE>

<BODY>
<H3>ADO Delete Method</H3>

<!--- Connection-Objekt von ADO zum Erstellen des Recordsets verwenden-->
<%
src = "C:\mssdk\samples\dataaccess\rds\advworks.mdb"
sConnStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & src

' Connection-Objekt erstellen und öffnen
Set OBJdbConn = Server.CreateObject("ADODB.Connection")
OBJdbConn.Open  sConnStr
' Recordset-Objekt erstellen und öffnen
Set RsCustomerList = Server.CreateObject("ADODB.Recordset")
RsCustomerList.ActiveConnection = OBJdbConn
RsCustomerList.CursorType = adOpenKeyset
RsCustomerList.LockType = adLockOptimistic
RsCustomerList.Source = "Customers"
RsCustomerList.Open
%>
<!-- Zum angegebenen Datensatz bewegen und diesen löschen -->
<%
If Not IsEmpty(Request.Form("WhichRecord")) Then
    ' Den zu verschiebenden Wert von der Post-Methode von Form abrufen
    Moves = Request.Form("WhichRecord")

    RsCustomerList.Move CInt(Moves)
    If Not RsCustomerList.EOF or RsCustomerList.BOF Then
        RsCustomerList.Delete 1
        RsCustomerList.MoveFirst
    Else
        Response.Write "Not a Valid Record Number"
        RsCustomerList.MoveFirst
    End If
End If

%>
<!-- BEGIN Spaltenheaderzeile für die Customers-Tabelle -->

<TABLE COLSPAN=8 CELLPADDING=5 BORDER=0>
<TR>
    <TH>Rec. #</TH>
    <TH>Company Name</TH>
    <TH>Contact Name</TH>
    <TH>Phone Number</TH>
    <TH>City</TH>
    <TH>State/Province</TH>
</TR>

<!-- ADO-Daten aus der Customers-Tabelle anzeigen. Schleife durch das Recordset, pro Durchlauf eine Zeile zur HTML-Tabelle hinzufügen.-->
<%
iCount = 0
Do While Not RsCustomerList.EOF %>
<TR>
  <TD> <%= CStr(iCount) %>
  <TD> <%= RSCustomerList("CompanyName")%> </TD>
  <TD> <%= RScustomerList("ContactLastName") & ", " %>
       <%= RScustomerList("ContactFirstName") %>
  </TD>
  <TD> <%= RScustomerList("PhoneNumber")%> </TD>
  <TD> <%= RScustomerList("City")%> </TD>
  <TD> <%= RScustomerList("StateOrProvince")%> </TD>
</TR>
<!- Nächste Zeile = Datensatz. Schleife ausführen und Daten zur HTML-Tabelle hinzufügen -->
<%
  iCount = iCount + 1
  RScustomerList.MoveNext
Loop
%>
</TABLE>
<!-- Clientseitige Gültigkeitsprüfung der Eingabedaten ausführen. Zum benannten Datensatz bewegen und diesen löschen. -->

<Center>
<H4>Clicking Button Will Remove Designated Record</H4>
<H5>There are <%=RsCustomerList.RecordCount%> Records in this Set</H5>
<Form Method=Post Action="Delete.asp" Name=Form>
<Input Type=Text Name="WhichRecord" Size=3>
</Form>
<Input Type=Button Name=cmdDelete Value="Delete Record">

</BODY>

<Script Language = "VBScript">
Sub cmdDelete_OnClick
    If IsNumeric(Document.Form.WhichRecord.Value) Then
        Document.Form.WhichRecord.Value = CInt(Document.Form.WhichRecord.Value)
        Dim Response
        Response = MsgBox("Are You Sure About Deleting This Record?", vbYesNo,  "ADO-ASP Example")

        If Response = vbYes Then
            Document.Form.Submit
        End If
    Else
        MsgBox "You Must Enter a Valid Record Number",,"ADO-ASP Example"
    End If
End Sub
</Script>
</HTML>


Beispiel für die Execute-, Requery- und Clear-Methoden (VBScript)

In diesem Beispiel wird die Verwendung der Execute-Methode dargelegt, wenn sie von einem Command- sowie einem Connection-Objekt ausgeführt wird. Weiterhin wird die Requery-Methode zum Abrufen aktueller Daten in einem Recordset-Objekt verwendet, und mit der Clear-Methode wird der Inhalt der Errors-Auflistung gelöscht. Damit diese Prozedur ausgeführt werden kann, werden die Prozeduren ExecuteCommand und PrintOutput benötigt.

Verwenden Sie das nachstehende Beispiel in einer ASP (Active Server Page). Zum Ansehen des voll funktionsfähigen Beispiels müssen Sie über die Datenquelle AdvWorks.mdb (wird mit dem SDK installiert) verfügen, die sich unter C:\mssdk\samples\dataaccess\rds befindet. Es handelt sich hierbei um eine Microsoft Access-Datenbankdatei.

Verwenden Sie den Befehl Suchen, um die Datei Adovbs.inc zu suchen, und verschieben Sie sie in das zu verwendende Verzeichnis. Schneiden Sie den folgenden Code aus, fügen Sie ihn in Editor oder einem anderen Texteditor wieder ein, und speichern Sie ihn unter dem Dateinamen Execute.asp. Das Ergebnis kann in jedem Clientbrowser angezeigt werden.

<%@ Language=VBScript %>
<!-- #Include file="ADOVBS.INC" -->
<HTML>
<HEAD>
<TITLE>ADO Execute Method</TITLE>
<STYLE>
<!--
BODY {
    font-family: "MS SANS SERIF",sans-serif;
     }
.thead1 {
    background-color: #008080;
    font-family: 'Arial Narrow','Arial',sans-serif;
    font-size: x-small;
    color: white;
    }
.thead2 {
    background-color: #800000;
    font-family: 'Arial Narrow','Arial',sans-serif;
    font-size: x-small;
    color: white;
    }
.tbody {
    text-align: center;
    background-color: #f7efde;
    font-family: 'Arial Narrow','Arial',sans-serif;
    font-size: x-small;
     }
-->
</STYLE>
</HEAD>

<BODY>
<H3>ADO Execute Method</H3>
<HR>
<H4>Recordset Retrieved Using Connection Object</H4>
<!--- Recordsets mithilfe der Execute-Methode des Connection-Objekts und des Command-Objekts abrufen -->
<%
sDsrc="C:\mssdk\samples\dataaccess\rds\advworks.mdb"
sConnStr="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & sDsrc

Set OBJdbConnection = Server.CreateObject("ADODB.Connection")
OBJdbConnection.Open sConnStr
SQLQuery = "SELECT * FROM Customers"
' Das erste Recordset, RSCustomerList, verwendet die Execute-Methode des
' Connection-Objekts
Set RSCustomerList = OBJdbConnection.Execute(SQLQuery)

Set OBJdbCommand = Server.CreateObject("ADODB.Command")
OBJdbCommand.ActiveConnection = OBJdbConnection
SQLQuery2 = "SELECT * From Products"
OBJdbCommand.CommandText = SQLQuery2
' Das zweite Recordset, RSProductList, verwendet die Execute-Methode des
' Command-Objekts
Set RSProductList = OBJdbCommand.Execute
%>
<TABLE COLSPAN=8 CELLPADDING=5 BORDER=0 ALIGN=CENTER>
<!-- BEGIN Spaltenheaderzeile für Customers-Tabelle -->
<TR CLASS=thead1>
  <TH>Company Name</TH>
  <TH>Contact Name</TH>
  <TH>E-mail address</TH>
  <TH>City</TH>
  <TH>State/Province</TH>
</TR>

<!-- ADO-Daten aus der Customers-Tabelle anzeigen -->
<%
Do While Not RScustomerList.EOF %>
  <TR CLASS=tbody>
  <TD>
  <%= RSCustomerList("CompanyName")%>
  </TD>
  <TD>
  <%= RScustomerList("ContactLastName") & ", " %>
  <%= RScustomerList("ContactFirstName") %>
  </TD>
  <TD>
  <%= RScustomerList("ContactLastName")%>
  </TD>
  <TD>
  <%= RScustomerList("City")%>
  </TD>
  <TD>
  <%= RScustomerList("StateOrProvince")%>
  </TD>
  </TR>
  <!-- Nächste Zeile = Datensatz. Schleife ausführen und Daten zur HTML-Tabelle hinzufügen.-->
  <%
  RScustomerList.MoveNext
Loop
RScustomerList.Close
%>
</TABLE>

<HR>
<H4>Recordset Retrieved Using Command Object</H4>

<TABLE CELLPADDING=5 BORDER=0 ALIGN=CENTER WIDTH="80%">

<!-- BEGIN Spaltenheaderzeile für Produktlistentabelle -->
<TR CLASS=thead2>
  <TH>Product Type</TH>
  <TH>Product Name</TH>
  <TH>Product Description</TH>
  <TH>Unit Price</TH>
</TR>

<!-- ADO-Daten für die Produktliste anzeigen -->
<% Do While Not RsProductList.EOF %>
  <TR CLASS=tbody>
  <TD>
  <%= RsProductList("ProductType")%>
  </TD>
  <TD>
  <%= RsProductList("ProductName")%>
  </TD>
  <TD>
   <%= RsProductList("ProductDescription")%>
  </TD>
  <TD>
  <%= RsProductList("UnitPrice")%>
  </TD>
  <!-- Nächste Zeile = Datensatz -->
<%
  RsProductList.MoveNext
Loop
' Objekte aus dem Speicher entfernen, um Ressourcen freizugeben
RsProductList.Close
OBJdbConnection.Close
Set ObJdbCommand = Nothing
Set RsProductList = Nothing
Set OBJdbConnection = Nothing
%>
</TABLE>
</BODY>
</HTML>


Beispiel für die ExecuteOptions- und FetchOptions-Eigenschaften (VBScript)

Im folgenden Code wird gezeigt, wie die Eigenschaften ExecuteOptions und FetchOptions zur Entwurfszeit gesetzt werden. Werden sie nicht gesetzt, ist ExecuteOptions standardmäßig auf adcExecSync gesetzt. Dies bedeutet, dass die ADC.Refresh-Methode nach dem Aufruf auf dem aktuellen, aufrufenden Thread, d. h. synchron, ausgeführt wird.

<OBJECT CLASSID="clsid:BD96C556-65A3-11D0-983A-00C04FC29E33" ID="ADC1">
.
<PARAM NAME="SQL" VALUE="Select * from Sales">
<PARAM NAME="Connect" VALUE="DSN=Pubs;UID=sa;PWD=;">
<PARAM NAME="Server" VALUE="http://MyWebServer">
<PARAM NAME="ExecuteOptions" VALUE="1">
<PARAM NAME="FetchOptions" VALUE="3">
.
</OBJECT>

Im folgenden Beispiel wird gezeigt, wie die Eigenschaften ExecuteOptions und FetchOptions zur Laufzeit in VBScript-Code gesetzt werden. Ein ausführbares Beispiel für diese Eigenschaften finden Sie unter Refresh-Methode.

<Script Language="VBScript">
<!--
Const adcExecSync = 1
Const adcFetchAsynch = 3

Sub ExecuteHow
  ' Nächste Aktualisierung des Recordsets ansynchron zum aufrufenden
  ' Thread ausführen.
  RDS1.ExecuteOptions = adcExecSync
  RDS1.FetchOptions = adcFetchAsynch
  RDS.Refresh
End Sub
-->
</Script>


Beispiel für die FilterColumn-, FilterCriterion-, FilterValue-, SortColumn- und SortDirection-Eigenschaften, Reset-Methode (VBScript)

Der folgende Code zeigt, wie der Server-Parameter von RDS.DataControl zur Entwurfszeit gesetzt wird und mit einer Datenquelle an eine datenbezogene HTML-Tabelle gebunden werden kann.

<%@ Language=VBScript %>
<HTML>
<HEAD>
<META NAME="GENERATOR" Content="Microsoft Visual Studio 6.0">
</HEAD>
<BODY>
<OBJECT classid="clsid:BD96C556-65A3-11D0-983A-00C04FC29E33"
    ID=RDS HEIGHT=1 WIDTH=1>
    <PARAM NAME="SQL" VALUE="Select * from Employee">
    <PARAM NAME="SERVER" VALUE="http://<%=Request.ServerVariables("SERVER_NAME")%>">
    <PARAM NAME="CONNECT" VALUE="Provider=SQLOLEDB;User Id=rdsdemo;Password=rdsdemo;Initial Catalog=AddrBookDB">
</OBJECT>

Sort Column: <SELECT NAME="cboSortColumn">
                  <OPTION VALUE=""></OPTION>
                  <OPTION VALUE=ID>ID</OPTION>
                  <OPTION VALUE=FirstName>FirstName</OPTION>
                  <OPTION VALUE=LastName>LastName</OPTION>
                  <OPTION VALUE=Title>Title</OPTION>
                  <OPTION VALUE=Type>Type</OPTION>
                  <OPTION VALUE=Email>Email</OPTION>
                  <OPTION VALUE=Building>Building</OPTION>
                  <OPTION VALUE=Room>Room</OPTION>
                  <OPTION VALUE=Phone>Phone</OPTION>
             </SELECT>
             <br>
Sort Direction: <SELECT NAME="cboSortDir">
                  <OPTION VALUE=""></OPTION>
                  <OPTION VALUE=TRUE>TRUE</OPTION>
                  <OPTION VALUE=FALSE>FALSE</OPTION>
                </SELECT>
<HR WIDTH="25%">
Filter Column: <SELECT NAME="cboFilterColumn">
                  <OPTION VALUE=""></OPTION>
                  <OPTION VALUE=ID>ID</OPTION>
                  <OPTION VALUE=FirstName>FirstName</OPTION>
                  <OPTION VALUE=LastName>LastName</OPTION>
                  <OPTION VALUE=Title>Title</OPTION>
                  <OPTION VALUE=Type>Type</OPTION>
                  <OPTION VALUE=Email>Email</OPTION>
                  <OPTION VALUE=Building>Building</OPTION>
                  <OPTION VALUE=Room>Room</OPTION>
                  <OPTION VALUE=Phone>Phone</OPTION>
             </SELECT>
             <br>
Filter Criterion: <SELECT NAME="cboCriterion">
                    <OPTION VALUE=""></OPTION>
                    <OPTION VALUE="=">=</OPTION>
                    <OPTION VALUE="&gt;">&gt;</OPTION>
                    <OPTION VALUE="&lt;">&lt;</OPTION>
                    <OPTION VALUE="&gt;=">&gt;=</OPTION>
                    <OPTION VALUE="&lt;=">&lt;=</OPTION>
                    <OPTION VALUE="&lt;&gt;">&lt;&gt;</OPTION>
                  </SELECT>
              <br>
Filter Value: <INPUT NAME="txtFilterValue">
<HR WIDTH="25%">
<INPUT TYPE=BUTTON NAME=Clear VALUE="CLEAR ALL"> &nbsp;
<INPUT TYPE=BUTTON NAME=SortFilter VALUE="APPLY">

<HR>
<TABLE DATASRC=#RDS ID="DataTable">
<THEAD>
  <TR>
    <TH>ID</TH>
    <TH>FirstName</TH>
    <TH>LastName</TH>
    <TH>Title</TH>
    <TH>Type</TH>
    <TH>Email</TH>
    <TH>Building</TH>
    <TH>Room</TH>
    <TH>Phone</TH>
  </TR>
</THEAD>
<TBODY>
  <TR>
    <TD><SPAN DATAFLD="ID"></SPAN></TD>
    <TD><SPAN DATAFLD="FirstName"></SPAN></TD>
    <TD><SPAN DATAFLD="LastName"></SPAN></TD>
    <TD><SPAN DATAFLD="Title"></SPAN></TD>
    <TD><SPAN DATAFLD="Type"></SPAN></TD>
    <TD><SPAN DATAFLD="Email"></SPAN></TD>
    <TD><SPAN DATAFLD="Building"></SPAN></TD>
    <TD><SPAN DATAFLD="Room"></SPAN></TD>
    <TD><SPAN DATAFLD="Phone"></SPAN></TD>
  </TR>
</TBODY>
</TABLE>

<Script Language="VBScript">
<!--
Const adFilterNone = 0

Sub SortFilter_OnClick
    Dim vCriterion
    Dim vSortDir
    Dim vSortCol
    Dim vFilterCol

    ' SortColumn erhält den Wert der Option, die der Benutzer im
    ' cboSortColumn-Feld auswählt.
    vSortCol = cboSortColumn.options(cboSortColumn.selectedIndex).value

    If(vSortCol <> "") then
        RDS.SortColumn = vSortCol
    End If

    ' SortDirection erhält den Wert der Option, die der Benutzer im
    ' cboSortdirection-Feld angibt.

    If (vSortCol <> "") then
        vSortDir = cboSortDir.options(cboSortDir.selectedIndex).value
        If (vSortDir = "") then
            MsgBox "True or False are only acceptable Sort Direction values."
            Exit Sub
        Else
            RDS.SortDirection = vSortDir
        End If
    End If

    ' FilterColumn erhält den Wert der Option, die der Benutzer im
    ' cboFilterColumn-Feld angibt.
    vFilterCol = cboFilterColumn.options(cboFilterColumn.selectedIndex).value

    If(vFilterCol <> "") then
        RDS.FilterColumn = vFilterCol
    End If

    ' FilterCriterion erhält den Textwert der Option, die der Benutzer im
    ' cboCriterion-Feld angibt.
    vCriterion = cboCriterion.options(cboCriterion.selectedIndex).value
    If (vCriterion <> "") Then
        RDS.FilterCriterion = vCriterion
    End If

    ' txtFilterValue ist ein Rich Text Box-Steuerelement.
    ' FilterValue erhält den Textwert der Option, die der Benutzer im
    ' txtFilterValue-Feld angibt.
    If (txtFilterValue.value <> "") Then
        RDS.FilterValue = txtFilterValue.value
    End If

    ' Ausführen der Sortierung und des Filters auf einem clientseitigen
    ' Recordset auf der Grundlage der festgelegten Sortierungs- und
    ' Filtereigenschaften. Der Aufruf von Reset aktualisiert das
    ' Resultset, das in den datengebundenen Steuerelementen angezeigt
    ' wird, so dass das gefilterte, sortierte Recordset angezeigt wird.
    RDS.Reset
End Sub

Sub Clear_onClick()
    ' Inhalt der HTML-Eingabesteuerelemente löschen
    cboSortColumn.selectedIndex = 0
    cboSortDir.selectedIndex = 0
    cboFilterColumn.selectedIndex = 0
    cboCriterion.selectedIndex = 0
    txtFilterValue.value = ""

    ' Inhalt des Filters löschen
    RDS.FilterCriterion = ""
    RDS.Reset(FALSE)
End Sub
-->
</Script>
</BODY>
</HTML>


Beispiel für die Move-Methode (VBScript)

In diesem Beispiel wird die Move-Methode zum Positionieren des Datensatzzeigers auf der Grundlage einer Benutzereingabe verwendet.

Verwenden Sie das nachstehende Beispiel in einer ASP (Active Server Page). Zum Ansehen des voll funktionsfähigen Beispiels müssen Sie über die Datenquelle AdvWorks.mdb (wird mit dem SDK installiert) verfügen, die sich unter C:\mssdk\samples\dataaccess\rds befindet. Es handelt sich hierbei um eine Microsoft Access-Datenbankdatei.

Verwenden Sie den Befehl Suchen, um die Datei Adovbs.inc zu suchen, und verschieben Sie sie in das zu verwendende Verzeichnis. Schneiden Sie den folgenden Code aus, fügen Sie ihn in Editor oder einem anderen Texteditor wieder ein und speichern Sie ihn unter dem Dateinamen Move.asp. Das Ergebnis kann in jedem Browser angezeigt werden.

Geben Sie einen Buchstaben oder einen Wert ein, bei dem es sich nicht um einen Ganzzahlwert handelt, um die Funktionsweise der Fehlerbehandlung aufzuzeigen.

<%@ Language=VBScript %>
<!-- #Include file="ADOVBS.INC" -->
<HTML>
<HEAD>
<TITLE>ADO Move Methods</TITLE>
<STYLE>
<!--
BODY {
    font-family: "MS SANS SERIF",sans-serif;
     }
.thead1 {
    background-color: #008080;
    font-family: 'Arial Narrow','Arial',sans-serif;
    font-size: x-small;
    color: white;
    }
.tbody {
    text-align: center;
    background-color: #f7efde;
    font-family: 'Arial Narrow','Arial',sans-serif;
    font-size: x-small;
     }
-->
</STYLE>
</HEAD>
<BODY>
<H3>ADO Move Methods</H3>
<%
src = "C:\mssdk\samples\dataaccess\rds\advworks.mdb"
sConnStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & src

' Connection-Objekt erstellen und öffnen.
Set OBJdbConn = Server.CreateObject("ADODB.Connection")
OBJdbConn.Open  sConnStr

' Recordset-Objekt erstellen und öffnen.
Set RsCustomerList = Server.CreateObject("ADODB.Recordset")
RsCustomerList.ActiveConnection = OBJdbConn
RsCustomerList.CursorType = adOpenKeyset
RsCustomerList.LockType = adLockOptimistic
RsCustomerList.Source = "Customers"

RsCustomerList.Open

' Anzahl der Benutzerverschiebungen in dieser Sitzung überprüfen.
' Erhöhen um die Anzahl in diesem Formular.
Session("Clicks") = Session("Clicks") + Request.Form("MoveAmount")
Clicks = Session("Clicks")
' Bewegen zur letzten bekannten Datensatzposition plus dem Wert, der
' von der Post-Methode des Formulars übergeben wurde.
RsCustomerList.Move CInt(Clicks)

' Fehlerbehandlung
    If RsCustomerList.EOF Then
            Session("Clicks") = RsCustomerList.RecordCount
            Response.Write "This is the Last Record"
            RsCustomerList.MoveLast
        Else If RsCustomerList.BOF Then
            Session("Clicks") = 1
            RsCustomerList.MoveFirst
            Response.Write "This is the First Record"
        End If
    End If
%>

<H3>Current Record Number is <BR>
<%
If Session("Clicks") = 0 Then
    Session("Clicks") = 1
End If
Response.Write(Session("Clicks") )%> of <%=RsCustomerList.RecordCount%></H3>
<HR>

<TABLE COLSPAN=8 CELLPADDING=5 BORDER=0>

<!-- BEGIN Spaltenheaderzeile für Customers-Tabelle-->

<TR CLASS=thead1>
    <TD>Company Name</TD>
    <TD>Contact Name</TD>
    <TD>Phone Number</TD>
    <TD>City</TD>
    <TD>State/Province</TD>
</TR>

<!--ADO-Daten aus der Customers-Tabelle anzeigen-->

<TR CLASS=tbody>
  <TD> <%= RSCustomerList("CompanyName")%> </TD>
  <TD> <%= RScustomerList("ContactLastName") & ", " %>
       <%= RScustomerList("ContactFirstName") %> </TD>
  <TD> <%= RScustomerList("PhoneNumber")%> </TD>
  <TD> <%= RScustomerList("City")%> </TD>
  <TD> <%= RScustomerList("StateOrProvince")%> </TD>
</TR>
</TABLE>

<HR>
<Input Type=Button Name=cmdDown  Value="&lt;  ">
<Input Type=Button Name=cmdUp Value=" &gt;">
<H5>Click Direction Arrows for Previous or Next Record
<BR> Click Move Amount to use Move Method
Enter Number of Records to Move + or - </H5>

<TABLE>

<FORM Method = Post Action="Move.asp" Name=Form>
<TR>
    <TD><Input Type="Button" Name=Move Value="Move Amount "></TD>
    <TD></TD>
    <TD><Input Type="Text" Size="4" Name="MoveAmount" Value=0></TD>
<TR>
</FORM>
</TABLE>

</BODY>

<Script Language = "VBScript">

Sub Move_OnClick
    ' Sicherstellen, dass der eingegebene Verschiebungswert eine Ganzzahl
    ' ist.
    If IsNumeric(Document.Form.MoveAmount.Value)Then
        Document.Form.MoveAmount.Value = CInt(Document.Form.MoveAmount.Value)
        Document.Form.Submit
    Else
        MsgBox "You Must Enter a Number", ,"ADO-ASP Example"
        Document.Form.MoveAmount.Value = 0
    End If
End Sub

Sub cmdDown_OnClick
    Document.Form.MoveAmount.Value = -1
    Document.Form.Submit
End Sub

Sub cmdUp_OnClick
    Document.Form.MoveAmount.Value = 1
    Document.Form.Submit
End Sub
</Script>


Beispiel für die MoveFirst-, MoveLast-, MoveNext- und MovePrevious-Methoden (VBScript)

In diesem Beispiel werden die Methoden MoveFirst, MoveLast, MoveNext und MovePrevious verwendet, um den Datensatzzeiger eines Recordset-Objekts auf der Grundlage des übermittelten Befehls zu verschieben. Die MoveAny-Prozedur ist erforderlich, damit diese Prozedur ausgeführt werden kann.

Verwenden Sie das nachstehende Beispiel in einer ASP (Active Server Page). Zum Ansehen des voll funktionsfähigen Beispiels müssen Sie über die Datenquelle AdvWorks.mdb (wird mit dem SDK installiert) verfügen, die sich unter C:\mssdk\samples\dataaccess\rds befindet. Es handelt sich hierbei um eine Microsoft Access-Datenbankdatei.

Verwenden Sie den Befehl Suchen, um die Datei Adovbs.inc zu suchen, und verschieben Sie sie in das zu verwendende Verzeichnis. Schneiden Sie den folgenden Code aus, fügen Sie ihn in Editor oder einem anderen Texteditor wieder ein und speichern Sie ihn unter dem Dateinamen MoveOne.asp. Das Ergebnis kann in jedem Browser angezeigt werden.

Bewegen Sie sich über die obere oder untere Grenze des Recordset hinaus, um die Funktionsweise der Fehlerbehandlung aufzuzeigen.

<%@ Language=VBScript %>
<!-- #Include file="ADOVBS.INC" -->
<HTML><HEAD>
<TITLE>ADO MoveNext, MovePrevious, MoveLast, MoveFirst Methods</TITLE>
<STYLE>
<!--
BODY {
    font-family: "MS SANS SERIF",sans-serif;
     }
.thead {
    background-color: #008080;
    font-family: 'Arial Narrow','Arial',sans-serif;
    font-size: x-small;
    color: white;
    }
.tbody {
    text-align: center;
    background-color: #f7efde;
    font-family: 'Arial Narrow','Arial',sans-serif;
    font-size: x-small;
     }
.tmsg {
    color: red;
    text-align: center;
    }
-->
</STYLE>
</HEAD>

<BODY>
<H3>ADO Methods<BR>MoveNext, MovePrevious, MoveLast, MoveFirst</H3>
<!-- Connection- und Recordset-Objekt auf dem Server erstellen -->
<%
src = "C:\mssdk\samples\dataaccess\rds\advworks.mdb"
sConnStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & src

' Connection-Objekt erstellen und öffnen.
Set OBJdbConn = Server.CreateObject("ADODB.Connection")
OBJdbConn.Open  sConnStr
' Recordset-Objekt erstellen und öffnen.
Set RsCustomerList = Server.CreateObject("ADODB.Recordset")
RsCustomerList.ActiveConnection = OBJdbConn
RsCustomerList.CursorType = adOpenKeyset
RsCustomerList.CursorLocation = adUseClient
RsCustomerList.LockType = adLockOptimistic
RsCustomerList.Source = "Customers"
RsCustomerList.Open

RsCustomerList.MoveFirst

If Not IsEmpty(Request.Form("MoveAction")) Then
    strAction = Request.Form("MoveAction")
    varPosition  = Request.Form("Position")

    RsCustomerList.AbsolutePosition = varPosition

    Select Case strAction

      Case "MoveNext"

        RsCustomerList.MoveNext
        If RsCustomerList.EOF Then
            RsCustomerList.MoveLast
            strMessage = "Positionieren hinter dem letzten Datensatz ist
nicht möglich."
        End If

      Case "MovePrev"

        RsCustomerList.MovePrevious
        If RsCustomerList.BOF Then
            RsCustomerList.MoveFirst
            strMessage = "Positionieren vor dem ersten Datensatz ist nicht möglich."
        End If

      Case "MoveLast"

        RsCustomerList.MoveLast

      Case "MoveFirst"

        RsCustomerList.MoveFirst

    End Select
End If

%>

<H3>Current Record Number is <BR>
<!-- Aktuelle Datensatznummer und -größe anzeigen -->
<%=RsCustomerList.AbsolutePosition%> of <%=RsCustomerList.RecordCount%></H3>
<HR>
<TABLE COLSPAN=8 CELLPADDING=5 BORDER=0>
<!-- BEGIN Spaltenheaderzeile für Customers-Tabelle-->
<TR CLASS=thead>
    <TD>Company Name</TD>
    <TD>Contact Name</TD>
    <TD>Phone Number</TD>
    <TD>City</TD>
    <TD>State/Province</TD>
</TR>

<!--ADO-Daten aus der Customers-Tabelle anzeigen-->
<TR CLASS=tbody>
  <TD> <%= RSCustomerList("CompanyName")%> </TD>
  <TD> <%= RScustomerList("ContactLastName") & ", " %>
       <%= RScustomerList("ContactFirstName") %> </TD>
  <TD> <%= RScustomerList("PhoneNumber")%> </TD>
  <TD> <%= RScustomerList("City")%> </TD>
  <TD> <%= RScustomerList("StateOrProvince")%> </TD>
</TR>
<TR CLASS=tmsg>
  <TD COLSPAN=5><%=strMessage%></TD>
</TR>
</TABLE>

<HR>
<Input Type=Button Name=cmdDown  Value="&lt;  ">
<Input Type=Button Name=cmdUp Value="  &gt;">
<BR>
<Input Type=Button Name=cmdFirst Value="First Record">
<Input Type=Button Name=cmdLast Value="Last Record">

<H5>Click Direction Arrows to Use MovePrevious or MoveNext</H5>

<!-- Ausgeblendete Formularfelder zum Übermitteln von Werten an den Server verwenden -->

<Form Method=Post
      Action="<%=Request.ServerVariables("SCRIPT_NAME")%>"
      Name=Form>
<Input Type="Hidden" Size="4" Name="MoveAction" Value="Move">
<Input Type="Hidden" Size="4" Name="Position" Value="<%= RsCustomerList.AbsolutePosition %>">
</Form>

<HR>
</BODY>

<Script Language = "VBScript">
Sub cmdDown_OnClick
    'Werte in Formulareingabefeldern festlegen und Formular absenden.
    Document.form.MoveAction.Value = "MovePrev"
    Document.Form.Submit
End Sub

Sub cmdUp_OnClick
    Document.form.MoveAction.Value = "MoveNext"
    Document.Form.Submit
End Sub

Sub cmdFirst_OnClick
    Document.form.MoveAction.Value = "MoveFirst"
    Document.Form.Submit
End Sub

Sub cmdLast_OnClick
    Document.form.MoveAction.Value = "MoveLast"
    Document.Form.Submit
End Sub
</Script>


Beispiel für die Open- und Close-Methoden (VBScript)

In diesem Beispiel werden die Methoden Open und Close in geöffneten Recordset und Connection-Objekten verwendet.

Verwenden Sie das nachstehende Beispiel in einer ASP (Active Server Page). Zum Ansehen des voll funktionsfähigen Beispiels müssen Sie über die Datenquelle AdvWorks.mdb (wird mit dem SDK installiert) verfügen, die sich unter C:\mssdk\samples\dataaccess\rds befindet. Es handelt sich hierbei um eine Microsoft Access-Datenbankdatei.

Verwenden Sie den Befehl Suchen, um die Datei Adovbs.inc zu suchen, und verschieben Sie sie in das zu verwendende Verzeichnis. Schneiden Sie den folgenden Code aus, fügen Sie ihn in Editor oder einem anderen Texteditor wieder ein und speichern Sie ihn unter dem Dateinamen MoveOne.asp. Das Ergebnis kann in jedem Browser angezeigt werden.

<%@ Language=VBScript %>
<!-- #Include file="ADOVBS.INC" -->
<HTML>
<HEAD>
<TITLE>ADO Open Method</TITLE>
<STYLE>
<!--
BODY {
    font-family: "MS SANS SERIF",sans-serif;
     }
.thead {
    background-color: #008080;
    font-family: 'Arial Narrow','Arial',sans-serif;
    font-size: x-small;
    color: white;
    }
.thead2 {
    background-color: #800000;
    font-family: 'Arial Narrow','Arial',sans-serif;
    font-size: x-small;
    color: white;
    }
.tbody {
    text-align: center;
    background-color: #f7efde;
    font-family: 'Arial Narrow','Arial',sans-serif;
    font-size: x-small;
     }
-->
</STYLE>
</HEAD>
<BODY>
<H3>ADO Open Method</H3>

<TABLE WIDTH=600 BORDER=0>
<TR>
<TD VALIGN=TOP COLSPAN=3>
<FONT SIZE=2>
<!--- ADO-Verbindung zum Erstellen von zwei Recordsets verwenden-->
<%
src = "C:\mssdk\samples\dataaccess\rds\advworks.mdb"
sConnStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & src

' Connection-Objekt erstellen und öffnen.
Set OBJdbConn = Server.CreateObject("ADODB.Connection")
OBJdbConn.Open  sConnStr
SQLQuery = "SELECT * FROM Customers"

' Erstes Recordset RsCustomerList.
Set RsCustomerList = OBJdbConn.Execute(SQLQuery)

'Zweites Recordset RsProductList.
Set RsProductList = Server.CreateObject("ADODB.Recordset")
RsProductList.CursorType = adOpenDynamic
RsProductList.LockType = adLockOptimistic
RsProductList.Open "Products", OBJdbConn
%>

<TABLE COLSPAN=8 CELLPADDING=5 BORDER=0>
<!-- BEGIN Spaltenheaderzeile für Customers-Tabelle-->
<TR CLASS=thead>
    <TD>Company Name</TD>
    <TD>Contact Name</TD>
    <TD>E-mail address</TD>
    <TD>City</TD>
    <TD>State/Province</TD>
</TR>

<!--ADO-Daten aus der Customers-Tabelle anzeigen-->
<% Do While Not RScustomerList.EOF %>
<TR CLASS=tbody>
  <TD> <%= RSCustomerList("CompanyName")%> </TD>
  <TD> <%= RScustomerList("ContactLastName") & ", " %>
       <%= RScustomerList("ContactFirstName") %> </TD>
  <TD> <%= RScustomerList("ContactLastName")%> </TD>
  <TD> <%= RScustomerList("City")%> </TD>
  <TD> <%= RScustomerList("StateOrProvince")%> </TD>
</TR>
<!-Nächste Zeile = Datensatz. Schleife ausführen und Daten zur HTML-Tabelle hinzufügen-->
<%
   RScustomerList.MoveNext
Loop
RScustomerList.Close
%>
</TABLE>

<HR>

<TABLE COLSPAN=8 CELLPADDING=5 BORDER=0>
<!-- BEGIN Spaltenheaderzeile für die Produktlistentabelle-->

<TR CLASS=thead2>
    <TD>Product Type</TD>
    <TD>Product Name</TD>
    <TD>Product Description</TD>
    <TD>Unit Price</TD>
</TR>
<!-- ADO-Daten für die Produktliste anzeigen-->
<% Do While Not RsProductList.EOF %>
  <TR CLASS=tbody>
  <TD> <%= RsProductList("ProductType")%> </TD>
  <TD> <%= RsProductList("ProductName")%> </TD>
  <TD> <%= RsProductList("ProductDescription")%> </TD>
  <TD> <%= RsProductList("UnitPrice")%> </TD>
  </TR>
  <!--  Nächste Zeile = Datensatz -->
<%
  RsProductList.MoveNext
Loop
OBJdbConn.Close

'Objekte aus Speicher entfernen und Speicher freigeben.
Set RsProductList = Nothing
Set OBJdbConn = Nothing
%>
</TABLE>
</BODY>
</HTML>


Beispiel für die ReadyState-Eigenschaft (VBScript)

Im folgenden Beispiel wird gezeigt, wie die ReadyState-Eigenschaft des RDS.DataControl-Objekts zur Laufzeit in VBScript-Code gelesen wird. ReadyState ist eine schreibgeschützte Eigenschaft.

Schneiden Sie zum Testen dieses Beispiels den Code aus, und fügen Sie ihn zwischen den Tags <Body> und </Body> eines herkömmlichen HTML-Dokuments ein, das Sie unter dem Dateinamen RDSReadySt.asp speichern. ASP-Skript erkennt den verwendeten Server.

<<%@ Language=VBScript %>
<H2>RDS API Code Examples </H2>
<HR>
<H3>RDS.DataControl ReadyState Property</H3>
<!-- RDS.DataControl mit zur Entwurfszeit festgelegten Parametern -->
<OBJECT classid="clsid:BD96C556-65A3-11D0-983A-00C04FC29E33"
    ID=RDS>
    <PARAM NAME="SQL" VALUE="Select * from Employee for browse">
    <PARAM NAME="SERVER" VALUE="http://<%=Request.ServerVariables("SERVER_NAME")%>">
    <PARAM NAME="CONNECT" VALUE="Provider=SQLOLEDB;User Id=rdsdemo;Password=rdsdemo;Initial Catalog=AddrBookDB">
    <PARAM NAME="ExecuteOptions" VALUE="adcExecAsync">
    <PARAM NAME="FetchOptions" VALUE="adcFetchAsync">
</OBJECT>

<Script Language="VBScript">

Sub Window_OnLoad
    Select Case RDS.ReadyState
        case 2: MsgBox "Executing Query"
        case 3: MsgBox "Fetching records in background"
        case 4: MsgBox "All records fetched"
    End Select
End Sub
</Script>


Beispiel für die Recordset- und SourceRecordset-Eigenschaften (VBScript)

In dem folgenden Beispiel wird gezeigt, wie die erforderlichen Parameter für das Standardgeschäftsobjekt RDSServer.DataFactory zur Laufzeit gesetzt werden.

Schneiden Sie zum Testen dieses Beispiels den Code aus, und fügen Sie ihn zwischen den Tags <Body> und </Body> eines herkömmlichen HTML-Dokuments ein, das Sie unter dem Dateinamen SourceRS.asp speichern. ASP-Skript erkennt den verwendeten Server.

<Center>
<H2>RDS API Code Examples</H2>
<HR>
<H3>Using SourceRecordset and Recordset with RDSServer.DataFactory</H3>
<!-- RDS.DataSpace ID RDS1 -->
<OBJECT ID="RDS1" WIDTH=1 HEIGHT=1
CLASSID="CLSID:BD96C556-65A3-11D0-983A-00C04FC29E36">
</OBJECT>

<!-- RDS.DataControl mit zur Laufzeit festgelegten Parametern -->
<OBJECT classid="clsid:BD96C556-65A3-11D0-983A-00C04FC29E33"
    ID=RDC WIDTH=1 HEIGHT=1>
</OBJECT>

<TABLE DATASRC=#RDC>
    <TR>
        <TD> <INPUT DATAFLD="FirstName" SIZE=15> </TD>
        <TD> <INPUT DATAFLD="LastName" SIZE=15 id=text1 name=text1> </TD>
        <TD> <INPUT DATAFLD="Title" SIZE=15 id=text2 name=text2> </TD>
        <TD> <INPUT DATAFLD="Type" SIZE=15 id=text3 name=text3> </TD>
        <TD> <INPUT DATAFLD="Email" SIZE=15 id=text4 name=text4> </TD>
    </TR>
</TABLE>
<HR>
<Input Size=70 Name="txtServer" Value="http://<%=Request.ServerVariables("SERVER_NAME")%>"><BR>
<Input Size=70 Name="txtConnect" Value="Provider=SQLOLEDB;User Id=rdsdemo;Password=rdsdemo;Initial Catalog=AddrBookDB"><BR>
<Input Size=70 Name="txtSQL" Value="Select * from Employee">
<HR>
<INPUT TYPE=BUTTON NAME="Run" VALUE="Run"><BR>

</Center>
<Script Language="VBScript">
<!--
Dim ADF
Dim strServer
strServer = "http://<%=Request.ServerVariables("SERVER_NAME")%>"

Sub Run_OnClick()
    Dim objADORs
    ' RDSServer.DataFactory-Objekt erstellen.
    Set RDF = RDS1.CreateObject("RDSServer.DataFactory", strServer)
    ' Recordset abrufen.
    Set objADORs = RDF.Query(txtConnect.Value,txtSQL.Value)

    ' Parameter von RDS.DataControl zur Laufzeit festlegen.
    RDC.Server = txtServer.Value
    RDC.SQL = txtSQL.Value
    RDC.Connect = txtConnect.Value
    RDC.Refresh
End Sub
-->
</Script>


Beispiel für die Refresh-Methode (VBScript)

Im folgenden Beispiel wird gezeigt, wie die erforderlichen Parameter von RDS.DataControl zur Laufzeit gesetzt werden. Die Art und Weise, wie ein Recordset-Objekt unter Verwendung der Refresh-Methode abgerufen wird, wird durch die Einstellungen der Eigenschaften ExecuteOptions und FetchOptions bestimmt. Schneiden Sie zum Testen dieses Beispiels den Code aus, fügen Sie ihn in ein herkömmliches ASP-Dokument ein und speichern Sie es unter dem Dateinamen Refresh.asp. ASP-Skript erkennt den verwendeten Server.

<%@ Language=VBScript %>
<HTML>
<HEAD>
<META NAME="GENERATOR" Content="Microsoft Visual Studio 6.0">
<TITLE></TITLE>
</HEAD>
<BODY>
<H2>RDS API Code Examples </H2>
<HR>
<TABLE DATASRC=#RDC>
    <TR>
        <TD> <INPUT DATAFLD="FirstName" SIZE=15 id=text5 name=text5> </TD>
        <TD> <INPUT DATAFLD="LastName" SIZE=15 id=text1 name=text1> </TD>
        <TD> <INPUT DATAFLD="Title" SIZE=15 id=text2 name=text2> </TD>
        <TD> <INPUT DATAFLD="Type" SIZE=15 id=text3 name=text3> </TD>
        <TD> <INPUT DATAFLD="Email" SIZE=15 id=text4 name=text4> </TD>
    </TR>
</TABLE>

<!-- RDS.DataControl ohne zur Entwurfszeit festgelegte Parameter -->
<OBJECT classid="clsid:BD96C556-65A3-11D0-983A-00C04FC29E33"
    ID=RDC HEIGHT=1 WIDTH=1>
</OBJECT>
<HR>
Server: <Input Size=70 Name="txtServer" Value="http://<%=Request.ServerVariables("SERVER_NAME")%>"><BR>
Connect: <Input Size=70 Name="txtConnect" Value="Provider=SQLOLEDB;User Id=rdsdemo;Password=rdsdemo;Initial Catalog=AddrBookDB"><BR>
SQL: <Input Size=70 Name="txtSQL" Value="Select * from Employee">
<HR>
<TABLE BORDER=1 WIDTH="60%">
<TR>
    <TD COLSPAN=3 BGCOLOR=silver>
    Choose if you want the Recordset brought back Synchronously on the
    current calling thread or Asynchronously on another thread.
    </TD>
</TR>
<TR>
    <TD>Synchronously: <BR>
        <Input Type="Radio" Name="optExecuteOptions" Checked OnClick="SetExO('adcExecSync')">
    </TD>
    <TD>Asynchronously: <BR>
        <Input Type="Radio" Name="optExecuteOptions"  OnClick="SetExO('adcExecAsync')">
    </TD>
    <TD>&nbsp;</TD>
</TR>
<TR>
    <TD COLSPAN=3 BGCOLOR=silver>
    Fetch Up Front, Background Fetch with Blocking or Background Fetch
    without Blocking
    </TD>
<TR>
    <TD>Up Front:<BR>
        <Input Type="Radio" Name="optFetchOptions"  OnClick="SetFO('adcFetchUpFront')">
    </TD>
    <TD>Background w/ Blocking:<BR>
        <Input Type="Radio" Name="optFetchOptions" Checked OnClick="SetFO('adcFetchBackground')">
    </TD>
    <TD>Background w/o Blocking:<BR>
        <Input Type="Radio" Name="optFetchOptions"  OnClick="SetFO('adcFetchAsync')">
    </TD>
</TR>
</TABLE>

<INPUT TYPE=BUTTON NAME="Run" VALUE="Run"><BR>

<Script Language="VBScript">
<!--
Dim EO         'ExecuteOptions
Dim FO         'FetchOptions
EO = "adcExecSync"    ' Standardwert
FO = "adcFetchBackground"   ' Standardwert

Sub SetExO(NewEO)
    EO = NewEO
End Sub

Sub SetFO(NewFO)
    FO = NewFO
End Sub

' Parameter von RDS.DataControl zur Laufzeit festlegen.
Sub Run_OnClick
    RDC.Server = txtServer.Value
    RDC.SQL = txtSQL.Value
    RDC.Connect = txtConnect.Value
    If EO = "adcExecSync" Then   ' Ermitteln, welcher Wert für
    ' ExecuteOption ausgewählt wurde.
        RDC.ExecuteOptions = adcExecSync
        MsgBox "Recordset brought in on current calling thread Syncronously"
    Else
        RDC.ExecuteOptions = adcExecAsync
        MsgBox "Recordset brought in on another thread Asyncronously"
    End If

    If FO = "adcFetchBackground" Then      ' Ermitteln, welcher
    ' Wert für FetchOption ausgewählt wurde.
        RDC.FetchOptions = adcFetchBackground
        MsgBox "Control goes back to user after first batch of records returned"
    ElseIf FO = " adcFetchUpFront" Then
        RDC.FetchOptions = adcFetchUpFront
        MsgBox "All records returned before control goes back to user"
    Else
        RDC.FetchOptions = adcFetchAsync
        MsgBox "Control goes back to user immediately"
    End If

    RDC.Refresh
End Sub
-->
</Script>
</BODY>
</HTML>


Beispiel für die Server-Eigenschaft (VBScript)

Der folgende Code zeigt, wie der RDS.DataControl-Parameter zur Entwurfszeit gesetzt wird und mit dem SQLOLEDB-Provider an ein datenbezogenes Steuerelement gebunden werden kann. Schneiden Sie den Code aus, fügen Sie ihn in ein herkömmliches ASP-Dokument ein und speichern Sie es unter dem Dateinamen ServerProp.asp. ASP-Skript erkennt den verwendeten Server.

<%@ Language=VBScript %>
<HTML>
<HEAD>
<TITLE>Server Property Example</TITLE>
</HEAD>
<BODY>
<H2>RDS API Code Examples </H2>
<HR><BR>
<H3>Remote Data Service</H3>

<TABLE DATASRC=#RDS>
    <TR>
        <TD> <SPAN DATAFLD="FirstName"></SPAN> </TD>
        <TD> <SPAN DATAFLD="LastName"></SPAN> </TD>
        <TD> <SPAN DATAFLD="Title"></SPAN> </TD>
        <TD> <SPAN DATAFLD="Type"></SPAN> </TD>
        <TD> <SPAN DATAFLD="Email"></SPAN> </TD>
    </TR>
</TABLE>
<!-- Remote Data Services mit zur Entwurfszeit festgelegten Parametern -->
<OBJECT classid="clsid:BD96C556-65A3-11D0-983A-00C04FC29E33"
    ID=RDS HEIGHT=1 WIDTH=1>
    <PARAM NAME="SQL" VALUE="Select * from Employee for browse">
    <PARAM NAME="SERVER" VALUE="http://<%=Request.ServerVariables("SERVER_NAME")%>">
    <PARAM NAME="CONNECT" VALUE="Provider=SQLOLEDB;User Id=rdsdemo;Password=rdsdemo;Initial Catalog=AddrBookDB">
</OBJECT>

</BODY>
</HTML>

Im folgenden Beispiel wird gezeigt, wie die erforderlichen Parameter von RDS.DataControl zur Laufzeit gesetzt werden. Schneiden Sie zum Testen dieses Beispiels den Code aus, fügen Sie ihn in ein herkömmliches ASP-Dokument ein und speichern Sie es unter dem Dateinamen ServerProp2.asp. ASP-Skript erkennt den verwendeten Server.

<%@ Language=VBScript %>
<HTML>
<HEAD>
<TITLE>Remote Data Service Server Property Set at Run Time</TITLE>
</HEAD>
<BODY>

<H2>RDS API Code Examples</H2>

<H3>Remote Data Service Server Property Set at Run Time</H3>

<!-- RDS.DataControl ohne zur Entwurfszeit festgelegte Parameter -->
<OBJECT classid="clsid:BD96C556-65A3-11D0-983A-00C04FC29E33"
    ID=RDC HEIGHT=1 WIDTH=1>
</OBJECT>

<TABLE DATASRC=#RDC>
    <TR>
        <TD> <SPAN DATAFLD="FirstName"></SPAN> </TD>
        <TD> <SPAN DATAFLD="LastName"></SPAN> </TD>
        <TD> <SPAN DATAFLD="Title"></SPAN> </TD>
        <TD> <SPAN DATAFLD="Type"></SPAN> </TD>
        <TD> <SPAN DATAFLD="Email"></SPAN> </TD>
    </TR>
</TABLE>

<HR>
<Input Size=70 Name="txtServer" Value="HTTP://<%= Request.ServerVariables("SERVER_NAME")%>">
<BR>
<Input Size=70 Name="txtConnect" Value="Provider=SQLOLEDB;User Id=rdsdemo;Password=rdsdemo;Initial Catalog=AddrBookDB">
<BR>
<Input Size=70 Name="txtSQL" Value="Select * from Employee">
<HR>
<INPUT TYPE=BUTTON NAME="Run" VALUE="Run"><BR>

<Script Language="VBScript">
<!--
' Parameter von RDS.DataControl zur Laufzeit festlegen.
Sub Run_OnClick
    RDC.Server = txtServer.Value
    RDC.SQL = txtSQL.Value
    RDC.Connect = txtConnect.Value
    RDC.Refresh
End Sub
-->
</Script>
</BODY>
</HTML>


Beispiel für die SQL-Eigenschaft (VBScript)

Der folgende Code zeigt, wie der SQL-Parameter des RDS.DataControl-Objekts zur Entwurfszeit gesetzt und mit einer in SQL Server mitgelieferten Datenbank mit dem Namen Pubs an ein datengebundenes Steuerelement gebunden wird. Kopieren Sie zum Testen des Beispiels den nachstehenden Code in ein herkömmliches ASP-Dokument, das Sie auf dem Webserver unter dem Dateinamen SQL.asp speichern.

<%@ Language=VBScript %>
<HTML>
<HEAD>
</HEAD>
<BODY>
<!-- RDS.DataControl -->
<OBJECT classid="clsid:BD96C556-65A3-11D0-983A-00C04FC29E33" ID=RDC HEIGHT=1 WIDTH=1>
    <PARAM NAME="SQL" VALUE="Select * from Authors">
    <PARAM NAME="SERVER" VALUE="http://<%=Request.ServerVariables("SERVER_NAME")%>">
    <PARAM NAME="CONNECT" VALUE="dsn=Pubs;UID=sa;PWD=;">
</OBJECT>

<!-- Datentabelle -->

<TABLE DATASRC=#RDC BORDER=1>
    <TR>
        <TD> <SPAN DATAFLD="au_id"></SPAN> </TD>
        <TD> <SPAN DATAFLD="au_lname"></SPAN> </TD>
        <TD> <SPAN DATAFLD="au_fname"></SPAN> </TD>
        <TD> <SPAN DATAFLD="city"></SPAN> </TD>
        <TD> <SPAN DATAFLD="state"></SPAN> </TD>
    </TR>
</TABLE>

</BODY>
</HTML>

Im folgenden Beispiel wird gezeigt, wie die erforderlichen Parameter von RDS.DataControl zur Laufzeit gesetzt werden. Schneiden Sie zum Testen dieses Beispiels den Code aus, fügen Sie ihn in ein herkömmliches ASP-Dokument ein und speichern Sie es unter dem Dateinamen SQL2.asp. ASP-Skript erkennt den verwendeten Server.

<%@ Language=VBScript %>
<HTML>
<BODY>
<H2>RDS API Code Examples </H2>
<H3>Remote Data Service SQL Property Set at Run Time</H3>

<!-- RDS.DataControl ohne zur Entwurfszeit festgelegte Parameter -->
<OBJECT classid="clsid:BD96C556-65A3-11D0-983A-00C04FC29E33"
    ID=RDC HEIGHT=1 WIDTH=1>
</OBJECT>

<TABLE DATASRC=#RDC>
    <TR>
        <TD> <SPAN DATAFLD="FirstName"></SPAN> </TD>
        <TD> <SPAN DATAFLD="LastName"></SPAN> </TD>
        <TD> <SPAN DATAFLD="Title"></SPAN> </TD>
        <TD> <SPAN DATAFLD="Type"></SPAN> </TD>
        <TD> <SPAN DATAFLD="Email"></SPAN> </TD>
    </TR>
</TABLE>

<HR>
<Input Size=70 Name="txtServer" Value= "http://<%=Request.ServerVariables("SERVER_NAME")%>">
<BR>
<Input Size=70 Name="txtConnect" Value="Provider=SQLOLEDB;User Id=rdsdemo;Password=rdsdemo;Initial Catalog=AddrBookDB;">
<BR>
<Input Size=70 Name="txtSQL" VALUE="Select * from Employee">
<HR>
<INPUT TYPE=BUTTON NAME="Run" VALUE="Run"><BR>

<Script Language="VBScript">
<!--
' Parameter von RDS.DataControl zur Laufzeit festlegen.
Sub Run_OnClick
    RDC.Server = txtServer.Value
    RDC.SQL = txtSQL.Value
    RDC.Connect = txtConnect.Value
    RDC.Refresh
End Sub
-->
</Script>
</BODY>
</HTML>


Beispiel für die SubmitChanges-Methode (VBScript)

Der folgende Code zeigt, wie die SubmitChanges-Methode mit einem RDS.DataControl-Objekt verwendet wird.

Schneiden Sie zum Testen dieses Beispiels den Code aus, fügen Sie ihn in ein herkömmliches ASP-Dokument ein und speichern Sie es unter dem Dateinamen SubmitChanges.asp. ASP-Skript erkennt den verwendeten Server.

<%@ Language=VBScript %>
<HTML>
<BODY>
<H2>RDS API Code Examples</H2>
<H3>Remote Data Service SubmitChanges and CancelUpdate Methods</H3>

<!-- RDS.DataControl mit zur Entwurfszeit festgelegten Parametern -->
<OBJECT classid="clsid:BD96C556-65A3-11D0-983A-00C04FC29E33"
    ID=RDC HEIGHT=1 WIDTH=1>
    <PARAM NAME="SQL" VALUE="Select * from Employee for browse">
    <PARAM NAME="SERVER" VALUE="http://<%=Request.ServerVariables("SERVER_NAME")%>">
    <PARAM NAME="CONNECT" VALUE="Provider=SQLOLEDB;User Id=rdsdemo;Password=rdsdemo;Initial Catalog=AddrBookDB;">
</OBJECT>

<TABLE DATASRC="#RDC">
<THEAD>
<TR ID="ColHeaders">
   <TH>ID</TH>
   <TH>FName</TH>
   <TH>LName</TH>
   <TH>Name</TH>
   <TH>Title</TH>
   <TH>Type</TH>
   <TH>Email</TH>
   <TH>MgrEmail</TH>
   <TH>Bldg</TH>
   <TH>Rm</TH>
   <TH>Phone</TH>
</TR>
</THEAD>

<TBODY>
<TR>
   <TD> <INPUT DATAFLD="ID" size=4> </TD>
   <TD> <INPUT DATAFLD="FirstName" size=10> </TD>
   <TD> <INPUT DATAFLD="LastName" size=10> </TD>
   <TD> <INPUT DATAFLD="Name" size=15> </TD>
   <TD> <INPUT DATAFLD="Title" size=20> </TD>
   <TD> <INPUT DATAFLD="Type" size=10> </TD>
   <TD> <INPUT DATAFLD="Email" size=10> </TD>
   <TD> <INPUT DATAFLD="ManagerEmail" size=10> </TD>
   <TD> <INPUT DATAFLD="Building" size=3> </TD>
   <TD> <INPUT DATAFLD="Room" size=5> </TD>
   <TD> <INPUT DATAFLD="Phone" size=8> </TD>
</TR>
</TBODY>
</TABLE>

<HR>
<INPUT TYPE=BUTTON NAME="SubmitChange" VALUE="Submit-Changes">
<INPUT TYPE=BUTTON NAME="CancelChange" VALUE="Cancel-Update"><BR>
<H4>Alter a current entry in the table. Move off that Row. <BR>
Submit the Changes to your DBMS or cancel the updates. </H4>
</Center>
<Script Language="VBScript">
<!--
' Parameter von RDS.DataControl zur Laufzeit festlegen.
Sub SubmitChange_OnClick
    RDC.SubmitChanges
    RDC.Refresh
End Sub

Sub CancelUpdate_OnClick
    RDC.CancelUpdate
    RDC.Refresh
End Sub
-->
</Script>
</BODY>
</HTML>

Der folgende Codeabschnitt zeigt, wie die SubmitChanges-Methode mit einem RDSServer.DataFactory-Objekt verwendet wird. Möglicherweise ist es sinnvoll, Änderungen an das RDSServer.DataFactory-Objekt zu übergeben, wenn es sich um ein Projekt in Visual Basic handelt, bei dem das RDS.DataControl-Objekt nicht verwendet wird. Um dieses Projekt zu erstellen, öffnen Sie ein Visual Basic-Formular und platzieren darauf ein Listenfeld (List1), zwei Textfelder (txtConnect und txtGetRecordset) sowie zwei Befehlsschaltflächen (cmdGetRecordset und cmdSubmitChanges).

Dim ads As Object    ' RDS.DataSpace-Objekt
Dim adf As Object    ' RDSServer.DataFactory-Objekt

Private Sub UserDocument_Initialize()
    Call Form_Load
End Sub

Private Sub Form_Load()
    txtConnect.Text = "Dsn=Pubs;Uid=sa;Pwd=;"
    txtGetRecordset.Text = "Select au_lname from authors"
End Sub

Private Sub cmdGetRecordset_Click()
    Dim Server As String
    Server = txtServer.Text

    ' RDS.DataSpace mit der Methode CreateObject von RDS.DataSpace
    ' erstellen.
    Set ads = CreateObject("RDS.DataSpace")
    Set adf = ads.CreateObject("RDSServer.DataFactory", Server)

    ' ListBox aus Recordset auffüllen.
    MousePointer = vbHourglass
    Dim objADORs As Object
    Set objADORs = adf.Query(CStr(txtConnect.Text), CStr(txtGetRecordset.Text))
    List1.Clear
    While Not objADORs.EOF
        List1.AddItem objADORs(0).Value
        objADORs.MoveNext
    Wend
    MousePointer = vbNormal
End Sub
Sub cmdSubmitChanges_OnClick
    adf.SubmitChanges " Dsn=Pubs;Uid=sa;Pwd=;",_
    objADORs
End Sub


Beispiel für die URL-Eigenschaft (VBScript)

Mit dem folgenden Code wird gezeigt, wie die URL-Eigenschaft auf der Clientseite gesetzt wird, um eine ASP-Datei anzugeben, die ihrerseits für die Übermittlung der Änderungen an die Datenquelle sorgt.

…
Sub Update_OnClick
    If ADC.ReadyState <> adcReadyStateLoaded then
        ADC.URL = "RDSSubmit.asp"
        ADC.SubmitChanges
        ADC.Refresh
    Else
        MsgBox "Query results still arriving, Please wait"
    End if
End Sub
…

Der in der Datei RDSSubmit.asp vorhandene serverseitige Code übermittelt das aktualisierte Recordset an die Datenquelle:

<%

Option Explicit

Dim strSQL, strConnection, rstCustomers

strConnection = _
    "Provider=SQLOLEDB;Server=Srv;Database=Pubs;User Id=sa;Password=;"
Set rstCustomers = Server.CreateObject("ADODB.Recordset")

On Error Resume Next
rstCustomers.Open Request
rstCustomers.ActiveConnection = strConnection
rstCustomers.UpdateBatch
If Err.Number <> 0 Then
    Request.Status = "500 " + Err.Source + ": " + Err.Description
End If
%>


ADO-Codebeispiele in Microsoft Visual C++

Verwenden Sie die folgenden Codebeispiele, um zu erfahren, wie Sie die Methoden, Eigenschaften und Ereignisse von ADO beim Schreiben in Microsoft Visual C++ einsetzen können.

Anmerkung Fügen Sie das gesamte Codebeispiel von Anfang bis Ende in den Code-Editor ein. Wenn nur Teile der Beispiele verwendet werden oder die Absatzformatierung verloren geht, wird das Beispiel möglicherweise nicht ordnungsgemäß ausgeführt.

Methoden

  • Beispiel für die AddNew-Methode

  • Beispiel für die Append- und CreateParameter-Methoden

  • Beispiel für die AppendChunk- und GetChunk-Methoden

  • Beispiel für die BeginTrans-, CommitTrans- und RollbackTrans-Methoden

  • Beispiel für die Cancel-Methode

  • Beispiel für die Clone-Methode

  • Beispiel für die CompareBookmarks-Methode

  • Beispiel für die Delete-Methode

  • Beispiel für die Execute-, Requery- und Clear-Methoden

  • Beispiel für die Find-Methode

  • Beispiel für die GetRows-Methode

  • Beispiel für die GetString-Methode

  • Beispiel für die MoveFirst-, MoveLast-, MoveNext- und MovePrevious-Methoden

  • Beispiel für die NextRecordset-Methode

  • Beispiel für die Open- und Close-Methoden

  • Beispiel für die OpenSchema-Methode

  • Beispiel für die Refresh-Methode

  • Beispiel für die Resync-Methode

  • Beispiel für die Save- und Open-Methoden

  • Beispiel für die Seek-Methode und die Index-Eigenschaft

  • Beispiel für die Supports-Methode

  • Beispiel für die Update- und CancelUpdate-Methoden

  • Beispiel für die UpdateBatch- und CancelBatch-Methoden

Eigenschaften

  • Beispiel für die AbsolutePage-, PageCount- und PageSize-Eigenschaften

  • Beispiel für die AbsolutePosition- und CursorLocation-Eigenschaften

  • Beispiel für die ActiveCommand-Eigenschaft

  • Beispiel für die ActiveConnection-, CommandText-, CommandTimeout-, CommandType-, Size- und Direction-Eigenschaften

  • Beispiel für die ActualSize- und DefinedSize-Eigenschaften

  • Beispiel für die Attributes- und Name-Eigenschaften

  • Beispiel für die BOF-, EOF- und Bookmark-Eigenschaften

  • Beispiel für die CacheSize-Eigenschaft

  • Beispiel für die ConnectionString-, ConnectionTimeout- und State-Eigenschaften

  • Beispiel für die Count-Eigenschaft

  • Beispiel für die CursorType-, LockType- und EditMode-Eigenschaften

  • Beispiel für die Description-, NativeError-, Number-, Source- und SQLState-Eigenschaften

  • Beispiel für die Filter- und RecordCount-Eigenschaften

  • Beispiel für die Handler-Eigenschaft

  • Beispiel für die Index-Eigenschaft und die Seek-Methode

  • Beispiel für die IsolationLevel- und Mode-Eigenschaften

  • Beispiel für die Item-Eigenschaft

  • Beispiel für die MarshalOptions-Eigenschaft

  • Beispiel für die MaxRecords-Eigenschaft

  • Beispiel für die NumericScale- und Precision-Eigenschaften

  • Beispiel für die Optimize-Eigenschaft

  • Beispiel für die OriginalValue- und UnderlyingValue-Eigenschaften

  • Beispiel für die Prepared-Eigenschaft

  • Beispiel für die Provider- und DefaultDatabase-Eigenschaften

  • Beispiel für die Sort-Eigenschaft

  • Beispiel für die Source-Eigenschaft

  • Beispiel für die State-Eigenschaft

  • Beispiel für die Status-Eigenschaft

  • Beispiel für die StayInSync-Eigenschaft

  • Beispiel für die Type-Eigenschaft (Fields)

  • Beispiel für die Type-Eigenschaft (Property)

  • Beispiel für die Value-Eigenschaft

  • Beispiel für die Version-Eigenschaft

Sonstige

  • Beispiel für das ADO-Ereignismodell


Beispiel für das ADO-Ereignismodell (VC++)

Der Visual C++-Bereich der ADO-Ereignis-Instanziierung nach Sprachen enthält eine allgemeine Beschreibung darüber, wie das ADO-Ereignismodell instanziiert wird. Nachstehend finden Sie ein spezielles Beispiel der Instanziierung des Ereignismodells innerhalb der Umgebung, die mithilfe der #import-Anweisung erstellt wird.

Bei der allgemeinen Beschreibung wird die Datei adoint.h als Referenz für Methodensignaturen verwendet. Einige Details in der allgemeinen Beschreibung sind jedoch aufgrund der Verwendung der #import-Anweisung unterschiedlich:

  • Die #import-Anweisung löst typedefs sowie Datentypen und Modifizierer von Methodensignaturen in ihre ursprüngliche Formen auf.

  • Den reinen virtuellen Methoden, die überschrieben werden sollen, muss "raw_" vorangestellt werden.

Einige Bereiche des Codes spiegeln lediglich den Codierungsstil wider.

  • Der von der Advise-Methode verwendete Zeiger auf IUnknown wird mit einem Aufruf von QueryInterface explizit angefordert.

  • Sie müssen einen Destruktor in den Klassendefinitionen nicht explizit kodieren.

  • Möglicherweise möchten Sie stabilere Implementierungen der Methoden QueryInterface, AddRef und Release kodieren.

  • Die __uuidof()-Anweisung wird extensiv verwendet, um Schnittstellen-IDs zu erhalten.

Darüber hinaus verfügt das Beispiel über funktionierende Codes.

  • Das Beispiel wurde als Konsolenanwendung geschrieben.

  • Sie sollten eigenen Code bei dem Kommentar "// Ausführen einiger Aufgaben" einfügen.

  • Sämtliche Ereignishandler führen standardmäßig keine Aktion aus und brechen weitergehende Benachrichtigungen ab. Sie sollten den entsprechenden Code für Ihre Anwendung einfügen und ggf. Benachrichtigungen zulassen.
// eventmodel.cpp : Definiert den Einstiegspunkt für die
// Konsolenanwendung.
//

#import "c:\Programme\Common Files\System\ADO\msado15.dll" \
   no_namespace rename("EOF", "EndOfFile")
#include <comdef.h>
#include <stdio.h>

//----Die Connection-Ereignisse------------------------------------------

class CConnEvent : public ConnectionEventsVt
{
private:
        ULONG   m_cRef;
    public:
        CConnEvent() { m_cRef = 0; };
        ~CConnEvent() {};

        STDMETHODIMP QueryInterface(REFIID riid, void ** ppv);
        STDMETHODIMP_(ULONG) AddRef(void);
        STDMETHODIMP_(ULONG) Release(void);

        STDMETHODIMP raw_InfoMessage(
            struct Error *pError,
            EventStatusEnum *adStatus,
            struct _Connection *pConnection);

        STDMETHODIMP raw_BeginTransComplete(
            LONG TransactionLevel,
            struct Error *pError,
            EventStatusEnum *adStatus,
            struct _Connection *pConnection);

    STDMETHODIMP raw_CommitTransComplete(
            struct Error *pError,
            EventStatusEnum *adStatus,
            struct _Connection *pConnection);

        STDMETHODIMP raw_RollbackTransComplete(
            struct Error *pError,
            EventStatusEnum *adStatus,
            struct _Connection *pConnection);

        STDMETHODIMP raw_WillExecute(
            BSTR *Source,
            CursorTypeEnum *CursorType,
            LockTypeEnum *LockType,
            long *Options,
            EventStatusEnum *adStatus,
            struct _Command *pCommand,
            struct _Recordset *pRecordset,
            struct _Connection *pConnection);

        STDMETHODIMP raw_ExecuteComplete(
            LONG RecordsAffected,
            struct Error *pError,
            EventStatusEnum *adStatus,
            struct _Command *pCommand,
            struct _Recordset *pRecordset,
            struct _Connection *pConnection);

    STDMETHODIMP raw_WillConnect(
            BSTR *ConnectionString,
            BSTR *UserID,
            BSTR *Password,
            long *Options,
            EventStatusEnum *adStatus,
            struct _Connection *pConnection);

        STDMETHODIMP raw_ConnectComplete(
            struct Error *pError,
            EventStatusEnum *adStatus,
            struct _Connection *pConnection);

        STDMETHODIMP raw_Disconnect(
            EventStatusEnum *adStatus,
            struct _Connection *pConnection);
};

//-----Die Recordset-Ereignisse------------------------------------------

class CRstEvent : public RecordsetEventsVt
    {
    private:
        ULONG m_cRef;
    public:
        CRstEvent() { m_cRef = 0; };
        ~CRstEvent() {};

            STDMETHODIMP QueryInterface(REFIID riid, void ** ppv);
            STDMETHODIMP_(ULONG) AddRef(void);
            STDMETHODIMP_(ULONG) Release(void);

            STDMETHODIMP raw_WillChangeField(
            LONG cFields,
            VARIANT Fields,
            EventStatusEnum *adStatus,
            struct _Recordset *pRecordset);

        STDMETHODIMP raw_FieldChangeComplete(
            LONG cFields,
            VARIANT Fields,
            struct Error *pError,
            EventStatusEnum *adStatus,
            struct _Recordset *pRecordset);

        STDMETHODIMP raw_WillChangeRecord(
            EventReasonEnum adReason,
            LONG cRecords,
            EventStatusEnum *adStatus,
            struct _Recordset *pRecordset);

        STDMETHODIMP raw_RecordChangeComplete(
            EventReasonEnum adReason,
            LONG cRecords,
            struct Error *pError,
            EventStatusEnum *adStatus,
            struct _Recordset *pRecordset);

        STDMETHODIMP raw_WillChangeRecordset(
            EventReasonEnum adReason,
            EventStatusEnum *adStatus,
            struct _Recordset *pRecordset);

        STDMETHODIMP raw_RecordsetChangeComplete(
            EventReasonEnum adReason,
            struct Error *pError,
            EventStatusEnum *adStatus,
            struct _Recordset *pRecordset);

        STDMETHODIMP raw_WillMove(
            EventReasonEnum adReason,
            EventStatusEnum *adStatus,
            struct _Recordset *pRecordset);

        STDMETHODIMP raw_MoveComplete(
            EventReasonEnum adReason,
            struct Error *pError,
            EventStatusEnum *adStatus,
            struct _Recordset *pRecordset);

        STDMETHODIMP raw_EndOfRecordset(
            VARIANT_BOOL *fMoreData,
            EventStatusEnum *adStatus,
            struct _Recordset *pRecordset);

        STDMETHODIMP raw_FetchProgress(
            long Progress,
            long MaxProgress,
            EventStatusEnum *adStatus,
            struct _Recordset *pRecordset);

        STDMETHODIMP raw_FetchComplete(
            struct Error *pError,
            EventStatusEnum *adStatus,
            struct _Recordset *pRecordset);
};

//-----Implementieren der Connection-Methoden----------------------------

        STDMETHODIMP CConnEvent::raw_InfoMessage(
            struct Error *pError,
            EventStatusEnum *adStatus,
            struct _Connection *pConnection)
            {
            *adStatus = adStatusUnwantedEvent;
            return S_OK;
            };

        STDMETHODIMP CConnEvent::raw_BeginTransComplete(
            LONG TransactionLevel,
            struct Error *pError,
            EventStatusEnum *adStatus,
            struct _Connection *pConnection)
            {
            *adStatus = adStatusUnwantedEvent;
            return S_OK;
            };

        STDMETHODIMP CConnEvent::raw_CommitTransComplete(
            struct Error *pError,
            EventStatusEnum *adStatus,
            struct _Connection *pConnection)
            {
            *adStatus = adStatusUnwantedEvent;
            return S_OK;
            };

        STDMETHODIMP CConnEvent::raw_RollbackTransComplete(
            struct Error *pError,
            EventStatusEnum *adStatus,
            struct _Connection *pConnection)
            {
            *adStatus = adStatusUnwantedEvent;
            return S_OK;
            };

    STDMETHODIMP CConnEvent::raw_WillExecute(
            BSTR *Source,
            CursorTypeEnum *CursorType,
            LockTypeEnum *LockType,
            long *Options,
            EventStatusEnum *adStatus,
            struct _Command *pCommand,
            struct _Recordset *pRecordset,
            struct _Connection *pConnection)
            {
            *adStatus = adStatusUnwantedEvent;
            return S_OK;
            };

        STDMETHODIMP CConnEvent::raw_ExecuteComplete(
            LONG RecordsAffected,
            struct Error *pError,
            EventStatusEnum *adStatus,
            struct _Command *pCommand,
            struct _Recordset *pRecordset,
            struct _Connection *pConnection)
            {
            *adStatus = adStatusUnwantedEvent;
            return S_OK;
            };

        STDMETHODIMP CConnEvent::raw_WillConnect(
            BSTR *ConnectionString,
            BSTR *UserID,
            BSTR *Password,
            long *Options,
            EventStatusEnum *adStatus,
            struct _Connection *pConnection)
            {
            *adStatus = adStatusUnwantedEvent;
            return S_OK;
            };

        STDMETHODIMP CConnEvent::raw_ConnectComplete(
            struct Error *pError,
            EventStatusEnum *adStatus,
            struct _Connection *pConnection)
            {
            *adStatus = adStatusUnwantedEvent;
            return S_OK;
            };

        STDMETHODIMP CConnEvent::raw_Disconnect(
            EventStatusEnum *adStatus,
            struct _Connection *pConnection)
            {
            *adStatus = adStatusUnwantedEvent;
            return S_OK;
            };

//-----Implementieren der Recordset-Methoden-----------------------------

        STDMETHODIMP CRstEvent::raw_WillChangeField(
            LONG cFields,
            VARIANT Fields,
            EventStatusEnum *adStatus,
            struct _Recordset *pRecordset)
            {
            *adStatus = adStatusUnwantedEvent;
            return S_OK;
            };

        STDMETHODIMP CRstEvent::raw_FieldChangeComplete(
            LONG cFields,
            VARIANT Fields,
            struct Error *pError,
            EventStatusEnum *adStatus,
            struct _Recordset *pRecordset)
            {
            *adStatus = adStatusUnwantedEvent;
            return S_OK;
            };

        STDMETHODIMP CRstEvent::raw_WillChangeRecord(
            EventReasonEnum adReason,
            LONG cRecords,
            EventStatusEnum *adStatus,
            struct _Recordset *pRecordset)
            {
            *adStatus = adStatusUnwantedEvent;
            return S_OK;
            };

        STDMETHODIMP CRstEvent::raw_RecordChangeComplete(
            EventReasonEnum adReason,
            LONG cRecords,
            struct Error *pError,
            EventStatusEnum *adStatus,
            struct _Recordset *pRecordset)
            {
            *adStatus = adStatusUnwantedEvent;
            return S_OK;
            };

        STDMETHODIMP CRstEvent::raw_WillChangeRecordset(
            EventReasonEnum adReason,
            EventStatusEnum *adStatus,
            struct _Recordset *pRecordset)
            {
            *adStatus = adStatusUnwantedEvent;
            return S_OK;
            };

        STDMETHODIMP CRstEvent::raw_RecordsetChangeComplete(
            EventReasonEnum adReason,
            struct Error *pError,
            EventStatusEnum *adStatus,
            struct _Recordset *pRecordset)
            {
            *adStatus = adStatusUnwantedEvent;
            return S_OK;
            };

        STDMETHODIMP CRstEvent::raw_WillMove(
            EventReasonEnum adReason,
            EventStatusEnum *adStatus,
            struct _Recordset *pRecordset)
            {
            *adStatus = adStatusUnwantedEvent;
            return S_OK;
            };

        STDMETHODIMP CRstEvent::raw_MoveComplete(
            EventReasonEnum adReason,
            struct Error *pError,
            EventStatusEnum *adStatus,
            struct _Recordset *pRecordset)
            {
            *adStatus = adStatusUnwantedEvent;
            return S_OK;
            };

        STDMETHODIMP CRstEvent::raw_EndOfRecordset(
            VARIANT_BOOL *fMoreData,
            EventStatusEnum *adStatus,
            struct _Recordset *pRecordset)
            {
            *adStatus = adStatusUnwantedEvent;
            return S_OK;
            };

        STDMETHODIMP CRstEvent::raw_FetchProgress(
            long Progress,
            long MaxProgress,
            EventStatusEnum *adStatus,
            struct _Recordset *pRecordset)
            {
            *adStatus = adStatusUnwantedEvent;
            return S_OK;
            };

        STDMETHODIMP CRstEvent::raw_FetchComplete(
            struct Error *pError,
            EventStatusEnum *adStatus,
            struct _Recordset *pRecordset)
            {
            *adStatus = adStatusUnwantedEvent;
            return S_OK;
            };

//-----Implementieren von QueryInterface, AddRef und Release-------------

    STDMETHODIMP CRstEvent::QueryInterface(REFIID riid, void ** ppv)
    {
        *ppv = NULL;
        if (riid == __uuidof(IUnknown) ||
                 riid == __uuidof(RecordsetEventsVt)) *ppv = this;
        if (*ppv == NULL)
            return ResultFromScode(E_NOINTERFACE);
        AddRef();
        return NOERROR;
    }
    STDMETHODIMP_(ULONG) CRstEvent::AddRef(void) { return ++m_cRef; };
    STDMETHODIMP_(ULONG) CRstEvent::Release()
                                        {
                                        if (0 != --m_cRef) return m_cRef;
                                        delete this;
                                        return 0;
                                        }

    STDMETHODIMP CConnEvent::QueryInterface(REFIID riid, void ** ppv)

    {
        *ppv = NULL;
        if (riid == __uuidof(IUnknown) ||
             riid == __uuidof(ConnectionEventsVt)) *ppv = this;
        if (*ppv == NULL)
            return ResultFromScode(E_NOINTERFACE);
        AddRef();
        return NOERROR;
    }
    STDMETHODIMP_(ULONG) CConnEvent::AddRef() { return ++m_cRef; };
    STDMETHODIMP_(ULONG) CConnEvent::Release()
                                        {
                                        if (0 != --m_cRef) return m_cRef;
                                        delete this;
                                        return 0;
                                        }

//-----Erstellen des Codehauptblocks-------------------------------------

int main(int argc, char* argv[])
{
    HRESULT hr;
    DWORD   dwConnEvt;
    DWORD   dwRstEvt;
    IConnectionPointContainer   *pCPC = NULL;
    IConnectionPoint         *pCP = NULL;
    IUnknown               *pUnk = NULL;
    CRstEvent               *pRstEvent = NULL;
    CConnEvent               *pConnEvent= NULL;
    int                     rc = 0;
    _RecordsetPtr            pRst;
    _ConnectionPtr            pConn;

    ::CoInitialize(NULL);

    hr = pConn.CreateInstance(__uuidof(Connection));
    if (FAILED(hr)) return rc;

    hr = pRst.CreateInstance(__uuidof(Recordset));
    if (FAILED(hr)) return rc;

    // Beginn der Verwendung der Connection-Ereignisse

    hr = pConn->QueryInterface(__uuidof(IConnectionPointContainer),
        (void **)&pCPC);
    if (FAILED(hr)) return rc;
    hr = pCPC->FindConnectionPoint(__uuidof(ConnectionEvents), &pCP);
    pCPC->Release();
    if (FAILED(hr)) return rc;

    pConnEvent = new CConnEvent();
    hr = pConnEvent->QueryInterface(__uuidof(IUnknown), (void **) &pUnk);
    if (FAILED(hr)) return rc;
    hr = pCP->Advise(pUnk, &dwConnEvt);
    pCP->Release();
    if (FAILED(hr)) return rc;

    // Beginn der Verwendung der Recordset-Ereignisse

    hr = pRst->QueryInterface(__uuidof(IConnectionPointContainer),
        (void **)&pCPC);
    if (FAILED(hr)) return rc;
    hr = pCPC->FindConnectionPoint(__uuidof(RecordsetEvents), &pCP);
    pCPC->Release();
    if (FAILED(hr)) return rc;

    pRstEvent = new CRstEvent();
    hr = pRstEvent->QueryInterface(__uuidof(IUnknown), (void **) &pUnk);
    if (FAILED(hr)) return rc;
    hr = pCP->Advise(pUnk, &dwRstEvt);
    pCP->Release();
    if (FAILED(hr)) return rc;

    // Ausführen einiger Aufgaben

    pConn->Open("dsn=Pubs;", "sa", "", adConnectUnspecified);
    pRst->Open("SELECT * FROM authors", (IDispatch *) pConn,
            adOpenStatic, adLockReadOnly, adCmdText);
    pRst->MoveFirst();
    while (pRst->EndOfFile == FALSE)
    {
        wprintf(L"Name = '%s'\n", (wchar_t*)
            ((_bstr_t) pRst->Fields->GetItem("au_lname")->Value));
        pRst->MoveNext();
    }

    pRst->Close();
    pConn->Close();

    // Beenden der Verwendung der Connection-Ereignisse

    hr = pConn->QueryInterface(__uuidof(IConnectionPointContainer),
        (void **) &pCPC);
    if (FAILED(hr)) return rc;
    hr = pCPC->FindConnectionPoint(__uuidof(ConnectionEvents), &pCP);
    pCPC->Release();
    if (FAILED(hr)) return rc;
    hr = pCP->Unadvise( dwConnEvt );
    pCP->Release();
    if (FAILED(hr)) return rc;

    // Beenden der Verwendung der Recordset-Ereignisse
    hr = pRst->QueryInterface(__uuidof(IConnectionPointContainer),
        (void **) &pCPC);
    if (FAILED(hr)) return rc;
    hr = pCPC->FindConnectionPoint(__uuidof(RecordsetEvents), &pCP);
    pCPC->Release();
    if (FAILED(hr)) return rc;
    hr = pCP->Unadvise( dwRstEvt );
    pCP->Release();
    if (FAILED(hr)) return rc;

    CoUninitialize();
    return 1;
}


Beispiel für die AbsolutePage-, PageCount- und PageSize-Eigenschaften (VC++)

In diesem Beispiel werden die Eigenschaften AbsolutePage, PageCount und PageSize verwendet, um fünf Datensätze mit Namen und Angaben zur Anstellung aus der Employees-Tabelle gleichzeitig anzuzeigen.

#import "C:\Programme\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <stdio.h>
#include <ole2.h>
#include "conio.h"
#include "AbsolutepageX.h"

// Funktionsdeklarationen.
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void AbsolutePageX(void);
void PrintProviderError(_ConnectionPtr pConnection);

///////////////////////////////////////////////////////////
//                                                       //
//      Hauptfunktion                                    //
//                                                       //
///////////////////////////////////////////////////////////
void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    AbsolutePageX();

    ::CoUninitialize();
}

/////////////////////////////////////////////////////////////
//                                                         //
//      AbsolutePageX-Funktion                             //
//                                                         //
/////////////////////////////////////////////////////////////

void AbsolutePageX(void)
{

    // Definieren der ADO-Objektzeiger.
    // Initialisieren der Zeiger bei der Definition.
    // Sie befinden sich im ADODB::-Namespace.
    _RecordsetPtr   pRstEmployees   = NULL;

    // Definieren anderer Variablen.
    // Deklaration des Schnittstellenzeigers.(VC++-Erweiterungen)
    IADORecordBinding   *picRs = NULL;
    CEmployeeRs emprs;          // C++-Klassenobjekt.
    HRESULT hr = S_OK;
    _bstr_t strMessage;

    // Öffnen eines Recordsets mit einem Clientcursor
    // für die Employees-Tabelle.

    _bstr_t strCnn("Provider=sqloledb;Data Source=srv;"
        "Initial Catalog=Pubs;User Id=sa;Password=;");

    try
    {
        // Öffnen eines Recordsets.
        TESTHR(pRstEmployees.CreateInstance(__uuidof(Recordset)));

        // Verwenden des Clientcursors zum Aktivieren der
        // AbsolutePosition-Eigenschaft.
        pRstEmployees->CursorLocation = adUseClient;

        // Sie müssen den Cursorstandardtyp und LockType
        // hier explizit an das Recordset übergeben.
        TESTHR(hr =    pRstEmployees->Open("employee",
            strCnn,adOpenForwardOnly,adLockReadOnly,adCmdTable));

        // Öffnen eines IADORecordBinding-Schnittstellenzeigers, der für
        // die Bindung eines Recordsets an eine Klasse verwendet wird.
        TESTHR(pRstEmployees->QueryInterface
            (__uuidof(IADORecordBinding), (LPVOID*)&picRs));

        // Binden des Recordsets an eine C++-Klasse.
        TESTHR(picRs->BindToRecordset(&emprs));

        // Anzeigen der Namen und Einstellungsdaten in jeweils fünf
        // Datensätzen.
        pRstEmployees->PageSize = 5;

        int intPageCount = pRstEmployees->PageCount;

        for(int intPage=1;intPage<=intPageCount;intPage++)
        {
            pRstEmployees->put_AbsolutePage((enum PositionEnum)intPage);
            strMessage = "";

            for(int intRecord=1;
                intRecord<=pRstEmployees->PageSize;intRecord++)
            {
                printf("\t%s %s %.10s\n",
                    emprs.lau_fnameStatus == adFldOK ?
                    emprs.m_szau_fname : "<NULL>",
                    emprs.lau_lnameStatus == adFldOK ?
                    emprs.m_szau_lname : "<NULL>",
                    emprs.lau_hiredateStatus == adFldOK ?
                    emprs.m_szau_hiredate : "<NULL>");

                pRstEmployees->MoveNext();

                if(pRstEmployees->EndOfFile)
                    break;
                }

            printf("\n Press any key to continue...");getch();

            // Löschen des Bildschirms für die nächste Anzeige.
            system("cls");
        }

        // Löschen der Objekte vor dem Beenden.
        pRstEmployees->Close();

        // Freigeben der IADORecordset-Schnittstelle.
        if (picRs)
            picRs->Release();
    }

    catch(_com_error &e)
    {
        // Benachrichtigen des Benutzers über Fehler, falls vorhanden.
        _variant_t vtConnect = pRstEmployees->GetActiveConnection();

        // GetActiveConnection gibt die Verbindungszeichenfolge zurück,
        // wenn die Verbindung nicht geöffnet ist; andernfalls wird das
        // Connection-Objekt zurückgegeben.
        switch(vtConnect.vt)
        {
            case VT_BSTR:
                printf("Error:\n");
                printf("Code = %08lx\n", e.Error());
                printf("Message = %s\n", e.ErrorMessage());
                printf("Source = %s\n", (LPCSTR) e.Source());
                printf("Description = %s\n", (LPCSTR) e.Description());
                break;
            case VT_DISPATCH:
                PrintProviderError(vtConnect);
                break;
            default:
                printf("Errors occured.");
                break;
        }
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintProviderError-Funktion                      //
//                                                       //
///////////////////////////////////////////////////////////

void PrintProviderError(_ConnectionPtr pConnection)
{
    // Drucken der Providerfehler aus dem Connection-Objekt.
    // pErr ist ein Recordset-Objekt in der Errors-Auflistung der
    // Verbindung.
    ErrorPtr  pErr  = NULL;

    if( (pConnection->Errors->Count) > 0)
    {
        long nCount = pConnection->Errors->Count;
        // Gültigkeitsbereich für Collection ist 0 bis nCount -1.
        printf("Error:\n");
        for(long iError = 0; iError < nCount; iError++)
        {
            pErr = pConnection->Errors->GetItem(iError);
            printf("\t Error number: %x\t%s\n", pErr->Number,
                (LPCSTR) pErr->Description);
        }
    }
}

AbsolutePageX.h:

#include "icrsint.h"

// Diese Klasse extrahiert nur fname, lastname und hire_date.

class CEmployeeRs : public CADORecordBinding
{
BEGIN_ADO_BINDING(CEmployeeRs)

    // Die Spalte fname ist das zweite Feld in der Tabelle.
    ADO_VARIABLE_LENGTH_ENTRY2(2, adVarChar, m_szau_fname,
        sizeof(m_szau_fname), lau_fnameStatus, FALSE)

    ADO_VARIABLE_LENGTH_ENTRY2(4, adVarChar, m_szau_lname,
        sizeof(m_szau_lname), lau_lnameStatus, TRUE)

    ADO_VARIABLE_LENGTH_ENTRY2(8, adVarChar, m_szau_hiredate,
        sizeof(m_szau_hiredate), lau_hiredateStatus, TRUE)

END_ADO_BINDING()

public:
    CHAR   m_szau_lname[41];
    ULONG  lau_lnameStatus;
    CHAR   m_szau_fname[41];
    ULONG  lau_fnameStatus;
    CHAR   m_szau_hiredate[40];
    ULONG  lau_hiredateStatus;
};


Beispiel für die AbsolutePosition- und CursorLocation-Eigenschaften (VC++)

In diesem Beispiel wird gezeigt, wie mit der AbsolutePosition-Eigenschaft der Fortschritt einer Schleife überwacht werden kann, die alle Datensätze eines Recordset-Objekts aufzählt. Dabei wird zum Aktivieren der AbsolutePosition-Eigenschaft die CursorLocation-Eigenschaft verwendet, indem der Cursor auf einen Clientcursor gesetzt wird.

#import "C:\Programme\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <ole2.h>
#include <stdio.h>
#include "conio.h"
#include "AbsolutePositionX.h"

// Funktionsdeklarationen
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void AbsolutePositionX(void);
void AbsolutePosition2X(void);
void PrintProviderError(_ConnectionPtr pConnection);

///////////////////////////////////////////////////////////
//                                                       //
//      Hauptfunktion                                    //
//                                                       //
///////////////////////////////////////////////////////////
void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    AbsolutePositionX();

    // Löschen des Bildschirms für die nächste Anzeige.
    printf("Press any key to continue...");
    getch();
    system("cls");

    AbsolutePosition2X();
    ::CoUninitialize();
}

///////////////////////////////////////////////////////////
//                                                       //
//      AbsolutePositionX-Funktion                       //
//                                                       //
///////////////////////////////////////////////////////////

void AbsolutePositionX(void)
{
    HRESULT hr = S_OK;

    // Definieren der ADO-Objektzeiger.
    // Initialisieren der Zeiger bei der Definition.
    // Sie befinden sich im ADODB::-Namespace.
    _RecordsetPtr  pRstEmployees  = NULL;

    // Definieren anderer Variablen.
    // Deklarieren der Schnittstellenzeiger.(VC++-Erweiterungen)
    IADORecordBinding *picRs = NULL;
    CEmployeeRs emprs;                  // C++-Klassenobjekt.
    _bstr_t strMessage;
    char chKey;

    // Öffnen eines Recordsets mit einem Clientcursor
    // für die Employees-Tabelle.

    _bstr_t strCnn("Provider=sqloledb;Data Source=srv;"
        "Initial Catalog=Pubs;User Id=sa;Password=;");

    try
    {
        // Öffnen eines Recordsets.
        TESTHR(pRstEmployees.CreateInstance(__uuidof(Recordset)));

        // Verwenden des Clientcursors zum Aktivieren der
        // AbsolutePosition-Eigenschaft.
        pRstEmployees->CursorLocation = adUseClient;

        // Sie müssen den Cursorstandardtyp und LockType
        // hier explizit an das Recordset übergeben.
        TESTHR(pRstEmployees->Open("employee",
        strCnn,adOpenForwardOnly,adLockReadOnly,adCmdTable));

        // Öffnen eines IADORecordBinding-Schnittstellenzeigers, der für
        // die Bindung eines Recordsets an eine Klasse verwendet wird.
        TESTHR(pRstEmployees->QueryInterface(
            __uuidof(IADORecordBinding),(LPVOID*)&picRs));

        // Binden des Recordsets an eine C++-Klasse.
        TESTHR(picRs->BindToRecordset(&emprs));

        strMessage= "";

        // Aufzählen des Recordsets.
        do
        {
            // Anzeigen von Informationen zum aktuellen Datensatz.
            printf("Employee : %s \n record %ld of %d",
                emprs.lau_lnameStatus == adFldOK ?
                emprs.m_szau_lname : "<NULL>",
                pRstEmployees->AbsolutePosition,
                    pRstEmployees->RecordCount);

            printf("\nContinue?(y/n)  :");

            do
            {
                chKey = getch();
            }while(chKey != 'y' && chKey !='n');

            // Löschen des Bildschirms für die nächste Anzeige.
            system("cls");

            if(chKey == 'n')
                break;

            strMessage = "";
            pRstEmployees->MoveNext();
        }while(!(pRstEmployees->EndOfFile));

        // Löschen der Objekte vor dem Beenden.
        pRstEmployees->Close();

        // Freigeben der IADORecordset-Schnittstelle.
        if (picRs)
            picRs->Release();
    }

    catch(_com_error &e)
    {
        // Benachrichtigen des Benutzers über Fehler, falls vorhanden.
        _bstr_t bstrSource(e.Source());
        _bstr_t bstrDescription(e.Description());

        PrintProviderError(pRstEmployees->GetActiveConnection());
        printf("Source : %s \n  Description : %s \n",
            (LPCSTR)bstrSource,(LPCSTR)bstrDescription);
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      AbsolutePosition2X-Funktion                      //
//                                                       //
///////////////////////////////////////////////////////////

void AbsolutePosition2X(void)
{
    HRESULT hr = S_OK;

    // Definieren der ADO-Objektzeiger.
    // Initialisieren der Zeiger bei der Definition.
    // Sie befinden sich im ADODB::-Namespace.
    _RecordsetPtr  pRstEmployees  = NULL;

    // Definieren anderer Variablen.
    // Deklaration des Schnittstellenzeigers.(VC++-Erweiterungen)
    IADORecordBinding *picRs = NULL;
    CEmployeeRs emprs;                  // C++-Klassenobjekt.
    _bstr_t strMessage;
    char chKey;

    // Öffnen eines Recordsets mit einem Clientcursor
    // für die Employees-Tabelle.

    _bstr_t strCnn("Provider=sqloledb;Data Source=dhale1;"
        "Initial Catalog=Pubs;User Id=sa;Password=;");

    try
    {
        // Öffnen eines Recordsets.
        TESTHR(pRstEmployees.CreateInstance(__uuidof(Recordset)));

        // Verwenden des Clientcursors zum Aktivieren der
        // AbsolutePosition-Eigenschaft.
        pRstEmployees->CursorLocation = adUseClient;

        // Sie müssen den Cursorstandardtyp und LockType
        // hier explizit an das Recordset übergeben.
        TESTHR(pRstEmployees->Open("employee",
          strCnn,adOpenStatic,adLockReadOnly,adCmdTable));

        // Öffnen eines IADORecordBinding-Schnittstellenzeigers, der für
        // die Bindung eines Recordsets an eine Klasse verwendet wird.
        TESTHR(pRstEmployees->QueryInterface(
            __uuidof(IADORecordBinding),(LPVOID*)&picRs));

        // Binden des Recordsets an eine C++-Klasse.
        TESTHR(picRs->BindToRecordset(&emprs));

        long lGoToPos = 21;

        pRstEmployees->AbsolutePosition = (PositionEnum)lGoToPos;

        // Anzeigen von Informationen zum aktuellen Datensatz.
        printf("Employee : %s \n record %ld of %d",
            emprs.lau_lnameStatus == adFldOK ? emprs.m_szau_lname :
            "<NULL>", pRstEmployees->AbsolutePosition,
            pRstEmployees->RecordCount);

        printf("\nPress any key to continue:");
        getch();

        // Löschen der Objekte vor dem Beenden.
        pRstEmployees->Close();

        // Freigeben der IADORecordset-Schnittstelle.
        if (picRs)
            picRs->Release();
    }

    catch(_com_error &e)
    {
        // Benachrichtigen des Benutzers über Fehler, falls vorhanden.
        _variant_t vtConnect = pRstEmployees->GetActiveConnection();

        // GetActiveConnection gibt die Verbindungszeichenfolge zurück,
        // wenn die Verbindung nicht geöffnet ist; andernfalls wird das
        // Connection-Objekt zurückgegeben.
        switch(vtConnect.vt)
        {
            case VT_BSTR:
                printf("Error:\n");
                printf("Code = %08lx\n", e.Error());
                printf("Message = %s\n", e.ErrorMessage());
                printf("Source = %s\n", (LPCSTR) e.Source());
                printf("Description = %s\n", (LPCSTR) e.Description());
                break;
            case VT_DISPATCH:
                PrintProviderError(vtConnect);
                break;
            default:
                printf("Errors occured.");
                break;
        }
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintProviderError-Funktion                      //
//                                                       //
///////////////////////////////////////////////////////////

void PrintProviderError(_ConnectionPtr pConnection)
{
    // Drucken der Providerfehler aus dem Connection-Objekt.
    // pErr ist ein Recordset-Objekt in der Errors-Auflistung der
    // Verbindung.
    ErrorPtr    pErr  = NULL;
    long      nCount  = 0;
    long      i     = 0;

    if( (pConnection->Errors->Count) > 0)
    {
        nCount = pConnection->Errors->Count;
        // Gültigkeitsbereich für Collection ist 0 bis nCount -1.
        for(i = 0; i < nCount; i++)
        {
            pErr = pConnection->Errors->GetItem(i);
            printf("\t Error number: %x\t%s",
                pErr->Number,(LPCSTR) pErr->Description);
        }
    }
}

AbsolutePositionX.h:

#include <ole2.h>
#include <stdio.h>
#include "icrsint.h"

// Diese Klasse extrahiert den Nachnamen.

class CEmployeeRs : public CADORecordBinding
{
BEGIN_ADO_BINDING(CEmployeeRs)

   // Spalte lname ist das vierte Feld im Recordset.
   ADO_VARIABLE_LENGTH_ENTRY2(4, adVarChar, m_szau_lname,
         sizeof(m_szau_lname), lau_lnameStatus, TRUE)

END_ADO_BINDING()

public:
   CHAR   m_szau_lname[41];
   ULONG  lau_lnameStatus;
};


Beispiel für die ActiveCommand-Eigenschaft (VC++)

Dieses Beispiel verdeutlicht die ActiveCommand-Eigenschaft.

Dabei wird einer Unterroutine ein Recordset-Objekt übergeben, dessen ActiveCommand-Eigenschaft verwendet wird, um den Befehlstext und -parameter darzustellen, die das Recordset-Objekt erstellt haben.

#import "C:\Programme\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <ole2.h>
#include <stdio.h>
#include <conio.h>
#include "ActiveCommandX.h"

// Funktionsdeklarationen
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void ActiveCommandX(void);
void ActiveCommandXprint(_RecordsetPtr    pRst);
void PrintProviderError(_ConnectionPtr pConnection);
void PrintComError(_com_error &e);

//////////////////////////////////////////////////////////
//                                                      //
//        Hauptfunktion                                 //
//                                                      //
//////////////////////////////////////////////////////////

void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    ActiveCommandX();

    ::CoUninitialize();
}

//////////////////////////////////////////////////////////
//                                                      //
//            ActiveCommandX-Funktion                   //
//                                                      //
//////////////////////////////////////////////////////////

void ActiveCommandX(void)
{
    HRESULT    hr = S_OK;

    // Definieren der ADO-Objektzeiger.
    // Initialisieren der Zeiger bei der Definition.
    // Sie befinden sich im ADODB::-Namespace.
    _ConnectionPtr  pConnection      = NULL;
    _CommandPtr    pCmd      = NULL;
    _RecordsetPtr  pRstAuthors    = NULL;

    // Definieren anderer Variablen.
    _bstr_t  strCnn("Provider=SQLOLEDB;Data Source=srv;„
                 “Initial Catalog=Pubs;User Id=sa;Password=;");
    _bstr_t  strName;
    CHAR strcharName[50];

    try
    {
        // Öffnen der Verbindung.
        TESTHR(pConnection.CreateInstance(__uuidof(Connection)));
        TESTHR(pRstAuthors.CreateInstance(__uuidof(Recordset)));
        TESTHR(pCmd.CreateInstance(__uuidof(Command)));

        printf("ActiveCommandX Example\n\n");
        printf("Enter an author's name (e.g., Ringer): ");
        gets(strcharName);
        char *tempStr = strtok(strcharName, " \t");
        strName = tempStr;

        pCmd->CommandText = "SELECT * FROM authors WHERE au_lname = ?";
        pCmd->Parameters->Append(pCmd->CreateParameter("LastName",
            adChar, adParamInput, 20, strName));

        pConnection->Open (strCnn, "", "", NULL);

        pCmd->PutActiveConnection(_variant_t((IDispatch*)pConnection));

        pRstAuthors = pCmd->Execute(NULL,NULL,adCmdText);

        ActiveCommandXprint(pRstAuthors);

        // Löschen der Objekte vor dem Beenden.
        pRstAuthors->Close();
        pConnection->Close();
    }

    catch(_com_error &e)
    {
        // Benachrichtigen des Benutzers über Fehler, falls vorhanden.
        // Übergeben eines Verbindungszeigers, auf den vom Recordset aus
        // zugegriffen wird.
        PrintProviderError(pConnection);
        PrintComError(e);
    }
}

//////////////////////////////////////////////////////////
//                                                      //
//              ActiveCommandXprint-Funktion            //
//                                                      //
//////////////////////////////////////////////////////////

void ActiveCommandXprint(_RecordsetPtr    pRst = NULL)
{
    // Variablendeklaraion & -initialisierung.
    IADORecordBinding   *picRs  = NULL;  // Deklaration des
                                   // Schnittstellenzeigers.
    CAuthorsRs autrs;                    //C++-Klassenobjekt.
    HRESULT hr;
    bstr_t strName;

        // Öffnen eines IADORecordBinding-Schnittstellenzeigers, der für
        // die Bindung eines Recordsets an eine Klasse verwendet wird.
    TESTHR(pRst->QueryInterface(
        __uuidof(IADORecordBinding),(LPVOID*)&picRs));

        // Binden des Recordsets an eine C++-Klasse.
    TESTHR(picRs->BindToRecordset(&autrs));

    strName = ((_CommandPtr)pRst->GetActiveCommand())->
                  GetParameters()->GetItem("LastName")->Value;

    printf("Command text = '%s'\n",
        (LPCSTR)((_CommandPtr)pRst->GetActiveCommand())->CommandText);

    printf("Parameter = '%s'\n", (LPCSTR)strName);

    if (pRst->BOF)
        printf("Name = '%s'not found.", (LPCSTR)strName);
    else
    {
        printf ("Name = '%s  %s' author ID = '%s'",
          autrs.lau_fnameStatus == adFldOK ? autrs.m_au_fname : "<NULL>",
          autrs.lau_lnameStatus == adFldOK ? autrs.m_au_lname : "<NULL>",
          autrs.lau_idStatus == adFldOK ? autrs.m_au_id : "<NULL>");
    }

    // Freigeben der IADORecordset-Schnittstelle.
    if (picRs)
        picRs->Release();
}

//////////////////////////////////////////////////////////
//                                                      //
//        PrintProviderError-Funktion                   //
//                                                      //
//////////////////////////////////////////////////////////

void PrintProviderError(_ConnectionPtr pConnection)
{
    // Drucken der Providerfehler aus dem Connection-Objekt.
    // pErr ist ein Recordset-Objekt in der Errors-Auflistung der
    // Verbindung.
    ErrorPtr  pErr  = NULL;
    long      nCount  = 0;
    long      i     = 0;

    if( (pConnection->Errors->Count) > 0)
    {
        nCount = pConnection->Errors->Count;
        // Gültigkeitsbereich für Collection ist 0 bis nCount -1.
        for(i = 0; i < nCount; i++)
        {
            pErr = pConnection->Errors->GetItem(i);
            printf("Error number: %x\t%s\n",
                pErr->Number, (LPCSTR)pErr->Description);
        }
    }
}

//////////////////////////////////////////////////////////
//                                                      //
//       PrintComError-Funktion                         //
//                                                      //
//////////////////////////////////////////////////////////

void PrintComError(_com_error &e)
{
    _bstr_t bstrSource(e.Source());
    _bstr_t bstrDescription(e.Description());

    // Aus COM stammende Fehler drucken.
    printf("\nError\n");
    printf("\tCode = %08lx\n", e.Error());
    printf("\tCode meaning = %s\n", e.ErrorMessage());
    printf("\tSource = %s\n", (LPCSTR) bstrSource);
    printf("\tDescription = %s\n", (LPCSTR) bstrDescription);
}

ActiveCommandX.h

#include "icrsint.h"

// Diese Klasse extrahiert id, fname und lname aus der Authors-Tabelle.

class CAuthorsRs : public CADORecordBinding
{
BEGIN_ADO_BINDING(CAuthorsRs)

    // Die Spalte au_id ist das erste Feld im Recordset.
    ADO_VARIABLE_LENGTH_ENTRY2(1, adVarChar, m_au_id,
         sizeof(m_au_id), lau_idStatus, TRUE)

    // Die Spalte au_fname ist das zweite Feld im Recordset.
    ADO_VARIABLE_LENGTH_ENTRY2(2, adVarChar, m_au_fname,
         sizeof(m_au_fname), lau_fnameStatus, TRUE)

    // Die Spalte au_lname ist das dritte Feld im Recordset.
    ADO_VARIABLE_LENGTH_ENTRY2(3, adVarChar, m_au_lname,
         sizeof(m_au_lname), lau_lnameStatus, TRUE)

END_ADO_BINDING()

public:

    char     m_au_id[21];
    ULONG    lau_idStatus;
    char     m_au_fname[41];
    ULONG    lau_fnameStatus;
    char     m_au_lname[41];
    ULONG    lau_lnameStatus;
};


Beispiel für die ActiveConnection-, CommandText-, CommandTimeout-, CommandType-, Size- und Direction-Eigenschaften (VC++)

In diesem Beispiel werden die Eigenschaften ActiveConnection, CommandText, CommandTimeout, CommandType, Size und Direction verwendet, um eine gespeicherte Prozedur auszuführen.

#import "C:\Programme\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <stdio.h>
#include <ole2.h>
#include "conio.h"
#include "ActiveConnectionX.h"

// Funktionsdeklaration
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void ActiveConnectionX(void);
void PrintProviderError(_ConnectionPtr pConnection);

///////////////////////////////////////////////////////////
//                                                       //
//      Hauptfunktion                                    //
//                                                       //
///////////////////////////////////////////////////////////
void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    ActiveConnectionX();

    ::CoUninitialize();
}

///////////////////////////////////////////////////////////
//                                                       //
//      ActiveConnectionX-Funktion                       //
//                                                       //
///////////////////////////////////////////////////////////

void ActiveConnectionX(void)
{
    HRESULT hr = S_OK;

    // Definieren der ADO-Objektzeiger.
    // Initialisieren der Zeiger bei der Definition.
    // Sie befinden sich im ADODB::-Namespace.
    _ConnectionPtr  pConnection    = NULL;
    _CommandPtr     pCmdByRoyalty  = NULL;
    _RecordsetPtr   pRstByRoyalty  = NULL;
    _RecordsetPtr   pRstAuthors    = NULL;
    _ParameterPtr   pPrmByRoyalty  = NULL;

    // Definieren anderer Variablen.
    IADORecordBinding   *picRs = NULL; // Deklaration des
                                 // Schnittstellenzeigers.
    CEmployeeRs emprs;                 // C++-Klassenobjekt.
    int intRoyalty;
    VARIANT vtroyal;
    _bstr_t strAuthorId;

    _bstr_t strCnn("Provider=sqloledb;Data Source=srv;"
        "Initial Catalog=Pubs;User Id=sa;Password=;");

try
    {
    // Definieren eines Command-Objekts für eine gespeicherte Prozedur.

    TESTHR(pConnection.CreateInstance(__uuidof(Connection)));
    hr = pConnection->Open(strCnn,"","",NULL);

    TESTHR(pCmdByRoyalty.CreateInstance(__uuidof(Command)));

    pCmdByRoyalty->ActiveConnection = pConnection;
    pCmdByRoyalty->CommandText = "byRoyalty";
    pCmdByRoyalty->CommandType = adCmdStoredProc;
    pCmdByRoyalty->CommandTimeout = 15;

    // Definieren der Eingabeparameter der gespeicherten Prozedur.
    printf("Enter Royalty :  ");
    scanf("%d",&intRoyalty);

    // Zuweisen eines Ganzzahlwertes.
    vtroyal.vt = VT_I2;
    vtroyal.iVal  = intRoyalty;

    TESTHR(pPrmByRoyalty.CreateInstance(__uuidof(Parameter)));
    pPrmByRoyalty->Type = adInteger;
    pPrmByRoyalty->Size = 3;
    pPrmByRoyalty->Direction = adParamInput;
    pPrmByRoyalty->Value = vtroyal;
    pCmdByRoyalty->Parameters->Append(pPrmByRoyalty);

    // Erstellen eines Recordsets durch Ausführen eines Befehls.
    pRstByRoyalty = pCmdByRoyalty->Execute(NULL,NULL,adCmdStoredProc);

    // Öffnen der Authors-Tabelle, um Autorennamen für die Anzeige
    // abzurufen.

    TESTHR(pRstAuthors.CreateInstance(__uuidof(Recordset)));
    hr = pRstAuthors->Open("authors",
        strCnn,adOpenForwardOnly,adLockReadOnly,adCmdTable);

        // Öffnen eines IADORecordBinding-Schnittstellenzeigers, der für
        // die Bindung eines Recordsets an eine Klasse verwendet wird.
    TESTHR(pRstAuthors->QueryInterface(
            __uuidof(IADORecordBinding),(LPVOID*)&picRs));

        // Binden des Recordsets an eine C++-Klasse.
    TESTHR(picRs->BindToRecordset(&emprs));

    // Aktuelle Daten im Recordset unter Hinzufügen der Autorennamen aus
    // der Authors-Tabelle drucken.
    printf("Authors With %d Percent Royalty",intRoyalty);

    while(!(pRstByRoyalty->EndOfFile))
    {
        strAuthorId = pRstByRoyalty->Fields->Item["au_id"]->Value;
        pRstAuthors->Filter = "au_id = '"+strAuthorId+"'";
        printf("\n\t%s, %s %s",
           emprs.lau_idStatus == adFldOK ? emprs.m_szau_id : "<NULL>",
           emprs.lau_fnameStatus == adFldOK ? emprs.m_szau_fname :
           "<NULL>",
           emprs.lau_lnameStatus == adFldOK ? emprs.m_szau_lname :
           "<NULL>");
        pRstByRoyalty->MoveNext();
    }

    // Löschen der Objekte vor dem Beenden.
    pRstByRoyalty->Close();
    pRstAuthors->Close();

        // Freigeben der IADORecordset-Schnittstelle.
    if (picRs)
        picRs->Release();
        pConnection->Close();
    }

catch(_com_error &e)
    {
        // Benachrichtigen des Benutzers über Fehler, falls vorhanden.
        _bstr_t bstrSource(e.Source());
        _bstr_t bstrDescription(e.Description());

        PrintProviderError(pConnection);
        printf("Source : %s \n Description : %s
            \n",(LPCSTR)bstrSource,(LPCSTR)bstrDescription);
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintProviderError-Funktion                      //
//                                                       //
///////////////////////////////////////////////////////////

void PrintProviderError(_ConnectionPtr pConnection)
{
    // Drucken der Providerfehler aus dem Connection-Objekt.
    // pErr ist ein Recordset-Objekt in der Errors-Auflistung der
    // Verbindung.
    ErrorPtr  pErr  = NULL;
    long      nCount  = 0;
    long      i     = 0;

    if( (pConnection->Errors->Count) > 0)
    {
        nCount = pConnection->Errors->Count;
        // Gültigkeitsbereich für Collection ist 0 bis nCount -1.
        for(i = 0; i < nCount; i++)
        {
            pErr = pConnection->Errors->GetItem(i);
            printf("Error number: %x\t%s", pErr->Number,
                (LPCSTR)pErr->Description);
        }
    }
}

ActiveConnectionX.h:

#include "icrsint.h"

// Diese Klasse extrahiert fname und lastname.

class CEmployeeRs : public CADORecordBinding
{
BEGIN_ADO_BINDING(CEmployeeRs)

    // Die Spalte au_id ist das erste Feld im Recordset.
    ADO_VARIABLE_LENGTH_ENTRY2(1, adVarChar, m_szau_id,
         sizeof(m_szau_id), lau_idStatus, TRUE)

    ADO_VARIABLE_LENGTH_ENTRY2(2, adVarChar, m_szau_lname,
         sizeof(m_szau_lname), lau_lnameStatus, TRUE)

    ADO_VARIABLE_LENGTH_ENTRY2(3, adVarChar, m_szau_fname,
         sizeof(m_szau_fname), lau_fnameStatus, TRUE)

END_ADO_BINDING()

public:

    CHAR m_szau_id[20];
    ULONG lau_idStatus;

    CHAR m_szau_fname[40];
    ULONG lau_fnameStatus;

    CHAR   m_szau_lname[40];
    ULONG  lau_lnameStatus;
};


Beispiel für ActualSize- und DefinedSize-Eigenschaften (VC++)

In diesem Beispiel werden die Eigenschaften ActualSize und DefinedSize verwendet, um die definierte und die tatsächliche Feldgröße anzuzeigen.

#import "C:\Programme\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <ole2.h>
#include <stdio.h>
#include "conio.h"

// Funktionsdeklarationen
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void ActualSizeX(void);
void PrintProviderError(_ConnectionPtr pConnection);

///////////////////////////////////////////////////////////
//                                                       //
//      Hauptfunktion                                    //
//                                                       //
///////////////////////////////////////////////////////////
void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    ActualSizeX();

    ::CoUninitialize();
}

///////////////////////////////////////////////////////////
//                                                       //
//      ActualSizeX-Funktion                             //
//                                                       //
///////////////////////////////////////////////////////////
void    ActualSizeX(void)
{
    HRESULT hr = S_OK;

    // Definieren der ADO-Objektzeiger.
    // Initialisieren der Zeiger bei der Definition.
    // Sie befinden sich im ADODB::-Namespace.
    _RecordsetPtr pRstStores = NULL;

    // Definieren anderer Variablen.
    _bstr_t strMessage;
    _bstr_t strCnn("Provider=sqloledb;Data Source=srv;"
        "Initial Catalog=Pubs;User Id=sa;Password=;");

    try
    {
        // Öffnen eines Recordsets für die stores-Tabelle.
        TESTHR(pRstStores.CreateInstance(__uuidof(Recordset)));

        // Sie müssen den Cursorstandardtyp und LockType
        // hier explizit an das Recordset übergeben.
        hr = pRstStores->Open("stores",
                strCnn,adOpenForwardOnly,adLockReadOnly,adCmdTable);

        // Schleife durch das Recordset und Anzeigen des Inhalts des
        // Feldes stor_name field, der definierten Größe des Feldes
        // und seiner tatsächlichen Größe.

        pRstStores->MoveFirst();

        while(!(pRstStores->EndOfFile))
        {
            strMessage = "Store Name: ";
            strMessage += (_bstr_t)pRstStores->Fields->
                             Item["stor_name"]->Value + "\n";
            strMessage += "Defined Size: ";
            strMessage += (_bstr_t)pRstStores->Fields->
                             Item["stor_name"]->DefinedSize + "\n";
            strMessage += "Actual Size: ";
            strMessage += (_bstr_t) pRstStores->Fields->
                             Item["stor_name"]->ActualSize + "\n";

            printf("%s\n",(LPCSTR)strMessage);
            printf("Press any key to continue...");
            getch();
            // Löschen des Bildschirms für die nächste Anzeige.
            system("cls");
            pRstStores->MoveNext();
        }

        // Löschen der Objekte vor dem Beenden.
    pRstStores->Close();
    }

    catch(_com_error &e)
    {
        _variant_t vtConnect = pRstStores->GetActiveConnection();

        // GetActiveConnection gibt die Verbindungszeichenfolge zurück,
        // wenn die Verbindung nicht geöffnet ist; andernfalls wird das
        // Connection-Objekt zurückgegeben.
        switch(vtConnect.vt)
        {
        case VT_BSTR:
                printf("Error:\n");
                printf("Code = %08lx\n", e.Error());
                printf("Message = %s\n", e.ErrorMessage());
                printf("Source = %s\n", (LPCSTR) e.Source());
                printf("Description = %s\n", (LPCSTR) e.Description());
                break;
        case VT_DISPATCH:
                PrintProviderError(vtConnect);
                break;
        default:
                printf("Errors occured.");
                break;
        }
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintProviderError-Funktion                      //
//                                                       //
///////////////////////////////////////////////////////////

void PrintProviderError(_ConnectionPtr pConnection)
{
    // Drucken der Providerfehler aus dem Connection-Objekt.
    // pErr ist ein Recordset-Objekt in der Errors-Auflistung der
    // Verbindung.
    ErrorPtr    pErr  = NULL;
    long      nCount    = 0;
    long      i     = 0;

    if( (pConnection->Errors->Count) > 0)
    {
        nCount = pConnection->Errors->Count;
        // Gültigkeitsbereich für Collection ist 0 bis nCount -1.
        for(i = 0; i < nCount; i++)
        {
            pErr = pConnection->Errors->GetItem(i);
            printf("\t Error number: %x\t%s", pErr->Number,(LPCSTR ) pErr->Description);
        }
    }
}


Beispiel für die AddNew-Methode (VC++)

In diesem Beispiel wird die AddNew-Methode zum Erstellen eines neuen Datensatzes mit dem angegebenen Namen verwendet.

#import "C:\Programme\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <ole2.h>
#include <stdio.h>
#include "conio.h"
#include "AddNewX.h"

//Funktionsdeklaration
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void AddNewX(void);
void PrintProviderError(_ConnectionPtr pConnection);

///////////////////////////////////////////////////////////
//                                                       //
//      Hauptfunktion                                    //
//                                                       //
///////////////////////////////////////////////////////////
void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    AddNewX();

    ::CoUninitialize();
}

///////////////////////////////////////////////////////////
//                                                       //
//      AddNewX-Funktion                                 //
//                                                       //
///////////////////////////////////////////////////////////
void  AddNewX(void)
{
    // Definieren der ADO-Objektzeiger.
    // Initialisieren der Zeiger bei der Definition.
    _RecordsetPtr  pRstEmployees = NULL;
    _ConnectionPtr pConnection   = NULL;

    // Definieren anderer Variablen.
    IADORecordBinding   *picRs = NULL;  // Deklaration des
                                   // Schnittstellenzeigers.
    CEmployeeRs emprs;                  // C++-Klassenobjekt.
    HRESULT hr = S_OK;

    _bstr_t strCnn("Provider=sqloledb;Data Source=srv;„
                “Initial Catalog=Pubs;User Id=sa;Password=;");
    _bstr_t strId;
    _bstr_t strMessage;

    try
    {
        // Öffnen einer Verbindung.
        TESTHR(pConnection.CreateInstance(__uuidof(Connection)));
        hr = pConnection->Open(strCnn,"","",NULL);

        // Öffnen der Employees-Tabelle.
        TESTHR(pRstEmployees.CreateInstance(__uuidof(Recordset)));

        // Sie müssen den Cursorstandardtyp und LockType
        // hier explizit an das Recordset übergeben.
        pRstEmployees->Open("employee",
            _variant_t((IDispatch *) pConnection,true),
            adOpenKeyset,adLockOptimistic,adCmdTable);

        // Öffnen eines IADORecordBinding-Schnittstellenzeigers, der für
        // die Bindung eines Recordsets an eine Klasse verwendet wird.
        TESTHR(pRstEmployees->QueryInterface(
                __uuidof(IADORecordBinding),(LPVOID*)&picRs));

        // Binden des Recordsets an eine C++-Klasse.
        TESTHR(picRs->BindToRecordset(&emprs));

        // Abrufen der Daten des Benutzers. Die Mitarbeiter-ID muss als
        // Initiale des Vor-, Mittel- und Nachnamens, fünf Zahlen und
        // dann M oder F zur Angabe des Geschlechts formatiert werden.
        // Beispielsweise lautet die Mitarbeiter-ID für Bill A. Sorensen
        // "BAS55555M".

        printf("Enter Employee Id: ");scanf("%s",emprs.m_sz_empid);
        strId = emprs.m_sz_empid;
        printf("Enter First Name: ");scanf("%s",emprs.m_sz_fname);
        printf("Enter Last Name:");scanf("%s",emprs.m_sz_lname);

        // Fortfahren, wenn der Benutzer tatsächlich eine Eingabe
        // für die ID und den Vor- und Nachnamen vorgenommen hat.

        if(strcmp(emprs.m_sz_empid,"") &&
           strcmp(emprs.m_sz_fname,"") &&
           strcmp(emprs.m_sz_lname,""))
        {
            // Hinzufügen eines neuen Recordsets zur Tabelle,
            // wenn (FAILED(hr = picRs->AddNew(&emprs)))
            // _com_issue_error(hr); zutrifft
            TESTHR(picRs->AddNew(&emprs));

            // Anzeigen der neu hinzugefügten Daten.
            printf("New Record: %s  %s  %s \n",
                emprs.lemp_empidStatus == adFldOK ?
                emprs.m_sz_empid : "<NULL>",
                emprs.lemp_fnameStatus == adFldOK ?
                emprs.m_sz_fname : "<NULL>",
                emprs.lemp_lnameStatus == adFldOK ?
                emprs.m_sz_lname : "<NULL>");
        }
        else
            printf("Please enter an employee id, first name “
                “and last name.\n");

        // Löschen des neuen Recordsets, weil es sich um ein
        // Beispiel handelt.
        pConnection->Execute("DELETE FROM EMPLOYEE WHERE emp_id ="
            "'" + strId + "'",NULL,adCmdText);

        // Freigeben der IADORecordset-Schnittstelle.
        if (picRs)
            picRs->Release();

        // Löschen der Objekte vor dem Beenden.
        pRstEmployees->Close();
        pConnection->Close();
    }

    catch(_com_error &e)
    {
        // Benachrichtigen des Benutzers über Fehler, falls vorhanden.
        _variant_t vtConnect = pRstEmployees->GetActiveConnection();

        // GetActiveConnection gibt die Verbindungszeichenfolge zurück,
        // wenn die Verbindung nicht geöffnet ist; andernfalls wird das
        // Connection-Objekt zurückgegeben.
        switch(vtConnect.vt)
        {
            case VT_BSTR:
                printf("Error:\n");
                printf("Code = %08lx\n", e.Error());
                printf("Message = %s\n", e.ErrorMessage());
                printf("Source = %s\n", (LPCSTR) e.Source());
                printf("Description = %s\n", (LPCSTR) e.Description());
                break;
            case VT_DISPATCH:
                PrintProviderError(vtConnect);
                break;
            default:
                printf("Errors occured.");
                break;
        }
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintProviderError-Funktion                      //
//                                                       //
///////////////////////////////////////////////////////////

void PrintProviderError(_ConnectionPtr pConnection)
{
    // Drucken der Providerfehler aus dem Connection-Objekt.
    // pErr ist ein Recordset-Objekt in der Errors-Auflistung der
    // Verbindung.
    ErrorPtr  pErr = NULL;
    long      nCount = 0;
    long      i = 0;

    if( (pConnection->Errors->Count) > 0)
    {
        nCount = pConnection->Errors->Count;
        // Gültigkeitsbereich für Collection ist 0 bis nCount -1.
        for(i = 0; i < nCount; i++)
        {
            pErr = pConnection->Errors->GetItem(i);
            printf("\n\t Error number: %x\t%s",
                pErr->Number, (LPCSTR)pErr->Description);
        }
    }
}

AddNewX.h:

#include "icrsint.h"

// Diese Klasse extrahiert empid, fname und lastname.

class CEmployeeRs : public CADORecordBinding
{
BEGIN_ADO_BINDING(CEmployeeRs)

    // Spalte empid ist das erste Feld im Recordset.

    ADO_VARIABLE_LENGTH_ENTRY2(1, adVarChar, m_sz_empid,
         sizeof(m_sz_empid), lemp_empidStatus, TRUE)

    ADO_VARIABLE_LENGTH_ENTRY2(2, adVarChar, m_sz_fname,
         sizeof(m_sz_fname), lemp_fnameStatus, TRUE)

    ADO_VARIABLE_LENGTH_ENTRY2(4, adVarChar, m_sz_lname,
         sizeof(m_sz_lname), lemp_lnameStatus, TRUE)

END_ADO_BINDING()

public:

   CHAR  m_sz_empid[10];
   ULONG lemp_empidStatus;
   CHAR   m_sz_fname[40];
   ULONG  lemp_fnameStatus;
   CHAR   m_sz_lname[41];
   ULONG  lemp_lnameStatus;
};


Beispiel für die Append- und CreateParameter-Methoden (VC++)

In diesem Beispiel werden die Methoden Append und CreateParameter zum Ausführen einer gespeicherten Prozedur mit einem Eingabeparameter verwendet.

#import "C:\Programme\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <ole2.h>
#include <stdio.h>
#include "conio.h"
#include "AppendX.h"

// Funktionsdeklaration
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void AppendX(void);
void PrintProviderError(_ConnectionPtr pConnection);

///////////////////////////////////////////////////////////
//                                                       //
//      Hauptfunktion                                    //
//                                                       //
///////////////////////////////////////////////////////////
void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    AppendX();

    ::CoUninitialize();
}

///////////////////////////////////////////////////////////
//                                                       //
//      AppendX-Funktion                                 //
//                                                       //
///////////////////////////////////////////////////////////
void  AppendX(void)
{
    HRESULT hr = S_OK;

    // Definieren der ADO-Objektzeiger.
    // Initialisieren der Zeiger bei der Definition.
    // Sie befinden sich im ADODB::-Namespace.
    _RecordsetPtr pRstByRoyalty = NULL;
    _RecordsetPtr pRstAuthors = NULL;
    _CommandPtr   pcmdByRoyalty = NULL;
    _ParameterPtr pprmByRoyalty = NULL;
    _ConnectionPtr pConnection = NULL;

   // Definieren anderer Variablen.
    IADORecordBinding   *picRs = NULL;  // Deklaration des
                                 // Schnittstellenzeigers.
    CEmployeeRs emprs;                 // C++-Klassenobjekt.

    _bstr_t strCnn("Provider=sqloledb;Data Source=srv;"
        "Initial Catalog=Pubs;User Id=sa;Password=;");

    _bstr_t strMessage, strAuthorID;
    int intRoyalty;
    VARIANT vtRoyalty;

    try
    {
        // Öffnen einer Verbindung.
        TESTHR(pConnection.CreateInstance(__uuidof(Connection)));
        hr = pConnection->Open(strCnn,"","",NULL);
        pConnection->CursorLocation = adUseClient;

        // Öffnen des Command-Objekts mit einem Parameter.
        TESTHR(pcmdByRoyalty.CreateInstance(__uuidof(Command)));
        pcmdByRoyalty->CommandText = "byroyalty";
        pcmdByRoyalty->CommandType = adCmdStoredProc;

        // Abrufen des Parameterwertes und Anhängen des Parameters.
        printf("Enter Royalty: ");
        scanf("%d",&intRoyalty);

        // Definieren des Integer-/Variantwertes.
        vtRoyalty.vt = VT_I2;
        vtRoyalty.iVal = intRoyalty;
        pprmByRoyalty = pcmdByRoyalty->CreateParameter(
            "percentage",adInteger,adParamInput,sizeof(int),vtRoyalty);
        pcmdByRoyalty->Parameters->Append(pprmByRoyalty);
        pprmByRoyalty->Value  = vtRoyalty;

        // Erstellen des Recordsets durch Ausführen des Befehls.
        pcmdByRoyalty->ActiveConnection = pConnection;
        pRstByRoyalty = pcmdByRoyalty->Execute(
            NULL,NULL,adCmdStoredProc);

    // Öffnen der Authors-Tabelle, um Autorennamen für die Anzeige
    // abzurufen.
        TESTHR(pRstAuthors.CreateInstance(__uuidof(Recordset)));

        // Sie müssen den Cursorstandardtyp und LockType
        // hier explizit an das Recordset übergeben.
        hr = pRstAuthors->Open(
            "authors",_variant_t((IDispatch*)pConnection,true),
            adOpenForwardOnly,adLockReadOnly,adCmdTable);

        // Öffnen eines IADORecordBinding-Schnittstellenzeigers, der für
        // die Bindung eines Recordsets an eine Klasse verwendet wird.
        TESTHR(pRstAuthors->QueryInterface(
            __uuidof(IADORecordBinding),(LPVOID*)&picRs));

        // Binden des Recordsets an eine C++-Klasse.
        TESTHR(picRs->BindToRecordset(&emprs));

    // Aktuelle Daten im Recordset unter Hinzufügen der Autorennamen aus
    // der Authors-Tabelle drucken.
        printf("Authors with %d percent royalty ",intRoyalty);

        while(!(pRstByRoyalty->EndOfFile))
        {
            strAuthorID = pRstByRoyalty->Fields->Item["au_id"]->Value;
            pRstAuthors->Filter = "au_id = '"+strAuthorID+"'";

            printf("\n"  "%s, %s  %s",
                emprs.lau_idStatus == adFldOK ?
                emprs.m_szau_id : "<NULL>",
                emprs.lau_fnameStatus == adFldOK ?
                emprs.m_szau_fname : "<NULL>",
                emprs.lau_lnameStatus == adFldOK ?
                emprs.m_szau_lname : "<NULL>");
            pRstByRoyalty->MoveNext();
        }

        // Freigeben der IADORecordset-Schnittstelle.
        if (picRs)
            picRs->Release();

        pRstByRoyalty->Close();
        pRstAuthors->Close();
        pConnection->Close();
    }

    catch(_com_error &e)
    {
        _bstr_t bstrSource(e.Source());
        _bstr_t bstrDescription(e.Description());

        PrintProviderError(pConnection);

        printf("\n Source : %s \n Description : %s \n",
            (LPCSTR)bstrSource,(LPCSTR)bstrDescription);
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintProviderError-Funktion                      //
//                                                       //
///////////////////////////////////////////////////////////

void PrintProviderError(_ConnectionPtr pConnection)
{
    // Drucken der Providerfehler aus dem Connection-Objekt.
    // pErr ist ein Recordset-Objekt in der Errors-Auflistung der
    // Verbindung.
    ErrorPtr    pErr  = NULL;
    long      nCount  = 0;
    long      i     = 0;

    if( (pConnection->Errors->Count) > 0)
    {
        nCount = pConnection->Errors->Count;
        // Gültigkeitsbereich für Collection ist 0 bis nCount -1.
        for(i = 0; i < nCount; i++)
        {
            pErr = pConnection->Errors->GetItem(i);
            printf("Error number: %x\n Error Description: %s\n",
                pErr->Number,(LPCSTR) pErr->Description);
        }
    }
}

AppendX.h:

#include "icrsint.h"

// Diese Klasse extrahiert nur die Autoren-ID, fname und lastname.

class CEmployeeRs : public CADORecordBinding
{
BEGIN_ADO_BINDING(CEmployeeRs)

    // Die Spalte au_id ist das erste Feld im Recordset.

    ADO_VARIABLE_LENGTH_ENTRY2(1, adVarChar, m_szau_id,
         sizeof(m_szau_id), lau_idStatus, TRUE)

    ADO_VARIABLE_LENGTH_ENTRY2(2, adVarChar, m_szau_lname,
         sizeof(m_szau_lname), lau_lnameStatus, TRUE)

    ADO_VARIABLE_LENGTH_ENTRY2(3, adVarChar, m_szau_fname,
         sizeof(m_szau_fname), lau_fnameStatus, TRUE)

END_ADO_BINDING()

public:

    CHAR m_szau_id[20];
    ULONG lau_idStatus;

    CHAR m_szau_fname[40];
    ULONG lau_fnameStatus;

    CHAR   m_szau_lname[40];
    ULONG  lau_lnameStatus;
};


Beispiel für die AppendChunk- und GetChunk-Methoden (VC++)

In diesem Beispiel werden die Methoden AppendChunk und GetChunk zum Füllen eines Bildfeldes mit Daten aus einem anderen Datensatz verwendet.

#import "C:\Programme\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#define ChunkSize    100

#include <ole2.h>
#include <stdio.h>
#include "conio.h"
#include "malloc.h"
#include "AppendChunkX.h"

// Funktionsdeklarationen.
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void AppendChunkX(void);
void PrintProviderError(_ConnectionPtr pConnection);

///////////////////////////////////////////////////////////
//                                                       //
//      Hauptfunktion                                    //
//                                                       //
///////////////////////////////////////////////////////////
void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    AppendChunkX();

    ::CoUninitialize();
}

///////////////////////////////////////////////////////////
//                                                       //
//      AppendChunkX-Funktion                            //
//                                                       //
///////////////////////////////////////////////////////////
void  AppendChunkX(void)
{
    // Definieren der ADO-Objektzeiger.
    // Initialisieren der Zeiger bei der Definition.
    // Sie befinden sich im ADODB::-Namespace.
    _RecordsetPtr pRstPubInfo = NULL;
    _ConnectionPtr pConnection = NULL;

    // Definieren anderer Variablen.
    // Deklaration des Schnittstellenzeigers.(VC++-Erweiterungen)
    IADORecordBinding   *picRs = NULL;
    CPubInfoRs pubrs;          // C++-Klassenobjekt.

    HRESULT hr = S_OK;
    _bstr_t strCnn("Provider=sqloledb;Data Source=srv;"
        "Initial Catalog=Pubs;User Id=sa;Password=;");

    _bstr_t strMessage,strPubID,strPRInfo;
    _variant_t varChunk;
    long lngOffSet,lngLogoSize;
    char pubId[50];
    lngOffSet = 0;

    UCHAR chData;
    CHAR ch;
    SAFEARRAY FAR *psa;
    SAFEARRAYBOUND rgsabound[1];
    rgsabound[0].lLbound = 0;
    rgsabound[0].cElements = ChunkSize;

    try
    {
        // Öffnen einer Verbindung.
        TESTHR(pConnection.CreateInstance(__uuidof(Connection)));
        TESTHR(pConnection->Open(strCnn,"","",NULL));

        TESTHR(hr= pRstPubInfo.CreateInstance(__uuidof(Recordset)));

        pRstPubInfo->CursorType = adOpenKeyset;
        pRstPubInfo->LockType = adLockOptimistic;

        TESTHR(pRstPubInfo->Open("pub_info",
            _variant_t((IDispatch*)pConnection,true),
            adOpenKeyset,adLockOptimistic,adCmdTable));

        // Öffnen eines IADORecordBinding-Schnittstellenzeigers, der für
        // die Bindung eines Recordsets an eine Klasse verwendet wird.
        TESTHR(pRstPubInfo->QueryInterface(
            __uuidof(IADORecordBinding),(LPVOID*)&picRs));

        // Binden des Recordsets an eine C++-Klasse.
        TESTHR(picRs->BindToRecordset(&pubrs));

        // Anzeigen der verfügbaren Logos.
        strMessage = "Available logos are: " + (_bstr_t)"\n\n";
        printf(strMessage);
        int Counter = 0;
        while(!(pRstPubInfo->EndOfFile))
        {
            printf("\n%s",pubrs.m_sz_pubid);
            printf("\n%s",strtok(pubrs.m_sz_prinfo,","));

            // Anzeigen von jeweils fünf Datensätzen und Warten, bis der
            // Benutzer fortfährt.
            if (++Counter >= 5)
            {
                Counter = 0;
                printf("\nPress any key to continue...");
                getch();
            }
            pRstPubInfo->MoveNext();
        }

        // Auffordern zur Eingabe eines zu kopierenden Logos.
        printf("\nEnter the ID of a logo to copy: ");
        scanf("%s",pubId);
        strPubID = pubId;

        // Abschnittweises Kopieren des Logos in eine Variable.
        pRstPubInfo->Filter = "pub_id = '"  + strPubID + "'";
        lngLogoSize = pRstPubInfo->Fields->Item["logo"]->ActualSize;

        // Erstellen eines sicheren Arrays zum Speichern des Arrays von BYTES.
        rgsabound[0].cElements = lngLogoSize;
        psa = SafeArrayCreate(VT_UI1,1,rgsabound);

        long index1 = 0;
        while(lngOffSet < lngLogoSize)
        {
            varChunk = pRstPubInfo->Fields->
                        Item["logo"]->GetChunk(ChunkSize);

            // Kopieren der Daten nur bis zur tatsächlichen Größe des
            // Feldes.
            for(long index=0;index<=(ChunkSize-1);index++)
            {
                hr= SafeArrayGetElement(varChunk.parray,&index,&chData);
                if(SUCCEEDED(hr))
                {
                    // Byte für Byte Speicherort erhöhen.
                    TESTHR(SafeArrayPutElement(psa,&index1,&chData));
                    index1++;
                }
                else
                    break;
            }
            lngOffSet = lngOffSet + ChunkSize;
        }
        lngOffSet = 0;

        printf("Enter a new Pub Id: ");
        scanf("%s",pubrs.m_sz_pubid);
        strPubID = pubrs.m_sz_pubid;

        printf("Enter descriptive text: " );
        scanf("%c",&ch);
        gets(pubrs.m_sz_prinfo);

        // Temporär neuen Verleger zur Tabelle hinzufügen, um Fehler
        // durch Fremdschlüsselbeschränkungen zu vermeiden.
        pConnection->Execute("INSERT publishers(pub_id) VALUES('" +
            strPubID + "')",NULL,adCmdText);

        pRstPubInfo->AddNew();
        pRstPubInfo->Fields->GetItem("pub_id")->PutValue(strPubID);
        pRstPubInfo->Fields->GetItem("pr_info")->
            PutValue(pubrs.m_sz_prinfo);

        // Zuweisen des sicheren Arrays zu einem Variant-Objekt.
        varChunk.vt = VT_ARRAY|VT_UI1;
        varChunk.parray = psa;
        hr = pRstPubInfo->Fields->GetItem("logo")->
                AppendChunk(varChunk);

        // Aktualisieren der Tabelle.
        pRstPubInfo->Update();

        lngLogoSize = pRstPubInfo->Fields->Item["logo"]->ActualSize;

        // Anzeigen des neu hinzugefügten Recordsets.
        printf("New Record : %s\nDescription : %s\nLogo Size : %s\n",
            pubrs.m_sz_pubid,
            pubrs.m_sz_prinfo,(LPCSTR)(_bstr_t)pRstPubInfo->Fields->
            Item["logo"]->ActualSize);

        // Löschen der neuen Datensätze, weil es sich um ein
        // Beispiel handelt.
        pConnection->Execute("DELETE FROM PUB_INFO WHERE pub_id = '"
                        + strPubID +"'",NULL,adCmdText);

        pConnection->Execute("DELETE FROM publishers WHERE pub_id = '"
                        + strPubID +"'",NULL,adCmdText);

        pRstPubInfo->Close();
        pConnection->Close();
    }
    catch(_com_error &e)
    {
        // Benachrichtigen des Benutzers über Fehler, falls vorhanden.
        _bstr_t bstrSource(e.Source());
        _bstr_t bstrDescription(e.Description());

        PrintProviderError(pConnection);
        printf("Source : %s \n Description : %s\n",
                (LPCSTR)bstrSource,(LPCSTR)bstrDescription);
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintProviderError-Funktion                      //
//                                                       //
///////////////////////////////////////////////////////////

void PrintProviderError(_ConnectionPtr pConnection)
{
    // Drucken der Providerfehler aus dem Connection-Objekt.
    // pErr ist ein Recordset-Objekt in der Errors-Auflistung der
    // Verbindung.
    ErrorPtr  pErr   = NULL;
    long      nCount = 0;
    long      i      = 0;

    if( (pConnection->Errors->Count) > 0)
    {
        nCount = pConnection->Errors->Count;
        // Gültigkeitsbereich für Collection ist 0 bis nCount -1.
        for(i = 0; i < nCount; i++)
        {
            pErr = pConnection->Errors->GetItem(i);
            printf("\t Error number: %x\t%s", pErr->Number,
                (LPCSTR) pErr->Description);
        }
    }
}

AppendChunkX.h:

#include "icrsint.h"

// Diese Klasse extrahiert pubid und prinfo.

class CPubInfoRs : public CADORecordBinding
{
    BEGIN_ADO_BINDING(CPubInfoRs)

    ADO_VARIABLE_LENGTH_ENTRY2(1, adVarChar, m_sz_pubid,
         sizeof(m_sz_pubid), l_pubid, TRUE)

    ADO_VARIABLE_LENGTH_ENTRY2(3, adVarChar, m_sz_prinfo,
         sizeof(m_sz_prinfo), l_prinfo, TRUE)

    END_ADO_BINDING()

public:
    CHAR   m_sz_pubid[10];
    ULONG  l_pubid;
    CHAR   m_sz_prinfo[200];
    ULONG l_prinfo;

};


Beispiel für die Attributes- und Name-Eigenschaften (VC++)

In diesem Beispiel wird der Wert der Attributes-Eigenschaft für die Objekte Connection, Field und Property angezeigt. Mit der Name-Eigenschaft wird der Name jedes Field- und Property-Objekts angezeigt.

#import "C:\Programme\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <ole2.h>
#include <stdio.h>
#include<conio.h>

// Funktionsdeklarationen
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void AttributesX();
void PrintProviderError(_ConnectionPtr pConnection);
void PrintComError(_com_error &e);

///////////////////////////////////////////////////////////
//                                                       //
//      Hauptfunktion                                    //
//                                                       //
///////////////////////////////////////////////////////////

void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    AttributesX();

    ::CoUninitialize();
}

///////////////////////////////////////////////////////////
//                                                       //
//      AttributesX-Funktion                             //
//                                                       //
///////////////////////////////////////////////////////////

void AttributesX()
{
    // Definieren der ADO-Objektzeiger.
    // Initialisieren der Zeiger bei der Definition.
    // Sie befinden sich im ADODB::-Namespace.
    _RecordsetPtr    pRstEmployee  = NULL;
    _ConnectionPtr pConnection = NULL;
    FieldsPtr  fldLoop = NULL;
    PropertiesPtr proLoop = NULL;

    // Definieren anderer Variablen.
    HRESULT  hr = S_OK;
    _variant_t Index;
    Index.vt = VT_I2;
    int j=0;
    // Öffnen eines Recordsets mit einem Clientcursor
    // für die Employees-Tabelle.
    _bstr_t strCnn("Provider=sqloledb;Data Source=srv;"
        "Initial Catalog=Pubs;User Id=sa;Password=;");

    try
    {
        // Öffnen der Verbindung und des Recordsets.
        TESTHR(pConnection.CreateInstance(__uuidof(Connection)));
        pConnection->Open(strCnn,"","",NULL);

        TESTHR(pRstEmployee.CreateInstance(__uuidof(Recordset)));
        pRstEmployee->Open("Employee",
            _variant_t((IDispatch *)pConnection,true), adOpenForwardOnly,
            adLockReadOnly, adCmdTable);

        // Anzeigen der Attribute der Verbindung.
        printf("Connection attributes: %d \n", pConnection->Attributes);

        // Anzeigen der Attribute der Felder der Employees-Tabelle.
        printf("\nFields attributes:\n");
        fldLoop = pRstEmployee->GetFields();

        for (int i = 0; i < (int)fldLoop->GetCount(); i++)
        {
            Index.iVal=i;
            printf ("   %s = %d \n",
                (LPSTR)fldLoop->GetItem(Index)->GetName(),
                (int)fldLoop->GetItem(Index)->GetAttributes());
        }

        // Anzeigen der Felder der Employees-Tabelle, für die NULL
        // zulässig ist.
        printf("\nNULLABLE Fields :");

        for (int i1 = 0; i1 < (int)fldLoop->GetCount(); i1++)
        {
            Index.iVal = i1;

            if (fldLoop->GetItem(Index)->GetAttributes() &
                    adFldIsNullable)
                {
                    printf ("%s  \n",LPSTR)fldLoop->GetItem(Index)->
                                GetName());
                }
        }

        // Anzeigen der Attribute der Eigenschaften der
        // Employees-Tabelle.
        printf("\nProperty attributes:\n");
        proLoop = pRstEmployee->GetProperties();

        for (int i2 = 0; i2 < (int)proLoop->GetCount(); i2++)
        {
            j= j+1;
            Index.iVal=i2;
            printf (" %s = %d \n",
                (LPSTR)(_bstr_t)proLoop->GetItem(Index)->GetName(),
                (int)proLoop->GetItem(Index)->GetAttributes());

            if (((j % 23) == 0) || ( i2==6))
            {
                printf("\nPress any key to continue...");
                getch();

                // Löschen des Bildschirms für die nächste Anzeige.
                system("cls");
                j=0;
            }
        }
        // Löschen der Objekte vor dem Beenden.
        pRstEmployee->Close();
        pConnection->Close();
    }

    catch(_com_error &e)
    {
        // Benachrichtigen des Benutzers über Fehler, falls vorhanden.

        PrintProviderError(pConnection);
        PrintComError(e);
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintProviderError-Funktion                      //
//                                                       //
///////////////////////////////////////////////////////////

void PrintProviderError(_ConnectionPtr pConnection)
{
    // Drucken der Providerfehler aus dem Connection-Objekt.
    // pErr ist ein Recordset-Objekt in der Errors-Auflistung der
    // Verbindung.
    ErrorPtr  pErr  = NULL;
    long      nCount  = 0;
    long      i    = 0;

    if( (pConnection->Errors->Count) > 0)
    {
        nCount = pConnection->Errors->Count;

        // Gültigkeitsbereich für Collection ist 0 bis nCount -1.
        for(i = 0; i < nCount; i++)
        {
            pErr = pConnection->Errors->GetItem(i);
            printf("\t Error number: %x\t%s", (LPCSTR) pErr->Number,
                    (LPCSTR) pErr->Description);
        }
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintComError-Funktion                           //
//                                                       //
///////////////////////////////////////////////////////////

void PrintComError(_com_error &e)
{
    _bstr_t bstrSource(e.Source());
    _bstr_t bstrDescription(e.Description());

    // Aus COM stammende Fehler drucken.
    printf("\nError\n");
    printf("Code = %08lx\n", e.Error());
    printf("Code meaning = %s\n", e.ErrorMessage());
    printf("Source = %s\n", (LPCSTR) bstrSource);
    printf("Description = %s\n", (LPCSTR) bstrDescription);
}


Beispiel für die BeginTrans-, CommitTrans- und RollbackTrans-Methoden (VC++)

In diesem Beispiel wird der Buchtyp sämtlicher Psychologiebücher in der Titles-Tabelle der Datenbank geändert. Nachdem die BeginTrans-Methode eine Transaktion ausgeführt hat, die alle an der Titles-Tabelle vorgenommenen Änderungen isoliert, speichert die CommitTrans-Methode die Änderungen. Mit der Rollback-Methode können unter Verwendung der Update-Methode gespeicherte Änderungen rückgängig gemacht werden.

#import "C:\Programme\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <stdio.h>
#include <ole2.h>
#include <conio.h>
#include <assert.h>
#include <malloc.h>
#include "BeginTransX.h"

inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void BeginTransX(void);
void PrintProviderError(_ConnectionPtr pConnection);

void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    BeginTransX();

    ::CoUninitialize();
}

///////////////////////////////////////////////////////////
//                                                       //
//      BeginTransX-Funktion                             //
//                                                       //
///////////////////////////////////////////////////////////

void BeginTransX()
{
    // Definieren der ADO-Objektzeiger.
    // Initialisieren der Zeiger bei der Definition.
    // Sie befinden sich im ADODB::-Namespace.
    _RecordsetPtr rstTitles = NULL;
    _ConnectionPtr pConnection = NULL;

    // Definieren anderer Variablen
    HRESULT hr = S_OK;
    IADORecordBinding   *picRs = NULL;  //Deklaration des
                                 // Schnittstellenzeigers.
    CTitlesRs titlrs;
    _bstr_t strTitle;
    _bstr_t strMessage;
    LPSTR p_TempStr = NULL;
    char chKey;
    int i = 0;

    try
    {
        // Öffnen der Verbindung.
        _bstr_t strCnn("Provider=sqloledb;Data Source=srv;"
            "Initial Catalog=Pubs;User Id=sa;Password=;");

        TESTHR(pConnection.CreateInstance(__uuidof(Connection)));

        TESTHR(pConnection->Open(strCnn,"","",NULL));

        rstTitles.CreateInstance(__uuidof(Recordset));

        rstTitles->CursorType = adOpenDynamic;
        rstTitles->LockType = adLockPessimistic;

        // Öffnen der Titles-Tabelle.
        TESTHR(rstTitles->Open("Titles",
            _variant_t((IDispatch*)pConnection,true),
            adOpenDynamic, adLockPessimistic,adCmdTable));

        rstTitles->MoveFirst();
        pConnection->BeginTrans();

        // Öffnen eines IADORecordBinding-Schnittstellenzeigers, der für
        // die Bindung eines Recordsets an eine Klasse verwendet wird.
        TESTHR(rstTitles->QueryInterface(
            __uuidof(IADORecordBinding), (LPVOID*)&picRs));

        // Binden des Recordsets an eine C++-Klasse.
        TESTHR(picRs->BindToRecordset(&titlrs));

        // Schleife durch das Recordset und Frage an den Benutzer, ob
        // der Typ für einen angegebenen Titel geändert werden soll.
        // Zuweisen von Speicher an den Zeichenfolgenzeiger p_TempStr.
        p_TempStr = (LPSTR) malloc(sizeof(titlrs.m_szT_type));

        // Überprüfen, ob NULL-Zeichenfolge vorhanden ist.
        assert(p_TempStr != NULL);
        while (VARIANT_FALSE == rstTitles->EndOfFile)
        {
            // Entfernen der leeren Zeichenfolge.
            strcpy(p_TempStr,strtok(titlrs.m_szT_type," "));

            // Vergleichen des Typs mit dem Wert "psychology".
            if (!strcmp(p_TempStr,"psychology"))
            {
                strTitle = titlrs.m_szT_title;
                strMessage = "Title: " + strTitle +
                        "\n Change type to Self help?(y/n)";

                // Ändern des Titels für den angegebenen Mitarbeiter.
                printf("%s\n",(LPCSTR)strMessage);
                do
                {
                    chKey = getch();
                }while(chKey != 'y' && chKey !='n');
                if(chKey == 'y')
                {
                    // Kopieren des Titelfeldes "self_help".
                    strcpy(titlrs.m_szT_type,"self_help");
                    picRs->Update(&titlrs);
                }
            }
            rstTitles->MoveNext();
        }
        // Frage, ob der Benutzer alle Änderungen übernehmen möchte,
        // die oben vorgenommen wurden.
        printf("\n\n Save all changes(y/n)?");
        do
        {
            chKey = getch();
        }while(chKey != 'y' && chKey !='n');

        if(chKey == 'y')

            // Speichern der Änderungen in der Titles-Tabelle.
            pConnection->CommitTrans();
        else
            // Speichern der Änderungen in der Titles-Tabelle rückgängig
            // machen.
            pConnection->RollbackTrans();

        // Aktuelle Daten im Recordset drucken.
        rstTitles->Requery(0);

        // Springen zum ersten Recordset der Titles-Tabelle.
        rstTitles->MoveFirst();
        printf("\n\nPress any key to continue...");
        getch();

        // Löschen des Bildschirms für die nächste Anzeige.
        system("cls");

        // Nochmaliges Öffnen des IADORecordBinding-
        // Schnittstellenzeigers, um das Recordset an eine Klasse zu
        // binden.
        TESTHR(rstTitles->QueryInterface(
            __uuidof(IADORecordBinding),
            (LPVOID*)&picRs));

        // Erneutes Binden des Recordsets an eine C++-Klasse.
        TESTHR(picRs->BindToRecordset(&titlrs));

        while (!rstTitles->EndOfFile)
        {
            i= i+1;
            if (i % 23 == 0)
            {
                printf("\nPress any key to continue...");
                getch();

                // Löschen des Bildschirms für die nächste Anzeige.
                system("cls");
            }
            printf("%s -  %s\n",titlrs.m_szT_title,titlrs.m_szT_type);
            rstTitles->MoveNext();
        }
        // Wiederherstellen der ursprünglichen Daten, weil es sich
          // um ein Beispiel handelt.
        rstTitles->MoveFirst();

        while (VARIANT_FALSE == rstTitles->EndOfFile)
        {
            strcpy(p_TempStr,titlrs.m_szT_type);
            p_TempStr = strtok(p_TempStr," ");

            if (!strcmp(p_TempStr,"self_help"))
            {
                strcpy(titlrs.m_szT_type,"psychology");
                picRs->Update(&titlrs);
            }
            rstTitles->MoveNext();
        }
        // Aufheben der Zuweisung des Speichers.
            free(p_TempStr);

        // Löschen der Objekte vor dem Beenden.
        rstTitles->Close();
        pConnection->Close();

        // Freigeben der IADORecordset-Schnittstelle.
        if (picRs)
            picRs->Release();
    }
    catch(_com_error &e)
    {
        // Benachrichtigen des Benutzers über Fehler, falls vorhanden.
        _bstr_t bstrSource(e.Source());
        _bstr_t bstrDescription(e.Description());

        PrintProviderError(pConnection);

        printf("Source : %s\n",(LPCSTR)bstrSource);
        printf("Description : %s\n",(LPCSTR)bstrDescription);
    }
};

///////////////////////////////////////////////////////////
//                                                       //
//      PrintProviderError-Funktion                      //
//                                                       //
///////////////////////////////////////////////////////////

void PrintProviderError(_ConnectionPtr pConnection)
{
    // Drucken der Providerfehler aus dem Connection-Objekt.
    // pErr ist ein Recordset-Objekt in der Errors-Auflistung der
    // Verbindung.
    ErrorPtr  pErr    = NULL;
    long      nCount  = 0;
    long      i       = 0;

    if( (pConnection->Errors->Count) > 0)
    {
        nCount = pConnection->Errors->Count;
        // Gültigkeitsbereich für Collection ist 0 bis nCount -1.
        for(i = 0; i < nCount; i++)
        {
            pErr = pConnection->Errors->GetItem(i);
            printf("Error number: %x\t%s\n", pErr->Number,(LPCSTR) pErr->Description);
        }
    }
}

BeginTransX.h:#include "icrsint.h"

// Diese Klasse extrahiert nur Titel und Typ.
class CTitlesRs : public CADORecordBinding
{
BEGIN_ADO_BINDING(CTitlesRs)

    // Die title-Spalte ist das zweite Feld im Recordset.
    ADO_VARIABLE_LENGTH_ENTRY2(2, adVarChar, m_szT_title,
         sizeof(m_szT_title), lT_titleStatus, FALSE)

    // Die type-Spalte ist das dritte Feld im Recordset.
    ADO_VARIABLE_LENGTH_ENTRY2(3, adVarChar, m_szT_type,
         sizeof(m_szT_type), lT_typeStatus, TRUE)

END_ADO_BINDING()

public:

   CHAR   m_szT_title[150];
   ULONG  lT_titleStatus;
   CHAR   m_szT_type[40];
   ULONG  lT_typeStatus;
};


Beispiel für die BOF-, EOF- und Bookmark-Eigenschaften (VC++)

Die erste Funktion in diesem Beispiel verwendet die Eigenschaften BOF und EOF, um eine Nachricht anzuzeigen, wenn der Benutzer über den ersten oder letzten Datensatz eines Recordset-Objekts hinausgehen möchte. Mit der Bookmark-Eigenschaft kann der Benutzer einen Datensatz in einem Recordset-Objekt markieren und später an diese Stelle zurückkehren.

Die zweite Funktion verwendet die Bookmark-Eigenschaft zur Platzierung der Lesezeichen von den anderen Datensätzen eines Recordsets in ein Array und filtert anschließend das Recordset mithilfe des Arrays.

#import "C:\Programme\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <ole2.h>
#include <stdio.h>
#include <conio.h>
#include "BofEofBookmark.h"

// Funktionsdeklarationen
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void BOFX(void);
void BookmarkX(void);
void PrintProviderError(_ConnectionPtr pConnection);
void PrintComError(_com_error &e);

///////////////////////////////////////////////////////////
//                                                       //
//      BOFX-Funktion                                    //
//                                                       //
///////////////////////////////////////////////////////////

void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    BOFX();

    // Löschen des Bildschirms für die nächste Anzeige.
    system("cls");

    BookmarkX();

    printf("Press any key to continue...");
    getch();

    ::CoUninitialize();
}

///////////////////////////////////////////////////////////
//                                                       //
//      BOFX-Funktion                                    //
//                                                       //
///////////////////////////////////////////////////////////

void BOFX(void)
{
    // Definieren der ADO-Objektzeiger.
    // Initialisieren der Zeiger bei der Definition.
    // Sie befinden sich im ADODB::-Namespace
    _RecordsetPtr rstPublishers = NULL;

    // Definieren anderer Variablen
    HRESULT hr = S_OK;
    IADORecordBinding  *picRs = NULL;    //Deklaration des
                                  // Schnittstellenzeigers
    CPublishers Publs;

    bstr_t strCnn("Provider=sqloledb;Data Source=srv;"
        "Initial Catalog=Pubs;User Id=sa;Password=;");
    _bstr_t strMessage;
    _variant_t VarBookmark;
    int intCommand = 0;
    _variant_t TempPublisher;

    try
    {
        // Öffnen des Recordsets mit den Daten aus der
        // Publishers-Tabelle.
        TESTHR(rstPublishers.CreateInstance(__uuidof(Recordset)));
        rstPublishers->CursorType = adOpenStatic;

        // Verwenden des Clientcursors zum Aktivieren der
        // AbsolutePosition-Eigenschaft.
        rstPublishers->CursorLocation = adUseClient;
        rstPublishers->Open("select pub_id, pub_name from publishers"
            " order by pub_name", strCnn, adOpenStatic,
            adLockBatchOptimistic, adCmdText);

        // Öffnen eines IADORecordBinding-Schnittstellenzeigers, der für
        // die Bindung eines Recordsets an eine Klasse verwendet wird.
        TESTHR(rstPublishers->QueryInterface(
            __uuidof(IADORecordBinding), (LPVOID*)&picRs));

        //Binden des Recordsets an eine C++-Klasse.
        TESTHR(picRs->BindToRecordset(&Publs));

        rstPublishers->MoveFirst();

         while (true)    // Fortwährende Schleife.
        {
            // Anzeigen von Informationen zum aktuellen Recordset
            // und Abrufen der Benutzereingabe.
            printf("Publisher:%s \n Record %d of %d\n\n",
                Publs.lP_pubnameStatus  == adFldOK ?
                Publs.m_szP_pubname : "<NULL>",
                rstPublishers->AbsolutePosition,
                rstPublishers->RecordCount);
            printf("Enter command:\n ");
            printf("[1 - next          /  2 - previous       /\n");
            printf(" 3 - set bookmark  /  4 - go to bookmark /\n");
            printf(" 5 - quit                                ]\n");

            scanf("%d", &intCommand);
            if ((intCommand < 1) || (intCommand > 4))
                break;    // Programmschleife wird durch Eintrag
                          // außerhalb des Gültigkeitsbereichs
                          // abgebrochen.

            switch(intCommand)
            {
                // Springen nach vorn oder zurück, um BOF oder EOF zu
                // ermitteln.
                case 1:
                    rstPublishers->MoveNext();
                    if (rstPublishers->EndOfFile)
                    {
                        printf("\nCannot move past the last record."
                               " Try again...\n");
                        rstPublishers->MoveLast();
                    }
                    break;

                case 2:
                    rstPublishers->MovePrevious();
                    if (rstPublishers->BOF)
                    {
                        printf("\nCannot move before the first record."
                               " Try again...\n");
                        rstPublishers->MoveFirst();
                    }
                    break;

                // Speichern des Lesezeichens des aktuellen Recordsets.
                case 3:
                    VarBookmark = rstPublishers->Bookmark;
                    // Springen zu dem Recordset, das das
                    // gespeicherte Lesezeichen angibt.
                    break;

                case 4:
                    // Überprüfen, ob ein Lesezeichen für ein Recordset
                    // gesetzt wurde.
                    if (VarBookmark.vt == VT_EMPTY)
                        printf("No Bookmark set!\n");
                    else
                        rstPublishers->Bookmark = VarBookmark;
                    break;

                default:
                    break;
            }
        }
        // Löschen der Objekte vor dem Beenden.
        rstPublishers->Close();

        //Freigeben der IADORecordset-Schnittstelle.
        if (picRs)
            picRs->Release();
    }

    catch (_com_error &e)
    {
        printf("Error in BOFx...\n");
        // Benachrichtigen des Benutzers über Fehler, falls vorhanden.
        _variant_t vtConnect = rstPublishers->GetActiveConnection();

        // GetActiveConnection gibt die Verbindungszeichenfolge zurück,
        // wenn die Verbindung nicht geöffnet ist; andernfalls wird das
        // Connection-Objekt zurückgegeben.
        switch(vtConnect.vt)
        {
            case VT_BSTR:
                printf("Error:\n");
                printf("Code = %08lx\n", e.Error());
                printf("Message = %s\n", e.ErrorMessage());
                printf("Source = %s\n", (LPCSTR) e.Source());
                printf("Description = %s\n", (LPCSTR) e.Description());
                break;
            case VT_DISPATCH:
                PrintProviderError(vtConnect);
                break;
            default:
                printf("Errors occured.");
                break;
        }
        printf("Press any key to continue...");
        getch();
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      BookmarkX-Funktion                               //
//                                                       //
///////////////////////////////////////////////////////////

void BookmarkX(void)
{
    // Definieren der ADO-Objektzeiger.
    // Initialisieren der Zeiger bei der Definition.
    // Sie befinden sich im ADODB::-Namespace.
    _RecordsetPtr rstAuthors = NULL;

    // Definieren anderer Variablen
    IADORecordBinding *picRs = NULL; //Deklaration des
                              // Schnittstellenzeigers
    CAuthors Authrs;
    HRESULT  hr = S_OK;
    _bstr_t  strCnn("Provider=sqloledb;Data Source=srv;"
              "Initial Catalog=Pubs;User Id=sa;Password=;");
    _variant_t vBookmark;

    // Variablendeklaration für sichere Arrays.
    SAFEARRAY FAR* psa;

    // Definieren mithilfe der Array- und Variant-Objekte.
    vBookmark.vt = VT_ARRAY|VT_VARIANT;
    SAFEARRAYBOUND rgsabound[1];
    rgsabound[0].lLbound = 0;
    rgsabound[0].cElements = 11;
    long ii = 0;

    try
    {
        rstAuthors.CreateInstance(__uuidof(Recordset));
        // Festlegen der Cursorposition.
        rstAuthors->CursorLocation  = adUseClient;
        rstAuthors->PutActiveConnection((_variant_t)strCnn);

        // Öffnen der Authors-Tabelle.
        TESTHR(rstAuthors->Open("select * from Authors",strCnn,
            adOpenStatic,adLockBatchOptimistic,adCmdText));

        // Öffnen eines IADORecordBinding-Schnittstellenzeigers, der für
        // die Bindung eines Recordsets an eine Klasse verwendet wird.
        TESTHR(rstAuthors->QueryInterface(__uuidof(IADORecordBinding),
                (LPVOID*)&picRs));

        //Binden des Recordsets an eine C++-Klasse.
        TESTHR(picRs->BindToRecordset(&Authrs));

        printf("Number of Records before filtering:  %d\n",
                rstAuthors->RecordCount);

        // Erstellen eines sicheren Arrays zum Speichern des
        // Variant-Arrays.
        psa = SafeArrayCreate(VT_VARIANT,1,rgsabound);

        // Speichern des Lesezeichens jedes zweiten Recordsets in einem
        // Array.
        while ((!rstAuthors->EndOfFile) && (ii < 11))
        {
            SafeArrayPutElement(psa,&ii,&rstAuthors->Bookmark);
            //ii = ii +1;
            ii++;
            rstAuthors->Move(2);
        }

        vBookmark.parray = psa;

        // Filtern des Recordsets mit dem Array von Lesezeichen.
        rstAuthors->put_Filter(vBookmark);
        printf("Number of Records after filtering:  %d\n",
            rstAuthors->RecordCount);
        rstAuthors->MoveFirst();

        while (!rstAuthors->EndOfFile)
        {
            printf("%d    %s\n",rstAuthors->AbsolutePosition,
                Authrs.lau_lnameStatus == adFldOK ?
                Authrs.m_szau_lname : "<NULL>");
            rstAuthors->MoveNext();
        }

        //Freigeben der IADORecordset-Schnittstelle.
        if (picRs)
            picRs->Release();

        // Löschen der Objekte vor dem Beenden.
        rstAuthors->Close();
    }

    catch (_com_error &e)
    {
        // Benachrichtigen des Benutzers über Fehler, falls vorhanden.
        _variant_t vtConnect = rstAuthors->GetActiveConnection();

        // GetActiveConnection gibt die Verbindungszeichenfolge zurück,
        // wenn die Verbindung nicht geöffnet ist; andernfalls wird das
        // Connection-Objekt zurückgegeben.
        switch(vtConnect.vt)
        {
            case VT_BSTR:
                printf("Error:\n");
                printf("Code    = %08lx\n", e.Error());
                printf("Message = %s\n", e.ErrorMessage());
                printf("Source  = %s\n", (LPCSTR) e.Source());
                printf("Description = %s\n", (LPCSTR) e.Description());
                break;
            case VT_DISPATCH:
                PrintProviderError(vtConnect);
                break;
            default:
                printf("Errors occured.");
                break;
        }
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintProviderError-Funktion                      //
//                                                       //
///////////////////////////////////////////////////////////

void PrintProviderError(_ConnectionPtr pConnection)
{
    // Drucken der Providerfehler aus dem Connection-Objekt.
    // pErr ist ein Recordset-Objekt in der Errors-Auflistung der
    // Verbindung.
    ErrorPtr  pErr    = NULL;
    long      nCount  = 0;
    long      i       = 0;

    if( (pConnection->Errors->Count) > 0)
    {
        nCount = pConnection->Errors->Count;
        // Gültigkeitsbereich für Collection ist 0 bis nCount -1.
        for(i = 0; i < nCount; i++)
        {
            pErr = pConnection->Errors->GetItem(i);
            printf("Error number: %x\t%s\n", pErr->Number,
                (LPCSTR) pErr->Description);
        }
    }
}

BofEofBookmark.h:

#include "icrsint.h"

// Diese Klasse extrahiert nur pubid, lastname und hire_date.
class CPublishers : public CADORecordBinding
{
BEGIN_ADO_BINDING(CPublishers)

    // Die title-Spalte ist das zweite Feld im Recordset.
    ADO_VARIABLE_LENGTH_ENTRY2(1, adVarChar, m_szP_pubid,
        sizeof(m_szP_pubid), lP_pubidStatus, FALSE)

    // Die type-Spalte ist das dritte Feld im Recordset.
    ADO_VARIABLE_LENGTH_ENTRY2(2, adVarChar, m_szP_pubname,
        sizeof(m_szP_pubname), lP_pubnameStatus, TRUE)

END_ADO_BINDING()

public:
    CHAR    m_szP_pubid;
    ULONG   lP_pubidStatus;
    CHAR    m_szP_pubname[40];
    ULONG   lP_pubnameStatus;
};

// Diese Klasse extrahiert nur authorlname.
class CAuthors : public CADORecordBinding
{
BEGIN_ADO_BINDING(CAuthors)

    // Die authorlname-Spalte ist das zweite Feld im Recordset.
    ADO_VARIABLE_LENGTH_ENTRY2(2, adVarChar,  m_szau_lname,
         sizeof(m_szau_lname), lau_lnameStatus, FALSE)

END_ADO_BINDING()

public:
    CHAR    m_szau_lname[40];
    ULONG   lau_lnameStatus;
};


Beispiel für die CacheSize-Eigenschaft (VC++)

In diesem Beispiel wird die CacheSize-Eigenschaft verwendet, um die unterschiedliche Leistung bei einer Operation mit und ohne Zwischenspeicher mit 30 Datensätzen zu verdeutlichen.

#import "C:\Programme\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <ole2.h>
#include <stdio.h>
#include <conio.h>
#include <winbase.h>

// Funktionsdeklarationen
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void CacheSizeX();
void PrintProviderError(_ConnectionPtr pConnection);
void PrintComError(_com_error &e);

///////////////////////////////////////////////////////////
//                                                       //
//      Main-Funktion                                    //
//                                                       //
///////////////////////////////////////////////////////////

void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    CacheSizeX();

    ::CoUninitialize();
}

///////////////////////////////////////////////////////////
//                                                       //
//      CacheSizeX-Funktion                              //
//                                                       //
///////////////////////////////////////////////////////////

void CacheSizeX()
{
    // Definieren der ADO-Objektzeiger.
    // Initialisieren der Zeiger bei der Definition.
    // Sie befinden sich im ADODB::-Namespace
     _RecordsetPtr    pRstRoySched  = NULL;

     // Definieren anderer Variablen
    HRESULT  hr = S_OK;
    DWORD sngStart;
    DWORD sngEnd;
    float sngNoCache;
    float sngCache;
    int intLoop = 0;
    _bstr_t strTemp;

    _bstr_t strCnn("Provider=sqloledb;Data Source=srv;"
    "Initial Catalog=Pubs;User Id=sa;Password=;");

    try
    {
        // Öffnen der RoySched-Tabelle.
        TESTHR(pRstRoySched.CreateInstance(__uuidof(Recordset)));
        pRstRoySched->Open("roysched", strCnn, adOpenForwardOnly,
            adLockReadOnly, adCmdTable);

        // Zweimaliges Aufzählen des Recordset-Objekts und Aufzeichnen
        // der verstrichenen Zeit.
        sngStart = GetTickCount();

        for (intLoop = 1; intLoop < 2; intLoop++)
        {
            pRstRoySched->MoveFirst();

            while(!(pRstRoySched->EndOfFile))
            {
                    // Ausführen einer einfachen Operation für den
                    // Leistungstest.
                    strTemp = pRstRoySched->Fields->
                        Item["title_id"]->Value;
                    pRstRoySched->MoveNext();
            }
        }
        sngEnd = GetTickCount();
        sngNoCache = (float)(sngEnd - sngStart)/(float)1000;

        // Zwischenspeichern der Datensätze in Gruppen von 30
        // Datensätzen.
        pRstRoySched->MoveFirst();
        pRstRoySched->CacheSize = 30;

        sngStart =  GetTickCount();

        // Zweimaliges Aufzählen des Recordset-Objekts und Aufzeichnen
        // der verstrichenen Zeit.
        for (intLoop = 1;intLoop < 2; intLoop++)
        {
            pRstRoySched->MoveFirst();
            while(!(pRstRoySched->EndOfFile))
            {
                    // Ausführen einer einfachen Operation für den
                    // Leistungstest.
                    strTemp = pRstRoySched->Fields->
                        Item["title_id"]->Value;
                    pRstRoySched->MoveNext();
            }
        }
        sngEnd =  GetTickCount();
        sngCache = (float)(sngEnd - sngStart)/(float)1000;

        // Anzeigen der Ergebnisse des Leistungstests.
        printf("Caching Performance Results:\n");
        printf("No cache: %6.3f  seconds \n", sngNoCache);
        printf("30-record cache: %6.3f  seconds \n", sngCache);

        // Löschen der Objekte vor dem Beenden.
        pRstRoySched->Close();
    }
    catch(_com_error &e)
    {
         // Benachrichtigen des Benutzers über Fehler, falls vorhanden.
        _variant_t vtConnect = pRstRoySched->GetActiveConnection();

        // GetActiveConnection gibt die Verbindungszeichenfolge zurück,
        // wenn die Verbindung nicht geöffnet ist; andernfalls wird das
        // Connection-Objekt zurückgegeben.
        switch(vtConnect.vt)
        {
            case VT_BSTR:
                PrintComError(e);
                break;
            case VT_DISPATCH:
               // Übergeben eines Verbindungszeigers, auf den aus dem
               // Recordset zugegriffen wird.
               PrintProviderError(vtConnect);
               break;
            default:
                printf("Errors occured.");
                break;
        }
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintProviderError-Funktion                      //
//                                                       //
///////////////////////////////////////////////////////////

void PrintProviderError(_ConnectionPtr pConnection)
{
    // Drucken der Providerfehler aus dem Connection-Objekt.

    // pErr ist ein Recordset-Objekt in der Errors-Auflistung der
    // Verbindung.
    ErrorPtr pErr  = NULL;

    if( (pConnection->Errors->Count) > 0)
    {
        long nCount = pConnection->Errors->Count;
        // Gültigkeitsbereich für Collection ist 0 bis nCount -1.
        for(long i = 0; i < nCount; i++)
        {
            pErr = pConnection->Errors->GetItem(i);
            printf("Error number: %x\t%s", pErr->Number,
                pErr->Description);
        }
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintComError-Funktion                           //
//                                                       //
///////////////////////////////////////////////////////////

void PrintComError(_com_error &e)
{
    _bstr_t bstrSource(e.Source());
    _bstr_t bstrDescription(e.Description());

    // Drucken der Com-Fehler.
    printf("Error\n");
    printf("\tCode = %08lx\n", e.Error());
    printf("\tCode meaning = %s\n", e.ErrorMessage());
    printf("\tSource = %s\n", (LPCSTR) bstrSource);
    printf("\tDescription = %s\n", (LPCSTR) bstrDescription);

}


Beispiel für die Cancel-Methode (VC++)

In diesem Beispiel wird die Cancel-Methode zum Abbrechen eines in einem Connection-Objekt ausgeführten Befehls verwendet, wenn die Verbindung belegt ist.

#import "C:\Programme\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <ole2.h>
#include <stdio.h>
#include<conio.h>

// Funktionsdeklarationen
inline void TESTHR(HRESULT x) {if FAILED(x) com_issue_error(x);};
void CancelX();
void PrintProviderError(_ConnectionPtr pConnection);
void PrintComError(_com_error &e);

///////////////////////////////////////////////////////////
//                                                       //
//      Main-Funktion                                    //
//                                                       //
///////////////////////////////////////////////////////////

void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    CancelX();

    ::CoUninitialize();
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      CancelX-Funktion                                 //
//                                                       //
///////////////////////////////////////////////////////////

void CancelX()
{
    // Definieren der ADO-Objektzeiger.
    // Initialisieren der Zeiger bei der Definition.
    // Sie befinden sich im ADODB::-Namespace
     _ConnectionPtr pConnection = NULL;

     // Definieren anderer Variablen
    HRESULT  hr = S_OK;
    _bstr_t strCmdChange;
    _bstr_t strCmdRestore;
    BOOL booChanged = FALSE;

    _bstr_t strCnn("Provider=sqloledb;Data Source=srv;"
    "Initial Catalog=Pubs;User Id=sa;Password=;");

    try
    {
        // Öffnen einer Verbindung.
        TESTHR(pConnection.CreateInstance(__uuidof(Connection)));
        pConnection->Open(strCnn,"","",NULL);

        // Definieren von Befehlszeichenfolgen.
        strCmdChange = "UPDATE Titles SET type = 'self_help' "
        "WHERE type = 'psychology'";

        strCmdRestore = "UPDATE Titles SET type = 'psychology' "
        "WHERE type = 'self_help'";

        // Beginnen einer Transaktion mit anschließendem asynchronen
        // Ausführen eines Befehls.
        pConnection->BeginTrans();
        pConnection->Execute(strCmdChange,NULL,adAsyncExecute);

        // Zwischenzeitig andere Aktionen - dieser Teil kann geändert
        // werden.
        for (int i = 1; i<=10 ;i++)
        {
            i = i + i;
            printf("%d\n", i);
        }

        // Wenn der Befehl NICHT abgeschlossen wurde, Abbrechen der
        // Ausführung und Rollback der Transaktion. Ändernfalls Commit-
        // Operation der Transaktion.
        if ((pConnection->GetState()) && (adStateExecuting))
        {
            pConnection->Cancel();
            pConnection->RollbackTrans();
            booChanged = FALSE;
            printf("Update canceled.\n");
        }
        else
        {
            pConnection->CommitTrans();
            booChanged = TRUE;
            printf("Update complete.\n");
        }

        // Wenn die Änderung vorgenommen wurde, Wiederherstellen der
        // Daten, weil es sich um ein Beispiel handelt.
        if (booChanged)
        {
            pConnection->Execute(strCmdRestore,NULL,0);
            printf("Data restored.\n");
        }
        // Löschen der Objekte vor dem Beenden.
        pConnection->Close ();
    }

    catch(_com_error &e)
    {
        // Benachrichtigen des Benutzers über alle Fehler, die beim
        // Ausführen der Abfrage aufgetreten sind.
        // Übergeben eines Verbindungszeigers, auf den von der Verbindung
        // zugegriffen wird.
        PrintProviderError(pConnection);
        PrintComError(e);
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintProviderError-Funktion                      //
//                                                       //
///////////////////////////////////////////////////////////

void PrintProviderError(_ConnectionPtr pConnection)
{
    // Drucken der Providerfehler aus dem Connection-Objekt.
    // pErr ist ein Recordset-Objekt in der Errors-Auflistung der
    // Verbindung.
    ErrorPtr pErr  = NULL;

    if( (pConnection->Errors->Count) > 0)
    {
        long nCount = pConnection->Errors->Count;

        // Gültigkeitsbereich für Collection ist 0 bis nCount -1.
        for(long i = 0; i < nCount; i++)
        {
            pErr = pConnection->Errors->GetItem(i);
            printf("Error number: %x\t%s\n", pErr->Number,
                pErr->Description);
        }
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintComError-Funktion                           //
//                                                       //
///////////////////////////////////////////////////////////

void PrintComError(_com_error &e)
{
    _bstr_t bstrSource(e.Source());
    _bstr_t bstrDescription(e.Description());

    // Drucken der Com-Fehler.
    printf("Error\n");
    printf("\tCode = %08lx\n", e.Error());
    printf("\tCode meaning = %s\n", e.ErrorMessage());
    printf("\tSource = %s\n", (LPCSTR) bstrSource);
    printf("\tDescription = %s\n", (LPCSTR) bstrDescription);
}


Beispiel für die Clone-Methode (VC++)

In diesem Beispiel wird die Clone-Methode zum Erstellen von Kopien eines Recordset-Objekts verwendet. Anschließend kann der Datensatzzeiger unabhängig auf jede einzelne Kopie gesetzt werden.

#import "C:\Programme\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")
#define TESTHR(x) if FAILED(x) _com_issue_error(hr)

#include <stdio.h>
#include <ole2.h>
#include <conio.h>

// Funktionsdeklarationen.
void CloneX(void);
void PrintProviderError(_ConnectionPtr pConnection);
void PrintComError(_com_error &e);

///////////////////////////////////////////////////////////
//                                                       //
//      Main-Funktion                                    //
//                                                       //
///////////////////////////////////////////////////////////
void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    CloneX();

    ::CoUninitialize();
}

///////////////////////////////////////////////////////////
//                                                       //
//      CloneX-Funktion                                  //
//                                                       //
///////////////////////////////////////////////////////////

void  CloneX()
{
    // Definieren der ADO-Objektzeiger.
    // Initialisieren der Zeiger bei der Definition.
    // Sie befinden sich im ADODB::-Namespace.

    _RecordsetPtr  arstStores[3];

    // Definieren anderer Variablen
    HRESULT hr = S_OK;
    int intLoop = 0;
    _bstr_t strSQL;
    _bstr_t strMessage;
    _bstr_t strFind;
    int intLoop1 = 0;
    char *tempStr;
    bool boolFlag = TRUE;
    char m_szS_stor_name[150];

    // Zuweisen von SQL-Anweisung und Verbindungszeichenfolge zu
    // Variablen.
    strSQL = "SELECT stor_name FROM Stores ORDER BY stor_name";

    _bstr_t strCnn("Provider=sqloledb;Data Source=srv;"
            "Initial Catalog=Pubs;User Id=sa;Password=;");

    try
    {
        // Öffnen des Recordsets als statischer Cursortyp.
        arstStores[0].CreateInstance(__uuidof(Recordset));
        arstStores[0]->CursorType = adOpenStatic;
        arstStores[0]->LockType = adLockBatchOptimistic;

        TESTHR(arstStores[0]->Open(strSQL,strCnn, adOpenStatic,
            adLockBatchOptimistic,adCmdText));

        // Zweimaliges Klonen des ursprünglichen Recordsets.
        arstStores[1] = arstStores[0]->Clone(adLockBatchOptimistic);
        arstStores[2] = arstStores[0]->Clone(adLockBatchOptimistic);

        while (boolFlag)
        {
            // Schleife durch das Array; bei jedem Durchgang durchsucht
            // der Benutzer eine andere Kopie des gleichen
            // Recordsets.
            for (intLoop = 1; intLoop <= 3 ; intLoop++)
            {
                // Frage nach Suchzeichenfolge und Anzeige, wo
                // die aktuelle Datensatzzeiger-Position für jeden
                // Datensatz ist.
                printf("Recordsets from stores table:\n");

                _bstr_t str1 = arstStores[0]->Fields->
                    GetItem("stor_name")->Value;
                printf("\t1 - Original - Record pointer at %s",
                    (LPCSTR)str1);

                _bstr_t str2 = arstStores[1]->Fields->
                    GetItem("stor_name")->Value;
                printf("\n\t2 - Clone - Record pointer at %s",
                    (LPCSTR)str2);

                _bstr_t str3 = arstStores[2]->Fields->
                    GetItem("stor_name")->Value;
                printf("\n\t3 - Clone - Record pointer at %s",
                    (LPCSTR)str3);

                printf("\n\nEnter search string for # %d\n"
                    “, or press Enter to quit.„, intLoop);
                gets(m_szS_stor_name);

                // Beschneiden der Zeichenfolge.
                tempStr = strtok(m_szS_stor_name, "  \t");
                strMessage = tempStr;
                if (tempStr == NULL)
                {
                    boolFlag = FALSE;
                    break;
                }

                // Finden der Suchzeichenfolge; ist keine Entsprechung
                // vorhanden, Sprung zum letzten Datensatz.
                intLoop1 = intLoop -1;

                arstStores[intLoop1]->Filter = "stor_name >= '" +
                    strMessage + "'";

                if (arstStores[intLoop1]->EndOfFile)
                {
                    arstStores[intLoop1]->Filter = (long)adFilterNone;
                    arstStores[intLoop1]->MoveLast();
                }
            }
        } // Ende der While-Schleife.

        // Löschen der Objekte vor dem Beenden.
        arstStores[0]->Close();
        arstStores[1]->Close();
        arstStores[2]->Close();
    }

    catch(_com_error &e)
    {
        // Benachrichtigen des Benutzers über Fehler, falls vorhanden.
        _variant_t vtConnect = arstStores[0]->GetActiveConnection();

        switch(vtConnect.vt)
        {
            case VT_BSTR:
                PrintComError(e);
                break;
            case VT_DISPATCH:
                PrintProviderError(vtConnect);
                break;
            default:
                printf("Errors occured.");
                break;
        }
    }
};

///////////////////////////////////////////////////////////
//                                                       //
//      PrintProviderError-Funktion                      //
//                                                       //
///////////////////////////////////////////////////////////

void PrintProviderError(_ConnectionPtr pConnection)
{
    // Drucken der Providerfehler aus dem Connection-Objekt.
    // pErr ist ein Recordset-Objekt in der Errors-Auflistung der
    // Verbindung.
    ErrorPtr pErr = NULL;
    long     nCount = 0;
    long     i = 0;

    if( (pConnection->Errors->Count) > 0)
    {
        nCount = pConnection->Errors->Count;
        // Gültigkeitsbereich für Collection ist 0 bis nCount -1.
        for(i = 0; i < nCount; i++)
        {
            pErr = pConnection->Errors->GetItem(i);
            printf("\t Error number: %x\t%s", pErr->Number,
                (LPCSTR) pErr->Description);
        }
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintComError-Funktion                           //
//                                                       //
///////////////////////////////////////////////////////////

void PrintComError(_com_error &e)
{
    _bstr_t bstrSource(e.Source());
    _bstr_t bstrDescription(e.Description());

    // Drucken der Com-Fehler.
    printf("Error\n");
    printf("\tCode = %08lx\n", e.Error());
    printf("\tCode meaning = %s", e.ErrorMessage());
    printf("\tSource = %s\n", (LPCSTR) bstrSource);
    printf("\tDescription = %s\n", (LPCSTR) bstrDescription);
}

CloneX.h:

#include "icrsint.h"

// Diese Klasse extrahiert nur den stor_name-Wert
// aus der Stores-Tabelle.
class CStores : public CADORecordBinding
{
BEGIN_ADO_BINDING(CStores)

    // Die stor_name-Spalte ist das erste Feld im Recordset.

    ADO_VARIABLE_LENGTH_ENTRY2(1, adVarChar, m_szS_stor_name,
         sizeof(m_szS_stor_name), lS_stor_nameStatus, FALSE)

END_ADO_BINDING()

public:
    CHAR    m_szS_stor_name[150];
    ULONG   lS_stor_nameStatus;
};


Beispiel für die CompareBookmarks-Methode (VC++)

Dieses Beispiel verdeutlicht die CompareBookmarks-Methode. Der relative Wert von Lesezeichen wird selten benötigt, es sei denn, es handelt sich um ein spezielles Lesezeichen.

Bestimmen Sie als Suchziel eine zufällige Zeile eines Recordsets aus der Authors-Tabelle. Zeigen Sie anschließend die Position der einzelnen Zeilen relativ zum Ziel an.

#import "C:\Programme\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")
#define TESTHR(x) if FAILED(x) _com_issue_error(hr)

#include <ole2.h>
#include <stdio.h>
#include <conio.h>
#include <time.h>
#include <stdlib.h>

// Funktionsdeklarationen
void CompareBookMarksX(void);
void PrintProviderError(_ConnectionPtr pConnection);
void PrintComError(_com_error &e);

//////////////////////////////////////////////////////////
//                                                      //
//        Main-Funktion                                 //
//                                                      //
//////////////////////////////////////////////////////////

void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    CompareBookMarksX();

    ::CoUninitialize();
}

//////////////////////////////////////////////////////////
//                                                      //
//           CompareBookMarksX-Funktion                 //
//                                                      //
//////////////////////////////////////////////////////////

void CompareBookMarksX(void)
{
    HRESULT hr = S_OK;

    _bstr_t strCnn("Provider=sqloledb;Data Source=srv;"
        "Initial Catalog=Pubs;User Id=sa;Password=;");

    // Initialisieren der Zeiger bei der Definition.
    // Sie befinden sich im ADODB::-Namespace.
    _RecordsetPtr pRstAuthors = NULL;
    _variant_t vTarget;
    _bstr_t strAns;
    _bstr_t strTitle;
    strTitle = "CompareBookmarks Example";
    try
    {
        TESTHR(pRstAuthors.CreateInstance(__uuidof(Recordset)));

        pRstAuthors->Open("SELECT * FROM Authors ORDER BY au_id", strCnn,
            adOpenStatic, adLockReadOnly, adCmdText);

        long count = pRstAuthors->RecordCount;
        printf("Rows in the Recordset = %d\n", count);
        if (count == 0)
            exit(1);         // Beenden, wenn leeres Recordset vorliegt.

        srand( (unsigned)time( NULL ) );      // Zufallswert.

        // Position zwischen 1 und count-1 abrufen.
        count = int(rand() % (count-1));
        if(!count) {count++;};

        printf("Randomly chosen row position = %d\n", count);

        _variant_t vtBookMark = (short)adBookmarkFirst;

        // Verschieben der Zeile an zufällige Position.
        pRstAuthors->Move(count,vtBookMark);

        vTarget = pRstAuthors->Bookmark;      // Notieren der zufälligen Zeilenposition.
        count = 0;
        long intLineCnt = 3;
        pRstAuthors->MoveFirst();

        while (!(pRstAuthors->EndOfFile))     // Schleife durch
                                                             // Recordsets.
        {
            intLineCnt++;
            if (intLineCnt%20 == 0)
            {
                printf("\nPress any key to continue...\n");
                getch();
            }
            long result = pRstAuthors->CompareBookmarks(
                pRstAuthors->Bookmark, vTarget);

            if (result == adCompareNotEqual)
                printf("Row %d: Bookmarks are not equal. %d\n", count,
                    result);
            else if  (result == adCompareNotComparable)
                printf("Row %d: Bookmarks are not comparable.\n", count);
            else
            {
                switch(result)
                {
                    case adCompareLessThan:
                        strAns = "less than";
                        break;
                    case adCompareEqual:
                        strAns = "equal to";
                        break;
                    case adCompareGreaterThan:
                        strAns = "greater than";
                        break;
                    default:
                        strAns = "in error comparing to";
                        break;
                }
                printf ("Row position  %d  is  %s  the target.\n",
                    count,(LPCSTR)strAns);
            }
            count++;
            pRstAuthors->MoveNext();
        }

        // Löschen der Objekte vor dem Beenden.
        pRstAuthors->Close();
   }

   catch(_com_error &e)
   {
       // Benachrichtigen des Benutzers über Fehler, falls vorhanden.
       // Übergeben eines Verbindungszeigers, auf den aus dem Recordset
       // zugegriffen wird.
        _variant_t vtConnect = pRstAuthors->GetActiveConnection();

        // GetActiveConnection gibt die Verbindungszeichenfolge zurück,
        // wenn die Verbindung nicht geöffnet ist; andernfalls wird das
        // Connection-Objekt zurückgegeben.
        switch(vtConnect.vt)
        {
            case VT_BSTR:
                PrintComError(e);
                break;
            case VT_DISPATCH:
                PrintProviderError(vtConnect);
                break;
            default:
                printf("Errors occured.");
                break;
        }
    }
}

//////////////////////////////////////////////////////////
//                                                      //
//            PrintProviderError-Funktion               //
//                                                      //
//////////////////////////////////////////////////////////

void PrintProviderError(_ConnectionPtr pConnection)
{
    // Drucken der Providerfehler aus dem Connection-Objekt.
    // pErr ist ein Recordset-Objekt in der Errors-Auflistung der
    // Verbindung.
    ErrorPtr pErr = NULL;

    if( (pConnection->Errors->Count) > 0)
    {
        long nCount = pConnection->Errors->Count;
        // Gültigkeitsbereich für Collection ist 0 bis nCount -1.
        for(long i = 0; i < nCount; i++)
        {
            pErr = pConnection->Errors->GetItem(i);
            printf("Error number: %x\t%s\n", pErr->Number,
                pErr->Description);
        }
    }
}

//////////////////////////////////////////////////////////
//                                                      //
//        PrintComError-Funktion                        //
//                                                      //
//////////////////////////////////////////////////////////

void PrintComError(_com_error &e)
{
   _bstr_t bstrSource(e.Source());
   _bstr_t bstrDescription(e.Description());

    // Drucken der Com-Fehler.
   printf("Error\n");
   printf("\tCode = %08lx\n", e.Error());
   printf("\tCode meaning = %s\n", e.ErrorMessage());
   printf("\tSource = %s\n", (LPCSTR) bstrSource);
   printf("\tDescription = %s\n", (LPCSTR) bstrDescription);
}


Beispiel für die ConnectionString-, ConnectionTimeout- und State-Eigenschaften (VC++)

Dieses Beispiel zeigt, wie Sie ein Connection-Objekt mit der ConnectionString-Eigenschaft auf unterschiedliche Art öffnen können. Darüber hinaus wird die ConnectionTimeout-Eigenschaft verwendet, um ein Zeitlimit für eine Verbindung festzulegen, und die State-Eigenschaft, um den Status der Verbindungen zu überprüfen. Zum Ausführen dieser Prozedur ist die GetState-Funktion erforderlich.

#import "C:\Programme\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <ole2.h>
#include <stdio.h>
#include <conio.h>

// Funktionsdeklarationen
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void ConnectionStringX();
_bstr_t GetState(int intState);
void PrintProviderError(_ConnectionPtr pConnection);
void PrintComError(_com_error &e);

///////////////////////////////////////////////////////////
//                                                       //
//      Main-Funktion                                    //
//                                                       //
///////////////////////////////////////////////////////////

void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    ConnectionStringX();

    ::CoUninitialize();
}

///////////////////////////////////////////////////////////
//                                                       //
//      ConnectionStringX-Funktion                       //
//                                                       //
///////////////////////////////////////////////////////////

void ConnectionStringX()
{
    // Definieren der Zeiger des Connection-Objekts.
    // Initialisieren der Zeiger bei der Definition.
    // Sie befinden sich im ADODB::-Namespace
     _ConnectionPtr pConnection1 = NULL;
     _ConnectionPtr pConnection2 = NULL;
     _ConnectionPtr pConnection3 = NULL;
     _ConnectionPtr pConnection4 = NULL;

    // Definieren anderer Variablen
    HRESULT  hr = S_OK;

    try
    {
        // Öffnen einer Verbindung, ohne einen Data Source Name (DSN) zu
        // verwenden.
        TESTHR(pConnection1.CreateInstance(__uuidof(Connection)));
        pConnection1->ConnectionString = "driver={SQL Server};"
            "server=dhale1;uid=sa;pwd=;database=Pubs";
        pConnection1->ConnectionTimeout = 30;
        pConnection1->Open("","","",NULL);

        // Öffnen einer Verbindung unter Verwendung eines DSN und ODBC-
        // Tags.
        TESTHR(pConnection2.CreateInstance(__uuidof(Connection)));
        pConnection2->ConnectionString = "DSN=Pubs;UID=sa;PWD=;";
        pConnection2->Open("","","",NULL);

        // Öffnen einer Verbindung unter Verwendung eines DSN und ODBC-
        // Tags
        TESTHR(pConnection3.CreateInstance(__uuidof(Connection)));
        pConnection3->ConnectionString = "Data Source=Pubs;User ID=sa;"
            "Password=;";
        pConnection3->Open("","","",NULL);

        // Öffnen einer Verbindung unter Verwendung eines DSN und
        // einzelner Argumente statt einer Verbindungszeichenfolge.
        TESTHR(pConnection4.CreateInstance(__uuidof(Connection)));
        pConnection4->Open("Pubs","sa","",NULL);

        // Anzeigen des Status der Verbindungen.
        printf("cnn1 state: %s\n",
            (LPCTSTR)GetState(pConnection1->State));
        printf("cnn2 state: %s\n",
            (LPCTSTR)GetState(pConnection2->State));
        printf("cnn3 state: %s\n",
            (LPCTSTR)GetState(pConnection3->State));
        printf("cnn4 state: %s\n",
            (LPCTSTR)GetState(pConnection4->State));

        // Löschen der Objekte vor dem Beenden.
        pConnection4->Close();
        pConnection3->Close();
        pConnection2->Close();
        pConnection1->Close();
    }

    catch(_com_error &e)
    {
        // Benachrichtigen des Benutzers über etwaige Fehler.
        // Übergeben eines Verbindungszeigers, auf den die Verbindung
        // zugreift.
        PrintProviderError(pConnection1);
        if(pConnection2)
            PrintProviderError(pConnection2);
        if(pConnection3)
            PrintProviderError(pConnection3);
        if(pConnection4)
            PrintProviderError(pConnection4);
        PrintComError(e);
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      GetState-Funktion                                //
//                                                       //
///////////////////////////////////////////////////////////

_bstr_t GetState(int intState)
{
    _bstr_t strState;
    switch(intState)
    {
        case adStateClosed:
            strState = "adStateClosed";
            break;
        case adStateOpen:
            strState = "adStateOpen";
            break;
        default:
        ;
    }
    return strState;
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintProviderError-Funktion                      //
//                                                       //
///////////////////////////////////////////////////////////

void PrintProviderError(_ConnectionPtr pConnection)
{
    // Drucken der Providerfehler aus dem Connection-Objekt.
    // pErr ist ein Recordset-Objekt in der Errors-Auflistung der
    // Verbindung.
    ErrorPtr  pErr = NULL;

    if( (pConnection->Errors->Count) > 0)
    {
        long nCount = pConnection->Errors->Count;

        // Gültigkeitsbereich für Collection ist 0 bis nCount -1.
        for(long i = 0; i < nCount; i++)
        {
            pErr = pConnection->Errors->GetItem(i);
            printf("Error number: %x\t%s\n", pErr->Number,
                (LPCSTR)pErr->Description);
        }
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintComError-Funktion                           //
//                                                       //
///////////////////////////////////////////////////////////

void PrintComError(_com_error &e)
{
    _bstr_t bstrSource(e.Source());
    _bstr_t bstrDescription(e.Description());

    // Drucken der Com-Fehler.
    printf("Error\n");
    printf("\tCode = %08lx\n", e.Error());
    printf("\tCode meaning = %s\n", e.ErrorMessage());
    printf("\tSource = %s\n", (LPCSTR) bstrSource);
    printf("\tDescription = %s\n", (LPCSTR) bstrDescription);
}


Beispiel für die Count-Eigenschaft (VC++)

Dieses Beispiel zeigt die Count-Eigenschaft mit zwei Auflistungen in der Employees-Tabelle. Die Eigenschaft erhält die Anzahl der Objekte in jeder Auflistung und legt die obere Grenze für Schleifen fest, die diese Auflistungen aufzählen. Diese Auflistungen können auch ohne die Count-Eigenschaft aufgezählt werden, indem For Each...Next-Anweisungen verwendet werden.

#import "C:\Programme\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <ole2.h>
#include <stdio.h>
#include<conio.h>

// Funktionsdeklarationen
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void CountX(void);
void PrintProviderError(_ConnectionPtr pConnection);
void PrintComError(_com_error &e);

///////////////////////////////////////////////////////////
//                                                       //
//      Main-Funktion                                    //
//                                                       //
///////////////////////////////////////////////////////////

void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    CountX();

    ::CoUninitialize();
}

///////////////////////////////////////////////////////////
//                                                       //
//      CountX-Funktion                                  //
//                                                       //
///////////////////////////////////////////////////////////

void CountX()
{
    // Definieren der ADO-Objektzeiger.
    // Initialisieren der Zeiger bei der Definition.
    // Sie befinden sich im ADODB::-Namespace
    _RecordsetPtr pRstEmployee = NULL;

    // Definieren anderer Variablen
    HRESULT hr = S_OK;
    _variant_t Index;
    Index.vt = VT_I2;
    int j = 0;

    _bstr_t strCnn("Provider=SQLOLEDB;Data Source=srv;"
        "Initial Catalog=Pubs;User Id=sa;Password=;");

    try
    {
        // Öffnen des Recordsets mit Daten aus der Employees-Tabelle.
        TESTHR(pRstEmployee.CreateInstance(__uuidof(Recordset)));
        pRstEmployee->Open("Employee", strCnn, adOpenForwardOnly,
            adLockReadOnly, adCmdTable);

        // Drucken der Informationen zur Fields-Auflistung.
        printf("%d Fields in Employee\n", pRstEmployee->Fields->Count);
        for (int intLoop = 0;
             intLoop <= (pRstEmployee->Fields->Count-1);
             intLoop++)
        {
            Index.iVal = intLoop;
            printf(" %s\n",(LPSTR) pRstEmployee->Fields->
                GetItem(Index)->Name);
        }

        // Drucken der Informationen zur Properties-Auflistung.
        printf("\n%d Properties in Employee\n", pRstEmployee->
            Properties->Count);
        for (intLoop = 0;
             intLoop <= (pRstEmployee->Properties->Count - 1);
             intLoop++)
        {
            j++;
            Index.iVal = intLoop;
            printf(" %s\n" ,(LPSTR)pRstEmployee->Properties->
                GetItem(Index)->Name);
            if (((j % 23) == 0) || (intLoop == 11))
            {
                printf("\nPress any key to continue...");
                getch();

                //Löschen des Bildschirms für die nächste Anzeige.
                system("cls");
                j = 0;
            }
        }
        // Löschen der Objekte vor dem Beenden.
        pRstEmployee->Close();
    }

    catch(_com_error &e)
    {
        // Benachrichtigen des Benutzers über etwaige Fehler, die
        // bei der Ausführung der Abfrage auftreten.
        // Übergeben eines Verbindungszeigers, auf den aus dem Recordset
        // zugegriffen wird.
        _variant_t vtConnect = pRstEmployee->GetActiveConnection();

        switch(vtConnect.vt)
        {
        case VT_BSTR:
            PrintComError(e);
            break;
        case VT_DISPATCH:
            PrintProviderError(vtConnect);
            break;
        default:
            printf("Errors occured.");
            break;
        }
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintProviderError-Funktion                      //
//                                                       //
///////////////////////////////////////////////////////////

void PrintProviderError(_ConnectionPtr pConnection)
{
    // Drucken der Providerfehler aus dem Connection-Objekt.
    // pErr ist ein Recordset-Objekt in der Errors-Auflistung der
    // Verbindung.
    ErrorPtr pErr = NULL;

    if( (pConnection->Errors->Count) > 0)
    {
        long nCount = pConnection->Errors->Count;

        // Gültigkeitsbereich für Collection ist 0 bis nCount -1.
        for(long i = 0; i < nCount; i++)
        {
            pErr = pConnection->Errors->GetItem(i);
            printf("Error number: %x\t%s\n",pErr->Number,
                pErr->Description);
        }
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintComError-Funktion                           //
//                                                       //
///////////////////////////////////////////////////////////

void PrintComError(_com_error &e)
{
    _bstr_t bstrSource(e.Source());
    _bstr_t bstrDescription(e.Description());

    // Drucken der Com-Fehler.
    printf("Error\n");
    printf("\tCode = %08lx\n", e.Error());
    printf("\tCode meaning = %s\n", e.ErrorMessage());
    printf("\tSource = %s\n", (LPCSTR) bstrSource);
    printf("\tDescription = %s\n", (LPCSTR) bstrDescription);
}


Beispiel für die CursorType-, LockType- und EditMode-Eigenschaften (VC++)

In diesem Beispiel wird gezeigt, wie die Eigenschaften CursorType und LockType vor dem Öffnen eines Recordset-Objekts festgelegt werden. Das Beispiel zeigt auch den Wert der EditMode-Eigenschaft unter verschiedenen Bedingungen. Zum Ausführen dieser Prozedur ist die EditModeOutput-Funktion erforderlich.

#import "C:\Programme\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <ole2.h>
#include <stdio.h>
#include <conio.h>

// Funktionsdeklaration
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void EditModeX(void);
void EditModeOutput(char *, int);
void PrintProviderError(_ConnectionPtr pConnection);
void PrintComError(_com_error &e);

///////////////////////////////////////////////////////////
//                                                       //
//      Main-Funktion                                    //
//                                                       //
///////////////////////////////////////////////////////////
void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

     EditModeX();

    ::CoUninitialize();
}

///////////////////////////////////////////////////////////
//                                                       //
//      EditModeX-Funktion                               //
//                                                       //
///////////////////////////////////////////////////////////
void EditModeX(void)
{
    // Definieren der ADO-Objektzeiger.
    // Initialisieren der Zeiger bei der Definition.
    // Sie befinden sich im ADODB::-Namespace.
    _RecordsetPtr     pRstEmployees = NULL;
    _ConnectionPtr    pConnection  = NULL;

    HRESULT hr = S_OK;

    _bstr_t strCnn("Provider=sqloledb;Data Source=srv;"
        "Initial Catalog=Pubs;User Id=sa;Password=;");

    try
    {
        // Öffnen einer Verbindung.
        TESTHR(pConnection.CreateInstance(__uuidof(Connection)));
        hr = pConnection->Open(strCnn,"","",NULL);

        // Öffnen des Recordsets mit Daten aus der Employees-Tabelle.
        TESTHR(pRstEmployees.CreateInstance(__uuidof(Recordset)));

        pRstEmployees->CursorLocation = adUseClient;
        pRstEmployees->CursorType = adOpenStatic;
        pRstEmployees->LockType  = adLockBatchOptimistic;

        pRstEmployees->Open("Employee",
             _variant_t((IDispatch *) pConnection,true),
            adOpenStatic,adLockBatchOptimistic,adCmdTable);

        // Anzeigen der EditMode-Eigenschaft in verschiedenen
        // Bearbeitungszuständen.
        pRstEmployees->AddNew ();
        pRstEmployees->Fields->Item["emp_id"]->Value =
            (_bstr_t)("T-T55555M");
        pRstEmployees->Fields->Item["fname"]->Value =
            (_bstr_t)("temp_fname");
        pRstEmployees->Fields->Item["lname"]->Value =
            (_bstr_t)("temp_lname");
        EditModeOutput("After AddNew: ", pRstEmployees->EditMode);

        pRstEmployees->UpdateBatch(adAffectCurrent);
        EditModeOutput("After Update: ", pRstEmployees->EditMode);

        pRstEmployees->Fields->Item["fname"]->Value = (_bstr_t)("test");
        EditModeOutput("After Edit: ", pRstEmployees->EditMode);

        // Löschen des neuen Recordsets, weil es sich um ein
        // Beispiel handelt.
        pConnection->Execute("DELETE FROM Employee WHERE emp_id = "
            "'T-T55555M'", NULL, adCmdText);

        // Löschen der Objekte vor dem Beenden.
        pRstEmployees->Close();
        pConnection->Close();
    }

    catch(_com_error &e)
    {
        // Benachrichtigen des Benutzers über Fehler, falls vorhanden.
        // Übergeben eines Verbindungszeigers, auf den aus dem Recordset
        // zugegriffen wird.
        PrintProviderError(pConnection);
        PrintComError(e);
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      EditModeOutput()-Funktion                        //
//                                                       //
///////////////////////////////////////////////////////////
void EditModeOutput(char *strTemp, int intEditMode)
{
    // Drucken des Berichts basierend auf dem Wert der
    // EditMode-Eigenschaft.
    printf("\n%s", strTemp);
    printf("\n  EditMode = ");

    switch (intEditMode)
    {
        case adEditNone :
            printf("adEditNone");
            break;
        case adEditInProgress :
            printf("adEditInProgress");
            break;
        case adEditAdd :
            printf("adEditAdd");
            break;
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintProviderError-Funktion                      //
//                                                       //
///////////////////////////////////////////////////////////

void PrintProviderError(_ConnectionPtr pConnection)
{
    // Drucken der Providerfehler aus dem Connection-Objekt.
    // pErr ist ein Recordset-Objekt in der Errors-Auflistung der
    // Verbindung.
    ErrorPtr  pErr = NULL;

    if( (pConnection->Errors->Count) > 0)
    {
        long nCount = pConnection->Errors->Count;
        // Gültigkeitsbereich für Collection ist 0 bis nCount -1.
        for(long i = 0; i < nCount; i++)
        {
            pErr = pConnection->Errors->GetItem(i);
            printf("\n\t Error number: %x\t%s", pErr->Number,
                (LPCSTR)pErr->Description);
        }
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintComError-Funktion                           //
//                                                       //
///////////////////////////////////////////////////////////

void PrintComError(_com_error &e)
{
    _bstr_t bstrSource(e.Source());
    _bstr_t bstrDescription(e.Description());

    // Drucken der Com-Fehler.
    printf("Error\n");
    printf("\tCode = %08lx\n", e.Error());
    printf("\tCode meaning = %s\n", e.ErrorMessage());
    printf("\tSource = %s\n", (LPCSTR) bstrSource);
    printf("\tDescription = %s\n", (LPCSTR) bstrDescription);
}


Beispiel für die Delete-Methode (VC++)

In diesem Beispiel wird die Delete-Methode zum Entfernen eines angegebenen Datensatzes aus einem Recordset-Objekt verwendet.

#import "C:\Programme\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <stdio.h>
#include <ole2.h>
#include <conio.h>
#include "DeleteX.h"

//Funktionsdeklarationen.
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void DeleteX(void);
void PrintProviderError(_ConnectionPtr pConnection);
void PrintComError(_com_error &e);

///////////////////////////////////////////////////////////
//                                                       //
//      Main-Funktion                                    //
//                                                       //
///////////////////////////////////////////////////////////
void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    DeleteX();

    ::CoUninitialize();
}

///////////////////////////////////////////////////////////
//                                                       //
//      DeleteX-Funktion                                 //
//                                                       //
///////////////////////////////////////////////////////////

void DeleteX(void)
{

    // Definieren der ADO-Objektzeiger.
    // Initialisieren der Zeiger bei der Definition.
    // Sie befinden sich im ADODB::-Namespace.
    _RecordsetPtr  pRstRoySched = NULL;

    // Definieren anderer Variablen.
    IADORecordBinding   *picRs = NULL;  //Deklaration des
                                 // Schnittstellenzeigers.
    CRoySchedRs    royschrs;            // C++-Klassenobjekt
    HRESULT hr = S_OK;

    char  strTitleID[10], strTmpTitleID[10]="";
    long  longHiRange;
    int   intRoyalty, intLoRange, cnt=0;
    bool  blnFound = TRUE;

    _bstr_t strCnn("Provider=sqloledb;Data Source=srv;"
            "Initial Catalog=Pubs;User Id=sa;Password=;");

    try
    {
        // Öffnen der RoySched-Tabelle.
        TESTHR(pRstRoySched.CreateInstance(__uuidof(Recordset)));

        pRstRoySched->CursorLocation = adUseClient;
        pRstRoySched->CursorType = adOpenStatic;
        pRstRoySched->LockType  = adLockBatchOptimistic;

        TESTHR(pRstRoySched->Open("SELECT * FROM roysched WHERE„
            “ royalty = 20",strCnn,adOpenStatic,adLockBatchOptimistic,
            adCmdText));

        // Aufforderung, ein Recordset zu löschen.
        printf("Before delete there are %d Titles with 20 percent "
            "royalty :\n", pRstRoySched->RecordCount);

        // Öffnen eines IADORecordBinding-Schnittstellenzeigers, der für
        // das Binden eines Recordsets an eine Klasse verwendet wird.
        TESTHR(pRstRoySched->QueryInterface(
            __uuidof(IADORecordBinding),(LPVOID*)&picRs));

        // Binden des Recordsets an eine C++-Klasse.
        TESTHR(picRs->BindToRecordset(&royschrs));

        while(!(pRstRoySched->EndOfFile))
        {
            printf("%s\n", royschrs.lemp_titleidStatus == adFldOK ?
                royschrs.m_sz_titleid : "<NULL>");
            pRstRoySched->MoveNext();
        }

        printf("\nEnter the ID of a record to delete: ");
        gets(strTitleID);

        // Konvertieren von title_id in Großbuchstaben
        for( cnt=0; cnt<10; cnt++)
        {
            if(strTitleID[cnt] != NULL)
            {
                if( IsCharAlpha( strTitleID[cnt]) )
                {
                    if( islower( strTitleID[cnt]) )
                        strTmpTitleID[cnt] = _toupper(strTitleID[cnt]);
                    else
                        strTmpTitleID[cnt] = strTitleID[cnt];
                }
                else
                {
                    strTmpTitleID[cnt] = strTitleID[cnt];
                }
            }
        }

        // Springen zum Recordset und Speichern der Daten, damit sie
        // wiederhergestellt werden können.
        pRstRoySched->PutFilter ("title_id = '" +
            (_bstr_t)(LPCSTR)strTmpTitleID + "'");

        if(pRstRoySched->RecordCount != 0)
        {
            intLoRange = royschrs.m_sz_lorange;
            longHiRange = royschrs.m_sz_hirange;
            intRoyalty = royschrs.m_sz_royalty;

            // Löschen des Recordsets.
            pRstRoySched->Delete(adAffectCurrent);
            pRstRoySched->UpdateBatch(adAffectCurrent);
        }
        else
        {
            blnFound = FALSE;
            printf("This Title ID not available");
        }

        // Anzeigen der Ergebnisse.
        VARIANT varFilter;
        varFilter.vt = VT_I2;
        varFilter.iVal = adFilterNone;
        pRstRoySched->PutFilter (varFilter);
        pRstRoySched->Requery(-1);

        // Binden des Recordsets an eine C++-Klasse.

TESTHR(picRs->BindToRecordset(&royschrs));

printf("\nAfter delete there are %d Titles with 20 percent"
            " royalty: ", pRstRoySched->RecordCount);

        while(!(pRstRoySched->EndOfFile))
        {
            printf("\n%s", royschrs.lemp_titleidStatus == adFldOK ?
                royschrs.m_sz_titleid : "<NULL>");
            pRstRoySched->MoveNext();
        }

        // Wiederherstellen der Daten, weil es sich um ein Beispiel
        // handelt.
        if(blnFound)
        {
            strcpy((char*)royschrs.m_sz_titleid,
                (const char*) strTmpTitleID);
            royschrs.m_sz_lorange = intLoRange;
            royschrs.m_sz_hirange = longHiRange;
            royschrs.m_sz_royalty = intRoyalty;

            TESTHR(picRs->AddNew(&royschrs));

            pRstRoySched->UpdateBatch(adAffectCurrent);
        }

        // Löschen der Objekte vor dem Beenden.
        pRstRoySched->Close();

        // Freigeben der IADORecordset-Schnittstelle.
        if (picRs)
            picRs->Release();
}

    catch(_com_error &e)
    {
       // Benachrichtigen des Benutzers über Fehler, falls vorhanden.
       // Übergeben eines Verbindungszeigers, auf den aus dem Recordset
       // zugegriffen wird.
        _variant_t vtConnect = pRstRoySched->GetActiveConnection();

        // GetActiveConnection gibt die Verbindungszeichenfolge zurück,
        // wenn die Verbindung nicht geöffnet ist; andernfalls wird das
        // Connection-Objekt zurückgegeben.
        switch(vtConnect.vt)
        {
            case VT_BSTR:
                PrintComError(e);
                break;
            case VT_DISPATCH:
                PrintProviderError(vtConnect);
                break;
            default:
                printf("Errors occured.");
                break;
        }
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintProviderError-Funktion                      //
//                                                       //
///////////////////////////////////////////////////////////

void PrintProviderError(_ConnectionPtr pConnection)
{
    // Drucken der Providerfehler aus dem Connection-Objekt.
    // pErr ist ein Recordset-Objekt in der Errors-Auflistung der
    // Verbindung.
    ErrorPtr  pErr = NULL;

    if( (pConnection->Errors->Count) > 0)
    {
        long nCount = pConnection->Errors->Count;
        // Gültigkeitsbereich für Collection ist 0 bis nCount -1.
        for(long i = 0; i < nCount; i++)
        {
            pErr = pConnection->Errors->GetItem(i);
            printf("Error number: %x\t%s\n", pErr->Number,
                (LPCSTR) pErr->Description);
        }
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintComError-Funktion                           //
//                                                       //
///////////////////////////////////////////////////////////

void PrintComError(_com_error &e)
{
   _bstr_t bstrSource(e.Source());
   _bstr_t bstrDescription(e.Description());

    // Drucken der Com-Fehler.
   printf("Error\n");
   printf("\tCode = %08lx\n", e.Error());
   printf("\tCode meaning = %s\n", e.ErrorMessage());
   printf("\tSource = %s\n", (LPCSTR) bstrSource);
   printf("\tDescription = %s\n", (LPCSTR) bstrDescription);
}

DeleteX.h:

#include "icrsint.h"

// Diese Klasse extrahiert titleid, lorange, hirange und royalty
// aus der Roysched-Tabelle.

class CRoySchedRs : public CADORecordBinding
{
BEGIN_ADO_BINDING(CRoySchedRs)

    // Die empid-Spalte ist das erste Feld im Recordset.

    ADO_VARIABLE_LENGTH_ENTRY2(1, adVarChar, m_sz_titleid,
         sizeof(m_sz_titleid), lemp_titleidStatus, TRUE)

    ADO_VARIABLE_LENGTH_ENTRY2(2, adInteger, m_sz_lorange,
         sizeof(m_sz_lorange), lemp_lorangeStatus, TRUE)

    ADO_VARIABLE_LENGTH_ENTRY2(3, adInteger, m_sz_hirange,
         sizeof(m_sz_hirange), lemp_hirangeStatus, TRUE)

    ADO_VARIABLE_LENGTH_ENTRY2(4, adInteger, m_sz_royalty,
         sizeof(m_sz_royalty), lemp_royaltyStatus, TRUE)

END_ADO_BINDING()

public:

    CHAR     m_sz_titleid[10];
    ULONG    lemp_titleidStatus;
    ULONG    m_sz_lorange;
    ULONG    lemp_lorangeStatus;
    ULONG    m_sz_hirange;
    ULONG    lemp_hirangeStatus;
    ULONG    m_sz_royalty;
    ULONG    lemp_royaltyStatus;
};


Beispiel für die Description-, NativeError-, Number-, Source- und SQLState-Eigenschaften (VC++)

In diesem Beispiel wird ein Fehler ausgelöst sowie aufgefangen, und es werden die Eigenschaften Description, HelpContext, HelpFile, NativeError, Number, Source und SQLState des resultierenden Error-Objekts angezeigt.

#import "C:\Programme\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <ole2.h>
#include <stdio.h>
#include<conio.h>

// Funktionsdeklarationen
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void DescriptionX(void);
void PrintProviderError(_ConnectionPtr pConnection);
void PrintComError(_com_error &e);

///////////////////////////////////////////////////////////
//                                                       //
//      Main-Funktion                                    //
//                                                       //
///////////////////////////////////////////////////////////

void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    DescriptionX();

    ::CoUninitialize();
}

///////////////////////////////////////////////////////////
//                                                       //
//      DescriptionX-Funktion                            //
//                                                       //
///////////////////////////////////////////////////////////

void DescriptionX()
{
    // Definieren der ADO-Objektzeiger.
    // Initialisieren der Zeiger bei der Definition.
    // Sie befinden sich im ADODB::-Namespace
    _ConnectionPtr pConnection = NULL;
    ErrorPtr errorLoop = NULL;

    // Definieren anderer Variablen
    HRESULT hr = S_OK;

    try
    {
        // Absichtliches Auslösen eines Fehlers.
        // Öffnen der Verbindung
        TESTHR(pConnection.CreateInstance(__uuidof(Connection)));

        if (FAILED(hr = pConnection->Open("nothing","","",NULL)))
        {
            _com_issue_error(hr);
            exit(1);
        }

        // Löschen der Objekte vor dem Beenden.
        pConnection->Close();
    }

    catch(_com_error)
    {
        // Übergeben eines Verbindungszeigers.
        PrintProviderError(pConnection);
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintProviderError-Funktion                      //
//                                                       //
///////////////////////////////////////////////////////////

void PrintProviderError(_ConnectionPtr pConnection)
{
    // Definieren anderer Variablen
    HRESULT  hr = S_OK;
    _bstr_t  strError;
    ErrorPtr  pErr = NULL;

    try
    {
        // Aufzählen der Errors-Auflistung und Anzeigen
        // der Eigenschaften jedes Error-Objekts.
        long nCount = pConnection->Errors->Count;

        // Gültigkeitsbereich für Collection ist 0 bis nCount - 1.
        for(long i = 0; i < nCount; i++)
        {
            pErr = pConnection->Errors->GetItem(i);
            printf("Error #%d\n", pErr->Number);
            printf("\t %s\n",(LPCSTR)pErr->Description);
            printf("\t(Source: %s)\n",(LPCSTR)pErr->Source);
            printf("\t(SQL State: %s)\n",(LPCSTR)pErr->SQLState);
            printf("\t(NativeError: %d)\n",(LPCSTR)pErr->NativeError);
            if ((LPCSTR)pErr->GetHelpFile() == NULL)
            {
                printf("\tNo Help file available\n");
            }
            else
            {
                printf("\t(HelpFile: %s\n)" ,pErr->HelpFile);
                printf("\t(HelpContext: %s\n)" , pErr->HelpContext);
            }
        }
    }
    catch(_com_error &e)
    {
        // Benachrichtigen des Benutzers über Fehler, falls vorhanden.
        PrintComError(e);
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintComError-Funktion                           //
//                                                       //
///////////////////////////////////////////////////////////

void PrintComError(_com_error &e)
{
   // Benachrichtigen des Benutzers über Fehler, falls vorhanden.
   _bstr_t bstrSource(e.Source());
   _bstr_t bstrDescription(e.Description());

    // Drucken der Com-Fehler.

   printf("Error\n");
   printf("\tCode = %08lx\n", e.Error());
   printf("\tCode meaning = %s", e.ErrorMessage());
   printf("\tSource = %s\n", (LPCSTR) bstrSource);
   printf("\tDescription = %s\n", (LPCSTR) bstrDescription);
}


Beispiel für die Execute-, Requery- und Clear-Methoden (VC++)

In diesem Beispiel wird die Verwendung der Execute-Methode dargelegt, wenn sie von einem Command- sowie einem Connection-Objekt ausgeführt wird. Weiterhin wird die Requery-Methode zum Abrufen aktueller Daten in einem Recordset-Objekt verwendet, und mit der Clear-Methode wird der Inhalt der Errors-Auflistung gelöscht. Damit dieses Beispiel ausgeführt werden kann, werden die Funktionen ExecuteCommand und PrintOutput benötigt.

#include <ole2.h>
#include <stdio.h>

#import "c:\Programme\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

// Funktionsdeklarationen
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void ExecuteX(void);
void ExecuteCommand(_CommandPtr pCmdTemp, _RecordsetPtr pRstTemp);
void PrintOutput(_RecordsetPtr pRstTemp);
void PrintProviderError(_ConnectionPtr pConnection);
void PrintComError(_com_error &e);

////////////////////////////////
//      Main-Funktion         //
////////////////////////////////

void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    ExecuteX();

    ::CoUninitialize();
}

///////////////////////////////////
//      ExecuteX-Funktion        //
///////////////////////////////////

void ExecuteX(void)
{
   HRESULT    hr = S_OK;

    // Definieren der Zeichenfolgevariablen.
   _bstr_t strSQLChange("UPDATE Titles SET Type = "
            "'self_help' WHERE Type = 'psychology'");
   _bstr_t strSQLRestore("UPDATE Titles SET Type = "
            "'psychology' WHERE Type = 'self_help'");
   _bstr_t strCnn("Provider=sqloledb;Data Source=srv;"
            "Initial Catalog=Pubs;User Id=sa;Password=;");

    // Definieren der ADO-Objektzeiger.
    // Initialisieren der Zeiger bei der Definition.
    // Sie befinden sich im ADODB::-Namespace.
    _ConnectionPtr  pConnection = NULL;
    _CommandPtr     pCmdChange  = NULL;
    _RecordsetPtr   pRstTitles  = NULL;

    try
    {
        // Öffnen der Verbindung.
        TESTHR(pConnection.CreateInstance(__uuidof(Connection)));
        pConnection->Open (strCnn, "", "", adConnectUnspecified);

        // Erstellen des Command-Objekts.
        TESTHR(pCmdChange.CreateInstance(__uuidof(Command)));
        pCmdChange->ActiveConnection = pConnection;
        pCmdChange->CommandText = strSQLChange;

        // Öffnen der Titles-Tabelle, Konvertieren des Verbindungszeigers
        // in den Typ IDispatch, um den richtigen Variant-Typ zu
        // erhalten.
        TESTHR(pRstTitles.CreateInstance(__uuidof(Recordset)));
        pRstTitles->Open ("Titles", _variant_t((IDispatch *) pConnection,
            true), adOpenStatic, adLockOptimistic, adCmdTable);

        // Drucken eines Berichts aus den urprünglichen Daten.
        printf(
            "\n\nData in Titles table before executing the query: \n");

        // Aufrufen der Funktion, um den Schleifeninhalt des Recordsets
        // zu drucken.
        PrintOutput(pRstTitles);

        // Löschen irrelevanter Fehler aus der Errors-Auflistung.
        pConnection->Errors->Clear();

        // Aufrufen der Subroutine ExecuteCommand, um den Befehl
        // pCmdChange auszuführen.
        ExecuteCommand(pCmdChange, pRstTitles);

        // Drucken eines Berichts mit den neuen Daten.
        printf(
            "\n\n\tData in Titles table after executing the query: \n");
        PrintOutput(pRstTitles);

        // Verwenden der Execute-Methode des Connection-Objekts zum
        // Ausführen einer SQL-Anweisung, um die Daten
        // wiederherzustellen.
        pConnection->Execute(strSQLRestore, NULL, adExecuteNoRecords);

        // Abrufen der aktuellen Daten durch Abfragen des Recordsets.
        pRstTitles->Requery(adCmdUnknown);

        // Drucken eines Berichts aus den wiederhergestellten Daten.
        printf(
            "\n\n\tData after exec. query to restore original info: \n");
        PrintOutput(pRstTitles);

        // Löschen der Objekte vor dem Beenden.
        pRstTitles->Close();
        pConnection->Close();
    }

    catch (_com_error &e)
    {
        PrintProviderError(pConnection);
        PrintComError(e);
    }
}

//////////////////////////////////////////
//      ExecuteCommand-Funktion         //
//////////////////////////////////////////

void ExecuteCommand(_CommandPtr pCmdTemp, _RecordsetPtr pRstTemp)
{
    try
    {
        // Die CommandText-Eigenschaft war bereits festgelegt, bevor die
        // Funktion aufgerufen wurde.
        pCmdTemp->Execute(NULL, NULL, adCmdText);

        // Abrufen der aktuellen Daten durch erneutes Abfragen des
        // Recordsets.
        pRstTemp->Requery(adCmdUnknown);
    }

    catch(_com_error &e)
    {
        // Benachrichtigen des Benutzers über etwaige Fehler, die
        // aus dem Ausführen der Abfrage stammen.
        // Übergeben eines Verbindungszeigers, auf den aus dem Recordset
        // zugegriffen wird.
        PrintProviderError(pRstTemp->GetActiveConnection());
        PrintComError(e);
    }
}

/////////////////////////////////////
//      PrintOutput-Funktion       //
/////////////////////////////////////

void PrintOutput(_RecordsetPtr pRstTemp)
{
    // Sicherstellen, dass Sprung zur ersten Position des Recordsets
    // erfolgt.
    pRstTemp->MoveFirst();

    // Wenn EOF TRUE ist, sind keine Daten vorhanden; Druckschleife wird
    // übersprungen.
    if( pRstTemp->EndOfFile )
    {
        printf("\tRecordset empty\n");
    }
    else
    {
        // Definieren temporärer Zeichenfolgen für
        // Ausgabekonvertierungen.
        // Initialisieren der Werte des ersten Recordsets.
        _bstr_t bstrTitle;
        _bstr_t bstrType;

        // Aufzählen des Recordsets und Drucken.
        while(!(pRstTemp->EndOfFile))
            {
            // Konvertieren der Variant-Zeichenfolge in konvertierbaren
            // Zeichenfolgetyp.
            bstrTitle = pRstTemp->Fields->GetItem("Title")->Value;
            bstrType  = pRstTemp->Fields->GetItem("Type")->Value;
            printf("\t%s, %s \n",
                (LPCSTR) bstrTitle,
                (LPCSTR) bstrType);

            pRstTemp->MoveNext();
        }
    }
}

///////////////////////////////////////////////
//      PrintProviderError-Funktion          //
///////////////////////////////////////////////

void PrintProviderError(_ConnectionPtr pConnection)
{
    // Drucken der Providerfehler aus dem Connection-Objekt.
    // pErr ist ein Recordset-Objekt in der Errors-Auflistung der
    // Verbindung.
    ErrorPtr  pErr = NULL;

    if( (pConnection->Errors->Count) > 0)
    {
        long nCount = pConnection->Errors->Count;
        // Gültigkeitsbereich für Collection ist 0 bis nCount -1.
        for(long i = 0; i < nCount; i++)
        {
            pErr = pConnection->Errors->GetItem(i);
            printf("\t Error number: %x\t%s", pErr->Number,
                pErr->Description);
        }
    }
}

//////////////////////////////////////
//      PrintComError-Funktion      //
//////////////////////////////////////

void PrintComError(_com_error &e)
{
    _bstr_t bstrSource(e.Source());
    _bstr_t bstrDescription(e.Description());

    // Drucken der Com-Fehler.
    printf("Error\n");
    printf("\tCode = %08lx\n", e.Error());
    printf("\tCode meaning = %s\n", e.ErrorMessage());
    printf("\tSource = %s\n", (LPCSTR) bstrSource);
    printf("\tDescription = %s\n", (LPCSTR) bstrDescription);
}


Beispiel für Filter- und RecordCount-Eigenschaften (VC++)

In diesem Beispiel wird die Filter-Eigenschaft zum Öffnen eines neuen Recordset-Objekts auf der Grundlage einer angegebenen Bedingung verwendet, die auf ein vorhandenes Recordset-Objekt angewendet wird. Mit der RecordCount-Eigenschaft wird die Anzahl der Datensätze in den beiden Recordset-Objekten angezeigt. Zum Ausführen dieser Prozedur ist die FilterField-Funktion erforderlich.

#import "C:\Programme\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <stdio.h>
#include <ole2.h>
#include <conio.h>
#include "FilterX.h"

// Funktionsdeklarationen
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void FilterX(void);
_RecordsetPtr FilterField(_RecordsetPtr rstTemp, _bstr_t strField,
    _bstr_t strFilter);
void FilterX2(void);
void PrintProviderError(_ConnectionPtr pConnection);
void PrintComError(_com_error &e);

void main()
{
    HRESULT hr = S_OK;

    if(FAILED(::CoInitialize(NULL)))
        return;

    FilterX();

    // Hier anhalten, damit Benutzer die Ausgabe sehen können.
    printf("\nPress any key to Continue...");
    getch();

    // Löschen des Bildschirms für die nächste Anzeige.
    system("cls");

    FilterX2();

    ::CoUninitialize();
}

///////////////////////////////////////////////////////////
//                                                       //
//      FilterX-Funktion                                 //
//                                                       //
///////////////////////////////////////////////////////////

void  FilterX()
{
    // Definieren der ADO-Objektzeiger.
    // Initialisieren der Zeiger bei der Definition.
    // Sie befinden sich im ADODB::-Namespace.
    _RecordsetPtr rstPublishers = NULL;
    _RecordsetPtr rstPublishersCountry = NULL;

    // Definieren anderer Variablen
    HRESULT hr = S_OK;
    _bstr_t strCnn("Provider=sqloledb;Data Source=srv;"
            "Initial Catalog=Pubs;User Id=sa;Password=;");
    int intPublisherCount = 0;
    long recCount = 0;
    _bstr_t strCountry;
    _bstr_t strMessage;
    char *tempStr;
    CHAR sz_CountryName[50];
    bool boolFlag = TRUE;
    try
    {
        // Öffnen des Recordsets mit den Daten aus der
        // Publishers-Tabelle.
        rstPublishers.CreateInstance(__uuidof(Recordset));
        rstPublishersCountry.CreateInstance(__uuidof(Recordset));

        rstPublishers->CursorType = adOpenStatic;

        TESTHR(hr =  rstPublishers->Open("publishers",strCnn,
             adOpenStatic , adLockReadOnly,adCmdTable));

        // Auffüllen des Recordsets mit Daten.
        intPublisherCount = rstPublishers->RecordCount;

        // Abrufen der Benutzereingabe.
        printf("Enter a country to filter on:");
        gets(sz_CountryName);

        // Beschneiden der Zeichenfolge.
        tempStr = strtok(sz_CountryName, "  \t");
        strCountry = tempStr;
        if (tempStr == NULL)
        {
            boolFlag = FALSE;
        }

        if (boolFlag)
        {
            if (strcmp(sz_CountryName,""))
            {
                // Öffnen eines gefilterten Recordset-Objekts.
                rstPublishersCountry = FilterField(rstPublishers,
                    "Country", strCountry);
                recCount = rstPublishersCountry->GetRecordCount();
                if (recCount==0)
                {
                    printf("\nNo publishers from that country.\n");
                }
                else
                {
                    // Drucken der Anzahl der ursprünglichen Datensätze
                    // des Recordset-Objekts und des gefilterten
                    // Recordset-Objekts.
                    printf("\nOrders in original recordset:\n%d",
                        intPublisherCount);
                    printf("\nOrders in filtered recordset “
                        “(Country = '%s'): \n%d\n\n",(LPCSTR)strCountry,
                        rstPublishersCountry->RecordCount);
                }
                rstPublishersCountry->Close();
            }
        }
    }

    catch(_com_error &e)
    {
        // Benachrichtigen des Benutzers über Fehler, falls vorhanden.
        _variant_t vtConnect = rstPublishers->GetActiveConnection();

        // GetActiveConnection gibt die Verbindungszeichenfolge zurück,
        // wenn die Verbindung nicht geöffnet ist; andernfalls wird das
        // Connection-Objekt zurückgegeben.
        switch(vtConnect.vt)
        {
            case VT_BSTR:
                PrintComError(e);
                break;
            case VT_DISPATCH:
                PrintProviderError(vtConnect);
                break;
            default:
                printf("Errors occured.");
                break;
        }
    }
}

_RecordsetPtr FilterField(_RecordsetPtr rstTemp,_bstr_t strField,
    _bstr_t strFilter)
{
        // Festlegen eines Filters für das angegebene Recordset-Objekt
        // und anschließendes Öffnen eines neuen Recordset-Objekts.
        rstTemp->Filter  = strField + " = '" + strFilter + "'";
        return rstTemp;
}

void FilterX2(void)
{
    _RecordsetPtr rstPublishers;
    CPublishers publishers;

    // Definieren anderer Variablen.
    HRESULT hr = S_OK;
    IADORecordBinding   *picRs = NULL;  //Deklaration des
                                 // Schnittstellenzeigers.

    _bstr_t strCnn("Provider=sqloledb;Data Source=srv;"
            "Initial Catalog=Pubs;User Id=sa;Password=;");
    try
    {
        // Öffnen des Recordsets mit den Daten aus der
        // Publishers-Tabelle.
        rstPublishers.CreateInstance(__uuidof(Recordset));

        rstPublishers->CursorType = adOpenStatic;

        TESTHR(hr = rstPublishers->Open("SELECT * FROM publishers WHERE "
            "Country='USA'",strCnn,adOpenStatic,adLockReadOnly,
            adCmdText));

        // Öffnen eines IADORecordBinding-Schnittstellenzeigers, der für
        // die Bindung eines Recordsets an eine Klasse verwendet wird.
        TESTHR(rstPublishers->QueryInterface(
            __uuidof(IADORecordBinding), (LPVOID*)&picRs));

        // Binden des Recordsets an eine C++-Klasse.
        TESTHR(picRs->BindToRecordset(&publishers));

        // Aktuelle Daten im Recordset drucken.
        rstPublishers->MoveFirst();

        while (!rstPublishers->EndOfFile)
        {
            printf("%s, %s\n",
                publishers.lP_pubnameStatus == adFldOK ?
                publishers.m_szP_pubname: "<NULL>",
                publishers.lP_countryStatus == adFldOK ?
                publishers.m_szP_country: "<NULL>");

            rstPublishers->MoveNext();
        }
        // Freigeben der IADORecordset-Schnittstelle.
        if (picRs)
            picRs->Release();

        // Löschen des Objekts vor dem Beenden.
        rstPublishers->Close();
    }

    catch (_com_error &e)
    {
        // Benachrichtigen des Benutzers über Fehler, falls vorhanden.
        _variant_t vtConnect = rstPublishers->GetActiveConnection();

        // GetActiveConnection gibt die Verbindungszeichenfolge zurück,
        // wenn die Verbindung nicht geöffnet ist; andernfalls wird das
        // Connection-Objekt zurückgegeben.
        switch(vtConnect.vt)
        {
            case VT_BSTR:
                PrintComError(e);
                break;
            case VT_DISPATCH:
                PrintProviderError(vtConnect);
                break;
            default:
                printf("Errors occured.");
                break;
        }
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintProviderError-Funktion                      //
//                                                       //
///////////////////////////////////////////////////////////

void PrintProviderError(_ConnectionPtr pConnection)
{
    // Drucken der Providerfehler aus dem Connection-Objekt.
    // pErr ist ein Recordset-Objekt in der Errors-Auflistung der
    // Verbindung.
    ErrorPtr  pErr  = NULL;

    if( (pConnection->Errors->Count) > 0)
    {
        long nCount = pConnection->Errors->Count;
        // Gültigkeitsbereich für Collection ist 0 bis nCount -1.
        for(long i = 0; i < nCount; i++)
        {
            pErr = pConnection->Errors->GetItem(i);
            printf("\t Error number: %x\t%s", pErr->Number,
                (LPCSTR) pErr->Description);
        }
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintComError-Funktion                           //
//                                                       //
///////////////////////////////////////////////////////////

void PrintComError(_com_error &e)
{
   _bstr_t bstrSource(e.Source());
   _bstr_t bstrDescription(e.Description());

    // Drucken der Com-Fehler.
    printf("Error\n");
    printf("\tCode = %08lx\n", e.Error());
    printf("\tCode meaning = %s\n", e.ErrorMessage());
    printf("\tSource = %s\n", (LPCSTR) bstrSource);
    printf("\tDescription = %s\n", (LPCSTR) bstrDescription);
}

FilterX.h:

#include "icrsint.h"

// Diese Klasse extrahiert nur Pub Name und Country Name.
class CPublishers : public CADORecordBinding
{
BEGIN_ADO_BINDING(CPublishers)

    // Die Pub Name-Spalte ist das zweite Feld im Recordset.
    ADO_VARIABLE_LENGTH_ENTRY2(2, adVarChar, m_szP_pubname,
         sizeof(m_szP_pubname), lP_pubnameStatus, TRUE)

    // Die Country Name-Spalte ist das fünfte Feld im Recordset.
    ADO_VARIABLE_LENGTH_ENTRY2(5, adVarChar, m_szP_country ,
        sizeof(m_szP_country), lP_countryStatus, TRUE)

END_ADO_BINDING()

public:
    CHAR    m_szP_pubname[50];
    ULONG   lP_pubnameStatus;
    CHAR    m_szP_country[50];
    ULONG   lP_countryStatus;
};


Beispiel für die Find-Methode (VC++)

Dieses Beispiel verwendet die Find-Methode des Recordset-Objekts, um die Anzahl der Geschäftstitel in der Pubs-Datenbank zu finden und aufzuzählen. Bei diesem Beispiel wird davon ausgegangen, dass der zugrunde liegende Provider eine ähnliche Funktionalität nicht unterstützt.

#import "C:\Programme\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <ole2.h>
#include <stdio.h>
#include <conio.h>
#include "FindX.h"

// Funktionsdeklarationen
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void FindX(void);
void PrintProviderError(_ConnectionPtr pConnection);
void PrintComError(_com_error &e);

//////////////////////////////////////////////////////////
//                                                      //
//      Main-Funktion                                   //
//                                                      //
//////////////////////////////////////////////////////////

void main()
{
    If(FAILED(::CoInitialize(NULL)))
        return;

    FindX();

    // Hier warten, damit Benutzer die Ausgabe sehen können.
    printf("Press any key to continue...");
    getch();
    ::CoUninitialize();
}

//////////////////////////////////////////////////////////
//                                                      //
//             FindX-Funktion                           //
//                                                      //
//////////////////////////////////////////////////////////

void FindX(void)
{
    HRESULT    hr = S_OK;

    // Definieren der ADO-Objektzeiger.
    // Initialisieren der Zeiger bei der Definition.
    // Sie befinden sich im ADODB::-Namespace.
    _ConnectionPtr    pConnection  = NULL;
    _RecordsetPtr     pRstTitles   = NULL;
    IADORecordBinding   *picRs     = NULL;  //Deklaration des
                                     // Schnittstellenzeigers.
    CTitlesRs titlers;                 // C++-Klassenobjekt.

    _bstr_t strCnn("Provider=sqloledb;Data Source=srv;"
            "Initial Catalog=Pubs;User Id=sa;Password=;");

    try
    {
        // Öffnen der Verbindung.
        TESTHR(pConnection.CreateInstance(__uuidof(Connection)));
        pConnection->Open (strCnn, "", "", NULL);

        // Öffnen der Titles-Tabelle.
        TESTHR(pRstTitles.CreateInstance(__uuidof(Recordset)));

        pRstTitles->Open("SELECT title_id FROM Titles",
            _variant_t((IDispatch *)pConnection),
            adOpenStatic, adLockReadOnly, adCmdText);

        // Sie Standardparameter reichen aus, um eine Vorwärtssuche
        // in einem Recordset durchzuführen.

        pRstTitles->Find ("title_id LIKE 'BU%'",0,adSearchForward,"");

        // Öffnen eines IADORecordBinding-Schnittstellenzeigers, der für
        // die Bindung eines Recordsets an eine Klasse verwendet wird.
        TESTHR(pRstTitles->QueryInterface(
            __uuidof(IADORecordBinding),(LPVOID*)&picRs));

        // Binden des Recordsets an eine C++-Klasse.
        TESTHR(picRs->BindToRecordset(&titlers));

        // Überspringen des aktuellen Recordsets, damit nicht immer
        // die gleiche Zeile gefunden wird. Das Lesezeichen ist redundant,
        // weil Find von der aktuellen Position aus sucht.
        int count = 0;

        // Fortfahren, wenn letzter Suchvorgang erfolgreich war.
        while (!(pRstTitles->EndOfFile))
        {
            printf("Title ID: %s\n",titlers.lt_titleidStatus == adFldOK ?
                titlers.m_szt_titleid : "<NULL>");
            count++;                       // Letzten gefundenen Titel
                                           // zählen.

            _variant_t mark = pRstTitles->Bookmark;  // Aktuelle Position
                                                     // beachten.
            pRstTitles->Find("title_id LIKE 'BU%'", 1, adSearchForward,
                mark);
        }

        // Freigeben der IADORecordset-Schnittstelle.
        if (picRs)
            picRs->Release();

        // Löschen der Objekte vor dem Beenden.
        pRstTitles->Close();
        pConnection->Close();
        printf("The number of business titles is %d\n",count);

   }

   catch(_com_error &e)
   {
       // Benachrichtigen des Benutzers über Fehler, falls vorhanden.
       // Übergeben eines Verbindungszeigers, auf den aus dem Recordset
       // zugegriffen wird.
       PrintProviderError(pConnection);
       PrintComError(e);
   }
}

//////////////////////////////////////////////////////////
//                                                      //
//       PrintProviderError-Funktion                    //
//                                                      //
//////////////////////////////////////////////////////////

void PrintProviderError(_ConnectionPtr pConnection)
{
    // Drucken der Providerfehler aus dem Connection-Objekt.
    // pErr ist ein Recordset-Objekt in der Errors-Auflistung der
    // Verbindung.
    ErrorPtr    pErr  = NULL;

    if( (pConnection->Errors->Count) > 0)
    {
        long nCount = pConnection->Errors->Count;
        // Gültigkeitsbereich für Collection ist 0 bis nCount -1.
        for(long i = 0; i < nCount; i++)
        {
            pErr = pConnection->Errors->GetItem(i);
            printf("\t Error number: %x\t%s", pErr->Number,
                (LPCSTR) pErr->Description);
        }
    }
}

//////////////////////////////////////////////////////////
//                                                      //
//       PrintComError-Funktion                         //
//                                                      //
//////////////////////////////////////////////////////////

void PrintComError(_com_error &e)
{
   _bstr_t bstrSource(e.Source());
   _bstr_t bstrDescription(e.Description());

    // Drucken der Com-Fehler.
   printf("Error\n");
   printf("\tCode = %08lx\n", e.Error());
   printf("\tCode meaning = %s\n", e.ErrorMessage());
   printf("\tSource = %s\n", (LPCSTR) bstrSource);
   printf("\tDescription = %s\n", (LPCSTR) bstrDescription);
}

FindX.h

#include "icrsint.h"

// Diese Klasse extrahiert nur titleId aus der Titles-Tabelle.
class CTitlesRs : public CADORecordBinding
{
BEGIN_ADO_BINDING(CTitlesRs)

    // Die title_id-Spalte ist das erste Feld im Recordset
    // aus der Titles-Tabelle.
    ADO_VARIABLE_LENGTH_ENTRY2(1, adVarChar, m_szt_titleid,
         sizeof(m_szt_titleid), lt_titleidStatus, FALSE)

END_ADO_BINDING()

public:
   CHAR   m_szt_titleid[150];
   ULONG   lt_titleidStatus;
};


Beispiel für die GetRows-Methode (VC++)

In diesem Beispiel wird die GetRows-Methode zum Abrufen einer angegebenen Anzahl von Zeilen aus einem Recordset-Objekt und zum Füllen eines Arrays mit den als Ergebnis angegebenen Daten verwendet. Die GetRows-Methode gibt in zwei Fällen weniger Daten als gewünscht zurück: Wenn entweder der EOF erreicht wurde oder wenn die GetRows-Methode versucht hat, einen Datensatz abzurufen, der von einem anderen Benutzer gelöscht wurde. Die Funktion gibt nur im zweiten Fall den Wert False zurück. Die GetRowsOK-Funktion wird benötigt, damit diese Prozedur ausgeführt werden kann.

#import "C:\Programme\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <stdio.h>
#include <ole2.h>
#include <conio.h>

// Funktionsdeklarationen
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void GetRowsX(void);
bool GetRowsOK(_RecordsetPtr pRstTemp,int intNumber,
        _variant_t& avarData);
void PrintProviderError(_ConnectionPtr pConnection);
void PrintComError(_com_error &e);

void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

     GetRowsX();

    ::CoUninitialize();
}

///////////////////////////////////////////////////////////
//                                                       //
//      GetRowsX-Funktion                                //
//                                                       //
///////////////////////////////////////////////////////////

void GetRowsX(void)
{
    HRESULT hr = S_OK;

    // Definieren der Zeichenfolgevariablen.
    _bstr_t strCnn("Provider=sqloledb;Data Source=srv;"
            "Initial Catalog=Pubs;User Id=sa;Password=;");

    // Definieren der ADO-Objektzeiger.
    // Initialisieren der Zeiger bei der Definition.
    // Sie befinden sich im ADODB::-Namespace.
    _RecordsetPtr pRstEmployees = NULL;

    try
    {
        // Öffnen des Recordsets mit Namen und Einstellungsdatum aus der
        // Employees-Tabelle.
        TESTHR(pRstEmployees.CreateInstance(__uuidof(Recordset)));

        pRstEmployees->Open("SELECT fName, lName, hire_date "
            "FROM Employee ORDER BY lName",strCnn,
            adOpenStatic, adLockReadOnly,adCmdText);

         while (true) // Fortwährende Schleife.
        {
            int intLines = 0;

            // Abrufen der Benutzereingaben für Anzahl von Zeilen.
            printf("\nEnter number of rows to retrieve (0 to exit): ");
            int intRows;
            scanf("%d", &intRows);

            if (intRows <= 0)
                break;

            // Löschen des Bildschirms für die nächste Anzeige.
            system("cls");

            // Wenn GetRowsOK erfolgreich ist, Drucken der Ergebnisse;
            // bei Erreichen des Dateiendes keine Aktion.
            _variant_t avarRecords;

            if (GetRowsOK(pRstEmployees, intRows, avarRecords))
            {
                long lUbound;
                HRESULT hr = SafeArrayGetUBound(avarRecords.parray,
                    2,&lUbound);

                if (hr == 0)
                {
                    if (intRows > lUbound + 1)
                    {
                        printf("\n(Not enough records in Recordset to "
                            "retrieve %d rows)\n", intRows);
                    }
                }
                printf("%d records found.", lUbound+1);

                // Drucken der abgerufenen Daten.
                for (int intRecords = 0;intRecords < lUbound+1;
                     intRecords++)
                {
                    printf("\n ");

                    long rgIndices[2];
                    rgIndices[0] = 0;
                    rgIndices[1] = intRecords;
                    _variant_t result;
                    result.vt = VT_BSTR;

                    hr= SafeArrayGetElement(avarRecords.parray,
                        rgIndices, &result);

                    if (hr == 0){printf("%s ",(LPCSTR)(_bstr_t)result);}

                    rgIndices[0] = 1;

                    hr= SafeArrayGetElement(avarRecords.parray,
                        rgIndices, &result);

                    if (hr == 0){printf("%s, ",(LPCSTR)(_bstr_t)result);}

                    rgIndices[0] = 2;

                    hr= SafeArrayGetElement(avarRecords.parray,
                        rgIndices, &result);

                    if (hr == 0){printf("%s",(LPCSTR)(_bstr_t)result);}

                    intLines ++;

                    if (intLines % 10 == 0)
                    {
                        printf("\nPress any key to continue...");
                        getch();

                        intLines = 0;

                        // Löschen des Bildschirms für die nächste
                        // Anzeige.
                        system("cls");
                    }
                }
            }
            else
            {
                // Wenn der GetRows-Fehler auf Änderungen der Daten durch
                // einen anderen Benutzer beruht, verwenden Sie Requery,
                // um das Recordset zu aktualisieren und neu zu beginnen.
                printf("GetRows failed--retry?\n");
                char chKey;
                do
                {
                    chKey = getch();
                }while(toupper(chKey) != 'Y'  && toupper(chKey) != 'N');

                if(toupper(chKey) == 'Y')
                {
                    pRstEmployees->Requery(adOptionUnspecified);
                }
                else
                {
                    printf("GetRows failed!\n");
                    break;
                }
            }

            // Da GetRows den aktuellen Recordset-Zeiger auf dem
            // letzten Recordset belässt, auf den zugegriffen wurde,
            // verschieben Sie den Zeiger zurück an den Anfang des
            // Recordsets, bevor Sie erneut eine Schleife für eine neue
            // Suche ausführen.
            pRstEmployees->MoveFirst();
        }
        // Löschen der Objekte vor dem Beenden.
        pRstEmployees->Close();
    }
    catch(_com_error &e)
    {
       // Benachrichtigen des Benutzers über Fehler, falls vorhanden.
       // Übergeben eines Verbindungszeigers, auf den aus dem Recordset
       // zugegriffen wird.
        _variant_t vtConnect = pRstEmployees->GetActiveConnection();

        // GetActiveConnection gibt die Verbindungszeichenfolge zurück,
        // wenn die Verbindung nicht geöffnet ist; andernfalls wird das
        // Connection-Objekt zurückgegeben.
        switch(vtConnect.vt)
        {
            case VT_BSTR:
                PrintComError(e);
                break;
            case VT_DISPATCH:
                PrintProviderError(vtConnect);
                break;
            default:
                printf("Errors occured.");
                break;
        }
    }
}

bool GetRowsOK(_RecordsetPtr pRstTemp,int intNumber,
        _variant_t& avarData)
{
    // Speichern der Ergebnisse der GetRows-Methode in einem Array.
    avarData = pRstTemp->GetRows(intNumber);

    // Zurückgeben von False nur, wenn weniger als die gewünschte Anzahl
    // von Zeilen zurückgegeben wurde, nicht jedoch, weil das Ende des
    // Recordsets erreicht wurde.
    long lUbound;
    HRESULT hr = SafeArrayGetUBound(avarData.parray, 2,&lUbound);
    if (hr == 0)
    {
        if ((intNumber > lUbound + 1) && (!(pRstTemp->EndOfFile)))
            return false;
        else
            return true;
    }
    else
    {
        printf ("\nUnable to Get the Arrays Upper Bound\n");
        return false;
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintProviderError-Funktion                      //
//                                                       //
///////////////////////////////////////////////////////////

void PrintProviderError(_ConnectionPtr pConnection)
{
    // Drucken der Providerfehler aus dem Connection-Objekt.
    // pErr ist ein Recordset-Objekt in der Errors-Auflistung der
    // Verbindung.
    ErrorPtr  pErr  = NULL;

    if( (pConnection->Errors->Count) > 0)
    {
        long nCount = pConnection->Errors->Count;
        // Gültigkeitsbereich für Collection ist 0 bis nCount -1.
        for(long i = 0; i < nCount; i++)
        {
            pErr = pConnection->Errors->GetItem(i);
            printf("\t Error number: %x\t%s", pErr->Number,
                (LPCSTR) pErr->Description);
        }
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintComError-Funktion                           //
//                                                       //
///////////////////////////////////////////////////////////

void PrintComError(_com_error &e)
{
   _bstr_t bstrSource(e.Source());
   _bstr_t bstrDescription(e.Description());

    // Drucken der Com-Fehler.
   printf("Error\n");
   printf("\tCode = %08lx\n", e.Error());
   printf("\tCode meaning = %s\n", e.ErrorMessage());
   printf("\tSource = %s\n", (LPCSTR) bstrSource);
   printf("\tDescription = %s\n", (LPCSTR) bstrDescription);
}


Beispiel für die GetString-Methode (VC++)

Dieses Beispiel verdeutlicht die GetString-Methode.

Bei diesem Beispiel wird davon ausgegangen, dass Sie ein Datenzugriffsproblem debuggen möchten und einen schnellen einfachen Weg zum Drucken des aktuellen Inhalts eines kleinen Recordset-Objekts suchen.

#import "C:\Programme\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <ole2.h>
#include <stdio.h>
#include <conio.h>
#include <string.h>

// Funktionsdeklarationen
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void GetStringX(void);
void PrintProviderError(_ConnectionPtr pConnection);
void PrintComError(_com_error &e);

//////////////////////////////////////////////////////////
//                                                      //
//      Main-Funktion                                   //
//                                                      //
//////////////////////////////////////////////////////////

void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    GetStringX();

    ::CoUninitialize();
}

//////////////////////////////////////////////////////////
//                                                      //
//          GetStringX-Funktion                         //
//                                                      //
//////////////////////////////////////////////////////////

void GetStringX(void)
{
    HRESULT  hr = S_OK;

    // Definieren der ADO-Objektzeiger.
    // Initialisieren der Zeiger bei der Definition.
    // Sie befinden sich im ADODB::-Namespace.
   _ConnectionPtr  pConnection   = NULL;
   _RecordsetPtr   pRstAuthors   = NULL;

    // Definieren der Zeichenfolgevariablen.
    _bstr_t strCnn("Provider=sqloledb;Data Source=srv;"
            "Initial Catalog=Pubs;User Id=sa;Password=;");
    _bstr_t varOutput;
    char *strPrompt = "Enter a state (CA, IN, KS, MD, MI, OR, TN, UT): ";
    char strState[2], *pState;

    try
    {
       // Öffnen der Verbindung.
        TESTHR(pConnection.CreateInstance(__uuidof(Connection)));

        // Öffnen eines Command-Objekts für eine gespeicherte Prozedur
        // mit einem Parameter.
        TESTHR(pRstAuthors.CreateInstance(__uuidof(Recordset)));

        printf("%s",strPrompt);
        gets(strState);

        pState = strtok(strState," \t");

        char strQry[100] = "SELECT au_fname, au_lname, address, city "
            "FROM Authors WHERE state = ";

        strcat(strQry,"'");
        strcat(strQry,pState);
        strcat(strQry,"'");

        _bstr_t strQuery(strQry);

        pConnection->Open (strCnn, "", "", NULL);

        pRstAuthors->Open(strQuery, _variant_t((IDispatch*)pConnection,
            true),
        adOpenStatic, adLockReadOnly, adCmdText);

        if (pRstAuthors->RecordCount > 0)
        {
            // Verwenden aller Standardeinstellungen: Abrufen aller
            // Zeilen, Tabstopp-Spaltentrennzeichen, Wagenrücklauf-
            // Zeilentrennzeichen, NULL-Trennzeichen für leere
            // Zeichenfolgen
            long lRecCount =  pRstAuthors->RecordCount;
            _bstr_t varTab("\t");
            _bstr_t varRet("\r");
            _bstr_t varNull("");
            varOutput = pRstAuthors->GetString(adClipString,lRecCount,
                varTab,varRet,varNull);
            printf("State = '%s'\n", strState);
            printf ("Name            Address                    City\n");
            printf ("%s\n", (LPCTSTR)varOutput);
        }
        else
        {
            printf("\nNo rows found for state = '%s'\n",pState);
        }
        // Löschen der Objekte vor dem Beenden.
        pRstAuthors->Close();
        pConnection->Close();
   }

   catch(_com_error &e)
   {
       // Benachrichtigen des Benutzers über Fehler, falls vorhanden.
       // Übergeben eines Verbindungszeigers, auf den aus dem Recordset
       // zugegriffen wird.
       PrintProviderError(pConnection);
       PrintComError(e);
   }
}

//////////////////////////////////////////////////////////
//                                                      //
//        PrintProviderError-Funktion                   //
//                                                      //
//////////////////////////////////////////////////////////

void PrintProviderError(_ConnectionPtr pConnection)
{
    // Drucken der Providerfehler aus dem Connection-Objekt.
    // pErr ist ein Recordset-Objekt in der Errors-Auflistung der
    // Verbindung.
    ErrorPtr   pErr = NULL;

    if( (pConnection->Errors->Count) > 0)
    {
        long nCount = pConnection->Errors->Count;
        // Gültigkeitsbereich für Collection ist 0 bis nCount -1.
        for(long i = 0; i < nCount; i++)
        {
            pErr = pConnection->Errors->GetItem(i);
            printf("\t Error number: %x\t%s", pErr->Number,
                pErr->Description);
        }
    }
}

//////////////////////////////////////////////////////////
//                                                      //
//      PrintComError-Funktion                          //
//                                                      //
//////////////////////////////////////////////////////////

void PrintComError(_com_error &e)
{
   _bstr_t bstrSource(e.Source());
   _bstr_t bstrDescription(e.Description());

    // Drucken der Com-Fehler.
   printf("Error\n");
   printf("\tCode = %08lx\n", e.Error());
   printf("\tCode meaning = %s\n", e.ErrorMessage());
   printf("\tSource = %s\n", (LPCSTR) bstrSource);
   printf("\tDescription = %s\n", (LPCSTR) bstrDescription);

}


Beispiel für die Handler-Eigenschaft (VC++)

Dieses Beispiel verdeutlicht die Handler-Eigenschaft des RDS DataControl-Objekts. (Weitere Informationen hierzu finden Sie unter DataFactory-Anpassung.)

Bei diesem Beispiel wird davon ausgegangen, dass sich die nachstehenden Abschnitte in der Parameterdatei, MSDFMAP.INI, auf dem Server befinden:

[connect AuthorDataBase]
Access=ReadWrite
Connect="DSN=Pubs"
[sql AuthorById]
SQL="SELECT * FROM Authors WHERE au_id = ?"

Der von Ihnen verwendete Code ähnelt dabei dem nachstehenden. Der der SQL-Eigenschaft zugeordnete Befehl stimmt mit dem AuthorById-Bezeichner überein und ruft eine Zeile für den Autor, Michael O'Leary, ab. Die Connect-Eigenschaft im Code gibt zwar die Northwind-Datenbank als Datenquelle an, jedoch wird diese Datenquelle aufgrund des connect-Abschnitts in der Datei MSDFMAP.INI überschrieben. Die Recordset-Eigenschaft des DataControl-Objekts wird einem nicht verbundenen Recordset-Objekt nur aus codepragmatischen Gründen zugeordnet.

#import "c:\Programme\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")
#import "C:\Programme\Common Files\System\MSADC\msadco.dll"

#include <ole2.h>
#include <stdio.h>
#include <conio.h>

// Funktionsdeklarationen

inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};

void HandlerX(void);
void PrintProviderError(_ConnectionPtr pConnection);
void PrintComError(_com_error &e);

//////////////////////////////////////////////////////////
//                                                      //
//     Main-Funktion                                    //
//                                                      //
//////////////////////////////////////////////////////////

void main()
{
    If(FAILED(::CoInitialize(NULL)))
        return;

     HandlerX();

     printf("Press any key to continue...");
     getch();
     ::CoUninitialize();
    }
}

//////////////////////////////////////////////////////////
//                                                      //
//          HandlerX-Funktion                           //
//                                                      //
//////////////////////////////////////////////////////////

void HandlerX(void)
{
   HRESULT  hr = S_OK;

    // Definieren der ADO-Objektzeiger.
    // Initialisieren der Zeiger bei der Definition.
    // Sie befinden sich im ADODB::-Namespace.
    _RecordsetPtr  pRst = NULL;

    // Definieren der RDS-Objektzeiger.
    RDS::IBindMgrPtr dc;

    try
    {
        TESTHR(dc.CreateInstance(__uuidof(RDS::DataControl)));
        dc->Handler = "MSDFMAP.Handler";
        dc->Server = "http://srv";
        dc->Connect = "Data Source=AuthorDatabase";
        dc->SQL = "AuthorById(267-41-2394)";

        // Abrufen des Recordsets.
        dc->Refresh();

        // Verwenden eines anderen Recordsets, weil vorteilhaft.
        pRst = dc->GetRecordset();
        printf("Author is %s %s",(LPSTR) (_bstr_t) pRst->Fields->
            GetItem("au_fname")->Value,
            (LPSTR) (_bstr_t) pRst->Fields->GetItem("au_lname")->Value);
        pRst->Close();
    }

    catch (_com_error &e)
    {
        PrintProviderError(pRst->GetActiveConnection());
        PrintComError(e);
    }
}

//////////////////////////////////////////////////////////
//                                                      //
//      PrintProviderError-Funktion                     //
//                                                      //
//////////////////////////////////////////////////////////

void PrintProviderError(_ConnectionPtr pConnection)
{
    // Drucken der Providerfehler aus dem Connection-Objekt.
    // pErr ist ein Recordset-Objekt in der Errors-Auflistung der
    // Verbindung.
    ErrorPtr  pErr  = NULL;

    if( (pConnection->Errors->Count) > 0)
    {
        long nCount = pConnection->Errors->Count;
        // Gültigkeitsbereich für Collection ist 0 bis nCount -1.
        for(long i = 0; i < nCount; i++)
        {
            pErr = pConnection->Errors->GetItem(i);
            printf("Error number: %x\t%s\n", pErr->Number,
                pErr->Description);
        }
    }
}

//////////////////////////////////////////////////////////
//
//      PrintComError-Funktion                          //
//                                                      //
//////////////////////////////////////////////////////////

void PrintComError(_com_error &e)
{
    _bstr_t bstrSource(e.Source());
    _bstr_t bstrDescription(e.Description());

    // Drucken der Com-Fehler.
    printf("Error\n");
    printf("\tCode = %08lx\n", e.Error());
    printf("\tCode meaning = %s\n", e.ErrorMessage());
    printf("\tSource = %s\n", (LPCSTR) bstrSource);
    printf("\tDescription = %s\n", (LPCSTR) bstrDescription);
}


Beispiel für die InternetTimeout-Eigenschaft (VC++)

Dieses Beispiel verdeutlicht die InternetTimeout-Eigenschaft, die bei DataControl- und DataSpace-Objekten vorhanden ist. In diesem Fall wird die InternetTimeout-Eigenschaft auf das DataControl-Objekt angewendet und das Zeitlimit auf 20 Sekunden festgelegt.

#import "c:\Programme\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")
#import "C:\Programme\Common Files\System\MSADC\msadco.dll"

#include <ole2.h>
#include <stdio.h>
#include <conio.h>

// Funktionsdeklarationen
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void InternetTimeOutX(void);
void PrintProviderError(_ConnectionPtr pConnection);
void PrintComError(_com_error &e);

//////////////////////////////////////////////////////////
//                                                      //
//    Main-Funktion                                     //
//                                                      //
//////////////////////////////////////////////////////////

void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    InternetTimeOutX();

    ::CoUninitialize();
}

//////////////////////////////////////////////////////////
//                                                      //
//         InternetTimeOutX-Funktion                    //
//                                                      //
//////////////////////////////////////////////////////////

void InternetTimeOutX(void)
{
    HRESULT hr = S_OK;

    // Definieren der ADO-Objektzeiger.
    // Initialisieren der Zeiger bei der Definition.
    // Sie befinden sich im ADODB::-Namespace.
    _RecordsetPtr  pRst = NULL;

    // Definieren der RDS-Objektzeiger.
    RDS::IBindMgrPtr dc ;

    try
    {
        TESTHR(dc.CreateInstance(__uuidof(RDS::DataControl)));
        dc->Server = "http://srv";
        dc->Connect = "DSN=Pubs";
        dc->SQL = "SELECT * FROM Authors";

        // Mindestens 20 Sekunden warten.
        dc->InternetTimeout = 20000;
        dc->Refresh();

        // Anderes Recordset verwenden, da vorteilhaft.
        pRst = dc->GetRecordset();
        while(!(pRst->EndOfFile))
        {
            printf("%s %s",(LPSTR) (_bstr_t) pRst->Fields->
                GetItem("au_fname")->Value,
               (LPSTR) (_bstr_t) pRst->Fields->
                GetItem("au_lname")->Value);

            pRst->MoveNext();
        }
        pRst->Close();
    }

    catch (_com_error &e)
    {
        PrintProviderError(pRst->GetActiveConnection());
        PrintComError(e);
    }
}

//////////////////////////////////////////////////////////
//                                                      //
//     PrintProviderError-Funktion                      //
//                                                      //
//////////////////////////////////////////////////////////

void PrintProviderError(_ConnectionPtr pConnection)
{
    // Drucken der Providerfehler aus dem Connection-Objekt.
    // pErr ist ein Recordset-Objekt in der Errors-Auflistung der
    // Verbindung.
    ErrorPtr  pErr  = NULL;

    if( (pConnection->Errors->Count) > 0)
    {
        long nCount = pConnection->Errors->Count;
        // Gültigkeitsbereich für Collection ist 0 bis nCount -1.
        for(long i = 0; i < nCount; i++)
        {
            pErr = pConnection->Errors->GetItem(i);
            printf("\t Error number: %x\t%s", pErr->Number,
                pErr->Description);
        }
    }
}

//////////////////////////////////////////////////////////
//                                                      //
//     PrintComError-Funktion                           //
//                                                      //
//////////////////////////////////////////////////////////

void PrintComError(_com_error &e)
{
    _bstr_t bstrSource(e.Source());
    _bstr_t bstrDescription(e.Description());

    // Drucken der Com-Fehler.
    printf("Error\n");
    printf("\tCode = %08lx\n", e.Error());
    printf("\tCode meaning = %s\n", e.ErrorMessage());
    printf("\tSource = %s\n", (LPCSTR) bstrSource);
    printf("\tDescription = %s\n", (LPCSTR) bstrDescription);
}


Beispiel für die IsolationLevel- und Mode-Eigenschaften (VC++)

In diesem Beispiel wird die Mode-Eigenschaft zum Öffnen einer exklusiven Verbindung verwendet. Die IsolationLevel-Eigenschaft wird zum Öffnen einer Transaktion verwendet, die getrennt von anderen Transaktionen ausgeführt wird.

#import "C:\Programme\Common Files\System\ADO\msado15.dll"\
    no_namespace rename("EOF","EndOfFile")

#include <ole2.h>
#include <stdio.h>
#include <conio.h>
#include "IsolationLevelX.h"

// Funktionsdeklarationen
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void IsolationLevelX(void);
void PrintProviderError(_ConnectionPtr pConnection);
void PrintComError(_com_error &e);

/////////////////////////////////////////////////////////////////
//                                                             //
//                                                             //
//                        Main-Funktion                        //
//                                                             //
//                                                             //
/////////////////////////////////////////////////////////////////

void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    IsolationLevelX();

    ::CoUninitialize();
}

/////////////////////////////////////////////////////////////////
//                                                             //
//      IsolationLevelX()-Funktion                            //
//                                                             //
/////////////////////////////////////////////////////////////////

void IsolationLevelX(void)
{
    // Definieren von ADO-Objektzeigern.
    // Initialisieren der Zeiger bei der Definition.
    // Sie befinden sich im ADODB ::-Namespace.
    _RecordsetPtr pRstTitles = NULL;
    _ConnectionPtr pConnection = NULL;

    //  Definieren anderer Variablen
    HRESULT hr = S_OK;
    IADORecordBinding *picRs  = NULL;  // Deklaration des
                                 // Schnittstellenzeigers
    CTitlesRs titlers;                  // C++-Klassenobjekt.

    // Zuweisen der Verbindungszeichenfolge zu einer Variablen
    _bstr_t strCnn("Provider=sqloledb;Data Source=srv;"
                    "Initial Catalog=Pubs;User Id=sa;Password=;");

    try
    {
        // Öffnen der Verbindung und der Titles-Tabelle.
        TESTHR(pConnection.CreateInstance(__uuidof(Connection)));
        pConnection->Mode = adModeShareExclusive;
        pConnection->IsolationLevel = adXactIsolated;
        pConnection->Open(strCnn,"","",NULL);

        TESTHR(pRstTitles.CreateInstance(__uuidof(Recordset)));
        pRstTitles->CursorType = adOpenDynamic;
        pRstTitles->LockType = adLockPessimistic;

        pRstTitles->Open("Titles",_variant_t((IDispatch*) pConnection,
            true),adOpenDynamic,adLockPessimistic,adCmdTable);

        pConnection->BeginTrans();

        // Anzeigen des Verbindungsmodus.
        if(pConnection->Mode == adModeShareExclusive)
        {
            printf("Connection Mode Is Exclusive");
        }
        else
        {
            printf("Connection Mode Is Not Exclusive");
        }

        // Anzeigen der Isolationsstufe.
        if(pConnection->IsolationLevel == adXactIsolated)
        {
            printf("\n\nTransaction is Isolated");
            printf("\n\nPress any key to continue...\n\n");
            getch();
        }
        else
        {
            printf("\n\nTransaction is not Isolated");
            printf("\n\nPress any key to continue...\n\n");
            getch();
        }

        // Öffnen eines IADORecordBinding-Schnittstellenzeigers, der für
        // das Binden des Recordsets an eine Klasse verwendet wird.
        TESTHR(pRstTitles->QueryInterface(
            __uuidof(IADORecordBinding),(LPVOID*)&picRs));

        // Binden des Recordsets an eine C++-Klasse.
        TESTHR(picRs->BindToRecordset(&titlers));

        // Ändern des Typs der Psychologietitel.
        LPSTR p_TempStr = (LPSTR) malloc(sizeof(titlers.m_szau_Type));

        while (!(pRstTitles->EndOfFile))
        {
            // Entfernen der leeren Zeichenfolge.
            strcpy(p_TempStr,strtok(titlers.m_szau_Type," "));

            // Vergleichen von Typ mit Psychologie.
            if (!strcmp(p_TempStr,"psychology"))
            {
                    // Kopieren des Titelfeldes "self_help".
                    strcpy(titlers.m_szau_Type,"self_help");
                    picRs->Update(&titlers);
            }
            pRstTitles->MoveNext();
        }
        // Aktuelle Daten im Recordset drucken.
        pRstTitles->Requery(adOptionUnspecified);

        // Erneutes Öffnen der IADORecordBinding-Schnittstelle zum Binden
        // des Recordsets an eine Klasse.
        TESTHR(pRstTitles->QueryInterface(
            __uuidof(IADORecordBinding),(LPVOID*)&picRs));

        // Erneutes Binden des Recordsets an eine C++-Klasse.
        TESTHR(picRs->BindToRecordset(&titlers));

        // Springen zum ersten Recordset der Titles-Tabelle.
        pRstTitles->MoveFirst();

        //Löschen des Bildschirmes für die nächste Anzeige.
        system("cls");

        while (!pRstTitles->EndOfFile)
        {
            printf("%s -  %s\n",titlers.lau_TitleStatus == adFldOK ?
                titlers.m_szau_Title :"<NULL>",
                titlers.lau_TypeStatus == adFldOK ?
                titlers.m_szau_Type :"<NULL>");
            pRstTitles->MoveNext();
        }

        // Wiederherstellen der ursprünglichen Daten.
        pConnection->RollbackTrans();

        // Aufheben der Zuweisung des Speichers.
        free(p_TempStr);
        pRstTitles->Close();

        // Freigeben der IADORecordset-Schnittstelle.
        if(picRs)
            picRs->Release();
        pConnection->Close();
    }

    catch(_com_error &e)
    {
        // Benachrichtigen des Benutzers über Fehler, falls vorhanden.
        PrintProviderError(pConnection);
        PrintComError(e);
    }
}

/////////////////////////////////////////////////////////////////
//                                                             //
//                  PrintProviderError-Funktion                //
//                                                             //
/////////////////////////////////////////////////////////////////

void PrintProviderError(_ConnectionPtr pConnection)
{
    // Drucken der Providerfehler aus dem Connection-Objekt.
    // pErr ist ein Recordset-Objekt in der Errors-Auflistung der
    // Verbindung.
    ErrorPtr    pErr = NULL;

    if((pConnection->Errors->Count)>0)
    {
        long nCount = pConnection->Errors->Count;

        // Gültigkeitsbereich der Collection zwischen 0 und nCount-1.
        for(long i = 0;i < nCount;i++)
        {
            pErr = pConnection->Errors->GetItem(i);
            printf("\t Error Number :%x \t %s",pErr->Number,
                (LPCSTR) pErr->Description);
        }
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintComError-Funktion                           //
//                                                       //
///////////////////////////////////////////////////////////

void PrintComError(_com_error &e)
{
   _bstr_t bstrSource(e.Source());
   _bstr_t bstrDescription(e.Description());

    // Drucken der Com-Fehler.
    printf("Error\n");
    printf("\tCode = %08lx\n", e.Error());
    printf("\tCode meaning = %s\n", e.ErrorMessage());
    printf("\tSource = %s\n", (LPCSTR) bstrSource);
    printf("\tDescription = %s\n", (LPCSTR) bstrDescription);
}

IsolationLevelX.h:

// IsolationLevelX.h

#include "icrsint.h"

// Diese Klasse extrahiert Titel und den Typ aus der Titles-Tabelle.

class CTitlesRs : public CADORecordBinding
{
BEGIN_ADO_BINDING(CTitlesRs)
        // Die title-Spalte ist das zweite Feld in der Tabelle.
        ADO_VARIABLE_LENGTH_ENTRY2(2,adVarChar,m_szau_Title,
            sizeof(m_szau_Title),lau_TitleStatus,FALSE)
        // Die type-Spalte ist das dritte Feld in der Tabelle.
        ADO_VARIABLE_LENGTH_ENTRY2(3,adVarChar,m_szau_Type,
            sizeof(m_szau_Type),lau_TypeStatus,TRUE)
END_ADO_BINDING()

public:
    CHAR m_szau_Title[81];
    ULONG lau_TitleStatus;
    CHAR m_szau_Type[13];
    ULONG lau_TypeStatus;
};


Beispiel für die Item-Eigenschaft (VC++)

Dieses Beispiel verdeutlicht, wie die Item-Eigenschaft auf Mitglieder einer Auflistung zugreift. Dieses Beispiel öffnet die Authors-Tabelle der Pubs-Datenbank mit einem parametrisierten Befehl.

Auf den Befehlsparameter, der an die Datenbank ausgegeben wird, wird von der Parameters-Auflistung des Command-Objekts aus nach Index und Namen zugegriffen. Auf die Felder des zurückgegebenen Recordset-Objekts wird dann von der Fields-Auflistung des Objekts nach Index und Namen zugegriffen.

#import "C:\Programme\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <ole2.h>
#include <stdio.h>
#include <conio.h>

// Funktionsdeklarationen
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void ItemX(void);
void PrintProviderError(_ConnectionPtr pConnection);
void PrintComError(_com_error &e);

//////////////////////////////////////////////////////////
//                                                      //
//       Main-Funktion                                  //
//                                                      //
//////////////////////////////////////////////////////////

void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    ItemX();

    ::CoUninitialize();
}

//////////////////////////////////////////////////////////
//                                                      //
//       ItemX-Funktion                                 //
//                                                      //
//////////////////////////////////////////////////////////

void ItemX(void)
{
    HRESULT  hr = S_OK;

    // Definieren der ADO-Objektzeiger.
    // Initialisieren der Zeiger bei der Definition.
    // Sie befinden sich im ADODB::-Namespace.
   _ConnectionPtr  pConnection  = NULL;
   _RecordsetPtr   pRst     = NULL;
   _CommandPtr     pCmd     = NULL;
   _ParameterPtr   pPrm     = NULL;
    FieldPtr       pFld     = NULL;

    // Andere Variablen.
    _bstr_t strCnn("Provider=sqloledb;Data Source=srv;"
            "Initial Catalog=Pubs;User Id=sa;Password=;");
    _variant_t    Column[9];
    _variant_t    vIndex;

   try
    {
       // Öffnen der Verbindung.
        TESTHR(pConnection.CreateInstance(__uuidof(Connection)));

        TESTHR(pRst.CreateInstance(__uuidof(Recordset)));

        TESTHR(pCmd.CreateInstance(__uuidof(Command)));

        // Festlegen des Arrays mit den Feldnamen (Spaltennamen)
        // der Authors-Tabelle.
        Column[0] = "au_id";
        Column[1] = "au_lname";
        Column[2] = "au_fname";
        Column[3] = "phone";
        Column[4] = "address";
        Column[5] = "city";
        Column[6] = "state";
        Column[7] = "zip";
        Column[8] = "contract";

        _bstr_t strText("SELECT * FROM Authors WHERE state = ?");
        pCmd->CommandText = strText;

        pPrm = pCmd->CreateParameter("ItemXparm", adChar, adParamInput,
            2, "CA");
        pCmd->Parameters->Append(pPrm);

        pConnection->Open(strCnn, "", "", NULL);
        pCmd->ActiveConnection = pConnection;

        // Connection und CommandType werden ausgelassen, weil
        // ein Command-Objekt zur Verfügung gestellt wird.
        _variant_t Conn;
        Conn.vt = VT_ERROR;
        Conn.scode = DISP_E_PARAMNOTFOUND;

        pRst->Open((_variant_t((IDispatch *) pCmd)),Conn,adOpenStatic,
            adLockReadOnly, -1);

        printf("The Parameters collection accessed by index...\n");

        vIndex = (short) 0;
        pPrm = pCmd->Parameters->GetItem(&vIndex);
        printf("Parameter name = '%s', value = '%s'\n",
            (LPCSTR)pPrm->Name, (LPSTR)(_bstr_t)pPrm->Value);

        printf("\nThe Parameters collection accessed by name...\n");
        pPrm = pCmd->Parameters->Item["ItemXparm"];
        printf("Parameter name = '%s', value = '%s'\n",
            (LPCSTR)pPrm->Name, (LPSTR)(_bstr_t)pPrm->Value);

        printf("\nThe Fields collection accessed by index...\n");
        pRst->MoveFirst();
        long limit = 0;
        limit = ((pRst->Fields->Count) - 1);
        int intLineCnt = 8;
        for (short iIndex = 0; iIndex <= limit; iIndex++)
        {
            vIndex = iIndex;
            intLineCnt++;
            if (intLineCnt%15 == 0)
            {
                printf("\nPress any key to continue...\n");
                getch();
            }
            pFld = pRst->Fields->GetItem(&vIndex);
            printf("Field %d : Name =  '%s', ", iIndex,
                (LPCSTR)pFld->GetName());
            _variant_t FldVal = pFld->GetValue();

            // Da Value die Standardeigenschaft eines
            // Property-Objekts ist, ist die Verwendung des tatsächlichen
            // Schlüsselwortes an dieser Stelle optional.
            switch(FldVal.vt)
            {
                case (VT_BOOL):
                    if(FldVal.boolVal)
                    {
                        printf("Value = 'True'");
                    }
                    else
                    {
                        printf("Value = 'False'");
                    }
                    printf("\n");
                    break;
                case (VT_BSTR):
                    printf("Value = '%s'",
                        (LPCSTR)(_bstr_t)FldVal.bstrVal);
                    printf("\n");
                    break;
                case (VT_I4):
                    printf("Value = '%s'",(LPCSTR)FldVal.iVal);
                    printf("\n");
                    break;
                case (VT_EMPTY):
                    printf("Value = '%s'",(LPCSTR)FldVal.lVal);
                    printf("\n");
                    break;
                default:
                    break;
            }
        }

        printf("\nThe Fields collection accessed by name...\n");
        pRst->MoveFirst();
        for (iIndex = 0; iIndex <= 8; iIndex++)
        {
            intLineCnt++;
            if (intLineCnt%15 == 0)
            {
                printf("\nPress any key to continue...\n");
                getch();
            }
            pFld = pRst->Fields->GetItem(Column[iIndex]);
            printf("Field name = '%s', ",(LPCSTR)pFld->GetName());
            _variant_t FldVal = pFld->GetValue();

            // Da Value die Standardeigenschaft eines
            // Property-Objekts ist, ist die Verwendung des tatsächlichen
            // Schlüsselwortes an dieser Stelle optional.
            switch(FldVal.vt)
            {
                case (VT_BOOL):
                    if(FldVal.boolVal)
                    {
                        printf("Value = 'True'");
                    }
                    else
                    {
                        printf("Value = 'False'");
                    }
                    printf("\n");
                    break;
                case (VT_BSTR):
                    printf("Value = '%s'",
                        (LPCSTR)(_bstr_t)FldVal.bstrVal);
                    printf("\n");
                    break;
                case (VT_I4):
                    printf("Value = '%s'",(LPCSTR)FldVal.iVal);
                    printf("\n");
                    break;
                case (VT_EMPTY):
                    printf("Value = '%s'",(LPCSTR)FldVal.lVal);
                    printf("\n");
                    break;
                default:
                    break;
            }
        }
        // Löschen der Objekte vor dem Beenden.
        pRst->Close();
        pConnection->Close();
   }

   catch(_com_error &e)
   {
       // Benachrichtigen des Benutzers über Fehler, falls vorhanden.
       // Übergeben eines Verbindungszeigers, auf den aus dem Recordset
       // zugegriffen wird.
       PrintProviderError(pConnection);
       PrintComError(e);
   }
}

//////////////////////////////////////////////////////////
//                                                      //
//      PrintProviderError-Funktion                     //
//                                                      //
//////////////////////////////////////////////////////////

void PrintProviderError(_ConnectionPtr pConnection)
{
    // Drucken der Providerfehler aus dem Connection-Objekt.
    // pErr ist ein Recordset-Objekt in der Errors-Auflistung der
    // Verbindung.
    ErrorPtr    pErr  = NULL;

    if( (pConnection->Errors->Count) > 0)
    {
        long nCount = pConnection->Errors->Count;
        // Gültigkeitsbereich für Collection ist 0 bis nCount -1.
        for(long i = 0; i < nCount; i++)
        {
            pErr = pConnection->Errors->GetItem(i);
            printf("\t Error number: %x\t%s", pErr->Number,
                pErr->Description);
        }
    }
}

//////////////////////////////////////////////////////////
//                                                      //
//       PrintComError-Funktion                         //
//                                                      //
//////////////////////////////////////////////////////////

void PrintComError(_com_error &e)
{
   _bstr_t bstrSource(e.Source());
   _bstr_t bstrDescription(e.Description());

    // Drucken der Com-Fehler.
   printf("Error\n");
   printf("\tCode = %08lx\n", e.Error());
   printf("\tCode meaning = %s\n", e.ErrorMessage());
   printf("\tSource = %s\n", (LPCSTR) bstrSource);
   printf("\tDescription = %s\n", (LPCSTR) bstrDescription);
}


Beispiel für die MarshalOptions-Eigenschaft (VC++)

In diesem Beispiel wird die MarshalOptions-Eigenschaft verwendet, um die Zeilen anzugeben, die zurück an den Server gesendet werden - alle Zeilen oder nur geänderte Zeilen.

#import "C:\Programme\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <stdio.h>
#include <ole2.h>
#include <conio.h>
#include <malloc.h>
#include "MarshalOptionsX.h"

// Funktionsdeklarationen
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void MarshalOptionsX(void);
void PrintProviderError(_ConnectionPtr pConnection);
void PrintComError(_com_error &e);

///////////////////////////////////////////////////////////
//                                                       //
//               Main-Funktion                           //
//                                                       //
///////////////////////////////////////////////////////////

void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    MarshalOptionsX();

    ::CoUninitialize();
}

///////////////////////////////////////////////////////////
//                                                       //
//      Marshal Options-Funktion                         //
//                                                       //
///////////////////////////////////////////////////////////

void   MarshalOptionsX(void)
{

     // Definieren der Zeichenfolgevariablen.
    _bstr_t strCnn("Provider=sqloledb;Data Source=srv;"
            "Initial Catalog=Pubs;User Id=sa;Password=;");

    // Definieren der ADO-Objektzeiger.
    // Initialisieren der Zeiger bei der Definition.
    // Sie befinden sich im ADODB::-Namespace
    _RecordsetPtr pRstEmployees = NULL;

    // Definieren anderer Variablen.
    IADORecordBinding   *picRs  = NULL;  // Deklaration des
                                   // Schnittstellenzeigers
    CEmployeesRs emprs;               // C++-Klassenobjekt.
    HRESULT hr = S_OK;

    try
    {
        // Öffnen des Recordsets mit Namen aus der Employees-Tabelle.
        TESTHR(pRstEmployees.CreateInstance(__uuidof(Recordset)));
        pRstEmployees->CursorType = adOpenKeyset;
        pRstEmployees->LockType = adLockOptimistic;
        pRstEmployees->CursorLocation = adUseClient;
        pRstEmployees->Open("SELECT fname, lname FROM Employees "
            "ORDER BY lname",strCnn,
            adOpenKeyset, adLockOptimistic,adCmdText);

        // Öffnen eines IADORecordBinding-Schnittstellenzeigers, der für
        // die Bindung eines Recordsets an eine Klasse verwendet wird.
        TESTHR(pRstEmployees->QueryInterface(
            __uuidof(IADORecordBinding),(LPVOID*)&picRs));

        // Binden des Recordsets an eine C++-Klasse.
        TESTHR(picRs->BindToRecordset(&emprs));

        // Speichern der ursprünglichen Daten.
        LPSTR strOldFirst = (LPSTR) malloc(sizeof(emprs.m_szemp_fname));
        LPSTR strOldLast  = (LPSTR) malloc(sizeof(emprs.m_szemp_lname));
        strcpy(strOldFirst,strtok(emprs.m_szemp_fname," "));
        strcpy(strOldLast,strtok(emprs.m_szemp_lname," "));

        // Ändern der Daten im Editierpuffer.
        strcpy(emprs.m_szemp_fname,"Linda");
        strcpy(emprs.m_szemp_lname,"Kobara");

        // Anzeigen des Inhalts des Puffers und Abrufen der
        // Benutzereingabe.
        printf("Edit in Progress:\n");
        printf("Original Data = %s  %s \n",strOldFirst,strOldLast);
        printf("Data in buffer = %s  %s \n", emprs.lemp_fnameStatus ==
            adFldOK ? emprs.m_szemp_fname : "<NULL>",
            emprs.lemp_lnameStatus == adFldOK ?
            emprs.m_szemp_lname : "<NULL>");
        printf("Use Update to replace the original data with the "
            "buffered data in the Recordset?\nEnter (y/n) :?");
        char opt1=getch();

        if(toupper(opt1)=='Y')
        {
                printf("\nWould you like to send all the rows in "
                    "the recordset back to the server?\nEnter (y/n):");
                char opt2 = getch();
                if(toupper(opt2) == 'Y')
                {
                    {
                        pRstEmployees->MarshalOptions = adMarshalAll;
                        picRs->Update(&emprs);
                    }
                }
                else
                {
                    printf("\nWould you like to send only modified "
                        "rows back to the server?\nEnter (y/n):");
                    char opt3=getch();
                    if(toupper(opt3) == 'Y')
                        {
                            pRstEmployees->MarshalOptions =
                                adMarshalModifiedOnly;
                            picRs->Update(&emprs);
                        }
                }
        }
        // Anzeigen der sich ergebenden Daten.
        printf("\nData In the Recordset = %s  %s\n",
            emprs.lemp_fnameStatus == adFldOK ?
            emprs.m_szemp_fname : "<NULL>",
            emprs.lemp_lnameStatus == adFldOK ?
            emprs.m_szemp_lname : "<NULL>");

        // Wiederherstellen der ursprünglichen Daten, weil es sich um
        // ein Beispiel handelt.
        if((strcmp(strOldFirst,emprs.m_szemp_fname)) &&
           (strcmp(strOldLast,emprs.m_szemp_lname)))
        {
            strcpy(emprs.m_szemp_fname,strOldFirst);
            strcpy(emprs.m_szemp_lname,strOldLast);
            picRs->Update(&emprs);
        }
        // Aufheben der Zuweisung des Speichers.
        free(strOldFirst);
        free(strOldLast);

        // Freigeben der IADORecordset-Schnittstelle.
        if (picRs)
            picRs->Release();

        // Löschen der Objekte vor dem Beenden.
        pRstEmployees->Close();
    }

    catch(_com_error &e)
    {
       // Benachrichtigen des Benutzers über Fehler, falls vorhanden.
       // Übergeben eines Verbindungszeigers, auf den aus dem Recordset
       // zugegriffen wird.
        _variant_t vtConnect = pRstEmployees->GetActiveConnection();

        // GetActiveConnection gibt die Verbindungszeichenfolge zurück,
        // wenn die Verbindung nicht geöffnet ist; andernfalls wird das
        // Connection-Objekt zurückgegeben.
        switch(vtConnect.vt)
        {
            case VT_BSTR:
                PrintComError(e);
                break;
            case VT_DISPATCH:
                PrintProviderError(vtConnect);
                break;
            default:
                printf("Errors occured.");
                break;
        }
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintProviderError-Funktion                      //
//                                                       //
///////////////////////////////////////////////////////////

void PrintProviderError(_ConnectionPtr pConnection)
{
    // Drucken der Providerfehler aus dem Connection-Objekt.
    // pErr ist ein Recordset-Objekt in der Errors-Auflistung der
    // Verbindung.
    ErrorPtr     pErr   = NULL;

    if( (pConnection->Errors->Count) > 0)
    {
        long nCount = pConnection->Errors->Count;
        // Gültigkeitsbereich für Collection ist 0 bis nCount -1.
        for(long i = 0; i < nCount; i++)
        {
            pErr = pConnection->Errors->GetItem(i);
            printf("\t Error number: %x\t%s", pErr->Number,
                (LPCSTR) pErr->Description);
        }
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintComError-Funktion                           //
//                                                       //
///////////////////////////////////////////////////////////

void PrintComError(_com_error &e)
{
    _bstr_t bstrSource(e.Source());
    _bstr_t bstrDescription(e.Description());

     // Drucken der Com-Fehler.
    printf("Error\n");
    printf("\tCode = %08lx\n", e.Error());
    printf("\tCode meaning = %s\n", e.ErrorMessage());
    printf("\tSource = %s\n", (LPCSTR) bstrSource);
    printf("\tDescription = %s\n", (LPCSTR) bstrDescription);
}

MarshalOptionsX.h:

// MarshalOptionsX.h

#include "icrsint.h"

// Diese Klasse extrahiert nur fname und lname aus der
// Employees-Tabelle.
class CEmployeesRs : public CADORecordBinding
{
BEGIN_ADO_BINDING(CEmployeesRs)
    // Die fname-Spalte ist das erste Feld im Recordset.
    ADO_VARIABLE_LENGTH_ENTRY2(1, adVarChar, m_szemp_fname,
         sizeof(m_szemp_fname), lemp_fnameStatus, TRUE)

     // Die lname-Spalte ist das zweite Feld im Recordset.
    ADO_VARIABLE_LENGTH_ENTRY2(2, adVarChar, m_szemp_lname,
         sizeof(m_szemp_lname), lemp_lnameStatus, TRUE)

END_ADO_BINDING()

public:
   CHAR   m_szemp_fname[21];
   ULONG   lemp_fnameStatus;
   CHAR   m_szemp_lname[31];
   ULONG   lemp_lnameStatus;
};


Beispiel für die MaxRecords-Eigenschaft (VC++)

In diesem Beispiel wird die MaxRecords-Eigenschaft zum Öffnen eines Recordset-Objekts verwendet, das die 10 Titel mit den höchsten Kosten in der Titles-Tabelle enthält.

#import "C:\Programme\Common Files\System\ADO\msado15.dll"\
    no_namespace rename("EOF","EndOfFile")

#include <ole2.h>
#include <stdio.h>
#include <conio.h>
#include "MaxRecordsX.h"

// Funktionsdeklarationen
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void MaxRecordsX(void);
void PrintProviderError(_ConnectionPtr pConnection);
void PrintComError(_com_error &e);

//////////////////////////////////////////////////////////////
//                                                          //
//                        Main-Funktion                     //
//                                                          //
//////////////////////////////////////////////////////////////

void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    MaxRecordsX();

    ::CoUninitialize();
}

//   MaxRecordsX()-Funktion
void  MaxRecordsX(void)
{
    // Definieren der ADO-Objektzeiger
    // Initialisieren der Zeiger bei der Definition.
    // Sie befinden sich im ADODB ::-Namespace.
    _RecordsetPtr pRstTemp    = NULL;

    // Definieren anderer Variablen.
    IADORecordBinding *picRs  = NULL;   // Deklaration des
                                  // Schnittstellenzeigers
    CTitlesRs titlers;            // C++-Klassenobjekt.
    HRESULT hr = S_OK;

    try
    {
        // Zuweisen der Verbindungszeichenfolge zu einer Variablen.
        _bstr_t strCnn("Provider=sqloledb;Data Source=srv;"
                    "Initial Catalog=Pubs;User Id=sa;Password=;");

        // Öffnen des Recordsets, das die 10 teuersten Titel in der
        // Titles-Tabelle enthält.
        TESTHR(pRstTemp.CreateInstance(__uuidof(Recordset)));

        pRstTemp->MaxRecords=10;

        pRstTemp->Open("SELECT title,price FROM Titles "
            "ORDER BY Price DESC",strCnn,adOpenForwardOnly,
            adLockReadOnly,adCmdText);

        // Öffnen eines IADORecordBinding-Schnittstellenzeigers, der für
        // das Binden eines Recordsets an eine Klasse verwendet wird.
        TESTHR(pRstTemp->QueryInterface(
            __uuidof(IADORecordBinding),(LPVOID*)&picRs));

        // Binden des Recordsets an eine C++-Klasse.
        TESTHR(picRs->BindToRecordset(&titlers));

        // Anzeigen des Inhalts des Recordsets.
        printf("Top Ten Titles by Price:\n\n");

        while(!(pRstTemp->EndOfFile))
        {
            printf("%s ---  %6.2lf\n\n",titlers.lau_TitleStatus ==
                adFldOK ? titlers.m_szau_Title : "<NULL>",
                    titlers.lau_PriceStatus == adFldOK ?
                    titlers.m_szau_Price : 0.00);
            pRstTemp->MoveNext();
        }
        // Löschen der Objekte vor dem Beenden.
        pRstTemp->Close();
        if(picRs)
            picRs->Release();
    }
    catch(_com_error &e)
    {
       // Benachrichtigen des Benutzers über Fehler, falls vorhanden.
       // Übergeben eines Verbindungszeigers, auf den aus dem Recordset
       // zugegriffen wird.
        _variant_t vtConnect = pRstTemp->GetActiveConnection();

        // GetActiveConnection gibt die Verbindungszeichenfolge zurück,
        // wenn die Verbindung nicht geöffnet ist; andernfalls wird das
        // Connection-Objekt zurückgegeben.
        switch(vtConnect.vt)
        {
            case VT_BSTR:
                PrintComError(e);
                break;
            case VT_DISPATCH:
                PrintProviderError(vtConnect);
                break;
            default:
                printf("Errors occured.");
                break;
        }
    }
};

//////////////////////////////////////////////////////////////
//                                                          //
//                  PrintProviderError-Funktion             //
//                                                          //
//////////////////////////////////////////////////////////////

void PrintProviderError(_ConnectionPtr pConnection)
{
    // Drucken der Providerfehler aus dem Connection-Objekt.
    // pErr ist ein Recordset-Objekt in der Errors-Auflistung der
    // Verbindung.
    ErrorPtr    pErr = NULL;

    if((pConnection->Errors->Count)>0)
    {
        long nCount = pConnection->Errors->Count;

        // Gültigkeitsbereich der Collection von 0 bis nCount-1.
        for(long i = 0;i < nCount;i++)
        {
            pErr = pConnection->Errors->GetItem(i);
            printf("\t Error Number :%x \t %s",pErr->Number,
                pErr->Description);
        }
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintComError-Funktion                           //
//                                                       //
///////////////////////////////////////////////////////////

void PrintComError(_com_error &e)
{
    _bstr_t bstrSource(e.Source());
    _bstr_t bstrDescription(e.Description());

    // Drucken der Com-Fehler.
    printf("Error\n");
    printf("\tCode = %08lx\n", e.Error());
    printf("\tCode meaning = %s\n", e.ErrorMessage());
    printf("\tSource = %s\n", (LPCSTR) bstrSource);
    printf("\tDescription = %s\n", (LPCSTR) bstrDescription);
}

MaxRecordsX.h:

// MaxRecordsX.h

#include "icrsint.h"

// Diese Klasse extrahiert title und type aus der Titles-Tabelle.

class CTitlesRs : public CADORecordBinding
{
    BEGIN_ADO_BINDING(CTitlesRs)
        // Die title-Spalte ist das erste Feld im Recordset.
        ADO_VARIABLE_LENGTH_ENTRY2(1,adVarChar,m_szau_Title,
            sizeof(m_szau_Title),lau_TitleStatus,FALSE)
        // Die price-Spalte ist das zweite Feld im Recordset.
        ADO_VARIABLE_LENGTH_ENTRY2(2,adDouble,m_szau_Price,
            sizeof(m_szau_Price),lau_PriceStatus,FALSE)
END_ADO_BINDING()

public:
    CHAR m_szau_Title[81];
    ULONG lau_TitleStatus;
    DOUBLE m_szau_Price;
    ULONG lau_PriceStatus;
};


Beispiel für die Move-Methode (VC++)

In diesem Beispiel wird die Move-Methode zum Positionieren des Datensatzzeigers auf der Grundlage einer Benutzereingabe verwendet.

#import "C:\Programme\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <stdio.h>
#include <ole2.h>
#include <stdlib.h>
#include <conio.h>
#include "MoveX.h"

// Funktionsdeklaration.
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void MoveX(void);
void PrintProviderError(_ConnectionPtr pConnection);
void PrintComError(_com_error &e);

///////////////////////////////////////////////////////////
//                                                       //
//      Main-Funktion                                    //
//                                                       //
///////////////////////////////////////////////////////////
void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    MoveX();

    ::CoUninitialize();
}

//////////////////////////////////////////////////
//                                              //
//      MoveX-Funktion                          //
//                                              //
//////////////////////////////////////////////////

void MoveX(void)
{
    // Definieren der ADO-Objektzeiger.
    // Initialisieren der Zeiger bei der Definition.
    // Sie befinden sich im ADODB::-Namespace.
    _RecordsetPtr  pRstAuthors    = NULL;

    // Definieren anderer Variablen
    IADORecordBinding   *picRs = NULL;  //Deklaration des
                                 // Schnittstellenzeigers
    CAuthorsRs    authorsrs;         // C++-Klassenobjekt.
    HRESULT hr = S_OK;

    // Öffnen der Authors-Tabelle.
    _bstr_t strCnn("Provider=sqloledb;Data Source=SRV;"
            "Initial Catalog=Pubs;User Id=sa;Password=;");

    try
    {
        // Öffnen des Recordsets aus der Authors-Tabelle.
        TESTHR(pRstAuthors.CreateInstance(__uuidof(Recordset)));

        pRstAuthors->CursorType = adOpenStatic;
        // Verwenden eines Clientcursors zum Aktivieren der
        // AbsolutePosition-Eigenschaft.
        pRstAuthors->CursorLocation = adUseClient;

        pRstAuthors->Open("SELECT au_id, au_fname, au_lname, city, "
            "state FROM Authors ORDER BY au_lname", strCnn, adOpenStatic,
            adLockReadOnly, adCmdText);

        // Öffnen eines IADORecordBinding-Schnittstellenzeigers, der für
        // das Binden des Recordsets an eine Klasse verwendet wird.
        TESTHR(pRstAuthors->QueryInterface(
            __uuidof(IADORecordBinding),(LPVOID*)&picRs));

        // Binden des Recordsets an eine C++-Klasse.
        TESTHR(picRs->BindToRecordset(&authorsrs));

        pRstAuthors->MoveFirst();

        while(true)
        {
            // Anzeigen von Informationen zum aktuellen Recordset und
            // Fragen, wie viele Datensätze verschoben werden sollen.
            printf("Record %ld of %d\n", pRstAuthors->AbsolutePosition,
                pRstAuthors->RecordCount);
            printf("Author: %s %s\n",
                authorsrs.lemp_fnameStatus == adFldOK ?
                authorsrs.m_au_fname : "<NULL>",
                authorsrs.lemp_lnameStatus == adFldOK ?
                authorsrs.m_au_lname : "<NULL>");
            printf("Location: %s, %s\n\n",
                authorsrs.lemp_cityStatus == adFldOK ?
                authorsrs.m_au_city : "<NULL>",
                authorsrs.lemp_stateStatus == adFldOK ?
                authorsrs.m_au_state : "<NULL>");

            char *strMove;
            char strTemp[5];
            printf("Enter number of records to Move "
                "\n(positive or negative, Enter to quit): ");
            gets(strTemp);

            strMove = strtok(strTemp," ");

            if (strMove == NULL)
                break;

            // Benutzer benachrichtigen, wenn die Eingabe nicht numerisch
            // ist.
            if(!atol(strMove))
            {
                printf("Expecting numeric value...\n");
                continue;
            }

            // Lesezeichen für den Fall speichern, dass das Verschieben
            // zu weit nach vorne oder hinten erfolgt.
            _variant_t varBookmark = pRstAuthors->Bookmark;

            // Move-Methode erfordert Parameter vom Datentyp Long.
            long lngMove = atol(strMove);

            pRstAuthors->Move(lngMove);

            // Überprüfen auf BOF oder EOF.
            if(pRstAuthors->BOF)
            {
                printf("Too far backward! Returning to current"
                    " record.\n");
                pRstAuthors->Bookmark = varBookmark;
            }

            if(pRstAuthors->EndOfFile)
            {
                printf("Too far forward! Returning to current"
                    " record.\n");
                pRstAuthors->Bookmark = varBookmark;
            }
        }
        // Löschen der Objekte vor dem Beenden.
        pRstAuthors->Close();
        // Freigeben der IADORecordset-Schnittstelle.
        if (picRs)
            picRs->Release();
    }

    catch(_com_error &e)
    {
       // Benachrichtigen des Benutzers über Fehler, falls vorhanden.
       // Übergeben eines Verbindungszeigers, auf den aus dem Recordset
       // zugegriffen wird.
        _variant_t vtConnect = pRstAuthors->GetActiveConnection();

        // GetActiveConnection gibt die Verbindungszeichenfolge zurück,
        // wenn die Verbindung nicht geöffnet ist; andernfalls wird das
        // Connection-Objekt zurückgegeben.
        switch(vtConnect.vt)
        {
            case VT_BSTR:
                PrintComError(e);
                break;
            case VT_DISPATCH:
                PrintProviderError(vtConnect);
                break;
            default:
                printf("Errors occured.");
                break;
        }
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintProviderError-Funktion                      //
//                                                       //
///////////////////////////////////////////////////////////

void PrintProviderError(_ConnectionPtr pConnection)
{
    // Drucken der Providerfehler aus dem Connection-Objekt.
    // pErr ist ein Recordset-Objekt in der Errors-Auflistung der
    // Verbindung.
    ErrorPtr  pErr  = NULL;

    if( (pConnection->Errors->Count) > 0)
    {
        long nCount = pConnection->Errors->Count;
        // Gültigkeitsbereich für Collection ist 0 bis nCount -1.
        for(long i = 0; i < nCount; i++)
        {
            pErr = pConnection->Errors->GetItem(i);
            printf("\t Error number: %x\t%s", pErr->Number,
                 (LPCSTR) pErr->Description);
        }
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintComError-Funktion                           //
//                                                       //
///////////////////////////////////////////////////////////

void PrintComError(_com_error &e)
{
   _bstr_t bstrSource(e.Source());
   _bstr_t bstrDescription(e.Description());

    // Drucken der Com-Fehler.
   printf("Error\n");
   printf("\tCode = %08lx\n", e.Error());
   printf("\tCode meaning = %s\n", e.ErrorMessage());
   printf("\tSource = %s\n", (LPCSTR) bstrSource);
   printf("\tDescription = %s\n", (LPCSTR) bstrDescription);
}

MoveX.h:

// MoveX.h

#include "icrsint.h"

// Diese Klasse extrahiert fname, lname, city und state
// aus der Authors-Tabelle.

class CAuthorsRs : public CADORecordBinding
{
BEGIN_ADO_BINDING(CAuthorsRs)

    // Die au_id-Spalte ist das erste Feld im Recordset.

    ADO_VARIABLE_LENGTH_ENTRY2(2, adVarChar, m_au_fname,
         sizeof(m_au_fname), lemp_fnameStatus, TRUE)

    ADO_VARIABLE_LENGTH_ENTRY2(3, adVarChar, m_au_lname,
         sizeof(m_au_lname), lemp_lnameStatus, TRUE)

    ADO_VARIABLE_LENGTH_ENTRY2(4, adVarChar, m_au_city,
         sizeof(m_au_city), lemp_cityStatus, TRUE)

    ADO_VARIABLE_LENGTH_ENTRY2(5, adChar, m_au_state,
         sizeof(m_au_state), lemp_stateStatus, TRUE)

END_ADO_BINDING()

public:
    char     m_au_fname[21];
    ULONG    lemp_fnameStatus;
    char     m_au_lname[41];
    ULONG    lemp_lnameStatus;
    char     m_au_city[21];
    ULONG    lemp_cityStatus;
    char     m_au_state[3];
    ULONG    lemp_stateStatus;
};


Beispiel für die MoveFirst-, MoveLast-, MoveNext- und MovePrevious-Methoden (VC++)

In diesem Beispiel werden die Methoden MoveFirst, MoveLast, MoveNext und MovePrevious verwendet, um den Datensatzzeiger eines Recordset-Objekts auf der Grundlage des übermittelten Befehls zu verschieben. Zum Ausführen dieses Beispiels ist die MoveAny-Funktion erforderlich.

#include <ole2.h>
#include <stdio.h>

#import "c:\Programme\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

// Funktionsdeklarationen
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void MoveFirstX();
void MoveAny(int intChoice, _RecordsetPtr pRstTemp);
void PrintProviderError(_ConnectionPtr pConnection);
void PrintComError(_com_error &e);

/////////////////////////////////
//      Main-Funktion          //
/////////////////////////////////

void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    MoveFirstX();

    ::CoUninitialize();
}

//////////////////////////////////////
//      MoveFirstX-Funktion         //
//////////////////////////////////////

void MoveFirstX()
{
    HRESULT    hr = S_OK;
    _RecordsetPtr    pRstAuthors  = NULL;
    _bstr_t     strCnn("Provider=sqloledb;Data Source=srv;"
            "Initial Catalog=Pubs;User Id=sa;Password=;");
    _bstr_t strMessage("UPDATE Titles SET Type = "
            "'psychology' WHERE Type = 'self_help'");
    int intCommand = 0;

    // Temporäre Zeichenfolgevariable für die Typumwandlung für den
    // Druck.
    _bstr_t  bstrFName;
    _bstr_t  bstrLName;

    try
    {
        // Öffnen des Recordsets aus der Authors-Tabelle.
        TESTHR(pRstAuthors.CreateInstance(__uuidof(Recordset)));
        pRstAuthors->CursorType = adOpenStatic;

        // Verwenden des Clientcursors zum Aktivieren der
        // AbsolutePosition-Eigenschaft.
        pRstAuthors->CursorLocation = adUseClient;
        pRstAuthors->Open("Authors", strCnn, adOpenStatic,
            adLockBatchOptimistic, adCmdTable);

        // Anzeigen der aktuellen Recordsetinformationen und Abrufen der
        // Methodenauswahl des Benutzers.
        while (true)  // Fortwährende Schleife.
        {
            // Konvertieren der Variant-Zeichenfolge in einen
            // konvertierbaren Zeichenfolgetyp.
            bstrFName = pRstAuthors->Fields->Item["au_fName"]->Value;
            bstrLName = pRstAuthors->Fields->Item["au_lName"]->Value;

            printf("Name: %s %s\n Record %d of %d\n\n",
                (LPCSTR) bstrFName,
                (LPCSTR) bstrLName,
                pRstAuthors->AbsolutePosition,
                pRstAuthors->RecordCount);
            printf("[1 - MoveFirst, 2 - MoveLast, \n");
            printf(" 3 - MoveNext, 4 – MovePrevious, 5 - Quit]\n");

            scanf("%d", &intCommand);

            if ((intCommand < 1) || (intCommand > 4))
                break;   // Eintrag außerhalb des Gültigkeitsbereichs
                         // beendet die Programmschleife.

            // Aufrufen einer Methode basierend auf der Eingabe des
            // Benutzers.
            MoveAny(intCommand, pRstAuthors);
        }

        pRstAuthors->Close();
    }
    catch (_com_error &e)
    {
       // Benachrichtigen des Benutzers über Fehler, falls vorhanden.
       // Übergeben eines Verbindungszeigers, auf den aus dem Recordset
       // zugegriffen wird.
        _variant_t vtConnect = pRstAuthors->GetActiveConnection();

        // GetActiveConnection gibt die Verbindungszeichenfolge zurück,
        // wenn die Verbindung nicht geöffnet ist; andernfalls wird das
        // Connection-Objekt zurückgegeben.
        switch(vtConnect.vt)
        {
            case VT_BSTR:
                PrintComError(e);
                break;
            case VT_DISPATCH:
                PrintProviderError(vtConnect);
                break;
            default:
                printf("Errors occured.");
                break;
        }
    }
}

/////////////////////////////////
//      MoveAny-Funktion       //
/////////////////////////////////

void MoveAny(int intChoice, _RecordsetPtr pRstTemp)
{
    // Verwenden der angegebenen Methode und Überprüfen auf BOF und EOF.
    try
    {
        switch(intChoice)
        {
            case 1:
                pRstTemp->MoveFirst();
                break;
            case 2:
                pRstTemp->MoveLast();
                break;
            case 3:
                pRstTemp->MoveNext();
                if (pRstTemp->EndOfFile)
                {
                    printf("\nAlready at end of recordset!\n");
                    pRstTemp->MoveLast();
                }    //End If
                break;
            case 4:
                pRstTemp->MovePrevious();
                if (pRstTemp->BOF)
                {
                    printf("\nAlready at beginning of recordset!\n");
                    pRstTemp->MoveFirst();
                }
                break;
            default:
                ;
        }
    }

    catch(_com_error &e)
    {
       // Benachrichtigen des Benutzers über Fehler, falls vorhanden.
       // Übergeben eines Verbindungszeigers, auf den aus dem Recordset
       // zugegriffen wird.
        _variant_t vtConnect = pRstTemp->GetActiveConnection();

        // GetActiveConnection gibt die Verbindungszeichenfolge zurück,
        // wenn die Verbindung nicht geöffnet ist; andernfalls wird das
        // Connection-Objekt zurückgegeben.
        switch(vtConnect.vt)
        {
            case VT_BSTR:
                PrintComError(e);
                break;
            case VT_DISPATCH:
                PrintProviderError(vtConnect);
                break;
            default:
                printf("Errors occured.");
                break;
        }
    }
}

////////////////////////////////////////////
//      PrintProviderError-Funktion       //
////////////////////////////////////////////

void PrintProviderError(_ConnectionPtr pConnection)
{
    // Drucken der Providerfehler aus dem Connection-Objekt.

    // pErr ist ein Recordset-Objekt in der Errors-Auflistung der
    // Verbindung.
    ErrorPtr  pErr  = NULL;

    if( (pConnection->Errors->Count) > 0)
    {
        long nCount = pConnection->Errors->Count;
        // Gültigkeitsbereich Collection von 0 bis nCount - 1..
        for(long i = 0; i < nCount; i++)
        {
            pErr = pConnection->Errors->GetItem(i);
            printf("\t Error number: %x\t%s", pErr->Number,
                pErr->Description);
        }
    }
}

//////////////////////////////////////
//      PrintComError-Funktion      //
//////////////////////////////////////

void PrintComError(_com_error &e)
{
    _bstr_t bstrSource(e.Source());
    _bstr_t bstrDescription(e.Description());

    // Drucken der Com-Fehler.
    printf("Error\n");
    printf("\tCode = %08lx\n", e.Error());
    printf("\tCode meaning = %s\n", e.ErrorMessage());
    printf("\tSource = %s\n", (LPCSTR) bstrSource);
    printf("\tDescription = %s\n", (LPCSTR) bstrDescription);
}


Beispiel für die NextRecordset-Methode (VC++)

In diesem Beispiel werden die Daten eines Recordsets mithilfe der NextRecordset-Methode verdeutlicht. Im Recordset wird eine Verbundbefehlsanweisung verwendet, die aus drei einzelnen SELECT-Anweisungen besteht.

#import "C:\Programme\Gemeinsame Dateien\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <stdio.h>
#include <ole2.h>
#include <conio.h>
#include <stdlib.h>

// Funktionsdeklaration.
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void NextRecordsetX(void);
void PrintProviderError(_ConnectionPtr pConnection);
void PrintComError(_com_error &e);

///////////////////////////////////////////////////////////
//                                                       //
//      Main-Funktion                                    //
//                                                       //
///////////////////////////////////////////////////////////
void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    NextRecordsetX();

    ::CoUninitialize();
}

//////////////////////////////////////////////////
//                                              //
//      NextRecordsetX-Funktion                 //
//                                              //
//////////////////////////////////////////////////

void NextRecordsetX(void)
{
    // Definieren der ADO-Objektzeiger.
    // Initialisieren der Zeiger bei der Definition.
    // Sie befinden sich im ADODB::-Namespace.
    _RecordsetPtr    pRstCompound = NULL;

    // Definieren anderer Variablen.
    HRESULT hr = S_OK;
    _variant_t index;
    index.vt = VT_I2;

    // Zuweisen einer Verbindungszeichenfolge zu einer Variablen.
    _bstr_t strCnn("Provider=sqloledb;Data Source=srv;"
            "Initial Catalog=Pubs;User Id=sa;Password=;");

    try
    {
        // Öffnen des Recordsets aus der Authors-Tabelle.
        TESTHR(pRstCompound.CreateInstance(__uuidof(Recordset)));

        // Übergeben des Cursortyps und des Sperrtyps an das Recordset.
        pRstCompound->Open("SELECT * FROM Authors;SELECT * FROM stores;"
            "SELECT * FROM jobs", strCnn, adOpenForwardOnly,
            adLockReadOnly, adCmdText);

        // Anzeigen der Ergebnisse aller SELECT-Anweisungen.
        int intCount = 1;
        while(!(pRstCompound==NULL))
        {
            printf("\n\nContents of recordset #%d\n", intCount);

            while(!pRstCompound->EndOfFile)
            {
                index.iVal = 0;
                printf("%s\t", (LPCSTR)(_bstr_t)pRstCompound->\
                            GetFields()->GetItem(& index)->Value);
                index.iVal = 1;
                printf("%s\n", (LPCSTR)(_bstr_t)pRstCompound->\
                                Fields->GetItem(& index)->Value);

                pRstCompound->MoveNext();

                int intLine = intLine + 1;
                if (intLine % 22 == 0)
                {
                    printf("\nPress any key to continue...");
                    getch();

                    // Löschen des Bildschirms für die nächste Anzeige.
                    system("cls");
                }
            }
            long    lngRec = 0;
            pRstCompound = pRstCompound->
                NextRecordset((VARIANT *)lngRec);

            printf("\nPress any key to continue...");
            getch();
            intCount = intCount + 1;
        }
    }

    catch(_com_error &e)
    {
       // Benachrichtigen des Benutzers über Fehler, falls vorhanden.
       // Übergeben eines Verbindungszeigers, auf den aus dem Recordset
       // zugegriffen wird.
        _variant_t vtConnect = pRstCompound->GetActiveConnection();

        // GetActiveConnection gibt die Verbindungszeichenfolge zurück,
        // wenn die Verbindung nicht geöffnet ist; andernfalls wird das
        // Connection-Objekt zurückgegeben.
        switch(vtConnect.vt)
        {
            case VT_BSTR:
                PrintComError(e);
                break;
            case VT_DISPATCH:
                PrintProviderError(vtConnect);
                break;
            default:
                printf("Errors occured.");
                break;
        }
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintProviderError-Funktion                      //
//                                                       //
///////////////////////////////////////////////////////////

void PrintProviderError(_ConnectionPtr pConnection)
{
    // Drucken der Providerfehler aus dem Connection-Objekt.
    // pErr ist ein Recordset-Objekt in der Errors-Auflistung der
    // Verbindung.
    ErrorPtr    pErr  = NULL;

    if( (pConnection->Errors->Count) > 0)
    {
        long nCount = pConnection->Errors->Count;

        // Gültigkeitsbereich für Collection ist 0 bis nCount -1.
        for(long i = 0;i < nCount;i++)
        {
            pErr = pConnection->Errors->GetItem(i);
            printf("\t Error number: %x\t%s", pErr->Number,
                pErr->Description);
        }
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintComError-Funktion                           //
//                                                       //
///////////////////////////////////////////////////////////

void PrintComError(_com_error &e)
{
   _bstr_t bstrSource(e.Source());
   _bstr_t bstrDescription(e.Description());

    // Drucken der Com-Fehler.
   printf("Error\n");
   printf("\tCode = %08lx\n", e.Error());
   printf("\tCode meaning = %s\n", e.ErrorMessage());
   printf("\tSource = %s\n", (LPCSTR) bstrSource);
   printf("\tDescription = %s\n", (LPCSTR) bstrDescription);
}


Beispiel für die NumericScale- und Precision-Eigenschaften (VC++)

In diesem Beispiel werden die Eigenschaften NumericScale und Precision zum Anzeigen der numerischen Skalierung und Genauigkeit der Felder in der Discounts-Tabelle der Pubs-Datenbank verwendet.

#import "C:\Programme\Gemeinsame Dateien\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <ole2.h>
#include <stdio.h>
#include <conio.h>

// Funktionsdeklarationen
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void NumericScaleX(void);
void PrintProviderError(_ConnectionPtr pConnection);
void PrintComError(_com_error &e);

///////////////////////////////////////////////////////////
//                                                       //
//      Main-Funktion                                    //
//                                                       //
///////////////////////////////////////////////////////////

void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    NumericScaleX();

    ::CoUninitialize();
}

///////////////////////////////////////////////////////////
//                                                       //
//      NumericScaleX-Funktion                           //
//                                                       //
///////////////////////////////////////////////////////////

void NumericScaleX(void)
{
    // Definieren der ADO-Objektzeiger.
    // Initialisieren der Zeiger bei der Definition.
    // Sie befinden sich im ADODB::-Namespace
    _RecordsetPtr  pRstDiscounts  = NULL;
     FieldsPtr  fldTemp  = NULL;

    // Definieren anderer Variablen
    HRESULT  hr = S_OK;
    _variant_t Index;
    Index.vt = VT_I2;

    _bstr_t strCnn("Provider=sqloledb;Data Source=srv;"
         "Initial Catalog=Pubs;User Id=sa;Password=;");

    try
    {
        // Öffnen des Recordsets.
        TESTHR(pRstDiscounts.CreateInstance(__uuidof(Recordset)));
        pRstDiscounts->Open("Discounts", strCnn, adOpenForwardOnly,
            adLockReadOnly, adCmdTable);

        // Anzeigen der numerischen Skala und der Genauigkeit der
        // numerischen und Small Integer-Felder.
        fldTemp = pRstDiscounts->GetFields();

        for (int intLoop=0;intLoop < (int)fldTemp->GetCount();intLoop++)
        {
            Index.iVal = intLoop;

            if ((fldTemp->GetItem(Index)->Type == adNumeric)
                || (fldTemp->GetItem(Index)->Type == adSmallInt))
            {
                printf("Field: %s\n" ,(LPCSTR)fldTemp->
                    GetItem(Index)->GetName());
                printf("Numeric scale: %d\n", fldTemp->
                    GetItem(Index)->GetNumericScale());
                printf("Precision: %d\n", fldTemp->
                    GetItem(Index)->GetPrecision());
            }
        }
      // Löschen der Objekte vor dem Beenden.
      pRstDiscounts->Close();
    }

    catch(_com_error &e)
    {
       // Benachrichtigen des Benutzers über Fehler, falls vorhanden.
       // Übergeben eines Verbindungszeigers, auf den aus dem Recordset
       // zugegriffen wird.
        _variant_t vtConnect = pRstDiscounts->GetActiveConnection();

        // GetActiveConnection gibt die Verbindungszeichenfolge zurück,
        // wenn die Verbindung nicht geöffnet ist; andernfalls wird das
        // Connection-Objekt zurückgegeben.
        switch(vtConnect.vt)
        {
            case VT_BSTR:
                PrintComError(e);
                break;
            case VT_DISPATCH:
                PrintProviderError(vtConnect);
                break;
            default:
                printf("Errors occured.");
                break;
        }
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintProviderError-Funktion                      //
//                                                       //
///////////////////////////////////////////////////////////

void PrintProviderError(_ConnectionPtr pConnection)
{
    // Drucken der Providerfehler aus dem Connection-Objekt.
    // pErr ist ein Recordset-Objekt in der Errors-Auflistung der
    // Verbindung.
    ErrorPtr    pErr  = NULL;

    if( (pConnection->Errors->Count) > 0)
    {
        long nCount = pConnection->Errors->Count;

        // Gültigkeitsbereich für Collection ist 0 bis nCount -1.
        for(long i = 0;i < nCount;i++)
        {
            pErr = pConnection->Errors->GetItem(i);
            printf("\t Error number: %x\t%s", pErr->Number,
                pErr->Description);
        }
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintComError-Funktion                           //
//                                                       //
///////////////////////////////////////////////////////////

void PrintComError(_com_error &e)
{
   _bstr_t bstrSource(e.Source());
   _bstr_t bstrDescription(e.Description());

    // Drucken der Com-Fehler.
   printf("Error\n");
   printf("\tCode = %08lx\n", e.Error());
   printf("\tCode meaning = %s\n", e.ErrorMessage());
   printf("\tSource = %s\n", (LPCSTR) bstrSource);
   printf("\tDescription = %s\n", (LPCSTR) bstrDescription);
}


Beispiel für die Open- und Close-Methoden (VC++)

In diesem Beispiel werden die Methoden Open und Close in geöffneten Recordset- und Connection-Objekten verwendet.

#import "C:\Programme\Gemeinsame Dateien\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <oledb.h>
#include <stdio.h>
#include <conio.h>
#include "OpenX.h"

// Funktionsdeklarationen
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void OpenX(void);
void PrintProviderError(_ConnectionPtr pConnection);
void PrintComError(_com_error &e);

///////////////////////////////////////////////////////////
//                                                       //
//      Main-Funktion                                    //
//                                                       //
///////////////////////////////////////////////////////////

void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    OpenX();

    ::CoUninitialize();
}

///////////////////////////////////////////////////////////
//                                                       //
//               OpenX-Funktion                          //
//                                                       //
///////////////////////////////////////////////////////////

void OpenX(void)
{
    // Definieren der ADO-Objektzeiger.
    // Initialisieren der Zeiger bei der Definition.
    // Sie befinden sich im ADODB::-Namespace
     _RecordsetPtr    pRstEmployees  = NULL;
     _ConnectionPtr pConnection    = NULL;

    // Definieren der Zeichenfolgevariablen.
    _bstr_t strCnn("Provider=sqloledb;Data Source=srv;"
        "Initial Catalog=Pubs;User Id=sa;Password=;");

    // Definieren anderer Variablen.
    HRESULT  hr = S_OK;
    IADORecordBinding   *picRs  = NULL;  // Deklaration des
                                   // Schnittstellenzeigers.
    CEmployeesRs emprs;       // C++-Klassenobjekt.
    DBDATE varDate;

    try
    {
        // Öffnen der Verbindung und des Recordsets.
        TESTHR(pConnection.CreateInstance(__uuidof(Connection)));
        pConnection->Open(strCnn,"","",NULL);

        TESTHR(pRstEmployees.CreateInstance(__uuidof(Recordset)));
        pRstEmployees->Open("Employees",
            _variant_t((IDispatch *)pConnection,true), adOpenKeyset,
            adLockOptimistic, adCmdTable);

        // Öffnen eines IADORecordBinding-Schnittstellenzeigers, der für
        // die Bindung des Recordsets an eine Klasse verwendet wird.
        TESTHR(pRstEmployees->QueryInterface(
            __uuidof(IADORecordBinding),(LPVOID*)&picRs));

        // Binden des Recordsets an eine C++-Klasse.
        TESTHR(picRs->BindToRecordset(&emprs));

        // Zuweisen des Einstellungsdatums des ersten
        // Mitarbeiterdatensatzes zu einer Variablen und anschließendes
        // Ändern des Einstellungsdatums.
        varDate = emprs.m_sze_hiredate;
        printf("\nOriginal data\n");
        printf("\tName - Hire Date\n");
        printf("  %s  %s - %d/%d/%d\n\n",
            emprs.le_fnameStatus == adFldOK ?
            emprs.m_sze_fname : "<NULL>",
            emprs.le_lnameStatus == adFldOK ?
            emprs.m_sze_lname : "<NULL>",
            emprs.le_hiredateStatus == adFldOK ?
            emprs.m_sze_hiredate.month : 0,
            emprs.le_hiredateStatus == adFldOK ?
            emprs.m_sze_hiredate.day : 0,
            emprs.le_hiredateStatus == adFldOK ?
            emprs.m_sze_hiredate.year : 0);

        emprs.m_sze_hiredate.year=1900;
        emprs.m_sze_hiredate.month=1;
        emprs.m_sze_hiredate.day=1;
        picRs->Update(&emprs);

        printf("\nChanged data\n");
        printf("\tName - Hire Date\n");
        printf("  %s %s - %d/%d/%d\n\n",
            emprs.le_fnameStatus == adFldOK ?
            emprs.m_sze_fname : "<NULL>",
            emprs.le_lnameStatus == adFldOK ?
            emprs.m_sze_lname : "<NULL>",
            emprs.le_hiredateStatus == adFldOK ?
            emprs.m_sze_hiredate.month : 0,
            emprs.le_hiredateStatus == adFldOK ?
            emprs.m_sze_hiredate.day : 0,
            emprs.le_hiredateStatus == adFldOK ?
            emprs.m_sze_hiredate.year : 0);

        // Erneutes Abfragen des Recordsets und Zurücksetzen des
        // Einstellungsdatums.
        pRstEmployees->Requery(adOptionUnspecified);
        // Öffnen eines IADORecordBinding-Schnittstellenzeigers, der für
        // das Binden eines Recordsets an eine Klasse verwendet wird.
        TESTHR(pRstEmployees->QueryInterface(
            __uuidof(IADORecordBinding),(LPVOID*)&picRs));

        // Erneutes Binden des Recordsets an eine C++-Klasse.
        TESTHR(picRs->BindToRecordset(&emprs));
        emprs.m_sze_hiredate = varDate;
        picRs->Update(&emprs);
        printf("\nData after reset\n");
        printf("\tName - Hire Date\n");
        printf("  %s %s - %d/%d/%d",emprs.le_fnameStatus == adFldOK ?
            emprs.m_sze_fname : "<NULL>",
            emprs.le_lnameStatus == adFldOK ?
            emprs.m_sze_lname : "<NULL>",
            emprs.le_hiredateStatus == adFldOK ?
            emprs.m_sze_hiredate.month : 0,
            emprs.le_hiredateStatus == adFldOK ?
            emprs.m_sze_hiredate.day : 0,
            emprs.le_hiredateStatus == adFldOK ?
            emprs.m_sze_hiredate.year : 0);

        // Löschen der Objekte vor dem Beenden.
        pRstEmployees->Close();
        pConnection->Close();
    }

    catch(_com_error &e)
    {
        // Benachrichtigen des Benutzers über Fehler, falls vorhanden.
        // Übergeben eines Verbindungszeigers, auf den die Verbindung
        // zugreift.
        PrintProviderError(pConnection);
        PrintComError(e);
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintProviderError-Funktion                      //
//                                                       //
///////////////////////////////////////////////////////////

void PrintProviderError(_ConnectionPtr pConnection)
{
    // Drucken der Providerfehler aus dem Connection-Objekt.
    // pErr ist ein Recordset-Objekt in der Errors-Auflistung der
    // Verbindung.
    ErrorPtr    pErr  = NULL;

    if( (pConnection->Errors->Count) > 0)
    {
        long nCount = pConnection->Errors->Count;
        // Gültigkeitsbereich für Collection ist 0 bis nCount -1.
        for(long i = 0;i < nCount;i++)
        {
            pErr = pConnection->Errors->GetItem(i);
            printf("\t Error number: %x\t%s", pErr->Number,
                pErr->Description);
        }
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintComError-Funktion                           //
//                                                       //
///////////////////////////////////////////////////////////

void PrintComError(_com_error &e)
{
   _bstr_t bstrSource(e.Source());
   _bstr_t bstrDescription(e.Description());

    // Drucken der Com-Fehler.
   printf("Error\n");
   printf("\tCode = %08lx\n", e.Error());
   printf("\tCode meaning = %s\n", e.ErrorMessage());
   printf("\tSource = %s\n", (LPCSTR) bstrSource);
   printf("\tDescription = %s\n", (LPCSTR) bstrDescription);
}

OpenX.h:

#include "icrsint.h"

// Diese Klasse extrahiert nur fname,lastname und
// hire_date aus der Employees-Tabelle.
class CEmployeesRs : public CADORecordBinding
{

BEGIN_ADO_BINDING(CEmployeesRs)

    // Die fname-Spalte ist das zweite Feld in der Tabelle.
   ADO_VARIABLE_LENGTH_ENTRY2(2, adVarChar, m_sze_fname,
         sizeof(m_sze_fname), le_fnameStatus, FALSE)

    // Die lname-Spalte ist das vierte Feld in der Tabelle.
   ADO_VARIABLE_LENGTH_ENTRY2(4, adVarChar, m_sze_lname,
         sizeof(m_sze_lname), le_lnameStatus, FALSE)

    // Die hiredate-Spalte ist das achte Feld in der Tabelle.
   ADO_VARIABLE_LENGTH_ENTRY2(8, adDBDate,m_sze_hiredate,
         sizeof(m_sze_hiredate), le_hiredateStatus, TRUE)

END_ADO_BINDING()

public:
   CHAR        m_sze_fname[21];
   ULONG    le_fnameStatus;
   CHAR        m_sze_lname[31];
   ULONG    le_lnameStatus;
   DBDATE    m_sze_hiredate;
   ULONG    le_hiredateStatus;
};


Beispiel für die OpenSchema-Methode (VC++)

In diesem Beispiel wird die OpenSchema-Methode zum Anzeigen der einzelnen Tabellennamen und -typen in der Pubs-Datenbank verwendet.

#import "c:\Programme\Gemeinsame Dateien\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <ole2.h>
#include <stdio.h>
#include <oleauto.h>
#include <conio.h>

// Funktionsdeklarationen
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void OpenSchemaX(void);
void OpenSchemaX2(void);
void PrintProviderError(_ConnectionPtr pConnection);
void PrintComError(_com_error &e);

///////////////////////////////////////////////////////////
//                                                       //
//      Main-Funktion                                    //
//                                                       //
///////////////////////////////////////////////////////////

void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    OpenSchemaX();

    printf("Press any key to see the results of 2nd function...\n\n");
    getch();

    OpenSchemaX2();

    ::CoUninitialize();
}

///////////////////////////////////////////////////////////
//                                                       //
//      OpenSchemaX-Funktion                             //
//                                                       //
///////////////////////////////////////////////////////////

void OpenSchemaX()
{
    // Definieren der ADO-Objektzeiger.
    // Initialisieren der Zeiger bei der Definition.
    // Sie befinden sich im ADODB::-Namespace.
    _ConnectionPtr  pConnection    = NULL;
    _RecordsetPtr  pRstSchema  = NULL;

    // Andere Variablen.
    HRESULT  hr = S_OK;

//   _bstr_t strCnn("Provider=Microsoft.Jet.OLEDB.4.0;Data //Source=C:\\Programme\\Microsoft //Office\\Office\\Samples\\Northwind.mdb;"
//            "User Id=admin;Password=;");
    _bstr_t strCnn("Provider=sqloledb;Data Source=srv;"
            "Initial Catalog=Pubs;User Id=sa;Password=;");

   try
    {
        // Öffnen der Verbindung.
        TESTHR(pConnection.CreateInstance(__uuidof(Connection)));
        pConnection->Open (strCnn, "", "", NULL);

        pRstSchema = pConnection->OpenSchema(adSchemaTables);

        while(!(pRstSchema->EndOfFile))
        {
            _bstr_t table_name = pRstSchema->Fields->
                GetItem("TABLE_NAME")->Value;
            printf("Table Name: %s\n\n",(LPCSTR) table_name);
            _bstr_t table_type = pRstSchema->Fields->
                GetItem("TABLE_TYPE")->Value;
            printf("Table type: %s\n\n",(LPCSTR) table_type);
            pRstSchema->MoveNext();
            int intLine = intLine + 1;
                if (intLine % 5 == 0)
                {
                    printf("\nPress any key to continue...");
                    getch();
                    // Löschen des Bildschirms für die nächste Anzeige.
                    system("cls");
                }
        }
        // Löschen der Objekte vor dem Beenden.
        pRstSchema->Close();
        pConnection->Close();

    }

    catch (_com_error &e)
    {
        // Benachrichtigen des Benutzers über Fehler, falls vorhanden.
        // Übergeben eines Verbindungszeigers, auf den die Verbindung
        // zugreift.
        PrintProviderError(pConnection);
        PrintComError(e);
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      OpenSchemaX2-Funktion                            //
//                                                       //
///////////////////////////////////////////////////////////
void OpenSchemaX2()
{
    HRESULT  hr = S_OK;
    // Definieren der ADO-Objektzeiger.
    // Initialisieren der Zeiger bei der Definition.
    // Sie befinden sich im ADODB::-Namespace.
    _ConnectionPtr  pConnection2    = NULL;
    _RecordsetPtr  pRstSchema  = NULL;

    _bstr_t strCnn("Provider=sqloledb;Data Source=srv;"
            "Initial Catalog=Pubs;User Id=sa;Password=;");

   try
    {
        // Öffnen der Verbindung.
        TESTHR(pConnection2.CreateInstance(__uuidof(Connection)));
        pConnection2->Open (strCnn, "", "", NULL);

        // Erstellen eines sicheren Arrays, das vier Elemente annimmt,
        // und Übergeben des Arrays als zweiter Parameter in der
        // OpenSchema-Methode.
        SAFEARRAY FAR* psa = NULL;
        SAFEARRAYBOUND rgsabound;
        _variant_t  var;
        _variant_t Array;
        rgsabound.lLbound = 0;
        rgsabound.cElements = 4;
        psa = SafeArrayCreate(VT_VARIANT, 1, &rgsabound);
        var.vt = VT_EMPTY;
        long ix;
        ix = 0;
        SafeArrayPutElement(psa, &ix, &var);
        ix= 1;
        SafeArrayPutElement(psa, &ix, &var);
        ix = 2;
        SafeArrayPutElement(psa, &ix, &var);
        var.vt = VT_BSTR;
        char * s1 = "VIEW";
        _bstr_t str = s1;
        var.bstrVal=str;
        ix= 3;
        SafeArrayPutElement(psa, &ix, &var);
        Array.vt = VT_ARRAY|VT_VARIANT;
        Array.parray = psa;
        pRstSchema = pConnection2->OpenSchema(adSchemaTables,&Array);
        while(!(pRstSchema->EndOfFile))
        {
            printf("Table Name: %s\n\n",(LPCSTR) (_bstr_t) pRstSchema->
                Fields->GetItem("TABLE_NAME")->Value);
            printf("Table type: %s\n\n",(LPCSTR) (_bstr_t) pRstSchema->
                Fields->GetItem("TABLE_TYPE")->Value);
            pRstSchema->MoveNext();
            int intLine = intLine + 1;
                if (intLine % 5 == 0)
                {
                    printf("\nPress any key to continue...");
                    getch();
                    // Löschen des Bildschirms für die nächste Anzeige.
                    system("cls");
                }
        }
        // Löschen der Objekte vor dem Beenden.
        pRstSchema->Close();
        pConnection2->Close();
    }    // Ende der Try-Anweisung.

    catch (_com_error &e)
    {
        // Benachrichtigen des Benutzers über Fehler, falls vorhanden.
        // Übergeben eines Verbindungszeigers, auf den die Verbindung
        // zugreift.
        PrintProviderError(pConnection2);
        PrintComError(e);
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintProviderError-Funktion                      //
//                                                       //
///////////////////////////////////////////////////////////
void PrintProviderError(_ConnectionPtr pConnection)
{
    // Drucken der Providerfehler aus dem Connection-Objekt.
    // pErr ist ein Recordset-Objekt in der Errors-Auflistung der
    // Verbindung.
    ErrorPtr    pErr  = NULL;

    if( (pConnection->Errors->Count) > 0)
    {
        long nCount = pConnection->Errors->Count;
        // Gültigkeitsbereich für Collection ist 0 bis nCount -1.
        for(long i = 0;i < nCount;i++)
        {
            pErr = pConnection->Errors->GetItem(i);
            printf("\t Error number: %x\t%s", pErr->Number,
                pErr->Description);
        }
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintComError-Funktion                           //
//                                                       //
///////////////////////////////////////////////////////////
void PrintComError(_com_error &e)
{
   _bstr_t bstrSource(e.Source());
   _bstr_t bstrDescription(e.Description());

    // Drucken der Com-Fehler.
   printf("Error\n");
   printf("\tCode = %08lx\n", e.Error());
   printf("\tCode meaning = %s\n", e.ErrorMessage());
   printf("\tSource = %s\n", (LPCSTR) bstrSource);
   printf("\tDescription = %s\n", (LPCSTR) bstrDescription);
}


Beispiel für die Optimize-Eigenschaft (VC++)

Dieses Beispiel verdeutlicht die dynamische Optimize-Eigenschaft des Field-Objekts. Das zip-Feld in der Authors-Tabelle der Pubs-Datenbank ist nicht indiziert. Durch Festlegen der Optimize-Eigenschaft im zip-Feld auf True wird ADO veranlasst, einen Index zu erstellen, der das Leistungsverhalten der Find-Methode verbessert.

#import "c:\Programme\Gemeinsame Dateien\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <ole2.h>
#include <stdio.h>
#include <conio.h>

// Funktionsdeklarationen
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void OptimizeX(void);
void PrintProviderError(_ConnectionPtr pConnection);
void PrintComError(_com_error &e);

//////////////////////////////////////////////////////////
//                                                      //
//    Main-Funktion                                     //
//                                                      //
//////////////////////////////////////////////////////////
void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    OptimizeX();

    ::CoUninitialize();
}

//////////////////////////////////////////////////////////
//                                                      //
//           OptimizeX-Funktion                         //
//                                                      //
//////////////////////////////////////////////////////////
void OptimizeX(void)
{
    HRESULT   hr = S_OK;

    // Definieren der Zeichenfolgevariablen.
    _bstr_t strCnn("Provider=sqloledb;Data Source=srv;"
            "Initial Catalog=Pubs;User Id=sa;Password=;");
    // Definieren der ADO-Objektzeiger.
    // Initialisieren der Zeiger bei der Definition.
    // Sie befinden sich im ADODB::-Namespace.
    _RecordsetPtr   pRst = NULL;

    try
    {
        TESTHR(pRst.CreateInstance(__uuidof(Recordset)));

        // Aktivieren der Indexerstellung.
        pRst->CursorLocation = adUseClient;
        pRst->Open ("SELECT * FROM Authors", strCnn,
            adOpenStatic, adLockReadOnly, adCmdText);

        // Erstellen des Index.
        pRst->Fields->GetItem("zip")->Properties->
            GetItem("Optimize")->PutValue("True");

        // Suchen nach Akiko Yokomoto.
        pRst->Find("zip = '94595'",1,adSearchForward);
        printf("\n%s %s    %s %s %s\n",
            (LPSTR) (_bstr_t) pRst->Fields->GetItem("au_fname")->Value,
            (LPSTR) (_bstr_t) pRst->Fields->GetItem("au_lname")->Value,
            (LPSTR) (_bstr_t) pRst->Fields->GetItem("address")->Value,
            (LPSTR) (_bstr_t) pRst->Fields->GetItem("city")->Value,
            (LPSTR) (_bstr_t) pRst->Fields->GetItem("state")->Value);

        // Löschen des Index.
        pRst->Fields->GetItem("zip")->Properties->
            GetItem("Optimize")->PutValue("False");
        pRst->Close();
    }

    catch (_com_error &e)
    {
       // Benachrichtigen des Benutzers über Fehler, falls vorhanden.
       // Übergeben eines Verbindungszeigers, auf den aus dem Recordset
       // zugegriffen wird.
        _variant_t vtConnect = pRst->GetActiveConnection();

        // GetActiveConnection gibt die Verbindungszeichenfolge zurück,
        // wenn die Verbindung nicht geöffnet ist; andernfalls wird das
        // Connection-Objekt zurückgegeben.
        switch(vtConnect.vt)
        {
            case VT_BSTR:
                PrintComError(e);
                break;
            case VT_DISPATCH:
                PrintProviderError(vtConnect);
                break;
            default:
                printf("Errors occured.");
                break;
        }    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintProviderError-Funktion                      //
//                                                       //
///////////////////////////////////////////////////////////
void PrintProviderError(_ConnectionPtr pConnection)
{
    // Drucken der Providerfehler aus dem Connection-Objekt.
    // pErr ist ein Recordset-Objekt in der Errors-Auflistung der
    // Verbindung.
    ErrorPtr    pErr  = NULL;

    if( (pConnection->Errors->Count) > 0)
    {
        long nCount = pConnection->Errors->Count;

        // Gültigkeitsbereich für Collection ist 0 bis nCount -1.
        for(long i = 0;i < nCount;i++)
        {
            pErr = pConnection->Errors->GetItem(i);
            printf("\t Error number: %x\t%s", pErr->Number,
                pErr->Description);
        }
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintComError-Funktion                           //
//                                                       //
///////////////////////////////////////////////////////////
void PrintComError(_com_error &e)
{
   _bstr_t bstrSource(e.Source());
   _bstr_t bstrDescription(e.Description());

    // Drucken der Com-Fehler.
   printf("Error\n");
   printf("\tCode = %08lx\n", e.Error());
   printf("\tCode meaning = %s\n", e.ErrorMessage());
   printf("\tSource = %s\n", (LPCSTR) bstrSource);
   printf("\tDescription = %s\n", (LPCSTR) bstrDescription);
}


Beispiel für die OriginalValue- und UnderlyingValue-Eigenschaften (VC++)

In diesem Beispiel werden die Eigenschaften OriginalValue und UnderlyingValue erläutert, indem eine Nachricht angezeigt wird, wenn sich die einem Datensatz zugrunde liegenden Daten während der Stapelaktualisierung eines Recordset-Objekts geändert haben.

#import "c:\Programme\Gemeinsame Dateien\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <ole2.h>
#include <stdio.h>
#include <conio.h>
#include "OriginalValueX.h"

// Funktionsdeklarationen
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void OriginalValueX(void);
void PrintProviderError(_ConnectionPtr pConnection);
void PrintComError(_com_error &e);

///////////////////////////////////////////////////////////
//                                                       //
//      Main-Funktion                                    //
//                                                       //
///////////////////////////////////////////////////////////

void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    OriginalValueX();

    ::CoUninitialize();
}

///////////////////////////////////////////////////////////
//                                                       //
//            OriginalValueX-Funktion                    //
//                                                       //
///////////////////////////////////////////////////////////

void OriginalValueX(void)
{
    // Definieren der ADO-Objektzeiger.
    // Initialisieren der Zeiger bei der Definition.
    // Sie befinden sich im ADODB::-Namespace.
    _ConnectionPtr   pConnection    = NULL;
     FieldPtr      pFldType   = NULL;
    _RecordsetPtr   pRstTitles   = NULL;

    // Definieren der Zeichenfolgevariablen.
    _bstr_t strSQLChange("UPDATE Titles SET Type = "
            "'sociology' WHERE Type = 'psychology'");
    _bstr_t strSQLRestore("UPDATE Titles SET Type = "
            "'psychology' WHERE Type = 'sociology'");

    // Definieren anderer Variablen.
    HRESULT    hr = S_OK;
    IADORecordBinding   *picRs  = NULL;  // Deklaration des
                                   // Schnittstellenzeigers
    CTitlesRs titlers;        // C++-Klassenobjekt.

    try
    {
        _bstr_t strCnn("Provider=sqloledb;Data Source=srv;"
            "Initial Catalog=Pubs;User Id=sa;Password=;");

        // Öffnen der Verbindung.
        TESTHR(pConnection.CreateInstance(__uuidof(Connection)));
        pConnection->Open (strCnn, "", "", NULL);

        // Öffnen des Recordsets für Stapelaktualisierung.
        TESTHR(pRstTitles.CreateInstance(__uuidof(Recordset)));
        pRstTitles->PutActiveConnection(
            _variant_t((IDispatch *)pConnection,true));
        pRstTitles->CursorType = adOpenKeyset;
        pRstTitles->LockType = adLockBatchOptimistic;

        // Konvertieren des Verbindungszeigers in den Typ IDispatch,
        // damit er in den richtigen Variant-Typ konvertiert wird.
        pRstTitles->Open("Titles",
            _variant_t((IDispatch *)pConnection,true),
            adOpenKeyset, adLockBatchOptimistic, adCmdTable);

        // Öffnen eines IADORecordBinding-Schnittstellenzeigers, der für
        // die Bindung eines Recordsets an eine Klasse verwendet wird.
        TESTHR(pRstTitles->QueryInterface(
            __uuidof(IADORecordBinding),(LPVOID*)&picRs));

        // Binden des Recordsets an eine C++-Klasse.
        TESTHR(picRs->BindToRecordset(&titlers));

        // Festlegen der Feldobjektvariablen für das Feld Type.
        pFldType = pRstTitles->Fields->GetItem("type");

        // Ändern des Typs der Psychologietitel.
        while(!(pRstTitles->EndOfFile))
        {
            if (!strcmp(strtok((char *)titlers.m_szau_Type," "),
                "psychology"))
            {
                pFldType->Value = "self_help";
            }
            pRstTitles->MoveNext();
        }

        // Simulatieren der Änderung durch einen anderen Benutzer durch
        // Aktualisierung der Daten mit einer Befehlszeichenfolge.
        pConnection->Execute(strSQLChange,NULL,0);

        // Überprüfen, ob Änderungen vorliegen.
        pRstTitles->MoveFirst();
        while(!(pRstTitles->EndOfFile))
        {
            if (strcmp(pFldType->OriginalValue.pcVal,
                pFldType->UnderlyingValue.pcVal))
            {
                printf("\n\nData has changed!");

                printf("\n\nTitle ID: %s",titlers.lau_Title_idStatus ==
                    adFldOK ? titlers.m_szau_Title_id : "<NULL>");

                printf("\n\nCurrent Value: %s",
                    (LPCSTR) (_bstr_t) pFldType->Value);
                printf("\n\nOriginal Value: %s",
                    (LPCSTR) (_bstr_t) pFldType->OriginalValue);

                printf("\n\nUnderlying Value: %s\n\n",
                    (LPCSTR) (_bstr_t) pFldType->UnderlyingValue);

                printf("Press any key to continue...");
                getch();

                system("cls");
            }
            pRstTitles->MoveNext();
        }

        // Abbrechen der Aktualisierung, weil es sich um ein
        // Beispiel handelt.
        pRstTitles->CancelBatch(adAffectAll);

        // Wiederherstellen der ursprünglichen Werte.
        pConnection->Execute(strSQLRestore,NULL,0);

        // Löschen der Objekte vor dem Beenden.
        pRstTitles->Close();
        pConnection->Close();

        // Freigeben der IADORecordset-Schnittstelle.
        if (picRs)
            picRs->Release();
    }

    catch (_com_error &e)
    {
        // Benachrichtigen des Benutzers über Fehler, falls vorhanden.
        // Übergeben eines Verbindungszeigers, auf den die Verbindung
        // zugreift.
        PrintProviderError(pConnection);
        PrintComError(e);
    }
};

///////////////////////////////////////////////////////////
//                                                       //
//      PrintProviderError-Funktion                      //
//                                                       //
///////////////////////////////////////////////////////////
void PrintProviderError(_ConnectionPtr pConnection)
{
    // Drucken der Providerfehler aus dem Connection-Objekt.
    // pErr ist ein Recordset-Objekt in der Errors-Auflistung der
    // Verbindung.
    ErrorPtr    pErr  = NULL;

    if( (pConnection->Errors->Count) > 0)
    {
        long nCount = pConnection->Errors->Count;

        // Gültigkeitsbereich für Collection ist 0 bis nCount -1.
        for(long i = 0;i < nCount;i++)
        {
            pErr = pConnection->Errors->GetItem(i);
            printf("\t Error number: %x\t%s", pErr->Number,
                pErr->Description);
        }
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintComError-Funktion                           //
//                                                       //
///////////////////////////////////////////////////////////
void PrintComError(_com_error &e)
{
   _bstr_t bstrSource(e.Source());
   _bstr_t bstrDescription(e.Description());

    // Drucken der Com-Fehler.
   printf("Error\n");
   printf("\tCode = %08lx\n", e.Error());
   printf("\tCode meaning = %s\n", e.ErrorMessage());
   printf("\tSource = %s\n", (LPCSTR) bstrSource);
   printf("\tDescription = %s\n", (LPCSTR) bstrDescription);
}

OriginalValueX.h:

#include "icrsint.h"

// Diese Klasse extrahiert title_id und type aus der Titles-Tabelle.
class CTitlesRs : public CADORecordBinding
{
BEGIN_ADO_BINDING(CTitlesRs)
        // Die title_id-Spalte ist das erste Feld im Recordset.
        ADO_VARIABLE_LENGTH_ENTRY2(1, adVarChar, m_szau_Title_id,
            sizeof(m_szau_Title_id), lau_Title_idStatus, FALSE)

        // Die type-Spalte ist das dritte Feld im Recordset.
        ADO_VARIABLE_LENGTH_ENTRY2(3, adVarChar, m_szau_Type,
            sizeof(m_szau_Type), lau_TypeStatus, TRUE)
END_ADO_BINDING()

public:
    CHAR m_szau_Title_id[7];
    ULONG lau_Title_idStatus;
    CHAR m_szau_Type[13];
    ULONG lau_TypeStatus;
};


Beispiel für die Prepared-Eigenschaft (VC++)

In diesem Beispiel wird die Prepared-Eigenschaft erläutert, indem zwei Command-Objekte geöffnet werden - ein vorverarbeitetes und ein nicht vorverarbeitetes.

#import "c:\Programme\Gemeinsame Dateien\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <ole2.h>
#include <stdio.h>
#include <conio.h>
#include <winbase.h>

// Funktionsdeklarationen
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void PreparedX(void);
void PrintProviderError(_ConnectionPtr pConnection);
void PrintComError(_com_error &e);

///////////////////////////////////////////////////////////
//                                                       //
//      Main-Funktion                                    //
//                                                       //
///////////////////////////////////////////////////////////

void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    PreparedX();

    ::CoUninitialize();
}

///////////////////////////////////////////////////////////
//                                                       //
//      PreparedX-Funktion                               //
//                                                       //
///////////////////////////////////////////////////////////

void PreparedX(void)
{
    // Definieren der ADO-Objektzeiger.
    // Initialisieren der Zeiger bei der Definition.
    // Sie befinden sich im ADODB::-Namespace.
    _ConnectionPtr   pConnection    =NULL;
    _CommandPtr      pCmd1    =NULL;
    _CommandPtr      pCmd2    =NULL;

    // Definieren der Zeichenfolgevariablen.
    _bstr_t strCnn("Provider=sqloledb;Data Source=srv;"
            "Initial Catalog=Pubs;User Id=sa;Password=;");

    // Definieren anderer Variablen.
    HRESULT   hr = S_OK;

   try
    {
        // Öffnen einer Verbindung.
        TESTHR(pConnection.CreateInstance(__uuidof(Connection)));
        pConnection->Open (strCnn, "", "", NULL);

        _bstr_t strCmd ("SELECT title,type FROM Titles ORDER BY type");

        // Erstellen von zwei Command-Objekten für den gleichen Befehl -
        // ein vorbereitetes und ein unvorbereitetes Objekt.
        TESTHR(pCmd1.CreateInstance(__uuidof(Command)));
        pCmd1->ActiveConnection = pConnection;
        pCmd1->CommandText = strCmd;

        TESTHR(pCmd2.CreateInstance(__uuidof(Command)));
        pCmd2->ActiveConnection = pConnection;
        pCmd2->CommandText = strCmd;
        pCmd2->PutPrepared(true);

        // Festlegen eines Timers und anschließendes 20maliges Ausführen
        // des unvorbereiteten Befehls.
        DWORD sngStart=GetTickCount();
        for(int intLoop=1;intLoop<=20;intLoop++)
        {
            pCmd1->Execute(NULL,NULL,adCmdText);
        }
        DWORD sngEnd=GetTickCount();

        float sngNotPrepared = (float)(sngEnd - sngStart)/(float)1000;

        // Zurücksetzen des Timers und anschließendes 20maliges Ausführen
        // des vorbereiteten Befehls.
        sngStart=GetTickCount();
        for(intLoop=1;intLoop<=20;intLoop++)
        {
            pCmd2->Execute(NULL,NULL,adCmdText);
        }
        sngEnd=GetTickCount();

        float sngPrepared = (float)(sngEnd - sngStart)/(float)1000;

        // Anzeigen der Ergebnisse des Leistungstests.
        printf("\n\nPerformance Results:");
        printf("\n\nNot Prepared: %6.3f seconds",sngNotPrepared);
        printf("\n\nPrepared:     %6.3f seconds\n\n",sngPrepared);

        pConnection->Close();
    }

    catch (_com_error &e)
    {
        // Benachrichtigen des Benutzers über Fehler, falls vorhanden.
        // Übergeben eines Verbindungszeigers, auf den die Verbindung
        // zugreift.
        PrintProviderError(pConnection);
        PrintComError(e);
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintProviderError-Funktion                      //
//                                                       //
///////////////////////////////////////////////////////////
void PrintProviderError(_ConnectionPtr pConnection)
{
    // Drucken der Providerfehler aus dem Connection-Objekt.
    // pErr ist ein Recordset-Objekt in der Errors-Auflistung der
    // Verbindung.
    ErrorPtr    pErr  = NULL;

    if( (pConnection->Errors->Count) > 0)
    {
        long nCount = pConnection->Errors->Count;

        // Gültigkeitsbereich für Collection ist 0 bis nCount -1.
        for(long i = 0;i < nCount;i++)
        {
            pErr = pConnection->Errors->GetItem(i);
            printf("\t Error number: %x\t%s", pErr->Number,
                pErr->Description);
        }
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintComError-Funktion                           //
//                                                       //
///////////////////////////////////////////////////////////
void PrintComError(_com_error &e)
{
   _bstr_t bstrSource(e.Source());
   _bstr_t bstrDescription(e.Description());

    // Drucken der Com-Fehler.
   printf("Error\n");
   printf("\tCode = %08lx\n", e.Error());
   printf("\tCode meaning = %s\n", e.ErrorMessage());
   printf("\tSource = %s\n", (LPCSTR) bstrSource);
   printf("\tDescription = %s\n", (LPCSTR) bstrDescription);
}


Beispiel für die Provider- und DefaultDatabase-Eigenschaften (VC++)

In diesem Beispiel wird die Provider-Eigenschaft erläutert, indem drei Connection-Objekte mit verschiedenen Providern geöffnet werden. Es wird auch die DefaultDatabase-Eigenschaft verwendet, um die Standarddatenbank auf den Microsoft ODBC-Provider festzulegen.

#import "c:\Programme\Gemeinsame Dateien\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <ole2.h>
#include <stdio.h>
#include <conio.h>

// Funktionsdeklarationen
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void ProviderX(void);
void PrintProviderError(_ConnectionPtr pConnection);
void PrintComError(_com_error &e);

///////////////////////////////
//                           //
//    Main-Funktion          //
//                           //
///////////////////////////////
void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    ProviderX();

    ::CoUninitialize();
}

/////////////////////////////////
//                             //
//    ProviderX-Funktion       //
//                             //
/////////////////////////////////

void ProviderX(void)
{
    HRESULT    hr = S_OK;

    // Definieren der ADO-Objektzeiger.
    // Initialisieren der Zeiger bei der Definition.
    // Sie befinden sich im ADODB::-Namespace.
    _ConnectionPtr    pConnection1    = NULL;
    _ConnectionPtr    pConnection2     = NULL;
    _ConnectionPtr    pConnection3     = NULL;

    try
    {
        // Öffnen einer Verbindung mit dem Microsoft ODBC Provider.
        TESTHR(pConnection1.CreateInstance(__uuidof(Connection)));
        pConnection1->ConnectionString = "driver={SQL Server};"
            "server=dhale1;uid=sa;pwd=;";
        pConnection1->Open("","","",NULL);
        pConnection1->DefaultDatabase = "Pubs";

        // Anzeigen des Providers.
        printf("\n\nConnection1 provider: %s \n\n",
            (LPCSTR)pConnection1->Provider);

        // Öffnen einer Verbindung mit dem OLE DB Provider für Microsoft
        // Jet.
        TESTHR(pConnection2.CreateInstance(__uuidof(Connection)));
        pConnection2->Provider = "Microsoft.Jet.OLEDB.3.51";

        char *sConn = "c:\\Programme\\Microsoft Office\\Office\\"
            "Samples\\Northwind.mdb";

        pConnection2->Open(sConn,"admin","",NULL);

        // Anzeigen des Providers.
        printf("Connection2 provider: %s \n\n",(LPCSTR)pConnection2->
            Provider);

        // Öffnen einer Verbindung mit dem Microsoft SQL Server Provider.
        TESTHR(pConnection3.CreateInstance(__uuidof(Connection)));
        pConnection3->Provider = "sqloledb";
        pConnection3->Open("Data Source=dhale1;Initial Catalog=Pubs;",
            "sa","",NULL);

        // Anzeigen des Providers.
        printf("Connection3 provider: %s\n\n",(LPCSTR)pConnection3->
            Provider);

        pConnection1->Close();
        pConnection2->Close();
        pConnection3->Close();
    }

    catch (_com_error &e)
    {
        // Benachrichtigen des Benutzers über Fehler, falls vorhanden.
        PrintProviderError(pConnection1);
        if(pConnection2) PrintProviderError(pConnection2);
        if(pConnection3) PrintProviderError(pConnection3);
        PrintComError(e);
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintProviderError-Funktion                      //
//                                                       //
///////////////////////////////////////////////////////////
void PrintProviderError(_ConnectionPtr pConnection)
{
    // Drucken der Providerfehler aus dem Connection-Objekt.
    // pErr ist ein Recordset-Objekt in der Errors-Auflistung der
    // Verbindung.
    ErrorPtr    pErr  = NULL;

    if( (pConnection->Errors->Count) > 0)
    {
        long nCount = pConnection->Errors->Count;

        // Gültigkeitsbereich für Collection ist 0 bis nCount -1.
        for(long i = 0;i < nCount;i++)
        {
            pErr = pConnection->Errors->GetItem(i);
            printf("Error number: %x\t%s\n", pErr->Number,
                (LPCSTR) pErr->Description);
        }
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintComError-Funktion                           //
//                                                       //
///////////////////////////////////////////////////////////
void PrintComError(_com_error &e)
{
   _bstr_t bstrSource(e.Source());
   _bstr_t bstrDescription(e.Description());

    // Drucken der Com-Fehler.
    printf("Error\n");
    printf("\tCode = %08lx\n", e.Error());
    printf("\tCode meaning = %s\n", e.ErrorMessage());
    printf("\tSource = %s\n", (LPCSTR) bstrSource);
    printf("\tDescription = %s\n", (LPCSTR) bstrDescription);
}


Beispiel für die Refresh-Methode (VC++)

In diesem Beispiel wird die Verwendung der Refresh-Methode zum Aktualisieren der Parameters-Auflistung für das Command-Objekt einer gespeicherten Prozedur verdeutlicht.

#import "c:\Programme\Gemeinsame Dateien\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <ole2.h>
#include <stdio.h>
#include <conio.h>
#include "RefreshX.h"

// Funktionsdeklarationen
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void RefreshX(void);
void PrintProviderError(_ConnectionPtr pConnection);
void PrintComError(_com_error &e);

//////////////////////////////
//                          //
//    Main-Funktion         //
//                          //
//////////////////////////////
void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    RefreshX();

    ::CoUninitialize();
}

////////////////////////////////////////////
//                                        //
//             RefreshX-Funktion          //
//                                        //
////////////////////////////////////////////

void RefreshX(void)
{
    HRESULT  hr = S_OK;

    // Definieren der Zeichenfolgevariablen.
    _bstr_t strCnn("Provider=sqloledb;Data Source=srv;"
            "Initial Catalog=Pubs;User Id=sa;Password=;");

    // Definieren der ADO-Objektzeiger.
    // Initialisieren der Zeiger bei der Definition.
    // Sie befinden sich im ADODB::-Namespace.
    _ConnectionPtr    pConnection      = NULL;
    _CommandPtr     pCmdByRoyalty  = NULL;
    _RecordsetPtr  pRstByRoyalty  = NULL;
    _RecordsetPtr  pRstAuthors    = NULL;
    IADORecordBinding   *picRs    = NULL;  // Deklaration des
                                     // Schnittstellenzeigers.
    CAuthorsRs Authorsrs;            // C++-Klassenobjekt.
    try
    {
        // Öffnen der Verbindung.
        TESTHR(pConnection.CreateInstance(__uuidof(Connection)));
        pConnection->Open (strCnn, "", "", NULL);

        // Öffnen eines Command-Objekts für eine gespeicherte Prozedur
        // mit einem einzelnen Parameter.
        TESTHR(pCmdByRoyalty.CreateInstance(__uuidof(Command)));
        pCmdByRoyalty->ActiveConnection = pConnection;
        pCmdByRoyalty->CommandText = "byroyalty";
        pCmdByRoyalty->CommandType = adCmdStoredProc;
        pCmdByRoyalty->Parameters->Refresh();

        // Abrufen des Parameterwertes und Ausführen des Befehls;
        // das Ergebnis wird in einem Recordset gespeichert.
        char *strRoyalty;
        char strTemp[5];
        do
        {
            printf("\n\nEnter royalty : ");
            gets(strTemp);
            strRoyalty = strtok(strTemp," ");
            if(strRoyalty == NULL)
            {
                exit(1);
            }

            // Benutzer benachrichten, wenn die Eingabe nicht numerisch
            // ist.
            if(!atoi(strRoyalty))
            {
                printf("\nExpecting numeric value...");
                continue;
            }
        }while(!atoi(strRoyalty));

        _variant_t vtroyal;
        vtroyal.vt = VT_I2;
        vtroyal.iVal = atoi(strRoyalty);
        _variant_t Index;
        Index.vt = VT_I2;
        Index.iVal = 1;
        pCmdByRoyalty->GetParameters()->GetItem(Index)->
            PutValue(vtroyal);
        pRstByRoyalty = pCmdByRoyalty->
            Execute(NULL,NULL,adCmdStoredProc);

        // Öffnen der Authors-Tabelle, um Autorennamen für die Anzeige
        // abzurufen.
        TESTHR(pRstAuthors.CreateInstance(__uuidof(Recordset)));
        pRstAuthors->Open ("Authors",
            _variant_t((IDispatch *) pConnection, true),
            adOpenForwardOnly, adLockReadOnly, adCmdTable);

        // Öffnen eines IADORecordBinding-Schnittstellenzeigers, der
        // für das Binden eines Recordsets an eine Klasse verwendet wird.
        TESTHR(pRstAuthors->QueryInterface(
            __uuidof(IADORecordBinding),(LPVOID*)&picRs));

        //Binden des Recordsets an eine C++-Klasse.
        TESTHR(picRs->BindToRecordset(&Authorsrs));

        // Drucken der aktuellen Daten im Recordset unter Hinzufügen
        // von Autorennamen aus der Authors-Tabelle.
        printf("\n\nAuthors with %s percent royalty\n\n",strRoyalty);
        while(!(pRstByRoyalty->EndOfFile))
        {
            _bstr_t strAuthorID = pRstByRoyalty->Fields->GetItem(
                "au_id")->Value;

            printf("  %s",(LPCSTR) (_bstr_t) pRstByRoyalty->Fields->
                GetItem("au_id")->Value);

            pRstAuthors->Filter = "au_id ='"+strAuthorID+"'";
            printf(", %s %s\n\n",Authorsrs.lau_fnameStatus == adFldOK ?
                Authorsrs.m_szau_fname : "<NULL>",
                Authorsrs.lau_lnameStatus == adFldOK ?
                Authorsrs.m_szau_lname : "<NULL>");
            pRstByRoyalty->MoveNext();
        }
        pRstByRoyalty->Close();
        pRstAuthors->Close();
        pConnection->Close();
    }

    catch (_com_error &e)
    {
        PrintProviderError(pConnection);
        PrintComError(e);
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintProviderError-Funktion                      //
//                                                       //
///////////////////////////////////////////////////////////
void PrintProviderError(_ConnectionPtr pConnection)
{
    // Drucken der Providerfehler aus dem Connection-Objekt.
    // pErr ist ein Recordset-Objekt in der Errors-Auflistung der
    // Verbindung.
    ErrorPtr    pErr  = NULL;

    if( (pConnection->Errors->Count) > 0)
    {
        long nCount = pConnection->Errors->Count;

        // Gültigkeitsbereich für Collection ist 0 bis nCount -1.
        for(long i = 0;i < nCount;i++)
        {
            pErr = pConnection->Errors->GetItem(i);
            printf("\t Error number: %x\t%s", pErr->Number,
                pErr->Description);
        }
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintComError-Funktion                           //
//                                                       //
///////////////////////////////////////////////////////////
void PrintComError(_com_error &e)
{
   _bstr_t bstrSource(e.Source());
   _bstr_t bstrDescription(e.Description());

    // Drucken der Com-Fehler.
   printf("Error\n");
   printf("\tCode = %08lx\n", e.Error());
   printf("\tCode meaning = %s\n", e.ErrorMessage());
   printf("\tSource = %s\n", (LPCSTR) bstrSource);
   printf("\tDescription = %s\n", (LPCSTR) bstrDescription);
}

RefreshX.h

#include "icrsint.h"

// Diese Klasse extrahiert lname und fname aus der Authors-Tabelle.
class CAuthorsRs : public CADORecordBinding
{
BEGIN_ADO_BINDING(CAuthorsRs)
    // Die lname-Spalte ist das zweite Feld im Recordset.
     ADO_VARIABLE_LENGTH_ENTRY2(2, adVarChar, m_szau_lname,
         sizeof(m_szau_lname), lau_lnameStatus, TRUE)
    // Die fname-Spalte ist das dritte Feld im Recordset.
   ADO_VARIABLE_LENGTH_ENTRY2(3, adVarChar, m_szau_fname,
         sizeof(m_szau_fname), lau_fnameStatus, TRUE)

END_ADO_BINDING()

public:
    CHAR m_szau_fname[21];
    ULONG lau_fnameStatus;
    CHAR   m_szau_lname[41];
    ULONG  lau_lnameStatus;
};


Beispiel für die Resync-Methode (VC++)

In diesem Beispiel wird die Verwendung der Resync-Methode zum Aktualisieren von Daten in einem statischen Recordset verdeutlicht.

#import "c:\Programme\Gemeinsame Dateien\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <ole2.h>
#include <stdio.h>
#include <conio.h>

// Funktionsdeklarationen
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void ResyncX(void);
void PrintProviderError(_ConnectionPtr pConnection);
void PrintComError(_com_error &e);

/////////////////////////////
//                         //
//    Main-Funktion        //
//                         //
/////////////////////////////

void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    ResyncX();

    ::CoUninitialize();
}

/////////////////////////////////
//                             //
//     ResyncX-Funktion        //
//                             //
/////////////////////////////////

void ResyncX(void)
{
    HRESULT  hr = S_OK;

    // Definieren der Zeichenfolgevariablen.
    _bstr_t strCnn("Provider=sqloledb;Data Source=srv;"
            "Initial Catalog=Pubs;User Id=sa;Password=;");

    // Definieren der ADO-Objektzeiger.
    // Initialisieren der Zeiger bei der Definition.
    // Sie befinden sich im ADODB::-Namespace.
    _RecordsetPtr  pRstTitles  = NULL;

     try
    {
        // Öffnen des Recordsets für die Titles-Tabelle.
        TESTHR(pRstTitles.CreateInstance(__uuidof(Recordset)));
        pRstTitles->CursorLocation = adUseClient;
        pRstTitles->CursorType = adOpenStatic;
        pRstTitles->LockType = adLockBatchOptimistic;
        pRstTitles->Open ("Titles",strCnn,
            adOpenStatic, adLockBatchOptimistic, adCmdTable);

        // Ändern des Typs des ersten Titels im Recordset.
        pRstTitles->Fields->GetItem("type")->Value =
            (_bstr_t) ("database");

        // Anzeigen der Ergebnisse der Änderung.
        printf("\nBefore resync: \n\n");

        printf("Title - %s\n\n",(LPSTR) (_bstr_t) pRstTitles->
            Fields->GetItem("title")->Value);

        printf("Type - %s\n\n",(LPSTR) (_bstr_t) pRstTitles->
            Fields->GetItem("type")->Value);

        // Neusynchronisieren mit der Datenbank.
        pRstTitles->Resync(adAffectAll,adResyncAllValues);

        // Anzeigen der Ergebnisse der Neusynchronisation.
        printf("\n\nAfter resync: \n\n");

        printf("Title - %s\n\n",(LPSTR) (_bstr_t) pRstTitles->
            Fields->GetItem("title")->Value);

        printf("Type - %s\n\n",(LPSTR) (_bstr_t) pRstTitles->
            Fields->GetItem("type")->Value);

        pRstTitles->CancelBatch(adAffectAll);
        pRstTitles->Close();
    }

    catch (_com_error &e)
    {
       // Benachrichtigen des Benutzers über Fehler, falls vorhanden.
       // Übergeben eines Verbindungszeigers, auf den aus dem Recordset
       // zugegriffen wird.
        _variant_t vtConnect = pRstTitles->GetActiveConnection();

        // GetActiveConnection gibt die Verbindungszeichenfolge zurück,
        // wenn die Verbindung nicht geöffnet ist; andernfalls wird das
        // Connection-Objekt zurückgegeben.
        switch(vtConnect.vt)
        {
            case VT_BSTR:
                PrintComError(e);
                break;
            case VT_DISPATCH:
                PrintProviderError(vtConnect);
                break;
            default:
                printf("Errors occured.");
                break;
        }
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintProviderError-Funktion                      //
//                                                       //
///////////////////////////////////////////////////////////
void PrintProviderError(_ConnectionPtr pConnection)
{
    // Drucken der Providerfehler aus dem Connection-Objekt.
    // pErr ist ein Recordset-Objekt in der Errors-Auflistung der
    // Verbindung.
    ErrorPtr    pErr  = NULL;

    if( (pConnection->Errors->Count) > 0)
    {
        long nCount = pConnection->Errors->Count;

        // Gültigkeitsbereich für Collection ist 0 bis nCount -1.
        for(long i = 0;i < nCount;i++)
        {
            pErr = pConnection->Errors->GetItem(i);
            printf("\t Error number: %x\t%s\n", pErr->Number,
                (LPCSTR) pErr->Description);
        }
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintComError-Funktion                           //
//                                                       //
///////////////////////////////////////////////////////////
void PrintComError(_com_error &e)
{
   _bstr_t bstrSource(e.Source());
   _bstr_t bstrDescription(e.Description());

    // Drucken der Com-Fehler.
   printf("Error\n");
   printf("\tCode = %08lx\n", e.Error());
   printf("\tCode meaning = %s\n", e.ErrorMessage());
   printf("\tSource = %s\n", (LPCSTR) bstrSource);
   printf("\tDescription = %s\n", (LPCSTR) bstrDescription);
}


Beispiel für die Save- und Open-Methoden (VC++)

Die nachstehenden drei Beispiele verdeutlichen, wie die Methoden Save und Open gemeinsam verwendet werden können.

Bei diesen Beispielen wird davon ausgegangen, dass Sie auf Geschäftsreise gehen und eine Tabelle aus einer Datenbank mitnehmen möchten. Vor der Abreise greifen Sie auf die Daten in Form eines Recordsets zu und speichern sie in einem Format, mit dem Sie auf der Reise arbeiten können. Am Zielort angekommen, greifen Sie auf das nunmehr lokale nicht verbundene Recordset-Objekt zu. Sie führen Änderungen am Recordset-Objekt durch und speichern es mit den Änderungen. Nach Ihrer Rückkehr verbinden Sie sich erneut mit der Datenbank und aktualisieren diese mit den auf Ihrer Geschäftsreise durchgeführten Änderungen.

#import "c:\Programme\Gemeinsame Dateien\system\ado\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <ole2.h>
#include <stdio.h>
#include <conio.h>
#include <io.h>

// Funktionsdeklarationen
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
bool FileExists(void);
void SaveX1(void);
void SaveX2(void);
void SaveX3(void);
void PrintProviderError(_ConnectionPtr pConnection);
void PrintComError(_com_error &e);

//////////////////////////////////////////////////////////
//                                                      //
//        Main-Funktion                                 //
//                                                      //
//////////////////////////////////////////////////////////
void main()
{
    if(FAILED(::CoInitialize(NULL))
        return;

    // Wenn die Datei im angegebenen Verzeichnis vorhanden ist, Fehler
    // anzeigen.
    if (!FileExists())
    {
        SaveX1();
        SaveX2();
        SaveX3();
    }

    ::CoUninitialize();
}

//////////////////////////////////////////////////////////
//                                                      //
//     SaveX1-Funktion                                  //
//                                                      //
//////////////////////////////////////////////////////////

// Zugreifen auf die und Speichern der Authors-Tabelle.
void SaveX1()
{
    HRESULT hr = S_OK;

    // Definieren der ADO-Objektzeiger.
    // Initialisieren der Zeiger bei der Definition.
    // Sie befinden sich im ADODB::-Namespace.
    _RecordsetPtr pRstAuthors = NULL;

    // Definieren anderer Variablen.
    _bstr_t strCnn("Provider=sqloledb;Data Source=srv;"
            "Initial Catalog=Pubs;User Id=sa;Password=;");
    try
    {
        TESTHR(pRstAuthors.CreateInstance(__uuidof(Recordset)));

        pRstAuthors->Open("SELECT * FROM Authors",strCnn,
            adOpenDynamic,adLockOptimistic,adCmdText);

        // Speichern des Recordsets im XML-Format auf einer Diskette zum
        // Zweck der Illustration.
        pRstAuthors->Save("a:\\Pubs.xml",adPersistXML);

        pRstAuthors->Close();
    }
    catch(_com_error &e)
    {
       // Benachrichtigen des Benutzers über Fehler, falls vorhanden.
       // Übergeben eines Verbindungszeigers, auf den aus dem Recordset
       // zugegriffen wird.
        _variant_t vtConnect = pRstAuthors->GetActiveConnection();

        // GetActiveConnection gibt die Verbindungszeichenfolge zurück,
        // wenn die Verbindung nicht geöffnet ist; andernfalls wird das
        // Connection-Objekt zurückgegeben.
        switch(vtConnect.vt)
        {
            case VT_BSTR:
                PrintComError(e);
                break;
            case VT_DISPATCH:
                PrintProviderError(vtConnect);
                break;
            default:
                printf("Errors occured.");
                break;
        }
    }
}

//////////////////////////////////////////////////////////
//                                                      //
//       SaveX2-Funktion                                //
//                                                      //
//////////////////////////////////////////////////////////
// An diesem Punkt haben Sie das Ziel erreicht.
// Sie greifen mit einem lokalen, verbindungslosen Recordset
// auf die Authors-Tabelle zu.
// Denken Sie daran, dass der MSPersist-Provider auf dem Computer
// vorhanden sein muss, von dem aus Sie auf die gespeicherte Datei
// a:\Pubs.xml zugreifen.
void SaveX2()
{
    HRESULT hr = S_OK;

    // Definieren der ADO-Objektzeiger.
    // Initialisieren der Zeiger bei der Definition.
    // Sie befinden sich im ADODB::-Namespace.
    _RecordsetPtr pRstAuthors = NULL;

    try
    {
        TESTHR(pRstAuthors.CreateInstance(__uuidof(Recordset)));

        // Angeben aller Parameter zum Zweck der Illustration.
        pRstAuthors->Open("a:\\Pubs.xml","Provider=MSPersist;",
            adOpenForwardOnly,adLockOptimistic,adCmdFile);

        // Jetzt liegt ein lokales, verbindungsloses Recordset vor.
        // Bearbeiten Sie es nach Wunsch.
        //(In diesem Beispiel wirken sich die Änderungen nicht aus).
        pRstAuthors->Find("au_lname = 'Carson'",NULL,adSearchForward);
        if (pRstAuthors->EndOfFile)
        {
            printf("Name not found ...\n");
            pRstAuthors->Close();
            return;
        }
        pRstAuthors->GetFields()->GetItem("City")->PutValue("Berkeley");
        pRstAuthors->Update();

        // Speichern Sie die Änderungen nun im ADTG-Format - nur zum
        // Zweck der Illustration. Beachten Sie, dass sich die vorherige
        // Version noch als a:\Pubs.xml auf der Diskette befindet.
        pRstAuthors->Save("a:\\Pubs.adtg",adPersistADTG);

        pRstAuthors->Close();
    }
    catch(_com_error &e)
    {
       // Benachrichtigen des Benutzers über Fehler, falls vorhanden.
       // Übergeben eines Verbindungszeigers, auf den aus dem Recordset
       // zugegriffen wird.
        _variant_t vtConnect = pRstAuthors->GetActiveConnection();

        // GetActiveConnection gibt die Verbindungszeichenfolge zurück,
        // wenn die Verbindung nicht geöffnet ist; andernfalls wird das
        // Connection-Objekt zurückgegeben.
        switch(vtConnect.vt)
        {
            case VT_BSTR:
                PrintComError(e);
                break;
            case VT_DISPATCH:
                PrintProviderError(vtConnect);
                break;
            default:
                printf("Errors occured.");
                break;
        }
    }
}

//////////////////////////////////////////////////////////
//                                                      //
//   SaveX3-Funktion                                    //
//                                                      //
//////////////////////////////////////////////////////////
// Schließlich kehren Sie zurück. Aktualisieren Sie nun die Datenbank
// mit Ihren Änderungen.
void SaveX3()
{
    HRESULT hr = S_OK;

    // Definieren der ADO-Objektzeiger.
    // Initialisieren der Zeiger bei der Definition.
    // Sie befinden sich im ADODB::-Namespace.
    _RecordsetPtr pRstAuthors = NULL;
    _ConnectionPtr pCnn = NULL;

    // Definieren anderer Variablen.
    _bstr_t strCnn("Provider=sqloledb;Data Source=srv;"
        "Initial Catalog=Pubs;User Id=sa;Password=;");

    try
    {
        TESTHR(pCnn.CreateInstance(__uuidof(Connection)));

        TESTHR(pRstAuthors.CreateInstance(__uuidof(Recordset)));

        // Wenn keine ActiveConnection vorhanden ist, können Sie die
        // Datenbank mit Standardeinstellungen öffnen.
        pRstAuthors->Open("a:\\Pubs.adtg","Provider=MSPersist;",
            adOpenForwardOnly,adLockOptimistic,adCmdFile);

        // Stellen Sie eine Verbindung zur Datenbank her, verknüpfen Sie
        // das Recordset mit der Verbindung, und aktualisieren Sie dann
        // die Datenbanktabelle mit dem geänderten Recordset.
        pCnn->Open(strCnn,"","",NULL);

        pRstAuthors->PutActiveConnection(_variant_t((IDispatch *) pCnn));
        pRstAuthors->UpdateBatch(adAffectAll);

        pRstAuthors->Close();
        pCnn->Close();
    }
    catch(_com_error &e)
    {
       // Benachrichtigen des Benutzers über Fehler, falls vorhanden.
       // Übergeben eines Verbindungszeigers, auf den aus dem Recordset
       // zugegriffen wird.
        _variant_t vtConnect = pRstAuthors->GetActiveConnection();

        // GetActiveConnection gibt die Verbindungszeichenfolge zurück,
        // wenn die Verbindung nicht geöffnet ist; andernfalls wird das
        //Connection-Objekt zurückgegeben.
        switch(vtConnect.vt)
        {
            case VT_BSTR:
                PrintComError(e);
                break;
            case VT_DISPATCH:
                PrintProviderError(vtConnect);
                break;
            default:
                printf("Errors occured.");
                break;
        }
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintProviderError-Funktion                      //
//                                                       //
///////////////////////////////////////////////////////////
void PrintProviderError(_ConnectionPtr pConnection)
{
    // Drucken der Providerfehler aus dem Connection-Objekt.
    // pErr ist ein Recordset-Objekt in der Errors-Auflistung der
    // Verbindung.
    ErrorPtr    pErr  = NULL;

    if( (pConnection->Errors->Count) > 0)
    {
        long nCount = pConnection->Errors->Count;

        // Gültigkeitsbereich für Collection ist 0 bis nCount -1.
        for(long i = 0;i < nCount;i++)
        {
            pErr = pConnection->Errors->GetItem(i);
            printf("Error number: %x\t%s\n", pErr->Number,
                (LPCSTR) pErr->Description);
        }
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintComError-Funktion                           //
//                                                       //
///////////////////////////////////////////////////////////

void PrintComError(_com_error &e)
{
   _bstr_t bstrSource(e.Source());
   _bstr_t bstrDescription(e.Description());

    // Drucken der Com-Fehler.
   printf("Error\n");
   printf("\tCode = %08lx\n", e.Error());
   printf("\tCode meaning = %s\n", e.ErrorMessage());
   printf("\tSource = %s\n", (LPCSTR) bstrSource);
   printf("\tDescription = %s\n", (LPCSTR) bstrDescription);
}

bool FileExists()
{
    struct _finddata_t xml_file;
    long hFile;

    if( (hFile = _findfirst("a:\\Pubs.xml", &xml_file )) != -1L)
    {
       printf( "File already exists!\n" );
       return(true);
    }
    else
        return (false);
}


Beispiel für die Seek-Methode und die Index-Eigenschaft (VC++)

Dieses Beispiel verwendet die Seek-Methode sowie die Index-Eigenschaft des Recordset-Objekts zusammen mit einer gegebenen Employee ID, um den Namen des Mitarbeiters in der Employees-Tabelle der Datenbank Nwind.mdb zu finden.

#import "C:\Programme\Gemeinsame Dateien\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <stdio.h>
#include <ole2.h>
#include <conio.h>
#include <string.h>
#include "SeekX.h"

// Funktionsdeklarationen
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void SeekX(void);
void PrintProviderError(_ConnectionPtr pConnection);
void PrintComError(_com_error &e);

//////////////////////////////////////////////////////////
//                                                      //
//       Main-Funktion                                  //
//                                                      //
//////////////////////////////////////////////////////////
void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    SeekX();

    ::CoUninitialize();
}

//////////////////////////////////////////////////////////
//                                                      //
//     SeekX-Funktion                                   //
//                                                      //
//////////////////////////////////////////////////////////
void SeekX()
{
    HRESULT hr = S_OK;

    // Definieren der ADO-Objektzeiger.
    // Initialisieren der Zeiger bei der Definition.
    // Sie befinden sich im ADODB::-Namespace.

    _RecordsetPtr pRstEmp = NULL;

    IADORecordBinding    *picRs = NULL;  // Deklaration des
                                    // Schnittstellenzeigers
    CEmployeesRs EmpRs; // C++-Klassenobjekt.

    // Definieren anderer Variablen.
    _bstr_t strPrompt("Enter an EmployeeID (e.g., 1 to 9)");
    char strEmpId[1];

    try
    {
        TESTHR(pRstEmp.CreateInstance(__uuidof(Recordset)));
        pRstEmp->CursorLocation = adUseServer;
        pRstEmp->Open("employees", "Provider=Microsoft.Jet.OLEDB.4.0;"
            "Data Source=C:\\Programme\\Microsoft Office\\Office\\"
            "Samples\\Northwind.mdb;user id=admin;password=;",
            adOpenKeyset,adLockReadOnly,adCmdTableDirect);

        // Öffnen eines IADORecordBinding-Schnittstellenzeigers, der für
        // die Bindung eines Recordsets an eine Klasse verwendet wird.
        TESTHR(pRstEmp->QueryInterface(
            __uuidof(IADORecordBinding), (LPVOID*)&picRs));

        // Binden des Recordsets an eine C++-Klasse.
        TESTHR(picRs->BindToRecordset(&EmpRs));

        // Unterstützt dieser Provider Seek und Index?
        if (pRstEmp->Supports(adIndex) && pRstEmp->Supports(adSeek))
        {
            pRstEmp->Index = "EmployeeId";

            // Anzeigen aller Mitarbeiter.
            pRstEmp->MoveFirst();
            while (!pRstEmp->EndOfFile)
            {
                  printf("%d : %s %s\n",
                      EmpRs.le_empidStatus == adFldOK ?
                      EmpRs.m_ie_empid : 0,
                      EmpRs.le_fnameStatus == adFldOK ?
                      EmpRs.m_sze_fname : "<NULL>",
                      EmpRs.le_lnameStatus == adFldOK ?
                      EmpRs.m_sze_lname : "<NULL>");

                  pRstEmp->MoveNext();
            }
            // Auffordern des Benutzers, eine EmployeeID zwischen 1 und 9
            // einzugeben.
            do
            {
                pRstEmp->MoveFirst();
                printf("\n\n%s\t",(LPCSTR) strPrompt);
                gets(strEmpId);

                // Beenden, wenn strEmpID eine Zeichenfolge mit der Länge
                // Null ist.
                // (CANCEL, null, etc.)
                char *strTemp = strtok(strEmpId," \t");
                if (strTemp == NULL) break;
                if (strlen(strTemp) == 1 && atoi(strTemp) >= 1 &&
                    atoi(strTemp) <= 9)
                {
                    _variant_t strEmployeeId(strTemp);
                    pRstEmp->Seek(strEmployeeId, adSeekAfterEQ);
                    if (pRstEmp->EndOfFile)
                    {
                        printf("Employee not found.\n");
                    }
                    else
                    {
                        printf("%d : Employee='%s %s'\n",
                            EmpRs.le_empidStatus == adFldOK ?
                            EmpRs.m_ie_empid : 0,
                            EmpRs.le_fnameStatus == adFldOK ?
                            EmpRs.m_sze_fname : "<NULL>",
                            EmpRs.le_lnameStatus == adFldOK ?
                            EmpRs.m_sze_lname : "<NULL>");
                    }
                }
            }
            while(true);
        }

        // Freigeben der IADORecordset-Schnittstelle.
        if (picRs)
            picRs->Release();

        // Löschen der Objekte vor dem Beenden.
        pRstEmp->Close();
    }
    catch(_com_error &e)
    {
       // Benachrichtigen des Benutzers über Fehler, falls vorhanden.
       // Übergeben eines Verbindungszeigers, auf den aus dem Recordset
       // zugegriffen wird.
        _variant_t vtConnect = pRstEmp->GetActiveConnection();

        // GetActiveConnection gibt die Verbindungszeichenfolge zurück,
        // wenn die Verbindung nicht geöffnet ist; andernfalls wird das
        // Connection-Objekt zurückgegeben.
        switch(vtConnect.vt)
        {
            case VT_BSTR:
                PrintComError(e);
                break;
            case VT_DISPATCH:
                PrintProviderError(vtConnect);
                break;
            default:
                printf("Errors occured.");
                break;
        }
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintProviderError-Funktion                      //
//                                                       //
///////////////////////////////////////////////////////////
void PrintProviderError(_ConnectionPtr pConnection)
{
    // Drucken der Providerfehler aus dem Connection-Objekt.
    // pErr ist ein Recordset-Objekt in der Errors-Auflistung der
    // Verbindung.
    ErrorPtr    pErr  = NULL;

    if( (pConnection->Errors->Count) > 0)
    {
        long nCount = pConnection->Errors->Count;

        // Gültigkeitsbereich für Collection ist 0 bis nCount -1.
        for(long i = 0;i < nCount;i++)
        {
            pErr = pConnection->Errors->GetItem(i);
            printf("\t Error number: %x\t%s", pErr->Number,
                pErr->Description);
        }
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintComError-Funktion                           //
//                                                       //
///////////////////////////////////////////////////////////
void PrintComError(_com_error &e)
{
   _bstr_t bstrSource(e.Source());
   _bstr_t bstrDescription(e.Description());

    // Drucken der Com-Fehler.
   printf("Error\n");
   printf("\tCode = %08lx\n", e.Error());
   printf("\tCode meaning = %s\n", e.ErrorMessage());
   printf("\tSource = %s\n", (LPCSTR) bstrSource);
   printf("\tDescription = %s\n", (LPCSTR) bstrDescription);
}

SeekX.h

#include "icrsint.h"

// Diese Klasse extrahiert nur EmployeeId,FirstName und LastName
// aus der Employees-Tabelle.
class CEmployeesRs : public CADORecordBinding
{
BEGIN_ADO_BINDING(CEmployeesRs)

   // Die hiredate-Spalte ist das erste Feld in der Tabelle.
   ADO_VARIABLE_LENGTH_ENTRY2(1, adInteger,m_ie_empid,
        sizeof(m_ie_empid), le_empidStatus, FALSE)

    // Die LastName-Spalte ist das zweite Feld in der Tabelle.
   ADO_VARIABLE_LENGTH_ENTRY2(2, adVarChar, m_sze_lname,
         sizeof(m_sze_lname), le_lnameStatus, FALSE)

    // Die FirstName-Spalte ist das dritte Feld in der Tabelle.
   ADO_VARIABLE_LENGTH_ENTRY2(2, adVarChar, m_sze_fname,
         sizeof(m_sze_fname), le_fnameStatus, FALSE)
END_ADO_BINDING()

public:
   INT    m_ie_empid;
   ULONG  le_empidStatus;
   CHAR    m_sze_fname[11];
   ULONG  le_fnameStatus;
   CHAR    m_sze_lname[21];
   ULONG  le_lnameStatus;
};


Beispiel für die Sort-Eigenschaft (VC++)

Dieses Beispiel verwendet die Sort-Eigenschaft des Recordset-Objekts, um die Zeilen eines Recordset-Objekts aus der Authors-Tabelle der Pubs-Datenbank neu zu sortieren. Mithilfe einer sekundären Hilfsroutine werden die einzelnen Zeilen gedruckt.

#import "C:\Programme\Gemeinsame Dateien\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <ole2.h>
#include <stdio.h>
#include <conio.h>

// Funktionsdeklarationen
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void SortX(void);
void SortXprint(_bstr_t title, _RecordsetPtr rstp);
void PrintProviderError(_ConnectionPtr pConnection);
void PrintComError(_com_error &e);

//////////////////////////////////////////////////////////
//                                                      //
//    Hauptfunktion                                     //
//                                                      //
//////////////////////////////////////////////////////////
void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    SortX();

    ::CoUninitialize();
}

//////////////////////////////////////////////////////////
//                                                      //
//        SortX-Funktion                                //
//                                                      //
//////////////////////////////////////////////////////////
void SortX(void)
{
    HRESULT  hr = S_OK;

    // Zeiger bei der Definition initialisieren.
    // Sie befinden sich im ADODB::-Namespace.
    _ConnectionPtr  pConnection      = NULL;
    _RecordsetPtr  pRstAuthors    = NULL;

    // Zeichenfolgenvariablen definieren.
    _bstr_t strCnn("Provider=sqloledb;Data Source=srv;"
            "Initial Catalog=Pubs;User Id=sa;Password=;");

    try
    {
        TESTHR(pConnection.CreateInstance(__uuidof(Connection)));

        TESTHR(pRstAuthors.CreateInstance(__uuidof(Recordset)));

        pRstAuthors->CursorLocation = adUseClient;
        pConnection->Open (strCnn, "", "", NULL);
        pRstAuthors->Open("SELECT * FROM Authors",
            _variant_t((IDispatch *) pConnection),
            adOpenStatic, adLockReadOnly, adCmdText);

        SortXprint("    Initial Order    ", pRstAuthors);

        // Bildschirm für nächsten Anzeige löschen.
        printf("\nPress any key to continue...");
        getch();
        system("cls");

        pRstAuthors->Sort = "au_lname ASC, au_fname ASC";
        SortXprint("Last Name Ascending", pRstAuthors);

        // Bildschirm für nächsten Anzeige löschen.
        printf("\nPress any key to continue...");
        getch();
        system("cls");

        pRstAuthors->Sort = "au_lname DESC, au_fname ASC";
        SortXprint("Last Name Descending", pRstAuthors);

        // Cleanup der Objekte vor dem Beenden.
        pRstAuthors->Close();
        pConnection->Close();
    }
    catch(_com_error &e)
    {
        PrintProviderError(pConnection);
        PrintComError(e);
    }
}

//////////////////////////////////////////////////////////
//                                                      //
//        SortXprint-Funktion                           //
//                                                      //
//////////////////////////////////////////////////////////
// Dies ist eine sekundäre Hilfsroutine, die den angegebenen
// Titel und den Inhalt des angegebenen Recordsets ausdruckt.
void SortXprint(_bstr_t title, _RecordsetPtr rstp)
{
    printf("---------------%s---------------\n", (LPCSTR)title);
    printf("First Name  Last Name\n"
        "---------------------------------------------------\n");
    rstp->MoveFirst();
    int intLineCnt = 4;
    while (!(rstp->EndOfFile))
    {
        _bstr_t aufname;
        _bstr_t aulname;
        aufname = rstp->GetFields()->GetItem("au_fname")->Value;
        aulname = rstp->GetFields()->GetItem("au_lname")->Value,
        printf("%s    %s\n",(LPCSTR) aufname, (LPCSTR) aulname);
        rstp->MoveNext();
        intLineCnt++;
        if (intLineCnt % 20 ==0)
            {
                printf("\nPress any key to continue...\n");
                getch();
            }
    }
}

//////////////////////////////////////////////////////////
//                                                      //
//     PrintProviderError-Funktion                      //
//                                                      //
//////////////////////////////////////////////////////////
void PrintProviderError(_ConnectionPtr pConnection)
{
    // Providerfehler aus dem Connection-Objekt drucken.
    // pErr ist ein Datensatzobjekt in der Errors-Auflistung der
    // Verbindung.
    ErrorPtr    pErr  = NULL;

    if( (pConnection->Errors->Count) > 0)
    {
        long nCount = pConnection->Errors->Count;
        // Auflistung reicht von 0 bis nCount -1.
        for(long i = 0; i < nCount; i++)
        {
            pErr = pConnection->Errors->GetItem(i);
            printf("Error number: %x\t%s\n", pErr->Number,
                (LPCSTR) pErr->Description);
        }
    }
}

//////////////////////////////////////////////////////////
//                                                      //
//  PrintComError-Funktion                              //
//                                                      //
//////////////////////////////////////////////////////////

void PrintComError(_com_error &e)
{
   _bstr_t bstrSource(e.Source());
   _bstr_t bstrDescription(e.Description());

    // Von COM stammende Fehler drucken.
   printf("Error\n");
   printf("\tCode = %08lx\n", e.Error());
   printf("\tCode meaning = %s\n", e.ErrorMessage());
   printf("\tSource = %s\n", (LPCSTR) bstrSource);
   printf("\tDescription = %s\n", (LPCSTR) bstrDescription);

}


Beispiel für die Source-Eigenschaft (VC++)

In diesem Beispiel wird die Source-Eigenschaft erläutert, indem drei Recordset-Objekte geöffnet werden, die auf unterschiedlichen Datenquellen basieren.

#import "c:\Programme\Gemeinsame Dateien\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <ole2.h>
#include <stdio.h>
#include <conio.h>

// Funktionsdeklarationen
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void SourceX(void);
void PrintProviderError(_ConnectionPtr pConnection);
void PrintComError(_com_error &e);

///////////////////////////
//                       //
//    Hauptfunktion      //
//                       //
///////////////////////////
void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    SourceX();

    ::CoUninitialize();
}

///////////////////////////////////////////////
//                                           //
//    SourceX-Funktion                       //
//                                           //
///////////////////////////////////////////////
void SourceX(void)
{
   HRESULT  hr = S_OK;

   // Zeichenfolgenvariablen definieren.
   _bstr_t strCmdSQL("Select title,type,pubdate "
            "FROM Titles ORDER BY title");
   _bstr_t strSQL("SELECT title_ID AS TitleID, title AS Title, "
            "publishers.pub_id AS PubID, pub_name AS PubName "
            "FROM publishers INNER JOIN titles "
            "ON publishers.pub_id = Titles.pub_id "
            "ORDER BY Title");
   _bstr_t strCnn("Provider=sqloledb;Data Source=srv;"
            "Initial Catalog=Pubs;User Id=sa;Password=;");

    // ADO-Objektzeiger definieren.
    // Zeiger bei der Definition initialisieren.
    // Sie befinden sich im ADODB::-Namespace.
   _ConnectionPtr  pConnection          = NULL;
   _RecordsetPtr  pRstTitles        = NULL;
   _RecordsetPtr  pRstPublishers      = NULL;
   _RecordsetPtr  pRstPublishersDirect    = NULL;
   _RecordsetPtr  pRstTitlesPublishers    = NULL;
   _CommandPtr     pCmdSQL          = NULL;

     try
    {
        // Eine Verbindung öffnen.
        TESTHR(pConnection.CreateInstance(__uuidof(Connection)));
        pConnection->Open (strCnn, "", "", NULL);

        // Ein auf einem Command-Objekt basierendes Recordset öffen.
        TESTHR(pCmdSQL.CreateInstance(__uuidof(Command)));
        pCmdSQL->ActiveConnection = pConnection;
        pCmdSQL->CommandText = strCmdSQL;
        pRstTitles = pCmdSQL->Execute(NULL,NULL,adCmdText);

        // Ein auf einer Tabelle basierendes Recordset öffnen.
        TESTHR(pRstPublishers.CreateInstance(__uuidof(Recordset)));
        pRstPublishers->Open ("publishers",
            _variant_t((IDispatch *) pConnection, true),
            adOpenForwardOnly, adLockReadOnly, adCmdTable);

        // Ein auf einer Tabelle basierendes Recordset öffnen.
        TESTHR(pRstPublishersDirect.CreateInstance(
            __uuidof(Recordset)));
        pRstPublishersDirect->Open ("publishers",
            _variant_t((IDispatch *) pConnection, true),
            adOpenForwardOnly, adLockReadOnly, adCmdTableDirect);

        // Ein auf einer SQL-Zeichenfolge basierendes Recordset öffnen.
        TESTHR(pRstTitlesPublishers.CreateInstance(
            __uuidof(Recordset)));
        pRstTitlesPublishers->Open(strSQL,
            _variant_t((IDispatch *) pConnection, true),
            adOpenForwardOnly, adLockReadOnly, adCmdText);

        // Mithilfe der Source-Eigenschaft die Quelle jedes Recordsets
        // anzeigen.
        printf("rstTitles source: \n%s\n\n",
            (LPCSTR)(_bstr_t) pRstTitles->GetSource().bstrVal);
        printf("rstPublishers source: \n%s\n\n",
            (LPCSTR)(_bstr_t) pRstPublishers->GetSource().bstrVal);
        printf("rstPublishersDirect source: \n%s\n\n",
            (LPCSTR)(_bstr_t) pRstPublishersDirect->GetSource().bstrVal);
        printf("rstTitlesPublishers source: \n%s\n\n",
            (LPCSTR)(_bstr_t) pRstTitlesPublishers->GetSource().bstrVal);

        pRstTitles->Close();
        pRstPublishers->Close();
        pRstPublishersDirect->Close();
        pRstTitlesPublishers->Close();
        pConnection->Close();
    }
    catch (_com_error &e)
    {
        // Gegebenenfalls Fehlermeldungen an Benutzer ausgeben.
        PrintProviderError(pConnection);
        PrintComError(e);
    }
}

///////////////////////////////////////////////
//                                           //
//    PrintProviderError-Funktion            //
//                                           //
///////////////////////////////////////////////
void PrintProviderError(_ConnectionPtr pConnection)
{
    // Providerfehler aus dem Connection-Objekt drucken.
    // pErr ist ein Datensatzobjekt in der Errors-Auflistung der
    // Verbindung.
    ErrorPtr    pErr  = NULL;

    if( (pConnection->Errors->Count) > 0)
    {
        long nCount = pConnection->Errors->Count;
        // Auflistung reicht von 0 bis nCount -1.
        for(long i = 0; i < nCount; i++)
        {
            pErr = pConnection->Errors->GetItem(i);
            printf("Error number: %x\t%s\n", pErr->Number,
                (LPCSTR) pErr->Description);
        }
    }
}

///////////////////////////////////////////////
//                                           //
//    PrintComError-Funktion                 //
//                                           //
///////////////////////////////////////////////
void PrintComError(_com_error &e)
{
   _bstr_t bstrSource(e.Source());
   _bstr_t bstrDescription(e.Description());

    // Von COM stammende Fehler drucken.
   printf("Error\n");
   printf("\tCode = %08lx\n", e.Error());
   printf("\tCode meaning = %s\n", e.ErrorMessage());
   printf("\tSource = %s\n", (LPCSTR) bstrSource);
   printf("\tDescription = %s\n", (LPCSTR) bstrDescription);

}


Beispiel für die State-Eigenschaft (VC++)

In diesem Beispiel wird die State-Eigenschaft zum Anzeigen einer Nachricht verwendet, während asynchrone Verbindungen geöffnet und asynchrone Befehle ausgeführt werden.

#import "c:\Programme\Gemeinsame Dateien\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <ole2.h>
#include <stdio.h>
#include <conio.h>

// Funktionsdeklarationen
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void StateX(void);
void PrintProviderError(_ConnectionPtr pConnection);
void PrintComError(_com_error &e);

///////////////////////////////////////////////
//                                           //
//    Hauptfunktion                          //
//                                           //
///////////////////////////////////////////////
void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    StateX();

    ::CoUninitialize();
}

///////////////////////////////////////////////
//                                           //
//        StateX-Funktion                    //
//                                           //
///////////////////////////////////////////////
void StateX(void)
{
    HRESULT  hr = S_OK;

    // Zeichenfolgenvariablen definieren.
    _bstr_t strSQLChange("UPDATE Titles SET Type = "
            "'self_help' WHERE Type = 'psychology'");
    _bstr_t strSQLRestore("UPDATE Titles SET Type = "
            "'psychology' WHERE Type = 'self_help'");
    _bstr_t strCnn("Provider=sqloledb;Data Source=srv;"
            "Initial Catalog=Pubs;User Id=sa;Password=;");

    // ADO-Objektzeiger definieren.
    // Zeiger bei der Definition initialisieren.
    // Sie befinden sich im ADODB::-Namespace.
    _ConnectionPtr    pConnection        = NULL;
    _ConnectionPtr    pConnection2        = NULL;
    _CommandPtr         pCmdChange    = NULL;
    _CommandPtr         pCmdRestore    = NULL;

    try
    {
        // Zwei asynchrone Verbindungen öffnen, während des
        // Herstellens der Verbindung eine Meldung anzeigen.
        TESTHR(pConnection.CreateInstance(__uuidof(Connection)));
        TESTHR(pConnection2.CreateInstance(__uuidof(Connection)));

        pConnection->Open (strCnn, "", "", adAsyncConnect);
        while(pConnection->State == adStateConnecting)
        {
            printf("Opening first connection....\n\n");
        }

        pConnection2->Open (strCnn, "", "", adAsyncConnect);
        while(pConnection2->State == adStateConnecting)
        {
            printf("Opening second connection....\n\n");
        }

        // Zwei Command-Objekte erstellen.
        TESTHR(pCmdChange.CreateInstance(__uuidof(Command)));
        pCmdChange->ActiveConnection = pConnection;
        pCmdChange->CommandText = strSQLChange;

        TESTHR(pCmdRestore.CreateInstance(__uuidof(Command)));
        pCmdRestore->ActiveConnection = pConnection2;
        pCmdRestore->CommandText = strSQLRestore;

        // Die Befehle ausführen, während ihrer Ausführung
        // eine Meldung anzeigen.
        pCmdChange->Execute(NULL,NULL,adAsyncExecute);
        while(pCmdChange->State == adStateExecuting)
        {
            printf("Change command executing...\n\n");
        }

        pCmdRestore->Execute(NULL,NULL,adAsyncExecute);
        while(pCmdRestore->State == adStateExecuting)
        {
            printf("Restore command executing...\n\n");
        }

        pConnection->Close();
        pConnection2->Close();
    }
    catch (_com_error &e)
    {
        // Gegebenenfalls Fehlermeldungen an Benutzer ausgeben.
        PrintProviderError(pConnection);
        PrintComError(e);
    }
}

///////////////////////////////////////////////
//                                           //
//    PrintProviderError-Funktion            //
//                                           //
///////////////////////////////////////////////
void PrintProviderError(_ConnectionPtr pConnection)
{
    // Providerfehler aus dem Connection-Objekt drucken.
    // pErr ist ein Datensatzobjekt in der Errors-Auflistung der
    // Verbindung.
    ErrorPtr    pErr  = NULL;

    if( (pConnection->Errors->Count) > 0)
    {
        long nCount = pConnection->Errors->Count;
        // Auflistung reicht von 0 bis nCount -1.
        for(long i = 0; i < nCount; i++)
        {
            pErr = pConnection->Errors->GetItem(i);
            printf("Error number: %x\t%s\n", pErr->Number,
                (LPCSTR) pErr->Description);
        }
    }
}

///////////////////////////////////////////////
//                                           //
//    PrintComError-Funktion                 //
//                                           //
///////////////////////////////////////////////
void PrintComError(_com_error &e)
{
   _bstr_t bstrSource(e.Source());
   _bstr_t bstrDescription(e.Description());

    // Von COM stammende Fehler drucken.
   printf("Error\n");
   printf("\tCode = %08lx\n", e.Error());
   printf("\tCode meaning = %s\n", e.ErrorMessage());
   printf("\tSource = %s\n", (LPCSTR) bstrSource);
   printf("\tDescription = %s\n", (LPCSTR) bstrDescription);
}


Beispiel für die Status-Eigenschaft (VC++)

In diesem Beispiel wird die Status-Eigenschaft zum Anzeigen der Datensätze verwendet, die in einer Stapeloperation geändert wurden, bevor eine Stapelaktualisierung stattgefunden hat.

#import "c:\Programme\Gemeinsame Dateien\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <ole2.h>
#include <stdio.h>
#include <conio.h>
#include "StatusX.h"

// Funktionsdeklarationen
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void StatusX(void);
void PrintProviderError(_ConnectionPtr pConnection);
void PrintComError(_com_error &e);

///////////////////////////////////////////////
//                                           //
//    Hauptfunktion                          //
//                                           //
///////////////////////////////////////////////

void main()
{
    if(FAILED(CoInitialize(NULL)))
        return;

    StatusX();

    ::CoUninitialize();
}

///////////////////////////////////////////////
//                                           //
//    StatusX-Funktion                       //
//                                           //
///////////////////////////////////////////////
void StatusX(void)
{
    HRESULT  hr = S_OK;

    // Zeichenfolgenvariablen definieren.
    _bstr_t strCnn("Provider=sqloledb;Data Source=srv;"
            "Initial Catalog=Pubs;User Id=sa;Password=;");

    // ADO-Objektzeiger definieren.
    // Zeiger bei der Definition initialisieren.
    // Sie befinden sich im ADODB::-Namespace.
     IADORecordBinding *picRs    = NULL;  // Deklarierter
                                 // Schnittstellenzeiger
     CTitleRs titlers;           // C++-Klassenobjekt
    _RecordsetPtr  pRstTitles    = NULL;
    LPSTR p_TempStr        = NULL;

       try
    {
        // Recordset für Stapelaktualisierung öffnen.
        TESTHR(pRstTitles.CreateInstance(__uuidof(Recordset)));
        pRstTitles->CursorType = adOpenKeyset;
        pRstTitles->LockType = adLockBatchOptimistic;
        pRstTitles->Open ("Titles", strCnn,
            adOpenKeyset, adLockBatchOptimistic, adCmdTable);

        // Einen IADORecordBinding-Schnittstellenzeiger öffnen, der
        // für das Binden eines Recordsets an eine Klasse verwendet wird.
        TESTHR(pRstTitles->QueryInterface(
            __uuidof(IADORecordBinding),(LPVOID*)&picRs));

        // An dieser Stelle Recordset an eine C++-Klasse binden.
        TESTHR(picRs->BindToRecordset(&titlers));

        p_TempStr = (LPSTR) malloc(sizeof(titlers.m_szt_Type));

        // Änderung des Typs der Psychologietitel.
        while(!(pRstTitles->EndOfFile))
        {
            // Leere Zeichenfolge entfernen (Zurechtschneiden).
            strcpy(p_TempStr,strtok(titlers.m_szt_Type," "));

            // Den Typ von Psychologietiteln vergleichen.
            if (!strcmp(p_TempStr,"psychology"))
            {
                    // "self_help"-Titelfeld kopieren.
                    pRstTitles->Fields->GetItem("type")->Value =
                        (_bstr_t) ("self_help");
            }
            pRstTitles->MoveNext();
        }

        // Titel-ID und -status anzeigen.
        pRstTitles->MoveFirst();
        while(!(pRstTitles->EndOfFile))
        {
            if(pRstTitles->Status == adRecModified)
            {
                printf("%s - Modified\n",titlers.lt_Title_idStatus ==
                    adFldOK ? titlers.m_szt_Title_id : "<NULL>");
            }
            else
            {
                printf("%s\n",titlers.lt_Title_idStatus == adFldOK ?
                    titlers.m_szt_Title_id : "<NULL>");
            }
            pRstTitles->MoveNext();
        }

        // Speicherzuordnung aufheben.
        free(p_TempStr);

        // Die Aktualisierung abbrechen, da dies nur als Beispiel
        // dient.
        pRstTitles->CancelBatch(adAffectAll);
        pRstTitles->Close();
    }
    catch (_com_error &e)
    {
       // Gegebenenfalls Fehlermeldungen an Benutzer ausgeben.
       // Einen Verbindungszeiger übergeben, auf den vom Recordset
       // zugegriffen wird.
        _variant_t vtConnect = pRstTitles->GetActiveConnection();

        // GetActiveConnection gibt eine Verbindungszeichenfolge zurück,
        // wenn die Verbindung nicht geöffnet ist, sonst wird ein
        // Connection-Objekt zurückgegeben.
        switch(vtConnect.vt)
        {
            case VT_BSTR:
                PrintComError(e);
                break;
            case VT_DISPATCH:
                PrintProviderError(vtConnect);
                break;
            default:
                printf("Errors occured.");
                break;
        }
    }
}

///////////////////////////////////////////////
//                                           //
//    PrintProviderError-Funktion            //
//                                           //
///////////////////////////////////////////////

void PrintProviderError(_ConnectionPtr pConnection)
{
    // Providerfehler aus dem Connection-Objekt drucken.
    // pErr ist ein Datensatzobjekt in der Errors-Auflistung der
    // Verbindung.
    ErrorPtr    pErr  = NULL;

    if( (pConnection->Errors->Count) > 0)
    {
        long nCount = pConnection->Errors->Count;
        // Auflistung reicht von 0 bis nCount -1.
        for(long i = 0; i < nCount; i++)
        {
            pErr = pConnection->Errors->GetItem(i);
            printf("Error number: %x\t%s\n", pErr->Number,
                (LPCSTR) pErr->Description);
        }
    }
}

///////////////////////////////////////////////
//                                           //
//    PrintComError-Funktion                 //
//                                           //
///////////////////////////////////////////////
void PrintComError(_com_error &e)
{
   _bstr_t bstrSource(e.Source());
   _bstr_t bstrDescription(e.Description());

    // Von COM stammende Fehler drucken.
   printf("Error\n");
   printf("\tCode = %08lx\n", e.Error());
   printf("\tCode meaning = %s\n", e.ErrorMessage());
   printf("\tSource = %s\n", (LPCSTR) bstrSource);
   printf("\tDescription = %s\n", (LPCSTR) bstrDescription);
}

StatusX.h

#include "icrsint.h"

// Diese Klasse ruft title_id und type von der Titles-Tabelle ab.
class CTitleRs : public CADORecordBinding
{
    BEGIN_ADO_BINDING(CTitleRs)
        // Die title_id-Spalte ist das erste Feld in der Tabelle.
        ADO_VARIABLE_LENGTH_ENTRY2(1,adVarChar,m_szt_Title_id,
            sizeof(m_szt_Title_id),lt_Title_idStatus,FALSE)
        // Die type-Spalte ist das dritte Feld in der Tabelle.
        ADO_VARIABLE_LENGTH_ENTRY2(3,adVarChar,m_szt_Type,
            sizeof(m_szt_Type),lt_TypeStatus,TRUE)
END_ADO_BINDING()

public:
    CHAR m_szt_Title_id[7];
    ULONG lt_Title_idStatus;
    CHAR m_szt_Type[13];
    ULONG lt_TypeStatus;
};


Beispiel für die StayInSync-Eigenschaft (VC++)

Dieses Beispiel verdeutlicht, wie mit der StayInSync-Eigenschaft der Zugriff auf Zeilen in einem hierarchischen Recordset-Objekt erleichtert wird.

Die äußere Schleife zeigt den Vor- und Nachnamen der einzelnen Autoren, den Bundesstaat und die Identifikation an. Das angehängte Recordset-Objekt für die einzelnen Zeilen wird von der Fields-Auflistung abgerufen und automatisch von der StayInSync-Eigenschaft rstTitleAuthor zugeordnet, sobald sich das übergeordnete Recordset-Objekt zu einer neuen Zeile bewegt. Die innere Schleife zeigt vier Felder jeder Zeile im angehängten Recordset-Objekt an.

#import "C:\Programme\Gemeinsame Dateien\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <ole2.h>
#include <stdio.h>
#include <conio.h>

// Funktionsdeklarationen
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void StayInSyncX(void);
void PrintProviderError(_ConnectionPtr pConnection);
void PrintComError(_com_error &e);

//////////////////////////////////////////////////////////
//                                                      //
//        Hauptfunktion                                 //
//                                                      //
//////////////////////////////////////////////////////////
void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    StayInSyncX();

    ::CoUninitialize();
}

//////////////////////////////////////////////////////////
//                                                      //
//       StayInSyncX-Funktion                           //
//                                                      //
//////////////////////////////////////////////////////////
void StayInSyncX(void)
{
    HRESULT  hr = S_OK;

    // Zeichenfolgenvariablen definieren.
    _bstr_t strCnn("Provider=MSDataShape;Data Provider=sqloledb;"
        "Data Source=dhale1;Initial Catalog=Pubs;User Id=sa;Password=;");

    // ADO-Objektzeiger definieren.
    // Zeiger bei der Definition initialisieren.
    // Sie befinden sich im ADODB::-Namespace.
    _ConnectionPtr  pConnection      = NULL;
    _RecordsetPtr  pRst      = NULL;
    _RecordsetPtr  pRstTitleAuthors    = NULL;

    try
    {
        TESTHR(pRstTitleAuthors.CreateInstance(__uuidof(Recordset)));

        TESTHR(pConnection.CreateInstance(__uuidof(Connection)));

        TESTHR(pRst.CreateInstance(__uuidof(Recordset)));

        // Verbindung öffnen.
        pConnection->Open (strCnn, "", "", NULL);
        pRst->PutStayInSync(true);

        // Recordset mit den Namen aus der Authors- und titleauthor-
        // Tabelle öffnen.
        pRst->Open("SHAPE  {select * from Authors} "
              "APPEND ({select * from titleauthor}"
              "RELATE au_id TO au_id) AS chapTitleAuthor",
              _variant_t((IDispatch*)pConnection,true),
            adOpenStatic, adLockReadOnly, adCmdText);

        pRstTitleAuthors = pRst->GetFields()->GetItem("chapTitleAuthor")->
            Value;
        int intLineCnt=0;
        while(!(pRst->EndOfFile))
        {
            printf("\n%s  %s  %s    %s\n", (LPCSTR)(_bstr_t)pRst->
               Fields->GetItem("au_fname")->Value,
               (LPCSTR)(_bstr_t)pRst->Fields->GetItem("au_lname")->Value,
               (LPCSTR)(_bstr_t)pRst->Fields->GetItem("state")->Value,
               (LPCSTR)(_bstr_t)pRst->Fields->GetItem("au_id")->Value);
            intLineCnt++;

            if (intLineCnt%15 == 0)
            {
                printf("\nPress any key to continue...\n");
                getch();
            }

            _variant_t vIndex;
            while(!(pRstTitleAuthors->EndOfFile))
            {
                vIndex = (short) 0;
                printf("%s    ",(LPCSTR)(_bstr_t)pRstTitleAuthors->
                    Fields->Item[&vIndex]->Value);
                vIndex = (short) 1;
                printf("%s    ",(LPCSTR)(_bstr_t)pRstTitleAuthors->
                    Fields->Item[&vIndex]->Value);
                vIndex = (short) 2;
                printf("%s    ",(LPCSTR)(_bstr_t)pRstTitleAuthors->
                    Fields->Item[&vIndex]->Value);
                vIndex = (short) 3;
                printf("%s\n",(LPCSTR)(_bstr_t)pRstTitleAuthors->
                    Fields->Item[&vIndex]->Value);
                intLineCnt++;

                if (intLineCnt%15 == 0)
                {
                    printf("\nPress any key to continue...\n");
                    getch();
                }
                pRstTitleAuthors->MoveNext();
            }
            pRst->MoveNext();
        }
        // Cleanup der Objekte vor dem Beenden.
        pRst->Close();
        pConnection->Close();
    }

    catch(_com_error &e)
    {
        // Gegebenenfalls Fehlermeldungen an Benutzer ausgeben.
        // Einen Verbindungszeiger übergeben, auf den vom Recordset
        // zugegriffen wird.
        PrintProviderError(pConnection);
        PrintComError(e);
    }
}

//////////////////////////////////////////////////////////
//                                                      //
//        PrintProviderError-Funktion                   //
//                                                      //
//////////////////////////////////////////////////////////
void PrintProviderError(_ConnectionPtr pConnection)
{
    // Providerfehler aus dem Connection-Objekt drucken.
    // pErr ist ein Datensatzobjekt in der Errors-Auflistung der
    // Verbindung.
    ErrorPtr    pErr  = NULL;

    if( (pConnection->Errors->Count) > 0)
    {
        long nCount = pConnection->Errors->Count;
        // Auflistung reicht von 0 bis nCount -1.
        for(long i = 0; i < nCount; i++)
        {
            pErr = pConnection->Errors->GetItem(i);
            printf("Error number: %x\t%s\n", pErr->Number,
                (LPCSTR) pErr->Description);
        }
    }
}

//////////////////////////////////////////////////////////
//                                                      //
//     PrintComError-Funktion                           //
//                                                      //
//////////////////////////////////////////////////////////
void PrintComError(_com_error &e)
{

    _bstr_t bstrSource(e.Source());
    _bstr_t bstrDescription(e.Description());

    // Von COM stammende Fehler drucken.
    printf("Error\n");
    printf("\tCode = %08lx\n", e.Error());
    printf("\tCode meaning = %s\n", e.ErrorMessage());
    printf("\tSource = %s\n", (LPCSTR) bstrSource);
    printf("\tDescription = %s\n", (LPCSTR) bstrDescription);

}


Beispiel für die Supports-Methode (VC++)

In diesem Beispiel wird die Supports-Methode zum Anzeigen der Optionen verwendet, die durch ein mit verschiedenen Cursortypen geöffnetes Recordset unterstützt werden. Zum Ausführen dieses Beispiels ist die DisplaySupport-Funktion erforderlich.

#import "C:\Programme\Gemeinsame Dateien\System\ADO\msado15.dll" \
        no_namespace rename("EOF", "EndOfFile")

#include <stdio.h>
#include <ole2.h>
#include <conio.h>

//Funktionsdeklarationen.
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void SupportsX(void);
void DisplaySupport(_RecordsetPtr pRstTemp);
void PrintProviderError(_ConnectionPtr pConnection);
void PrintComError(_com_error &e);

///////////////////////////////////////////////
//                                           //
//    Hauptfunktion                          //
//                                           //
///////////////////////////////////////////////
void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    SupportsX();

    ::CoUninitialize();
}

///////////////////////////////////////////////
//                                           //
//    SupportsX-Funktion                     //
//                                           //
///////////////////////////////////////////////
void SupportsX(void)
{
    // ADO-Objektzeiger definieren.
    // Zeiger bei der Definition initialisieren.
    // Sie befinden sich im ADODB::-Namespace.
    _RecordsetPtr  pRstTitles  = NULL;

    // Weitere Variablen definieren.
    HRESULT hr = S_OK;

    // Verbindungszeichenfolge einer Variable zuweisen.
    _bstr_t strCnn("Provider=sqloledb;Data Source=srv;"
            "Initial Catalog=Pubs;User Id=sa;Password=;");

    try
    {
        // Ein Recordset aus der Titles-Tabelle öffnen.
        TESTHR(pRstTitles.CreateInstance(__uuidof(Recordset)));

        // Array mit CursorType-Konstanten füllen.
        int  aintCursorType[4];
        aintCursorType[0] = adOpenForwardOnly;
        aintCursorType[1] = adOpenKeyset;
        aintCursorType[2] = adOpenDynamic;
        aintCursorType[3] = adOpenStatic;

        // Unter Verwendung jedes Recordsets und teilweiser
        // Sperrung Recordsets öffnen.
        // Dann die DisplaySupport-Prozedur aufrufen, um die
        // unterstützten Optionen anzuzeigen.
        for (int intIndex=0; intIndex <= 3; intIndex++)
        {
            pRstTitles->CursorType =
               (enum CursorTypeEnum)aintCursorType[intIndex];
            pRstTitles->LockType = adLockOptimistic;

            // CursorType und LockType an das Recordset übergeben.
            pRstTitles->Open ("Titles", strCnn,
                (enum CursorTypeEnum)aintCursorType[intIndex],
                adLockOptimistic, adCmdTable);

            switch(aintCursorType[intIndex])
            {
                case adOpenForwardOnly:
                    printf("\nForwardOnly cursor supports:\n");
                    break;

                case adOpenKeyset:
                    printf("\nKeyset cursor supports:\n");
                    break;

                case adOpenDynamic:
                    printf("\nDynamic cursor supports:\n");
                    break;

                case adOpenStatic:
                    printf("\nStatic cursor supports:\n");
                    break;

                default :
                    break;
            }

            DisplaySupport(pRstTitles);

            printf("\n\nPress any key to continue...");
            getch();

            // Bildschirm für die nächste Anzeige löschen.
            system("cls");

            // Cleanup der Objekte vor dem Beenden.
            pRstTitles->Close();
        }
    }

    catch(_com_error &e)
    {
       // Gegebenenfalls Fehlermeldungen an Benutzer ausgeben.
       // Einen Verbindungszeiger übergeben, auf den vom Recordset
       // zugegriffen wird.
        _variant_t vtConnect = pRstTitles->GetActiveConnection();

        // GetActiveConnection gibt eine Verbindungszeichenfolge zurück,
        // wenn die Verbindung nicht geöffnet ist, sonst wird ein
        // Connection-Objekt zurückgegeben.
        switch(vtConnect.vt)
        {
            case VT_BSTR:
                PrintComError(e);
                break;
            case VT_DISPATCH:
                PrintProviderError(vtConnect);
                break;
            default:
                printf("Errors occured.");
                break;
        }
    }
}

///////////////////////////////////////////////
//                                           //
//    DisplaySupport-Funktion                //
//                                           //
///////////////////////////////////////////////
void DisplaySupport (_RecordsetPtr  pRstTemp)
{
    // Array mit Cursoroptionskonstanten füllen.
    long  alngConstants[11];
    alngConstants[0] = adAddNew;
    alngConstants[1] = adApproxPosition;
    alngConstants[2] = adBookmark;
    alngConstants[3] = adDelete;
    alngConstants[4] = adFind;
    alngConstants[5] = adHoldRecords;
    alngConstants[6] = adMovePrevious;
    alngConstants[7] = adNotify;
    alngConstants[8] = adResync;
    alngConstants[9] = adUpdate;
    alngConstants[10] = adUpdateBatch;

    for(int intIndex=0; intIndex <= 10; intIndex++)
    {
        bool booSupports = pRstTemp->
            Supports( (enum CursorOptionEnum)alngConstants[intIndex] );

        if(booSupports)
        {
            switch(alngConstants[intIndex])
            {
                case adAddNew :
                    printf("\n  AddNew");
                    break;

                case adApproxPosition :
                    printf("\n  AbsolutePosition and AbsolutePage");
                    break;

                case adBookmark :
                    printf("\n  Bookmark");
                    break;

                case adDelete :
                    printf("\n  Delete");
                    break;

                case adFind :
                    printf("\n  Find");
                    break;

                case adHoldRecords :
                    printf("\n  Holding Records");
                    break;

                case adMovePrevious :
                    printf("\n  MovePrevious and Move");
                    break;

                case adNotify :
                    printf("\n  Notifications");
                    break;

                case adResync :
                    printf("\n  Resyncing data");
                    break;

                case adUpdate :
                    printf("\n  Update");
                    break;

                case adUpdateBatch :
                    printf("\n  Batch updating");
                    break;

                default :
                    break;
            }
        }
    }
}

///////////////////////////////////////////////
//                                           //
//    PrintProviderError-Funktion            //
//                                           //
///////////////////////////////////////////////
void PrintProviderError(_ConnectionPtr pConnection)
{
    // Providerfehler aus dem Connection-Objekt drucken.
    // pErr ist ein Datensatzobjekt in der Errors-Auflistung der
    // Verbindung.
    ErrorPtr    pErr  = NULL;

    if( (pConnection->Errors->Count) > 0)
    {
        long nCount = pConnection->Errors->Count;
        // Auflistung reicht von 0 bis nCount -1.
        for(long i = 0; i < nCount; i++)
        {
            pErr = pConnection->Errors->GetItem(i);
            printf("Error number: %x\t%s\n", pErr->Number,
                (LPCSTR) pErr->Description);
        }
    }
}

///////////////////////////////////////////////
//                                           //
//    PrintComError-Funktion                 //
//                                           //
///////////////////////////////////////////////
void PrintComError(_com_error &e)
{
   _bstr_t bstrSource(e.Source());
   _bstr_t bstrDescription(e.Description());

    // Von COM stammende Fehler drucken.
   printf("Error\n");
   printf("\tCode = %08lx\n", e.Error());
   printf("\tCode meaning = %s\n", e.ErrorMessage());
   printf("\tSource = %s\n", (LPCSTR) bstrSource);
   printf("\tDescription = %s\n", (LPCSTR) bstrDescription);
}


Beispiel für die Type-Eigenschaft (Field) (VC++)

In diesem Beispiel wird die Type-Eigenschaft erläutert, indem der Name der Konstanten angezeigt wird, die dem Wert der Type-Eigenschaft aller Field-Objekte in der Employees-Tabelle entspricht. Zum Ausführen dieser Prozedur ist die FieldType-Funktion erforderlich.

#import "c:\Programme\Gemeinsame Dateien\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <ole2.h>
#include <stdio.h>
#include <conio.h>

// Funktionsdeklarationen
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void TypeX(void);
_bstr_t FieldType(int intType);
void PrintProviderError(_ConnectionPtr pConnection);
void PrintComError(_com_error &e);

///////////////////////////////////////////////
//                                           //
//    Hauptfunktion                          //
//                                           //
///////////////////////////////////////////////
void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    TypeX();

    ::CoUninitialize();
}

///////////////////////////////////////////////
//                                           //
//             TypeX-Funktion                //
//                                           //
///////////////////////////////////////////////
void TypeX(void)
{
   HRESULT  hr = S_OK;

    // Zeichenfolgenvariablen definieren.
   _bstr_t strCnn("Provider=sqloledb;Data Source=srv;"
            "Initial Catalog=Pubs;User Id=sa;Password=;");

    // ADO-Objektzeiger definieren.
    // Zeiger bei der Definition initialisieren.
    // Sie befinden sich im ADODB::-Namespace.
  _RecordsetPtr  pRstEmployees  = NULL;
   FieldsPtr  pFldLoop      = NULL;

     try
    {
        // Recordset mit Daten aus der Employees-Tabelle öffnen.
        TESTHR(pRstEmployees.CreateInstance(__uuidof(Recordset)));
        pRstEmployees->Open ("Employees",strCnn,
            adOpenForwardOnly, adLockReadOnly, adCmdTable);

        printf("Fields in Employees Table:\n\n");

        // Die Fields-Auflistung der Employees-Tabelle aufzählen.
        pFldLoop = pRstEmployees->GetFields();
        int intLine = 0;
        for (int intFields = 0; intFields < (int)pFldLoop->
            GetCount(); intFields++)
        {
            _variant_t Index;
            Index.vt = VT_I2;
            Index.iVal = intFields;
            printf("  Name: %s\n" ,
                (LPCSTR) pFldLoop->GetItem(Index)->GetName());
            printf("  Type: %s\n\n",
                (LPCTSTR)FieldType(pFldLoop->GetItem(Index)->Type));
            intLine++;
            if(intLine % 5 == 0)
            {
                printf("Press any key to continue...");
                getch();
                system("cls");
            }
        }
        pRstEmployees->Close();
    }

    catch (_com_error &e)
    {
       // Gegebenenfalls Fehlermeldungen an Benutzer ausgeben.
       // Einen Verbindungszeiger übergeben, auf den vom Recordset
       // zugegriffen wird.
        _variant_t vtConnect = pRstEmployees->GetActiveConnection();

        // GetActiveConnection gibt eine Verbindungszeichenfolge zurück,
        // wenn die Verbindung nicht geöffnet ist, sonst wird ein
        // Connection-Objekt zurückgegeben.
        switch(vtConnect.vt)
        {
            case VT_BSTR:
                PrintComError(e);
                break;
            case VT_DISPATCH:
                PrintProviderError(vtConnect);
                break;
            default:
                printf("Errors occured.");
                break;
        }
    }
}

///////////////////////////////////////////////
//                                           //
//             FieldType-Funktion            //
//                                           //
///////////////////////////////////////////////
_bstr_t FieldType(int intType)
{
        _bstr_t strType;
        switch(intType)
        {
            case adChar:
                 strType = "adChar";
                break;
            case adVarChar:
                strType = "adVarChar";
                break;
            case adSmallInt:
                strType = "adSmallInt";
                break;
            case adUnsignedTinyInt:
                strType = "adUnsignedTinyInt";
                break;
            case adDBTimeStamp:
                strType = "adDBTimeStamp";
                break;
            default:
                break;
        }
        return strType;
}

///////////////////////////////////////////////
//                                           //
//    PrintProviderError-Funktion            //
//                                           //
///////////////////////////////////////////////
void PrintProviderError(_ConnectionPtr pConnection)
{
    // Providerfehler aus dem Connection-Objekt drucken.
    // pErr ist ein Datensatzobjekt in der Errors-Auflistung der
    // Verbindung.
    ErrorPtr    pErr  = NULL;

    if( (pConnection->Errors->Count) > 0)
    {
        long nCount = pConnection->Errors->Count;
        // Auflistung reicht von 0 bis nCount -1.
        for(long i = 0; i < nCount; i++)
        {
            pErr = pConnection->Errors->GetItem(i);
            printf("Error number: %x\t%s\n", pErr->Number,
                (LPCSTR) pErr->Description);
        }
    }
}

///////////////////////////////////////////////
//                                           //
//    PrintComError-Funktion                 //
//                                           //
///////////////////////////////////////////////
void PrintComError(_com_error &e)
{
   _bstr_t bstrSource(e.Source());
   _bstr_t bstrDescription(e.Description());

    // Von COM stammende Fehler drucken.
   printf("Error\n");
   printf("\tCode = %08lx\n", e.Error());
   printf("\tCode meaning = %s\n", e.ErrorMessage());
   printf("\tSource = %s\n", (LPCSTR) bstrSource);
   printf("\tDescription = %s\n", (LPCSTR) bstrDescription);
}


Beispiel für die Type-Eigenschaft (Property) (VC++)

Dieses Beispiel verdeutlicht die Type-Eigenschaft. Es handelt sich dabei um das Modell eines Dienstprogramms zum Auflisten von Namen und Typen einer Auflistung, wie beispielsweise Properties, Fields, usw.

Das Recordset-Objekt muss nicht geöffnet werden, um auf die zugehörige Properties-Auflistung zugreifen zu können; diese werden erstellt, wenn das Recordset-Objekt instanziiert wird. Jedoch werden durch Festlegen der CursorLocation-Eigenschaft auf adUseClient der Properties-Auflistung des Recordset-Objekts zahlreiche dynamische Eigenschaften hinzugefügt, die das Beispiel etwas interessanter gestalten. Aus Gründen der Anschaulichkeit wird in diesem Beispiel explizit die Item-Eigenschaft verwendet, um auf die einzelnen Property-Objekte zugreifen zu können.

#import "C:\Programme\Gemeinsame Dateien\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <ole2.h>
#include <stdio.h>
#include<conio.h>

// Funktionsdeklarationen
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void TypeX();
void PrintComError(_com_error &e);

//////////////////////////////////////////////////////////
//                                                      //
//     Hauptfunktion                                    //
//                                                      //
//////////////////////////////////////////////////////////
void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    TypeX();

    ::CoUninitialize();
}

//////////////////////////////////////////////////////////
//                                                      //
//        TypeX-Funktion                                //
//                                                      //
//////////////////////////////////////////////////////////
void TypeX()
{
    HRESULT  hr = S_OK;

    // ADO-Objektzeiger definieren.
    // Zeiger bei der Definition initialisieren.
    // Sie befinden sich im ADODB::-Namespace
    _RecordsetPtr  pRst  = NULL;
    PropertyPtr pProperty = NULL;

    // Weitere Variablen definieren
    _bstr_t strMsg;
    _variant_t vIndex;
    int intLineCnt = 0;

      try
    {
        TESTHR(pRst.CreateInstance (__uuidof(Recordset)));

        // Cursorplatzierung des Recordsets festlegen.
        pRst->CursorLocation = adUseClient;

        for (short iIndex = 0; iIndex <= (pRst->Properties->
            GetCount() - 1);iIndex++)
        {
            vIndex = iIndex;
            pProperty = pRst->Properties->GetItem(vIndex);

            int propType = (int)pProperty->GetType();
            switch(propType)
            {
                case adBigInt:
                    strMsg = "adBigInt";
                    break;
                case adBinary:
                    strMsg = "adBinary";
                    break;
                case adBoolean:
                    strMsg = "adBoolean";
                    break;
                case adBSTR:
                    strMsg = "adBSTR";
                    break;
                case adChapter:
                    strMsg = "adChapter";
                    break;
                case adChar:
                    strMsg = "adChar";
                    break;
                case adCurrency:
                    strMsg = "adCurrency";
                    break;
                case adDate:
                    strMsg = "adDate";
                    break;
                case adDBDate:
                    strMsg = "adDBDate";
                    break;
                case adDBTime:
                    strMsg = "adDBTime";
                    break;
                case adDBTimeStamp:
                    strMsg = "adDBTimeStamp";
                    break;
                case adDecimal:
                    strMsg = "adDecimal";
                    break;
                case adDouble:
                    strMsg = "adDouble";
                    break;
                case adEmpty:
                    strMsg = "adEmpty";
                    break;
                case adError:
                    strMsg = "adError";
                    break;
                case adFileTime:
                    strMsg = "adFileTime";
                    break;
                case adGUID:
                    strMsg = "adGUID";
                    break;
                case adIDispatch:
                    strMsg = "adIDispatch";
                    break;
                case adInteger:
                    strMsg = "adInteger";
                    break;
                case adIUnknown:
                    strMsg = "adIUnknown";
                    break;
                case adLongVarBinary:
                    strMsg = "adLongVarBinary";
                    break;
                case adLongVarChar:
                    strMsg = "adLongVarChar";
                    break;
                case adLongVarWChar:
                    strMsg = "adLongVarWChar";
                    break;
                case adNumeric:
                    strMsg = "adNumeric";
                    break;
                case adPropVariant:
                    strMsg = "adPropVariant";
                    break;
                case adSingle:
                    strMsg = "adSingle";
                    break;
                case adSmallInt:
                    strMsg = "adSmallInt";
                    break;
                case adTinyInt:
                    strMsg = "adTinyInt";
                    break;
                case adUnsignedBigInt:
                    strMsg = "adUnsignedBigInt";
                    break;
                case adUnsignedInt:
                    strMsg = "adUnsignedInt";
                    break;
                case adUnsignedSmallInt:
                    strMsg = "adUnsignedSmallInt";
                    break;
                case adUnsignedTinyInt:
                    strMsg = "adUnsignedTinyInt";
                    break;
                case adUserDefined:
                    strMsg = "adUserDefined";
                    break;
                case adVarBinary:
                    strMsg = "adVarBinary";
                    break;
                case adVarChar:
                    strMsg = "adVarChar";
                    break;
                case adVariant:
                    strMsg = "adVariant";
                    break;
                case adVarNumeric:
                    strMsg = "adVarNumeric";
                    break;
                case adVarWChar:
                    strMsg = "adVarWChar";
                    break;
                case adWChar:
                    strMsg = "adWChar";
                    break;
                default:
                    strMsg = "*UNKNOWN*";
                    break;
            }

            intLineCnt++;
            if (intLineCnt%20 == 0)
            {
                printf("\nPress any key to continue...\n");
                getch();
            }
            printf ("Property %d : %s,Type = %s\n",iIndex,
                (LPCSTR)pProperty->GetName(),(LPCSTR)strMsg);
        }
    }

    catch(_com_error &e)
    {
        // Gegebenenfalls Fehlermeldungen an Benutzer ausgeben.
        PrintComError(e);
    }
}

//////////////////////////////////////////////////////////
//                                                      //
//      PrintComError-Funktion                          //
//                                                      //
//////////////////////////////////////////////////////////

void PrintComError(_com_error &e)
{

    _bstr_t bstrSource(e.Source());
    _bstr_t bstrDescription(e.Description());

    // Von COM stammende Fehler drucken.
    printf("Error\n");
    printf("\tCode = %08lx\n", e.Error());
    printf("\tCode meaning = %s\n", e.ErrorMessage());
    printf("\tSource = %s\n", (LPCSTR) bstrSource);
    printf("\tDescription = %s\n", (LPCSTR) bstrDescription);
}


Beispiel für die Update- und CancelUpdate-Methoden (VC++)

In diesem Beispiel wird die Verwendung der Update-Methode in Verbindung mit der CancelUpdate-Methode verdeutlicht.

#import "C:\Programme\Gemeinsame Dateien\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <stdio.h>
#include <ole2.h>
#include <malloc.h>
#include <conio.h>
#include "UpdateX.h"

// Funktionsdeklaration.
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void UpdateX(void);
void UpdateX2(void);
void PrintProviderError(_ConnectionPtr pConnection);
void PrintComError(_com_error &e);

void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

     UpdateX();

     // Warten, damit der Benutzer die Ausgabe betrachten kann.
     printf("\nPress any key to continue...");
     getch();
     // Bildschirm für die nächste Anzeige löschen
     system("cls");

     UpdateX2();

     ::CoUninitialize();
}

//////////////////////////////////////////////////////////
//                                                      //
//      UpdateX-Funktion                                //
//                                                      //
//////////////////////////////////////////////////////////
void UpdateX(void)
{
    HRESULT hr = S_OK;

    // ADO-Objektzeiger definieren.
    // Zeiger bei der Definition initialisieren.
    // Sie befinden sich im ADODB::-Namespace.
    _RecordsetPtr pRstEmployees  = NULL;

    // Zeichenfolgenvariablen definieren.
    _bstr_t strCnn("Provider=sqloledb;Data Source=srv;"
            "Initial Catalog=Pubs;User Id=sa;Password=;");

    IADORecordBinding   *picRs   = NULL;  // Deklarierter
                                  // Schnittstellenzeiger
    CEmployeeRs emprs;             // C++-Klassenobjekt.

    try
    {
        // Recordset mit Namen aus der Employees-Tabelle öffnen.
        TESTHR(pRstEmployees.CreateInstance(__uuidof(Recordset)));
        pRstEmployees->CursorType = adOpenKeyset;
        pRstEmployees->LockType = adLockOptimistic;
        pRstEmployees->Open("SELECT fname, lname FROM Employee "
            "ORDER BY lname",strCnn,adOpenKeyset,adLockOptimistic,
            adCmdText);

        // Ursprüngliche Daten speichern.
        _bstr_t strOldFirst = pRstEmployees->Fields->
            GetItem("fname")->Value;
        _bstr_t strOldLast  = pRstEmployees->Fields->
            GetItem("lname")->Value;

        // Daten in Bearbeitungspuffer ändern.
        pRstEmployees->Fields->GetItem("fname")->Value =
            (_bstr_t)("Linda");
        pRstEmployees->Fields->GetItem("lname")->Value =
            (_bstr_t)("Kobara");

        // Inhalt des Puffers anzeigen und Benutzereingabe erhalten.
        printf("\n\nEdit in progress:\n\n");

        printf("Original data =  %s %s \n",
            (LPSTR)strOldFirst,(LPSTR)strOldLast);

        printf("Data in buffer =  %s %s",
            (LPSTR)(_bstr_t) pRstEmployees->Fields->
            GetItem("fname")->Value,\
            (LPSTR) (_bstr_t) pRstEmployees->Fields->
            GetItem("lname")->Value);

        // Fragen, ob Benutzer aktualisieren möchte.
        printf("\n\nUse Update to replace the original data with the"
               " buffered data in the Recordset? (y/n): ");
        char chKey = getch();

        if(toupper(chKey) == 'Y')
            pRstEmployees->Update();
        else
            pRstEmployees->CancelUpdate();

        // Einen IADORecordBinding-Schnittstellenzeiger öffnen, der
        // für das Binden eines Recordsets an eine Klasse verwendet wird.
        TESTHR(pRstEmployees->QueryInterface(
            __uuidof(IADORecordBinding),(LPVOID*)&picRs));

        // An dieser Stelle Recordset an eine C++-Klasse binden.
        TESTHR(picRs->BindToRecordset(&emprs));

        pRstEmployees->MoveFirst();

        // Resultierende Daten anzeigen.
        printf("\nData in recordset =  %s %s", emprs.le_fnameStatus ==
            adFldOK ? emprs.m_sze_fname : "<NULL>",
            emprs.le_lnameStatus == adFldOK ?
            emprs.m_sze_lname : "<NULL>");

        // Ursprüngliche Daten speichern, da dies nur als Beispiel
        // dient.
        if ((strcmp((char *)strOldFirst,emprs.m_sze_fname) &&
             strcmp((char *)strOldLast,emprs.m_sze_lname)))
        {
            pRstEmployees->Fields->GetItem("fname")->Value = strOldFirst;
            pRstEmployees->Fields->GetItem("lname")->Value = strOldLast;
            pRstEmployees->Update();
        }

        // IADORecordset-Schnittstelle freigeben.
        if (picRs)
            picRs->Release();

        // Cleanup der Objekte vor dem Beenden.
        pRstEmployees->Close();
    }

    catch(_com_error &e)
    {
       // Gegebenenfalls Fehlermeldungen an Benutzer ausgeben.
       // Einen Verbindungszeiger übergeben, auf den vom Recordset
       // zugegriffen wird.
        _variant_t vtConnect = pRstEmployees->GetActiveConnection();

        // GetActiveConnection gibt eine Verbindungszeichenfolge zurück,
        // wenn die Verbindung nicht geöffnet ist, sonst wird ein
        // Connection-Objekt zurückgegeben.
        switch(vtConnect.vt)
        {
            case VT_BSTR:
                PrintComError(e);
                break;
            case VT_DISPATCH:
                PrintProviderError(vtConnect);
                break;
            default:
                printf("Errors occured.");
                break;
        }
    }
}

// Das nächste Beispiel verdeutlicht die Update-Methode in Verbindung mit
// der AddNew-Methode.

//////////////////////////////////////////////////////////
//                                                      //
//           UpdateX2-Funktion                          //
//                                                      //
//////////////////////////////////////////////////////////
void UpdateX2(void)
{
    HRESULT hr = S_OK;

    // ADO-Objektzeiger definieren.
    // Zeiger bei der Definition initialisieren.
    // Sie befinden sich im ADODB::-Namespace.
    _ConnectionPtr pConnection        = NULL;
    _RecordsetPtr pRstEmployees = NULL;

    // Zeichenfolgenvariablen definieren.
    _bstr_t strCnn("Provider=sqloledb;Data Source=srv;"
            "Initial Catalog=Pubs;User Id=sa;Password=;");

    IADORecordBinding   *picRs  = NULL;  // Deklarierter
                                 // Schnittstellenzeiger
    CEmployeeRs1 emprs;            // C++-Klassenobjekt.

    try
    {
        // Eine Verbindung öffnen.
        TESTHR(pConnection.CreateInstance(__uuidof(Connection)));
         pConnection->Open(strCnn,"","",NULL);

        // Recordset mit Daten aus der Employees-Tabelle öffnen.
        TESTHR(pRstEmployees.CreateInstance(__uuidof(Recordset)));
        pRstEmployees->CursorType = adOpenKeyset;
        pRstEmployees->LockType = adLockOptimistic;
        pRstEmployees->Open("Employees",
            _variant_t((IDispatch*)pConnection,true),
            adOpenKeyset, adLockOptimistic,adCmdTable);

        pRstEmployees->AddNew();
        _bstr_t strEmpID = "B-S55555M";
        pRstEmployees->Fields->GetItem("emp_id")->Value = strEmpID;
        pRstEmployees->Fields->GetItem("fname")->Value =
            (_bstr_t) ("Bill");
        pRstEmployees->Fields->GetItem("lname")->Value =
            (_bstr_t) ("Sornsin");

        // Inhalt des Puffers anzeigen und Benutzereingabe erhalten.
        printf("\n\nAddNew in progress:\n\n");

        printf("Data in buffer = %s ,  %s %s",
            (LPSTR) (_bstr_t) pRstEmployees->Fields->
            GetItem("emp_id")->Value,
            (LPSTR) (_bstr_t) pRstEmployees->Fields->
            GetItem("fname")->Value,
            (LPSTR) (_bstr_t) pRstEmployees->Fields->
            GetItem("lname")->Value);

        printf("\n\nUse Update to save buffer to recordset?(y/n):");
        char chKey = getch();

        if(toupper(chKey) == 'Y')
        {
            pRstEmployees->Update();

            // Einen IADORecordBinding-Schnittstellenzeiger öffnen, der
            // für das Binden eines Recordsets an eine Klasse verwendet
            // wird.
            TESTHR(pRstEmployees->QueryInterface(
                __uuidof(IADORecordBinding),(LPVOID*)&picRs));

            // An dieser Stelle das Recordset an eine C++-Klasse binden.
            TESTHR(picRs->BindToRecordset(&emprs));

            // Zu neuem Datensatz wechseln und die resultierenden Daten
            // anzeigen.
            printf ("\n\nData in recordset =  %s ,  %s %s",
                emprs.le_empidStatus == adFldOK ?
                emprs.m_sze_empid : "<NULL>",
                emprs.le_fnameStatus == adFldOK ?
                emprs.m_sze_fname : "<NULL>",
                emprs.le_lnameStatus == adFldOK ?
                emprs.m_sze_lname : "<NULL>");
        }
        else
        {
            pRstEmployees->CancelUpdate();
            printf("\n\nNo new record added.\n");
        }
        // Die neuen Daten löschen, da dies nur als Beispiel dient.
        _bstr_t strSQLDelete("DELETE FROM Employees WHERE emp_id = '" +
            strEmpID + "'");
         pConnection->Execute(strSQLDelete ,NULL,adExecuteNoRecords);

        // IADORecordset-Schnittstelle freigeben
        if (picRs)
            picRs->Release();

        // Cleanup der Objekte vor dem Beenden.
        pRstEmployees->Close();
        pConnection->Close();
    }

    catch(_com_error &e)
    {
        // Gegebenenfalls Fehlermeldungen an Benutzer ausgeben.
        // Einen Verbindungszeiger übergeben, auf den vom
        // Connection-Objekt aus zugegriffen wird.
        PrintProviderError(pConnection);
        PrintComError(e);
    }
}

//////////////////////////////////////////////////////////
//                                                      //
//       PrintProviderError-Funktion                    //
//                                                      //
//////////////////////////////////////////////////////////
void PrintProviderError(_ConnectionPtr pConnection)
{
    // Providerfehler aus dem Connection-Objekt drucken.
    // pErr ist ein Datensatzobjekt in der Errors-Auflistung der
    // Verbindung.
    ErrorPtr    pErr  = NULL;

    if( (pConnection->Errors->Count) > 0)
    {
        long nCount = pConnection->Errors->Count;
        // Auflistung reicht von 0 bis nCount -1.
        for(long i = 0; i < nCount; i++)
        {
            pErr = pConnection->Errors->GetItem(i);
            printf("Error number: %x\t%s\n", pErr->Number,
                (LPCSTR) pErr->Description);
        }
    }
}

//////////////////////////////////////////////////////////
//                                                      //
//      PrintComError-Funktion                          //
//                                                      //
//////////////////////////////////////////////////////////
void PrintComError(_com_error &e)
{

    _bstr_t bstrSource(e.Source());
    _bstr_t bstrDescription(e.Description());

    // Von COM stammende Fehler drucken.
    printf("Error\n");
    printf("\tCode = %08lx\n", e.Error());
    printf("\tCode meaning = %s\n", e.ErrorMessage());
    printf("\tSource = %s\n", (LPCSTR) bstrSource);
    printf("\tDescription = %s\n", (LPCSTR) bstrDescription);
}

UpdateX.h

#include "icrsint.h"

// Diese Klasse ruft nur fname und lname aus der Employees-Tabelle ab.
class CEmployeeRs : public CADORecordBinding
{
BEGIN_ADO_BINDING(CEmployeeRs)
    // fname ist das erste Feld im Recordset
    ADO_VARIABLE_LENGTH_ENTRY2(1, adVarChar, m_sze_fname,
         sizeof(m_sze_fname), le_fnameStatus, FALSE)
    // lname ist das zweite Feld im Recordset.
    ADO_VARIABLE_LENGTH_ENTRY2(2, adVarChar, m_sze_lname,
         sizeof(m_sze_lname), le_lnameStatus, FALSE)

END_ADO_BINDING()

public:
   CHAR   m_sze_lname[31];
   ULONG  le_lnameStatus;
   CHAR   m_sze_fname[21];
   ULONG  le_fnameStatus;
};

// Diese Klasse ruft nur empid, fname und lname aus der
// Employees-Tabelle ab.
class CEmployeeRs1 : public CADORecordBinding
{
BEGIN_ADO_BINDING(CEmployeeRs1)
    // emp_id ist das erste Feld in der Tabelle.
    ADO_VARIABLE_LENGTH_ENTRY2(1, adVarChar, m_sze_empid,
        sizeof(m_sze_empid), le_empidStatus, FALSE)
    // fname ist das zweite Feld in der Tabelle.
   ADO_VARIABLE_LENGTH_ENTRY2(2, adVarChar, m_sze_fname,
         sizeof(m_sze_fname), le_fnameStatus, FALSE)
    // lname ist das vierte Feld in der Tabelle.
   ADO_VARIABLE_LENGTH_ENTRY2(4, adVarChar, m_sze_lname,
         sizeof(m_sze_lname), le_lnameStatus, FALSE)

END_ADO_BINDING()

public:
   CHAR   m_sze_empid[10];
   ULONG  le_empidStatus;
   CHAR   m_sze_lname[31];
   ULONG  le_lnameStatus;
   CHAR   m_sze_fname[21];
   ULONG  le_fnameStatus;
};


Beispiel für die UpdateBatch- und CancelBatch-Methoden (VC++)

In diesem Beispiel wird die Verwendung der UpdateBatch-Methode in Verbindung mit der CancelBatch-Methode verdeutlicht.

#import "c:\Programme\Gemeinsame Dateien\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <ole2.h>
#include <stdio.h>
#include <conio.h>
#include "UpdateBatchX.h"

// Funktionsdeklarationen
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void UpdateBatchX(void);
void PrintProviderError(_ConnectionPtr pConnection);
void PrintComError(_com_error &e);

//////////////////////////////////////////////////////////
//                                                      //
//       Hauptfunktion                                  //
//                                                      //
//////////////////////////////////////////////////////////
void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    UpdateBatchX();

    ::CoUninitialize();
}

//////////////////////////////////////////////////////////
//                                                      //
//      UpdateBatchX-Funktion                           //
//                                                      //
//////////////////////////////////////////////////////////
void UpdateBatchX(void)
{
   HRESULT  hr = S_OK;

    // ADO-Objektzeiger definieren.
    // Zeiger bei der Definition initialisieren.
    // Sie befinden sich im ADODB::-Namespace.
    _RecordsetPtr  pRstTitles   = NULL;

    // Zeichenfolgenvariablen definieren.
    _bstr_t strCnn("Provider=sqloledb;Data Source=srv;"
            "Initial Catalog=Pubs;User Id=sa;Password=;");

    IADORecordBinding *picRs    = NULL;    // Deklarierter
                                   // Schnittstellenzeiger
    CTitleRs titlers;             // C++-Klassenobjekt

     try
    {
        // Titles-Tabelle öffnen.
        TESTHR(pRstTitles.CreateInstance(__uuidof(Recordset)));
        pRstTitles->CursorType = adOpenKeyset;
        pRstTitles->LockType = adLockBatchOptimistic;
        pRstTitles->Open ("Titles", strCnn,
            adOpenKeyset, adLockBatchOptimistic, adCmdTable);

        // IADORecordBinding-Schnittstellenzeiger öffnen, mit dem das
        // Recordset an eine Klasse gebunden wird.
        TESTHR(pRstTitles->QueryInterface(
            __uuidof(IADORecordBinding),(LPVOID*)&picRs));

        // Binden des Recordsets an eine C++-Klasse.
        TESTHR(picRs->BindToRecordset(&titlers));
        pRstTitles->MoveFirst();

        // Schleife durch das Recordset, Anfrage an Benutzer, ob der
        // Typ für einen angegebenen Titel geändert werden soll.
        while (!(pRstTitles->EndOfFile))
        {
            // Typ mit "psychology" vergleichen
            if (!strcmp( (char *)strtok(titlers.m_szt_Type," "),
                "psychology" ))
            {
                printf("\n\nTitle: %s \nChange type to self_help?(y/n):",
                    titlers.m_szt_Title);
                char chKey;
                chKey = getch();
                if(toupper(chKey) == 'Y')
                {
                    // Typ in self_help ändern.
                    pRstTitles->Fields->GetItem("type")->Value =
                        (_bstr_t)("self_help");
                }
            }
            pRstTitles->MoveNext();
        }

        // Benutzer fragen, ob für alle oben gemachten Änderungen
        // ein Commit ausgeführt werden soll.
        printf("\n\nSave all changes?");
        char chKey;
        chKey = getch();
        if(toupper(chKey) == 'Y')
        {
            pRstTitles->UpdateBatch(adAffectAll);
        }
        else
        {
            pRstTitles->CancelBatch(adAffectAll);
        }

        // Aktuelle Daten im Recordset drucken.
        pRstTitles->Requery(adOptionUnspecified);

         // IADORecordBinding-Schnittstellenzeiger öffnen, mit dem das
        // Recordset an eine Klasse gebunden wird.
        TESTHR(pRstTitles->QueryInterface(
            __uuidof(IADORecordBinding),(LPVOID*)&picRs));

        // Erneutes Binden des Recordsets an eine C++-Klasse.
        TESTHR(picRs->BindToRecordset(&titlers));

        // Zum ersten Datensatz in der Titles-Tabelle bewegen.
        pRstTitles->MoveFirst();

        // Bildschirm für die nächste Anzeige löschen.
        system("cls");

        while (!pRstTitles->EndOfFile)
        {
            printf("%s -  %s\n",
                titlers.lt_TitleStatus == adFldOK ?
                titlers.m_szt_Title :"<NULL>",
                titlers.lt_TypeStatus == adFldOK ?
                titlers.m_szt_Type :"<NULL>");
            pRstTitles->MoveNext();
        }

        pRstTitles->MoveFirst();

        // Ursprüngliche Daten wiederherstellen, da dies nur als
        // Beispiel dient.
        while (!(pRstTitles->EndOfFile))
        {
            // Typ mit "psychology" vergleichen.
            if(!strcmp( (char *)strtok(titlers.m_szt_Type," "),
                "self_help" ))
            {
                // Typ in "psychology" ändern.
                pRstTitles->Fields->GetItem("type")->Value =
                    (_bstr_t)("psychology");
            }
            pRstTitles->MoveNext();
        }

        pRstTitles->UpdateBatch(adAffectAll);
        pRstTitles->Close();
    }

    catch (_com_error &e)
    {
       // Gegebenenfalls Fehlermeldungen an Benutzer ausgeben.
       // Einen Verbindungszeiger übergeben, auf den vom Recordset
       // zugegriffen wird.
        _variant_t vtConnect = pRstTitles->GetActiveConnection();

        // GetActiveConnection gibt eine Verbindungszeichenfolge zurück,
        // wenn die Verbindung nicht geöffnet ist, sonst wird ein
        // Connection-Objekt zurückgegeben.
        switch(vtConnect.vt)
        {
            case VT_BSTR:
                PrintComError(e);
                break;
            case VT_DISPATCH:
                PrintProviderError(vtConnect);
                break;
            default:
                printf("Errors occured.");
                break;
        }
    }
}

//////////////////////////////////////////////////////////
//                                                      //
//    PrintProviderError-Funktion                       //
//                                                      //
//////////////////////////////////////////////////////////
void PrintProviderError(_ConnectionPtr pConnection)
{
    // Providerfehler aus dem Connection-Objekt drucken.
    // pErr ist ein Datensatzobjekt in der Errors-Auflistung der
    // Verbindung.
    ErrorPtr    pErr  = NULL;

    if( (pConnection->Errors->Count) > 0)
    {
        long nCount = pConnection->Errors->Count;
        // Auflistung reicht von 0 bis nCount -1.
        for(long i = 0; i < nCount; i++)
        {
            pErr = pConnection->Errors->GetItem(i);
            printf("Error number: %x\t%s\n", pErr->Number,
                (LPCSTR) pErr->Description);
        }
    }
}

//////////////////////////////////////////////////////////
//                                                      //
//      PrintComError-Funktion                          //
//                                                      //
//////////////////////////////////////////////////////////

void PrintComError(_com_error &e)
{
   _bstr_t bstrSource(e.Source());
   _bstr_t bstrDescription(e.Description());

    // Von COM stammende Fehler drucken.
   printf("Error\n");
   printf("\tCode = %08lx\n", e.Error());
   printf("\tCode meaning = %s\n", e.ErrorMessage());
   printf("\tSource = %s\n", (LPCSTR) bstrSource);
   printf("\tDescription = %s\n", (LPCSTR) bstrDescription);
}

UpdateBatchX.h

#include "icrsint.h"

// Diese Klasse ruft title und type aus der Titles-Tabelle ab.
class CTitleRs : public CADORecordBinding
{
BEGIN_ADO_BINDING(CTitleRs)
        // Die title-Spalte ist das zweite Feld in der Tabelle.
        ADO_VARIABLE_LENGTH_ENTRY2(2,adVarChar,m_szt_Title,
            sizeof(m_szt_Title),lt_TitleStatus,FALSE)
        // Die type-Spalte ist das dritte Feld in der Tabelle.
        ADO_VARIABLE_LENGTH_ENTRY2(3,adVarChar,m_szt_Type,
            sizeof(m_szt_Type),lt_TypeStatus,TRUE)
END_ADO_BINDING()

public:
    CHAR m_szt_Title[81];
    ULONG lt_TitleStatus;
    CHAR m_szt_Type[13];
    ULONG lt_TypeStatus;
};


Beispiel für die Value-Eigenschaft (VC++)

In diesem Beispiel wird die Value-Eigenschaft mit den Objekten Field und Property erläutert, indem Feld- und Eigenschaftswerte für die Employees-Tabelle angezeigt werden.

#import "c:\Programme\Gemeinsame Dateien\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <ole2.h>
#include <stdio.h>
#include <conio.h>

// Funktionsdeklarationen
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void ValueX(void);
void PrintProviderError(_ConnectionPtr pConnection);
void PrintComError(_com_error &e);

//////////////////////////////////////////////////////////
//                                                      //
//    Hauptfunktion                                     //
//                                                      //
//////////////////////////////////////////////////////////

void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    ValueX();

    ::CoUninitialize();
}

//////////////////////////////////////////////////////////
//                                                      //
//              ValueX-Funktion                         //
//                                                      //
//////////////////////////////////////////////////////////
void ValueX(void)
{
   HRESULT  hr = S_OK;

    // Zeichenfolgenvariablen definieren.
   _bstr_t strCnn("Provider=sqloledb;Data Source=srv;"
            "Initial Catalog=Pubs;User Id=sa;Password=;");

    // ADO-Objektzeiger definieren.
    // Zeiger bei der Definition initialisieren.
    // Sie befinden sich im ADODB::-Namespace.
    _RecordsetPtr  pRstEmployees  = NULL;
    FieldsPtr    pFldLoop    = NULL;
    PropertiesPtr  pPrpLoop    = NULL;
    _variant_t vtIndex;
    vtIndex.vt = VT_I2;

       try
    {
        // Recordset mit Daten aus der Employees-Tabelle öffnen.
        TESTHR(pRstEmployees.CreateInstance(__uuidof(Recordset)));
        pRstEmployees->Open ("Employees",strCnn ,
            adOpenForwardOnly, adLockReadOnly, adCmdTable);

        printf("Field values in rstEmployees\n\n");

        // Fields-Auflistung der Employees-Tabelle aufzählen.
        pFldLoop = pRstEmployees->GetFields();

        for (int intFields = 0; intFields < (int)pFldLoop->
    GetCount(); intFields++)
        {
            vtIndex.iVal = intFields;

            // Da Value die Standardeigenschaft des Field-Objekts ist,
            // ist die Verwendung des tatsächlichen Schlüsselwortes hier
            // optional.
            printf(" %s = %s\n\n" ,
                (LPCSTR) pFldLoop->GetItem(vtIndex)->GetName(),
                (LPCSTR) (_bstr_t) pFldLoop->GetItem(vtIndex)->Value);
        }

        printf("Press any key to continue...\n\n");
        getch();
        printf("Property values in rstEmployees\n\n");

        // Die Properties-Auflistung des Recordset-Objekts aufzählen.
        pPrpLoop = pRstEmployees->GetProperties();
        int intLine = 0;

        for (int intProperties = 0; intProperties < (int)pPrpLoop->
            GetCount(); intProperties++)
        {
            vtIndex.iVal = intProperties;

            // Da Value die Standardeigenschaft des Field-Objekts ist,
            // ist die Verwendung des tatsächlichen Schlüsselwortes hier
            // optional.
            _variant_t propValue = pPrpLoop->GetItem(vtIndex)->Value;
            switch(propValue.vt)
            {

            case (VT_BOOL):
                     if(propValue.boolVal)
                     {
                        printf(" %s = True\n\n",(LPCSTR) pPrpLoop->
                            GetItem(vtIndex)->GetName());
                     }
                     else
                     {
                         printf(" %s = False\n\n",(LPCSTR) pPrpLoop->
                            GetItem(vtIndex)->GetName());
                     }
                break;

            case (VT_I4):
                printf(" %s = %d\n\n",(LPCSTR) pPrpLoop->
                    GetItem(vtIndex)->GetName(),
                    pPrpLoop->GetItem(vtIndex)->Value.lVal);
                break;

            case (VT_EMPTY):
                printf(" %s = \n\n",(LPCSTR) pPrpLoop->
                    GetItem(vtIndex)->GetName());
                break;

            default:
                break;
            }

            intLine++;
                if (intLine % 10 == 0)
                {
                    printf("\nPress any key to continue...");
                     getch();

                    // Bildschirm für die nächste Anzeige löschen
                    system("cls");
                }
        }

        pRstEmployees->Close();
    }

    catch (_com_error &e)
    {
       // Gegebenenfalls Fehlermeldungen an Benutzer ausgeben.
       // Einen Verbindungszeiger übergeben, auf den vom Recordset
       // zugegriffen wird.
        _variant_t vtConnect = pRstEmployees->GetActiveConnection();

        // GetActiveConnection gibt eine Verbindungszeichenfolge zurück,
        // wenn die Verbindung nicht geöffnet ist, sonst wird ein
        // Connection-Objekt zurückgegeben.
        switch(vtConnect.vt)
        {
            case VT_BSTR:
                PrintComError(e);
                break;
            case VT_DISPATCH:
                PrintProviderError(vtConnect);
                break;
            default:
                printf("Errors occured.");
                break;
        }
    }
}

//////////////////////////////////////////////////////////
//                                                      //
//    PrintProviderError-Funktion                       //
//                                                      //
//////////////////////////////////////////////////////////
void PrintProviderError(_ConnectionPtr pConnection)
{
    // Providerfehler aus dem Connection-Objekt drucken.
    // pErr ist ein Datensatzobjekt in der Errors-Auflistung
    // der Verbindung.
    ErrorPtr    pErr  = NULL;

    if( (pConnection->Errors->Count) > 0)
    {
        long nCount = pConnection->Errors->Count;
        // Auflistung reicht von 0 bis nCount -1.
        for(long i = 0; i < nCount; i++)
        {
            pErr = pConnection->Errors->GetItem(i);
            printf("Error number: %x\t%s\n", pErr->Number,
                (LPCSTR) pErr->Description);
        }
    }
}

//////////////////////////////////////////////////////////
//                                                      //
//      PrintComError-Funktion                          //
//                                                      //
//////////////////////////////////////////////////////////
void PrintComError(_com_error &e)
{
   _bstr_t bstrSource(e.Source());
   _bstr_t bstrDescription(e.Description());

    // Von COM stammende Fehler drucken.
   printf("Error\n");
   printf("\tCode = %08lx\n", e.Error());
   printf("\tCode meaning = %s\n", e.ErrorMessage());
   printf("\tSource = %s\n", (LPCSTR) bstrSource);
   printf("\tDescription = %s\n", (LPCSTR) bstrDescription);
}


Beispiel für die Version-Eigenschaft (VC++)

In diesem Beispiel wird die Version-Eigenschaft eines Connection-Objekts zum Anzeigen der aktuellen ADO-Version verwendet. Darüber hinaus werden zahlreiche dynamische Eigenschaften verwendet, um Folgendes anzuzeigen:

  • den aktuellen DBMS-Namen sowie die Version

  • die OLE DB-Version

  • den Providernamen und die Version

  • die ODBC-Version

  • den Namen des ODBC-Treibers und die Version.
#import "c:\Programme\Gemeinsame Dateien\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <ole2.h>
#include <stdio.h>
#include <conio.h>

// Funktionsdeklarationen
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void VersionX(void);
void PrintProviderError(_ConnectionPtr pConnection);
void PrintComError(_com_error &e);

//////////////////////////////////////////////////////////
//                                                      //
//       Hauptfunktion                                  //
//                                                      //
//////////////////////////////////////////////////////////

void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    VersionX();

    ::CoUninitialize();
}

//////////////////////////////////////////////////////////
//                                                      //
//         VersionX-Funktion                            //
//                                                      //
//////////////////////////////////////////////////////////
void VersionX(void)
{
   HRESULT   hr = S_OK;

    // Zeichenfolgenvariablen definieren.
   _bstr_t strCnn("driver={SQL Server};server=srv;"
            "user id=sa;password=;database=Pubs;");

    // ADO-Objektzeiger definieren.
    // Zeiger bei der Definition initialisieren.
    // Sie befinden sich im ADODB::-Namespace.
    _ConnectionPtr    pConnection     = NULL;

       try
    {
        // Verbindung öffnen.
        TESTHR(pConnection.CreateInstance(__uuidof(Connection)));
        pConnection->Open (strCnn, "", "", NULL);

        printf("ADO Version   : %s\n\n",(LPCSTR) pConnection->Version);

        printf("DBMS Name   : %s\n\n",(LPCSTR) (_bstr_t)
            pConnection->Properties->GetItem("DBMS Name")->Value);

        printf("DBMS Version   : %s\n\n",(LPCSTR) (_bstr_t) pConnection->
            Properties->GetItem("DBMS Version")->Value);

        printf("OLE DB Version   : %s\n\n",(LPCSTR) (_bstr_t)
            pConnection->Properties->GetItem("OLE DB Version")->Value);

        printf("Provider Name   : %s\n\n",(LPCSTR) (_bstr_t)
            pConnection->Properties->GetItem("Provider Name")->Value);

        printf("Provider Version   : %s\n\n",(LPCSTR) (_bstr_t)
            pConnection->Properties->GetItem("Provider Version")->Value);

        printf("Driver Name   : %s\n\n",(LPCSTR) (_bstr_t)
            pConnection->Properties->GetItem("Driver Name")->Value);

        printf("Driver Version   : %s\n\n",(LPCSTR) (_bstr_t)
            pConnection->Properties->GetItem("Driver Version")->Value);

        printf("Driver ODBC Version   : %s\n\n",(LPCSTR) (_bstr_t)
         pConnection->Properties->GetItem("Driver ODBC Version")->Value);

        pConnection->Close();
    }

    catch (_com_error &e)
    {
        // Gegebenenfalls Fehlermeldungen an Benutzer ausgeben.
        PrintProviderError(pConnection);
        PrintComError(e);
    }
}

//////////////////////////////////////////////////////////
//                                                      //
//     PrintProviderError-Funktion                      //
//                                                      //
//////////////////////////////////////////////////////////
void PrintProviderError(_ConnectionPtr pConnection)
{
    // Providerfehler aus dem Connection-Objekt drucken.
    // pErr ist ein Datensatzobjekt in der Errors-Auflistung der
    // Verbindung.
    ErrorPtr    pErr  = NULL;

    if( (pConnection->Errors->Count) > 0)
    {
        long nCount = pConnection->Errors->Count;
        // Auflistung reicht von 0 bis nCount -1.
        for(long i = 0; i < nCount; i++)
        {
            pErr = pConnection->Errors->GetItem(i);
            printf("Error number: %x\t%s\n", pErr->Number,
                (LPCSTR) pErr->Description);
        }
    }
}

//////////////////////////////////////////////////////////
//                                                      //
//      PrintComError-Funktion                          //
//                                                      //
//////////////////////////////////////////////////////////
void PrintComError(_com_error &e)
{
   _bstr_t bstrSource(e.Source());
   _bstr_t bstrDescription(e.Description());

    // Von COM stammende Fehler drucken.
   printf("Error\n");
   printf("\tCode = %08lx\n", e.Error());
   printf("\tCode meaning = %s\n", e.ErrorMessage());
   printf("\tSource = %s\n", (LPCSTR) bstrSource);
   printf("\tDescription = %s\n", (LPCSTR) bstrDescription);
}


ADO-Codebeispiele in Microsoft Visual J++

Verwenden Sie die folgenden Codebeispiele, um zu erfahren, wie Sie die Methoden, Eigenschaften und Ereignisse von ADO beim Schreiben in Microsoft Visual J++ einsetzen können.

Anmerkung Fügen Sie das gesamte Codebeispiel von Anfang bis Ende in den Code-Editor ein. Wenn nur Teile der Beispiele verwendet werden oder die Absatzformatierung verloren geht, wird das Beispiel möglicherweise nicht ordnungsgemäß ausgeführt.

Methoden

  • Beispiel für die AddNew-Methode

  • Beispiel für die Append- und CreateParameter-Methoden

  • Beispiel für die AppendChunk- und GetChunk-Methoden

  • Beispiel für die BeginTrans-, CommitTrans- und RollbackTrans-Methoden

  • Beispiel für die Cancel-Methode

  • Beispiel für die Clone-Methode

  • Beispiel für die CompareBookmarks-Methode

  • Beispiel für die Delete-Methode

  • Beispiel für die Execute-, Requery- und Clear-Methoden

  • Beispiel für die Find-Methode

  • Beispiel für die GetRows-Methode

  • Beispiel für die GetString-Methode

  • Beispiel für die MoveFirst-, MoveLast-, MoveNext- und MovePrevious-Methoden

  • Beispiel für die NextRecordset-Methode

  • Beispiel für die Open- und Close-Methoden

  • Beispiel für die OpenSchema-Methode

  • Beispiel für die Refresh-Methode

  • Beispiel für die Resync-Methode

  • Beispiel für die Save- und Open-Methoden

  • Beispiel für die Supports-Methode

  • Beispiel für die Update- und CancelUpdate-Methoden

  • Beispiel für die UpdateBatch- und CancelBatch-Methoden

Eigenschaften

  • Beispiel für die AbsolutePage-, PageCount- und PageSize-Eigenschaften

  • Beispiel für die AbsolutePosition- und CursorLocation-Eigenschaften

  • Beispiel für die ActiveCommand-Eigenschaft

  • Beispiel für die ActiveConnection-, CommandText-, CommandTimeout-, CommandType-, Size- und Direction-Eigenschaften

  • Beispiel für die ActualSize- und DefinedSize-Eigenschaften

  • Beispiel für die Attributes- und Name-Eigenschaften

  • Beispiel für die BOF-, EOF- und Bookmark-Eigenschaften

  • Beispiel für die CacheSize-Eigenschaft

  • Beispiel für die ConnectionString-, ConnectionTimeout- und State-Eigenschaften

  • Beispiel für die Count-Eigenschaft

  • Beispiel für die CursorType-, LockType- und EditMode-Eigenschaften

  • Beispiel für die Description-, NativeError-, Number-, Source- und SQLState-Eigenschaften

  • Beispiel für die Filter- und RecordCount-Eigenschaften

  • Beispiel für die Handler-Eigenschaft

  • Beispiel für die IsolationLevel- und Mode-Eigenschaften

  • Beispiel für die Item-Eigenschaft

  • Beispiel für die MarshalOptions-Eigenschaft

  • Beispiel für die MaxRecords-Eigenschaft

  • Beispiel für die NumericScale- und Precision-Eigenschaften

  • Beispiel für die Optimize-Eigenschaft

  • Beispiel für die OriginalValue- und UnderlyingValue-Eigenschaften

  • Beispiel für die Prepared-Eigenschaft

  • Beispiel für die Provider- und DefaultDatabase-Eigenschaften

  • Beispiel für die Sort-Eigenschaft

  • Beispiel für die Source-Eigenschaft

  • Beispiel für die State-Eigenschaft

  • Beispiel für die Status-Eigenschaft

  • Beispiel für die StayInSync-Eigenschaft

  • Beispiel für die Type-Eigenschaft (Fields)

  • Beispiel für die Type-Eigenschaft (Property)

  • Beispiel für die Value-Eigenschaft

  • Beispiel für die Version-Eigenschaft


Beispiel für die AbsolutePage-, PageCount- und PageSize-Eigenschaften (VJ++)

In diesem Beispiel werden die Eigenschaften AbsolutePage, PageCount und PageSize verwendet, um fünf Datensätze mit Namen und Angaben zur Anstellung aus der Employees-Tabelle gleichzeitig anzuzeigen.

// Die WFC-Klasse enthält die ADO-Objekte.

import com.ms.wfc.data.*;
import java.io.* ;

public class AbsolutePageX
{
    // Der Haupteinstiegspunkt für die Anwendung.

    public static void main (String[] args)
    {
        AbsolutePageX();
        System.exit(0);
    }

    // AbsolutePageX-Funktion

    static void AbsolutePageX()
    {

        // ADO-Objekte definieren.
        Recordset rstEmployees = null;

        // Deklarationen.
        BufferedReader in = new BufferedReader (new
            InputStreamReader(System.in));
        String line = null;
        String strCnn = "Provider=sqloledb;Data Source=srv;"
            + "Initial Catalog=pubs;User Id=sa;Password=;";

        String strName;
        String strFName;
        String strLName;
        String strHDate;
        int intPage;
        int intRecord;

        try
        {
            rstEmployees = new Recordset();

            // Mithilfe des Clientcursors die AbsolutePosition-Eigenschaft
            // aktivieren.
            rstEmployees.setCursorLocation( AdoEnums.CursorLocation.CLIENT);

            // Mithilfe eines Clientcursors für die Employees-Tabelle ein
            // Recordset öffnen.
            rstEmployees.open("employee", strCnn,
                AdoEnums.CursorType.FORWARDONLY,
                AdoEnums.LockType.READONLY,
                AdoEnums.CommandType.TABLE);

            // Namen und Einstellungstermine anzeigen, jeweils 5 Datensätze
            // gleichzeitig.

            rstEmployees.setPageSize(5);
            int intPageCount = rstEmployees.getPageCount();
            for ( intPage = 1; intPage <= intPageCount; intPage++)
            {
                strName = "";
                rstEmployees.setAbsolutePage(intPage);
                for ( intRecord = 1; intRecord <= rstEmployees.getPageSize();
                    intRecord++)
                {
                    strFName = rstEmployees.getField("fname").getString();
                    strLName = rstEmployees.getField("lname").getString();
                    strHDate = rstEmployees.getField("hire_date").getString();

                    strHDate = strHDate.substring(5,7) + "/" +
                        strHDate.substring(8,10) +
                        "/" + strHDate.substring(2,4);

                    strName = strName + "\n" + strFName + " " + strLName +
                        "  " + strHDate;
                    rstEmployees.moveNext();
                    if ( rstEmployees.getEOF())
                        break;
                }
                System.out.println(strName);
                // Auf Benutzereingabe warten, um nächste Datensätze
                // anzuzeigen.

                System.out.println("\n\nPress <Enter> key to Continue.");
                line = in.readLine();
            }

            // Cleanup der Objekte vor dem Beenden.
            rstEmployees.close();

        }
        catch( AdoException ae )
        {
            // Dem Benutzer aus ADO resultierende Fehler melden.

            // Auf NULL-Zeiger für Connection-Objekt überprüfen.
            if (rstEmployees.getActiveConnection()==null)
                System.out.println("Exception: " + ae.getMessage());

            // Beim Übergeben eines Recordsets zuerst auf NULL-Zeiger
            // überprüfen.
            if (rstEmployees != null)
            {
                PrintProviderError(rstEmployees.getActiveConnection());
            }
            else
            {
                System.out.println("Exception: " + ae.getMessage());
            }
        }

        // Systemlesevorgang erfordert diesen Catch-Vorgang
        catch( java.io.IOException je)
        {
            PrintIOError(je);
        }
    }

    // PrintProviderError-Funktion

    static void PrintProviderError( Connection Cnn1 )
    {
        // Providerfehler aus dem Connection-Objekt drucken.
        // ErrItem ist ein Item-Objekt in der Errors-Auflistung
        // der Verbindung.
        com.ms.wfc.data.Error  ErrItem = null;
        long nCount = 0;
        int  i      = 0;

        nCount = Cnn1.getErrors().getCount();

        // Wenn sich in der Auflistung Fehler befinden, diese drucken.
        if( nCount > 0);
        {
            // Auflistung reicht von 0 bis nCount - 1
            for (i = 0; i< nCount; i++)
            {
                ErrItem = Cnn1.getErrors().getItem(i);
                System.out.println("\t Error number: " + ErrItem.getNumber()
                    + "\t" + ErrItem.getDescription() );
            }
        }

    }

    // PrintIOError-Funktion

    static void PrintIOError( java.io.IOException je)
    {
        System.out.println("Error \n");
        System.out.println("\tSource = " + je.getClass() + "\n");
        System.out.println("\tDescription = " + je.getMessage() + "\n");
    }
}


Beispiel für die AbsolutePosition- und CursorLocation-Eigenschaften (VJ++)

In diesem Beispiel wird gezeigt, wie mit der AbsolutePosition-Eigenschaft der Fortschritt einer Schleife überwacht werden kann, die alle Datensätze eines Recordset-Objekts aufzählt. Dabei wird zum Aktivieren der AbsolutePosition-Eigenschaft die CursorLocation-Eigenschaft verwendet, indem der Cursor auf einen Clientcursor festgelegt wird.

import com.ms.wfc.data.*;
import java.io.*;

public class AbsolutePositionX
{
    // Der Haupteinstiegspunkt für die Anwendung.

    public static void main (String[] args)
    {
        AbsolutePositionX();
        System.exit(0);
    }

    // AbsolutePositionX-Funktion

    static void AbsolutePositionX()
    {

        // ADO-Objekte definieren.
        Recordset rstEmployees = null;

        // Deklarationen.
        BufferedReader in =
            new BufferedReader(new InputStreamReader(System.in));
        String line = null;
        String strCnn = "Provider=sqloledb;Data Source=srv;" +
            "Initial Catalog=pubs;User Id=sa;Password=;";

        String strLName;
        String strMessage;
        String strAbsolutePosition,strRecordCount;
        int intAbsolutePosition;
        int intRecordCount;
        int intChoice;

        try
        {

            rstEmployees = new Recordset();

            // Mithilfe des Clientcursors die AbsolutePosition-Eigenschaft
            // aktivieren.
            rstEmployees.setCursorLocation( AdoEnums.CursorLocation.CLIENT);

            // Mithilfe eines Clientcursors ein Recordset für die
            // Employees-Tabelle öffnen.
            rstEmployees.open("employee", strCnn,
                AdoEnums.CursorType.FORWARDONLY ,
                AdoEnums.LockType.READONLY,
                AdoEnums.CommandType.TABLE);

            // Recordset auflisten.
            while ( !rstEmployees.getEOF()) // fortwährende Schleife
            {
                intRecordCount = rstEmployees.getRecordCount();
                strRecordCount = Integer.toString(intRecordCount);

                // Datenfeld in den Variablen lesen.
                strLName = rstEmployees.getField("lname").getString();
                intAbsolutePosition = rstEmployees.getAbsolutePosition();
                strAbsolutePosition = Integer.toString(intAbsolutePosition);

                // Aktuelle Datensatzinformationen anzeigen.
                strMessage = "\nEmployee: " + strLName + "\n" + "(Record " +
                    strAbsolutePosition + " of " +strRecordCount + " )";
                System.out.println(strMessage);
                System.out.println(
                    "\nDo you want to continue (1 -> Yes / 2 -> No)?");
                // Benutzer gibt Zahl ein und drückt dann EINGABETASTE
                // (cr-lf).
                line = in.readLine().trim();
                intChoice = Integer.parseInt(line);
                if ( intChoice != 1)
                    break;
                rstEmployees.moveNext();
            }

            // Cleanup der Objekte vor dem Beenden.
            rstEmployees.close();
        }

        catch( NumberFormatException ne)
        {
            System.out.println("\nException : Integer Input required.");
            System.exit(0);
        }

        catch( AdoException ae )
        {
            // Dem Benutzer aus ADO resultierende Fehler melden.

            // Auf NULL-Zeiger für Connection-Objekt überprüfen.
            if (rstEmployees.getActiveConnection()== null)
                System.out.println("Exception: " + ae.getMessage());
            // Beim Übergeben eines Recordsets zuerst auf NULL-Zeiger
            // überprüfen.
            if (rstEmployees != null)
            {
                PrintProviderError(rstEmployees.getActiveConnection());
            }
            else
            {
                System.out.println("Exception: " + ae.getMessage());
            }
        }

        // Systemlesevorgang erfordert diesen Catch-Vorgang
        catch( java.io.IOException je)
        {
            PrintIOError(je);
        }
    }

    // PrintProviderError-Funktion

    static void PrintProviderError( Connection Cnn1 )
    {
        // Providerfehler aus dem Connection-Objekt drucken.
        // ErrItem ist ein Item-Objekt in der Errors-Auflistung
        // der Verbindung.
        com.ms.wfc.data.Error  ErrItem = null;
        long nCount = 0;
        int  i      = 0;

        nCount = Cnn1.getErrors().getCount();

        // Wenn sich in der Auflistung Fehler befinden, diese drucken.
        if( nCount > 0);
        {
            // Auflistung reicht von 0 bis nCount - 1
            for (i = 0; i< nCount; i++)
            {
                ErrItem = Cnn1.getErrors().getItem(i);
                System.out.println("\t Error number: " + ErrItem.getNumber()
                    + "\t" + ErrItem.getDescription() );
            }
        }

    }

    // PrintIOError-Funktion

    static void PrintIOError( java.io.IOException je)
    {
        System.out.println("Error \n");
        System.out.println("\tSource = " + je.getClass() + "\n");
        System.out.println("\tDescription = " + je.getMessage() + "\n");
    }
}


Beispiel für die ActiveCommand-Eigenschaft (VJ++)

Dieses Beispiel verdeutlicht die ActiveCommand-Eigenschaft.

Dabei wird einer Unterroutine ein Recordset-Objekt übergeben, dessen ActiveCommand-Eigenschaft verwendet wird, um Befehlstext und -parameter darzustellen, die das Recordset-Objekt erstellt haben.

import com.ms.wfc.data.*;
import java.io.* ;

public class ActiveCommandX
{
    // Der Haupteinstiegspunkt für die Anwendung.

    public static void main (String[] args)
    {
        ActiveCommandX();
        System.exit(0);
    }

    // ActiveCommandX-Funktion

    static void ActiveCommandX()
    {
        // ADO-Objekte definieren.
        Connection cnConn1 = null;
        Command cmd = null;
        Recordset rstAuthors = null;

        // Deklarationen.
        BufferedReader in =
            new BufferedReader (new InputStreamReader(System.in));
        String strCnn = "DSN=pubs;Provider=MSDASQL;uid=sa;pwd=;";
        String strName;

        try
        {
            System.out.println("Enter an author's name (e.g., Ringer): ");
            strName = in.readLine().trim();
            cmd = new Command();
            cmd.setCommandText("SELECT * FROM authors WHERE au_lname = ?");
            cmd.getParameters().append(cmd.createParameter("LastName",
                AdoEnums.DataType.CHAR,
                AdoEnums.ParameterDirection.INPUT, 20, strName));
            cnConn1 = new Connection();
            cnConn1.open(strCnn);
            cmd.setActiveConnection(cnConn1);
            rstAuthors = cmd.execute(null,AdoEnums.CommandType.TEXT);
            ActiveCommandXprint(rstAuthors);

            // Cleanup der Objekte vor dem Beenden.
            rstAuthors.close();
            cnConn1.close();
        }
        catch( AdoException ae )
        {
            // Dem Benutzer aus ADO resultierende Fehler melden.

            // Beim Übergeben eines Recordsets zuerst auf NULL-Zeiger
            // überprüfen.
            if (rstAuthors != null)
            {
                PrintProviderError(rstAuthors.getActiveConnection());
            }
            else
            {
                System.out.println("Exception: " + ae.getMessage());
            }
        }

        // Systemlesevorgang erfordert diesen Catch-Vorgang
        catch( java.io.IOException je)
        {
            PrintIOError(je);
        }
    }

    // ActiveCommandXprint-Function
    static void ActiveCommandXprint(Recordset rstp)
    {
        // Deklarationen.
        BufferedReader in =
            new BufferedReader (new InputStreamReader(System.in));
        String strName;

        try
        {
            strName = rstp.getActiveCommand().getParameters().
                getItem("LastName").getValue().toString();
            System.out.println("\nCommand text = '" +
                rstp.getActiveCommand().getCommandText() + "'");
            System.out.println("Parameter = '" + strName + "'");
            if(rstp.getBOF())
            {
                System.out.println("Name = '" + strName + "', not found.");
            }
            else
            {
                System.out.println("Name = '" +
                    rstp.getField("au_fname").getString() + " " +
                    rstp.getField("au_lname").getString() +
                    "', author ID = '" +
                    rstp.getField("au_id").getString() + "'");
            }
            System.out.println("\nPress <Enter> to continue..");
            in.readLine();
        }
        catch( AdoException ae )
        {
            // Dem Benutzer aus ADO resultierende Fehler melden.

            // Beim Übergeben eines Recordsets zuerst auf NULL-Zeiger
            // überprüfen.
            if (rstp != null)
            {
                PrintProviderError(rstp.getActiveConnection());
            }
            else
            {
                System.out.println("Exception: " + ae.getMessage());
            }
        }

        // Systemlesevorgang erfordert diesen Catch-Vorgang
        catch( java.io.IOException je)
        {
            PrintIOError(je);
        }
    }

    // PrintProviderError-Funktion

    static void PrintProviderError( Connection Cnn1 )
    {
        // Providerfehler aus dem Connection-Objekt drucken.
        // ErrItem ist ein Item-Objekt in der Errors-Auflistung
        // der Verbindung.
        com.ms.wfc.data.Error  ErrItem = null;
        long nCount = 0;
        int  i      = 0;

        nCount = Cnn1.getErrors().getCount();

        // Wenn sich in der Auflistung Fehler befinden, diese drucken.
        if( nCount > 0);
        {
            // Auflistung reicht von 0 bis nCount - 1
            for (i = 0; i< nCount; i++)
            {
                ErrItem = Cnn1.getErrors().getItem(i);
                System.out.println("\t Error number: " + ErrItem.getNumber()
                    + "\t" + ErrItem.getDescription() );
            }
        }

    }

    // PrintIOError-Funktion

    static void PrintIOError( java.io.IOException je)
    {
        System.out.println("Error \n");
        System.out.println("\tSource = " + je.getClass() + "\n");
        System.out.println("\tDescription = " + je.getMessage() + "\n");
    }
}


Beispiel für die ActiveConnection-, CommandText-, CommandTimeout-, CommandType-, Size- und Direction-Eigenschaften (VJ++)

In diesem Beispiel werden die Eigenschaften ActiveConnection, CommandText, CommandTimeout, CommandType, Size und Direction verwendet, um eine gespeicherte Prozedur auszuführen.

import com.ms.wfc.data.*;
import java.io.*;

public class ActiveConnectionX
{
    // Der Haupteinstiegspunkt für die Anwendung.

    public static void main (String[] args)
    {
        ActiveConnectionX();
        System.exit(0);
    }

    // ActiveConnectionX-Funktion

    static void ActiveConnectionX()
    {
        // ADO-Objekte definieren.
        Connection cnConn1 = null;
        Command cmdByRoyalty = null;
        Parameter prmByRoyalty = null;
        Recordset rstByRoyalty = null;
        Recordset rstAuthors = null;

        // Deklarationen.
        String strCnn;
        String strAuthorID;
        String strFName;
        String strLName;
        int intRoyalty ;
        BufferedReader in = new BufferedReader
            (new InputStreamReader (System.in));
        String line = null;

        try
        {
            // Eine Verbindung öffnen.

            strCnn = "Provider=sqloledb;Data Source=srv;"
                + "Initial Catalog=pubs;User Id=sa;Password=;";
            cnConn1 = new Connection();
            cnConn1.open(strCnn,"","",AdoEnums.CommandType.UNSPECIFIED);

            // Ein Command-Objekt für die gespeicherte Prozedur definieren.
            cmdByRoyalty = new Command();
            cmdByRoyalty.setActiveConnection(cnConn1);
            cmdByRoyalty.setCommandText("byRoyalty");
            cmdByRoyalty.setCommandType(AdoEnums.CommandType.STOREDPROC);
            cmdByRoyalty.setCommandTimeout(15);

            // Die Eingabeparameter der gespeicherten Prozedur definieren.
            System.out.println ("\nEnter Royalty : ");
            line = in.readLine().trim();
            intRoyalty = Integer.parseInt(line);
            prmByRoyalty = new Parameter ();
            prmByRoyalty.setType(AdoEnums.DataType.INTEGER);
            prmByRoyalty.setSize(3);
            prmByRoyalty.setDirection(AdoEnums.ParameterDirection.INPUT);
            prmByRoyalty.setValue(new Integer(intRoyalty));
            cmdByRoyalty.getParameters().append(prmByRoyalty);

            // Durch Ausführen des Befehls einen Datensatz erstellen.

            rstByRoyalty = cmdByRoyalty.execute();

            // Die Authors-Tabelle öffnen, um Autorennamen für die Anzeige
            // zu erhalten.
            rstAuthors = new Recordset ();
            rstAuthors.open("authors",strCnn,
                AdoEnums.CursorType.FORWARDONLY,
                AdoEnums.LockType.READONLY ,AdoEnums.CommandType.TABLE );

            // Aktuelle Daten im Recordset drucken,
            // dabei Autorennamen aus der Authors-Tabelle hinzufügen.
            System.out.println("\nAuthors with " + intRoyalty +
                " percent royalty");
            while (!rstByRoyalty.getEOF())
            {
                strAuthorID =  rstByRoyalty.getField("au_id").getString();
                rstAuthors.setFilter("au_id ='" +  strAuthorID + "'");
                strFName = rstAuthors.getField("au_fname").getString();
                strLName = rstAuthors.getField("au_lname").getString();
                System.out.println("\t" + strAuthorID + ", " + strFName
                    + " " + strLName);
                rstByRoyalty.moveNext();
            }
            System.out.println("\n\nPress <Enter> key to continue.");
            line = in.readLine();

            // Cleanup der Objekte vor dem Beenden.
            rstByRoyalty.close();
            rstAuthors.close();
            cnConn1.close();

        }
        catch( AdoException ae )
        {
            // Dem Benutzer aus ADO resultierende Fehler melden.

            // Auf NULL-Zeiger für Connection-Objekt überprüfen
            if(rstByRoyalty.getActiveConnection()==null)
                System.out.println("Exception: " + ae.getMessage());
            if(rstAuthors.getActiveConnection()==null)
                System.out.println("Exception: " + ae.getMessage());
            // Beim Übergeben eines Recordsets zuerst auf NULL-Zeiger
            // überprüfen.
            if (rstByRoyalty != null)
            {
                PrintProviderError(rstByRoyalty.getActiveConnection());
            }
            if (rstAuthors != null)
            {
                PrintProviderError(rstAuthors.getActiveConnection());
            }
            else
            {
                System.out.println("Exception: " + ae.getMessage());
            }
        }

        // Dieser Catch-Vorgang ist für den Fall erforderlich, dass eine
        // Eingabezeichenfolge nicht in einen ganzzahligen Datentyp
        // konvertiert werden kann.
        catch ( java.lang.NumberFormatException ne)
        {
            System.out.println("\nException: Integer Input required.");
        }
        // Systemlesevorgang erfordert diesen Catch-Vorgang
        catch( java.io.IOException je )
        {
            PrintIOError(je);
        }
    }

    // PrintProviderError-Funktion

    static void PrintProviderError( Connection Cnn1 )
    {
        // Providerfehler aus dem Connection-Objekt drucken.
        // ErrItem ist ein Item-Objekt in der Errors-Auflistung
        // der Verbindung.
        com.ms.wfc.data.Error  ErrItem = null;
        long nCount = 0;
        int  i      = 0;

        nCount = Cnn1.getErrors().getCount();

        // Wenn sich in der Auflistung Fehler befinden, diese drucken.
        if( nCount > 0);
        {
            // Auflistung reicht von 0 bis nCount - 1
            for (i = 0; i< nCount; i++)
            {
                ErrItem = Cnn1.getErrors().getItem(i);
                System.out.println("\t Error number: " + ErrItem.getNumber()
                    + "\t" + ErrItem.getDescription() );
            }
        }

    }

    // PrintIOError-Funktion

    static void PrintIOError( java.io.IOException je)
    {
        System.out.println("Error \n");
        System.out.println("\tSource = " + je.getClass() + "\n");
        System.out.println("\tDescription = " + je.getMessage() + "\n");
    }
}


Beispiel für die ActualSize- und DefinedSize-Eigenschaften (VJ++)

In diesem Beispiel werden die Eigenschaften ActualSize und DefinedSize verwendet, um die definierte und die tatsächliche Feldgröße anzuzeigen.

import com.ms.wfc.data.*;
import java.io.*;

public class ActualSizeX
{
    // Der Haupteinstiegspunkt für die Anwendung.

    public static void main (String[] args)
    {
        ActualSizeX();
        System.exit(0);
    }

    // ActualSizeX-Funktion

    static void ActualSizeX()
    {

        // ADO-Objekte definieren.
        Recordset rstStores = null;

        // Deklarationen.
        BufferedReader in = new
            BufferedReader(new InputStreamReader(System.in));
        String line = null;
        String strCnn = "Provider=sqloledb;Data Source=srv;"
            + "Initial Catalog=pubs;User Id=sa;Password=;";

        String strStoreName;
        String strMessage;
        String strDSize,strASize;
        int intDefinedSize;
        int intActualSize;
        int intChoice = 0;

        try
        {
            // Recordset mit Stores-Tabelle öffnen.
            rstStores = new Recordset();
            rstStores.open("stores", strCnn,
                AdoEnums.CursorType.FORWARDONLY ,
                AdoEnums.LockType.READONLY ,
                AdoEnums.CommandType.TABLE);

            // Schleife durch das Recordset, dabei den Inhalt des
            // stor_name-Feldes, die definierte Größe des Feldes und
            // die tatsächliche Größe des Feldes anzeigen.

            while ( !(rstStores.getEOF( ))) // fortwährende Schleife
            {
                // Datenfeld in den Variablen lesen.
                strStoreName = rstStores.getField("stor_name").getString();
                intDefinedSize =
                    rstStores.getField("stor_name").getDefinedSize();
                strDSize = Integer.toString(intDefinedSize);
                intActualSize = rstStores.getField
                    ("stor_name").getActualSize ();
                strASize = Integer.toString(intActualSize);

                // Aktuelle Datensatzinformationen anzeigen.
                strMessage = "\nStore name: " + strStoreName + "\n"
                     + "Defined Size : " + strDSize + "\n"
                     + "Actual Size : " + strASize;

                System.out.println(strMessage);
                System.out.println("\nPress <Enter> key to continue.");
                in.readLine();
                rstStores.moveNext();
            }

            // Cleanup der Objekte vor dem Beenden.
            rstStores.close();
        }
        catch( AdoException ae )
        {
            // Dem Benutzer aus ADO resultierende Fehler melden.

            // Auf NULL-Zeiger für Connection-Objekt überprüfen.
            if (rstStores.getActiveConnection()==null)
                System.out.println("Exception: " + ae.getMessage());
            // Beim Übergeben eines Recordsets zuerst auf NULL-Zeiger
            // überprüfen.
            if (rstStores != null)
            {
                PrintProviderError(rstStores.getActiveConnection());
            }
            else
            {
                System.out.println("Exception: " + ae.getMessage());
            }
        }

        // Systemlesevorgang erfordert diesen Catch-Vorgang
        catch( java.io.IOException je)
        {
            PrintIOError(je);
        }
    }

    // PrintProviderError-Funktion

    static void PrintProviderError( Connection Cnn1 )
    {
        // Providerfehler aus dem Connection-Objekt drucken.
        // ErrItem ist ein Item-Objekt in der Errors-Auflistung
        // der Verbindung.
        com.ms.wfc.data.Error  ErrItem = null;
        long nCount = 0;
        int  i      = 0;

        nCount = Cnn1.getErrors().getCount();

        // Wenn sich in der Auflistung Fehler befinden, diese drucken.
        if( nCount > 0);
        {
            // Auflistung reicht von 0 bis nCount - 1
            for (i = 0; i< nCount; i++)
            {
                ErrItem = Cnn1.getErrors().getItem(i);
                System.out.println("\t Error number: " + ErrItem.getNumber()
                    + "\t" + ErrItem.getDescription() );
            }
        }

    }

    // PrintIOError-Funktion

    static void PrintIOError( java.io.IOException je)
    {
        System.out.println("Error \n");
        System.out.println("\tSource = " + je.getClass() + "\n");
        System.out.println("\tDescription = " + je.getMessage() + "\n");
    }
}


Beispiel für die AddNew-Methode (VJ++)

In diesem Beispiel wird die AddNew-Methode zum Erstellen eines neuen Datensatzes mit dem angegebenen Namen verwendet.

import com.ms.wfc.data.*;
import java.io.*;

public class AddNewX
{
    // Der Haupteinstiegspunkt für die Anwendung.

    public static void main (String[] args)
    {
        AddNewX();
        System.exit(0);
    }

    // AddNewX-Funktion

    static void AddNewX()
    {
        // ADO-Objekte definieren.
        Connection cnConn1 = null;
        Recordset rstEmployees = null;

        // Deklarationen.
        String strCnn;
        String strID;
        String strFirstName;
        String strLastName;
        boolean booRecordAdded ;
        BufferedReader in =
new BufferedReader (new InputStreamReader (System.in));
        String line = null;

        try
        {
            // Eine Verbindung öffnen.
            strCnn = "Provider=sqloledb;Data Source=srv;"
                + "Initial Catalog=pubs;User Id=sa;Password=;";
            cnConn1 = new Connection();
            cnConn1.open(strCnn);//,"","",AdoEnums.CommandType.UNSPECIFIED);

            // Employees-Tabelle öffnen.
            rstEmployees = new Recordset ();
            rstEmployees.open("employee", cnConn1,
                AdoEnums.CursorType.KEYSET , AdoEnums.LockType.OPTIMISTIC ,
                AdoEnums.CommandType.TABLE );

            /* Daten vom Benutzer erhalten. Die Angestellten-ID (employee
            ID) muss das folgende Format haben: Jeweils erster Buchstabe des
            Vornamens, des zweiten Vornamens und des Nachnamens, fünf
             Zahlen, dann M oder F für das Geschlecht. Die Angestellten-ID
            für Bill Sornsin wäre beispielsweise "B-S55555M". */
            System.out.println("\nEnter employee ID :");
            strID = in.readLine().trim();
            System.out.println("\nEnter first name :");
            strFirstName = in.readLine().trim();
            System.out.println("\nEnter last name :");
            strLastName = in.readLine().trim();

            // Nur fortfahren, wenn der Benutzer tatsächlich eine Eingabe
            // sowohl für den Vor- als auch den Nachnamen gemacht hat.

            if ( !(strID.compareTo("") == 0) &
                !(strFirstName.compareTo("") == 0) &
                !(strLastName.compareTo("")== 0))
            {
                // Neuen Datensatz hinzufügen.
                rstEmployees.addNew();
                rstEmployees.getField("emp_id").setString(strID);
                rstEmployees.getField("fname").setString(strFirstName);
                rstEmployees.getField("lname").setString(strLastName);

                // Den Datensatz mit den neuen Daten aktualisieren.
                rstEmployees.update();
                booRecordAdded = true;

                // Die neu hinzugefügten Daten anzeigen.
                System.out.println("\nNew record : "
                    + rstEmployees.getField("emp_id").getString()+ " "
                    + rstEmployees.getField("fname").getString()+ " "
                    + rstEmployees.getField("lname").getString());
            }
            else
            {
                System.out.println("\nPlease enter an employee ID," +
                    "first name, and last name.");
            }

            System.out.println("\n\nPress <Enter> key to continue.");
            line = in.readLine();

            // Den neuen Datensatz löschen, da dies nur als Beispiel
            // dient.
            cnConn1.execute("DELETE FROM employee WHERE "
                + "emp_id = '" + strID + "'");

            // Cleanup der Objekte vor dem Beenden.
            rstEmployees.close();
            cnConn1.close();
            System.exit(0);
        }
        catch( AdoException ae )
        {
            // Dem Benutzer aus ADO resultierende Fehler melden.

            //Auf NULL-Zeiger für Connection-Objekt überprüfen.
            if(rstEmployees.getActiveConnection()==null)
                System.out.println("Exception: " + ae.getMessage());
            // Beim Übergeben eines Recordsets zuerst auf NULL-Zeiger
            // überprüfen.
            if (rstEmployees != null)
            {
                PrintProviderError(rstEmployees.getActiveConnection());
            }
            else
            {
                System.out.println("Exception: " + ae.getMessage());
            }
            System.exit(0);
        }
        // Systemlesevorgang erfordert diesen Catch-Vorgang
        catch( java.io.IOException je )
        {
            PrintIOError(je);
        }
    }

    // PrintProviderError-Funktion

    static void PrintProviderError( Connection Cnn1 )
    {
        // Providerfehler aus dem Connection-Objekt drucken.
        // ErrItem ist ein Item-Objekt in der Errors-Auflistung
        // der Verbindung.
        com.ms.wfc.data.Error  ErrItem = null;
        long nCount = 0;
        int  i      = 0;

        nCount = Cnn1.getErrors().getCount();

        // Wenn sich in der Auflistung Fehler befinden, diese drucken.
        if( nCount > 0);
        {
            // Auflistung reicht von 0 bis nCount - 1
            for (i = 0; i< nCount; i++)
            {
                ErrItem = Cnn1.getErrors().getItem(i);
                System.out.println("\t Error number: " + ErrItem.getNumber()
                    + "\t" + ErrItem.getDescription() );
            }
        }

    }

    // PrintIOError-Funktion

    static void PrintIOError( java.io.IOException je)
    {
        System.out.println("Error \n");
        System.out.println("\tSource = " + je.getClass() + "\n");
        System.out.println("\tDescription = " + je.getMessage() + "\n");
    }
}


Beispiel für die Append- und CreateParameter-Methoden (VJ++)

In diesem Beispiel werden die Methoden Append und CreateParameter zum Ausführen einer gespeicherten Prozedur unter Angabe eines Eingabeparameters verwendet.

import com.ms.wfc.data.*;
import java.io.*;
import com.ms.com.*;

public class AppendX
{
    // Der Haupteinstiegspunkt für die Anwendung.

    public static void main (String[] args)
    {
        AppendX();
    }

    // AppendX-Funktion

    static void AppendX()
    {
        // ADO-Objekte definieren.
        Connection cnConn1 = null;
        Command cmdByRoyalty = null;
        Parameter prmByRoyalty = null;
        Recordset rstByRoyalty = null;
        Recordset rstAuthors = null;

        // Deklarationen.
        String strCnn;
        String strAuthorID;
        String strFName;
        String strLName;
        int intRoyalty ;
        BufferedReader in =
            new BufferedReader (new InputStreamReader (System.in));
        String line = null;
        Variant varRoyalty;

        try
        {
            // Eine Verbindung öffnen.

            strCnn = "Provider=sqloledb;Data Source=srv;"
                + "Initial Catalog=pubs;User Id=sa;Password=;";
            cnConn1 = new Connection();
            cnConn1.open(strCnn);
            cnConn1.setCursorLocation(AdoEnums.CursorLocation.CLIENT);

            // Command-Objekt mit einem Parameter öffnen.
            cmdByRoyalty = new Command();
            cmdByRoyalty.setCommandText("byRoyalty");
            cmdByRoyalty.setCommandType(AdoEnums.CommandType.STOREDPROC);

            // Parameterwert abrufen und Parameter anhängen.
            System.out.println ("\nEnter Royalty : ");
            line = in.readLine().trim();
            intRoyalty = Integer.parseInt(line);
            varRoyalty = new Variant(intRoyalty);
            prmByRoyalty = cmdByRoyalty.createParameter ("percentage",
                AdoEnums.DataType.INTEGER,
                AdoEnums.ParameterDirection.INPUT,4,varRoyalty);

            cmdByRoyalty.getParameters().append(prmByRoyalty);
            prmByRoyalty.setValue(varRoyalty);

            // Durch Ausführen des Befehls ein Recordset erstellen.
            cmdByRoyalty.setActiveConnection(cnConn1);
            rstByRoyalty = cmdByRoyalty.execute();

            // Die Authors-Tabelle öffnen, um Autorennamen für die Anzeige
            // zu erhalten.
            rstAuthors = new Recordset ();
            rstAuthors.open("authors", cnConn1,
                AdoEnums.CursorType.FORWARDONLY,
                AdoEnums.LockType.READONLY,
                AdoEnums.CommandType.TABLE );

            // Aktuelle Daten im Recordset drucken,
            // dabei Autorennamen aus der Authors-Tabelle hinzufügen.
            System.out.println("\nAuthors with " + intRoyalty +
                " percent royalty");
            while (!rstByRoyalty.getEOF())
            {
                strAuthorID =  rstByRoyalty.getField("au_id").getString();
                rstAuthors.setFilter("au_id ='" +  strAuthorID + "'");
                strFName = rstAuthors.getField("au_fname").getString();
                strLName = rstAuthors.getField("au_lname").getString();
                System.out.println("\t" + strAuthorID + ", " + strFName
                    + " " + strLName);
                rstByRoyalty.moveNext();
            }
            System.out.println("\n\nPress <Enter> key to continue.");
            line = in.readLine();

            // Cleanup der Objekte vor dem Beenden.
            rstByRoyalty.close();
            rstAuthors.close();
            cnConn1.close();
            System.exit(0);// nur hier erforderlich.

        }
        catch( AdoException ae )
        {
            // Dem Benutzer aus ADO resultierende Fehler melden.

            // Auf NULL-Zeiger für Connection-Objekt überprüfen.
            if(rstByRoyalty.getActiveConnection()==null)
                System.out.println("Exception: " + ae.getMessage());
            // Beim Übergeben eines Recordsets zuerst auf NULL-Zeiger
            // überprüfen.
            if (rstByRoyalty != null)
            {
                PrintProviderError(rstByRoyalty.getActiveConnection());
            }
            if (rstAuthors != null)
            {
                if (rstAuthors.getActiveConnection()==null)
                    System.out.println("Exception: " + ae.getMessage());
                else
                    PrintProviderError(rstAuthors.getActiveConnection());
            }
            else
            {
                System.out.println("Exception: " + ae.getMessage());
            }
        }

        // Dieser Catch-Vorgang ist für den Fall erforderlich, dass die
        // Eingabezeichenfolge nicht in einen ganzzahligen Datentyp
        // konvertiert werden kann.
        catch( java.lang.NumberFormatException ne)
        {
            System.out.println("\nException: Integer Number required.");
            System.exit(0);
        }
        // Systemlesevorgang erfordert diesen Catch-Vorgang
        catch( java.io.IOException je )
        {
            PrintIOError(je);
        }
    }

    // PrintProviderError-Funktion

    static void PrintProviderError( Connection Cnn1 )
    {
        // Providerfehler aus dem Connection-Objekt drucken.
        // ErrItem ist ein Item-Objekt in der Errors-Auflistung
        // der Verbindung.
        com.ms.wfc.data.Error  ErrItem = null;
        long nCount = 0;
        int  i      = 0;

        nCount = Cnn1.getErrors().getCount();

        // Wenn sich in der Auflistung Fehler befinden, diese drucken.
        if( nCount > 0);
        {
            // Auflistung reicht von 0 bis nCount - 1
            for (i = 0; i< nCount; i++)
            {
                ErrItem = Cnn1.getErrors().getItem(i);
                System.out.println("\t Error number: " + ErrItem.getNumber()
                    + "\t" + ErrItem.getDescription() );
            }
        }

    }

    // PrintIOError-Funktion

    static void PrintIOError( java.io.IOException je)
    {
        System.out.println("Error \n");
        System.out.println("\tSource = " + je.getClass() + "\n");
        System.out.println("\tDescription = " + je.getMessage() + "\n");
    }
}


Beispiel für die AppendChunk- und GetChunk-Methoden (VJ++)

In diesem Beispiel werden die Methoden AppendChunk und GetChunk zum Füllen eines Bildfeldes mit Daten aus einem anderen Datensatz verwendet.

import com.ms.wfc.data.*;
import java.io.*;
import com.ms.com.*;
import java.util.*;

public class AppendChunkX
{

    // Der Haupteinstiegspunkt für die Anwendung.

    public static void main (String[] args)
    {
        AppendChunkX();
        System.exit(0);
    }

    // AppendChunkX-Funktion

    static void AppendChunkX()
    {
        // ADO-Objekte definieren.
        Connection cnConn1 = null;
        Recordset rstPubInfo = null;

        // Deklarationen.
        String strCnn;
        String strPubID;
        String strPRInfo;
        String strMessage = "";
        long lngOffset = 0;
        long lngLogoSize;
        final  int conChunkSize = 100;
        byte[] varChunk = new byte[conChunkSize];
        int intCommand = 0 ;
        int intMulChunkSize,intLastChunkSize;
        Vector varLogo = new Vector();
        BufferedReader in =
            new BufferedReader(new InputStreamReader(System.in));
        String line = null;
        int noOfRecords;
        int noOfRecordesDisplayed = 5;
        int recordCount = 0;
        String info;
        int indexOfComma ;

        try
        {
            // Eine Verbindung öffnen.
            strCnn = "Provider=sqloledb;Data Source=srv;"
                + "Initial Catalog=pubs;User Id=sa;Password=;";
            cnConn1 = new Connection();
            cnConn1.open(strCnn,"","",AdoEnums.CommandType.UNSPECIFIED);

            // Die pub_info-Tabelle öffnen.
            rstPubInfo = new Recordset();
            rstPubInfo.setCursorType(AdoEnums.CursorType.KEYSET );
            rstPubInfo.setLockType(AdoEnums.LockType.OPTIMISTIC );

            rstPubInfo.open("pub_info", cnConn1,AdoEnums.CursorType.KEYSET ,
                AdoEnums.LockType.OPTIMISTIC, AdoEnums.CommandType.TABLE );
            System.out.println ("Available logos are : \n");

            noOfRecords = rstPubInfo.getRecordCount();

            // Aufforderung betreffs des zu kopierenden Logos.
            for ( int i = 0; i < noOfRecords; i++)
            {
                recordCount++;
                strMessage = strMessage +
                    rstPubInfo.getField("pub_id").getString() + "\n";
                indexOfComma =
                    rstPubInfo.getField("pr_info").getString().indexOf(",");
                info =
                    rstPubInfo.getField("pr_info").getString().substring(0,
                    indexOfComma );
                strMessage = strMessage + info + "\n\n";
                // Jeweils fünf Datensätze anzeigen.
                if ( recordCount == noOfRecordesDisplayed)
                {
                    System.out.println(strMessage);
                    System.out.println("\n\nPress <Enter> to continue..");
                    line = in.readLine();
                    strMessage = "";
                    recordCount = 0;
                }
                rstPubInfo.moveNext();
                // Die letzten Datensätze anzeigen und beenden, falls letzter
                // Datensatz.
                if(rstPubInfo.getEOF())
                {
                    System.out.println(strMessage);
                    break;
                }
            }
            System.out.println ("\nEnter the ID of a logo to copy :\n"  );
            strPubID = in.readLine();

            // Das Logo in eine Abschnittsvariable kopieren.
            rstPubInfo.setFilter("pub_id = '" + strPubID + "'");
            lngLogoSize = rstPubInfo.getField("logo").getActualSize();
            while (lngOffset < lngLogoSize)
            {
                varChunk = rstPubInfo.getField("logo")
                    .getByteChunk(conChunkSize);
                int i = 0;
                while (i < conChunkSize && varLogo.size() < (int)lngLogoSize)
                {
                    varLogo.addElement(new Byte(varChunk[i]));
                    i++;
                }
                lngOffset =  lngOffset + conChunkSize ;
            }
                // Die Daten für neue ID vom Benutzer erhalten.
                System.out.println
                    ("\nEnter a new pub ID [must be > 9899 & < 9999]:");
                strPubID =  in.readLine().trim();

                System.out.println ("\nEnter descriptive text :");
                strPRInfo =  in.readLine().trim();

                // Temporär neuen Verlag zur Publishers-Tabelle hinzufügen,
                // um eine Fehlermeldung wegen einer
                // Fremdschlüsseleinschränkung zu vermeiden.
                cnConn1.execute("INSERT publishers(pub_id) VALUES('" +
                    strPubID + "')");

                // Neuen Datensatz hinzufügen.
                rstPubInfo.addNew();
                rstPubInfo.getField("pub_id").setString(strPubID);
                rstPubInfo.getField("pr_info").setString(strPRInfo);

                // Das ausgewählte Logo abschnittweise zu dem neuen Logo
                // hinzufügen.
                lngOffset = 0;

                // Logogröße in mehrere Abschnitte von konstanter Größe
            // teilen.
                intMulChunkSize =
                    (varLogo.size()/conChunkSize) * conChunkSize;
                intLastChunkSize = varLogo.size()- intMulChunkSize ;
                byte[] arrChunk  = new byte[conChunkSize];
                byte[] lastChunk = new byte[intLastChunkSize];

                while ( lngOffset < varLogo.size () )
                {
                    int ii = 0 ;
                    // Das Logo in konstanter Abschnittgröße kopieren.
                    if ( (int)lngOffset < intMulChunkSize)
                    {
                        while (ii < conChunkSize &&
                            (int)lngOffset < varLogo.size () )
                        {
                            arrChunk[ii] =
                                ((Byte)varLogo.elementAt
                                ((int)lngOffset)).byteValue();
                            ii++;
                            lngOffset++;
                        }
                        rstPubInfo.getField("logo").appendChunk(arrChunk);
                    }
                    // Den letzten verbleibenden Abschnitt kopieren.
                    else
                    {
                        while (ii < intLastChunkSize &&
                            (int)lngOffset < varLogo.size () )
                        {
                            lastChunk[ii] =
                                ((Byte)varLogo.elementAt
                                ((int)lngOffset)).byteValue();
                            ii++;
                            lngOffset++;

                        }
                        rstPubInfo.getField("logo").appendChunk(lastChunk);
                    }

                }

                // Das neue Recordset mit neuem Logo aktualisieren.

                rstPubInfo.update();

                // Die neu hinzugefügten Daten anzeigen.
                System.out.println ("\nNew Record : " +
                    rstPubInfo.getField("pub_id").getString() + "\n");
                System.out.println ("Description : " +
                    rstPubInfo.getField("pr_info").getString() + "\n");
                System.out.println ("Logo Size : " +
                    rstPubInfo.getField("logo").getActualSize() );

                System.out.println ("\n\nPress <Enter> key to continue.");
                in.readLine();

                // Neue Datensätze löschen, da dies nur als Beispiel
                // dient.
                rstPubInfo.requery();
                cnConn1.execute("DELETE FROM pub_info WHERE  pub_id = '" +
                    strPubID + "'");
                cnConn1.execute("DELETE FROM publishers WHERE  pub_id = '" +
                    strPubID + "'");

                // Cleanup der Objekte vor dem Beenden.
                rstPubInfo.close();
                cnConn1.close();
        }
        catch( AdoException ae )
            {
                // Dem Benutzer aus ADO resultierende Fehler melden.

                // Auf NULL-Zeiger für Connection-Objekt überprüfen.
                if(rstPubInfo.getActiveConnection()==null)
                        System.out.println("Exception: " + ae.getMessage());
                // Beim Übergeben eines Recordsets zuerst auf NULL-Zeiger
                // überprüfen.
                if (rstPubInfo != null)
                {
                    PrintProviderError(rstPubInfo.getActiveConnection());
                    PrintADOError(ae);
                }
                else
                {
                    System.out.println("Exception: " + ae.getMessage());
                }
        }
        // Systemlesevorgang erfordert diesen Catch-Vorgang
        catch( java.io.IOException je )
        {
            PrintIOError(je);
        }
    }

    // PrintProviderError-Funktion

    static void PrintProviderError( Connection Cnn1 )
    {
        // Providerfehler aus dem Connection-Objekt drucken.
        // ErrItem ist ein Item-Objekt in der Errors-Auflistung
        // der Verbindung.
        com.ms.wfc.data.Error  ErrItem = null;
        long nCount = 0;
        int  i      = 0;

        nCount = Cnn1.getErrors().getCount();

        // Wenn sich in der Auflistung Fehler befinden, diese drucken.
        if( nCount > 0);
        {
            // Auflistung reicht von 0 bis nCount - 1
            for (i = 0; i< nCount; i++)
            {
                ErrItem = Cnn1.getErrors().getItem(i);
                System.out.println("\t Error number: " + ErrItem.getNumber()
                    + "\t" + ErrItem.getDescription() );
            }
        }

    }

    // PrintIOError-Funktion

    static void PrintIOError( java.io.IOException je)
    {
        System.out.println("Error \n");
        System.out.println("\tSource = " + je.getClass() + "\n");
        System.out.println("\tDescription = " + je.getMessage() + "\n");
    }

    // PrintADOError-Funktion

    static void PrintADOError(AdoException ae)
    {
        System.out.println("\t Error Source = " + ae.getSource() + "\n");
        System.out.println("\t Description = " + ae.getMessage() + "\n");
    }
}


Beispiel für die Attributes- und Name-Eigenschaften (VJ++)

In diesem Beispiel wird der Wert der Attributes-Eigenschaft für die Objekte Connection, Field und Property angezeigt. Mit der Name-Eigenschaft wird der Name jedes Field- und Property-Objekts angezeigt.

import com.ms.wfc.data.*;
import java.io.*;

public class AttributesX
{
    // Der Haupteinstiegspunkt für die Anwendung
    public static void main (String[] args)
    {
        AttributesX();
        System.exit(0);
    }

    // AttributeX-Funktion

    static void AttributesX()
    {
        // ADO-Objekte definieren.
        Connection cnConn1 = null;
        Recordset rstEmployees = null;
        Fields listOfFields = null;
        AdoProperties listOfProperties = null;

        // Deklarationen.
        BufferedReader in =
            new BufferedReader (new InputStreamReader(System.in));
        String line = null;
        String strCnn = "Provider=sqloledb;Data Source=srv;"
            + "Initial Catalog=pubs;User Id=sa;Password=;";
        int recordDisplaySize = 15;
        int propertyCount = 0;
        try
        {
            // Verbindung und Recordset öffnen.
            cnConn1 = new Connection();
            cnConn1.open(strCnn);

            rstEmployees = new Recordset ();
            rstEmployees.open("employee",
                cnConn1,AdoEnums.CursorType.FORWARDONLY,
                AdoEnums.LockType.READONLY, AdoEnums.CommandType.TABLE);

            // Die Attribute der Verbindung anzeigen.
            System.out.println("Connection attributes = "
                + cnConn1.getAttributes());
            // Die Attribute der Felder der Employees-Tabelle anzeigen.
            System.out.println("\n\nField attributes : " + "\n");

            listOfFields = rstEmployees.getFields();

            for ( int i=0; i < listOfFields.getCount();i++)
            {
                System.out.println("\t\t" + listOfFields.getItem(i).getName()
                    + " = " + listOfFields.getItem(i).getAttributes());
            }

            // Felder der Employees-Tabelle, die NULL zulassen,
            // anzeigen.
            System.out.println("\n\nNULLABLE Fields : " + "\n");
            for ( int i=0; i < listOfFields.getCount();i++)
            {
                if ((listOfFields.getItem(i).getAttributes() &
                    AdoEnums.FieldAttribute.ISNULLABLE) > 0)
                    System.out.println("\t\t" +
                    listOfFields.getItem(i).getName());

            }

            System.out.println ("\n\nPress <Enter> key to continue..");
            line = in.readLine();

            // Die Eigenschaftsattribute der Employees-Tabelle
            // anzeigen.
            System.out.println("\n\nProperty attributes : " );
            listOfProperties = rstEmployees.getProperties();
            for ( int i=0; i < listOfProperties.getCount() ;i++)
            {
                System.out.println("\t\t" +
                    listOfProperties.getItem(i).getName()
                    + " = " + listOfProperties.getItem(i).getAttributes());

                if (propertyCount == recordDisplaySize)
                {
                    System.out.println ("\n\nPress <Enter> key to continue.");
                    line = in.readLine();
                    propertyCount = 0;
                }
                propertyCount++;
            }

            System.out.println ("\n\nPress <Enter> key to continue.");
            line = in.readLine();

            // Cleanup der Objekte vor dem Beenden.
            rstEmployees.close();
            cnConn1.close();
        }
        catch( AdoException ae )
        {
            // Dem Benutzer aus ADO resultierende Fehler melden.

            // Auf NULL-Zeiger für Connection-Objekt überprüfen.
            if (rstEmployees.getActiveConnection()==null)
                System.out.println("Exception: " + ae.getMessage());

            // Beim Übergeben eines Recordsets zuerst auf NULL-Zeiger
            // überprüfen.

            if (rstEmployees != null)
            {
                PrintProviderError(rstEmployees.getActiveConnection());
            }
            else
            {
                System.out.println("Exception: " + ae.getMessage());
            }
        }

        // Systemlesevorgang erfordert diesen Catch-Vorgang
        catch( java.io.IOException je)
        {
            PrintIOError(je);
        }
    }

    // PrintProviderError-Funktion

    static void PrintProviderError( Connection Cnn1 )
    {
        // Providerfehler aus dem Connection-Objekt drucken.
        // ErrItem ist ein Item-Objekt in der Errors-Auflistung
        // der Verbindung.
        com.ms.wfc.data.Error  ErrItem = null;
        long nCount = 0;
        int  i      = 0;

        nCount = Cnn1.getErrors().getCount();

        // Wenn sich in der Auflistung Fehler befinden, diese drucken.
        if( nCount > 0);
        {
            // Auflistung reicht von 0 bis nCount - 1
            for (i = 0; i< nCount; i++)
            {
                ErrItem = Cnn1.getErrors().getItem(i);
                System.out.println("\t Error number: " + ErrItem.getNumber()
                    + "\t" + ErrItem.getDescription() );
            }
        }

    }

    // PrintIOError-Funktion

    static void PrintIOError( java.io.IOException je)
    {
        System.out.println("Error \n");
        System.out.println("\tSource = " + je.getClass() + "\n");
        System.out.println("\tDescription = " + je.getMessage() + "\n");
    }
}


Beispiel für die BeginTrans-, CommitTrans- und RollbackTrans-Methoden (VJ++)

In diesem Beispiel wird der Buchtyp sämtlicher Psychologiebücher in der Titles-Tabelle der Datenbank geändert. Nachdem die BeginTrans-Methode eine Transaktion ausgeführt hat, die alle an der Titles-Tabelle vorgenommenen Änderungen isoliert, speichert die CommitTrans-Methode die Änderungen. Mit der Rollback-Methode können unter Verwendung der Update-Methode gespeicherte Änderungen rückgängig gemacht werden.

import com.ms.wfc.data.*;
import java.io.*;

public class BeginTransX
{
    // Der Haupteinstiegspunkt für die Anwendung.

    public static void main (String[] args)
    {
        BeginTransX();
        System.exit(0);
    }

    // BeginTransX-Funktion
    static void BeginTransX()
    {
        // ADO-Objekte definieren.
        Connection cnConn1 = null;
        Recordset rstTitles = null;

        // Deklarationen.
        String strCnn = "Provider=sqloledb;Data Source=srv;"
            + "Initial Catalog=pubs;User Id=sa;Password=;";
        String strTitle;
        String strType;
        BufferedReader in =
            new BufferedReader (new InputStreamReader (System.in));
        String line = null;
        String strMessage="";
        int intChoice = 0;
        int recordDisplaySize = 15;
        int recordCount = 0;

        try
        {
            // Eine Verbindung öffnen.

            cnConn1 = new Connection();
            cnConn1.open(strCnn,"","",AdoEnums.CommandType.UNSPECIFIED);

            // Die Titles-Tabelle öffnen.
            rstTitles = new Recordset ();
            rstTitles.setCursorType(AdoEnums.CursorType.DYNAMIC);
            rstTitles.setLockType(AdoEnums.LockType.PESSIMISTIC);
            rstTitles.open("titles",cnConn1,AdoEnums.CursorType.DYNAMIC ,
                AdoEnums.LockType.PESSIMISTIC ,AdoEnums.CommandType.TABLE );

            rstTitles.moveFirst();
            cnConn1.beginTrans();

            // Schleife durch das Recordset, dabei Benutzer fragen, ob
            // der Typ für einen angegebenen Titel geändert werden soll.

            while (!rstTitles.getEOF())
            {
                strType = rstTitles.getField("type").getString().trim();
                if ((rstTitles.getField("type").getString().
                    trim()).compareTo("psychology")== 0)
                {
                    strTitle = rstTitles.getField("title").getString().trim();
                    System.out.println("\nTitle : " + strTitle + "\n\n"
                        +  "Change type to self help (1 -> Yes / 2 -> No) ?");
                    // Den Typ für das angegebene Buch ändern.
                    line = in.readLine().trim();
                    intChoice = Integer.parseInt(line);
                    if ( intChoice == 1)
                    {
                        rstTitles.getField("type").setString("self_help");
                        rstTitles.update();
                    }
                }
                rstTitles.moveNext();
            }

            // Den Benutzer fragen, ob ein Commit für alle oben
            // gemachten Änderungen ausgeführt werden soll.
            System.out.println
                ("\n\nSave all changes (1 -> Yes / 2 -> No) ?");
            line = in.readLine().trim();
            intChoice = Integer.parseInt(line);
            if ( intChoice == 1)
                cnConn1.commitTrans();
            else
                cnConn1.rollbackTrans();

            // Aktuelle Daten im Recordset drucken.
            rstTitles.requery();
            rstTitles.moveFirst();

            while(true)
            {
                strMessage = strMessage +"\n " +
                    rstTitles.getField("title").getString()+" - "
                    + rstTitles.getField("type").getString() ;

                if ( recordCount == recordDisplaySize)
                {
                    System.out.println(strMessage);
                    System.out.println("\n\nPress <Enter> key to continue..");
                    line = in.readLine();
                    strMessage = "";
                    recordCount = 0;
                }
                recordCount++;
                rstTitles.moveNext();
                if(rstTitles.getEOF())
                {
                    System.out.println(strMessage);
                    break;
                }
            }
            System.out.println("\n\nPress <Enter> key to continue..");
            line = in.readLine();

            // Ursprüngliche Daten wiederherstellen, da dies nur als
            // Beispiel dient.
            rstTitles.moveFirst();
            while (!rstTitles.getEOF())
            {
                if ((rstTitles.getField("type").getString().
                    trim().compareTo("self_help"))== 0)
                {
                    rstTitles.getField("type").setString("psychology");
                    rstTitles.update();
                }
                rstTitles.moveNext();
            }
            // Cleanup der Objekte vor dem Beenden.
            rstTitles.close();
            cnConn1.close();
        }
        catch( AdoException ae )
        {
            // Dem Benutzer aus ADO resultierende Fehler melden.

            // Auf NULL-Zeiger für Connection-Objekt überprüfen.
            if(rstTitles.getActiveConnection()==null)
                System.out.println("Exception: " + ae.getMessage());

            // Beim Übergeben eines Recordsets zuerst auf NULL-Zeiger
            // überprüfen.
            if (rstTitles != null)
            {
                PrintProviderError(rstTitles.getActiveConnection());
            }
            else
            {
                System.out.println("Exception: " + ae.getMessage());
            }
        }
        // Systemlesevorgang erfordert diesen Catch-Vorgang
        catch( java.io.IOException je )
        {
            PrintIOError(je);
        }
    }

    // PrintProviderError-Funktion

    static void PrintProviderError( Connection Cnn1 )
    {
        // Providerfehler aus dem Connection-Objekt drucken.
        // ErrItem ist ein Item-Objekt in der Errors-Auflistung
        // der Verbindung.
        com.ms.wfc.data.Error  ErrItem = null;
        long nCount = 0;
        int  i      = 0;

        nCount = Cnn1.getErrors().getCount();

        // Wenn sich in der Auflistung Fehler befinden, diese drucken.
        if( nCount > 0);
        {
            // Auflistung reicht von 0 bis nCount - 1
            for (i = 0; i< nCount; i++)
            {
                ErrItem = Cnn1.getErrors().getItem(i);
                System.out.println("\t Error number: " + ErrItem.getNumber()
                    + "\t" + ErrItem.getDescription() );
            }
        }

    }

    // PrintIOError-Funktion

    static void PrintIOError( java.io.IOException je)
    {
        System.out.println("Error \n");
        System.out.println("\tSource = " + je.getClass() + "\n");
        System.out.println("\tDescription = " + je.getMessage() + "\n");
    }
}


Beispiel für die BOF-, EOF- und Bookmark-Eigenschaften (VJ++)

In diesem Beispiel werden die Eigenschaften BOF und EOF verwendet, um eine Nachricht anzuzeigen, wenn der Benutzer über den ersten oder letzten Datensatz eines Recordset-Objekts hinausgehen möchte. Mit der Bookmark-Eigenschaft kann der Benutzer einen Datensatz in einem Recordset-Objekt markieren und später an diese Stelle zurückkehren.

import com.ms.wfc.data.*;
import java.io.*;
import com.ms.com.*;

public class BOFEOFBookmark
{
    Variant varBookmark;
    BufferedReader in =
        new BufferedReader(new InputStreamReader(System.in));
    String line = null;

    // Der Haupteinstiegspunkt für die Anwendung.

    public static void main (String[] args)
    {
        BOFEOFBookmark b1 = new BOFEOFBookmark ();
        b1.BOFX();
        b1.BOFX2();
        System.exit(0);
        try
        {
            b1.finalize();
        }
        catch(Throwable te)
        {
        }
    }

    // Der Haupteinstiegspunkt für die Anwendung.

    public void BOFX()
    {
        // Deklarationen.
        Recordset rstPublishers = null;
        String strCnn;
        String strMessage;
        int intCommand = 0;

        strCnn = "Provider=sqloledb;Data Source=srv;"
            + "Initial Catalog=pubs;User Id=sa;Password=;";
        try
        {
            // Ein Recordset mit Daten aus der Publishers-Tabelle öffnen.
            rstPublishers = new Recordset();
            rstPublishers.setCursorType(AdoEnums.CursorType.STATIC );
            rstPublishers.setCursorLocation(
                AdoEnums.CursorLocation.CLIENT);

            // Mithilfe des Clientcursors die AbsolutePosition-Eigenschaft
            // aktivieren.

            rstPublishers.open(new String(
                "SELECT pub_id,pub_name FROM Publishers ORDER BY pub_name"),
                strCnn, AdoEnums.CursorType.STATIC ,
                AdoEnums.LockType.BATCHOPTIMISTIC,
                AdoEnums.CommandType.TEXT );
            rstPublishers.moveFirst();

            // Informationen über den aktuellen Datensatz anzeigen und
            // Benutzereingabe erhalten.
            while ( true)
            {
                strMessage = "\nPublisher :" +
                    rstPublishers.getField("pub_name").getString() + "\n"
                    + " (Record " + rstPublishers.getAbsolutePosition()
                    + " of " + rstPublishers.getRecordCount() + ")" + "\n\n"
                    + "Enter command : " + "\n"
                    + "[1 - next / 2 - previous /" + "\n"
                    + "3 - set bookmark / 4 - go to bookmark]" ;
                System.out.println (strMessage);
                line = in.readLine();
                // Falls kein Eintrag vorliegt, wird die Schleife beendet.
                if (line.length() == 0)
                    break;
                // Zeichenfolgeneintrag in Ganzzahl konvertieren.
                intCommand = Integer.parseInt(line);
                // Wert außerhalb des zulässigen Bereichs beendet die
                // Schleife.
                if ((intCommand < 1) || (intCommand > 4)) break ;

                // Aufrufmethode auf Grundlage der überprüften Auswahl des
                // Benutzers.
                MoveAny(intCommand, rstPublishers);
            }
            rstPublishers.close();
        }
        catch( AdoException ae )
        {
            // Dem Benutzer aus ADO resultierende Fehler melden.

            // Beim Übergeben eines Recordsets zuerst auf NULL-Zeiger
            // überprüfen.
            if (rstPublishers != null)
            {
                PrintProviderError(rstPublishers.getActiveConnection());
            }
            else
            {
                System.out.println("Exception: " + ae.getMessage());
            }
        }

        // Dieser Catch-Vorgang ist für den Fall erforderlich, dass eine
        // Eingabezeichenfolge nicht in einen ganzzahligen Datentyp
        // konvertiert werden kann.

        catch ( java.lang.NumberFormatException ne)
        {
            System.out.println("\nException: Integer Input required." );
        }

        // Systemlesevorgang erfordert diesen Catch-Vorgang
        catch( java.io.IOException je )
        {
            PrintIOError(je);
        }
    }

    // MoveAny-Funktion

    public void MoveAny(int intChoice, Recordset rsTemp)
    {
        // Nach Auswahl des Benutzers vorwärts oder rückwärts bewegen,
        // dabei BOF and EOF auffangen.
        try
        {
            switch(intChoice)
            {
                case 1:   // Gleich dem char-Wert für 1.
                    rsTemp.moveNext();
                    if (rsTemp.getEOF())
                    {
                        System.out.println (
                            "\nMoving past the last record \nTry again." );
                        rsTemp.moveLast();
                    }
                    break;
                case 2:   // Gleich dem char-Wert für 2.
                    rsTemp.movePrevious();
                    if (rsTemp.getBOF())
                    {
                        System.out.println (
                            "\nMoving past the first record \nTry again." );
                        rsTemp.moveFirst();
                    }
                    break;
                case 3:   // Gleich dem char-Wert für 3.
                    // Lesezeichen des aktuellen Datensatzes speichern.
                    varBookmark = (Variant)rsTemp.getBookmark();
                    break;
                case 4:    // Gleich dem char-Wert für 4.
                    // Zu dem durch das gespeicherte Lesezeichen angegebenen
                    // Datensatz bewegen.
                    if (varBookmark == null)
                        System.out.println ("\nNo bookmark set!");
                    else
                        rsTemp.setBookmark((Object)varBookmark);
                    break;
                default:
                    break;
            }
        }
        catch( AdoException ae )
        {
            // Dem Benutzer aus ADO resultierende Fehler melden.

            // Beim Übergeben eines Recordsets zuerst auf NULL-Zeiger
            // überprüfen.
            if (rsTemp != null)
            {
                PrintProviderError(rsTemp.getActiveConnection());
            }
            else
            {
                System.out.println("Exception: " + ae.getMessage());
            }
        }
    }

    // PrintProviderError-Funktion

    static void PrintProviderError( Connection Cnn1 )
    {
        // Providerfehler aus dem Connection-Objekt drucken.
        // ErrItem ist ein Item-Objekt in der Errors-Auflistung
        // der Verbindung.
        com.ms.wfc.data.Error  ErrItem = null;
        long nCount = 0;
        int  i      = 0;

        nCount = Cnn1.getErrors().getCount();

        // Wenn sich in der Auflistung Fehler befinden, diese drucken.
        if( nCount > 0);
        {
            // Auflistung reicht von 0 bis nCount - 1
            for (i = 0; i< nCount; i++)
            {
                ErrItem = Cnn1.getErrors().getItem(i);
                System.out.println("\t Error number: " + ErrItem.getNumber()
                    + "\t" + ErrItem.getDescription() );
            }
        }

    }

    // PrintIOError-Funktion

    static void PrintIOError( java.io.IOException je)
    {
        System.out.println("Error \n");
        System.out.println("\tSource = " + je.getClass() + "\n");
        System.out.println("\tDescription = " + je.getMessage() + "\n");
    }

         ////////////////////////////////////////////
        //            BOFX2()-Funktion.           //
      ////////////////////////////////////////////

        public void BOFX2()
        {
            Recordset rs = null ;

        try
            {
                // Deklarationen.
                rs = new Recordset();
                Variant[] arrbmk = new Variant[11];
                rs.setCursorLocation( AdoEnums.CursorLocation.CLIENT);
                String strCnn = "Provider=MSDASQL;Data Source=Pubs DSN;"
                        + "Initial Catalog=pubs;User Id=sa;Password=;";
                rs.setActiveConnection (strCnn);
                // Recordset mit Daten aus der Authors-Tabelle öffnen.
                rs.open((new  String("SELECT * FROM authors")),strCnn,AdoEnums.CursorType.STATIC ,AdoEnums.LockType.BATCHOPTIMISTIC,AdoEnums.CommandType.TEXT );
                System.out.println ("\nNumber of records before filtering : " + rs.getRecordCount() );
                int ii = 0;

                // Lesezeichenarray erstellen.
                while (rs.getEOF() != true && ii < 11)
                {
                    arrbmk[ii] = (Variant)rs.getBookmark();
                    ii++;
                    rs.move (2);
                }

                // Filter auf Recordset festlegen.
                Variant bmk=new Variant();
                bmk.putVariantArray(arrbmk);
                rs.setFilter(bmk);
                System.out.println ("\nNumber of records after filtering : " + rs.getRecordCount() );

                // Die Datensätze nach dem Filtern anzeigen.
                rs.moveFirst();
                while (!rs.getEOF())
                {
                    System.out.println ("\t" +rs.getAbsolutePosition() + "  " +rs.getField("au_lname").getString());
                    rs.moveNext();
                }
                rs.close();
                System.out.println ("\n\nPress <Enter> key to continue.");
                in.readLine();

            }
            catch( AdoException ae )
            {
                // Dem Benutzer aus ADO resultierende Fehler melden.

                // Beim Übergeben eines Recordsets zuerst auf NULL-Zeiger
                // überprüfen.
                if (rs != null)
                {
                    PrintProviderError(rs.getActiveConnection());
                    System.out.println("Exception: " + ae.getMessage());
                }
                else
                {
                    System.out.println("Exception: " + ae.getMessage());
                }
            }
            // Systemlesevorgang erfordert diesen Catch-Vorgang
            catch( java.io.IOException je )
            {
                PrintIOError(je);
            }
        }
    }


Beispiel für die CacheSize-Eigenschaft (VJ++)

In diesem Beispiel wird die CacheSize-Eigenschaft verwendet, um die unterschiedliche Leistung bei einer Operation mit und ohne Zwischenspeicher mit 30 Datensätzen zu verdeutlichen.

import com.ms.wfc.data.*;
import java.io.* ;

public class CacheSizeX
{
    // Der Haupteinstiegspunkt für die Anwendung.

    public static void main (String[] args)
    {
        CacheSizeX();
        System.exit(0);
    }

    // CacheSizeX-Funktion

    static void CacheSizeX()
    {

        // ADO-Objekte definieren.
        Recordset rstRoySched = null;

        // Deklarationen.
        BufferedReader in =
            new BufferedReader (new InputStreamReader(System.in));
        String line = null;
        String strCnn = "Provider=sqloledb;Data Source=srv;"
            + "Initial Catalog=Pubs;User Id=sa;Password=;";

        long timeStart;
        long timeEnd;
        float timeNoCache;
        float timeCache;
        int   intLoop;
        String strTemp;

        try
        {
            // Die RoySched-Tabelle öffnen.
            rstRoySched = new Recordset();
            rstRoySched.open("roysched", strCnn,
                AdoEnums.CursorType.FORWARDONLY,
                AdoEnums.LockType.READONLY,
                AdoEnums.CommandType.TABLE);

            // Das Recordset-Objekt zweimal aufzählen und die verstrichene
        // Zeit aufzeichnen.

            timeStart = System.currentTimeMillis();
            for ( intLoop = 0; intLoop < 2; intLoop++)
            {
                rstRoySched.moveFirst();
                while (!rstRoySched.getEOF())
                {
                    // Einen einfachen Vorgang für den Leistungstest
                    // ausführen.
                    strTemp = rstRoySched.getField("title_id").getString();
                    rstRoySched.moveNext();
                }

            }

            timeEnd = System.currentTimeMillis();
            timeNoCache =(float)(timeEnd - timeStart)/1000f;

            // Die Datensätze in Dreißigergruppen zwischenspeichern.
            rstRoySched.moveFirst();
            rstRoySched.setCacheSize(30);
            timeStart = System.currentTimeMillis();

            // Das Recordset-Objekt zweimal aufzählen und die verstrichene
// Zeit aufzeichnen.
            for ( intLoop = 0; intLoop < 2; intLoop++)
            {
                rstRoySched.moveFirst();
                while (!rstRoySched.getEOF())
                {
                    // Einen einfachen Vorgang für den Leistungstest
                    // ausführen.

                    strTemp = rstRoySched.getField("title_id").getString();
                    rstRoySched.moveNext();
                }

            }

            timeEnd = System.currentTimeMillis();
            timeCache = (float)(timeEnd - timeStart)/1000f;

            // Die Leistungsergebnisse anzeigen.
            System.out.println("\nCaching Performance Results:");
            System.out.println("\n\tNo Cache: " + timeNoCache + " seconds");
            System.out.println("\n\t30-record cache: " + timeCache +
                " seconds");
            System.out.println("\n\nPress <Enter> to continue..");
            in.readLine();

            // Cleanup der Objekte vor dem Beenden.
            rstRoySched.close();

        }
        catch( AdoException ae )
        {
            // Den Benutzer ggf. über von ADO stammende Fehler
// benachrichtigen.

            // Auf NULL-Zeiger für das Connection-Objekt prüfen.
            if (rstRoySched.getActiveConnection()==null)
                System.out.println("Exception: " + ae.getMessage());

            // Beim Bearbeiten eines Recordsets zunächst auf
             // NULL-Zeiger prüfen.
            if (rstRoySched != null)
            {
                PrintProviderError(rstRoySched.getActiveConnection());
            }
            else
            {
                System.out.println("Exception: " + ae.getMessage());
            }
        }

        // Der Systemlesevorgang erfordert diesen Catch-Aufruf.
        catch( java.io.IOException je)
        {
            PrintIOError(je);
        }

    }

    // PrintProviderError-Funktion

    static void PrintProviderError( Connection Cnn1 )
    {
        // Vom Connection-Objekt stammende Providerfehler drucken.
        // ErrItem ist ein Elementobjekt in der Errors-Auflistung des
    // Connection-Objekts.
        com.ms.wfc.data.Error  ErrItem = null;
        long nCount = 0;
        int  i      = 0;

        nCount = Cnn1.getErrors().getCount();

        // Ggf. die Fehler in der Auflistung drucken.
        if( nCount > 0);
        {
            // Die Auflistung hat den Bereich 0 bis nCount - 1
            for (i = 0; i< nCount; i++)
            {
                ErrItem = Cnn1.getErrors().getItem(i);
                System.out.println("\t Error number: " + ErrItem.getNumber()
                    + "\t" + ErrItem.getDescription() );
            }
        }

    }

    // PrintIOError-Funktion

    static void PrintIOError( java.io.IOException je)
    {
        System.out.println("Error \n");
        System.out.println("\tSource = " + je.getClass() + "\n");
        System.out.println("\tDescription = " + je.getMessage() + "\n");
    }
}


Beispiel für die Cancel-Methode (VJ++)

In diesem Beispiel wird die Cancel-Methode zum Abbrechen eines in einem Connection-Objekt ausgeführten Befehls verwendet, wenn die Verbindung belegt ist.

import com.ms.wfc.data.*;
import java.io.* ;

public class CancelX
{
    // Der Haupteinstiegspunkt für die Anwendung.

    public static void main (String[] args)
    {
        CancelX();
        System.exit(0);
    }

    // CancelX-Funktion

    static void CancelX()
    {
        // Befehlszeichenfolgen definieren.
        String strCmdChange = "UPDATE titles SET type = 'self_help' "
            + "WHERE type = 'psychology'";
        String strCmdRestore = "UPDATE titles SET type = 'psychology' "
            + "WHERE type = 'self_help'";
        String strCnn = "Provider=sqloledb;Data Source=srv;"
            + "Initial Catalog=Pubs;User Id=sa;Password=;";

        // ADO-Objekte definieren.
        Connection cnConn1 = null;

        //Deklarationen.
        boolean booChanged = false;
        BufferedReader in =
            new BufferedReader (new InputStreamReader(System.in));
        String line = null;

        try
        {
            // Eine Verbindung öffnen.
            cnConn1 = new Connection();
            cnConn1.open(strCnn);

            // Eine Transaktion beginnen und dann einen Befehl asynchron
// ausführen.
            cnConn1.beginTrans();
            cnConn1.execute(strCmdChange,
                AdoEnums.ExecuteOption.ASYNCEXECUTE);

            // Dies ist eine kleine Warteschleife, sie könnte verändert
// werden.

            for (int intLoop = 0; intLoop < 10; intLoop++)
            {
                System.out.println(intLoop);
            }

            // Wenn der Befehl nicht abgeschlossen wurde, die Ausführung
// abbrechen und einen Rollback für die Transaktion ausführen.
// Andernfalls einen Commit für die Transaktion ausführen.

            if ((cnConn1.getState() & AdoEnums.ObjectState.EXECUTING) > 0)
            {
                cnConn1.cancel();
                cnConn1.rollbackTrans();
                booChanged = false;
                System.out.println("\nUpdate canceled.");
            }
            else
            {
                cnConn1.commitTrans();
                booChanged = true;
                System.out.println("\nUpdate complete.");
            }

            // Die Daten wiederherstellen, falls sie verändert wurden,
            // da es sich um ein Beispiel handelt.

            if(booChanged )
            {
                cnConn1.execute(strCmdRestore);
                System.out.println("\nData restored.");
            }

            System.out.println("\n\nPress <Enter> to continue..");
            in.readLine();

            // Cleanup der Objekte vor dem Beenden.
            cnConn1.close();

        }
        catch( AdoException ae )
        {
            // Den Benutzer ggf. über von ADO stammende Fehler
// benachrichtigen.

            // Beim Bearbeiten einer Verbindung zunächst auf
             // NULL-Zeiger prüfen.
            if (cnConn1 != null)
            {
                PrintProviderError(cnConn1);
            }
            else
            {
                System.out.println("Exception: " + ae.getMessage());
            }
        }

        // Der Systemlesevorgang erfordert diesen Catch-Aufruf.
        catch( java.io.IOException je)
        {
            PrintIOError(je);
        }
    }

    // PrintProviderError-Funktion

    static void PrintProviderError( Connection Cnn1 )
    {
        // Vom Connection-Objekt stammende Providerfehler drucken.
        // ErrItem ist ein Elementobjekt in der Errors-Auflistung des
        // Connection-Objekts.
        com.ms.wfc.data.Error  ErrItem = null;
        long nCount = 0;
        int  i      = 0;

        nCount = Cnn1.getErrors().getCount();

        // Ggf. die Fehler in der Auflistung drucken.
        if( nCount > 0);
        {
            // Die Auflistung hat den Bereich 0 bis nCount - 1
            for (i = 0; i< nCount; i++)
            {
                ErrItem = Cnn1.getErrors().getItem(i);
                System.out.println("\t Error number: " + ErrItem.getNumber()
                    + "\t" + ErrItem.getDescription() );
            }
        }

    }

    // PrintIOError-Funktion

    static void PrintIOError( java.io.IOException je)
    {
        System.out.println("Error \n");
        System.out.println("\tSource = " + je.getClass() + "\n");
        System.out.println("\tDescription = " + je.getMessage() + "\n");
    }
}


Beispiel für die Clone-Methode (VJ++)

In diesem Beispiel wird die Clone-Methode zum Erstellen von Kopien eines Recordset-Objekts verwendet. Anschließend kann der Datensatzzeiger unabhängig auf jede einzelne Kopie gesetzt werden.

import com.ms.wfc.data.*;
import java.io.* ;

public class CloneX
{
    // Der Haupteinstiegspunkt für die Anwendung.

    public static void main (String[] args)
    {
        CloneX();
        System.exit(0);
    }

    // CloneX-Funktion

    static void CloneX()
    {
        // Die SQL-Anweisung und die Verbindungszeichenfolge an Variablen
// zuweisen.
        String strSQL = "SELECT stor_name FROM Stores "
            + "ORDER BY stor_name";

        String strCnn = "Provider=sqloledb;Data Source=srv;"
            + "Initial Catalog=Pubs;User Id=sa;Password=;";

        // ADO-Objekte definieren.
        Recordset[] arstStores = null;

        //Deklarationen.
        BufferedReader in =
            new BufferedReader (new InputStreamReader(System.in));
        String line = null;
        String strMessage;
        String strFind;
        int  intLoop;
        boolean booExit = true;

        try
        {
            // Ein Recordset mit einem statischen Cursor öffnen.
            arstStores = new Recordset[3];
            arstStores[0] = new Recordset();
            arstStores[0].setCursorType(AdoEnums.CursorType.STATIC);
            arstStores[0].setLockType(AdoEnums.LockType.BATCHOPTIMISTIC);
            arstStores[0].open(strSQL,strCnn,AdoEnums.CursorType.STATIC,
                AdoEnums.LockType.BATCHOPTIMISTIC,AdoEnums.CommandType.TEXT);

            // Das ursprüngliche Recordset zweimal klonen.
            arstStores[1] = (Recordset)arstStores[0].clone
                (AdoEnums.LockType.BATCHOPTIMISTIC);
            arstStores[2] = (Recordset)arstStores[0].clone
                (AdoEnums.LockType.BATCHOPTIMISTIC);

            while(booExit)
            {
                // Schleife durch das Array, so dass der Benutzer bei jedem
// Durchlauf ein anderes Exemplar desselben Recordsets
// durchsucht.
                for (intLoop = 0; intLoop < 3; intLoop++)
                {
                    // Den Benutzer nach der zu suchenden Zeichenfolge fragen
// und dabei für jedes Recordset anzeigen, wo sich der
// aktuelle Zeiger befindet
                    strMessage = "\nRecordsets from stores table:" + "\n"
                        +  "  1 - Original - Record pointer at "
                        + arstStores[0].getField("stor_name").getString()
                        + "\n" + "  2 - Clone - Record pointer at "
                        + arstStores[1].getField("stor_name").getString()
                        + "\n" + "  3 - Clone - Record pointer at "
                        + arstStores[2].getField("stor_name").getString()
                        + "\n";
                    System.out.println(strMessage);
                    System.out.println("Enter search string for #"
                        + (intLoop+1) + "(Press <Enter> to Exit.)");

                    if((strFind = in.readLine().trim()) == null)
                    {
                        booExit = false;
                        break;
                    }

                    // Nach der zu suchenden Zeichenfolge suchen. Falls keine
// Übereinstimmung gefunden wird, zum letzten Datensatz
// springen.
                    arstStores[intLoop].setFilter("stor_name >= '" +
                        strFind + "'");
                    if (arstStores[intLoop].getEOF())
                    {
                        arstStores[intLoop].setFilter
                            (new Integer(AdoEnums.FilterGroup.NONE));
                        arstStores[intLoop].moveLast();
                    }
                }
            }
            // Cleanup der Objekte vor dem Beenden.
            arstStores[0].close();
            arstStores[1].close();
            arstStores[2].close();
        }
        catch( AdoException ae )
        {
            // Den Benutzer ggf. über von ADO stammende Fehler
// benachrichtigen.

            // Beim Bearbeiten einer Verbindung zunächst auf
             // NULL-Zeiger prüfen.
            if (arstStores[0] != null)
            {
                PrintProviderError(arstStores[0].getActiveConnection());
            }
            else
            {
                System.out.println("Exception: " + ae.getMessage());
            }
        }

        // Der Systemlesevorgang erfordert diesen Catch-Aufruf.
        catch( java.io.IOException je)
        {
            PrintIOError(je);
        }

    }

    // PrintProviderError-Funktion

    static void PrintProviderError( Connection Cnn1 )
    {
        // Vom Connection-Objekt stammende Providerfehler drucken.
        // ErrItem ist ein Elementobjekt in der Errors-Auflistung des
    // Connection-Objekts.
        com.ms.wfc.data.Error  ErrItem = null;
        long nCount = 0;
        int  i      = 0;

        nCount = Cnn1.getErrors().getCount();

        // Ggf. die Fehler in der Auflistung drucken.
        if( nCount > 0);
        {
            // Die Auflistung hat den Bereich 0 bis nCount - 1
            for (i = 0; i< nCount; i++)
            {
                ErrItem = Cnn1.getErrors().getItem(i);
                System.out.println("\t Error number: " + ErrItem.getNumber()
                    + "\t" + ErrItem.getDescription() );
            }
        }

    }

    // PrintIOError-Funktion

    static void PrintIOError( java.io.IOException je)
    {
        System.out.println("Error \n");
        System.out.println("\tSource = " + je.getClass() + "\n");
        System.out.println("\tDescription = " + je.getMessage() + "\n");
    }
}


Beispiel für die CompareBookmarks-Methode (VJ++)

Dieses Beispiel verdeutlicht die CompareBookmarks-Methode. Der relative Wert von Lesezeichen wird selten benötigt, es sei denn, es handelt sich um ein spezielles Lesezeichen.

Bestimmen Sie als Suchziel eine zufällige Zeile eines Recordset-Objekts aus der Authors-Tabelle. Zeigen Sie anschließend die Position der einzelnen Zeilen relativ zum Ziel an.

import com.ms.wfc.data.*;
import java.io.* ;
import com.ms.com.*;

public class CompareBookmarksX //
{
    // Der Haupteinstiegspunkt für die Anwendung.

    public static void main (String[] args)
    {
        CompareBookmarksX();
        System.exit(0);
    }

    // CompareBookmarksX-Funktion

    static void CompareBookmarksX()
    {
        // ADO-Objekte definieren.
        Recordset rstAuthors = null;

        // Deklarationen.
        BufferedReader in =
            new BufferedReader (new InputStreamReader(System.in));
        String strCnn = "DSN=Pubs;Provider=MSDASQL;uid=sa;pwd=;";
        int intCount;
        Variant varTarget = null;
        int intResult;
        String strAns;
        int intDisplaySize = 15;

        try
        {
            rstAuthors = new Recordset();
            rstAuthors.open("SELECT * FROM authors",
                strCnn,
                AdoEnums.CursorType.STATIC,
                AdoEnums.LockType.READONLY,
                AdoEnums.CommandType.TEXT);
            intCount = rstAuthors.getRecordCount();
            System.out.println("Rows in the Recordset = " +
                Integer.toString(intCount));

            // Beenden, falls das Recordset leer ist.
            if(intCount == 0)
                System.exit(0);

            // Einen Zufalls-Generator verwenden.
            intCount = (int)(intCount * Math.random());
            // Eine Position zwischen 0 und count-1 abrufen.
            System.out.println("\nRandomly chosen row position = " +
                Integer.toString(intCount)+ "\n");
            rstAuthors.move(intCount,new Integer(AdoEnums.Bookmark.FIRST));             // Zu einer zufälligen Position bewegen.
            varTarget = (Variant)rstAuthors.getBookmark();
            // Die zufällige Zeile speichern.
            intCount = 0;
            rstAuthors.moveFirst();

            // Schleife durch das Recordset.
            while(!rstAuthors.getEOF())
            {
                intResult = rstAuthors.compareBookmarks
                    ((Variant)rstAuthors.getBookmark(), varTarget);
                if(intResult == AdoEnums.Compare.NOTEQUAL)
                    System.out.println("Row " +
                        Integer.toString(intCount) +
                        ": Bookmarks are not equal.");
                else if(intResult == AdoEnums.Compare.NOTCOMPARABLE)
                    System.out.println("Row " +
                        Integer.toString(intCount) +
                        ": Bookmarks are not comparable.");
                else
                {
                    switch(intResult)
                    {
                    case AdoEnums.Compare.LESSTHAN :
                        strAns = "less than";
                        break;
                    case AdoEnums.Compare.EQUAL :
                        strAns = "equal to";
                        break;
                    case AdoEnums.Compare.GREATERTHAN :
                        strAns = "greater than";
                        break;
                    default :
                        strAns = "in error comparing to";
                        break;
                    }
                    System.out.println("Row position " +
                        Integer.toString(intCount) +
                        " is " + strAns + " the target.");
                }
                if(intCount % intDisplaySize == 0 && intCount > 0)
                {
                    System.out.println("\nPress <Enter> to continue..");
                    in.readLine();
                }
                intCount++;
                rstAuthors.moveNext();
            }

            // Cleanup der Objekte vor dem Beenden.
            rstAuthors.close();
            System.out.println("\nPress <Enter> to continue..");
            in.readLine();
        }
        catch( AdoException ae )
        {
            // Den Benutzer ggf. über von ADO stammende Fehler
// benachrichtigen.

            // Beim Bearbeiten eines Recordsets zunächst auf
             // NULL-Zeiger prüfen.
            if (rstAuthors != null)
            {
                PrintProviderError(rstAuthors.getActiveConnection());
            }
            else
            {
                System.out.println("Exception: " + ae.getMessage());
            }
        }

        // Der Systemlesevorgang erfordert diesen Catch-Aufruf.
        catch( java.io.IOException je)
        {
            PrintIOError(je);
        }
    }

    // PrintProviderError-Funktion

    static void PrintProviderError( Connection Cnn1 )
    {
        // Vom Connection-Objekt stammende Providerfehler drucken.
        // ErrItem ist ein Elementobjekt in der Errors-Auflistung des
    // Connection-Objekts.
        com.ms.wfc.data.Error  ErrItem = null;
        long nCount = 0;
        int  i      = 0;

        nCount = Cnn1.getErrors().getCount();

        // Ggf. die Fehler in der Auflistung drucken.
        if( nCount > 0);
        {
            // Die Auflistung hat den Bereich 0 bis nCount - 1
            for (i = 0; i< nCount; i++)
            {
                ErrItem = Cnn1.getErrors().getItem(i);
                System.out.println("\t Error number: " + ErrItem.getNumber()
                    + "\t" + ErrItem.getDescription() );
            }
        }

    }

    // PrintIOError-Funktion

    static void PrintIOError( java.io.IOException je)
    {
        System.out.println("Error \n");
        System.out.println("\tSource = " + je.getClass() + "\n");
        System.out.println("\tDescription = " + je.getMessage() + "\n");
    }
}


Beispiel für die ConnectionString-, ConnectionTimeout- und State-Eigenschaften (VJ++)

Dieses Beispiel zeigt, wie Sie ein Connection-Objekt mit der ConnectionString-Eigenschaft auf unterschiedliche Art öffnen können. Darüber hinaus wird die ConnectionTimeout-Eigenschaft verwendet, um ein Zeitlimit für eine Verbindung festzulegen, und die State-Eigenschaft, um den Status der Verbindungen zu überprüfen. Zum Ausführen dieser Prozedur ist die GetState-Funktion erforderlich.

import com.ms.wfc.data.*;
import java.io.* ;

public class ConnectionStringX
{
    // Der Haupteinstiegspunkt für die Anwendung.

    public static void main (String[] args)
    {
        ConnectionStringX();
        System.exit(0);
    }

    // ConnectionStringX-Funktion

    static void ConnectionStringX()
    {
        // ADO-Objekte definieren.
        Connection cnConn1 = null;
        Connection cnConn2 = null;
        Connection cnConn3 = null;
        Connection cnConn4 = null;

        //Deklarationen.

        BufferedReader in =
            new BufferedReader (new InputStreamReader(System.in));
        String line = null;
        String strTemp;

        try
        {
            // Eine Verbindung ohne Verwenden eines Datenquellennamens
// (Data Source Name, DSN) öffnen.
            cnConn1 = new Connection();
            cnConn1.setConnectionString("driver={SQL Server};"
                + "server=srv;uid=sa;pwd=;database=Pubs");
            cnConn1.setCommandTimeout(30);
            cnConn1.open();

            // Eine Verbindung unter Verwendung eines DSN und von ODBC-Tags
// öffnen.
            cnConn2 = new Connection();
            cnConn2.setConnectionString("DSN=Pubs;UID=sa;PWD=;");
            cnConn2.open();

            // Eine Verbindung unter Verwendung eines DSN und von OLE DB-
// Tags öffnen.
            cnConn3 = new Connection();
            cnConn3.setConnectionString
                ("Data Source=Pubs;User ID=sa;Password=;");
            cnConn3.open();

            // Eine Verbindung unter Verwendung eines DSN und von
// individuellen Argumenten anstelle einer
// Verbindungszeichenfolge öffnen.
            cnConn4 = new Connection();
            cnConn4.open("Pubs", "sa", "");

            // Den Zustand der Verbindungen anzeigen.
            strTemp = getState(cnConn1.getState());
            System.out.println("CnConn1 state: " + strTemp);
            strTemp = getState(cnConn2.getState());
            System.out.println("CnConn2 state: " + strTemp);
            strTemp = getState(cnConn3.getState());
            System.out.println("CnConn3 state: " + strTemp);
            strTemp = getState(cnConn4.getState());
            System.out.println("CnConn4 state: " + strTemp);

            System.out.println("\n\nPress <Enter> to continue..");
            in.readLine();

            // Cleanup der Objekte vor dem Beenden.
            cnConn1.close();
            cnConn2.close();
            cnConn3.close();
            cnConn4.close();

        }
        catch( AdoException ae )
        {
            // Den Benutzer ggf. über von ADO stammende Fehler
// benachrichtigen.

            System.out.println("Exception: " + ae.getMessage());

        }

        // Der Systemlesevorgang erfordert diesen Catch-Aufruf.
        catch( java.io.IOException je)
        {
            PrintIOError(je);
        }
    }

    // getState-Funktion

    static String getState(int intState)
    {
        // Den aktuellen Status des Connection-Objekts zurückgeben.
        String strState=null;

        switch(intState)
        {
        case AdoEnums.ObjectState.CLOSED :
            strState = new String("adStateClosed");
            break;
        case AdoEnums.ObjectState.OPEN  :
            strState = new String("adStateOpen");
            break;
        default :
            break;
        }
        return strState;
    }

    // PrintIOError-Funktion

    static void PrintIOError( java.io.IOException je)
    {
        System.out.println("Error \n");
        System.out.println("\tSource = " + je.getClass() + "\n");
        System.out.println("\tDescription = " + je.getMessage() + "\n");
    }
}


Beispiel für die Count-Eigenschaft (VJ++)

Dieses Beispiel zeigt die Count-Eigenschaft mit zwei Auflistungen in der Employees-Tabelle. Die Eigenschaft erhält die Anzahl der Objekte in jeder Auflistung und legt die obere Grenze für Schleifen fest, die diese Auflistungen aufzählen. Diese Auflistungen können auch ohne die Count-Eigenschaft aufgezählt werden, indem For Each...Next-Anweisungen verwendet werden.

import com.ms.wfc.data.*;
import java.io.* ;

public class CountX
{
    // Der Haupteinstiegspunkt für die Anwendung.

    public static void main (String[] args)
    {
        CountX();
        System.exit(0);
    }

    // CountX-Funktion

    static void CountX()
    {

        // ADO-Objekte definieren.
        Recordset rstEmployees = null;

        // Deklarationen.
        BufferedReader in =
            new BufferedReader (new InputStreamReader(System.in));
        String line = null;
        String strCnn = "Provider=sqloledb;Data Source=srv;"
            + "Initial Catalog=Pubs;User Id=sa;Password=;";

        int intLoop;
        int intDisplaySize = 20;
        int recCount=0;

        try
        {
            rstEmployees = new Recordset();

            // Ein Recordset mit Daten aus der Employees-Tabelle öffnen.
            rstEmployees.open("employee", strCnn,
                AdoEnums.CursorType.FORWARDONLY,
                AdoEnums.LockType.READONLY,
                AdoEnums.CommandType.TABLE);

            // Informationen über die Fields-Auflistung drucken.
            System.out.println(rstEmployees.getFields().getCount() +
                " Fields in Employees");
            for ( intLoop = 0; intLoop <
                rstEmployees.getFields().getCount(); intLoop++)
            {
                System.out.println("\t" +
                    rstEmployees.getFields().getItem(intLoop).getName());
            }
            System.out.println("\n\nPress <Enter> to continue..");
            in.readLine();

            // Informationen über die Properties-Auflistung drucken.
            System.out.println(rstEmployees.getProperties().getCount() +
                " Properties in Employees");
            for ( intLoop = 0; intLoop <
                rstEmployees.getProperties().getCount(); intLoop++)
            {
                System.out.println("\t" +
                    rstEmployees.getProperties().getItem(intLoop).getName());
                recCount++;
                if ( recCount >= intDisplaySize)
                {
                    System.out.println("\n\nPress <Enter> to continue..");
                    in.readLine();
                    recCount = 0;
                }
            }
            System.out.println("\n\nPress <Enter> to continue..");
            in.readLine();

            // Cleanup der Objekte vor dem Beenden.
            rstEmployees.close();

        }
        catch( AdoException ae )
        {
            // Den Benutzer ggf. über von ADO stammende Fehler
// benachrichtigen.

            // Auf NULL-Zeiger für das Connection-Objekt prüfen.
            if (rstEmployees.getActiveConnection()==null)
            {
                System.out.println("Exception: " + ae.getMessage());
            }
            else
            {
                // Beim Bearbeiten eines Recordsets zunächst auf
             // NULL-Zeiger prüfen.
                if (rstEmployees != null)
                {
                    PrintProviderError(rstEmployees.getActiveConnection());
                }
                else
                {
                    System.out.println("Exception: " + ae.getMessage());
                }
            }
        }

        // Der Systemlesevorgang erfordert diesen Catch-Aufruf.
        catch( java.io.IOException je)
        {
            PrintIOError(je);
        }
    }

    // PrintProviderError-Funktion

    static void PrintProviderError( Connection Cnn1 )
    {
        // Vom Connection-Objekt stammende Providerfehler drucken.
        // ErrItem ist ein Elementobjekt in der Errors-Auflistung des
    // Connection-Objekts.
        com.ms.wfc.data.Error  ErrItem = null;
        long nCount = 0;
        int  i      = 0;

        nCount = Cnn1.getErrors().getCount();

        // Ggf. die Fehler in der Auflistung drucken.
        if( nCount > 0);
        {
            // Die Auflistung hat den Bereich 0 bis nCount - 1
            for (i = 0; i< nCount; i++)
            {
                ErrItem = Cnn1.getErrors().getItem(i);
                System.out.println("\t Error number: " + ErrItem.getNumber()
                    + "\t" + ErrItem.getDescription() );
            }
        }

    }

    // PrintIOError-Funktion

    static void PrintIOError( java.io.IOException je)
    {
        System.out.println("Error \n");
        System.out.println("\tSource = " + je.getClass() + "\n");
        System.out.println("\tDescription = " + je.getMessage() + "\n");
    }
}


Beispiel für die CursorType-, LockType- und EditMode-Eigenschaften (VJ++)

In diesem Beispiel wird gezeigt, wie die Eigenschaften CursorType und LockType vor dem Öffnen eines Recordset-Objekts gesetzt werden. Das Beispiel zeigt auch den Wert der EditMode-Eigenschaft unter verschiedenen Bedingungen. Zum Ausführen dieser Prozedur ist die EditModeOutput-Funktion erforderlich.

import com.ms.wfc.data.*;
import java.io.* ;

public class EditModeX
{
    // Der Haupteinstiegspunkt für die Anwendung.

    public static void main (String[] args)
    {
        EditModeX ();
        System.exit(0);
    }

    // EditModeX-Funktion

    static void EditModeX ()
    {

        // ADO-Objekte definieren.
        Connection cnConn1 = null;
        Recordset rstEmployees = null;

        // Deklarationen.
        BufferedReader in =
            new BufferedReader (new InputStreamReader(System.in));
        String line = null;
        String strCnn = "Provider=sqloledb;Data Source=srv;"
                + "Initial Catalog=Pubs;User Id=sa;Password=;";

        try
        {
            // Ein Recordset mit Daten aus der Employees-Tabelle öffnen.

            cnConn1 = new Connection();
            cnConn1.open(strCnn);
            rstEmployees = new Recordset();
            rstEmployees.setActiveConnection(cnConn1);
            rstEmployees.setCursorLocation(AdoEnums.CursorLocation.CLIENT);
            rstEmployees.setCursorType(AdoEnums.CursorType.STATIC);
            rstEmployees.setLockType(AdoEnums.LockType.BATCHOPTIMISTIC);
            rstEmployees.open("employee", cnConn1,
                AdoEnums.CursorType.STATIC,
                AdoEnums.LockType.BATCHOPTIMISTIC,
                AdoEnums.CommandType.TABLE);

            // Die EditMode-Eigenschaft bei verschiedenen
// Bearbeitungszuständen anzeigen.

            rstEmployees.addNew();
            rstEmployees.getField("emp_id").setString("T-T55555M");
            rstEmployees.getField("fname").setString("temp_fname");
            rstEmployees.getField("lname").setString("temp_lname");
            EditModeOutput("After AddNew:", rstEmployees.getEditMode());
            rstEmployees.updateBatch();
            EditModeOutput("After Update:", rstEmployees.getEditMode());
            rstEmployees.getField("fname").setString("test");
            EditModeOutput("After Edit:", rstEmployees.getEditMode());

            System.out.println("\n\nPress <Enter> to continue..");
            in.readLine();

            // Den neuen Datensatz löschen, da es sich um ein Beispiel
// handelt.
            cnConn1.execute(
                "DELETE FROM employee WHERE emp_id = 'T-T55555M'");

            // Cleanup der Objekte vor dem Beenden.
            rstEmployees.close();
            cnConn1.close();

        }
        catch( AdoException ae )
        {
            // Den Benutzer ggf. über von ADO stammende Fehler
// benachrichtigen.

            // Auf NULL-Zeiger für das Connection-Objekt prüfen.
            if (cnConn1==null)
                System.out.println("Exception: " + ae.getMessage());

            // Beim Bearbeiten eines Recordsets zunächst auf
// NULL-Zeiger prüfen.
            if (rstEmployees != null)
            {
                PrintProviderError(rstEmployees.getActiveConnection());
            }
            else
            {
                System.out.println("Exception: " + ae.getMessage());
            }
        }

        // Der Systemlesevorgang erfordert diesen Catch-Aufruf.
        catch( java.io.IOException je)
        {
            PrintIOError(je);
        }
    }

    // EditModeOutput-Funktion

    static void EditModeOutput(String strTemp, int intEditMode)
    {
        String strMessage="";
        // Einen Bericht auf der Grundlage des Wertes der
// EditMode-Eigenschaft drucken.

        System.out.println("\n" + strTemp);
        strMessage ="\n\tEditMode = ";
        switch(intEditMode)
        {
        case AdoEnums.EditMode.NONE :
            strMessage+="adEditNone";
            break;
        case AdoEnums.EditMode.INPROGRESS :
            strMessage+="adEditInProgress";
            break;
        case AdoEnums.EditMode.ADD :
            strMessage+="adEditAdd";
            break;
        default :
            break;
        }
        System.out.println(strMessage);
    }

    // PrintProviderError-Funktion

    static void PrintProviderError( Connection Cnn1 )
    {
        // Vom Connection-Objekt stammende Providerfehler drucken.
        // ErrItem ist ein Elementobjekt in der Errors-Auflistung des
        // Connection-Objekts.
        com.ms.wfc.data.Error  ErrItem = null;
        long nCount = 0;
        int  i      = 0;

        nCount = Cnn1.getErrors().getCount();

        // Ggf. die Fehler in der Auflistung drucken.
        if( nCount > 0);
        {
            // Die Auflistung hat den Bereich 0 bis nCount - 1
            for (i = 0; i< nCount; i++)
            {
                ErrItem = Cnn1.getErrors().getItem(i);
                System.out.println("\t Error number: " + ErrItem.getNumber()
                    + "\t" + ErrItem.getDescription() );
            }
        }

    }

    // PrintIOError-Funktion

    static void PrintIOError( java.io.IOException je)
    {
        System.out.println("Error \n");
        System.out.println("\tSource = " + je.getClass() + "\n");
        System.out.println("\tDescription = " + je.getMessage() + "\n");
    }
}


Beispiel für die Delete-Methode (VJ++)

In diesem Beispiel wird die Delete-Methode zum Entfernen eines angegebenen Datensatzes aus einem Recordset-Objekt verwendet.

// Die WFC-Klasse schließt die ADO-Objekte ein.

import com.ms.wfc.data.*;
import java.io.* ;

public class DeleteX
{
    // Der Haupteinstiegspunkt für die Anwendung.

    public static void main (String[] args)
    {
        DeleteX();
        System.exit(0);
    }

    // DeleteX-Funktion

    static void DeleteX()
    {

        // ADO-Objekte definieren.
        Recordset rstRoySched = null;

        // Deklarationen.
        BufferedReader in =
            new BufferedReader (new InputStreamReader(System.in));
        String line = null;
        String strCnn = "Provider=sqloledb;Data Source=srv;"
            + "Initial Catalog=Pubs;User Id=sa;Password=;";

        String  strMessage="";
        String  strTitleID;
        int intLoRange =0;
        int intHiRange =0;
        int intRoyalty =0;
        boolean bolFound;

        try
        {
            rstRoySched = new Recordset();
            rstRoySched.setCursorLocation(AdoEnums.CursorLocation.CLIENT);
            rstRoySched.setCursorType(AdoEnums.CursorType.STATIC);
            rstRoySched.setLockType(AdoEnums.LockType.BATCHOPTIMISTIC);

            // Die RoySched-Tabelle öffnen.
            rstRoySched.open("SELECT * FROM roysched " +
                "WHERE royalty = 20", strCnn,
                AdoEnums.CursorType.STATIC,
                AdoEnums.LockType.BATCHOPTIMISTIC,
                AdoEnums.CommandType.TEXT);

            // Den Benutzer nach einem zu löschenden Datensatz fragen.
            strMessage = "Before delete there are "
                + rstRoySched.getRecordCount()
                + " titles with 20 percent royalty:" + "\n\n";
            while(!rstRoySched.getEOF())
            {
                strMessage += rstRoySched.getField("title_id").getString() +
                    "\n\n";
                rstRoySched.moveNext();
            }
            strMessage += "Enter the ID of a record to delete:" + "\n";
            System.out.println(strMessage);
            strTitleID = in.readLine().trim().toUpperCase();

            // Zum Datensatz bewegen und die Daten für eine spätere
            // Wiederherstellung speichern.
            rstRoySched.setFilter("title_id = '" + strTitleID + "'");
            if(!(rstRoySched.getRecordCount()==0))
            {
                intLoRange = rstRoySched.getField("lorange").getInt();
                intHiRange = rstRoySched.getField("hirange").getInt();
                intRoyalty = rstRoySched.getField("royalty").getInt();
                bolFound = true;
            }
            else
            {
                System.out.println("\nIncorrect ID. No Record deleted." );
                bolFound = false;
            }

            // Den Datensatz löschen.
            if(bolFound)
            {
                rstRoySched.delete();
                rstRoySched.updateBatch();
            }
            // Die Ergebnisse anzeigen.
            rstRoySched.setFilter(new Integer(AdoEnums.FilterGroup.NONE));
            rstRoySched.requery();
            strMessage ="";
            strMessage = "\n\nAfter delete there are "
                + rstRoySched.getRecordCount()
                + " titles with 20 percent royalty:" + "\n\n";
            while(!rstRoySched.getEOF())
            {
                strMessage += rstRoySched.getField("title_id").getString() +
                    "\n\n";
                rstRoySched.moveNext();
            }
            System.out.println(strMessage);
            System.out.println("\nPress <Enter> to continue..");
            in.readLine();

            // Die Daten wiederherstellen, da es sich um ein Beispiel
// handelt.
            if(bolFound)
            {
                rstRoySched.addNew();
                rstRoySched.getField("title_id").setString(strTitleID);
                rstRoySched.getField("lorange").setInt(intLoRange);
                rstRoySched.getField("hirange").setInt(intHiRange);
                rstRoySched.getField("royalty").setInt(intRoyalty);
                rstRoySched.updateBatch();
            }

            // Cleanup der Objekte vor dem Beenden.
            rstRoySched.close();

        }
        catch( AdoException ae )
        {
            // Den Benutzer ggf. über von ADO stammende Fehler
// benachrichtigen.

            // Beim Bearbeiten eines Recordsets zunächst auf
             // NULL-Zeiger prüfen.
                if (rstRoySched != null)
                {
                    PrintProviderError(rstRoySched.getActiveConnection());
                    System.out.println("Exception: " + ae.getMessage());
                }
                else
                {
                    System.out.println("Exception: " + ae.getMessage());
                }

        }

        // Der Systemlesevorgang erfordert diesen Catch-Aufruf.
        catch( java.io.IOException je)
        {
            PrintIOError(je);
        }

    }

    // PrintProviderError-Funktion

    static void PrintProviderError( Connection Cnn1 )
    {
        // Vom Connection-Objekt stammende Providerfehler drucken.
        // ErrItem ist ein Elementobjekt in der Errors-Auflistung des
         // Connection-Objekts.
        com.ms.wfc.data.Error  ErrItem = null;
        long nCount = 0;
        int  i      = 0;

        nCount = Cnn1.getErrors().getCount();

        // Ggf. die Fehler in der Auflistung drucken.
        if( nCount > 0);
        {
            // Die Auflistung hat den Bereich 0 bis nCount - 1
            for (i = 0; i< nCount; i++)
            {
                ErrItem = Cnn1.getErrors().getItem(i);
                System.out.println("\t Error number: " + ErrItem.getNumber()
                    + "\t" + ErrItem.getDescription() );
            }
        }

    }

    // PrintIOError-Funktion

    static void PrintIOError( java.io.IOException je)
    {
        System.out.println("Error \n");
        System.out.println("\tSource = " + je.getClass() + "\n");
        System.out.println("\tDescription = " + je.getMessage() + "\n");
    }
}


Beispiel für die Description-, NativeError-, Number-, Source- und SQLState-Eigenschaften (VJ++)

In diesem Beispiel wird ein Fehler ausgelöst sowie aufgefangen, und es werden die Eigenschaften Description, HelpContext, HelpFile, NativeError, Number, Source und SQLState des resultierenden Error-Objekts angezeigt.

// Die WFC-Klasse schließt die ADO-Objekte ein.

import com.ms.wfc.data.*;
import java.io.* ;

public class DescriptionX
{
    // Der Haupteinstiegspunkt für die Anwendung.

    public static void main (String[] args)
    {
        DescriptionX();
        System.exit(0);
    }

    // DescriptionX-Funktion

    static void DescriptionX()
    {

        // ADO-Objekte definieren.
        Connection cnConn1 = null;

        try
        {
            // Einen Fehler absichtlich auslösen.
            cnConn1 = new Connection();
            cnConn1.open("nothing");
        }
        catch( AdoException ae )
        {
            // Den Benutzer ggf. über von ADO stammende Fehler
// benachrichtigen.
            PrintProviderError(cnConn1);
        }

    }

    // PrintProviderError-Funktion

    static void PrintProviderError( Connection Cnn1 )
    {
        // Vom Connection-Objekt stammende Providerfehler drucken.
        // ErrItem ist ein Elementobjekt in der Errors-Auflistung des
         // Connection-Objekts.
        com.ms.wfc.data.Error  ErrItem = null;
        long nCount = 0;
        int  i      = 0;

        nCount = Cnn1.getErrors().getCount();

        // Ggf. die Fehler in der Auflistung drucken.
        if( nCount > 0);
        {
            // Die Auflistung hat den Bereich 0 bis nCount - 1
            for (i = 0; i< nCount; i++)
            {
                ErrItem = Cnn1.getErrors().getItem(i);
                System.out.println("\t Error number: " + ErrItem.getNumber()
                    + "\t" + ErrItem.getDescription() );
            }
        }

    }

    // PrintIOError-Funktion

    static void PrintIOError( java.io.IOException je)
    {
        System.out.println("Error \n");
        System.out.println("\tSource = " + je.getClass() + "\n");
        System.out.println("\tDescription = " + je.getMessage() + "\n");
    }
}


Beispiel für die Execute-, Requery- und Clear-Methoden (VJ++)

In diesem Beispiel wird die Verwendung der Execute-Methode dargelegt, wenn sie von einem Command- sowie einem Connection-Objekt ausgeführt wird. Weiterhin wird die Requery-Methode zum Abrufen aktueller Daten in einem Recordset verwendet, und mit der Clear-Methode wird der Inhalt der Errors-Auflistung gelöscht. Damit diese Prozedur ausgeführt werden kann, werden die Prozeduren ExecuteCommand und PrintOutput benötigt.

// Die WFC-Klasse schließt die ADO-Objekte ein.
import com.ms.wfc.data.*;

public class ExecuteX
{
// Hauptfunktion

public static void main (String[] args)
{
    ExecuteX();
}

// ExecuteX-Funktion

static void ExecuteX()
{
    // Zeichenfolgenvariablen definieren.
    String strSQLChange = "UPDATE Titles SET Type = "
            + "'self_help' WHERE Type = 'psychology'";
    String strSQLRestore = "UPDATE Titles SET Type = "
            + "'psychology' WHERE Type = 'self_help'";
    String strCnn = "Provider=sqloledb;Data Source=Server4;"
            + "Initial Catalog=Pubs;User Id=sa;Password=;";

    // ADO-Objekte definieren.
    Connection  cnConn1    = null;
    Command  cmdChange  = null;
    Recordset  rsTitles  = null;

    try
    {
        // Eine Verbindung öffnen.
        cnConn1 = new Connection ();
        cnConn1.open(strCnn, "", "", AdoEnums.CommandType.UNSPECIFIED);

        // Ein Command-Objekt erstellen.
        cmdChange = new Command();
        cmdChange.setActiveConnection (cnConn1);
        cmdChange.setCommandText (strSQLChange);

        // Ein Recordset mit der Titles-Tabelle öffnen.
        rsTitles = new Recordset();
        rsTitles.open("Titles", cnConn1,
                      AdoEnums.CursorType.STATIC,
                      AdoEnums.LockType.OPTIMISTIC,
                      AdoEnums.CommandType.TABLE);

        // Einen Bericht mit den ursprünglichen Daten drucken.
        System.out.println("\n\n\tData in Titles table "
                           + "before executing the query: \n");
        PrintOutput(rsTitles);

        // Nicht zugehörige Fehler aus der Errors-Auflistung löschen.
        cnConn1.getErrors().clear();

        // Die ExecuteCommand-Subroutine zum Ausführen des
        // cmdChange-Befehls aufrufen.
        ExecuteCommand(cmdChange, rsTitles);

        // Einen Bericht mit den neuen Daten drucken.
        System.out.println("\n\n\tData in Titles table after "
            + "executing the query: \n");
        PrintOutput(rsTitles);

        // Die Execute-Methode des Connection-Objekts aufrufen, um eine
// SQL-Anweisung zur Datenwiederherstellung auszuführen.
        cnConn1.execute(strSQLRestore);

        // Einen Bericht mit den wiederhergestellten Daten drucken.
        System.out.println("\n\n\tData after executing the query "
            + "to restore the original information: \n");
        PrintOutput(rsTitles);

        // Cleanup der Objekte vor dem Beenden.
        rsTitles.close();
        cnConn1.close();
    }  // Die Try-Anweisung beenden.
    catch( AdoException ae )
    {
        // Den Benutzer ggf. über von ADO stammende Fehler
// benachrichtigen.

        // Beim Bearbeiten eines Recordsets zunächst auf
        // NULL-Zeiger prüfen.
        if (rsTitles != null)
        {
            PrintProviderError(rsTitles.getActiveConnection());
        }
        else
        {
            System.out.println("Exception: " + ae.getMessage());
        }
    }
}

// ExecuteCommand-Funktion

static void ExecuteCommand(Command cmdTemp, Recordset rstTemp)
{
    try
    {
        // Die CommandText-Eigenschaft war schon vor dem Aufruf der
// Funktion festgelegt.
        cmdTemp.setCommandType(AdoEnums.CommandType.TEXT);
        cmdTemp.execute();

        // Die aktuellen Daten durch erneutes Abfragen des
// Recordsets abrufen.
        rstTemp.requery(AdoEnums.CommandType.UNKNOWN);
    }
    catch( AdoException ae )
    {
        // Den Benutzer ggf. über von ADO stammende Fehler
// benachrichtigen.
        PrintProviderError(rstTemp.getActiveConnection());
    }
}

//  PrintOutput-Funktion

static void PrintOutput(Recordset rstTemp)
{
    // Sicherstellen, dass am Anfang des Recordsets befindlich.
    rstTemp.moveFirst();

    // Wenn EOF gilt, sind keine Daten vorhanden, und die Druckschleife
// wird übersprungen.
    if( rstTemp.getEOF() )
    {
        System.out.println("\tRecordset empty\n");
    }
    else
    {
        // Das Recordset aufzählen und Daten aus jedem Element drucken.
        while( !(rstTemp.getEOF()) )
        {
            // Die Variant-Zeichenfolge in einen konvertierbaren
// Zeichenfolgentyp konvertieren.
            System.out.println("\t"
                + rstTemp.getFields().getItem("Title").getValue() + " "
                + rstTemp.getFields().getItem("Type").getValue() + "\n");
            rstTemp.moveNext();
        }
    }
}

    // PrintProviderError-Funktion

    static void PrintProviderError( Connection Cnn1 )
    {
        // Vom Connection-Objekt stammende Providerfehler drucken.
        // ErrItem ist ein Elementobjekt in der Errors-Auflistung des
         // Connection-Objekts.
        com.ms.wfc.data.Error  ErrItem = null;
        long nCount = 0;
        int  i      = 0;

        nCount = Cnn1.getErrors().getCount();

        // Ggf. die Fehler in der Auflistung drucken.
        if( nCount > 0);
        {
            // Die Auflistung hat den Bereich 0 bis nCount - 1
            for (i = 0; i< nCount; i++)
            {
                ErrItem = Cnn1.getErrors().getItem(i);
                System.out.println("\t Error number: " + ErrItem.getNumber()
                    + "\t" + ErrItem.getDescription() );
            }
        }

    }

    // PrintIOError-Funktion

    static void PrintIOError( java.io.IOException je)
    {
        System.out.println("Error \n");
        System.out.println("\tSource = " + je.getClass() + "\n");
        System.out.println("\tDescription = " + je.getMessage() + "\n");
    }
}


Beispiel für die Filter- und RecordCount-Eigenschaften (VJ++)

In diesem Beispiel wird die Filter-Eigenschaft zum Öffnen eines neuen Recordset-Objekts auf der Grundlage einer angegebenen Bedingung verwendet, die auf ein vorhandenes Recordset-Objekt angewendet wird. Mit der RecordCount-Eigenschaft wird die Anzahl der Datensätze in den beiden Recordset-Objekten angezeigt. Zum Ausführen dieser Prozedur ist die FilterField-Funktion erforderlich.

// Die WFC-Klasse schließt die ADO-Objekte ein.

import com.ms.wfc.data.*;
import java.io.* ;

public class FilterX
{
    // Der Haupteinstiegspunkt für die Anwendung.

    public static void main (String[] args)
    {
        FilterX();
        FilterX2();
        System.exit(0);
    }

    // FilterX-Funktion
    static void FilterX()
    {

        // ADO-Objekte definieren.
        Recordset rstPublishers = null;
        Recordset rstPublishersCountry = null;

        // Deklarationen.
        BufferedReader in =
            new BufferedReader (new InputStreamReader(System.in));
        String line = null;
        String strCnn = "Provider=sqloledb;Data Source=srv;"
                + "Initial Catalog=Pubs;User Id=sa;Password=;";

        int intPublisherCount;
        String strCountry;
        String strMessage;

        try
        {
            rstPublishers = new Recordset();

            // Das Recordset mit Daten aus der Publishers-Tabelle öffnen.
            rstPublishers.setCursorType(AdoEnums.CursorType.STATIC);
            rstPublishers.open("publishers", strCnn,
                          AdoEnums.CursorType.STATIC,
                          AdoEnums.LockType.READONLY,
                          AdoEnums.CommandType.TABLE);

            // Das Recordset auffüllen.
            intPublisherCount = rstPublishers.getRecordCount();

            // Benutzereingaben abfragen.
            System.out.println("Enter a country to filter on:");
            strCountry = in.readLine().trim();

            if(!strCountry.equals(""))
            {
                // Ein gefiltertes Recordset-Objekt öffnen.
                rstPublishersCountry =
                    FilterField(rstPublishers, "Country", strCountry);
                if(rstPublishersCountry.getRecordCount()==0)
                    System.out.println("\nNo publishers from that country.");
                else
                {
                    // Die Anzahl der Datensätze für das ursprüngliche und für
// das gefilterte Recordset-Objekt drucken.
                    strMessage = "\nOrders in original recordset: " + "\n"
                        + intPublisherCount + "\n"
                        + "Orders in filtered recordset (Country = '"
                        + strCountry + "'): \n"
                        + rstPublishersCountry.getRecordCount();
                    System.out.println(strMessage);
                }
                rstPublishersCountry.close();
            }
            System.out.println("\n\nPress <Enter> to continue..");
            in.readLine();

            // Cleanup der Objekte vor dem Beenden.
            rstPublishers.close();

        }
        catch( AdoException ae )
        {
            // Den Benutzer ggf. über von ADO stammende Fehler
// benachrichtigen.

            // Beim Bearbeiten eines Recordsets zunächst auf
             // NULL-Zeiger prüfen.
            if (rstPublishers != null)
            {
                PrintProviderError(rstPublishers.getActiveConnection());
            }
            else
            {
                System.out.println("Exception: " + ae.getMessage());
            }

        }

        // Der Systemlesevorgang erfordert diesen Catch-Aufruf.
        catch( java.io.IOException je)
        {
            PrintIOError(je);
        }

    }

    // FilterField-Funktion

    static Recordset FilterField(Recordset rstTemp,String strField,
                                 String strFilter)
    {
        // Einen Filter für das angegebene Recordset-Objekt festlegen
        // und dann ein neues Recordset-Objekt öffnen.
        rstTemp.setFilter(strField + " = '" + strFilter + "'");
        return rstTemp;
    }

    // PrintProviderError-Funktion

    static void PrintProviderError( Connection Cnn1 )
    {
        // Vom Connection-Objekt stammende Providerfehler drucken.
        // ErrItem ist ein Elementobjekt in der Errors-Auflistung des
         // Connection-Objekts.
        com.ms.wfc.data.Error  ErrItem = null;
        long nCount = 0;
        int  i      = 0;

        nCount = Cnn1.getErrors().getCount();

        // Ggf. die Fehler in der Auflistung drucken.
        if( nCount > 0);
        {
            // Die Auflistung hat den Bereich 0 bis nCount - 1
            for (i = 0; i< nCount; i++)
            {
                ErrItem = Cnn1.getErrors().getItem(i);
                System.out.println("\t Error number: " + ErrItem.getNumber()
                    + "\t" + ErrItem.getDescription() );
            }
        }

    }

    // PrintIOError-Funktion

    static void PrintIOError( java.io.IOException je)
    {
        System.out.println("Error \n");
        System.out.println("\tSource = " + je.getClass() + "\n");
        System.out.println("\tDescription = " + je.getMessage() + "\n");
    }

    // FilterX2-Funktion

    static void FilterX2()
    {

        // ADO-Objekte definieren.
        Recordset rstPublishers = null;

        // Deklarationen.
        BufferedReader in =
            new BufferedReader (new InputStreamReader(System.in));
        String line = null;
        String strCnn = "Provider=sqloledb;Data Source=srv;"
                + "Initial Catalog=Pubs;User Id=sa;Password=;";

        try
        {
            rstPublishers = new Recordset();

            // Ein Recordset mit Daten aus der Publishers-Tabelle öffnen.
            rstPublishers.setCursorType(AdoEnums.CursorType.STATIC);
            rstPublishers.open("SELECT * FROM publishers " +
                                "WHERE Country = 'USA'", strCnn,
                                AdoEnums.CursorType.STATIC,
                                AdoEnums.LockType.READONLY,
                                AdoEnums.CommandType.TEXT);

            // Die aktuellen Daten im Recordset drucken.
            rstPublishers.moveFirst();
            while(!rstPublishers.getEOF())
            {
                System.out.println(rstPublishers.getField("pub_name").getString()
                               +", "
                               + rstPublishers.getField("country").getString());
                rstPublishers.moveNext();
            }
            System.out.println("\n\nPress <Enter> to continue..");
            in.readLine();

            // Cleanup der Objekte vor dem Beenden.
            rstPublishers.close();

        }
        catch( AdoException ae )
        {
            // Den Benutzer ggf. über von ADO stammende Fehler
// benachrichtigen.

            // Auf NULL-Zeiger für das Connection-Objekt prüfen.
            if (rstPublishers.getActiveConnection()==null)
            {
                    System.out.println("Exception: " + ae.getMessage());
            }
            else
            {
                // Beim Bearbeiten eines Recordsets zunächst auf
             // NULL-Zeiger prüfen.
                if (rstPublishers != null)
                {
                    PrintProviderError(rstPublishers.getActiveConnection());
                }
                else
                {
                    System.out.println("Exception: " + ae.getMessage());
                }
            }
        }

        // Der Systemlesevorgang erfordert diesen Catch-Aufruf.
        catch( java.io.IOException je)
        {
            PrintIOError(je);
        }

    }
}


Beispiel für die Find-Methode (VJ++)

Dieses Beispiel verwendet die Find-Methode des Recordset-Objekts, um die Anzahl der Geschäftstitel in der Pubs-Datenbank zu lokalisieren und aufzuzählen. Bei diesem Beispiel wird davon ausgegangen, dass der zugrunde liegende Provider eine ähnliche Funktionalität nicht unterstützt.

// Die WFC-Klasse schließt die ADO-Objekte ein.
import com.ms.wfc.data.*;
import java.io.* ;
import com.ms.com.*;

public class FindX
{
    // Der Haupteinstiegspunkt für die Anwendung.

    public static void main (String[] args)
    {
        FindX();
        System.exit(0);
    }

    // FindX-Funktion

    static void FindX()
    {

        // ADO-Objekte definieren.
        Connection cnConn1 = null;
        Recordset rstTitles = null;

        // Deklarationen.
        BufferedReader in =
            new BufferedReader (new InputStreamReader(System.in));
        String strCnn = "DSN=Pubs;Provider=MSDASQL;uid=sa;pwd=;";
        Variant varMark = null;
        int intCount = 0;

        try
        {
            cnConn1 = new Connection();
            cnConn1.open(strCnn);
            rstTitles = new Recordset();
            rstTitles.open("SELECT title_id FROM titles",
                    cnConn1,
                    AdoEnums.CursorType.STATIC,
                    AdoEnums.LockType.READONLY,
                    AdoEnums.CommandType.TEXT);

            // Die Standardparameter sind zur Vorwärtssuche in einem
// Recordset ausreichend.
            rstTitles.find("title_id LIKE 'BU%'");

            // Den aktuellen Datensatz überspringen, um dieselbe Zeile
// nicht wiederholt zu finden.
            // Das Lesezeichen ist redundant, da Find von der aktuellen
            // Position aus sucht.
            while(!rstTitles.getEOF()) // Fortfahren, falls der vorige
// Suchvorgang erfolgreich war.
            {
                System.out.println("Title ID: "
                                   + rstTitles.getField("title_id").getString());
                intCount++; // Den letzten gefundenen Titel mitzählen.
                varMark = (Variant)rstTitles.getBookmark();
                // Die aktuelle Position notieren.
                rstTitles.find("title_id LIKE 'BU%'",
                         1,
                         AdoEnums.SearchDirection.FORWARD,
                         varMark);
            }

            // Cleanup der Objekte vor dem Beenden.
            rstTitles.close();
            cnConn1.close();

            System.out.println("\nThe number of business titles is " +
                               Integer.toString(intCount));
            System.out.println("\nPress <Enter> to continue..");
            in.readLine();
        }
        catch( AdoException ae )
        {
            // Den Benutzer ggf. über von ADO stammende Fehler
// benachrichtigen.

            // Beim Bearbeiten eines Recordsets zunächst auf
             // NULL-Zeiger prüfen.
            if (rstTitles != null)
            {
                PrintProviderError(rstTitles.getActiveConnection());
            }
            else
            {
                System.out.println("Exception: " + ae.getMessage());
            }
        }

        // Der Systemlesevorgang erfordert diesen Catch-Aufruf.
        catch( java.io.IOException je)
        {
            PrintIOError(je);
        }

    }

    // PrintProviderError-Funktion

    static void PrintProviderError( Connection Cnn1 )
    {
        // Vom Connection-Objekt stammende Providerfehler drucken.
        // ErrItem ist ein Elementobjekt in der Errors-Auflistung des
         // Connection-Objekts.
        com.ms.wfc.data.Error  ErrItem = null;
        long nCount = 0;
        int  i      = 0;

        nCount = Cnn1.getErrors().getCount();

        // Ggf. die Fehler in der Auflistung drucken.
        if( nCount > 0);
        {
            // Die Auflistung hat den Bereich 0 bis nCount - 1
            for (i = 0; i< nCount; i++)
            {
                ErrItem = Cnn1.getErrors().getItem(i);
                System.out.println("\t Error number: " + ErrItem.getNumber()
                    + "\t" + ErrItem.getDescription() );
            }
        }

    }

    // PrintIOError-Funktion

    static void PrintIOError( java.io.IOException je)
    {
        System.out.println("Error \n");
        System.out.println("\tSource = " + je.getClass() + "\n");
        System.out.println("\tDescription = " + je.getMessage() + "\n");
    }
}


Beispiel für die GetRows-Methode (VJ++)

In diesem Beispiel wird die GetRows-Methode zum Abrufen einer festgelegten Anzahl von Zeilen aus einem Recordset-Objekt und zum Füllen eines Arrays mit den als Ergebnis angegebenen Daten verwendet. Die GetRows-Methode gibt in zwei Fällen weniger Daten als gewünscht zurück: Wenn entweder der EOF erreicht wurde oder die GetRows-Methode versucht hat, einen Datensatz abzurufen, der von einem anderen Benutzer gelöscht wurde. Die Funktion gibt nur im zweiten Fall den Wert False zurück. Die GetRowsOK-Funktion wird benötigt, damit diese Prozedur ausgeführt werden kann.

// Die WFC-Klasse schließt die ADO-Objekte ein.

import com.ms.wfc.data.*;
import java.io.* ;
import com.ms.com.*;

public class GetRowsX
{
     // Der Haupteinstiegspunkt für die Anwendung.

    static Variant avarRecords = null;

    public static void main (String[] args)
    {
        GetRowsX();
        System.exit(0);
    }

    // GetRowsX-Funktion

    static void GetRowsX()
    {

        // ADO-Objekte definieren.
        Recordset rstEmployees = null;

        // Deklarationen.
        BufferedReader in =
            new BufferedReader (new InputStreamReader(System.in));
        String line = null;
        String strCnn = "Provider=sqloledb;Data Source=srv;"
                + "Initial Catalog=Pubs;User Id=sa;Password=;";

        int intRows;
        int intRecord;
        int intUBound;
        int intDisplaysize = 15;

        try
        {
            // Ein Recordset mit Namen und Einstellungsdaten aus der
// Employees-Tabelle öffnen.
            rstEmployees = new Recordset();
            rstEmployees.open("SELECT fName, lName, hire_date " +
                                "FROM Employee ORDER BY lName", strCnn,
                                AdoEnums.CursorType.FORWARDONLY,
                                AdoEnums.LockType.READONLY,
                                AdoEnums.CommandType.TEXT);

            while(true)
            {
                // Benutzereingabe für die Zeilenanzahl abrufen.
                System.out.println(
                "\nEnter number of rows to retrieve. (<= 0 to Exit)");
                line = in.readLine().trim();

                // Den Zeichenfolgeneintrag nach Integer konvertieren.
                intRows = Integer.parseInt(line);

                // Die Anwendung beenden, falls intRows negativ oder 0 ist.
                if(intRows <= 0)
                    break;

                // Falls GetRowsOK erfolgreich ist, die Ergebnisse drucken;
// dabei anmerken, ob das Dateiende erreicht wurde.
                if(GetRowsOK(rstEmployees,intRows))
                {
                    SafeArray sa = avarRecords.toSafeArray();
                    intUBound = sa.getUBound(2);
                    if ( intRows > (intUBound + 1))
                        System.out.println("\n(Not enough records in " +
                            "Recordset to retrieve " + intRows + " rows.)");
                    System.out.println("\n" + (intUBound+ 1) +
                                       " records found.\n");

                    // Die abgerufenen Daten drucken.

                    for ( intRecord = sa.getLBound();
                         intRecord  <= intUBound; intRecord++)
                    {

                        System.out.println(
                            " " + sa.getString(0, intRecord) + " " +
                            sa.getString(1, intRecord) + ", " +
                            sa.getString(2, intRecord));
                        if ( ((intRecord +1) % intDisplaysize) == 0)
                        {
                            System.out.println("\nPress <Enter> to continue..");
                            in.readLine();
                        }

                    }
                }
                else
                {
                    // Unter der Annahme, dass der GetRows-Fehler durch
// Datenänderungen eines anderen Benutzers bedingt war,
// Requery zum Aktualisieren des Recordsets verwenden und
// erneut beginnen.
                    System.out.println("\nGetRows failed--retry? (Y/N)");
                    if(in.readLine().trim().toUpperCase().equals("Y"))
                        rstEmployees.requery();
                    else
                    {
                        System.out.println("GetRows failed!");
                        break;
                    }
                }

                // Da die Verwendung von GetRows den aktuellen
// Datensatzzeiger beim letzten Datensatz belässt, auf
// den zugegriffen wurde, den Zeiger zum Anfang des
// Recordsets zurückbewegen und erst dann mit der
// nächsten Suche in der Schleife fortfahren.
                rstEmployees.moveFirst();
            }

            // Cleanup der Objekte vor dem Beenden.
            rstEmployees.close();

        }
        catch( AdoException ae )
        {
            // Den Benutzer ggf. über von ADO stammende Fehler
// benachrichtigen.

            // Beim Bearbeiten eines Recordsets zunächst auf
             // NULL-Zeiger prüfen.
            if (rstEmployees != null)
            {
                PrintProviderError(rstEmployees.getActiveConnection());
            }
            else
            {
                System.out.println("Exception: " + ae.getMessage());
            }
        }

        // Der Systemlesevorgang erfordert diesen Catch-Aufruf.
        catch( java.io.IOException je)
        {
            PrintIOError(je);
        }

        // Eine Fehlermeldung anzeigen, die besagt, dass die Anwendung
// versucht hat, eine Zeichenfolge in einem ungeeigneten Format in
// einen numerischen Typ zu konvertieren.
        catch(java.lang.NumberFormatException ne)
        {
            System.out.println(
                "Exception: Must specify an Integer value." );
        }

    }

    // GetRowsOK-Funktion

    static boolean GetRowsOK(Recordset rstTemp,int intNumber)
        {
        // Die Ergebnisse der GetRows-Methode im Array speichern.
        avarRecords = rstTemp.getRows(intNumber);

        // False nur dann zurückgeben, wenn weniger als die gewünschte
// Zeilenanzahl zurückgegeben wurden, nicht jedoch, weil das Ende
// des Recordsets erreicht wurde.
        if ( intNumber > (avarRecords.toSafeArray().getUBound(2)+ 1)
                    && !(rstTemp.getEOF()))
            return false;
        else
            return true;

    }

    // PrintProviderError-Funktion

    static void PrintProviderError( Connection Cnn1 )
    {
        // Vom Connection-Objekt stammende Providerfehler drucken.
        // ErrItem ist ein Elementobjekt in der Errors-Auflistung des
         // Connection-Objekts.
        com.ms.wfc.data.Error  ErrItem = null;
        long nCount = 0;
        int  i      = 0;

        nCount = Cnn1.getErrors().getCount();

        // Ggf. die Fehler in der Auflistung drucken.
        if( nCount > 0);
        {
            // Die Auflistung hat den Bereich 0 bis nCount - 1
            for (i = 0; i< nCount; i++)
            {
                ErrItem = Cnn1.getErrors().getItem(i);
                System.out.println("\t Error number: " + ErrItem.getNumber()
                    + "\t" + ErrItem.getDescription() );
            }
        }

    }

    // PrintIOError-Funktion

    static void PrintIOError( java.io.IOException je)
    {
        System.out.println("Error \n");
        System.out.println("\tSource = " + je.getClass() + "\n");
        System.out.println("\tDescription = " + je.getMessage() + "\n");
    }
}


Beispiel für die GetString-Methode (VJ++)

Dieses Beispiel verdeutlicht die GetString-Methode.

Bei diesem Beispiel wird davon ausgegangen, dass Sie ein Datenzugriffsproblem debuggen möchten und einen schnellen einfachen Weg zum Drucken des aktuellen Inhalts eines kleinen Recordset-Objekts suchen.

// Die WFC-Klasse schließt die ADO-Objekte ein.
import com.ms.wfc.data.*;
import java.io.* ;

public class GetStringX
{
     // Der Haupteinstiegspunkt für die Anwendung.

    public static void main (String[] args)
    {
        GetStringX ();
        System.exit(0);
    }

    // GetStringX-Funktion
    static void GetStringX()
    {
        // ADO-Objekte definieren.
        Connection cnConn1 = null;
        Recordset rstAuthors = null;

        // Deklarationen.
        BufferedReader in =
            new BufferedReader (new InputStreamReader(System.in));
        String strCnn = "DSN=Pubs;Provider=MSDASQL;uid=sa;pwd=;";
        String strOutput;

        try
        {
            // Eine Benutzereingabe für den Bundesstaat abrufen.
            System.out.println(
                "Enter a state (CA, IN, KS, MD, MI, OR, TN, UT): ");
            String strState = in.readLine().trim();
            String strQuery =
                "SELECT au_fname, au_lname, address, city FROM Authors " +
                          "WHERE state = '" + strState + "'";

            // Ein Recordset mit Daten aus der Authors-Tabelle öffnen.
            cnConn1 = new Connection();
            cnConn1.open(strCnn);
            rstAuthors = new Recordset();
            rstAuthors.open(strQuery,
                     cnConn1,
                     AdoEnums.CursorType.STATIC,
                     AdoEnums.LockType.READONLY,
                     AdoEnums.CommandType.TEXT);

            if (rstAuthors.getRecordCount() > 0)
            {
                // Alle Standardwerte verwenden: Alle Zeilen abrufen,
// Tabstopps als Spaltentrennzeichen verwenden, Wagenrücklauf
// als Zeilentrennzeichen verwenden, leere Zeichenfolgen als
// NULL-Trennzeichen verwenden
                strOutput =
                    rstAuthors.getString(AdoEnums.StringFormat.CLIPSTRING,
                    rstAuthors.getRecordCount(),
                    "\t ",
                    "\n",
                    "").trim();
                System.out.println("\nState = '" + strState + "'" +
                    "\n\n" +
                    "Name             Address             City" +
                    "\n");
                System.out.println(strOutput);
            }
            else
                System.out.println("\nNo rows found for state = '" +
                    strState + "'\n");

            // Cleanup der Objekte vor dem Beenden.
            rstAuthors.close();
            cnConn1.close();

            System.out.println("\nPress <Enter> to continue..");
            in.readLine();
        }
        catch( AdoException ae )
        {
            // Den Benutzer ggf. über von ADO stammende Fehler
// benachrichtigen.

            // Beim Bearbeiten eines Recordsets zunächst auf
             // NULL-Zeiger prüfen.
            if (rstAuthors != null)
            {
                PrintProviderError(rstAuthors.getActiveConnection());
            }
            else
            {
                System.out.println("Exception: " + ae.getMessage());
            }
        }

        // Der Systemlesevorgang erfordert diesen Catch-Aufruf.
        catch( java.io.IOException je)
        {
            PrintIOError(je);
        }

    }

    // PrintProviderError-Funktion

    static void PrintProviderError( Connection Cnn1 )
    {
        // Vom Connection-Objekt stammende Providerfehler drucken.
        // ErrItem ist ein Elementobjekt in der Errors-Auflistung des
         // Connection-Objekts.
        com.ms.wfc.data.Error  ErrItem = null;
        long nCount = 0;
        int  i      = 0;

        nCount = Cnn1.getErrors().getCount();

        // Ggf. die Fehler in der Auflistung drucken.
        if( nCount > 0);
        {
            // Die Auflistung hat den Bereich 0 bis nCount - 1
            for (i = 0; i< nCount; i++)
            {
                ErrItem = Cnn1.getErrors().getItem(i);
                System.out.println("\t Error number: " + ErrItem.getNumber()
                    + "\t" + ErrItem.getDescription() );
            }
        }

    }

    // PrintIOError-Funktion

    static void PrintIOError( java.io.IOException je)
    {
        System.out.println("Error \n");
        System.out.println("\tSource = " + je.getClass() + "\n");
        System.out.println("\tDescription = " + je.getMessage() + "\n");
    }
}


Beispiel für die Handler-Eigenschaft (VJ++)

Dieses Beispiel verdeutlicht die Handler-Eigenschaft des RDS DataControl-Objekts. (Weitere Informationen hierzu finden Sie unter DataFactory-Anpassung.)

Bei diesem Beispiel wird davon ausgegangen, dass sich die nachstehenden Abschnitte in der Parameterdatei, MSDFMAP.INI, auf dem Server befinden:

[connect AuthorDataBase]
Access=ReadWrite
Connect="DSN=Pubs"
[sql AuthorById]
SQL="SELECT * FROM Authors WHERE au_id = ?"

Der von Ihnen verwendete Code ähnelt dabei dem nachstehenden. Der der SQL-Eigenschaft zugeordnete Befehl stimmt mit dem AuthorById-Bezeichner überein und ruft eine Zeile für den Autor, Michael O'Leary, ab. Die Connect-Eigenschaft im Code gibt zwar die Northwind-Datenbank als Datenquelle an, jedoch wird diese Datenquelle aufgrund des connect-Abschnitts in der Datei MSDFMAP.INI überschrieben. Die Recordset-Eigenschaft des DataControl-Objekts wird einem nicht verbundenen Recordset-Objekt nur aus codepragmatischen Gründen zugeordnet.

import com.ms.wfc.data.*;
import com.ms.wfc.data.rds.*;
import java.io.* ;

public class HandlerX
{
    // Der Haupteinstiegspunkt für die Anwendung.

    public static void main (String[] args)
    {
        HandlerX();
        System.exit(0);
    }

    // HandlerX-Funktion

    static void HandlerX()
    {

        // ADO-Objekte definieren.
        Recordset rstAuthors = null;

        // Deklarationen.
        BufferedReader in =
            new BufferedReader (new InputStreamReader(System.in));
        int intCount = 0;
        int intDisplaysize = 15;

        try
        {
            IBindMgr dc = (IBindMgr) new DataControl();
            dc.setServer("http://tcsp636");
            dc.setConnect("Data Source=AuthorDatabase");
            dc.setSQL("AuthorById(267-41-2394)");
            dc.Refresh();                        // Den Datensatz abrufen.
            // Ein anderes Recordset verwenden.
            rstAuthors = (Recordset)dc.getRecordset();
            System.out.println("Author is '" +
                               rstAuthors.getField("au_fname").getString() +
                               " " +
                               rstAuthors.getField("au_lname").getString() +
                               "'");

            // Objekte vor dem Beenden löschen.
            rstAuthors.close();
            System.out.println("\nPress <Enter> to continue..");
            in.readLine();
        }
        catch( AdoException ae )
        {
            // Benutzer über alle Fehler informieren, die durch
            // ADO entstanden sind.

            // Beim Weitergeben eines Recordsets erst auf NULL-Zeiger
            // prüfen.
            if (rstAuthors != null)
            {
                PrintProviderError(rstAuthors.getActiveConnection());
            }
            else
            {
                System.out.println("Exception: " + ae.getMessage());
            }
        }

        // Der Systemlesevorgang erfordert diesen Catch-Aufruf.
        catch( java.io.IOException je)
        {
            PrintIOError(je);
        }
        catch(java.lang.UnsatisfiedLinkError e)
        {
            System.out.println("Exception: " + e.getMessage());
        }
        catch(java.lang.NullPointerException ne)
        {
            System.out.println(
            "Exception: Attempt to use null where an object is required.");
        }
    }

    // PrintProviderError-Funktion

    static void PrintProviderError( Connection Cnn1 )
    {
        // Providerfehler des Connection-Objekts drucken.
        // ErrItem ist ein Element der Errors-Auflistung
        // des Connection-Objekts.
        com.ms.wfc.data.Error  ErrItem = null;
        long nCount = 0;
        int  i      = 0;

        nCount = Cnn1.getErrors().getCount();

        // Fehler drucken, falls Fehler in der Auflistung auftreten.
        if( nCount > 0);
        {
            // Die Auflistung reicht von 0 bis nCount – 1.
            for (i = 0; i< nCount; i++)
            {
                ErrItem = Cnn1.getErrors().getItem(i);
                System.out.println("\t Error number: " + ErrItem.getNumber()
                    + "\t" + ErrItem.getDescription() );
            }
        }

    }

    // PrintIOError-Funktion

    static void PrintIOError( java.io.IOException je)
    {
        System.out.println("Error \n");
        System.out.println("\tSource = " + je.getClass() + "\n");
        System.out.println("\tDescription = " + je.getMessage() + "\n");
    }
}


Beispiel für die InternetTimeout-Eigenschaft (VJ++)

Dieses Beispiel verdeutlicht die InternetTimeout-Eigenschaft, die bei DataControl- und DataSpace-Objekten vorhanden ist. In diesem Fall wird die InternetTimeout-Eigenschaft auf das DataControl-Objekt angewendet und das Zeitlimit auf 20 Sekunden festgelegt.

// Die WFC-Klasse schließt die ADO-Objekte ein.
import com.ms.wfc.data.*;
import com.ms.wfc.data.rds.*;
import java.io.* ;

public class InternetTimeoutX
{
    // Der Haupteinstiegspunkt für die Anwendung.

    public static void main (String[] args)
    {
        InternetTimeoutX();
        System.exit(0);
    }

    // InternetTimeoutX-Funktion

    static void InternetTimeoutX()
    {

        // ADO-Objekte definieren.
        Recordset rstAuthors = null;

        // Deklarationen.
        BufferedReader in =
            new BufferedReader (new InputStreamReader(System.in));
        int intCount = 0;
        int intDisplaysize = 15;

        try
        {
            IBindMgr dc = (IBindMgr) new DataControl();
            dc.setServer("http://tcsp636");
            dc.setConnect("DSN=Pubs");
            dc.setSQL("SELECT * FROM Authors");
            dc.setInternetTimeout(20000);    // Mindestens 20 Sekunden warten.
            dc.Refresh();
            rstAuthors = (Recordset)dc.getRecordset();
            while(!rstAuthors.getEOF())
            {
                System.out.println(rstAuthors.getField
                    ("au_fname").getString() + " " +
                    rstAuthors.getField("au_lname").getString());
                intCount++;
                if(intCount % intDisplaysize == 0)
                {
                    System.out.println("\nPress <Enter> to continue..");
                    in.readLine();
                    intCount = 0;
                }
                rstAuthors.moveNext();
            }
            // Objekte vor dem Beenden löschen.
            rstAuthors.close();
            System.out.println("\nPress <Enter> to continue..");
            in.readLine();
        }
        catch( AdoException ae )
        {
            // Benutzer über alle Fehler informieren, die durch ADO
            // entstanden sind.

            // Beim Weitergeben eines Recordsets zuerst auf NULL-Zeiger
            // prüfen.
            if (rstAuthors != null)
            {
                PrintProviderError(rstAuthors.getActiveConnection());
            }
            else
            {
                System.out.println("Exception: " + ae.getMessage());
            }
        }

        // Der Systemlesevorgang erfordert diesen Catch-Aufruf.
        catch( java.io.IOException je)
        {
            PrintIOError(je);
        }
        catch(java.lang.UnsatisfiedLinkError e)
        {
            System.out.println("Exception: " + e.getMessage());
        }
        catch(java.lang.NullPointerException ne)
        {
            System.out.println(
            "Exception: Attempt to use null where an object is required.");
        }
    }

    // PrintProviderError-Funktion

    static void PrintProviderError( Connection Cnn1 )
    {
        // Providerfehler des Connection-Objekts drucken.
        // ErrItem ist ein Element der Error-Auflistung.
        // des Connection-Objekts.
        com.ms.wfc.data.Error  ErrItem = null;
        long nCount = 0;
        int  i      = 0;

        nCount = Cnn1.getErrors().getCount();

        // Fehler drucken, falls Fehler in der Auflistung auftreten.
        if( nCount > 0);
        {
            // Die Auflistung reicht von 0 bis  nCount - 1
            for (i = 0; i< nCount; i++)
            {
                ErrItem = Cnn1.getErrors().getItem(i);
                System.out.println("\t Error number: " + ErrItem.getNumber()
                    + "\t" + ErrItem.getDescription() );
            }
        }

    }

    // PrintIOError-Funktion

    static void PrintIOError( java.io.IOException je)
    {
        System.out.println("Error \n");
        System.out.println("\tSource = " + je.getClass() + "\n");
        System.out.println("\tDescription = " + je.getMessage() + "\n");
    }
}


Beispiel für die IsolationLevel- und Mode-Eigenschaften (VJ++)

In diesem Beispiel wird die Mode-Eigenschaft zum Öffnen einer exklusiven Verbindung verwendet. Die IsolationLevel-Eigenschaft wird zum Öffnen einer Transaktion verwendet, die getrennt von anderen Transaktionen ausgeführt wird.

import com.ms.wfc.data.*;
import java.io.*;

public class IsolationLevelX
{
// Der Haupteinstiegspunkt für die Anwendung.
public static void main (String[] args)
{
    IsolationLevelX();
    System.exit(0);
}

// IsolationLevelX-Funktion

static void IsolationLevelX()
{
    // ADO-Objekte definieren.
    Connection cnn1 = null;
    Recordset rstTitles = null;

    // Eine Verbindungszeichnenfolge einer Variablen zuweisen.
    String strCnn = "Provider=sqloledb;Data Source=srv;"+
                    "Initial Catalog=Pubs;User Id=sa;Password=;";

    // Deklarationen
    BufferedReader in =
        new BufferedReader ( new InputStreamReader(System.in));
    String line = null;

    try
    {
        // Eine Verbindung und die Titles-Tabelle öffnen.
        cnn1 = new Connection();

        cnn1.setMode(AdoEnums.ConnectMode.SHAREEXCLUSIVE);
        cnn1.setIsolationLevel(AdoEnums.IsolationLevel.ISOLATED);
        cnn1.open(strCnn);

        rstTitles = new Recordset();
        rstTitles.setCursorType(AdoEnums.CursorType.DYNAMIC);
        rstTitles.setLockType(AdoEnums.LockType.PESSIMISTIC);
        rstTitles.open("Titles", cnn1, AdoEnums.CursorType.DYNAMIC,
            AdoEnums.LockType.PESSIMISTIC);

        cnn1.beginTrans();

        // Den Verbindungsmodus anzeigen.
        if (cnn1.getMode() == AdoEnums.ConnectMode.SHAREEXCLUSIVE)
            System.out.println("\n\tConnection mode is exclusive");
        else
            System.out.println("\n\tConnection mode is not exclusive");
        System.out.println("\nPress <Enter> to continue..");
        in.readLine();

        // Die Isolationsebene anzeigen.
        if ( cnn1.getIsolationLevel() == AdoEnums.IsolationLevel.ISOLATED)
            System.out.println("\tTransaction is Isolated\n");
        else
            System.out.println("\tTransaction is not Isolated\n");
        System.out.println("\nPress <Enter> to continue..");
        in.readLine();

        // Den Typ der Psychologietitel ändern.
        while(!rstTitles.getEOF())
        {

            if(rstTitles.getField("Type").getString().trim().
                equals(new String("psychology")))
            {
                rstTitles.getField("Type").setString("self_help");
                rstTitles.update();
            }
            rstTitles.moveNext();

        }

        // Die aktuellen Daten im Recordset drucken
        rstTitles.requery();
        while(!rstTitles.getEOF())
        {
            System.out.println(rstTitles.getField("Title").getString() +
                " - " + rstTitles.getField("Type").getString() );
            rstTitles.moveNext();
        }
        System.out.println("\nPress <Enter> to continue..");
        in.readLine();

        // Die Originaldaten wiederherstellen.
        cnn1.rollbackTrans();

        // Objekte vor dem Beenden löschen.
        rstTitles.close();
        cnn1.close();
    }
    catch(AdoException ae)
    {
        // Den Benutzer über alle Fehler informieren, die durch
        // ADO entstanden sind.

        // Beim Weitergeben eines Connection-Objekts zuerst auf
        // NULL-Zeiger prüfen.
        if(cnn1 !=null)
        {
            PrintProviderError(cnn1);
        }
        else
        {
            System.out.println("Exception:" + ae.getLocalizedMessage());
        }
    }

    // Der Systemlesevorgang erfordert diesen Catch-Aufruf.
    catch(java.io.IOException je)
    {
        PrintIOError(je);

    }
}

    // PrintProviderError-Funktion

    static void PrintProviderError( Connection Cnn1 )
    {
        // Providerfehler des Connection-Objekts drucken.
        // ErrItem ist ein Element der Errors-Auflistung
        // des Connection-Objekts.
        com.ms.wfc.data.Error  ErrItem = null;
        long nCount = 0;
        int  i      = 0;

        nCount = Cnn1.getErrors().getCount();

        // Fehler drucken, falls Fehler in der Auflistung auftreten.
        if( nCount > 0);
        {
            // Die Auflistung reicht von 0 bis nCount - 1
            for (i = 0; i< nCount; i++)
            {
                ErrItem = Cnn1.getErrors().getItem(i);
                System.out.println("\t Error number: " + ErrItem.getNumber()
                    + "\t" + ErrItem.getDescription() );
            }
        }

    }

    // PrintIOError-Funktion

    static void PrintIOError( java.io.IOException je)
    {
        System.out.println("Error \n");
        System.out.println("\tSource = " + je.getClass() + "\n");
        System.out.println("\tDescription = " + je.getMessage() + "\n");
    }
}


Beispiel für die Item-Eigenschaft (VJ++)

Dieses Beispiel verdeutlicht, wie die Item-Eigenschaft auf Mitglieder einer Auflistung zugreift. Dieses Beispiel öffnet die Authors-Tabelle der Pubs-Datenbank mit einem parametrisierten Befehl.

Auf den Befehlsparameter, der an die Datenbank ausgegeben wird, wird von der Parameters-Auflistung des Command-Objekts aus nach Index und Name zugegriffen. Auf die Felder des zurückgegebenen Recordset-Objekts wird anschließend von der Fields-Auflistung des Objekts nach Index und Name zugegriffen.

import com.ms.wfc.data.*;
import java.io.* ;
import com.ms.com.*;

public class ItemX
{
    // Der Haupteinstiegspunkt für die Anwendung.

    public static void main (String[] args)
    {
        ItemX();
        System.exit(0);
    }

    // ItemX-Funktion

    static void ItemX()
    {

        // ADO-Objekte definieren.
        Connection cnConn1 = null;
        Recordset rstAuthors = null;
        Command cmd = null;
        Parameter prm = null;
        Field fld = null;

        // Deklarationen
        BufferedReader in =
            new BufferedReader (new InputStreamReader(System.in));
        String strCnn = "DSN=Pubs;Provider=MSDASQL;uid=sa;pwd=;";
        Variant [] varColumn = null;
        int intIndex;
        int intLimit;

        try
        {
            cnConn1 = new Connection();
            rstAuthors = new Recordset();
            cmd = new Command();

            //  Array mit den Feld- bzw. Spaltennamen für die
            //  Authors-Tabelle festlegen.
            varColumn = new Variant[9];
            varColumn[0] = new Variant("au_id");
            varColumn[1] = new Variant("au_lname");
            varColumn[2] = new Variant("au_fname");
            varColumn[3] = new Variant("phone");
            varColumn[4] = new Variant("address");
            varColumn[5] = new Variant("city");
            varColumn[6] = new Variant("state");
            varColumn[7] = new Variant("zip");
            varColumn[8] = new Variant("contract");

            cmd.setCommandText("SELECT * FROM Authors WHERE state = ?");
            prm = cmd.createParameter("ItemXparm",
                                      AdoEnums.DataType.CHAR,
                                      AdoEnums.ParameterDirection.INPUT,
                                      2,
                                      "CA");
            cmd.getParameters().append(prm);

            cnConn1.open(strCnn);
            cmd.setActiveConnection(cnConn1);

            // Connection und CommandType werden ausgelassen,
            // da ein Command-Objekt zur Verfügung gestellt wird.
            rstAuthors.open(cmd,
                     null ,
                     AdoEnums.CursorType.STATIC,
                     AdoEnums.LockType.READONLY);

            System.out.println(
                "The Parameters collection accessed by index...");
            prm = cmd.getParameters().getItem(0);
            System.out.println("Parameter name = '" +
                               prm.getName() +
                               "', value = '" +
                               prm.getValue().toString() + "'\n");

            System.out.println(
                "The Parameters collection accessed by name...");
            prm = cmd.getParameters().getItem("ItemXparm");
            System.out.println("Parameters name = '" +
                               prm.getName() +
                               "', value = '" +
                               prm.getValue().toString() + "'\n");
            System.out.println("Press <Enter> to continue..");
            in.readLine();

            System.out.println(
                "The Fields collection accessed by index...");
            rstAuthors.moveFirst();
            intLimit = rstAuthors.getFields().getCount() - 1;
            for(intIndex = 0; intIndex <= intLimit; intIndex++)
            {
                fld = rstAuthors.getFields().getItem(intIndex);
                short intVtType = fld.getValue().getvt();
                String strFieldValue;
                switch(intVtType)
                {
                case Variant.VariantString :
                    strFieldValue = fld.getValue().toString();
                    break;
                case Variant.VariantBoolean :
                    if(fld.getValue().getBoolean())
                        strFieldValue = "True";
                    else
                        strFieldValue = "False";
                    break;
                default :
                    strFieldValue = fld.getValue().toString();
                    break;
                }
                System.out.println("Field " +
                                   Integer.toString(intIndex) +
                                   " : Name = '" +
                                   fld.getName() +
                                   "', value = '" +
                                   strFieldValue +
                                   "'");
            }
            System.out.println("\nPress <Enter> to continue..");
            in.readLine();

            System.out.println("The Fields collection accessed by name...");
            rstAuthors.moveFirst();
            for(intIndex = 0; intIndex <= 8; intIndex++)
            {
                fld = rstAuthors.getFields().getItem
                    (varColumn[intIndex].toString());
                short intVtType = fld.getValue().getvt();
                String strFieldValue;
                switch(intVtType)
                {
                case Variant.VariantString :
                    strFieldValue = fld.getValue().toString();
                    break;
                case Variant.VariantBoolean :
                    if(fld.getValue().getBoolean())
                        strFieldValue = "True";
                    else
                        strFieldValue = "False";
                    break;
                default :
                    strFieldValue = fld.getValue().toString();
                    break;
                }
                System.out.println("Field " +
                                   "name = '" +
                                   fld.getName() +
                                   "', value = '" +
                                   strFieldValue +
                                   "'");
            }
            System.out.println("\nPress <Enter> to continue..");
            in.readLine();

            // Objekte vor dem Beenden löschen.
            rstAuthors.close();
            cnConn1.close();
        }
        catch( AdoException ae )
        {
            // Benutzer über alle Fehler informieren, die durch ADO
            // entstanden sind.
            // Beim Weitergeben eines Recordsets zuerst auf NULL-Zeiger
            // prüfen.
            if (rstAuthors != null)
            {
                PrintProviderError(rstAuthors.getActiveConnection());
            }
            else
            {
                System.out.println("Exception: " + ae.getMessage());
            }
        }

        // Der Systemlesevorgang erfordert diesen Catch-Aufruf.
        catch( java.io.IOException je)
        {
            PrintIOError(je);
        }
    }

    // PrintProviderError-Funktion

    static void PrintProviderError( Connection Cnn1 )
    {
        // Providerfehler des Connection-Objekts drucken.
        // ErrItem ist ein Element der Error-Auflistung.
        com.ms.wfc.data.Error  ErrItem = null;
        long nCount = 0;
        int  i      = 0;

        nCount = Cnn1.getErrors().getCount();

        // Fehler drucken, falls Fehler in der Auflistung auftreten.
        if( nCount > 0);
        {
            // Die Auflistung reicht von 0 bis nCount – 1.
            for (i = 0; i< nCount; i++)
            {
                ErrItem = Cnn1.getErrors().getItem(i);
                System.out.println("\t Error number: " + ErrItem.getNumber()
                    + "\t" + ErrItem.getDescription() );
            }
        }

    }

    // PrintIOError-Funktion

    static void PrintIOError( java.io.IOException je)
    {
        System.out.println("Error \n");
        System.out.println("\tSource = " + je.getClass() + "\n");
        System.out.println("\tDescription = " + je.getMessage() + "\n");
    }
}


Beispiel für die MarshalOptions-Eigenschaft (VJ++)

In diesem Beispiel wird die MarshalOptions-Eigenschaft verwendet, um die Zeilen anzugeben, die zurück an den Server übertragen werden - alle Zeilen oder nur geänderte Zeilen.

import java.io.*;
import com.ms.wfc.data.*;

public class MarshalOptionsX
{
// Der Haupteinstiegspunkt für die Anwendung.
public static void main (String[] args)
{
    MarshalOptionsX();
    System.exit(0);
}
// MarshalX-Funktion

static void MarshalOptionsX()
{
    // ADO-Objekte definieren.
    Recordset rstEmployees = null;

    // Deklarationen
    BufferedReader in =
        new BufferedReader(new InputStreamReader(System.in));
    String line = null;

    try
    {

        // Ein Recordset mit den Namen aus der Employees-Tabelle öffnen.
        String strCnn = " Provider=sqloledb;Data Source=srv;" +
                 "Initial Catalog=Pubs;User Id=sa;Password=;";

        rstEmployees = new Recordset();
        rstEmployees.setCursorType(AdoEnums.CursorType.KEYSET);
        rstEmployees.setLockType(AdoEnums.LockType.OPTIMISTIC);
        rstEmployees.setCursorLocation(AdoEnums.CursorLocation.CLIENT);

        rstEmployees.open(
            "SELECT fname,lname from Employee ORDER BY lname",
            strCnn,AdoEnums.CursorType.KEYSET,
            AdoEnums.LockType.OPTIMISTIC, AdoEnums.CommandType.TEXT);

        // Die Originaldaten speichern.
        String strOldFirst = rstEmployees.getField("fname").getString();
        String strOldLast = rstEmployees.getField("lname").getString();

        // Die Daten im Bearbeitungspuffer ändern.
        rstEmployees.getField("fname").setString("Linda");
        rstEmployees.getField("lname").setString("Kobara");

        // Den Inhalt der Puffers zeigen und Benutzereingabe abrufen.
        String strMessage = "Edit in progress: "+ "\n"+
                     "Original Data  = \t"+ strOldFirst +" "+
                     strOldLast + "\n" + "Data in Buffer = \t"+
                     rstEmployees.getField("fname").getString()+ " " +
                     rstEmployees.getField("lname").getString()+"\n"+"\n"+
                     "Use Update to replace the original data with " +
                     "the buffered data in the recordset";
        String strMarshalAll = "Would you like to send all the rows" +
                        " in the recordset back to the server";
        String strMarshalModified = "Would you like to send only "+
                             " modified rows back to the server";

        System.out.println(strMessage + "\nEnter (Y/N)...");

        if (in.readLine().equalsIgnoreCase("Y"))
        {
            System.out.println(strMarshalAll);
            System.out.println("\nEnter (Y/N)...");

            if(in.readLine().equalsIgnoreCase("Y"))
            {
                rstEmployees.setMarshalOptions(AdoEnums.MarshalOptions.ALL);
                rstEmployees.update();
            }
            else
            {
                System.out.println(strMarshalModified);
                System.out.println("\nEnter (Y/N)...");

                if (in.readLine().equalsIgnoreCase("Y"))
                {
                    rstEmployees.setMarshalOptions(
                        AdoEnums.MarshalOptions.MODIFIEDONLY);
                    rstEmployees.update();
                }
            }

        }

        // Die Ergebnisdaten zeigen.
        System.out.println("\nData in recordset = " +
            rstEmployees.getField("fname").getString() +
            " " + rstEmployees.getField("lname").getString());

        // Die Originaldaten wiederherstellen, da es sich um ein
        // Beispiel handelt.
        if (!((strOldFirst.equals(rstEmployees.getField("fname")))
            &&(strOldLast.equals(rstEmployees.getField("lname")))))
        {
            rstEmployees.getField("fname").setString(strOldFirst);
            rstEmployees.getField("lname").setString(strOldLast);
            rstEmployees.update();
        }
    // Objekte vor dem Beenden löschen
    rstEmployees.close();
    System.out.println("\n\nPress <Enter> to continue..");
    in.readLine();
    }

    catch(AdoException ae)
    {
        // Den Benutzer über Fehler, die durch ADO entstanden sind,
        // informieren.

        // Beim Weitergeben eines Connection-Objekts zuerst auf
        // NULL-Zeiger prüfen.
        if(rstEmployees!= null)
        {
            PrintProviderError(rstEmployees.getActiveConnection());
        }
        else
        {
            System.out.println("Exception: " + ae.getLocalizedMessage());
        }
    }

    // Der Systemlesevorgang erfordert diesen Catch-Aufruf.
    catch(java.io.IOException je)
    {
        PrintIOError(je);
    }
}

    // PrintProviderError-Funktion

    static void PrintProviderError( Connection Cnn1 )
    {
        // Providerfehler des Connection-Objekts drucken.
        // ErrItem ist ein Objekt in der Errors-Auflistung des
        // Connection-Objekts.
        com.ms.wfc.data.Error  ErrItem = null;
        long nCount = 0;
        int  i      = 0;

        nCount = Cnn1.getErrors().getCount();

        // Fehler drucken, falls Fehler in der Auflistung auftreten.
        if( nCount > 0);
        {
            // Die Auflistung reicht von 0 bis nCount – 1.
            for (i = 0; i< nCount; i++)
            {
                ErrItem = Cnn1.getErrors().getItem(i);
                System.out.println("\t Error number: " + ErrItem.getNumber()
                    + "\t" + ErrItem.getDescription() );
            }
        }

    }

    // PrintIOError-Funktion

    static void PrintIOError( java.io.IOException je)
    {
        System.out.println("Error \n");
        System.out.println("\tSource = " + je.getClass() + "\n");
        System.out.println("\tDescription = " + je.getMessage() + "\n");
    }
}


Beispiel für die MaxRecords-Eigenschaft (VJ++)

In diesem Beispiel wird die MaxRecords-Eigenschaft zum Öffnen eines Recordset-Objekts verwendet, das die 10 Titel mit den höchsten Kosten in der Titles-Tabelle enthält.

import java.io.*;
import com.ms.wfc.data.*;

public class MaxRecordsX
{
// Der Haupteinstiegspunkt für die Anwendung.

public static void main (String[] args)
{
    MaxRecordsX();
    System.exit(0);
}
// MaxRecordsX-Funktion

static void MaxRecordsX()
{
    // ADO-Objekte definieren.
    Recordset rstTemp = null;

    try
    {
        // Deklarationen
        BufferedReader in =
            new BufferedReader(new InputStreamReader(System.in));

        // Ein Recordset mit den 10 teuersten Titeln
        // in der Titles-Tabelle öffnen.
        String strCnn = " Provider=sqloledb;Data Source=srv;"+
            " Initial Catalog=Pubs;User Id=sa;Password=;";
        rstTemp = new Recordset();
        rstTemp.setMaxRecords(10);
        rstTemp.open("select title,price from Titles" +
            " order by price desc", strCnn,AdoEnums.CursorType.FORWARDONLY,
            AdoEnums.LockType.READONLY, AdoEnums.CommandType.TEXT);

        // Den Inhalt des Recordsets anzeigen.
        System.out.println("Top Ten Titles by Price:\n");
        while (!rstTemp.getEOF())
        {
            System.out.println(" "+ rstTemp.getField("title").getString() +
                " - " + rstTemp.getField("Price").getString());
            rstTemp.moveNext();
        }
        // Objekte vor dem Beenden löschen.
        rstTemp.close();

        System.out.println("\n\nPress <Enter> to continue..");
        in.readLine();
    }

    catch(AdoException ae)
    {
        // Benutzer über alle Fehler informieren, die durch ADO
        // entstanden sind.

        // Beim Weitergeben eines Recordsets erst auf NULL-Zeiger
        // überprüfen.
        if (rstTemp!=null)
        {
            PrintProviderError(rstTemp.getActiveConnection());
        }
        else
        {
            System.out.println("Exception: " + ae.getLocalizedMessage());
        }
    }

    // Der Systemlesevorgang erfordert diesen Catch-Aufruf.
    catch(java.io.IOException je)
    {
        PrintIOError(je);
    }
}
    // PrintProviderError-Funktion

    static void PrintProviderError( Connection Cnn1 )
    {
        // Providerfehler des Connection-Objekts drucken.
        // ErrItem ist ein Objekt in der Errors-Auflistung des
        // Connection-Objekts.
        com.ms.wfc.data.Error  ErrItem = null;
        long nCount = 0;
        int  i      = 0;

        nCount = Cnn1.getErrors().getCount();

        // Fehler drucken, falls Fehler in der Auflistung auftreten.
        if( nCount > 0);
        {
            // Die Auflistung reicht von 0 bis nCount – 1.
            for (i = 0; i< nCount; i++)
            {
                ErrItem = Cnn1.getErrors().getItem(i);
                System.out.println("\t Error number: " + ErrItem.getNumber()
                    + "\t" + ErrItem.getDescription() );
            }
        }

    }

    // PrintIOError-Funktion

    static void PrintIOError( java.io.IOException je)
    {
        System.out.println("Error \n");
        System.out.println("\tSource = " + je.getClass() + "\n");
        System.out.println("\tDescription = " + je.getMessage() + "\n");
    }
}


Beispiel für die Move-Methode (VJ++)

In diesem Beispiel wird die Move-Methode zum Positionieren des Datensatzzeigers auf der Grundlage einer Benutzereingabe verwendet.

import java.io.*;
import com.ms.wfc.data.*;
import com.ms.com.*;

public class MoveX
{
// Der Haupteinstiegspunkt für die Anwendung.

public static void main (String[] args)
{
    MoveX();
    System.exit(0);
}
// MoveX-Funktion

static void MoveX()
{
    // ADO-Objekte definieren.
    Recordset rstAuthors = null;

    // Deklarationen
    String line = null;
    Variant varBookmark;
    String strCommand = null;
    int lngMove;
    BufferedReader in =
        new BufferedReader(new InputStreamReader(System.in));

    try
    {
        // Ein Recordset aus der Authors-Tabelle öffnen.
        String strCnn = "Provider=sqloledb;Data Source=srv;"+
            "Initial Catalog=Pubs;User Id=sa;Password=;";

        rstAuthors = new Recordset();
        rstAuthors.setCursorType(AdoEnums.CursorType.STATIC);

        // Mit dem Clientcursor die Verwendung der
        // Absolute Position-Eigenschaft erlauben.
        rstAuthors.setCursorLocation(AdoEnums.CursorLocation.CLIENT);
        rstAuthors.open("select au_id,au_fname,au_lname,city,state " +
            "from Authors order by au_lname",
            strCnn,AdoEnums.CursorType.STATIC,
            AdoEnums.CursorLocation.CLIENT, AdoEnums.CommandType.TEXT);

        rstAuthors.moveFirst();

        while(true)
        {
            // Informationen über aktuellen Datensatz anzeigen und
            // fragen, wie viele Datensätze verschoben werden sollen.
            strCommand = "Record:\t\t"+ rstAuthors.getAbsolutePosition() +
                " of " + rstAuthors.getRecordCount() + "\n" + "\tAuthor:\t\t"
                 + rstAuthors.getField("au_fname").getString() +
                 " " + rstAuthors.getField("au_lname").getString() +
                "\n" +"\tLocation:\t" +
                rstAuthors.getField("city").getString() +
                 ", " +rstAuthors.getField("state").getString()
                 +"\n\n"+"\tEnter number of records to move" +
                " (positive or negative).";

            System.out.print("\t"+ strCommand + "\t");
            line =in.readLine();

            // Kein Eintrag – Programmschleife.
            if (line.length()== 0)
                break;

            // Einen Zeichenfolgeneintrag in eine ganze Zahl konvertieren.
            lngMove = Integer.parseInt(line);

            // Ein Lesezeichen speichern, falls zu weit
            // vorwärts oder rückwärts verschoben wird.
            varBookmark =(Variant)rstAuthors.getBookmark();

            // Die Move-Methode erfordert Parameter des Datentyps Integer.
            rstAuthors.move(lngMove);

            // BOF und EOF auffangen.
            if (rstAuthors.getBOF())
            {
                System.out.println("\tToo far backward!  " +
                    "Returning to the current record.");
                rstAuthors.setBookmark(varBookmark);
            }
            if (rstAuthors.getEOF())
            {
                System.out.println("\tToo far forward!  " +
                    "Returning to the current record.");
                rstAuthors.setBookmark(varBookmark);
            }
        }
        // Objekte vor dem Beenden löschen.
        rstAuthors.close();
        System.out.println("\tPress <Enter> to continue..");
        in.readLine();
    }

    catch(AdoException ae)
    {
        // Benutzer über alle Fehler informieren, die durch ADO
        // entstanden sind.
        // Beim Weitergeben eines Recordsets zuerst auf NULL-Zeiger prüfen.
        if (rstAuthors!=null)
        {
            PrintProviderError(rstAuthors.getActiveConnection());
        }
        else
        {
            System.out.println(" Exception: "+ ae.getMessage());
        }
    }
    // Der Systemlesevorgang erfordert diesen Catch-Aufruf.
    catch(java.io.IOException je)
    {
        PrintIOError(je);
    }
    // Erfoderlich wenn Benutzer keine ganze Zahl eingeben.
    catch(java.lang.NumberFormatException ne)
    {
        System.out.println("\n\nPlease enter integer values!");
        rstAuthors.close();
    }
}
    // PrintProviderError-Funktion

    static void PrintProviderError( Connection Cnn1 )
    {
        // Providerfehler des Connection-Objekts drucken.
        // ErrItem ist ein Objekt in der Errors-Auflistung des
        // Connection-Objekts.
        com.ms.wfc.data.Error  ErrItem = null;
        long nCount = 0;
        int  i      = 0;

        nCount = Cnn1.getErrors().getCount();

        // Fehler drucken, falls Fehler in der Auflistung auftreten.
        if( nCount > 0);
        {
            // Die Auflistung reicht von 0 bis nCount – 1.
            for (i = 0; i< nCount; i++)
            {
                ErrItem = Cnn1.getErrors().getItem(i);
                System.out.println("\t Error number: " + ErrItem.getNumber()
                    + "\t" + ErrItem.getDescription() );
            }
        }

    }

    // PrintIOError-Funktion

    static void PrintIOError( java.io.IOException je)
    {
        System.out.println("Error \n");
        System.out.println("\tSource = " + je.getClass() + "\n");
        System.out.println("\tDescription = " + je.getMessage() + "\n");
    }
}


Beispiel für die MoveFirst-, MoveLast-, MoveNext- und MovePrevious-Methoden (VJ++)

In diesem Beispiel werden die Methoden MoveFirst, MoveLast, MoveNext und MovePrevious verwendet, um den Datensatzzeiger eines Recordset-Objekts auf der Grundlage des übermittelten Befehls zu verschieben. Die MoveAny-Prozedur ist erforderlich, damit diese Prozedur ausgeführt werden kann.

import com.ms.wfc.data.*;
import java.io.*;

public class MoveFirstX  // DLL-Name.
{
// Hauptfunktion

public static void main( String rgArg[] )
{
    MoveFirstX();
}

// MoveFirstX-Funktion

static void MoveFirstX()
{
    // Deklarationen
    Recordset rsAuthors = null;
    BufferedReader in =
            new BufferedReader(new InputStreamReader(System.in));
    String  line = null;

    String strCnn = "Provider=sqloledb;data source=dianaped4;"
        + "Initial Catalog=Pubs;User Id=sa;Password=;";

    String strMessage = "UPDATE Titles SET type = 'psychology' "
        +"WHERE type = 'self_help'";

    int intCommand = 0;
    String strFName;
    String strLName;

    try
    {
        // Das Recordset aus der Authors-Tabelle öffnen.
        rsAuthors = new Recordset();
        rsAuthors.setCursorLocation( AdoEnums.CursorLocation.CLIENT );

        // Mit dem Clientcursor die AbsolutePosition-Eigenschaft aktivieren.
        rsAuthors.open( "Authors", strCnn, AdoEnums.CursorType.STATIC,
            AdoEnums.LockType.BATCHOPTIMISTIC, AdoEnums.CommandType.TABLE );

        // Die Verschiebeanforderungen des Benutzers abrufen und
        // aktuelle Datensatzinformationen anzeigen.
        while( true )    // Fortwährende Schleife.
        {
        // Die Feldinformationen einer Variablen zuweisen, um
        // den Ausgabecode zu vereinfachen.
            strFName = rsAuthors.getField("au_fname").getString();
            strLName = rsAuthors.getField("au_lname").getString();

            System.out.println
                ( "\nName: " + strFName + " " + strLName + "\n"
                + "Record " + rsAuthors.getAbsolutePosition()
                + " of " + rsAuthors.getRecordCount() + "\n\n" );
            System.out.println( "[1 - MoveFirst, 2 - MoveLast, \n");
            System.out.println( " 3 - MoveNext, 4 - MovePrevious]\n");

            // Der Benutzer gibt eine Zahl ein und drückt dann die
            // EINGABETASTE (cr-lf).
            line = in.readLine();

            // In der Programmschleife ist kein Eintrag vorhanden.
            if (line.length() == 0) break;
            // Zeichenfolgeneintrag in eine Ganzzahl konvertieren.
            intCommand = Integer.parseInt(line);
            // Der Eintrag in der Programmschleife ist außerhalb des
            // gültigen Bereichs.
            if ((intCommand < 1) || (intCommand > 4)) break;

            // Aufrufen einer Methode auf der Grundlage der
            // überprüften Benutzerauswahl.
            MoveAny(intCommand, rsAuthors);
        }
        rsAuthors.close();
    }
    catch( AdoException ae )
    {
        // Benutzer über alle Fehler informieren, die durch ADO
        // entstanden sind.
        // Beim Weitergeben eines Recordsets zuerst auf NULL-Zeiger prüfen.
        if (rsAuthors != null)
        {
            PrintProviderError(rsAuthors.getActiveConnection());
        }
        else
        {
            System.out.println("Exception: " + ae.getMessage());
        }
    }
    // Der Systemlesevorgang erfordert diesen Catch-Aufruf.
    catch( java.io.IOException je )
    {
        PrintIOError(je);
    }
}

// MoveAny-Funktion

static void MoveAny(int intChoice, Recordset rsTemp)
{
    // Gemäß Auswahl durch den Benutzer verschieben und auf BOF und
    // EOF prüfen.
    try
    {
        switch(intChoice)
        {
        case 1:   // Gleich char-Wert für 1.
            rsTemp.moveFirst();
            break;
        case 2:   // Gleich char-Wert für 2.
            rsTemp.moveLast();
            break;
        case 3:   // Gleich char-Wert für 3.
            rsTemp.moveNext();
            if(rsTemp.getEOF())
            {
                System.out.println("\nAlready at end of recordset!\n");
                rsTemp.moveLast();
            }
            break;
        case 4:   // Gleich char-Wert für 4.
            rsTemp.movePrevious();
            if(rsTemp.getBOF())
            {
                System.out.println
                    ("\nAlready at beginning of recordset!\n");
                rsTemp.moveFirst();
            }
            break;
        default:
            break;
        }
    }
    catch( AdoException ae )
    {
        // Benutzer über alle Fehler informieren, die durch ADO
        // entstanden sind.
        // Beim Weitergeben eines Recordsets zuerst auf NULL-Zeiger prüfen.
        if (rsTemp != null)
        {
            PrintProviderError(rsTemp.getActiveConnection());
        }
        else
        {
            System.out.println("Exception: " + ae.getMessage());
        }
    }
}

    // PrintProviderError-Funktion

    static void PrintProviderError( Connection Cnn1 )
    {
        // Providerfehler des Connection-Objekts drucken.
        // ErrItem ist ein Objekt in der Errors-Auflistung des
        // Connection-Objekts.
        com.ms.wfc.data.Error  ErrItem = null;
        long nCount = 0;
        int  i      = 0;

        nCount = Cnn1.getErrors().getCount();

        // Fehler drucken, falls Fehler in der Auflistung auftreten.
        if( nCount > 0);
        {
            // Die Auflistung reicht von 0 bis nCount – 1.
            for (i = 0; i< nCount; i++)
            {
                ErrItem = Cnn1.getErrors().getItem(i);
                System.out.println("\t Error number: " + ErrItem.getNumber()
                    + "\t" + ErrItem.getDescription() );
            }
        }

    }

    // PrintIOError-Funktion

    static void PrintIOError( java.io.IOException je)
    {
        System.out.println("Error \n");
        System.out.println("\tSource = " + je.getClass() + "\n");
        System.out.println("\tDescription = " + je.getMessage() + "\n");
    }
}


Beispiel für die NextRecordset-Methode (VJ++)

In diesem Beispiel werden die Daten eines Recordsets mithilfe der NextRecordset-Methode verdeutlicht. Im Recordset wird eine Verbundbefehlsanweisung verwendet, die aus drei einzelnen SELECT-Anweisungen besteht.

import java.io.*;
import com.ms.wfc.data.*;

public class NextRecordsetX
{
// Der Haupteinstiegspunkt für die Anwendung.

public static void main (String[] args)
{
    NextRecordsetX();
    System.exit(0);

}
// NextRecordsetX-Funktion
static void NextRecordsetX()
{
    // ADO-Objekt definieren.
    Recordset rstCompound = null;

    // Deklarationen
    BufferedReader in =
        new BufferedReader(new InputStreamReader(System.in));
    String strCnn;
    int intCount;
    int intDisplayRecords = 15;
    int intRecordCount;

    try
    {
        // Ein verbundenes Recordset öffnen.
        strCnn = "Provider=sqloledb;Data Source=srv;" +
             "Initial Catalog=Pubs;User Id=sa;Password=;";

        rstCompound = new Recordset();
        rstCompound.open("select * from Authors;" +
             "select * from stores;" +
             "select * from jobs", strCnn, AdoEnums.CursorType.FORWARDONLY,
            AdoEnums.LockType.READONLY,AdoEnums.CommandType.TEXT);

        // Die Ergebnisse aller Select-Anweisungen anzeigen.
        intCount=1;

            while (rstCompound != null)
            {
                System.out.println(
                    "Contents of recordset #" + intCount + "\n");
                intRecordCount = 0;
                while(rstCompound.getEOF() != true )
                    {
                        System.out.println(
                            rstCompound.getField(0).getString()+" " +
                            rstCompound.getField(1).getString());
                        intRecordCount++;
                        if ( intRecordCount == intDisplayRecords)
                        {
                            System.out.println("\nPress <Enter> to continue..");
                            in.readLine();
                            intRecordCount = 0;
                        }
                        rstCompound.moveNext();
                    }
                System.out.println("\nPress <Enter> to continue..");
                in.readLine();

                rstCompound = rstCompound.nextRecordset();

                intCount++;
            }
    }
    // Der Systemlesevorgang erfordert diesen Catch-Aufruf.
    catch(java.io.IOException je)
    {
        PrintIOError(je);
    }
    catch(AdoException ae)
    {
        // Benutzer über alle Fehler informieren, die durch ADO
        // entstanden sind.

        // Beim Weitergeben eines Recordsets zuerst auf NULL-Zeiger prüfen.
        if(rstCompound!=null)
        {
            PrintProviderError(rstCompound.getActiveConnection());
        }
        else
        {
            System.out.println("Exception: " + ae.getMessage());
        }
    }
    catch(java.lang.NullPointerException ne)
    {
        System.out.println("Error Description: " + ne.getMessage());
    }

}

    // PrintProviderError-Funktion

    static void PrintProviderError( Connection Cnn1 )
    {
        // Providerfehler des Connection-Objekts drucken.
        // ErrItem ist ein Objekt in der Errors-Auflistung des
        // Connection-Objekts.
        com.ms.wfc.data.Error  ErrItem = null;
        long nCount = 0;
        int  i      = 0;

        nCount = Cnn1.getErrors().getCount();

        // Fehler drucken, falls Fehler in der Auflistung auftreten.
        if( nCount > 0);
        {
            // Die Auflistung reicht von 0 bis nCount – 1.
            for (i = 0; i< nCount; i++)
            {
                ErrItem = Cnn1.getErrors().getItem(i);
                System.out.println("\t Error number: " + ErrItem.getNumber()
                    + "\t" + ErrItem.getDescription() );
            }
        }

    }

    // PrintIOError-Funktion

    static void PrintIOError( java.io.IOException je)
    {
        System.out.println("Error \n");
        System.out.println("\tSource = " + je.getClass() + "\n");
        System.out.println("\tDescription = " + je.getMessage() + "\n");
    }
}


Beispiel für die NumericScale- und Precision-Eigenschaften (VJ++)

In diesem Beispiel werden die Eigenschaften NumericScale und Precision zum Anzeigen der numerischen Skalierung und Genauigkeit der Felder in der Discounts-Tabelle der Pubs-Datenbank verwendet.

import com.ms.wfc.data.*;
import java.io.* ;

public class NumericScaleX
{
    // Der Haupteinstiegspunkt für die Anwendung.

    public static void main (String[] args)
    {
        NumericScaleX();
        System.exit(0);
    }

    // NumericScaleX-Funktion

    static void NumericScaleX()
    {

        // ADO-Objekte definieren.
        Recordset rstDiscounts = null;
        Field fldTemp = null;

        // Deklarationen.
        BufferedReader in =
            new BufferedReader (new InputStreamReader(System.in));
        String strCnn = "Provider=sqloledb;Data Source=srv;"
             + "Initial Catalog=Pubs;User Id=sa;Password=;";
        int intLoop;

        try
        {
            rstDiscounts = new Recordset();

            // Recordset öffnen.
            rstDiscounts.open("Discounts", strCnn,
                          AdoEnums.CursorType.FORWARDONLY,
                          AdoEnums.LockType.READONLY,
                          AdoEnums.CommandType.TABLE);

            // Numerische Skalierung und Genauigkeit von numerischen und
            // kleinen ganzzahligen Feldern anzeigen.
            for ( intLoop=0; intLoop <
                rstDiscounts.getFields().getCount();intLoop++)
            {
                fldTemp = rstDiscounts.getFields().getItem(intLoop);
                if((fldTemp.getType()== AdoEnums.DataType.NUMERIC) |
                    (fldTemp.getType()== AdoEnums.DataType.SMALLINT))
                {
                    System.out.println("\nField: "
                        + fldTemp.getName());
                    System.out.println("\nNumeric scale: "
                        + fldTemp.getNumericScale());
                    System.out.println("\nPrecision: "
                        + fldTemp.getPrecision());
                    System.out.println("\n\nPress <Enter> to continue..");
                    in.readLine();
                }
            }

            // Objekte vor dem Beenden löschen.
            rstDiscounts.close();

        }
        catch( AdoException ae )
        {
            // Benutzer über alle Fehler informieren, die durch ADO
            // entstanden sind.

            // Beim Weitergeben eines Recordsets zuerst auf
            // NULL-Zeiger prüfen.
            if (rstDiscounts != null)
            {
                PrintProviderError(rstDiscounts.getActiveConnection());
            }
            else
            {
                System.out.println("Exception: " + ae.getMessage());
            }

        }

        // Der Systemlesevorgang erfordert diesen Catch-Aufruf.
        catch( java.io.IOException je)
        {
            PrintIOError(je);
        }

    }

    // PrintProviderError-Funktion

    static void PrintProviderError( Connection Cnn1 )
    {
        // Providerfehler des Connection-Objekts drucken.
        // ErrItem ist ein Objekt in der Errors-Auflistung des
        // Connection-Objekts.
        com.ms.wfc.data.Error  ErrItem = null;
        long nCount = 0;
        int  i      = 0;

        nCount = Cnn1.getErrors().getCount();

        // Fehler drucken, falls Fehler in der Auflistung auftreten.
        if( nCount > 0);
        {
            // Die Auflistung reicht von 0 bis nCount – 1.
            for (i = 0; i< nCount; i++)
            {
                ErrItem = Cnn1.getErrors().getItem(i);
                System.out.println("\t Error number: " + ErrItem.getNumber()
                    + "\t" + ErrItem.getDescription() );
            }
        }

    }

    // PrintIOError-Funktion

    static void PrintIOError( java.io.IOException je)
    {
        System.out.println("Error \n");
        System.out.println("\tSource = " + je.getClass() + "\n");
        System.out.println("\tDescription = " + je.getMessage() + "\n");
    }
}


Beispiel für die Open- und Close-Methoden (VJ++)

In diesem Beispiel werden die Methoden Open und Close in geöffneten Recordset- und Connection-Objekten verwendet.

import com.ms.wfc.data.*;
import java.io.* ;
import com.ms.com.*;

public class OpenX
{
    // Der Haupteinstiegspunkt für die Anwendung.

    public static void main (String[] args)
    {
        OpenX();
        System.exit(0);
    }

    // OpenX-Funktion

    static void OpenX()
    {

        // ADO-Objekte definieren.
        Connection cnConn1 = null;
        Recordset rstEmployees = null;

        // Deklarationen.
        BufferedReader in =
            new BufferedReader (new InputStreamReader(System.in));
        String strCnn = "Provider=sqloledb;Data Source=srv;"
                        + "Initial Catalog=Pubs;User Id=sa;Password=;";
        Variant varDate;
        String strHDate;

        try
        {
            // Eine Verbindung öffnen.
            cnConn1 = new Connection();
            cnConn1.open(strCnn);

            // Die Employees-Tabelle öffnen.
            rstEmployees = new Recordset();
            rstEmployees.setCursorType(AdoEnums.CursorType.KEYSET);
            rstEmployees.setLockType(AdoEnums.LockType.OPTIMISTIC);
            rstEmployees.open("Employees", cnConn1,
                          AdoEnums.CursorType.KEYSET,
                          AdoEnums.LockType.OPTIMISTIC,
                          AdoEnums.CommandType.TABLE);

            // Das Einstellungsdatum im Datensatz des ersten Mitarbeiters
            // einer Variablen zuweisen und das Einstellungsdatum ändern.
            varDate = rstEmployees.getField("hire_date").getOriginalValue();
            System.out.println("Original data\n");
            System.out.println("\tName - Hire Date");
            strHDate = rstEmployees.getField("hire_date").getString();
            strHDate = strHDate.substring(5,7) + "/" +
                strHDate.substring(8,10)
                 + "/" + strHDate.substring(2,4);
            System.out.println("\t" +
                rstEmployees.getField("fName").getString()+ " "
                 + rstEmployees.getField("lName").getString()+ " - "
                 + strHDate);
            System.out.println("\nPress <Enter> to continue..");
            in.readLine();
            rstEmployees.getField("hire_date").setString("1/1/1900");
            rstEmployees.update();
            System.out.println("Changed data\n");
            System.out.println("\tName - Hire Date");
            strHDate = rstEmployees.getField("hire_date").getString();
            strHDate = strHDate.substring(5,7) + "/" +
                strHDate.substring(8,10)
                 + "/" + strHDate.substring(0,4);
            System.out.println("\t" +
                rstEmployees.getField("fName").getString()+ " "
                 + rstEmployees.getField("lName").getString()+ " - "
                 + strHDate);
            System.out.println("\nPress <Enter> to continue..");
            in.readLine();

            // Das Recordset erneut abfragen und das
            // Einstellungsdatum zurücksetzen.
            rstEmployees.requery();
            rstEmployees.getField("hire_date").setValue(varDate);
            rstEmployees.update();
            System.out.println("Data after reset\n");
            System.out.println("\tName - Hire Date");
            strHDate = rstEmployees.getField("hire_date").getString();
            strHDate = strHDate.substring(5,7) + "/" +
                strHDate.substring(8,10)
                 + "/" + strHDate.substring(2,4);
            System.out.println("\t" +
                rstEmployees.getField("fName").getString()+ " "
                 + rstEmployees.getField("lName").getString()+ " - "
                 + strHDate);
            System.out.println("\nPress <Enter> to continue..");
            in.readLine();

            // Die Objekte vor dem Beenden löschen.
            rstEmployees.close();
            cnConn1.close();

        }
        catch( AdoException ae )
        {
            // Benutzer über alle Fehler informieren, die durch ADO
            // entstanden sind.

            // Beim Weitergeben eines Recordsets zuerst auf
            // NULL-Zeiger prüfen.
            if (rstEmployees != null)
            {
                PrintProviderError(rstEmployees.getActiveConnection());
            }
            else
            {
                System.out.println("Exception: " + ae.getMessage());
            }

        }

        // Der Systemlesevorgang erfordert diesen Catch-Aufruf.
        catch( java.io.IOException je)
        {
            PrintIOError(je);
        }

    }

    // PrintProviderError-Funktion

    static void PrintProviderError( Connection Cnn1 )
    {
        // Providerfehler des Connection-Objekts drucken.
        // ErrItem ist ein Objekt in der Errors-Auflistung des
        // Connection-Objekts.
        com.ms.wfc.data.Error  ErrItem = null;
        long nCount = 0;
        int  i      = 0;

        nCount = Cnn1.getErrors().getCount();

        // Fehler drucken, falls Fehler in der Auflistung auftreten.
        if( nCount > 0);
        {
            // Die Auflistung reicht von 0 bis nCount – 1.
            for (i = 0; i< nCount; i++)
            {
                ErrItem = Cnn1.getErrors().getItem(i);
                System.out.println("\t Error number: " + ErrItem.getNumber()
                    + "\t" + ErrItem.getDescription() );
            }
        }

    }

    // PrintIOError-Funktion

    static void PrintIOError( java.io.IOException je)
    {
        System.out.println("Error \n");
        System.out.println("\tSource = " + je.getClass() + "\n");
        System.out.println("\tDescription = " + je.getMessage() + "\n");
    }
}


Beispiel für die OpenSchema-Methode (VJ++)

In diesem Beispiel wird die OpenSchema-Methode zum Anzeigen der einzelnen Tabellennamen und -typen in der Pubs-Datenbank verwendet.

import com.ms.wfc.data.*;
import java.io.*;
import com.ms.com.*;

public class OpenSchemaX
{
 // Der Haupteinstiegspunkt der Anwendung.

public static void main (String[] args)
{
    OpenSchemaX();
    OpenSchemaX2();
    System.exit(0);
}

// OpenSchemaX-Funktion
static void OpenSchemaX()
{
    // ADO-Objekte definieren.
    Connection cnn1 = null;
    Recordset rstSchema = null;

    // Deklarationen
    String strCnn;
    BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
    int intDisplayRecords = 5;
    int intRecordCount = 0;

    try
    {

        cnn1 = new Connection();
        strCnn = "Provider = Microsoft.Jet.OLEDB.4.0;" +
            "Data Source=C:\\Program Files\\Microsoft " +
            "Office\\Office\\Samples\\Northwind.mdb;" +
            "User Id=admin;Password=;";
        cnn1.open(strCnn);
        rstSchema = cnn1.openSchema(AdoEnums.Schema.TABLES);

        while (!rstSchema.getEOF())
        {

            System.out.println("Table Name: " +
                chema.getField("TABLE_NAME").getString()+"\n"+
                "Table Type: " +
                chema.getField("TABLE_TYPE").getString()+"\n");
            intRecordCount++;
            if ( intRecordCount == intDisplayRecords)
            {
                System.out.println("Press <Enter> to continue..");
                in.readLine();
                intRecordCount = 0;
            }
            rstSchema.moveNext();

        }
        System.out.println("Press <Enter> to continue..");
        in.readLine();
        // Objekte vor dem Beenden löschen
        rstSchema.close();
        cnn1.close();

    }
    catch(AdoException ae)
    {
        // Benutzer über alle Fehler informieren, die durch ADO
        // entstanden sind.

        // Beim Weitergeben eines Recordsets zuerst auf NULL-Zeiger prüfen.
        if(rstSchema != null)
        {
            PrintProviderError(rstSchema.getActiveConnection());
        }
        else
        {
            System.out.println("Exception: " + ae.getMessage());
        }
    }
    // Der Systemlesevorgang erfordert diesen Catch-Aufruf.
    catch(java.io.IOException je)
    {
        PrintIOError(je);
    }
}

// OpenSchemaX2-Funktion

static void OpenSchemaX2()
{
    // ADO-Objekte definieren.
    Connection cnn2 = null;
    Recordset rstSchema = null;

    // Deklarationen
    String strCnn;
    BufferedReader in =
        new BufferedReader(new InputStreamReader(System.in));
    int intDisplayRecords = 5;
    int intRecordCount = 0;

    try
    {
        cnn2 = new Connection();
        strCnn = "Provider = Microsoft.Jet.OLEDB.4.0;" +
            "Data Source=C:\\Program Files\\Microsoft " +
            "Office\\Office\\Samples\\Northwind.mdb;" +
            "User Id=admin;Password=;";
        cnn2.open(strCnn);

        Variant[] va = new Variant[4];
        va[0] = new Variant();
        va[1] = new Variant();
        va[2] = new Variant();
        va[3] = new Variant("VIEW");
        rstSchema = cnn2.openSchema(AdoEnums.Schema.TABLES,(Object[])va);

        while (!rstSchema.getEOF())
        {
            System.out.println("Table Name: " +
                rstSchema.getField("TABLE_NAME").getString()+"\n"+
                "Table Type: " +
                rstSchema.getField("TABLE_TYPE").getString()+"\n");
            intRecordCount++;
            if ( intRecordCount == intDisplayRecords)
            {
                System.out.println("Press <Enter> to continue..");
                in.readLine();
                intRecordCount = 0;
            }
            rstSchema.moveNext();

        }
        System.out.println("Press <Enter> to continue..");
        in.readLine();
        // Die Objekte vor dem Beenden löschen.
        rstSchema.close();
        cnn2.close();

    }
    catch(AdoException ae)
    {
        // Benutzer über alle Fehler informieren, die durch ADO
        // entstanden sind.

        // Beim Weitergeben eines Recordsets zuerst auf NULL-Zeiger prüfen.
        if(rstSchema != null)
        {
            PrintProviderError(rstSchema.getActiveConnection());
        }
        else
        {
            System.out.println("Exception: " + ae.getMessage());
        }
    }
    // Der Systemlesevorgang erfordert diesen Catch-Aufruf.
    catch(java.io.IOException je)
    {
        PrintIOError(je);
    }

}
    // PrintProviderError-Funktion

    static void PrintProviderError( Connection Cnn1 )
    {
        // Providerfehler des Connection-Objekts drucken.
        // ErrItem ist ein Objekt in der Errors-Auflistung des
        // Connection-Objekts.
        com.ms.wfc.data.Error  ErrItem = null;
        long nCount = 0;
        int  i      = 0;

        nCount = Cnn1.getErrors().getCount();

        // Fehler drucken, falls Fehler in der Auflistung auftreten.
        if( nCount > 0);
        {
            // Die Auflistung reicht von 0 bis nCount – 1.
            for (i = 0; i< nCount; i++)
            {
                ErrItem = Cnn1.getErrors().getItem(i);
                System.out.println("\t Error number: " + ErrItem.getNumber()
                    + "\t" + ErrItem.getDescription() );
            }
        }

    }

    // PrintIOError-Funktion

    static void PrintIOError( java.io.IOException je)
    {
        System.out.println("Error \n");
        System.out.println("\tSource = " + je.getClass() + "\n");
        System.out.println("\tDescription = " + je.getMessage() + "\n");
    }
}


Beispiel für die Optimize-Eigenschaft (VJ++)

Dieses Beispiel verdeutlicht die dynamische Optimize-Eigenschaft des Field-Objekts. Das zip-Feld in der Authors-Tabelle der Pubs-Datenbank ist nicht indiziert. Durch Festlegen der Optimize-Eigenschaft im zip-Feld auf True wird ADO veranlasst, einen Index zu erstellen, der das Leistungsverhalten der Find-Methode verbessert.

import com.ms.wfc.data.*;
import java.io.* ;

public class OptimizeX
{
    // Der Haupteinstiegspunkt für die Anwendung.

    public static void main (String[] args)
    {
        OptimizeX();
        System.exit(0);
    }

    // OptimizeX-Funktion

    static void OptimizeX()
    {

        // ADO-Objekte definieren.
        Recordset rstAuthors = null;

        // Deklarationen.
        BufferedReader in =
            new BufferedReader (new InputStreamReader(System.in));
        String strCnn = "DSN=Pubs;Provider=MSDASQL;uid=sa;pwd=;";

        try
        {
            rstAuthors = new Recordset();
            rstAuthors.setCursorLocation(AdoEnums.CursorLocation.CLIENT);
            // Die Indexerstellung aktivieren.
            rstAuthors.open("SELECT * FROM Authors",
                    strCnn,
                    AdoEnums.CursorType.STATIC,
                    AdoEnums.LockType.READONLY,
                    AdoEnums.CommandType.TEXT);
            rstAuthors.getField("zip").getProperties().
                getItem("Optimize").setBoolean(true); // Den Index erstellen.
            rstAuthors.find("zip = '94595'");    // Akiko Yokomoto suchen.
            System.out.println(rstAuthors.getField("au_fname").getString() +
                " " + rstAuthors.getField("au_lname").getString() + " " +
                rstAuthors.getField("address").getString() + " " +
                rstAuthors.getField("city").getString() + " " +
                rstAuthors.getField("state").getString() + " ");
            rstAuthors.getField("zip").getProperties().
                getItem("Optimize").setBoolean(false); // Den Index löschen.

            // Objekte vor dem Beenden löschen.
            rstAuthors.close();
            System.out.println("\nPress <Enter> to continue..");
            in.readLine();
        }
        catch( AdoException ae )
        {
            // Die Benutzer über alle Fehler informieren, die durch ADO
            // entstanden sind.

            // Beim Weitergeben eines Recordsets zuerst auf
            // NULL-Zeiger prüfen.
            if (rstAuthors != null)
            {
                PrintProviderError(rstAuthors.getActiveConnection());
            }
            else
            {
                System.out.println("Exception: " + ae.getMessage());
            }
        }

        // Der Systemlesevorgang erfordert diesen Catch-Aufruf.
        catch( java.io.IOException je)
        {
            PrintIOError(je);
        }
    }

    // PrintProviderError-Funktion

    static void PrintProviderError( Connection Cnn1 )
    {
        // Providerfehler des Connection-Objekts drucken.
        // ErrItem ist ein Objekt in der Errors-Auflistung des
        // Connection-Objekts.
        com.ms.wfc.data.Error  ErrItem = null;
        long nCount = 0;
        int  i      = 0;

        nCount = Cnn1.getErrors().getCount();

        // Fehler drucken, falls Fehler in der Auflistung auftreten.
        if( nCount > 0);
        {
            // Die Auflistung reicht von 0 bis nCount – 1.
            for (i = 0; i< nCount; i++)
            {
                ErrItem = Cnn1.getErrors().getItem(i);
                System.out.println("\t Error number: " + ErrItem.getNumber()
                    + "\t" + ErrItem.getDescription() );
            }
        }

    }

    // PrintIOError-Funktion

    static void PrintIOError( java.io.IOException je)
    {
        System.out.println("Error \n");
        System.out.println("\tSource = " + je.getClass() + "\n");
        System.out.println("\tDescription = " + je.getMessage() + "\n");
    }
}


Beispiel für die OriginalValue- und UnderlyingValue-Eigenschaften (VJ++)

In diesem Beispiel werden die Eigenschaften OriginalValue und UnderlyingValue erläutert, indem eine Nachricht angezeigt wird, wenn sich die einem Datensatz zugrunde liegenden Daten während der Stapelaktualisierung eines Recordset-Objekts geändert haben.

import com.ms.wfc.data.*;
import java.io.* ;

public class OriginalValueX
{
    // Der Haupteinstiegspunkt für die Anwendung.

    public static void main (String[] args)
    {
        OriginalValueX();
        System.exit(0);
    }

    // OriginalValueX-Funktion

    static void OriginalValueX()
    {
        // ADO-Objekte definieren.
        Connection cnConn1 = null;
        Recordset rstTitles = null;
        Field fldType = null;

        // Deklarationen
        String strCnn = "Provider=sqloledb;Data Source=srv;"
            + "Initial Catalog=Pubs;User Id=sa;Password=;";
        BufferedReader in =
            new BufferedReader (new InputStreamReader(System.in));

        try
        {
            // Eine Verbindung öffnen.
            cnConn1 = new Connection();
            cnConn1.open(strCnn);

            // Ein Recordset für die Stapelaktualisierung öffnen.
            rstTitles = new Recordset();
            rstTitles.setActiveConnection(cnConn1);
            rstTitles.setCursorType(AdoEnums.CursorType.KEYSET);
            rstTitles.setLockType(AdoEnums.LockType.BATCHOPTIMISTIC);
            rstTitles.open("Titles",cnConn1,
                           AdoEnums.CursorType.KEYSET,
                           AdoEnums.LockType.BATCHOPTIMISTIC,
                           AdoEnums.CommandType.TABLE);

            // Die Feldobjektvariable für das Type-Feld festlegen.
            fldType = rstTitles.getField("type");

            // Den Typ der Psychologietitel ändern.
            while(!rstTitles.getEOF())
            {
                if(rstTitles.getField("type").getString().
                    trim().equals("psychology"))
                    fldType.setString("self_help");
                rstTitles.moveNext();
            }

            // Eine Änderung durch einen anderen Benutzer simulieren, indem
            // Daten mit einer Befehlszeichenfolge aktualisiert werden.
            cnConn1.execute("UPDATE Titles SET type = 'sociology' "
                                + "WHERE type = 'psychology'");

            // Auf Änderungen prüfen.
            rstTitles.moveFirst();

            while(!rstTitles.getEOF())
            {
                String strOriginalValue =
                    fldType.getOriginalValue().toString().trim();
                String strUnderlyingValue =
                    fldType.getUnderlyingValue().toString().trim();
                if(!(strOriginalValue.equals(strUnderlyingValue)))
                {
                    System.out.println("Data has changed!" + "\n\n");
                    System.out.println("\tTitle ID: "
                        + rstTitles.getField("title_id").getString().trim() +
                        "\n");
                    System.out.println("\tCurrent value: "
                            + fldType.getString()+ "\n");
                    System.out.println("\tOriginal value: "
                            + fldType.getOriginalValue().toString()+ "\n");
                    System.out.println("\tUnderlying value: "
                            + fldType.getUnderlyingValue().toString()+ "\n");
                    System.out.println("\n\nPress <Enter> to continue..");
                    in.readLine();
                }
                rstTitles.moveNext();
            }
            // Die Aktualisierung abbrechen, da es sich um ein Beispiel
            // handelt.

            rstTitles.cancelBatch();
            rstTitles.close();

            // Originalwerte wiederherstellen.
            cnConn1.execute("UPDATE Titles SET type = 'psychology' "
                            + "WHERE type = 'sociology'");

            // Objekte vor dem Beenden löschen.
            cnConn1.close();

        }
        catch( AdoException ae )
        {
            // Benutzer über alle Fehler informieren, die durch ADO
            // entstanden sind.

            // Beim Weitergeben eines Recordsets zuerst auf
            // NULL-Zeiger prüfen.
            if (rstTitles!= null)
            {
                PrintProviderError(rstTitles.getActiveConnection());
            }
            else
            {
                System.out.println("Exception: " + ae.getMessage());
            }
        }

        // Der Systemlesevorgang erfordert diesen Catch-Aufruf.
        catch( java.io.IOException je)
        {
            PrintIOError(je);
        }

    }

    // PrintProviderError-Funktion

    static void PrintProviderError( Connection Cnn1 )
    {
        // Providerfehler des Connection-Objekts drucken.
        // ErrItem ist ein Objekt in der Errors-Auflistung des
        // Connection-Objekts.
        com.ms.wfc.data.Error  ErrItem = null;
        long nCount = 0;
        int  i      = 0;

        nCount = Cnn1.getErrors().getCount();

        // Fehler drucken, falls Fehler in der Auflistung auftreten.
        if( nCount > 0);
        {
            // Die Auflistung reicht von 0 bis nCount – 1.
            for (i = 0; i< nCount; i++)
            {
                ErrItem = Cnn1.getErrors().getItem(i);
                System.out.println("\t Error number: " + ErrItem.getNumber()
                    + "\t" + ErrItem.getDescription() );
            }
        }

    }

    // PrintIOError-Funktion

    static void PrintIOError( java.io.IOException je)
    {
        System.out.println("Error \n");
        System.out.println("\tSource = " + je.getClass() + "\n");
        System.out.println("\tDescription = " + je.getMessage() + "\n");
    }
}


Beispiel für die Prepared-Eigenschaft (VJ++)

In diesem Beispiel wird die Prepared-Eigenschaft erläutert, indem zwei Command-Objekte geöffnet werden - ein vorverarbeitetes und ein nicht vorverarbeitetes.

import com.ms.wfc.data.*;
import java.io.* ;

public class PreparedX
{
    // Der Haupteinstiegspunkt für die Anwendung.

    public static void main (String[] args)
    {
        PreparedX();
        System.exit(0);
    }

    // PreparedX-Funktion

    static void PreparedX()
    {
        // Zeichenfolgenvariablen definieren.
        String strCnn = "Provider=sqloledb;Data Source=srv;"
                + "Initial Catalog=Pubs;User Id=sa;Password=;";
        String strCmd = "SELECT title, type FROM Titles ORDER BY type";

        // ADO-Objekte definieren.
        Connection cnConn1 = null;
        Command cmd1 = null;
        Command cmd2 = null;

        // Deklarationen
        BufferedReader in =
            new BufferedReader (new InputStreamReader(System.in));
        long timeStart;
        long timeEnd;
        float timeNotPrepared ;
        float timePrepared;
        int   intLoop;
        String strTemp;

        try
        {
            // Eine Verbindung öffnen.
            cnConn1 = new Connection();
            cnConn1.open(strCnn);

            // Zwei Befehlsobjekte für denselben Befehl
            // erstellen – ein vorbereitetes und ein unvorbereitetes.
            cmd1 = new Command();
            cmd1.setActiveConnection(cnConn1);
            cmd1.setCommandType(AdoEnums.CommandType.TEXT);
            cmd1.setCommandText(strCmd);

            cmd2 = new Command();
            cmd2.setActiveConnection(cnConn1);
            cmd2.setCommandType(AdoEnums.CommandType.TEXT);
            cmd2.setCommandText(strCmd);
            cmd2.setPrepared(true);

            // Einen Timer festlegen, dann den unvorbereiteten Befehl
            // 20-mal ausführen.
            timeStart = System.currentTimeMillis();
            for ( intLoop = 0; intLoop < 20; intLoop++)
                cmd1.execute();
            timeEnd = System.currentTimeMillis();
            timeNotPrepared =(float)(timeEnd - timeStart)/1000f;

            // Den Timer zurücksetzen und dann den vorbereiteten
            // Befehl 20-mal ausführen.
            timeStart = System.currentTimeMillis();
            for ( intLoop = 0; intLoop < 20; intLoop++)
                cmd2.execute();
            timeEnd = System.currentTimeMillis();
            timePrepared =(float)(timeEnd - timeStart)/1000f;

            // Die Leistungsergebnisse anzeigen.
            System.out.println("\nPerformance Results:");
            System.out.println("\n\tNot Prepared: " + timeNotPrepared +
                " seconds");
            System.out.println("\n\tPrepared: " + timePrepared +
                " seconds");
            System.out.println("\n\nPress <Enter> to continue..");
            in.readLine();

            // Objekte vor dem Beenden löschen.
            cnConn1.close();

        }
        catch( AdoException ae )
        {
            // Benutzer über alle Fehler informieren, die durch ADO
            // entstanden sind.

            // Beim Weitergeben eines Recordsets erst auf NULL-Zeiger
            // überprüfen.
            if (cnConn1!= null)
            {
                PrintProviderError(cnConn1);
            }
            else
            {
                System.out.println("Exception: " + ae.getMessage());
            }
        }

        // Der Systemlesevorgang erfordert diesen Catch-Aufruf.
        catch( java.io.IOException je)
        {
            PrintIOError(je);
        }

    }

    // PrintProviderError-Funktion

    static void PrintProviderError( Connection Cnn1 )
    {
        // Providerfehler des Connection-Objekts drucken.
        // ErrItem ist ein Objekt in der Errors-Auflistung des
        // Connection-Objekts.
        com.ms.wfc.data.Error  ErrItem = null;
        long nCount = 0;
        int  i      = 0;

        nCount = Cnn1.getErrors().getCount();

        // Fehler drucken, falls Fehler in der Auflistung auftreten.
        if( nCount > 0);
        {
            // Die Auflistung reicht von 0 bis nCount – 1.
            for (i = 0; i< nCount; i++)
            {
                ErrItem = Cnn1.getErrors().getItem(i);
                System.out.println("\t Error number: " + ErrItem.getNumber()
                    + "\t" + ErrItem.getDescription() );
            }
        }

    }

    // PrintIOError-Funktion

    static void PrintIOError( java.io.IOException je)
    {
        System.out.println("Error \n");
        System.out.println("\tSource = " + je.getClass() + "\n");
        System.out.println("\tDescription = " + je.getMessage() + "\n");
    }
}


Beispiel für die Provider- und DefaultDatabase-Eigenschaften (VJ++)

In diesem Beispiel wird die Provider-Eigenschaft erläutert, indem drei Connection-Objekte mit verschiedenen Providern geöffnet werden. Es wird auch die DefaultDatabase-Eigenschaft verwendet, um die Standarddatenbank auf den Microsoft ODBC-Provider festzulegen.

import java.io.*;
import com.ms.wfc.data.*;

public class ProviderX
{
    // Der Haupteinstiegspunkt der Anwendung.
    public static void main (String[] args)
    {
        ProviderX();
        System.exit(0);
    }
    // ProviderX-Funktion
    static void ProviderX()
    {
        // ADO-Objekte definieren.
        Connection cnn1 = null;
        Connection cnn2 = null;
        Connection cnn3 = null;

        // Deklarationen
        BufferedReader in =
            new BufferedReader(new InputStreamReader(System.in));
        try
        {
            // Eine Verbindung mithilfe des Microsoft ODBC-Providers öffnen.
            cnn1 = new Connection();
            cnn1.setConnectionString("driver={SQL Server};"+
                 "server=srv;User id=sa;Password=;");
            cnn1.open();
            cnn1.setDefaultDatabase("Pubs");

            // Den Provider anzeigen.
            System.out.println("\n\n\tCnn1 provider: "+ cnn1.getProvider());

            // Eine Verbindung mithilfe des Microsoft Jet OLE DB-Providers
            // öffnen.
            cnn2 = new Connection();
            cnn2.setProvider("Microsoft.Jet.OLEDB.3.51");
            cnn2.open("C:\\Program Files\\Microsoft "
            "Office\\Office\\Samples\\Northwind.mdb","admin","");

            // Den Provider anzeigen.
            System.out.println("\n\n\tCnn2 provider: " +
                cnn2.getProvider());

            // Eine Verbindung mithilfe des Microsoft
            // SQL Server-Providers öffnen.
            cnn3 = new Connection();
            cnn3.setProvider("sqloledb");
            cnn3.open("Data Source=srv;Initial Catalog= Pubs;","sa","");

            // Den Provider anzeigen.
            System.out.println("\n\n\tCnn3 provider: " +
                cnn3.getProvider());

            // Die Objekte vor dem Beenden löschen.
            cnn1.close();
            cnn2.close();
            cnn3.close();

            System.out.println("\n\n\tPress <Enter> to continue..");
            in.readLine();
        }
        catch(AdoException ae)
        {
            // Die Benutzer über alle Fehler informieren, die durch ADO
            // entstanden sind.

            // Beim Weitergeben eines Recordsets erst auf NULL-Zeiger
            // überprüfen.
            if(cnn1 != null)
            {
                PrintProviderError(cnn1);
            }
            else
            {
                System.out.println("Exception: " + ae.getLocalizedMessage());
            }
        }
        // Der Systemlesevorgang erfordert diesen Catch-Aufruf.
        catch(java.io.IOException je)
        {
            PrintIOError(je);
        }
    }
    // PrintProviderError-Funktion

    static void PrintProviderError( Connection Cnn1 )
    {
        // Providerfehler des Connection-Objekts drucken.
        // ErrItem ist ein Objekt in der Errors-Auflistung des
        // Connection-Objekts.
        com.ms.wfc.data.Error  ErrItem = null;
        long nCount = 0;
        int  i      = 0;

        nCount = Cnn1.getErrors().getCount();

        // Fehler drucken, falls Fehler in der Auflistung auftreten.
        if( nCount > 0);
        {
            // Die Auflistung reicht von 0 bis nCount – 1.
            for (i = 0; i< nCount; i++)
            {
                ErrItem = Cnn1.getErrors().getItem(i);
                System.out.println("\t Error number: " + ErrItem.getNumber()
                    + "\t" + ErrItem.getDescription() );
            }
        }

    }

    // PrintIOError-Funktion

    static void PrintIOError( java.io.IOException je)
    {
        System.out.println("Error \n");
        System.out.println("\tSource = " + je.getClass() + "\n");
        System.out.println("\tDescription = " + je.getMessage() + "\n");
    }
}


Beispiel für die Refresh-Methode (VJ++)

In diesem Beispiel wird die Verwendung der Refresh-Methode zum Aktualisieren der Parameters-Auflistung für das Command-Objekt einer gespeicherten Prozedur verdeutlicht.

import  com.ms.wfc.data.*;
import java.io.*;

public class RefreshX
{
    // Der Haupteinstiegspunkt für die Anwendung.

    public static void main (String[] args)
    {
        RefreshX();
        System.exit(0);
    }

    // RefreshX-Funktion

    static void RefreshX()
    {
        // ADO-Objekte definieren.
        Connection cnConn1 = null;
        Command cmdByRoyalty = null;
        Recordset rstByRoyalty = null;
        Recordset rstAuthors = null;

        // Deklarationen.
        String strAuthorID;
        String strFName;
        String strLName;
        int intRoyalty ;
        BufferedReader in =
            new BufferedReader (new InputStreamReader (System.in));
        String line = null;

        try
        {
            // Eine Verbindung öffnen.
            String strCnn = "Provider=sqloledb;Data Source=srv;"
                           + "Initial Catalog=Pubs;User Id=sa;Password=;";

            cnConn1 = new Connection();
            cnConn1.open(strCnn);

            // Ein Command-Objekt für eine gespeicherte Prozedur
            // mit einem einzelnen Parameter öffnen.
            cmdByRoyalty = new Command();
            cmdByRoyalty.setActiveConnection(cnConn1);
            cmdByRoyalty.setCommandText("byRoyalty");
            cmdByRoyalty.setCommandType(AdoEnums.CommandType.STOREDPROC);
            cmdByRoyalty.getParameters().refresh();

            // Den Parameterwert abrufen und den Befehl ausführen,
            // dabei die Ergebnisse im Recordset speichern.
            System.out.println ("\nEnter Royalty : ");
            line = in.readLine().trim();
            intRoyalty = Integer.parseInt(line);
            cmdByRoyalty.getParameters().getItem(1).setInt(intRoyalty);

            // Durch Ausführen des Befehls ein Recordset erstellen.
            rstByRoyalty = cmdByRoyalty.execute();

            // Die Authors-Tabelle öffnen, um Autorennamen zum
            // Anzeigen abzurufen.
            rstAuthors = new Recordset ();
            rstAuthors.open(
                "Authors",strCnn,AdoEnums.CursorType.FORWARDONLY,
                AdoEnums.LockType.READONLY, AdoEnums.CommandType.TABLE );

            // Die aktuellen Daten im Recordset drucken,
            // dabei Autorennamen aus der Authors-Tabelle hinzufügen.
            System.out.println("\nAuthors with " + intRoyalty +
                               " percent royalty");
            while (!rstByRoyalty.getEOF())
            {
                strAuthorID =  rstByRoyalty.getField("au_id").getString();
                rstAuthors.setFilter("au_id ='" +  strAuthorID + "'");
                strFName = rstAuthors.getField("au_fname").getString();
                strLName = rstAuthors.getField("au_lname").getString();
                System.out.println("\t" + strAuthorID + ", " + strFName
                                   + " " + strLName);
                rstByRoyalty.moveNext();
            }
            System.out.println("\n\nPress <Enter> key to continue..");
            line = in.readLine();

            // Cleanup der Objekte vor dem Beenden.
            rstByRoyalty.close();
            rstAuthors.close();
            cnConn1.close();

        }
        catch( AdoException ae )
        {
            // Den Benutzer ggf. über von ADO stammende Fehler
            // benachrichtigen.

            // Beim Bearbeiten eines Recordsets zunächst auf
            // NULL-Zeiger prüfen.
            if (rstByRoyalty != null)
            {
                PrintProviderError(rstByRoyalty.getActiveConnection());
            }
            else if (rstAuthors != null)
            {
                PrintProviderError(rstAuthors.getActiveConnection());
            }
            else
            {
                System.out.println("Exception: " + ae.getMessage());
            }
        }

        // Dieser Catch-Aufruf ist für den Fall notwendig, dass die
        // Eingabezeichenfolge nicht in den Datentyp Integer konvertiert
        // werden kann.
        catch ( java.lang.NumberFormatException ne)
        {
                System.out.println("\nException: Integer Input required.");
        }
        // Der Systemlesevorgang erfordert diesen Catch-Aufruf.
        catch( java.io.IOException je )
        {
            PrintIOError(je);
        }
    }

    // PrintProviderError-Funktion

    static void PrintProviderError( Connection Cnn1 )
    {
        // Vom Connection-Objekt stammende Providerfehler drucken.
        // ErrItem ist ein Elementobjekt in der Errors-Auflistung des
        // Connection-Objekts.
        com.ms.wfc.data.Error  ErrItem = null;
        long nCount = 0;
        int  i      = 0;

        nCount = Cnn1.getErrors().getCount();

        // Ggf. die Fehler in der Auflistung drucken.
        if( nCount > 0);
        {
            // Die Auflistung hat den Bereich 0 bis nCount - 1
            for (i = 0; i< nCount; i++)
            {
                ErrItem = Cnn1.getErrors().getItem(i);
                System.out.println("\t Error number: " + ErrItem.getNumber()
                    + "\t" + ErrItem.getDescription() );
            }
        }

    }

    // PrintIOError-Funktion

    static void PrintIOError( java.io.IOException je)
    {
        System.out.println("Error \n");
        System.out.println("\tSource = " + je.getClass() + "\n");
        System.out.println("\tDescription = " + je.getMessage() + "\n");
    }
}


Beispiel für die Resync-Methode (VJ++)

In diesem Beispiel wird die Verwendung der Resync-Methode zum Aktualisieren von Daten in einem statischen Recordset verdeutlicht.

import java.io.*;
import com.ms.wfc.data.*;

public class ResyncX
{
    // Der Haupteinstiegspunkt der Anwendung.
    public static void main (String[] args)
    {
        ResyncX();
        System.exit(0);
    }
    static void ResyncX()
    {
        // ADO-Objekte definieren.
        Recordset rstTitles = null;

        // Deklarationen.
        BufferedReader in =
            new BufferedReader(new InputStreamReader(System.in));
        String strCnn = "Provider=sqloledb;Data Source=srv;" +
                        "Initial Catalog=Pubs;User Id=sa;Password=;";

        try
        {
            // Ein Recordset für die Titles-Tabelle öffnen.
            rstTitles = new Recordset();
            rstTitles.setCursorLocation(AdoEnums.CursorLocation.CLIENT);
            rstTitles.setCursorType(AdoEnums.CursorType.STATIC);
            rstTitles.setLockType(AdoEnums.LockType.BATCHOPTIMISTIC);
            rstTitles.open("Titles", strCnn, AdoEnums.CursorType.STATIC,
                AdoEnums.LockType.BATCHOPTIMISTIC,
                AdoEnums.CommandType.TABLE);

            // Den Typ des ersten Titels im Recordset ändern.
            rstTitles.getField("type").setString("database");

            // Die Ergebnisse der Änderung anzeigen.
            System.out.println("\n\n\tBefore resync:\n" + "\tTitle - " +
                rstTitles.getField("title").getString() +
                "\n\tType  - " + rstTitles.getField("type").getString());

            // Erneut mit der Datenbank synchronisieren und die Ergebnisse
            // anzeigen.
            rstTitles.resync();
            System.out.println("\n\n\tAfter resync:\n" + "\tTitle - " +
                rstTitles.getField("title").getString() +
                "\n\tType  - " +
                rstTitles.getField("type").getString()+"\n");
            rstTitles.cancelBatch();

            // Cleanup der Objekte vor dem Beenden.
            rstTitles.close();

            System.out.println("\tPress <Enter> to continue..");
            in.readLine();

        }
        catch(AdoException ae)
        {
            // Den Benutzer ggf. über von ADO stammende Fehler
            // benachrichtigen.

            // Beim Bearbeiten eines Recordsets zunächst auf
            // NULL-Zeiger prüfen.
            if(rstTitles != null)
            {
                PrintProviderError(rstTitles.getActiveConnection());
            }
            else
            {
                System.out.println("Exception: " + ae.getMessage());
            }
        }
        // Der Systemlesevorgang erfordert diesen Catch-Aufruf.
        catch(java.io.IOException je)
        {
            PrintIOError(je);
        }
    }

    // PrintProviderError-Funktion

    static void PrintProviderError( Connection Cnn1 )
    {
        // Vom Connection-Objekt stammende Providerfehler drucken.
        // ErrItem ist ein Elementobjekt in der Errors-Auflistung des
        // Connection-Objekts.
        com.ms.wfc.data.Error  ErrItem = null;
        long nCount = 0;
        int  i      = 0;

        nCount = Cnn1.getErrors().getCount();

        // Ggf. die Fehler in der Auflistung drucken.
        if( nCount > 0);
        {
            // Die Auflistung hat den Bereich 0 bis nCount - 1
            for (i = 0; i< nCount; i++)
            {
                ErrItem = Cnn1.getErrors().getItem(i);
                System.out.println("\t Error number: " + ErrItem.getNumber()
                    + "\t" + ErrItem.getDescription() );
            }
        }

    }

    // PrintIOError-Funktion

    static void PrintIOError( java.io.IOException je)
    {
        System.out.println("Error \n");
        System.out.println("\tSource = " + je.getClass() + "\n");
        System.out.println("\tDescription = " + je.getMessage() + "\n");
    }
}


Beispiel für die Save- und Open-Methoden (VJ++)

Die nachstehenden drei Beispiele verdeutlichen, wie die Save- und Open-Methoden gemeinsam verwendet werden können.

Bei diesen Beispielen wird davon ausgegangen, dass Sie auf Geschäftsreise gehen und eine Tabelle aus einer Datenbank mitnehmen möchten. Vor der Abreise greifen Sie auf die Daten in Form eines Recordset-Objekts zu und speichern sie in einem Format, mit dem Sie auf der Reise arbeiten können. Am Zielort angekommen, greifen Sie auf das nunmehr lokale nicht verbundene Recordset-Objekt zu. Sie führen Änderungen am Recordset-Objekt durch und speichern es mit den Änderungen. Nach Ihrer Rückkehr verbinden Sie sich erneut mit der Datenbank und aktualisieren diese mit den auf Ihrer Geschäftsreise durchgeführten Änderungen.

import com.ms.wfc.data.*;
import java.io.* ;

public class SaveX
{
    // Der Haupteinstiegspunkt für die Anwendung.

    public static void main (String[] args)
    {
        SaveX1();
        SaveX2();
        SaveX3();
        System.exit(0);
    }

    // Zunächst auf die Authors-Tabelle zugreifen und diese speichern.

    // SaveX1-Funktion

    static void SaveX1()
    {
        // ADO-Objekte definieren.
        Recordset rstAuthors = null;

        // Deklarationen.
        String strCnn = "DSN=Pubs;Provider=MSDASQL;uid=sa;pwd=;";
        BufferedReader in =
            new BufferedReader(new InputStreamReader(System.in));
        File file;

        try
        {
            rstAuthors = new Recordset();
            rstAuthors.setCursorLocation(AdoEnums.CursorLocation.CLIENT);
            rstAuthors.open("SELECT * FROM Authors",
                                strCnn,
                                AdoEnums.CursorType.DYNAMIC,
                                AdoEnums.LockType.OPTIMISTIC,
                                AdoEnums.CommandType.TEXT);

            // Das Recordset zu Illustrationszwecken im
            // XML-Format auf eine Diskette speichern.
            file = new File("a:\\Pubs.xml");
            if(!file.exists())
                rstAuthors.save("a:\\Pubs.xml",AdoEnums.PersistFormat.XML);
            else
            {
                System.out.println("\nFile already exists.");
                System.out.println("\nPress <Enter> to continue..");
                in.readLine();
                System.exit(0);
            }
            // Cleanup der Objekte vor dem Beenden.
            rstAuthors.close();
        }
        catch( AdoException ae )
        {
            // Den Benutzer ggf. über von ADO stammende Fehler
            // benachrichtigen.

            // Beim Bearbeiten eines Recordsets zunächst auf
            // NULL-Zeiger prüfen.
            if (rstAuthors != null)
            {
                PrintProviderError(rstAuthors.getActiveConnection());
            }
            else
            {
                System.out.println("Exception: " + ae.getMessage());
            }
        }
        // Der Systemlesevorgang erfordert diesen Catch-Aufruf.
        catch( java.io.IOException je)
        {
            PrintIOError(je);
        }
    }

    // Das gewünschte Ergebnis ist hier erreicht. Auf die Authors-Tabelle
    // kann nun als lokales, nicht verbundenes Recordset zugegriffen
    // werden. Beachten Sie, dass der MSPersist-Provider auf dem
    // verwendeten Computer vorhanden sein muss, um auf die gespeicherte
    // Datei a:\Pubs.xml zuzugreifen.

    // SaveX2-Funktion

    static void SaveX2()
    {
        // ADO-Objekte definieren.
        Recordset rstAuthors = null;

        // Deklarationen.
        BufferedReader in =
            new BufferedReader(new InputStreamReader(System.in));

        try
        {
            rstAuthors = new Recordset();

            // Zu Illustrationszwecken alle Parameter angeben.
            rstAuthors.open("a:\\Pubs.xml",
                    "Provider=MSPersist;",
                    AdoEnums.CursorType.FORWARDONLY,
                    AdoEnums.LockType.OPTIMISTIC,
                    AdoEnums.CommandType.FILE);

            // Jetzt liegt ein lokales, nicht verbundenes Recordset vor.
            // Bearbeiten Sie es nach Wunsch.
            // (In diesem Beispiel macht die Änderung keinen Unterschied).
            rstAuthors.find("au_lname = 'Carson'");
            if(rstAuthors.getEOF())
            {
                System.out.println("Name not found.");
                System.out.println("\nPress <Enter> to continue..");
                in.readLine();
                return;
            }
            rstAuthors.getField("city").setString("Berkeley");
            rstAuthors.update();

            // Die Änderungen zur Illustration jetzt im ADTG-Format
            // speichern. Beachten Sie, dass die vorige Version,
            // a:\Pubs.xml, sich noch auf der Diskette befindet.
            rstAuthors.save("a:\\Pubs.adtg",AdoEnums.PersistFormat.ADTG);

            // Cleanup der Objekte vor dem Beenden.
            rstAuthors.close();
        }
        catch( AdoException ae )
        {
            // Den Benutzer ggf. über von ADO stammende Fehler
            // benachrichtigen.

            // Beim Bearbeiten eines Recordsets zunächst auf
            // NULL-Zeiger prüfen.
            if (rstAuthors != null)
            {
                PrintProviderError(rstAuthors.getActiveConnection());
            }
            else
            {
                System.out.println("Exception: " + ae.getMessage());
            }
        }

        // Der Systemlesevorgang erfordert diesen Catch-Aufruf.
        catch( java.io.IOException je)
        {
            PrintIOError(je);
        }
    }

    // Die Datenbank jetzt mit den Änderungen aktualisieren.

    // SaveX3-Funktion

    static void SaveX3()
    {
        // ADO-Objekte definieren.
        Connection cnConn1 = null;
        Recordset rstAuthors = null;

        // Deklarationen.
        String strCnn = "DSN=Pubs;Provider=MSDASQL;uid=sa;pwd=;";

        try
        {
            // Falls kein Wert für ActiveConnection vorliegt, kann Open mit
            // Standardwerten aufgerufen werden.
            rstAuthors = new Recordset();
            rstAuthors.open("c:\\Pubs.adtg");

            // Die Verbindung zur Datenbank herstellen, das Recordset mit
            // der Verbindung verknüpfen und dann die Datenbanktabelle mit
            // dem veränderten Recordset aktualisieren.
            cnConn1 = new Connection();
            cnConn1.open(strCnn);
            rstAuthors.setActiveConnection(cnConn1);
            rstAuthors.updateBatch();

            // Cleanup der Objekte vor dem Beenden.
            rstAuthors.close();
            cnConn1.close();
        }
        catch( AdoException ae )
        {
            // Den Benutzer ggf. über von ADO stammende Fehler
            // benachrichtigen.

            // Beim Bearbeiten eines Recordsets zunächst auf
            // NULL-Zeiger prüfen.
            if (rstAuthors != null)
            {
                PrintProviderError(rstAuthors.getActiveConnection());
            }
            else
            {
                System.out.println("Exception: " + ae.getMessage());
            }
        }
    }

    // PrintProviderError-Funktion

    static void PrintProviderError( Connection Cnn1 )
    {
        // Vom Connection-Objekt stammende Providerfehler drucken.
        // ErrItem ist ein Elementobjekt in der Errors-Auflistung des
        // Connection-Objekts.
        com.ms.wfc.data.Error  ErrItem = null;
        long nCount = 0;
        int  i      = 0;

        nCount = Cnn1.getErrors().getCount();

        // Ggf. die Fehler in der Auflistung drucken.
        if( nCount > 0);
        {
            // Die Auflistung hat den Bereich 0 bis nCount - 1
            for (i = 0; i< nCount; i++)
            {
                ErrItem = Cnn1.getErrors().getItem(i);
                System.out.println("\t Error number: " + ErrItem.getNumber()
                    + "\t" + ErrItem.getDescription() );
            }
        }

    }

    // PrintIOError-Funktion

    static void PrintIOError( java.io.IOException je)
    {
        System.out.println("Error \n");
        System.out.println("\tSource = " + je.getClass() + "\n");
        System.out.println("\tDescription = " + je.getMessage() + "\n");
    }
}


Beispiel für die Sort-Eigenschaft (VJ++)

Dieses Beispiel verwendet die Sort-Eigenschaft des Recordset-Objekts, um die Zeilen eines Recordsets aus der Authors-Tabelle der Pubs-Datenbank neu zu sortieren. Mithilfe einer sekundären Hilfsroutine werden die einzelnen Zeilen gedruckt.

import com.ms.wfc.data.*;
import java.io.* ;

public class SortX
{
    // Der Haupteinstiegspunkt für die Anwendung.

    public static void main (String[] args)
    {
        SortX();
        System.exit(0);
    }

    // SortX-Funktion

    static void SortX()
    {
        // ADO-Objekte definieren.
        Connection cnConn1 = null;
        Recordset rstAuthors = null;

        // Deklarationen.
        String strCnn = "DSN=Pubs;Provider=MSDASQL;uid=sa;pwd=;";

        try
        {
            cnConn1 = new Connection();
            cnConn1.open(strCnn);
            rstAuthors = new Recordset();
            rstAuthors.setCursorLocation(AdoEnums.CursorLocation.CLIENT);
            rstAuthors.open("SELECT * FROM Authors",
                    cnConn1,
                    AdoEnums.CursorType.STATIC,
                    AdoEnums.LockType.READONLY,
                    AdoEnums.CommandType.TEXT);
            SortXprint("Initial Order",rstAuthors);

            rstAuthors.setSort("au_lname ASC, au_fname ASC");
            SortXprint("Last Name Ascending",rstAuthors);

            rstAuthors.setSort("au_lname DESC, au_fname ASC");
            SortXprint("Last Name Descending",rstAuthors);

            // Cleanup der Objekte vor dem Beenden.
            rstAuthors.close();
            cnConn1.close();
        }
        catch( AdoException ae )
        {
            // Den Benutzer ggf. über von ADO stammende Fehler
            // benachrichtigen.

            // Beim Bearbeiten eines Recordsets zunächst auf
            // NULL-Zeiger prüfen.
            if (rstAuthors != null)
            {
                PrintProviderError(rstAuthors.getActiveConnection());
            }
            else
            {
                System.out.println("Exception: " + ae.getMessage());
            }
        }

    }

    // SortXprint-Funktion

    static void SortXprint(String strTitle,Recordset rstp)
    {
        // Deklarationen.
        BufferedReader in =
            new BufferedReader (new InputStreamReader(System.in));
        int intDisplaysize = 15;
        int intCount = 1;
        try
        {
            System.out.println("---------------" +
                               strTitle +
                               "---------------");
            System.out.println("First Name   Last Name" + "\n" +
                               "-------------------------" +
                               "-------------------------");
            rstp.moveFirst();
            while(!rstp.getEOF())
            {
                System.out.println(rstp.getField("au_fname").getString() +
                                   "   " +
                                   rstp.getField("au_lname").getString());
                if(intCount % intDisplaysize == 0)
                {
                    System.out.println("\nPress <Enter> to continue..");
                    in.readLine();
                    intCount = 0;
                }
                intCount++;
                rstp.moveNext();
            }
            System.out.println("\nPress <Enter> to continue..");
            in.readLine();
        }
        catch( AdoException ae )
        {
            // Den Benutzer ggf. über von ADO stammende Fehler
            // benachrichtigen.

            // Beim Bearbeiten eines Recordsets zunächst auf
            // NULL-Zeiger prüfen.
            if (rstp != null)
            {
                PrintProviderError(rstp.getActiveConnection());
            }
            else
            {
                System.out.println("Exception: " + ae.getMessage());
            }
        }

        // Der Systemlesevorgang erfordert diesen Catch-Aufruf.
        catch( java.io.IOException je)
        {
            PrintIOError(je);
        }
    }
    // PrintProviderError-Funktion

    static void PrintProviderError( Connection Cnn1 )
    {
        // Vom Connection-Objekt stammende Providerfehler drucken.
        // ErrItem ist ein Elementobjekt in der Errors-Auflistung des
        // Connection-Objekts.
        com.ms.wfc.data.Error  ErrItem = null;
        long nCount = 0;
        int  i      = 0;

        nCount = Cnn1.getErrors().getCount();

        // Ggf. die Fehler in der Auflistung drucken.
        if( nCount > 0);
        {
            // Die Auflistung hat den Bereich 0 bis nCount - 1
            for (i = 0; i< nCount; i++)
            {
                ErrItem = Cnn1.getErrors().getItem(i);
                System.out.println("\t Error number: " + ErrItem.getNumber()
                    + "\t" + ErrItem.getDescription() );
            }
        }

    }

    // PrintIOError-Funktion

    static void PrintIOError( java.io.IOException je)
    {
        System.out.println("Error \n");
        System.out.println("\tSource = " + je.getClass() + "\n");
        System.out.println("\tDescription = " + je.getMessage() + "\n");
    }
}


Beispiel für die Source-Eigenschaft (VJ++)

In diesem Beispiel wird die Source-Eigenschaft erläutert, indem drei Recordset-Objekte geöffnet werden, die auf unterschiedlichen Datenquellen basieren.

import java.io.*;
import com.ms.wfc.data.*;

public class SourceX
{
    // Der Haupteinstiegspunkt der Anwendung.
    public static void main (String[] args)
    {
        SourceX();
        System.exit(0);
    }
    // SourceX-Funktion
    static void SourceX()
    {
        // Zeichenfolgenvariablen definieren.
        String strCnn = "Provider=sqloledb;Data Source=srv;" +
                        "Initial Catalog=Pubs;User Id=sa;Password=;";
        String strSQL = "SELECT title_ID AS TitleID, title AS Title,"+
                     "publishers.pub_id AS PubID, pub_name AS PubName "+
                     "FROM publishers INNER JOIN Titles "+
                     "ON publishers.pub_id=Titles.pub_id "+
                     "ORDER BY Title";

        // ADO-Objekte definieren.
        Connection cnn1 = null;
        Recordset rstTitles = null;
        Recordset rstPublishers = null;
        Recordset rstPublishersDirect = null;
        Recordset rstTitlesPublishers = null;
        Command cmdSQL = null;

        // Deklarationen.
        BufferedReader in =
            new BufferedReader(new InputStreamReader(System.in));

        try
        {
            // Eine Verbindung öffnen.
            cnn1 = new Connection();
            cnn1.open(strCnn);

            // Ein Recordset auf der Grundlage eines Command-Objekts öffnen.
            cmdSQL = new Command();
            cmdSQL.setActiveConnection(cnn1);
            cmdSQL.setCommandText("Select title,type,pubdate " +
                 "FROM Titles ORDER BY title");

            rstTitles = new Recordset();
            rstTitles = cmdSQL.execute();

            // Ein Recordset auf der Grundlage einer Tabelle öffnen.
            rstPublishers = new Recordset();
            rstPublishers.open("publishers", strCnn,
                AdoEnums.CursorType.FORWARDONLY, AdoEnums.LockType.READONLY,
                AdoEnums.CommandType.TABLE);

            // Ein Recordset auf der Grundlage einer Tabelle öffnen.
            rstPublishersDirect = new Recordset();
            rstPublishersDirect.open("publishers", strCnn,
                AdoEnums.CursorType.FORWARDONLY, AdoEnums.LockType.READONLY,
                AdoEnums.CommandType.TABLEDIRECT);

            // Ein Recordset auf der Grundlage einer SQL-Zeichenfolge
            // öffnen.
            rstTitlesPublishers = new Recordset();

            rstTitlesPublishers.open(strSQL, strCnn,
                AdoEnums.CursorType.FORWARDONLY, AdoEnums.LockType.READONLY,
                AdoEnums.CommandType.TEXT);

            // Die Source-Eigenschaft verwenden, um die Quelle jedes
            // Recordsets anzuzeigen.
            System.out.println("\nrstTitles source: \n"+
                rstTitles.getSource());
            System.out.println("\nrstPublishers source: \n"+
                rstPublishers.getSource());
            System.out.println("\nrstPublishersDirect source:\n" +
                rstPublishersDirect.getSource() );
            System.out.println("\nrstTitlesPublishers source: \n" +
                rstTitlesPublishers.getSource());

            // Cleanup der Objekte vor dem Beenden.
            rstTitles.close();
            rstPublishers.close();
            rstPublishersDirect.close();
            rstTitlesPublishers.close();
            cnn1.close();

            System.out.println("\n\nPress <Enter> to continue..");
            in.readLine();
        }
        catch(AdoException ae)
        {
            // Den Benutzer ggf. über von ADO stammende Fehler
            // benachrichtigen.

            // Beim Bearbeiten eines Recordsets zunächst auf
            // NULL-Zeiger prüfen.

            if(rstPublishers != null)
            {
                PrintProviderError(rstPublishers.getActiveConnection());
            }
            else if(rstPublishersDirect != null)
            {
                PrintProviderError(
                    rstPublishersDirect.getActiveConnection());
            }
            else if(rstTitles != null)
            {
                PrintProviderError(rstTitles.getActiveConnection());
            }
            else if(rstTitlesPublishers != null)
            {
                PrintProviderError(
                    rstTitlesPublishers.getActiveConnection());
            }
            else
                System.out.println("Exception: " + ae.getMessage());

        }
        // Der Systemlesevorgang erfordert diesen Catch-Aufruf.
        catch(java.io.IOException je)
        {
            PrintIOError(je);
        }

    }
    // PrintProviderError-Funktion

    static void PrintProviderError( Connection Cnn1 )
    {
        // Vom Connection-Objekt stammende Providerfehler drucken.
        // ErrItem ist ein Elementobjekt in der Errors-Auflistung des
        // Connection-Objekts.
        com.ms.wfc.data.Error  ErrItem = null;
        long nCount = 0;
        int  i      = 0;

        nCount = Cnn1.getErrors().getCount();

        // Ggf. die Fehler in der Auflistung drucken.
        if( nCount > 0);
        {
            // Die Auflistung hat den Bereich 0 bis nCount - 1
            for (i = 0; i< nCount; i++)
            {
                ErrItem = Cnn1.getErrors().getItem(i);
                System.out.println("\t Error number: " + ErrItem.getNumber()
                    + "\t" + ErrItem.getDescription() );
            }
        }

    }

    // PrintIOError-Funktion

    static void PrintIOError( java.io.IOException je)
    {
        System.out.println("Error \n");
        System.out.println("\tSource = " + je.getClass() + "\n");
        System.out.println("\tDescription = " + je.getMessage() + "\n");
    }
}


Beispiel für die State-Eigenschaft (VJ++)

In diesem Beispiel wird die State-Eigenschaft zum Anzeigen einer Nachricht verwendet, während asynchrone Verbindungen geöffnet und asynchrone Befehle ausgeführt werden.

import com.ms.wfc.data.*;
import java.io.*;

public class StateX
{
    // Der Haupteinstiegspunkt der Anwendung.
    public static void main (String[] args)
    {
        StateX();
        System.exit(0);
    }
    // StateX-Funktion
    static void StateX()
    {
        // ADO-Objekte definieren.
        Connection cnn1 = null;
        Connection cnn2 = null;
        Command cmdChange = null;
        Command cmdRestore = null;

        // Deklarationen.
        String strCnn = "Provider=sqloledb; Data Source=srv;"+
                        "Initial Catalog = Pubs;User Id = sa; Password=;";
        BufferedReader in =
            new BufferedReader(new InputStreamReader(System.in));

        try
        {
            // Zwei asynchrone Verbindungen öffnen und während des
            // Verbindungsaufbaus eine Meldung anzeigen.
            cnn1 = new Connection();
            cnn2 = new Connection();

            cnn1.open(strCnn,"","",AdoEnums.ConnectOption.ASYNCCONNECT);
            while(cnn1.getState()==AdoEnums.ObjectState.CONNECTING)
                System.out.println("Opening the first connection....");

            cnn2.open(strCnn,"","",AdoEnums.ConnectOption.ASYNCCONNECT);
            while(cnn2.getState()==AdoEnums.ObjectState.CONNECTING)
                System.out.println("Opening the second connection....");

            // Zwei Command-Objekte erstellen.
            cmdChange = new Command();
            cmdChange.setActiveConnection(cnn1);
            cmdChange.setCommandText("UPDATE Titles SET type = 'self_help'"+
                                     "WHERE type = 'psychology'");

            cmdRestore = new Command();
            cmdRestore.setActiveConnection(cnn2);
            cmdRestore.setCommandText(
                "UPDATE Titles SET type = 'psychology'"+
                "WHERE type = 'self_help'");

            // Während der Ausführung der Befehle eine
            // Meldung anzeigen.
            cmdChange.execute(null,AdoEnums.ExecuteOption.ASYNCEXECUTE);

            while(cmdChange.getState() == AdoEnums.ObjectState.EXECUTING)
                System.out.println("Change command executing....");

            cmdRestore.execute(null,AdoEnums.ExecuteOption.ASYNCEXECUTE);

            while(cmdRestore.getState() == AdoEnums.ObjectState.EXECUTING)
                System.out.println("Restore command executing....");

            // Cleanup der Objekte vor dem Beenden.
            cnn1.close();
            cnn2.close();

            System.out.println("Press <Enter> to continue..");
            in.readLine();
        }
        // Der Systemlesevorgang erfordert diesen Catch-Aufruf.
        catch(java.io.IOException je)
        {
            PrintIOError(je);
        }
        catch(AdoException ae)
        {
            // Den Benutzer ggf. über von ADO stammende Fehler
            // benachrichtigen.

            // Beim Bearbeiten einer Verbindung zunächst auf
            // NULL-Zeiger prüfen.
            if(cnn1 != null)
            {
                System.out.println("The error has occured in cnn1:");
                PrintProviderError(cnn1);
            }
            else if(cnn2 != null)
            {
                System.out.println("The error has occured in cnn2:");
                PrintProviderError(cnn2);
            }
            else
            {
                System.out.println("Exception: "+ ae.getMessage());
            }
        }

    }
    // PrintProviderError-Funktion
    static void PrintProviderError(Connection cnn1)
    {
        // Vom Connection-Objekt stammende Providerfehler drucken.
        // ErrItem ist ein Elementobjekt in der Errors-Auflistung des
        // Connection-Objekts.
        com.ms.wfc.data.Error               ErrItem = null;
        long                                 nCount = 0;
        int                                       i = 0;

        nCount = cnn1.getErrors().getCount();

        // Ggf. die Fehler in der Auflistung drucken.
        if ( nCount > 0)
        {
            // Die Auflistung hat den Bereich 0 bis nCount - 1.
            for ( i=0;i<nCount; i++)
            {
                ErrItem = cnn1.getErrors().getItem(i);
                System.out.println("\t Error Number: " + ErrItem.getNumber()
                    + "\t" + ErrItem.getDescription());
            }
        }
    }
    // PrintIOError-Funktion
    static void PrintIOError(java.io.IOException je)
    {
        System.out.println("Error: \n");
        System.out.println("\t Source: " + je.getClass() + "\n");
        System.out.println("\t Description: "+ je.getMessage() + "\n");
    }
}


Beispiel für die Status-Eigenschaft (VJ++)

In diesem Beispiel wird die Status-Eigenschaft zum Anzeigen der Datensätze verwendet, die in einer Stapeloperation verändert wurden, bevor eine Stapelaktualisierung stattgefunden hat.

import java.io.*;
import com.ms.wfc.data.*;

public class StatusX
{
    // Der Haupteinstiegspunkt der Anwendung.

    public static void main (String[] args)
    {
        StatusX();
        System.exit(0);
    }
    // StatusX-Funktion

    static void StatusX()
    {
        // ADO-Objekte definieren.
        Recordset rstTitles = null;

        // Deklarationen.
        String strCnn = "Provider=sqloledb;Data Source=srv;"+
                        "Initial Catalog=Pubs;User Id =sa;Password=;";
        BufferedReader in =
            new BufferedReader(new InputStreamReader(System.in));

        try
        {
            // Das Recordset für die Stapelaktualisierung öffnen.
            rstTitles = new Recordset();
            rstTitles.setCursorType(AdoEnums.CursorType.KEYSET);
            rstTitles.setLockType(AdoEnums.LockType.BATCHOPTIMISTIC);
            rstTitles.open("Titles", strCnn, AdoEnums.CursorType.KEYSET,
                AdoEnums.LockType.BATCHOPTIMISTIC,
                AdoEnums.CommandType.TABLE);

            // Den Typ von Psychologiebüchern ändern.
            while(!rstTitles.getEOF())
            {
                if(rstTitles.getField("Type").getString().trim().
                    equals(new String("psychology")))
                    rstTitles.getField("Type").setString("self_help");

                rstTitles.moveNext();
            }

            // Die Titel-ID und den Status anzeigen.
            rstTitles.moveFirst();

            while(!rstTitles.getEOF())
            {
                if(rstTitles.getStatus()==AdoEnums.RecordStatus.MODIFIED)
                    System.out.println(rstTitles.getField("title_id").
                        getString() + "-  Modified");
                else
                    System.out.println(rstTitles.getField("title_id").
                        getString());
                rstTitles.moveNext();
            }

            // Die Aktualisierung abbrechen, da es sich um ein Beispiel
            // handelt.
            rstTitles.cancelBatch();

            // Cleanup der Objekte vor dem Beenden.
            rstTitles.close();

            System.out.println("Press <Enter> to continue..");
            in.readLine();
        }
        catch(AdoException ae)
        {
            // Den Benutzer ggf. über von ADO stammende Fehler
            // benachrichtigen.

            // Beim Bearbeiten eines Recordsets zunächst auf
            // NULL-Zeiger prüfen.
            if(rstTitles != null)
            {
                PrintProviderError(rstTitles.getActiveConnection());
            }
            else
            {
                System.out.println("Exception: " + ae.getMessage());
            }
        }
        // Der Systemlesevorgang erfordert diesen Catch-Aufruf.
        catch(java.io.IOException je)
        {
            PrintIOError(je);
        }
    }
    // PrintProviderError-Funktion
    static void PrintProviderError(Connection cnn1)
    {
        // Vom Connection-Objekt stammende Providerfehler drucken.
        // ErrItem ist ein Elementobjekt in der Errors-Auflistung des
        // Connection-Objekts.
        com.ms.wfc.data.Error               ErrItem = null;
        long                                 nCount = 0;
        int                                       i = 0;

        nCount = cnn1.getErrors().getCount();

        // Ggf. die Fehler in der Auflistung drucken.
        if ( nCount > 0)
        {
            // Die Auflistung hat den Bereich 0 bis nCount - 1.
            for ( i=0;i<nCount; i++)
            {
                ErrItem = cnn1.getErrors().getItem(i);
                System.out.println("\t Error Number: " + ErrItem.getNumber()
                    + "\t" + ErrItem.getDescription());
            }
        }
    }
    // PrintIOError-Funktion
    static void PrintIOError(java.io.IOException je)
    {
        System.out.println("Error: \n");
        System.out.println("\t Source: " + je.getClass() + "\n");
        System.out.println("\t Description: "+ je.getMessage() + "\n");
    }
}


Beispiel für die StayInSync-Eigenschaft (VJ++)

Dieses Beispiel verdeutlicht, wie mit der StayInSync-Eigenschaft der Zugriff auf Zeilen in einem hierarchischen Recordset erleichtert wird.

Die äußere Schleife zeigt den Vor- und Nachnamen der einzelnen Autoren, den Bundesstaat und die Identifikation an. Das angehängte Recordset-Objekt für die einzelnen Zeilen wird von der Fields-Auflistung abgerufen und automatisch von der StayInSync-Eigenschaft zu rstTitleAuthor zugeordnet, sobald sich das übergeordnete Recordset-Objekt zu einer neuen Zeile bewegt. Die innere Schleife zeigt vier Felder jeder Zeile im angehängten Recordset-Objekt an.

import com.ms.wfc.data.*;
import java.io.* ;
import com.ms.com.*;

public class StayInSyncX
{
     // Der Haupteinstiegspunkt für die Anwendung.

    public static void main (String[] args)
    {
        StayInSyncX();
        System.exit(0);
    }

    // StayInSyncX-Funktion

    static void StayInSyncX()
    {

        // ADO-Objekte definieren.
        Connection cnConn1 = null;
        Recordset rstAuthors = null;
        Recordset rstTitleAuthor = null;

        // Deklarationen.
        BufferedReader in = new
            BufferedReader (new InputStreamReader(System.in));
        String strCnn = "DSN=Pubs;Provider=MSDataShape;" +
            "Data Provider=MSDASQL;uid=sa;pwd=;";

        try
        {
            cnConn1 = new Connection();
            cnConn1.open(strCnn);
            rstAuthors = new Recordset();
            rstAuthors.setStayInSync(true);
            rstAuthors.open("SHAPE  {select * from Authors} " +
                     "APPEND ({select * from titleauthor}" +
                     "RELATE au_id TO au_id) AS chapTitleAuthor",
                    cnConn1,
                    AdoEnums.CursorType.STATIC,
                    AdoEnums.LockType.READONLY,
                    AdoEnums.CommandType.TEXT);

            Variant varRstTitleAuthor = rstAuthors.getFields().
                getItem("chapTitleAuthor").getValue();
            rstTitleAuthor =new Recordset(varRstTitleAuthor.toObject());
            int intCount =0;
            while(!rstAuthors.getEOF())
            {
                System.out.println("\n" +
                    rstAuthors.getField("au_fname").getString() + " " +
                    rstAuthors.getField("au_lname").getString() + " " +
                     rstAuthors.getField("state").getString() + " " +
                     rstAuthors.getField("au_id").getString());
                while(!rstTitleAuthor.getEOF())
                {
                    System.out.println(rstTitleAuthor.getField(0).
                        getString() + " " +
                        rstTitleAuthor.getField(1).getString() + " " +
                        rstTitleAuthor.getField(2).getString() + " " +
                        rstTitleAuthor.getField(3).getString());
                    rstTitleAuthor.moveNext();
                }
                if(++intCount % 5 == 0)
                {
                    System.out.println("\nPress <Enter> to continue..");
                    in.readLine();
                }
                rstAuthors.moveNext();
            }
            // Cleanup der Objekte vor dem Beenden.
            rstTitleAuthor.close();
            rstAuthors.close();
            cnConn1.close();

            System.out.println("\nPress <Enter> to continue..");
            in.readLine();
        }
        catch( AdoException ae )
        {
            // Den Benutzer ggf. über von ADO stammende Fehler
            // benachrichtigen.

            // Beim Bearbeiten eines Recordsets zunächst auf
            // NULL-Zeiger prüfen.
            if (rstAuthors != null)
            {
                PrintProviderError(rstAuthors.getActiveConnection());
            }
            else
            {
                System.out.println("Exception: " + ae.getMessage());
            }
        }

        // Der Systemlesevorgang erfordert diesen Catch-Aufruf.
        catch( java.io.IOException je)
        {
            PrintIOError(je);
        }
    }

    // PrintProviderError-Funktion
    static void PrintProviderError(Connection cnn1)
    {
        // Vom Connection-Objekt stammende Providerfehler drucken.
        // ErrItem ist ein Elementobjekt in der Errors-Auflistung des
        // Connection-Objekts.
        com.ms.wfc.data.Error               ErrItem = null;
        long                                 nCount = 0;
        int                                       i = 0;

        nCount = cnn1.getErrors().getCount();

        // Ggf. die Fehler in der Auflistung drucken.
        if ( nCount > 0)
        {
            // Die Auflistung hat den Bereich 0 bis nCount - 1.
            for ( i=0;i<nCount; i++)
            {
                ErrItem = cnn1.getErrors().getItem(i);
                System.out.println("\t Error Number: " + ErrItem.getNumber()
                    + "\t" + ErrItem.getDescription());
            }
        }
    }
    // PrintIOError-Funktion
    static void PrintIOError(java.io.IOException je)
    {
        System.out.println("Error: \n");
        System.out.println("\t Source: " + je.getClass() + "\n");
        System.out.println("\t Description: "+ je.getMessage() + "\n");
    }
}


Beispiel für die Supports-Methode (VJ++)

In diesem Beispiel wird die Supports-Methode zum Anzeigen der Optionen verwendet, die durch ein mit verschiedenen Cursortypen geöffnetes Recordset unterstützt werden. Zum Ausführen dieses Beispiels ist die DisplaySupport-Funktion erforderlich.

import com.ms.wfc.data.*;
import java.io.*;

public class SupportsX
{
    // Der Haupteinstiegspunkt der Anwendung.

    public static void main (String[] args)
    {
        SupportsX();
        System.exit(0);
    }
    // SupportsX-Funktion

    static void SupportsX()
    {
        // ADO-Objekte definieren.
        Recordset rstTitles = null;

        // Deklarationen.
        int[] aintCursorType = new int[4];
        String strCnn;
        int intIndex;
        BufferedReader in =
            new BufferedReader(new InputStreamReader(System.in));

        try
        {
            // Öffnen der Verbindung.
            strCnn = "Provider= sqloledb;Data Source=srv;"+
                     "Initial Catalog=Pubs;User Id=sa;Password=;";

            // Das Array mit CursorType-Konstanten auffüllen.
            aintCursorType[0] = AdoEnums.CursorType.FORWARDONLY;
            aintCursorType[1] = AdoEnums.CursorType.KEYSET;
            aintCursorType[2] = AdoEnums.CursorType.DYNAMIC;
            aintCursorType[3] = AdoEnums.CursorType.STATIC;

            // Das Recordset unter Verwendung jedes Wertes für CursorType              // und optimistischer Sperren öffnen. Dann die DisplaySupport-
            // Prozedur aufrufen, um die unterstützten Optionen anzuzeigen.
            for(intIndex = 0; intIndex < 4; intIndex++)
            {
                rstTitles = new Recordset();
                rstTitles.setCursorType(aintCursorType[intIndex]);
                rstTitles.setLockType(AdoEnums.LockType.OPTIMISTIC);
                rstTitles.open("Titles", strCnn, aintCursorType[intIndex],
                    AdoEnums.LockType.OPTIMISTIC, AdoEnums.CommandType.TABLE);

                switch(aintCursorType[intIndex])
                {
                case AdoEnums.CursorType.FORWARDONLY:
                    System.out.println("ForwardOnly cursor supports:");
                    break;
                case AdoEnums.CursorType.KEYSET:
                    System.out.println("Keyset cursor supports:");
                    break;
                case AdoEnums.CursorType.DYNAMIC:
                    System.out.println("Dynamic cursor supports:");
                    break;
                case AdoEnums.CursorType.STATIC:
                    System.out.println("Static cursor supports:");
                    break;
                default:
                    break;
                }
                DisplaySupport(rstTitles);
                rstTitles.close();
                System.out.println("Press <Enter> to continue..");
                in.readLine();
            }
        }
        catch(AdoException ae)
        {
            // Den Benutzer ggf. über von ADO stammende Fehler
            // benachrichtigen.

            // Beim Bearbeiten eines Recordsets zunächst auf
            // NULL-Zeiger prüfen.
            if (rstTitles!= null)
            {
                PrintProviderError(rstTitles.getActiveConnection());
            }
            else
            {
                System.out.println("Exception: " + ae.getMessage());
            }
        }
        // Der Systemlesevorgang erfordert diesen Catch-Aufruf.
        catch( java.io.IOException je)
        {
            PrintIOError(je);
        }
    }
    // DisplaySupport-Funktion

    static void DisplaySupport( Recordset rstTemp )
    {
        long[] alngConstants = new long[11];
        boolean booSupports;
        int intIndex;
        try
        {
            // Das Array mit Cursoroptionskonstanten auffüllen.
            alngConstants[0]  = AdoEnums.CursorOption.ADDNEW;
            alngConstants[1]  = AdoEnums.CursorOption.APPROXPOSITION;
            alngConstants[2]  = AdoEnums.CursorOption.BOOKMARK;
            alngConstants[3]  = AdoEnums.CursorOption.DELETE;
            alngConstants[4]  = AdoEnums.CursorOption.FIND;
            alngConstants[5]  = AdoEnums.CursorOption.HOLDRECORDS;
            alngConstants[6]  = AdoEnums.CursorOption.MOVEPREVIOUS;
            alngConstants[7]  = AdoEnums.CursorOption.NOTIFY;
            alngConstants[8]  = AdoEnums.CursorOption.RESYNC;
            alngConstants[9]  = AdoEnums.CursorOption.UPDATE;
            alngConstants[10] = AdoEnums.CursorOption.UPDATEBATCH;

            for(intIndex = 0; intIndex <= 10; intIndex++)
            {
                booSupports = rstTemp.supports((int)alngConstants[intIndex]);
                if (booSupports)
                {
                    switch((int)alngConstants[intIndex])
                    {
                    case AdoEnums.CursorOption.ADDNEW:
                            System.out.println("    AddNew");
                            break;
                    case AdoEnums.CursorOption.APPROXPOSITION:
                            System.out.println(
                                "    AbsolutePosition and AbsolutePage");
                            break;
                    case AdoEnums.CursorOption.BOOKMARK:
                            System.out.println("    Bookmark");
                            break;
                    case AdoEnums.CursorOption.DELETE:
                            System.out.println("    Delete");
                            break;
                    case AdoEnums.CursorOption.FIND:
                            System.out.println("    Find");
                            break;
                    case AdoEnums.CursorOption.HOLDRECORDS:
                            System.out.println("    Holding Records");
                            break;
                    case AdoEnums.CursorOption.MOVEPREVIOUS:
                            System.out.println("    MovePrevious and Move");
                            break;
                    case AdoEnums.CursorOption.NOTIFY:
                            System.out.println("    Notifications");
                            break;
                    case AdoEnums.CursorOption.RESYNC:
                            System.out.println("    Resyncing Data");
                            break;
                    case AdoEnums.CursorOption.UPDATE:
                            System.out.println("    Update");
                            break;
                    case AdoEnums.CursorOption.UPDATEBATCH:
                            System.out.println("    Batch Updating");
                            break;
                    default:
                            break;
                    }
                }
            }
        }
        catch(AdoException ae)
        {
            // Den Benutzer ggf. über von ADO stammende Fehler
            // benachrichtigen.

            // Beim Bearbeiten eines Recordsets zunächst auf
            // NULL-Zeiger prüfen.
            if (rstTemp!= null)
            {
                PrintProviderError(rstTemp.getActiveConnection());
            }
            else
            {
                System.out.println("Exception: " + ae.getMessage());
            }
        }
    }

    // PrintProviderError-Funktion
    static void PrintProviderError(Connection cnn1)
    {
        // Vom Connection-Objekt stammende Providerfehler drucken.
        // ErrItem ist ein Elementobjekt in der Errors-Auflistung des
        // Connection-Objekts.
        com.ms.wfc.data.Error               ErrItem = null;
        long                                 nCount = 0;
        int                                       i = 0;

        nCount = cnn1.getErrors().getCount();

        // Ggf. die Fehler in der Auflistung drucken.
        if ( nCount > 0)
        {
            // Die Auflistung hat den Bereich 0 bis nCount - 1.
            for ( i=0;i<nCount; i++)
            {
                ErrItem = cnn1.getErrors().getItem(i);
                System.out.println("\t Error Number: " + ErrItem.getNumber()
                    + "\t" + ErrItem.getDescription());
            }
        }
    }
    // PrintIOError-Funktion
    static void PrintIOError(java.io.IOException je)
    {
        System.out.println("Error: \n");
        System.out.println("\t Source: " + je.getClass() + "\n");
        System.out.println("\t Description: "+ je.getMessage() + "\n");
    }
}


Beispiel für die Type-Eigenschaft (Field) (VJ++)

In diesem Beispiel wird die Type-Eigenschaft erläutert, indem der Name der Konstanten angezeigt wird, die dem Wert der Type-Eigenschaft aller Field-Objekte in der Employees-Tabelle entspricht. Zum Ausführen dieser Prozedur ist die FieldType-Funktion erforderlich.

import java.io.*;
import com.ms.wfc.data.*;

public class TypeX
{

    // Der Haupteinstiegspunkt der Anwendung.

    public static void main (String[] args)
    {
        TypeX();
        System.exit(0);
    }
    // TypeX-Funktion

    static void TypeX()
    {
        // ADO-Objekte definieren.
        Recordset rstEmployees = null;
        Field fldLoop = null;

        // Deklarationen.
        String strCnn = "Provider=sqloledb;Data Source=srv;"+
                     "Initial Catalog = Pubs;User Id=sa;Password=;";
        int intLoop;
        int intRecordCount = 0;
        BufferedReader in =
            new BufferedReader(new InputStreamReader(System.in));

        try
        {
            // Das Recordset mit Daten aus der Employees-Tabelle öffnen.
            rstEmployees = new Recordset();
            rstEmployees.open("employee", strCnn,
                AdoEnums.CursorType.FORWARDONLY, AdoEnums.LockType.READONLY,
                AdoEnums.CommandType.TABLE);

            System.out.println("Fields in the Employees table:\n");

            // Die Felderauflistung der Employees-Tabelle aufzählen.
            for(intLoop = 0;intLoop <
                rstEmployees.getFields().getCount();intLoop++)
            {
                intRecordCount++;
                // Zum Anzeigen von Datensätzen benötigte Schleife
                if((intRecordCount % 6)==0)
                {
                    System.out.println("Press <Enter> to continue..");
                    in.readLine();
                }

                fldLoop = rstEmployees.getFields().getItem(intLoop);
                System.out.println("  Name:" + fldLoop.getName() + "\n"+
                    "  Type:" + FieldType(fldLoop.getType()) + "\n");

            }
            System.out.println("Press <Enter> to continue");
            in.readLine();
        }
        catch(AdoException ae)
        {
            // Den Benutzer ggf. über von ADO stammende Fehler
            // benachrichtigen.

            // Beim Bearbeiten eines Recordsets zunächst auf
            // NULL-Zeiger prüfen.
            if(rstEmployees != null)
            {
                PrintProviderError(rstEmployees.getActiveConnection());
            }
            else
            {
                System.out.println("Exception: " + ae.getMessage());
            }
        }
        // Der Systemlesevorgang erfordert diesen Catch-Aufruf.
        catch(java.io.IOException je)
        {
            PrintIOError(je);
        }
    }
    // FieldType-Funktion
    static String FieldType( int intType )
    {
        String strLoop = null;

            switch(intType)
            {
            case AdoEnums.DataType.CHAR:
                strLoop = "adChar";
                break;
            case AdoEnums.DataType.VARCHAR:
                strLoop ="adVarChar";
                break;
            case AdoEnums.DataType.SMALLINT:
                strLoop = "adSmallInt";
                break;
            case AdoEnums.DataType.UNSIGNEDTINYINT:
                strLoop = "adUnsignedTinyInt" ;
                break;
            case AdoEnums.DataType.DBTIMESTAMP:
                strLoop = "adDBTimeStamp";
                break;
            default:
                break;
            }

        return strLoop;
    }

    // PrintProviderError-Funktion
    static void PrintProviderError(Connection cnn1)
    {
        // Vom Connection-Objekt stammende Providerfehler drucken.
        // ErrItem ist ein Elementobjekt in der Errors-Auflistung des
        // Connection-Objekts.
        com.ms.wfc.data.Error               ErrItem = null;
        long                                 nCount = 0;
        int                                       i = 0;

        nCount = cnn1.getErrors().getCount();

        // Ggf. die Fehler in der Auflistung drucken.
        if ( nCount > 0)
        {
            // Die Auflistung hat den Bereich 0 bis nCount - 1.
            for ( i=0;i<nCount; i++)
            {
                ErrItem = cnn1.getErrors().getItem(i);
                System.out.println("\t Error Number: " + ErrItem.getNumber()
                    + "\t" + ErrItem.getDescription());
            }
        }
    }
    // PrintIOError-Funktion
    static void PrintIOError(java.io.IOException je)
    {
        System.out.println("Error: \n");
        System.out.println("\t Source: " + je.getClass() + "\n");
        System.out.println("\t Description: "+ je.getMessage() + "\n");
    }
}


Beispiel für die Type-Eigenschaft (Property) (VJ++)

Dieses Beispiel verdeutlicht die Type-Eigenschaft. Es handelt sich dabei um das Modell eines Dienstprogramms zum Auflisten von Namen und Typen einer Auflistung, wie beispielsweise Properties, Fields usw.

Das Recordset-Objekt muss nicht geöffnet werden, um auf die zugehörige Properties-Auflistung zugreifen zu können; diese werden erstellt, wenn das Recordset-Objekt instanziiert wird. Jedoch werden durch Setzen der CursorLocation-Eigenschaft auf adUseClient der Properties-Auflistung des Recordset-Objekts zahlreiche dynamische Eigenschaften hinzugefügt, die das Beispiel etwas interessanter gestalten. Aus Gründen der Anschaulichkeit wird in diesem Beispiel explizit die Item-Eigenschaft verwendet, um auf die einzelnen Property-Objekte zugreifen zu können.

import com.ms.wfc.data.*;
import java.io.* ;

public class TypeX
{
    // Der Haupteinstiegspunkt für die Anwendung.

    public static void main (String[] args)
    {
        TypeX();
        System.exit(0);
    }

    // TypeX-Funktion

    static void TypeX()
    {
        // ADO-Objekte definieren.
        Recordset rst = null;
        AdoProperty prop = null;

        // Deklarationen.
        BufferedReader in =
            new BufferedReader (new InputStreamReader(System.in));
        String strCnn = "DSN=Pubs;Provider=MSDASQL;uid=sa;pwd=;";
        String strMsg;
        int intIndex;
        int intDisplaysize = 15;

        try
        {
            rst = new Recordset();
            rst.setCursorLocation(AdoEnums.CursorLocation.CLIENT);
            for(intIndex = 0;
                intIndex <= rst.getProperties().getCount() - 1;intIndex++)
            {
                prop = rst.getProperties().getItem(intIndex);
                switch(prop.getType())
                {
                case AdoEnums.DataType.BIGINT :
                        strMsg = "adBigInt";
                        break;
                case AdoEnums.DataType.BINARY :
                        strMsg = "adBinary";
                        break;
                case AdoEnums.DataType.BOOLEAN :
                        strMsg = "adBoolean";
                        break;
                case AdoEnums.DataType.BSTR :
                        strMsg = "adBSTR";
                        break;
                case AdoEnums.DataType.CHAPTER :
                        strMsg = "adChapter";
                        break;
                case AdoEnums.DataType.CHAR :
                        strMsg = "adChar";
                        break;
                case AdoEnums.DataType.CURRENCY :
                        strMsg = "adCurrency";
                        break;
                case AdoEnums.DataType.DATE :
                        strMsg = "adDate";
                        break;
                case AdoEnums.DataType.DBDATE :
                        strMsg = "adDBDate";
                        break;
                case AdoEnums.DataType.DBTIME :
                        strMsg = "adDBTime";
                        break;
                case AdoEnums.DataType.DBTIMESTAMP :
                        strMsg = "adDBTimeStamp";
                        break;
                case AdoEnums.DataType.DECIMAL :
                        strMsg = "adDecimal";
                        break;
                case AdoEnums.DataType.DOUBLE :
                        strMsg = "adDouble";
                        break;
                case AdoEnums.DataType.EMPTY :
                        strMsg = "adEmpty";
                        break;
                case AdoEnums.DataType.ERROR :
                        strMsg = "adError";
                        break;
                case AdoEnums.DataType.FILETIME :
                        strMsg = "adFileTime";
                        break;
                case AdoEnums.DataType.GUID :
                        strMsg = "adGUID";
                        break;
                case AdoEnums.DataType.IDISPATCH :
                        strMsg = "adIDispatch";
                        break;
                case AdoEnums.DataType.INTEGER :
                        strMsg = "adInteger";
                        break;
                case AdoEnums.DataType.IUNKNOWN :
                        strMsg = "adIUnknown";
                        break;
                case AdoEnums.DataType.LONGVARBINARY :
                        strMsg = "adLongVarBinary";
                        break;
                case AdoEnums.DataType.LONGVARCHAR :
                        strMsg = "adLongVarChar";
                        break;
                case AdoEnums.DataType.LONGVARWCHAR :
                        strMsg = "adLongVarWChar";
                        break;
                case AdoEnums.DataType.NUMERIC :
                        strMsg = "adNumeric";
                        break;
                case AdoEnums.DataType.PROPVARIANT :
                        strMsg = "adPropVariant";
                        break;
                case AdoEnums.DataType.SINGLE :
                        strMsg = "adSingle";
                        break;
                case AdoEnums.DataType.SMALLINT :
                        strMsg = "adSmallInt";
                        break;
                case AdoEnums.DataType.TINYINT :
                        strMsg = "adTinyInt";
                        break;
                case AdoEnums.DataType.UNSIGNEDBIGINT :
                        strMsg = "adUnsignedBigInt";
                        break;
                case AdoEnums.DataType.UNSIGNEDINT :
                        strMsg = "adUnsignedInt";
                        break;
                case AdoEnums.DataType.UNSIGNEDSMALLINT :
                        strMsg = "adUnsignedSmallInt";
                        break;
                case AdoEnums.DataType.UNSIGNEDTINYINT :
                        strMsg = "adUnsignedTinyInt";
                        break;
                case AdoEnums.DataType.USERDEFINED :
                        strMsg = "adUserDefined";
                        break;
                case AdoEnums.DataType.VARBINARY :
                        strMsg = "adVarBinary";
                        break;
                case AdoEnums.DataType.VARCHAR :
                        strMsg = "adVarChar";
                        break;
                case AdoEnums.DataType.VARIANT :
                        strMsg = "adVariant";
                        break;
                case AdoEnums.DataType.VARNUMERIC :
                        strMsg = "adVarNumeric";
                        break;
                case AdoEnums.DataType.VARWCHAR :
                        strMsg = "adVarWChar";
                        break;
                case AdoEnums.DataType.WCHAR :
                        strMsg = "adWChar";
                        break;
                default:
                        strMsg = "*UNKNOWN*";
                        break;
                }
                System.out.println("Property " +
                                   Integer.toString(intIndex) +
                                   " : " +
                                   prop.getName() +
                                   ", Type = " +
                                   strMsg);
                if(intIndex % intDisplaysize == 0 && intIndex != 0)
                {
                    System.out.println("\nPress <Enter> to continue..");
                    in.readLine();
                }
            }

            System.out.println("\nPress <Enter> to continue..");
            in.readLine();
        }
        catch( AdoException ae )
        {
            // Den Benutzer ggf. über von ADO stammende Fehler
            // benachrichtigen.

            // Beim Bearbeiten eines Recordsets zunächst auf
            // NULL-Zeiger prüfen.
            if (rst != null)
            {
                PrintProviderError(rst.getActiveConnection());
            }
            else
            {
                System.out.println("Exception: " + ae.getMessage());
            }
        }

        // Der Systemlesevorgang erfordert diesen Catch-Aufruf.
        catch( java.io.IOException je)
        {
            PrintIOError(je);
        }
    }

    // PrintProviderError-Funktion
    static void PrintProviderError(Connection cnn1)
    {
        // Vom Connection-Objekt stammende Providerfehler drucken.
        // ErrItem ist ein Elementobjekt in der Errors-Auflistung des
        // Connection-Objekts.
        com.ms.wfc.data.Error               ErrItem = null;
        long                                 nCount = 0;
        int                                       i = 0;

        nCount = cnn1.getErrors().getCount();

        // Ggf. die Fehler in der Auflistung drucken.
        if ( nCount > 0)
        {
            // Die Auflistung hat den Bereich 0 bis nCount - 1.
            for ( i=0;i<nCount; i++)
            {
                ErrItem = cnn1.getErrors().getItem(i);
                System.out.println("\t Error Number: " + ErrItem.getNumber()
                    + "\t" + ErrItem.getDescription());
            }
        }
    }
    // PrintIOError-Funktion
    static void PrintIOError(java.io.IOException je)
    {
        System.out.println("Error: \n");
        System.out.println("\t Source: " + je.getClass() + "\n");
        System.out.println("\t Description: "+ je.getMessage() + "\n");
    }
}


Update and CancelUpdate Methods Example (VJ++)

In diesem Beispiel wird die Verwendung der Update-Methode in Verbindung mit der CancelUpdate-Methode verdeutlicht.

import java.io.*;
import com.ms.wfc.data.*;

public class UpdateX
{
    // Der Haupteinstiegspunkt der Anwendung.

    public static void main (String[] args)
    {
        UpdateX();
        UpdateX2();
        System.exit(0);
    }
    // UpdateX-Funktion

    static void UpdateX()
    {
        // ADO-Objekte definieren.
        Recordset rstEmployees = null;

        // Deklarationen.
        String strCnn = "Provider=sqloledb;Data Source=srv;"+
                        "Initial Catalog=Pubs;User Id=sa;Password=;";
        String strOldFirst;
        String strOldLast;
        String strMessage;
        BufferedReader in =
            new BufferedReader(new InputStreamReader(System.in));

        try
        {
            // Ein Recordset mit Namen aus der Employees-Tabelle öffnen.
            rstEmployees = new Recordset();
            rstEmployees.setCursorType(AdoEnums.CursorType.KEYSET);
            rstEmployees.setLockType(AdoEnums.LockType.OPTIMISTIC);
            rstEmployees.open("SELECT fname,lname FROM Employees " +
                "ORDER BY lname", strCnn, AdoEnums.CursorType.KEYSET,
                AdoEnums.LockType.OPTIMISTIC, AdoEnums.CommandType.TEXT);

            // Die ursprünglichen Daten speichern.
            strOldFirst = rstEmployees.getField("fname").getString();
            strOldLast = rstEmployees.getField("lname").getString();

            // Daten im Bearbeitungspuffer verändern.
            rstEmployees.getField("fname").setString("Linda");
            rstEmployees.getField("lname").setString("Kobara");

            // Den Pufferinhalt anzeigen und Benutzereingaben abrufen.
            strMessage = "Edit in Progress :\n" +
                "\tOriginal Data = " + strOldFirst + "  " + strOldLast +
                "\n\tData in Buffer = " +
                rstEmployees.getField("fname").getString() + " " +
                rstEmployees.getField("lname").getString() + "\n\n" +
                 "Use Update to replace the original data with " +
                "the buffered data in the Recordset?Enter (Y/N)";

            System.out.println(strMessage);
            if(in.readLine().trim().equalsIgnoreCase("Y"))
                rstEmployees.update();
            else
                rstEmployees.cancelUpdate();

            // Die Ergebnisdaten anzeigen.
            System.out.println("Data in Recordset = " +
                rstEmployees.getField("fname").getString() +
                "  " + rstEmployees.getField("lname").getString()+ "\n");

            // Die ursprünglichen Daten wiederherstellen, da es sich um ein
            // Beispiel handelt.
            if(!(strOldFirst.equals(
                rstEmployees.getField("fname").getString()) &&
                strOldLast.equals(
                rstEmployees.getField("lname").getString())))
            {
                rstEmployees.getField("fname").setString(strOldFirst);
                rstEmployees.getField("lname").setString(strOldLast);
                rstEmployees.update();
            }
            // Cleanup der Objekte vor dem Beenden.
            rstEmployees.close();

            System.out.println("Press <Enter> to continue..");
            in.readLine();

        }
        catch(AdoException ae)
        {
            // Den Benutzer ggf. über von ADO stammende Fehler
            // benachrichtigen.

            // Beim Bearbeiten eines Recordsets zunächst auf
            // NULL-Zeiger prüfen.
            if(rstEmployees != null)
            {
                PrintProviderError(rstEmployees.getActiveConnection());
            }
            else
            {
                System.out.println("Exception: "+ ae.getMessage());
            }
        }
        // Der Systemlesevorgang erfordert diesen Catch-Aufruf.
        catch(java.io.IOException je)
        {
            PrintIOError(je);
        }
    }
    // UpdateX2-Funktion

    static void UpdateX2()
    {
        // Dies ist ein Beispiel für das Zusammenwirken der Update-Methode
        // mit der AddNew-Methode.

        // ADO-Objekte definieren.
        Connection cnn1 = null;
        Recordset rstEmployees = null;

        // Deklarationen.
        String strCnn = "Provider=sqloledb;Data Source=srv;"+
                        "Initial Catalog=Pubs;User Id=sa;Password=;";
        String strEmpID;
        String strOldFirst;
        String strOldLast;
        String strMessage;
        BufferedReader in =
            new BufferedReader(new InputStreamReader(System.in));

        try
        {
            // Eine Verbindung öffnen.
            cnn1 = new Connection();
            cnn1.open(strCnn);

            // Ein Recordset mit Daten aus der Employees-Tabelle öffnen.
            rstEmployees = new Recordset();
            rstEmployees.setCursorType(AdoEnums.CursorType.KEYSET);
            rstEmployees.setLockType(AdoEnums.LockType.OPTIMISTIC);
            rstEmployees.open("employee", cnn1, AdoEnums.CursorType.KEYSET,
                AdoEnums.LockType.OPTIMISTIC, AdoEnums.CommandType.TABLE);

            rstEmployees.addNew();
            strEmpID="B-S55555M";
            rstEmployees.getField("emp_id").setString(strEmpID);
            rstEmployees.getField("fname").setString("Bill");
            rstEmployees.getField("lname").setString("Sornsin");

            // Den Pufferinhalt anzeigen und Benutzereingaben abfragen.
            strMessage = "AddNew in progress : " + "\n" +
                "\tData in Buffer = " +
                rstEmployees.getField("emp_id").getString() +
                "  " + rstEmployees.getField("fname").getString() + "  " +
                rstEmployees.getField("lname").getString()+ "\n\n" +
                "Use Update to save buffer to recordset?Enter (Y/N)";
            System.out.println(strMessage);
            if(in.readLine().trim().equalsIgnoreCase("Y"))
            {
                rstEmployees.update();
                // Zum neuen Datensatz gehen und die Ergebnisdaten anzeigen.
                System.out.println("Data in recordset = " +
                    rstEmployees.getField("emp_id").getString()+
                    "  " + rstEmployees.getField("fname").getString() +
                    "  " + rstEmployees.getField("lname").getString() + "\n");
            }
            else
            {
                rstEmployees.cancelUpdate();
                System.out.println("No new Record added.\n");
            }
            // Die neuen Daten löschen, da es sich um ein Beispiel handelt.
            cnn1.execute(
                "DELETE FROM employee WHERE emp_id='" + strEmpID +"'");

            // Cleanup der Objekte vor dem Beenden
            rstEmployees.close();

            System.out.println("Press <Enter> to continue..");
            in.readLine();
        }
        catch(AdoException ae)
        {
            // Den Benutzer ggf. über von ADO stammende Fehler
            // benachrichtigen.

            // Beim Bearbeiten eines Recordsets zunächst auf
            // NULL-Zeiger prüfen.
            if(rstEmployees != null)
            {
                PrintProviderError(rstEmployees.getActiveConnection());
            }
            else
            {
                System.out.println("Exception: "+ ae.getMessage());
            }
        }
        // Der Systemlesevorgang erfordert diesen Catch-Aufruf.
        catch(java.io.IOException je)
        {
            PrintIOError(je);
        }
    }
    // PrintProviderError-Funktion
    static void PrintProviderError(Connection cnn1)
    {
        // Vom Connection-Objekt stammende Providerfehler drucken.
        // ErrItem ist ein Elementobjekt in der Errors-Auflistung des
        // Connection-Objekts.
        com.ms.wfc.data.Error               ErrItem = null;
        long                                 nCount = 0;
        int                                       i = 0;

        nCount = cnn1.getErrors().getCount();

        // Ggf. die Fehler in der Auflistung drucken.
        if ( nCount > 0)
        {
            // Die Auflistung hat den Bereich 0 bis nCount - 1.
            for ( i=0;i<nCount; i++)
            {
                ErrItem = cnn1.getErrors().getItem(i);
                System.out.println("\t Error Number: " + ErrItem.getNumber()
                    + "\t" + ErrItem.getDescription());
            }
        }
    }
    // PrintIOError-Funktion
    static void PrintIOError(java.io.IOException je)
    {
        System.out.println("Error: \n");
        System.out.println("\t Source: " + je.getClass() + "\n");
        System.out.println("\t Description: "+ je.getMessage() + "\n");
    }
}


Beispiel für die UpdateBatch- und CancelBatch-Methoden (VJ++)

In diesem Beispiel wird die Verwendung der UpdateBatch-Methode in Verbindung mit der CancelBatch-Methode verdeutlicht.

import java.io.*;
import com.ms.wfc.data.*;

public class UpdateBatchX
{
    // Der Haupteinstiegspunkt der Anwendung.
    public static void main (String[] args)
    {
        UpdateBatchX();
        System.exit(0);
    }
    // UpdateBatchX-Funktion

    static void UpdateBatchX()
    {
        // ADO-Objekte definieren.
        Recordset rstTitles = null;

        // Deklarationen.
        String strCnn = "Provider=sqloledb;Data Source=srv;"+
                        "Initial Catalog=Pubs;User Id=sa;Password=;";
        String strTitle;
        String strMessage;
        BufferedReader in =
            new BufferedReader(new InputStreamReader(System.in));

        try
        {
            rstTitles = new Recordset();
            rstTitles.setCursorType(AdoEnums.CursorType.KEYSET);
            rstTitles.setLockType(AdoEnums.LockType.BATCHOPTIMISTIC);
            rstTitles.open("Titles", strCnn, AdoEnums.CursorType.KEYSET,
                AdoEnums.LockType.BATCHOPTIMISTIC,
                AdoEnums.CommandType.TABLE);

            rstTitles.moveFirst();

            // Schleife durch das Recordset, die den Benutzer fragt, ob
            // der Typ der angegebenen Tabelle geändert werden soll.
            while(!rstTitles.getEOF())
            {
                if(rstTitles.getField("Type").getString().
                    trim().equalsIgnoreCase("psychology"))
                {
                    strTitle = rstTitles.getField("Title").getString();
                    strMessage = "Title: "+ strTitle + "\n" +
                        "Change type to self_help?Enter (Y/N)";
                    System.out.println(strMessage);
                    if(in.readLine().trim().equalsIgnoreCase("Y"))
                        rstTitles.getField("type").setString("self_help");
                }
                rstTitles.moveNext();
            }
            // Den Benutzer fragen, ob für alle oben vorgenommenen
            // Änderungen ein Commit ausgeführt werden soll.
            System.out.println("Save all changes?Enter (Y/N)");
            if(in.readLine().trim().equalsIgnoreCase("Y"))
                rstTitles.updateBatch();
            else
                rstTitles.cancelBatch();

            // Die aktuellen Daten im Recordset drucken.
            rstTitles.requery();
            rstTitles.moveFirst();
            while(!rstTitles.getEOF())
            {
            System.out.println(rstTitles.getField("title").getString() +
                " - " + rstTitles.getField("type").getString());
            rstTitles.moveNext();
            }

            // Die ursprünglichen Werte wiederherstellen, da es sich um ein
            // Beispiel handelt.
            rstTitles.moveFirst();
            while(!rstTitles.getEOF())
            {
                if(rstTitles.getField("type").getString().
                    trim().equalsIgnoreCase("self_help"))
                    rstTitles.getField("type").setString("psychology");
                rstTitles.moveNext();
            }
            rstTitles.updateBatch();

            // Cleanup der Objekte vor dem Beenden.
            rstTitles.close();

            System.out.println("Press <Enter> to continue..");
            in.readLine();

        }
        catch(AdoException ae)
        {
            // Den Benutzer ggf. über von ADO stammende Fehler
            // benachrichtigen.

            // Beim Bearbeiten eines Recordsets zunächst auf
            // NULL-Zeiger prüfen.
            if(rstTitles != null)
            {
                PrintProviderError(rstTitles.getActiveConnection());
            }
            else
            {
                System.out.println("Exception: " + ae.getMessage());
            }
        }
        // Der Systemlesevorgang erfordert diesen Catch-Aufruf.
        catch(java.io.IOException je)
        {
            PrintIOError(je);
        }
    }

    // PrintProviderError-Funktion
    static void PrintProviderError(Connection cnn1)
    {
        // Vom Connection-Objekt stammende Providerfehler drucken.
        // ErrItem ist ein Elementobjekt in der Errors-Auflistung des
        // Connection-Objekts.
        com.ms.wfc.data.Error               ErrItem = null;
        long                                 nCount = 0;
        int                                       i = 0;

        nCount = cnn1.getErrors().getCount();

        // Ggf. die Fehler in der Auflistung drucken.
        if ( nCount > 0)
        {
            // Die Auflistung hat den Bereich 0 bis nCount - 1.
            for ( i=0;i<nCount; i++)
            {
                ErrItem = cnn1.getErrors().getItem(i);
                System.out.println("\t Error Number: " + ErrItem.getNumber()
                    + "\t" + ErrItem.getDescription());
            }
        }
    }
    // PrintIOError-Funktion
    static void PrintIOError(java.io.IOException je)
    {
        System.out.println("Error: \n");
        System.out.println("\t Source: " + je.getClass() + "\n");
        System.out.println("\t Description: "+ je.getMessage() + "\n");
    }
}


Beispiel für die Value-Eigenschaft (VJ++)

In diesem Beispiel wird die Value-Eigenschaft mit den Objekten Field und Property erläutert, indem Feld- und Eigenschaftswerte für die Employees-Tabelle angezeigt werden.

import java.io.*;
import com.ms.wfc.data.*;
import com.ms.com.*;

public class ValueX
{
    // Hauptfunktion
    public static void main (String[] args)
    {
        ValueX();
        System.exit(0);
    }
    static void ValueX()
    {
        // ADO-Objekte definieren.
        Recordset rstEmployees = null;
        Field    fldLoop     = null;
        AdoProperty  prpLoop   = null;

        // Deklarationen.
        String strCnn = "Provider=sqloledb; Data Source= srv;" +
            "Initial Catalog=Pubs; User Id=sa; Password=;";
        int intLoop;
        BufferedReader in = new
            BufferedReader(new InputStreamReader(System.in));
        Variant varPropertyValue;
        String strMessage;

        try
        {
            // Ein Recordset mit Daten aus der Employees-Tabelle öffnen.
            rstEmployees = new Recordset();
            rstEmployees.open("employee", strCnn,
                AdoEnums.CursorType.FORWARDONLY, AdoEnums.LockType.READONLY,
                AdoEnums.CommandType.TABLE);

            System.out.println("Field values in rstEmployees\n");

            // Die Fields-Auflistung der Employees-Tabelle
            // aufzählen.
            for(intLoop = 0;
                intLoop<rstEmployees.getFields().getCount();intLoop++)
            {
                fldLoop = rstEmployees.getFields().getItem(intLoop);
                // Da Value die Standardeigenschaft eines Field-Objekts
                // ist, ist die Verwendung des tatsächlichen Schlüsselwortes
                // hier optional.
                System.out.println("\t" + fldLoop.getName() + " = " +
                    fldLoop.getValue());
            }
            System.out.println("\nPress <Enter> to continue..");
            in.readLine();
            System.out.println("Property values in rstEmployees\n");

            // Die Properties-Auflistung des Recordset-Objekts
            // aufzählen.
            int intCount = 0;
            for(intLoop = 0;
                intLoop<rstEmployees.getProperties().getCount();intLoop++)
            {
                prpLoop = rstEmployees.getProperties().getItem(intLoop);
                // Da Value die Standardeigenschaft eines Field-Objekts
                // ist, ist die Verwendung des tatsächlichen Schlüsselwortes
                // hier optional.
                strMessage = "\t" + prpLoop.getName() + " =  ";
                varPropertyValue = prpLoop.getValue();
                short vttype =varPropertyValue.getvt();
                switch (vttype)
                {
                case Variant.VariantBoolean :
                    {
                        if (varPropertyValue.getBoolean())
                            strMessage +="True";
                        else
                            strMessage +="False";
                    }
                    break;
                case Variant.VariantInt :
                    strMessage += varPropertyValue.getInt();
                    break;
                default :
                    break;
                }
                System.out.println(strMessage);
                intCount++;
                // Schleife zum Anzeigen der Datensätze
                if (intCount % 15 == 0)
                {
                    System.out.println("\nPress <Enter> to continue..");
                    in.readLine();
                    intCount = 0;
                }

            }
            // Cleanup der Objekte vor dem Beenden.
            rstEmployees.close();
            System.out.println("\nPress <Enter> to continue..");
            in.readLine();
        }
        // Der Systemlesevorgang erfordert diesen Catch-Aufruf.
        catch(java.io.IOException je)
        {
            PrintIOError(je);
        }
        catch(AdoException ae)
        {
            // Den Benutzer ggf. über von ADO stammende Fehler
            // benachrichtigen.

            // Beim Bearbeiten eines Recordsets zunächst auf
            // NULL-Zeiger prüfen.
            if(rstEmployees != null)
            {
                PrintProviderError(rstEmployees.getActiveConnection());
            }
            else
            {
                System.out.println("Exception: " + ae.getMessage());
            }
        }

    }
    // PrintProviderError-Funktion
    static void PrintProviderError(Connection cnn1)
    {
        // Vom Connection-Objekt stammende Providerfehler drucken.
        // ErrItem ist ein Elementobjekt in der Errors-Auflistung des
        // Connection-Objekts.
        com.ms.wfc.data.Error               ErrItem = null;
        long                                 nCount = 0;
        int                                       i = 0;

        nCount = cnn1.getErrors().getCount();

        // Ggf. die Fehler in der Auflistung drucken.
        if ( nCount > 0)
        {
            // Die Auflistung hat den Bereich 0 bis nCount - 1.
            for ( i=0;i<nCount; i++)
            {
                ErrItem = cnn1.getErrors().getItem(i);
                System.out.println("\t Error Number: " + ErrItem.getNumber()
                    + "\t" + ErrItem.getDescription());
            }
        }
    }
    // PrintIOError-Funktion
    static void PrintIOError(java.io.IOException je)
    {
        System.out.println("Error: \n");
        System.out.println("\t Source: " + je.getClass() + "\n");
        System.out.println("\t Description: "+ je.getMessage() + "\n");
    }
}


Beispiel für die Version-Eigenschaft (VJ++)

In diesem Beispiel wird die Version-Eigenschaft eines Connection-Objekts zum Anzeigen der aktuellen ADO-Version verwendet. Darüber hinaus werden zahlreiche dynamische Eigenschaften verwendet, um Folgendes anzuzeigen:

  • den aktuellen DBMS-Namen sowie die Version

  • die OLE DB-Version

  • den Providernamen und die Version

  • die ODBC-Version

  • den Namen des ODBC-Treibers und die Version.
import com.ms.wfc.data.*;
import java.io.*;

public class VersionX
{
    // Der Haupteinstiegspunkt der Anwendung.
    public static void main (String[] args)
    {
        VersionX();
        System.exit(0);
    }
    // VersionX-Funktion
    static void VersionX()
    {
        // ADO-Objekte definieren.
        Connection cnn1 = null;

        // Deklarationen.
        String strCnn = "Driver={SQL Server};Server=srv;" +
                        "User Id=sa; Password=;database=Pubs;";
        String strVersionInfo;
        BufferedReader in = new
            BufferedReader(new InputStreamReader(System.in));
        try
        {
            // Eine Verbindung öffnen.
            cnn1 = new Connection();
            cnn1.open(strCnn);

            strVersionInfo = "\tADO Version:\t\t" +
                cnn1.getVersion().toString()+"\n"+
                "\tDBMS Name:\t\t" +
                cnn1.getProperties().getItem("DBMS Name").getString() +"\n"+
                "\tDBMS Version:\t\t"+
                cnn1.getProperties().getItem("DBMS Version").getString() +
                "\n" + "\tOLE DB Version:\t\t" +
                cnn1.getProperties().getItem("OLE DB Version").getString()+
                "\n" + "\tProvider Name:\t\t" +
                cnn1.getProperties().getItem("Provider Name").getString() +
                "\n" + "\tProvider Version:\t" +
                cnn1.getProperties().getItem("Provider Version").
                getString() + "\n" + "\tDriver Name:\t\t" +
                cnn1.getProperties().getItem("Driver Name").getString() +
                "\n" + "\tDriver Version:\t\t" +
                cnn1.getProperties().getItem("Driver Version").getString()+
                "\n" + "\tDriver ODBC Version:\t" +
                cnn1.getProperties().getItem(
                "Driver ODBC Version").getString()+ "\n";
            System.out.println("\n\n" + strVersionInfo);

            // Cleanup der Objekte vor dem Beenden.
            cnn1.close();
            System.out.println("Press <Enter> to continue..");
            in.readLine();
        }
        // Der Systemlesevorgang erfordert diesen Catch-Aufruf.
        catch(java.io.IOException je)
        {
            PrintIOError(je);
        }
        catch(AdoException ae)
        {
            // Den Benutzer ggf. über von ADO stammende Fehler
            // benachrichtigen.

            // Beim Bearbeiten eines Recordsets zunächst auf
            // NULL-Zeiger prüfen.
            if(cnn1!= null)
            {
                PrintProviderError(cnn1);
            }
            else
            {
                System.out.println("Exception: " + ae.getMessage());
            }
        }

    }
    // PrintProviderError-Funktion
    static void PrintProviderError(Connection cnn1)
    {
        // Vom Connection-Objekt stammende Providerfehler drucken.
        // ErrItem ist ein Elementobjekt in der Errors-Auflistung des
        // Connection-Objekts.
        com.ms.wfc.data.Error               ErrItem = null;
        long                                 nCount = 0;
        int                                       i = 0;

        nCount = cnn1.getErrors().getCount();

        // Ggf. die Fehler in der Auflistung drucken.
        if ( nCount > 0)
        {
            // Die Auflistung hat den Bereich 0 bis nCount - 1.
            for ( i=0;i<nCount; i++)
            {
                ErrItem = cnn1.getErrors().getItem(i);
                System.out.println("\t Error Number: " + ErrItem.getNumber()
                    + "\t" + ErrItem.getDescription());
            }
        }
    }
    // PrintIOError-Funktion
    static void PrintIOError(java.io.IOException je)
    {
        System.out.println("Error: \n");
        System.out.println("\t Source: " + je.getClass() + "\n");
        System.out.println("\t Description: "+ je.getMessage() + "\n");
    }
}


Verwenden von Providern mit ADO

Dieser Abschnitt behandelt drei Arten von Providern: Datenprovider, Dienstanbieter und Dienstkomponenten. Es gibt zwei Gruppen von Providern: solche, die Daten bereitstellen und solche, die Dienste bereitstellen. Ein Datenprovider verfügt über eigene Daten und macht sie für die Anwendung des Kunden in tabellarischer Form verfügbar. Ein Dienstanbieter bietet einen Dienst an, indem er Daten erstellt und verwendet, die den Funktionsumfang in Ihren ADO-Anwendungen erweitern. Ein Dienstanbieter ist möglicherweise auch weiter als eine Dienstkomponente definiert, die in Verbindung mit anderen Dienstanbietern oder Komponenten arbeiten muss.

Datenprovider

Die Leistungsfähigkeit und Flexibilität von ADO beruht darauf, dass es basierend auf demselben Programmiermodell eine Verbindung zu unterschiedlichen Datenprovidern herstellen kann, unabhängig von den speziellen Features jedes einzelnen Providers.

Da jeder Datenprovider aber einzigartig ist, kommt es bei den verschiedenen Datenprovidern zu einem unterschiedlichen Interaktionsverhalten Ihrer Anwendung mit ADO. Die Unterschiede können in der Regel in eine drei folgenden Kategorien eingeordnet werden:

  • Verbindungsparameter in der ConnectionString-Eigenschaft.

  • Verwendung des Command-Objekts.

  • Providerspezifisches Verhalten des Recordset-Objekts.

Einzelheiten zu allen derzeit von Microsoft verfügbaren Datenprovidern sind im Folgenden aufgeführt.

Bereich | Thema
ODBC-Datenbanken | Microsoft OLE DB-Provider für ODBC
Microsoft Indexdienst | Microsoft OLE DB-Provider für Microsoft Indexdienst
Microsoft Active Directory Service | Microsoft OLE DB-Provider für Microsoft Active Directory Service
Microsoft Jet-Datenbanken | Microsoft OLE DB-Provider für Microsoft Jet
Microsoft SQL Server | Microsoft OLE DB-Provider für SQL Server
Oracle-Datenbanken | Microsoft OLE DB-Provider für Oracle
Internet Publishing | Microsoft OLE DB-Provider für Internet Publishing

Providerspezifische dynamische Eigenschaften

Die Properties -Auflistungen der Objekte Connection, Command und Recordset schließen dynamische Eigenschaften ein, die bei jedem Provider unterschiedlich sind. Diese Eigenschaften enthalten Informationen über die spezielle Funktionalität eines Providers, die über die von ADO unterstützten integrierten Eigenschaften hinausgehen.

Nachdem die Verbindung aufgebaut und diese Objekte erstellt wurden, verwenden Sie die Refresh-Methode in der Properties-Auflistung des Objekts, um die providerspezifischen Eigenschaften zu erhalten. Weitere Informationen zu diesen dynamischen Eigenschaften finden Sie in der Dokumentation des Providers und in der OLE DB Programmer's Reference.

Dienstanbieter

Um einen Dienstanbieter zu verwenden, müssen Sie ein Schlüsselwort angeben. Sie sollten auch die providerspezifischen dynamischen Eigenschaften beachten, die mit jedem dieser Dienstanbieter verknüpft sind. Providerspezifische Einzelheiten sind für alle derzeit von Microsoft verfügbaren Dienstanbietern aufgeführt.

  • Microsoft Data Shaping Service für OLE DB

  • Microsoft OLE DB Persistence Provider

  • Microsoft OLE DB Remoting Provider

Dienstkomponenten

Der Cursordienst für OLE DB ergänzt die Cursor-Unterstützungsfunktionen der Datenprovider. Er erfordert auch ein Schlüsselwort und hat dynamische Eigenschaften.

Siehe auch Weitere Informationen zu Providern finden Sie in der Dokumentation zu Microsoft OLE DB im Microsoft® Data Access Components SDK, oder besuchen Sie die Microsoft Universal Data Access-Website.


Microsoft OLE DB-Provider für ODBC

Für das Programmieren mit ADO oder RDS wäre es ideal, wenn jede Datenquelle auf einer OLE DB-Schnittstelle basieren würde, so dass ADO direkt auf die Datenquelle zugreifen könnte. Obwohl immer mehr Lieferanten von Datenbanken OLE DB-Schnittstellen implementieren, basieren einige Datenquellen noch nicht auf ihnen. Praktisch kann jedoch auf alle derzeit verwendeten DBMS-Systeme über ODBC zugegriffen werden.

ODBC-Treiber sind für jede größere heutzutage verwendete DBMS verfügbar, wie z. B. Microsoft SQL Server™, Microsoft Access (Microsoft Jet-Datenbankmodul) und Microsoft FoxPro®, und darüber hinaus auch für Datenbankprodukte anderer Hersteller, wie beispielsweise Oracle.

Mit dem Microsoft ODBC-Provider kann ADO eine Verbindung zu jeder ODBC-Datenquelle herstellen. Der Provider ist freethreaded, und Unicode ist aktiviert.

Der Provider unterstützt Transaktionen, wobei auch unterschiedliche DBMS-Module verschiedene Arten von Transaktionsunterstützung anbieten. Microsoft Access z. B. unterstützt geschachtelte Transaktionen mit bis zu fünf Ebenen.

Dies ist der Standardprovider für ADO, und alle vom Provider abhängigen ADO-Eigenschaften und Methoden werden unterstützt.

Parameter der Verbindungszeichenfolge

Um eine Verbindung zu diesem Provider herzustellen, müssen Sie das Argument Provider= der ConnectionString-Eigenschaft folgendermaßen festlegen:

MSDASQL

Beim Lesen der Provider-Eigenschaft wird diese Zeichenfolge ebenfalls zurückgegeben.

Typische Verbindungszeichenfolgen

Dies ist eine typische Verbindungszeichenfolge für diesen Provider:

"Provider=MSDASQL;DSN=dsnName;UID=userName;PWD=userPassword;"

Dabei werden die folgenden Schlüsselwörter verwendet:

Schlüsselwort | Beschreibung
Provider | Gibt den Microsoft OLE DB-Provider für ODBC an.
DSN | Gibt den Datenquellenname an.
UID | Gibt den Benutzernamen an.
PWD | Gibt das Benutzerkennwort an.

Da dies der Standardprovider für ADO ist, wird ADO versuchen, eine Verbindung zu diesem Provider herzustellen, wenn Sie den Parameter Provider= in der Verbindungszeichenfolge nicht angeben.

Der Provider unterstützt zusätzlich zu den durch ADO definierten Parametern keine bestimmten Verbindungsparameter. Der Provider übergibt jedoch alle Verbindungsparameter, die nicht von ADO sind, an den ODBC-Treiber-Manager.

Da Sie den Provider-Parameter übergehen können, können Sie eine ADO-Verbindungszeichenfolge erstellen, die mit einer ODBC-Verbindungszeichenfolge für dieselbe Datenquelle übereinstimmt. Verwenden Sie dazu dieselben Parameternamen (DRIVER=, DATABASE=, DSN= usw.), Werte und dieselbe Syntax wie für das Erstellen einer ODBC-Verbindungszeichenfolge. Sie können eine Verbindung mit oder ohne einen vorgegebenen Datenquellennamen (Data Source Name, DSN) oder Datei-DSN herstellen.

Syntax mit DSN oder Datei-DSN:

"[Provider=MSDASQL;] { DSN=name | FileDSN=filename } ; [DATABASE=database;] UID=user; PWD=password"

Syntax ohne DSN (Verbindung ohne DSN):

"[Provider=MSDASQL;] DRIVER=driver; SERVER=server; DATABASE=database; UID=user; PWD=password"

Wenn Sie die Parameter DSN- oder Datei-DSN verwenden, muss dieser über den ODBC-Datenquellen-Administrator in der Systemsteuerung von Windows definiert sein. In Microsoft Windows 2000 finden Sie den ODBC-Administrator unter Verwaltung. In früheren Versionen von Windows heißt das Symbol für den ODBC-Administrator 32-Bit ODBC oder einfach ODBC.

Alternativ zur Festlegung eines DSN–Parameters können Sie auch den ODBC-Treiber (DRIVER=), beispielsweise SQL Server, den Servernamen (SERVER=) und den Datenbanknamen (DATABASE=) angeben.

Sie können auch einen Namen für das Benutzerkonto (UID=) und das Kennwort für das Benutzerkonto (PWD=) in den ODBC-spezifischen Parametern oder in den standardmäßig durch ADO definierten Parametern User ID und Password festlegen.

Obwohl durch eine DSN-Definition bereits eine Datenbank angegeben ist, können Sie einen DATABASE-Parameter zusätzlich zu einem DSN-Parameter angeben, um eine Verbindung zu einer anderen Datenbank herzustellen. Es ist immer von Vorteil, den DATABASE-Parameter einzuschließen, wenn Sie einen DSN–Parameter verwenden. Dadurch wird sichergestellt, dass die Verbindung zur richtigen Datenbank hergestellt wird, falls eine andere Person den Parameter für die Standarddatenbank geändert hat, nachdem Sie die DSN-Definition zuletzt überprüft haben.

Providerspezifische Verbindungseigenschaften

Der OLE DB-Provider für ODBC fügt zu der Properties-Auflistung des Connection-Objekts mehrere Eigenschaften hinzu. In der folgenden Tabelle sind die Eigenschaften mit den Namen der entsprechenden OLE DB-Eigenschaften in Klammern aufgeführt.

Name der Eigenschaft | Beschreibung
Accessible Procedures (KAGPROP_ACCESSIBLEPROCEDURES) | Gibt an, ob der Benutzer Zugriff auf gespeicherte Prozeduren hat.
Accessible Tables (KAGPROP_ACCESSIBLETABLES) | Gibt an, ob der Benutzer die Berechtigung zum Ausführen von SELECT-Anweisungen für Datenbanktabellen hat.
Active Statements (KAGPROP_ACTIVESTATEMENTS) | Gibt die Zahl der Handles an, die ein ODBC-Treiber für eine Verbindung unterstützen kann.
Driver Name (KAGPROP_DRIVERNAME) | Gibt den Dateinamen des ODBC-Treibers an.
Driver ODBC Version (KAGPROP_DRIVERODBCVER) | Gibt die ODBC-Version an, die dieser Treiber unterstützt.
File Usage (KAGPROP_FILEUSAGE) | Gibt an, ob der Treiber eine Datei in einer Datenquelle als Tabelle oder Katalog behandelt.
Like Escape Clause (KAGPROP_LIKEESCAPECLAUSE) | Gibt an, ob der Treiber die Definition und die Verwendung eines Escapezeichens für das Prozentzeichen (%) und das Unterstreichungszeichen (_) im LIKE-Parameter einer WHERE-Klausel unterstützt.
Max Columns in Group By (KAGPROP_MAXCOLUMNSINGROUPBY) | Gibt an, wie viele Spalten in der GROUP BY-Klausel einer SELECT-Anweisung maximal zulässig sind.
Max Columns in Index (KAGPROP_MAXCOLUMNSININDEX) | Gibt an, wie viele Spalten für einen Index maximal zulässig sind.
Max Columns in Order By (KAGPROP_MAXCOLUMNSINORDERBY) | Gibt an, wie viele Spalten in der ORDER BY-Klausel einer SELECT-Anweisung maximal zulässig sind.
Max Columns in Select (KAGPROP_MAXCOLUMNSINSELECT) | Gibt an, wie viele Spalten in der SELECT-Klausel einer SELECT-Anweisung maximal zulässig sind.
Max Columns in Table (KAGPROP_MAXCOLUMNSINTABLE) | Gibt an, wie viele Spalten in einer Tabelle maximal zulässig sind.
Numeric Functions (KAGPROP_NUMERICFUNCTIONS) | Gibt an, welche numerischen Funktionen vom ODBC-Treiber unterstützt werden. Eine Aufstellung der Funktionsnamen und der zugeordneten Werte, die in dieser Bitmaske verwendet werden, finden Sie in Anhang E: Skalare Funktionen der ODBC-Dokumentation.
Outer Join Capabilities (KAGPROP_OJCAPABILITY) | Gibt die OUTER JOIN-Typen an, die der Provider unterstützt.
Outer Joins (KAGPROP_OUTERJOINS) | Gibt an, ob der Provider OUTER JOIN-Verknüpfungen unterstützt.
Special Characters (KAGPROP_SPECIALCHARACTERS) | Gibt an, welche Zeichen eine spezielle Bedeutung für den ODBC-Treiber haben.
Gespeicherte Prozeduren (KAGPROP_PROCEDURES) | Gibt an, ob gespeicherte Prozeduren mit diesem ODBC-Treiber verwendet werden können.
String Functions (KAGPROP_STRINGFUNCTIONS) | Gibt an, welche Zeichenfolgenfunktionen vom ODBC-Treiber unterstützt werden. Eine Aufstellung der Funktionsnamen und der zugeordneten Werte, die in dieser Bitmaske verwendet werden, finden Sie in Anhang E: Skalare Funktionen der ODBC-Dokumentation.
System Functions (KAGPROP_SYSTEMFUNCTIONS) | Gibt an, welche Systemfunktionen vom ODBC-Treiber unterstützt werden. Eine Aufstellung der Funktionsnamen und der zugeordneten Werte, die in dieser Bitmaske verwendet werden, finden Sie in Anhang E: Skalare Funktionen der ODBC-Dokumentation.
Time/Date Functions (KAGPROP_TIMEDATEFUNCTIONS) | Gibt an, welche Zeit- und Datumsfunktionen vom ODBC-Treiber unterstützt werden. Eine Aufstellung der Funktionsnamen und der zugeordneten Werte, die in dieser Bitmaske verwendet werden, finden Sie in Anhang E: Skalare Funktionen der ODBC-Dokumentation.
SQL Grammar Support (KAGPROP_ODBCSQLCONFORMANCE) | Gibt die SQL-Syntax an, die dieser Treiber unterstützt.

Providerspezifische "Recordset"- und "Command"-Eigenschaften

Der OLE DB-Provider für ODBC fügt zu der Properties-Auflistung der Objekte Recordset und Command mehrere Eigenschaften hinzu. In der folgenden Tabelle sind die Eigenschaften mit den Namen der entsprechenden OLE DB-Eigenschaften in Klammern aufgeführt.

Name der Eigenschaft | Beschreibung
Query Based Updates/Deletes/Inserts (KAGPROP_QUERYBASEDUPDATES) | Gibt an, ob mit SQL-Abfragen Aktualisierungen, Löschungen und Einfügungen zulässig sind.
ODBC Concurrency Type (KAGPROP_CONCURRENCY) | Gibt die Methode an, mit der potenzielle Probleme reduziert werden, die durch zwei Benutzer verursacht werden, die versuchen, gleichzeitig auf dieselben Daten zuzugreifen.
BLOB accessibility on Forward-Only cursor (KAGPROP_BLOBSONFOCURSOR) | Gibt an, ob mit einem Vorwärtscursor der Zugriff auf BLOB-Felder möglich ist.
Include SQL_FLOAT, SQL_DOUBLE und SQL_REAL in QBU WHERE clauses (KAGPROP_INCLUDENONEXACT) | Gibt an, ob die Werte SQL_FLOAT, SQL_DOUBLE und SQL_REAL für QBU WHERE-Klauseln zulässig sind.
Position on the last row after insert (KAGPROP_POSITIONONNEWROW) | Gibt an, dass nach dem Einfügen eines neuen Datensatzes in einer Tabelle die letzte Zeile zur aktuellen Zeile wird.
IRowsetChangeExtInfo (KAGPROP_IROWSETCHANGEEXTINFO) | Gibt an, ob die IrowsetChange-Schnittstelle erweiterte Informationen unterstützt.
ODBC Cursor Type (KAGPROP_CURSOR) | Gibt den vom Recordset-Objekt verwendeten Cursortyp an.
Generate a Rowset that can be marshaled (KAGPROP_MARSHALLABLE) | Gibt an, dass der ODBC-Treiber ein Recordset generiert, das gemarshallt werden kann.

Befehlstext

Die Verwendung des Command-Objekts hängt hauptsächlich von der Datenquelle ab und davon, welche Art von Abfrage oder Befehlsanweisung diese akzeptiert.

ODBC verfügt über eine spezielle Syntax zum Aufrufen gespeicherter Prozeduren. Übergeben Sie eine Zeichenfolge mit der folgenden Syntax für die CommandText-Eigenschaft eines Command-Objekts, das CommandText-Argument an die Execute-Methode eines Connection-Objekts oder das Source-Argument an die Open-Methode eines Recordset-Objekts:

"{ [ ? = ] call procedure [ ( ? [, ? [ , … ]] ) ] }"

Wobei jedes ? auf ein Objekt in der Parameters-Auflistung verweist. Das erste ? verweist auf Parameters(0), das nächste ? verweist auf Parameters(1) usw.

Die Parameterverweise sind optional und hängen von der Struktur der gespeicherten Prozedur ab. Wenn Sie eine gespeicherte Prozedur aufrufen möchten, die keine Parameter definiert, sieht die Zeichenfolge folgendermaßen aus:

"{ call procedure }"

Bei zwei Abfrageparametern sieht die Zeichenfolge folgendermaßen aus:

"{ call procedure ( ?, ? ) }"

Wenn die gespeicherte Prozedur einen Wert zurückgibt, wird der Rückgabewert wie ein weiterer Parameter behandelt. Wenn keine Abfrageparameter vorhanden sind, aber ein Wert zurückgegeben wird, sieht die Zeichenfolge folgendermaßen aus:

"{ ? = call procedure }"

Und wenn ein Rückgabewert und zwei Abfrageparameter vorhanden sind, sieht die Zeichenfolge folgendermaßen aus:

"{ ? = call procedure ( ?, ? ) }"

Verhalten des "Recordset"-Objekts

In der folgenden Tabelle sind die standardmäßigen ADO-Methoden und -Eigenschaften aufgeführt, die in einem mit diesen Provider geöffneten Recordset-Objekt zur Verfügung stehen.

Weitere Informationen zu dem Verhalten von Recordset-Objekten für Ihre Providerkonfiguration erhalten Sie, wenn Sie die Supports-Methode ausführen und die Properties-Auflistung des Recordset-Objekts angeben, um zu ermitteln, ob die providerspezifischen dynamischen Eigenschaften vorhanden sind.

Verfügbarkeit standardmäßiger Recordset-Eigenschaften von ADO:

Eigenschaft | Vorwärts | Dynamisch | Keyset | Statisch
AbsolutePage | nicht verfügbar | nicht verfügbar | Lesen/ Schreiben | Lesen/ Schreiben
AbsolutePosition | nicht verfügbar | nicht verfügbar | Lesen/ Schreiben | Lesen/ Schreiben
ActiveConnection | Lesen/ Schreiben | Lesen/ Schreiben | Lesen/ Schreiben | Lesen/ Schreiben
BOF | schreibgeschützt | schreibgeschützt | schreibgeschützt | schreibgeschützt
Bookmark | nicht verfügbar | nicht verfügbar | Lesen/ Schreiben | Lesen/ Schreiben
CacheSize | Lesen/ Schreiben | Lesen/ Schreiben | Lesen/ Schreiben | Lesen/ Schreiben
CursorLocation | Lesen/ Schreiben | Lesen/ Schreiben | Lesen/ Schreiben | Lesen/ Schreiben
CursorType | Lesen/ Schreiben | Lesen/ Schreiben | Lesen/ Schreiben | Lesen/ Schreiben
EditMode | schreibgeschützt | schreibgeschützt | schreibgeschützt | schreibgeschützt
Filter | Lesen/ Schreiben | Lesen/ Schreiben | Lesen/ Schreiben | Lesen/ Schreiben
LockType | Lesen/ Schreiben | Lesen/ Schreiben | Lesen/ Schreiben | Lesen/ Schreiben
MarshalOptions | Lesen/ Schreiben | Lesen/ Schreiben | Lesen/ Schreiben | Lesen/ Schreiben
MaxRecords | Lesen/ Schreiben | Lesen/ Schreiben | Lesen/ Schreiben | Lesen/ Schreiben
PageCount | Lesen/ Schreiben | nicht verfügbar | schreibgeschützt | schreibgeschützt
PageSize | Lesen/ Schreiben | Lesen/ Schreiben | Lesen/ Schreiben | Lesen/ Schreiben
RecordCount | Lesen/ Schreiben | nicht verfügbar | schreibgeschützt | schreibgeschützt
Source | Lesen/ Schreiben | Lesen/ Schreiben | Lesen/ Schreiben | Lesen/ Schreiben
State | schreibgeschützt | schreibgeschützt | schreibgeschützt | schreibgeschützt
Status | schreibgeschützt | schreibgeschützt | schreibgeschützt | schreibgeschützt

Die Eigenschaften AbsolutePosition und AbsolutePage sind lesegeschützt, wenn ADO mit der Version 1.0 von Microsoft OLE DB-Provider für ODBC verwendet wird.

Verfügbarkeit standardmäßiger Recordset-Methoden von ADO:

Methode | Vorwärts | Dynamisch | Keyset | Statisch
AddNew | Ja | Ja | Ja | Ja
Cancel | Ja | Ja | Ja | Ja
CancelBatch | Ja | Ja | Ja | Ja
CancelUpdate | Ja | Ja | Ja | Ja
Clone | Nein | Nein | Ja | Ja
Close | Ja | Ja | Ja | Ja
Delete | Ja | Ja | Ja | Ja
GetRows | Ja | Ja | Ja | Ja
Move | Ja | Ja | Ja | Ja
MoveFirst | Ja | Ja | Ja | Ja
MoveLast | Nein | Ja | Ja | Ja
MoveNext | Ja | Ja | Ja | Ja
MovePrevious | Nein | Ja | Ja | Ja
NextRecordset* | Ja | Ja | Ja | Ja
Open | Ja | Ja | Ja | Ja
Requery | Ja | Ja | Ja | Ja
Resync | Nein | Nein | Ja | Ja
Supports | Ja | Ja | Ja | Ja
Update | Ja | Ja | Ja | Ja
UpdateBatch | Ja | Ja | Ja | Ja

*Bei Microsoft Access-Datenbanken nicht unterstützt.

Dynamische Eigenschaften

Der Microsoft OLE DB-Provider für ODBC fügt der Properties-Auflistung der ungeöffneten Objekte Connection, Recordset und Command mehrere dynamische Eigenschaften hinzu.

Die folgenden Tabellen stellen einen Index der ADO- und OLE DB-Namen für die dynamischen Eigenschaften dar. Die OLE DB Programmer's Reference verweist mit dem Begriff "Beschreibung" auf Namen von ADO-Eigenschaften. Weitere Informationen zu diesen Eigenschaften finden Sie in der OLE DB Programmer's Reference. Suchen Sie im Index nach dem Namen der OLE DB-Eigenschaft, oder lesen Sie Anhang C: OLE DB-Eigenschaften.

Dynamische Verbindungseigenschaften

Die folgenden Eigenschaften werden zu der Properties-Auflistung des Connection-Objekts hinzugefügt.

ADO-Eigenschaftenname | OLE DB-Eigenschaftenname
Active Sessions | DBPROP_ACTIVESESSIONS
Asynchable Abort | DBPROP_ASYNCTXNABORT
Asynchable Commit | DBPROP_ASYNCTNXCOMMIT
Autocommit Isolation Levels | DBPROP_SESS_AUTOCOMMITISOLEVELS
Catalog Location | DBPROP_CATALOGLOCATION
Catalog Term | DBPROP_CATALOGTERM
Column Definition | DBPROP_COLUMNDEFINITION
Connect Timeout | DBPROP_INIT_TIMEOUT
Current Catalog | DBPROP_CURRENTCATALOG
Data Source | DBPROP_INIT_DATASOURCE
Data Source Name | DBPROP_DATASOURCENAME
Data Source Object Threading Model | DBPROP_DSOTHREADMODEL
DBMS Name | DBPROP_DBMSNAME
DBMS Version | DBPROP_DBMSVER
Extended Properties | DBPROP_INIT_PROVIDERSTRING
GROUP BY Support | DBPROP_GROUPBY
Heterogeneous Table Support | DBPROP_HETEROGENEOUSTABLES
Identifier Case Sensitivity | DBPROP_IDENTIFIERCASE
Initial Catalog | DBPROP_INIT_CATALOG
Isolation Levels | DBPROP_SUPPORTEDTXNISOLEVELS
Isolation Retention | DBPROP_SUPPORTEDTXNISORETAIN
Locale Identifier | DBPROP_INIT_LCID
Location | DBPROP_INIT_LOCATION
Maximum Index Size | DBPROP_MAXINDEXSIZE
Maximum Row Size | DBPROP_MAXROWSIZE
Maximum Row Size Includes BLOB | DBPROP_MAXROWSIZEINCLUDESBLOB
Maximum Tables in SELECT | DBPROP_MAXTABLESINSELECT
Mode | DBPROP_INIT_MODE
Multiple Parameter Sets | DBPROP_MULTIPLEPARAMSETS
Multiple Results | DBPROP_MULTIPLERESULTS
Multiple Storage Objects | DBPROP_MULTIPLESTORAGEOBJECTS
Multi-Table Update | DBPROP_MULTITABLEUPDATE
NULL Collation Order | DBPROP_NULLCOLLATION
NULL Concatenation Behavior | DBPROP_CONCATNULLBEHAVIOR
OLE DB Services | DBPROP_INIT_OLEDBSERVICES
OLE DB Version | DBPROP_PROVIDEROLEDBVER
OLE Object Support | DBPROP_OLEOBJECTS
Open Rowset Support | DBPROP_OPENROWSETSUPPORT
ORDER BY Columns in Select List | DBPROP_ORDERBYCOLUMNSINSELECT
Output Parameter Availability | DBPROP_OUTPUTPARAMETERAVAILABILITY
Password | DBPROP_AUTH_PASSWORD
Pass By Ref Accessors | DBPROP_BYREFACCESSORS
Persist Security Info | DBPROP_AUTH_PERSIST_SENSITIVE_AUTHINFO
Persistent ID Type | DBPROP_PERSISTENTIDTYPE
Prepare Abort Behavior | DBPROP_PREPAREABORTBEHAVIOR
Prepare Commit Behavior | DBPROP_PREPARECOMMITBEHAVIOR
Procedure Term | DBPROP_PROCEDURETERM
Prompt | DBPROP_INIT_PROMPT
Provider Friendly Name | DBPROP_PROVIDERFRIENDLYNAME
Provider Name | DBPROP_PROVIDERFILENAME
Provider Version | DBPROP_PROVIDERVER
Read-Only Data Source | DBPROP_DATASOURCEREADONLY
Rowset Conversions on Command | DBPROP_ROWSETCONVERSIONSONCOMMAND
Schema Term | DBPROP_SCHEMATERM
Schema Usage | DBPROP_SCHEMAUSAGE
SQL Support | DBPROP_SQLSUPPORT
Structured Storage | DBPROP_STRUCTUREDSTORAGE
Subquery Support | DBPROP_SUBQUERIES
Table Term | DBPROP_TABLETERM
Transaction DDL | DBPROP_SUPPORTEDTXNDDL
User ID | DBPROP_AUTH_USERID
User Name | DBPROP_USERNAME
Window Handle | DBPROP_INIT_HWND

Dynamische "Recordset"-Eigenschaften

Die folgenden Eigenschaften werden zu der Properties-Auflistung des Recordset-Objekts hinzugefügt.

ADO-Eigenschaftenname | OLE DB-Eigenschaftenname
Access Order | DBPROP_ACCESSORDER
Blocking Storage Objects | DBPROP_BLOCKINGSTORAGEOBJECTS
Bookmark Type | DBPROP_BOOKMARKTYPE
Bookmarkable | DBPROP_IROWSETLOCATE
Change Inserted Rows | DBPROP_CHANGEINSERTEDROWS
Column Privileges | DBPROP_COLUMNRESTRICT
Column Set Notification | DBPROP_NOTIFYCOLUMNSET
Delay Storage Object Updates | DBPROP_DELAYSTORAGEOBJECTS
Fetch Backwards | DBPROP_CANFETCHBACKWARDS
Hold Rows | DBPROP_CANHOLDROWS
IAccessor | DBPROP_Iaccessor
IColumnsInfo | DBPROP_IcolumnsInfo
IColumnsRowset | DBPROP_IcolumnsRowset
IConnectionPointContainer | DBPROP_IconnectionPointContainer
IConvertType | DBPROP_IconvertType
Immobile Rows | DBPROP_IMMOBILEROWS
IRowset | DBPROP_Irowset
IRowsetChange | DBPROP_IrowsetChange
IRowsetIdentity | DBPROP_IrowsetIdentity
IRowsetInfo | DBPROP_IrowsetInfo
IRowsetLocate | DBPROP_IrowsestLocate
IRowsetResynch |
IRowsetUpdate | DBPROP_IrowsetUpdate
ISequentialStream | DBPROP_IsequentialStream
ISupportErrorInfo | DBPROP_IsupportErrorInfo
Literal Bookmarks | DBPROP_LITERALBOOKMARKS
Literal Row Identity | DBPROP_LITERALIDENTITY
Maximum Open Rows | DBPROP_MAXOPENROWS
Maximum Pending Rows | DBPROP_MAXPENDINGROWS
Maximum Rows | DBPROP_MAXROWS
Notification Granularity | DBPROP_NOTIFICATIONGRANULARITY
Notification Phases | DBPROP_NOTIFICATIONPHASES
Objects Transacted | DBPROP_TRANSACTEDOBJECT
Own Changes Visible | DBPROP_OWNUPDATEDELETE
Own Inserts Visible | DBPROP_OWNINSERT
Preserve on Abort | DBPROP_ABORTPRESERVE
Preserve on Commit | DBPROP_COMMITPRESERVE
Quick Restart | DBPROP_QUICKRESTART
Reentrant Events | DBPROP_REENTRANTEVENTS
Remove Deleted Rows | DBPROP_REMOVEDELETED
Report Multiple Changes | DBPROP_REPORTMULTIPLECHANGES
Return Pending Inserts | DBPROP_RETURNPENDINGINSERTS
Row Delete Notification | DBPROP_NOTIFYROWDELETE
Row First Change Notification | DBPROP_NOTIFYROWFIRSTCHANGE
Row Insert Notification | DBPROP_NOTIFYROWINSERT
Row Privileges | DBPROP_ROWRESTRICT
Row Resynchronization Notification | DBPROP_NOTIFYROWRESYNCH
Row Threading Model | DBPROP_ROWTHREADMODEL
Row Undo Change Notification | DBPROP_NOTIFYROWUNDOCHANGE
Row Undo Delete Notification | DBPROP_NOTIFYROWUNDODELETE
Row Undo Insert Notification | DBPROP_NOTIFYROWUNDOINSERT
Row Update Notification | DBPROP_NOTIFYROWUPDATE
Rowset Fetch Position Change Notification | DBPROP_NOTIFYROWSETFETCHPOSISIONCHANGE
Rowset Release Notification | DBPROP_NOTIFYROWSETRELEASE
Scroll Backwards | DBPROP_CANSCROLLBACKWARDS
Skip Deleted Bookmarks | DBPROP_BOOKMARKSKIPPED
Strong Row Identity | DBPROP_STRONGITDENTITY
Unique Rows | DBPROP_UNIQUEROWS
Updatability | DBPROP_UPDATABILITY
Use Bookmarks | DBPROP_BOOKMARKS

Dynamische Befehlseigenschaften

Die folgenden Eigenschaften werden zu der Properties-Auflistung des Command-Objekts hinzugefügt.

ADO-Eigenschaftenname | OLE DB-Eigenschaftenname
Access Order | DBPROP_ACCESSORDER
Blocking Storage Objects | DBPROP_BLOCKINGSTORAGEOBJECTS
Bookmark Type | DBPROP_BOOKMARKTYPE
Bookmarkable | DBPROP_IROWSETLOCATE
Change Inserted Rows | DBPROP_CHANGEINSERTEDROWS
Column Privileges | DBPROP_COLUMNRESTRICT
Column Set Notification | DBPROP_NOTIFYCOLUMNSET
Delay Storage Object Updates | DBPROP_DELAYSTORAGEOBJECTS
Fetch Backwards | DBPROP_CANFETCHBACKWARDS
Hold Rows | DBPROP_CANHOLDROWS
IAccessor | DBPROP_Iaccessor
IColumnsInfo | DBPROP_IcolumnsInfo
IColumnsRowset | DBPROP_IcolumnsRowset
IConnectionPointContainer | DBPROP_IconnectionPointContainer
IConvertType | DBPROP_IconvertType
Immobile Rows | DBPROP_IMMOBILEROWS
IRowset | DBPROP_Irowset
IRowsetChange | DBPROP_IrowsetChange
IRowsetIdentity | DBPROP_IrowsetIdentity
IRowsetInfo | DBPROP_IrowsetInfo
IRowsetLocate | DBPROP_IrowsetLocate
IRowsetResynch |
IRowsetUpdate | DBPROP_IrowsetUpdate
ISequentialStream | DBPROP_IsequentialStream
ISupportErrorInfo | DBPROP_IsupportErrorInfo
Literal Bookmarks | DBPROP_LITERALBOOKMARKS
Literal Row Identity | DBPROP_LITERALIDENTITY
Maximum Open Rows | DBPROP_MAXOPENROWS
Maximum Pending Rows | DBPROP_MAXPENDINGROWS
Maximum Rows | DBPROP_MAXROWS
Notification Granularity | DBPROP_NOTIFICATIONGRANULARITY
Notification Phases | DBPROP_NOTIFICATIONPHASES
Objects Transacted | DBPROP_TRANSACTEDOBJECT
Own Changes Visible | DBPROP_OWNUPDATEDELETE
Own Inserts Visible | DBPROP_OWNINSERT
Preserve on Abort | DBPROP_ABORTPRESERVE
Preserve on Commit | DBPROP_COMMITPRESERVE
Quick Restart | DBPROP_QUICKRESTART
Reentrant Events | DBPROP_REENTRANTEVENTS
Remove Deleted Rows | DBPROP_REMOVEDELETED
Report Multiple Changes | DBPROP_REPORTMULTIPLECHANGES
Return Pending Inserts | DBPROP_RETURNPENDINGINSERTS
Row Delete Notification | DBPROP_NOTIFYROWDELETE
Row First Change Notification | DBPROP_NOTIFYROWFIRSTCHANGE
Row Insert Notification | DBPROP_NOTIFYROWINSERT
Row Privileges | DBPROP_ROWRESTRICT
Row Resynchronization Notification | DBPROP_NOTIFYROWRESYNCH
Row Threading Model | DBPROP_ROWTHREADMODEL
Row Undo Change Notification | DBPROP_NOTIFYROWUNDOCHANGE
Row Undo Delete Notification | DBPROP_NOTIFYROWUNDODELETE
Row Undo Insert Notification | DBPROP_NOTIFYROWUNDOINSERT
Row Update Notification | DBPROP_NOTIFYROWUPDATE
Rowset Fetch Position Change Notification | DBPROP_NOTIFYROWSETFETCHPOSITIONCHANGE
Rowset Release Notification | DBPROP_NOTIFYROWSETRELEASE
Scroll Backwards | DBPROP_CANSCROLLBACKWARDS
Skip Deleted Bookmarks | DBPROP_BOOKMARKSKIP
Strong Row Identity | DBPROP_STRONGIDENTITY
Updatability | DBPROP_UPDATABILITY
Use Bookmarks | DBPROP_BOOKMARKS

Siehe auch Ausführliche Informationen für spezielle Implementierungen sowie funktionale Informationen zum Microsoft OLE DB-Provider für ODBC entnehmen Sie der Dokumentation zu Microsoft OLE DB-Provider für ODBC und der Microsoft OLE DB Programmer's Reference, die im MDAC SDK verfügbar sind, oder besuchen Sie die Universal Data Access-Website.


Microsoft OLE DB-Provider für Microsoft Indexdienst

Der Microsoft OLE DB-Provider für Microsoft Indexdienst verfügt über einen programmgesteuerten schreibgeschützten Zugriff auf das Dateisystem und auf Webdaten, die durch den Microsoft Indexdienst indiziert wurden. ADO-Anwendungen können SQL-Abfragen ausgeben, um Informationen über den Inhalt und die Dateieigenschaften abzurufen.

Der Provider ist freethreaded, und Unicode ist aktiviert.

Parameter der Verbindungszeichenfolge

Wenn Sie eine Verbindung zu diesem Provider herstellen möchten, müssen Sie das Argument Provider= der ConnectionString-Eigenschaft folgendermaßen festlegen:

MSIDXS

Beim Lesen der Provider-Eigenschaft wird diese Zeichenfolge ebenfalls zurückgegeben.

Typische Verbindungszeichenfolgen

Dies ist eine typische Verbindungszeichenfolge für diesen Provider:

"Provider=MSIDXS;Data Source=myCatalog;Locale Identifier=nnnn;"

Dabei werden die folgenden Schlüsselwörter verwendet:

Schlüsselwort | Beschreibung
Provider | Gibt den Microsoft OLE DB-Provider für Microsoft Indexdienst an. Normalerweise ist dies das einzige Schlüsselwort, das in der Verbindungszeichenfolge angegeben wird.
Data Source | Gibt den Katalognamen für den Indexdienst an. Wenn Sie dieses Schlüsselwort nicht angeben, wird der Standardsystemkatalog verwendet.
Locale Identifier | Gibt eine eindeutige 32-Bit-Zahl an (z. B. 1033), die Einstellungen bezüglich der Sprache des Benutzers festlegt. Diese Einstellungen legen fest, wie Datums- und Zeitwerte formatiert werden, wie Elemente alphabetisch sortiert werden, wie Zeichenfolgen verglichen werden usw. Wenn Sie dieses Schlüsselwort nicht angeben, wird die Standardgebietsschema-ID verwendet.

Befehlstext

Die SQL-Abfragesyntax des Indexdienstes besteht aus Erweiterungen der SQL-92 SELECT-Anweisung und den Klauseln FROM und WHERE. Die Ergebnisse der Abfrage werden über OLE DB-Rowsets zurückgegeben, die von ADO verwendet und als Recordset-Objekte bearbeitet werden können.

Sie können nach bestimmten Wörtern oder Ausdrücken suchen sowie Platzhalter verwenden, um nach Wortmustern oder -stämmen zu suchen. Die Suchlogik kann auf booleschen Entscheidungen, der Gewichtung von Begriffen oder der Nähe zu anderen Wörtern basieren. Sie können jedoch auch nach "freiem Text" suchen; bei dieser Suche wird nach Übereinstimmungen basierend auf der Wortbedeutung statt nach dem exakten Wortlaut gesucht.

Der spezielle Befehlsdialekt ist in der Referenz zu Microsoft Indexdienst ausführlich dokumentiert.

Der Provider akzeptiert keine Aufrufe von gespeicherten Prozeduren oder einfache Tabellennamen (die CommandType-Eigenschaft ist z. B. immer adCmdText).

Verhalten des "Recordset"-Objekts

In der folgenden Tabelle sind die Features aufgeführt, die bei einem mit diesem Provider geöffneten Recordset-Objekt zur Verfügung stehen. Nur der statische Cursortyp (adOpenStatic) ist verfügbar.

Weitere Informationen zu dem Verhalten von Recordset-Objekten für Ihre Providerkonfiguration erhalten Sie, wenn Sie die Supports-Methode ausführen und die Properties-Auflistung des Recordset-Objekts angeben, um zu ermitteln, ob die providerspezifischen dynamischen Eigenschaften vorhanden sind.

Verfügbarkeit standardmäßiger Recordset-Eigenschaften von ADO:

Eigenschaft | Verfügbarkeit
AbsolutePage | Lesen/ Schreiben
AbsolutePosition | Lesen/ Schreiben
ActiveConnection | schreibgeschützt
BOF | schreibgeschützt
Bookmark* | Lesen/ Schreiben
CacheSize | Lesen/ Schreiben
CursorLocation | immer adUseServer
CursorType | immer adOpenStatic
EditMode | immer adEditNone
EOF | schreibgeschützt
Filter | Lesen/ Schreiben
LockType | Lesen/ Schreiben
MarshalOptions | nicht verfügbar
MaxRecords | Lesen/ Schreiben
PageCount | schreibgeschützt
PageSize | Lesen/ Schreiben
RecordCount | schreibgeschützt
Source | Lesen/ Schreiben
State | schreibgeschützt
Status | schreibgeschützt

*Beim Provider müssen Lesezeichen aktiviert sein, damit dieses Feature im Recordset-Objekt vorhanden ist.

Verfügbarkeit standardmäßiger Recordset-Methoden von ADO:

Methode | Verfügbar?
AddNew | Nein
Cancel | Ja
CancelBatch | Nein
CancelUpdate | Nein
Clone | Ja
Close | Ja
Delete | Nein
GetRows | Ja
Move | Ja
MoveFirst | Ja
NextRecordset | Ja
Open | Ja
Requery | Ja
Resync | Ja
Supports | Ja
Update | Nein
UpdateBatch | Nein

Siehe auch Ausführliche Informationen für spezielle Implementierungen sowie funktionale Informationen zum Microsoft OLE DB-Provider für Microsoft Indexing Service entnehmen Sie der Microsoft OLE DB Programmer's Reference und der Dokumentation zu Microsoft Indexdienst, oder besuchen Sie die Microsoft Internet-Informationsdienste-Webseite.


Microsoft OLE DB-Provider für Microsoft Active Directory Service

Mit dem Provider von Microsoft Active Directory Service Interfaces (ADSI) kann ADO über ADSI eine Verbindung zu heterogenen Verzeichnisdiensten herstellen. Dadurch haben ADO-Anwendungen schreibgeschützten Zugriff auf die Verzeichnisdienste von Microsoft Windows NT® 4.0 und Microsoft Windows 2000 sowie auf alle LDAP-kompatiblen Verzeichnisdienste und Novell Directory Services. ADSI basiert auf einem Providermodell. Wenn der Zugriff auf ein anderes Verzeichnis also über einen neuen Provider verfügbar ist, kann die ADO-Anwendung problemlos darauf zugreifen. Der ADSI-Provider ist freethreaded, und Unicode ist aktiviert.

Parameter der Verbindungszeichenfolge

Wenn Sie eine Verbindung zu diesem Provider herstellen möchten, müssen Sie das Provider-Argument der ConnectionString-Eigenschaft folgendermaßen festlegen:

ADSDSOObject

Beim Lesen der Provider-Eigenschaft wird diese Zeichenfolge ebenfalls zurückgegeben.

Typische Verbindungszeichenfolgen

Dies ist eine typische Verbindungszeichenfolge für diesen Provider:

"Provider=ADSDSOObject;User ID=userName;Password=userPassword;"

Dabei werden die folgenden Schlüsselwörter verwendet:

Schlüsselwort | Beschreibung
Provider | Gibt den Microsoft OLE DB-Provider für Microsoft Active Directory Service an.
User ID | Gibt den Benutzernamen an. Wenn Sie dieses Schlüsselwort nicht angeben, wird der aktuelle Benutzername verwendet.
Password | Gibt das Benutzerkennwort an. Wenn Sie dieses Schlüsselwort nicht angeben, wird der aktuelle Benutzername verwendet.

Befehlstext

Der Provider erkennt eine Befehlszeichenfolge aus vier Teilen in der folgenden Syntax:

"Root; Filter; Attributes[; Scope]"

Wert | Beschreibung
Root | Gibt das ADsPath-Objekt an, von dem aus die Suche gestartet wird (d. h. der Ursprung der Suche).
Filter | Gibt den Suchfilter im RFC 960-Format an.
Attributes | Gibt eine durch Kommas getrennte Liste von Attributen an, die zurückgegeben werden.
Scope Optional. Ein Wert vom Datentyp String, der den Umfang der Suche angibt. Die folgenden Werte sind zulässig:
  • Base - nur das Basisobjekt durchsuchen (Ursprung der Suche).

  • OneLevel – nur eine Ebene durchsuchen.

  • Subtree – die gesamte Teilstruktur durchsuchen.

Beispiel:

"<LDAP://DC=ArcadiaBay,DC=COM>;(objectClass=*);sn, givenName; subtree"

Der Provider unterstützt auch die SELECT-Anweisung von SQL für Befehlstext. Beispiel:

"SELECT title, telephoneNumber From 'LDAP://DC=Microsoft, DC=COM' WHERE objectClass='user' AND objectCategory='Person'"

Der Provider akzeptiert keine Aufrufe von gespeicherten Prozeduren oder einfache Tabellennamen (die CommandType-Eigenschaft ist z. B. immer adCmdText). Eine vollständige Beschreibung der Befehlstextelemente entnehmen Sie der Dokumentation zu Active Directory Service Interfaces.

Verhalten des "Recordset"-Objekts

In der folgenden Tabelle sind die Features aufgeführt, die bei einem mit diesem Provider geöffneten Recordset-Objekt zur Verfügung stehen. Nur der statische Cursortyp (adOpenStatic) ist verfügbar.

Weitere Informationen zu dem Verhalten von Recordset-Objekten für Ihre Providerkonfiguration erhalten Sie, wenn Sie die Supports-Methode ausführen und die Properties-Auflistung des Recordset-Objekts angeben, um zu ermitteln, ob die providerspezifischen dynamischen Eigenschaften vorhanden sind.

Verfügbarkeit standardmäßiger Recordset-Eigenschaften von ADO:

Eigenschaft | Verfügbarkeit
AbsolutePage | Lesen/ Schreiben
AbsolutePosition | Lesen/ Schreiben
ActiveConnection | schreibgeschützt
BOF | schreibgeschützt
Bookmark | Lesen/ Schreiben
CacheSize | Lesen/ Schreiben
CursorLocation | immer adUseServer
CursorType | immer adOpenStatic
EditMode | immer adEditNone
EOF | schreibgeschützt
Filter | Lesen/ Schreiben
LockType | Lesen/ Schreiben
MarshalOptions | nicht verfügbar
MaxRecords | Lesen/ Schreiben
PageCount | schreibgeschützt
PageSize | Lesen/ Schreiben
RecordCount | schreibgeschützt
Source | Lesen/ Schreiben
State | schreibgeschützt
Status | schreibgeschützt

Verfügbarkeit standardmäßiger Recordset-Methoden von ADO:

Methode | Verfügbar?
AddNew | Nein
Cancel | Nein
CancelBatch | Nein
CancelUpdate | Nein
Clone | Ja
Close | Ja
Delete | Nein
GetRows | Ja
Move | Ja
MoveFirst | Ja
MoveLast | Ja
MoveNext | Ja
MovePrevious | Ja
NextRecordset | Ja
Open | Ja
Requery | Ja
Resync | Ja
Supports | Ja
Update | Nein
UpdateBatch | Nein

Siehe auch Allgemeine Informationen zu ADSI und die speziellen Eigenschaften dieses Providers entnehmen Sie der Active Directory Service Interfaces-Dokumentation, oder besuchen Sie die ADSI-Webseite.


OLE DB-Provider für Microsoft Jet

Mit dem OLE DB-Provider für Microsoft Jet kann ADO auf Microsoft Jet-Datenbanken zugreifen.

Parameter der Verbindungszeichenfolge

Wenn Sie eine Verbindung zu diesem Provider herstellen möchten, müssen Sie das Provider-Argument der ConnectionString-Eigenschaft folgendermaßen festlegen:

Microsoft.Jet.OLEDB.4.0

Beim Lesen der Provider-Eigenschaft wird diese Zeichenfolge ebenfalls zurückgegeben.

Typische Verbindungszeichenfolgen

Dies ist eine typische Verbindungszeichenfolge für diesen Provider:

"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=databaseName;User ID=userName;Password=userPassword;"

Dabei werden die folgenden Schlüsselwörter verwendet:

Schlüsselwort | Beschreibung
Provider | Gibt den OLE DB-Provider für Microsoft Jet an.
Data Source | Gibt den Datenbankpfad und den Dateinamen an (z. B. c:\Northwind.mdb).
User ID | Gibt den Benutzernamen an. Wenn Sie dieses Schlüsselwort nicht angeben, wird standardmäßig die Zeichenfolge "admin" verwendet.
Password | Gibt das Benutzerkennwort an. Wenn Sie dieses Schlüsselwort nicht angeben, wird eine leere Zeichenfolge ("") verwendet.

Providerspezifische Verbindungsparameter

Der OLE DB-Provider für Microsoft Jet unterstützt verschiedene providerspezifische dynamische Eigenschaften zusätzlich zu den von ADO definierten Eigenschaften. Wie alle anderen Connection-Parameter können auch diese über die Properties-Auflistung eines Connection-Objekts oder als Teil einer Verbindungszeichenfolge festgelegt werden.

In der folgenden Tabelle sind die Eigenschaften mit den Namen der entsprechenden OLE DB-Eigenschaften in Klammern aufgeführt.

Parameter | Beschreibung
Jet OLEDB:Compact Reclaimed Space Amount (DBPROP_JETOLEDB_COMPACTFREESPACESIZE) | Gibt eine Schätzung des Speicherplatzes in Byte an, der durch die Komprimierung der Datenbank frei wird. Dieser Wert ist nur zulässig, wenn eine Datenbankverbindung hergestellt wurde.
Jet OLEDB:Connection Control (DBPROP_JETOLEDB_CONNECTIONCONTROL) | Gibt an, ob Benutzer eine Verbindung zur Datenbank herstellen können.
Jet OLEDB:Create System Database (DBPROP_JETOLEDB_CREATESYSTEMDATABASE) | Gibt an, ob beim Erstellen einer neuen Datenquelle eine Systemdatenbank erstellt werden soll.
Jet OLEDB:Database Locking Mode (DBPROP_JETOLEDB_DATABASELOCKMODE) | Gibt den Sperrmodus für diese Datenbank an. Der erste Benutzer, der die Datenbank öffnet, bestimmt den Modus, der für die geöffnete Datenbank verwendet wird.
Jet OLEDB:Database Password (DBPROP_JETOLEDB_DATABASEPASSWORD) | Gibt das Kennwort für die Datenbank an.
Jet OLEDB:Don't Copy Locale on Compact (DBPROP_JETOLEDB_COMPACT_DONTCOPYLOCALE) | Gibt an, ob Microsoft Jet bei der Komprimierung einer Datenbank Gebietsschemainformationen kopieren soll.
Jet OLEDB:Encrypt Database (DBPROP_JETOLEDB_ENCRYPTDATABASE) | Gibt an, ob eine komprimierte Datenbank verschlüsselt werden soll. Wenn Sie diese Eigenschaft nicht festlegen, wird die komprimierte Datenbank verschlüsselt, falls die ursprüngliche Datenbank ebenfalls verschlüsselt war.
Jet OLEDB:Engine Type (DBPROP_JETOLEDB_ENGINE) | Gibt an, welches Speichermodul für den Zugriff auf den aktuellen Datenspeicher verwendet wird.
Jet OLEDB:Exclusive Async Delay (DBPROP_JETOLEDB_EXCLUSIVEASYNCDELAY) | Gibt in Millisekunden an, wie lange Microsoft Jet asynchrone Schreibvorgänge auf die Festplatte maximal verzögern kann, wenn die Datenbank exklusiv geöffnet ist. Diese Eigenschaft wird nur berücksichtigt, wenn Jet OLEDB:Flush Transaction Timeout auf 0 festgelegt ist.
Jet OLEDB:Flush Transaction Timeout (DBPROP_JETOLEDB_FLUSHTRANSACTIONTIMEOUT) | Gibt an, wie lange gewartet werden soll, bis Daten, die für asynchrone Schreibvorgänge in einem Cache gespeichert sind, auf die Festplatte geschrieben werden. Diese Einstellung setzt die Werte für Jet OLEDB:Shared Async Delay und Jet OLEDB:Exclusive Async Delay außer Kraft.
Jet OLEDB:Global Bulk Transactions (DBPROP_JETOLEDB_GLOBALBULKNOTRANSACTIONS) | Gibt an, ob SQL-Sammeltransaktionen ausgeführt werden.
Jet OLEDB:Global Partial Bulk Ops (DBPROP_JETOLEDB_GLOBALBULKPARTIAL) | Gibt das Kennwort zum Öffnen der Datenbank an.
Jet OLEDB:Implicit Commit Sync (DBPROP_JETOLEDB_IMPLICITCOMMITSYNC) | Gibt an, ob Änderungen an internen impliziten Transaktionen im synchronen oder asynchronen Modus geschrieben werden.
Jet OLEDB:Lock Delay (DBPROP_JETOLEDB_LOCKDELAY) | Gibt in Millisekunden an, wie lange nach einem zuvor fehlgeschlagenen Versuch gewartet werden soll, bis eine Sperre aktiviert wird.
Jet OLEDB:Lock Retry (DBPROP_JETOLEDB_LOCKRETRY) | Gibt an, wie oft versucht werden soll, auf eine gesperrte Seite zuzugreifen.
Jet OLEDB:Max Buffer Size (DBPROP_JETOLEDB_MAXBUFFERSIZE) | Gibt in KB an, wie viel Arbeitsspeicher Microsoft Jet verwenden kann, bevor Änderungen auf die Festplatte ausgelagert werden.
Jet OLEDB:Max Locks Per File (DBPROP_JETOLEDB_MAXLOCKSPERFILE) | Gibt an, wie viele Sperren Microsoft Jet maximal für eine Datenbank verwenden kann. Der Standardwert ist 9500.
Jet OLEDB:New Database Password (DBPROP_JETOLEDB_NEWDATABASEPASSWORD) | Gibt das neue Kennwort an, das für diese Datenbank festgelegt werden soll. Das alte Kennwort wird in Jet OLEDB:Database Password gespeichert.
Jet OLEDB:ODBC Command Time Out (DBPROP_JETOLEDB_ODBCCOMMANDTIMEOUT) | Gibt an, nach wie vielen Millisekunden für eine Remote-ODBC-Abfrage von Microsoft Jet ein Timeout eintritt.
Jet OLEDB:Page Locks to Table Lock (DBPROP_JETOLEDB_PAGELOCKSTOTABLELOCK) | Gibt an, nach wie vielen gesperrten Seiten in einer Transaktion Microsoft Jet versucht, die Sperre in eine Tabellensperre heraufzustufen. Mit dem Wert 0 wird die Sperre niemals heraufgestuft.
Jet OLEDB:Page Timeout (DBPROP_JETOLEDB_PAGETIMEOUT) | Gibt in Millisekunden an, wie lange Microsoft Jet wartet, bevor überprüft wird, ob der Cache nicht mehr mit der Datenbankdatei übereinstimmt.
Jet OLEDB:Recycle Long-Valued Pages (DBPROP_JETOLEDB_RECYCLELONGVALUEPAGES) | Gibt an, ob Microsoft Jet aggressiv versuchen soll, frei gewordene BLOB-Seiten zurückzufordern.
Jet OLEDB:Registry Path (DBPROP_JETOLEDB_REGPATH) | Gibt den Schlüssel in der Windows-Registrierung an, der Werte für das Microsoft Jet-Datenbankmodul enthält.
Jet OLEDB:Reset ISAM Stats (DBPROP_JETOLEDB_RESETISAMSTATS) | Gibt an, ob das Recordset-Schema DBSCHEMA_JETOLEDB_ISAMSTATS die Leistungsindikatoren zurücksetzen sollte, nachdem Leistungsinformationen zurückgegeben wurden.
Jet OLEDB:Shared Async Delay (DBPROP_JETOLEDB_SHAREDASYNCDELAY) | Gibt in Millisekunden an, wie lange Microsoft Jet asynchrone Schreibvorgänge auf die Festplatte maximal verzögern kann, wenn die Datenbank im Mehrbenutzermodus geöffnet ist.
Jet OLEDB:System Database (DBPROP_JETOLEDB_SYSDBPATH) | Gibt den Pfad und den Dateinamen für die Arbeitsgruppeninformationsdatei (Systemdatenbank) an.
Jet OLEDB:Transaction Commit Mode (DBPROP_JETOLEDB_TXNCOMMITMODE) | Gibt an, ob Microsoft Jet Daten synchron oder asynchron auf die Festplatte schreibt, wenn ein Commit für eine Transaktion ausgeführt wird.
Jet OLEDB:User Commit Sync (DBPROP_JETOLEDB_USERCOMMITSYNC) | Gibt an, ob Änderungen an Transaktionen im synchronen oder asynchronen Modus geschrieben werden.

Providerspezifische "Recordset"- und Befehlseigenschaften

Der Microsoft Jet-Provider unterstützt auch mehrere providerspezifische Recordset- und Command-Eigenschaften. Diese Eigenschaften werden über die Properties-Auflistung der Objekte Recordset oder Command aufgerufen und festgelegt. In der folgenden Tabelle sind die ADO-Eigenschaftennamen mit dem entsprechenden OLE DB-Eigenschaftennamen in Klammern aufgeführt.

Name der Eigenschaft | Beschreibung
Jet OLEDB:Bulk Transactions (DBPROP_JETOLEDB_BULKNOTRANSACTIONS) | Gibt an, ob SQL-Sammeloperationen ausgeführt werden. Umfangreiche Sammeloperationen können aufgrund von Ressourcenverzögerungen fehlschlagen.
Jet OLEDB:Enable Fat Cursors (DBPROP_JETOLEDB_ENABLEFATCURSOR) | Gibt an, ob Microsoft Jet mehrere Zeilen zwischenspeichern soll, wenn ein Recordset für Remotezeilenquellen aufgefüllt wird.
Jet OLEDB:Fat Cursor Cache Size (DBPROP_JETOLEDB_FATCURSORMAXROWS) | Gibt an, wie viele Zeilen zwischengespeichert werden sollen, wenn die Zwischenspeicherung für Zeilen aus Remotedatenspeichern verwendet wird. Dieser wird nur berücksichtigt, wenn Jet OLEDB:Enable Fat Cursors gleich True ist.
Jet OLEDB:Inconsistent (DBPROP_JETOLEDB_INCONSISTENT) | Gibt an, ob Abfrageergebnisse inkonsistente Aktualisierungen zulassen.
Jet OLEDB:Locking Granularity (DBPROP_JETOLEDB_LOCKGRANULARITY) | Gibt an, ob eine Tabelle mit einer Sperre auf Zeilenebene geöffnet wird.
Jet OLEDB:ODBC Pass-Through Statement (DBPROP_JETOLEDB_ODBCPASSTHROUGH) | Gibt an, dass Microsoft Jet den SQL-Text in einem Command-Objekt unverändert an das Back-End zurückgeben soll.
Jet OLEDB:Partial Bulk Ops (DBPROP_JETOLEDB_BULKPARTIAL) | Bestimmt das Verhalten von Microsoft Jet, wenn SQL DML-Operationen fehlschlagen.
Jet OLEDB:Pass Through Query Bulk-Op (DBPROP_JETOLEDB_PASSTHROUGHBULKOP) | Gibt an, ob Abfragen, die kein Recordset zurückgeben, unverändert an die Datenquelle übergeben werden.
Jet OLEDB:Pass Through Query Connect String (DBPROP_JETOLEDB_ODBCPASSTHROUGHCONNECTSTRING) | Gibt die Microsoft Jet-Verbindungszeichenfolge an, die für die Verbindung zu einem Remotedatenspeicher verwendet wird. Dieser Wert wird nur berücksichtigt, wenn Jet OLEDB:ODBC Pass-Through Statement gleich True ist.
Jet OLEDB:Stored Query (DBPROP_JETOLEDB_STOREDQUERY) | Gibt an, ob der Befehlstext nicht als SQL-Befehl, sondern als gespeicherte Abfrage gedeutet werden soll.
Jet OLEDB:Validate Rules On Set (DBPROP_JETOLEDB_VALIDATEONSET) | Gibt an, ob die Gültigkeitsregeln von Mircrosoft Jet ausgewertet werden, wenn Spaltendaten festgelegt werden oder wenn für die Änderungen ein Commit in der Datenbank ausgeführt wird.

Standardmäßig öffnet der OLE DB-Provider für Microsoft Jet die Microsoft Jet-Datenbanken im Lesen/Schreiben-Modus. Wenn Sie die Datenbank im schreibgeschützten Modus öffnen möchten, müssen Sie die Mode-Eigenschaft des Connection-Objekts von ADO auf adModeRead festlegen.

Verwenden des "Command"-Objekts

Der Befehlstext im Command-Objekt verwendet den Microsoft Jet SQL-Befehlsdialekt. Sie können im Befehlstext Abfragen, die Zeilen zurückgeben, Aktionsabfragen und Tabellennamen angeben. Gespeicherte Prozeduren werden jedoch nicht unterstützt und sollten daher nicht angegeben werden.

Verhalten des "Recordset"-Objekts

Das Microsoft Jet-Datenbankmodul unterstützt keine dynamischen Cursor. Aus diesem Grund unterstützt der OLE DB-Provider für Microsoft Jet den Cursortyp adLockDynamic nicht. Wird ein dynamischer Cursor angefordert, gibt der Provider einen Cursor vom Typ Keyset zurück und setzt die CursorType-Eigenschaft neu, um den Typ des zurückgegebenen Recordset-Objekts anzuzeigen. Wird darüber hinaus ein aktualisierbares Recordset-Objekt angefordert (LockType ist adLockOptimistic, adLockBatchOptimistic oder adLockPessimistic), gibt der Provider ebenfalls einen Cursor des Typs Keyset zurück und setzt die CursorType-Eigenschaft neu.

Dynamische Eigenschaften

Der OLE DB-Provider für Microsoft Jet fügt der Properties-Auflistung der ungeöffneten Objekte Connection, Recordset und Command mehrere dynamische Eigenschaften hinzu.

Die folgenden Tabellen stellen einen Index der ADO- und OLE DB-Namen für die dynamischen Eigenschaften dar. Die OLE DB Programmer's Reference verweist mit dem Begriff "Beschreibung" auf Namen von ADO-Eigenschaften. Weitere Informationen zu diesen Eigenschaften finden Sie in der OLE DB Programmer's Reference. Suchen Sie im Index nach dem Namen der OLE DB-Eigenschaft, oder lesen Sie Anhang C: OLE DB-Eigenschaften.

Dynamische Verbindungseigenschaften

Die folgenden Eigenschaften werden zu der Properties-Auflistung des Connection-Objekts hinzugefügt.

ADO-Eigenschaftenname | OLE DB-Eigenschaftenname
Active Sessions | DBPROP_ACTIVESESSIONS
Asynchable Abort | DBPROP_ASYNCTXNABORT
Asynchable Commit | DBPROP_ASYNCTNXCOMMIT
Autocommit Isolation Levels | DBPROP_SESS_AUTOCOMMITISOLEVELS
Catalog Location | DBPROP_CATALOGLOCATION
Catalog Term | DBPROP_CATALOGTERM
Column Definition | DBPROP_COLUMNDEFINITION
Current Catalog | DBPROP_CURRENTCATALOG
Data Source | DBPROP_INIT_DATASOURCE
Data Source Name | DBPROP_DATASOURCENAME
Data Source Object Threading Model | DBPROP_DSOTHREADMODEL
DBMS Name | DBPROP_DBMSNAME
DBMS Version | DBPROP_DBMSVER
GROUP BY Support | DBPROP_GROUPBY
Heterogeneous Table Support | DBPROP_HETEROGENEOUSTABLES
Identifier Case Sensitivity | DBPROP_IDENTIFIERCASE
Isolation Levels | DBPROP_SUPPORTEDTXNISOLEVELS
Isolation Retention | DBPROP_SUPPORTEDTXNISORETAIN
Locale Identifier | DBPROP_INIT_LCID
Maximum Index Size | DBPROP_MAXINDEXSIZE
Maximum Row Size | DBPROP_MAXROWSIZE
Maximum Row Size Includes BLOB | DBPROP_MAXROWSIZEINCLUDESBLOB
Maximum Tables in SELECT | DBPROP_MAXTABLESINSELECT
Mode | DBPROP_INIT_MODE
Multiple Parameter Sets | DBPROP_MULTIPLEPARAMSETS
Multiple Results | DBPROP_MULTIPLERESULTS
Multiple Storage Objects | DBPROP_MULTIPLESTORAGEOBJECTS
Multi-Table Update | DBPROP_MULTITABLEUPDATE
NULL Collation Order | DBPROP_NULLCOLLATION
NULL Concatenation Behavior | DBPROP_CONCATNULLBEHAVIOR
OLE DB Version | DBPROP_PROVIDEROLEDBVER
OLE Object Support | DBPROP_OLEOBJECTS
Open Rowset Support | DBPROP_OPENROWSETSUPPORT
ORDER BY Columns in Select List | DBPROP_ORDERBYCOLUMNSINSELECT
Output Parameter Availability | DBPROP_OUTPUTPARAMETERAVAILABILITY
Pass By Ref Accessors | DBPROP_BYREFACCESSORS
Password | DBPROP_AUTH_PASSWORD
Persistent ID Type | DBPROP_PERSISTENTIDTYPE
Prepare Abort Behavior | DBPROP_PREPAREABORTBEHAVIOR
Prepare Commit Behavior | DBPROP_PREPARECOMMITBEHAVIOR
Procedure Term | DBPROP_PROCEDURETERM
Prompt | DBPROP_INIT_PROMPT
Provider Friendly Name | DBPROP_PROVIDERFRIENDLYNAME
Provider Name | DBPROP_PROVIDERFILENAME
Provider Version | DBPROP_PROVIDERVER
Read-Only Data Source | DBPROP_DATASOURCEREADONLY
Rowset Conversions on Command | DBPROP_ROWSETCONVERSIONSONCOMMAND
Schema Term | DBPROP_SCHEMATERM
Schema Usage | DBPROP_SCHEMAUSAGE
SQL Support | DBPROP_SQLSUPPORT
Structured Storage | DBPROP_STRUCTUREDSTORAGE
Subquery Support | DBPROP_SUBQUERIES
Table Term | DBPROP_TABLETERM
Transaction DDL | DBPROP_SUPPORTEDTXNDDL
User ID | DBPROP_AUTH_USERID
User Name | DBPROP_USERNAME
Window Handle | DBPROP_INIT_HWND

Dynamische "Recordset"-Eigenschaften

Die folgenden Eigenschaften werden zu der Properties-Auflistung des Recordset-Objekts hinzugefügt.

ADO-Eigenschaftenname | OLE DB-Eigenschaftenname
Access Order | DBPROP_ACCESSORDER
Append-Only Rowset | DBPROP_APPENDONLY
Blocking Storage Objects | DBPROP_BLOCKINGSTORAGEOBJECTS
Bookmark Type | DBPROP_BOOKMARKTYPE
Bookmarkable | DBPROP_IROWSETLOCATE
Bookmarks Ordered | DBPROP_ORDEREDBOOKMARKS
Cache Deferred Columns | DBPROP_CACHEDEFERRED
Change Inserted Rows | DBPROP_CHANGEINSERTEDROWS
Column Privileges | DBPROP_COLUMNRESTRICT
Column Set Notification | DBPROP_NOTIFYCOLUMNSET
Column Writable | DBPROP_MAYWRITECOLUMN
Defer Column | DBPROP_DEFERRED
Delay Storage Object Updates | DBPROP_DELAYSTORAGEOBJECTS
Fetch Backwards | DBPROP_CANFETCHBACKWARDS
Hold Rows | DBPROP_CANHOLDROWS
IAccessor | DBPROP_Iaccessor
IColumnsInfo | DBPROP_IcolumnsInfo
IColumnsRowset | DBPROP_IcolumnsRowset
IConnectionPointContainer | DBPROP_IconnectionPointContainer
IConvertType | DBPROP_IconvertType
ILockBytes | DBPROP_IlockBytes
Immobile Rows | DBPROP_IMMOBILEROWS
IRowset | DBPROP_Irowset
IRowsetChange | DBPROP_IrowsetChange
IRowsetIdentity | DBPROP_IrowsetIdentity
IRowsetIndex | DBPROP_IrowsetIndex
IRowsetInfo | DBPROP_IrowsetInfo
IRowsetLocate | DBPROP_IrowsestLocate
IRowsetResynch |
IRowsetScroll | DBPROP_IrowsetScroll
IRowsetUpdate | DBPROP_IrowsetUpdate
ISequentialStream | DBPROP_IsequentialStream
IStorage | DBPROP_Istorage
IStream | DBPROP_Istream
ISupportErrorInfo | DBPROP_IsupportErrorInfo
Literal Bookmarks | DBPROP_LITERALBOOKMARKS
Literal Row Identity | DBPROP_LITERALIDENTITY
Maximum Open Rows | DBPROP_MAXOPENROWS
Maximum Pending Rows | DBPROP_MAXPENDINGROWS
Maximum Rows | DBPROP_MAXROWS
Memory Usage | DBPROP_MEMORYUSAGE
Notification Granularity | DBPROP_NOTIFICATIONGRANULARITY
Notification Phases | DBPROP_NOTIFICATIONPHASES
Objects Transacted | DBPROP_TRANSACTEDOBJECT
Others' Changes Visible | DBPROP_OTHERUPDATEDELETE
Others' Inserts Visible | DBPROP_OTHERINSERT
Own Changes Visible | DBPROP_OWNUPDATEDELETE
Own Inserts Visible | DBPROP_OWNINSERT
Preserve on Abort | DBPROP_ABORTPRESERVE
Preserve on Commit | DBPROP_COMMITPRESERVE
Quick Restart | DBPROP_QUICKRESTART
Reentrant Events | DBPROP_REENTRANTEVENTS
Remove Deleted Rows | DBPROP_REMOVEDELETED
Report Multiple Changes | DBPROP_REPORTMULTIPLECHANGES
Return Pending Inserts | DBPROP_RETURNPENDINGINSERTS
Row Delete Notification | DBPROP_NOTIFYROWDELETE
Row First Change Notification | DBPROP_NOTIFYROWFIRSTCHANGE
Row Insert Notification | DBPROP_NOTIFYROWINSERT
Row Privileges | DBPROP_ROWRESTRICT
Row Resynchronization Notification | DBPROP_NOTIFYROWRESYNCH
Row Threading Model | DBPROP_ROWTHREADMODEL
Row Undo Change Notification | DBPROP_NOTIFYROWUNDOCHANGE
Row Undo Delete Notification | DBPROP_NOTIFYROWUNDODELETE
Row Undo Insert Notification | DBPROP_NOTIFYROWUNDOINSERT
Row Update Notification | DBPROP_NOTIFYROWUPDATE
Rowset Fetch Position Change Notification | DBPROP_NOTIFYROWSETFETCHPOSISIONCHANGE
Rowset Release Notification | DBPROP_NOTIFYROWSETRELEASE
Scroll Backwards | DBPROP_CANSCROLLBACKWARDS
Skip Deleted Bookmarks | DBPROP_BOOKMARKSKIPPED
Strong Row Identity | DBPROP_STRONGITDENTITY
Updatability | DBPROP_UPDATABILITY
Use Bookmarks | DBPROP_BOOKMARKS

Dynamische Befehlseigenschaften

Die folgenden Eigenschaften werden zu der Properties-Auflistung des Command-Objekts hinzugefügt.

ADO-Eigenschaftenname | OLE DB-Eigenschaftenname
Access Order | DBPROP_ACCESSORDER
Append-Only Rowset | DBPROP_APPENDONLY
Blocking Storage Objects | DBPROP_BLOCKINGSTORAGEOBJECTS
Bookmark Type | DBPROP_BOOKMARKTYPE
Bookmarkable | DBPROP_IROWSETLOCATE
Change Inserted Rows | DBPROP_CHANGEINSERTEDROWS
Column Privileges | DBPROP_COLUMNRESTRICT
Column Set Notification | DBPROP_NOTIFYCOLUMNSET
Defer Column | DBPROP_DEFERRED
Delay Storage Object Updates | DBPROP_DELAYSTORAGEOBJECTS
Fetch Backwards | DBPROP_CANFETCHBACKWARDS
Hold Rows | DBPROP_CANHOLDROWS
IAccessor | DBPROP_Iaccessor
IColumnsInfo | DBPROP_IcolumnsInfo
IColumnsRowset | DBPROP_IcolumnsRowset
IConnectionPointContainer | DBPROP_IconnectionPointContainer
IConvertType | DBPROP_IconvertType
ILockBytes | DBPROP_IlockBytes
Immobile Rows | DBPROP_IMMOBILEROWS
IRowset | DBPROP_Irowset
IRowsetChange | DBPROP_IrowsetChange
IRowsetIdentity | DBPROP_IrowsetIdentity
IRowsetIndex | DBPROP_IrowsetIndex
IRowsetInfo | DBPROP_IrowsetInfo
IRowsetLocate | DBPROP_IrowsetLocate
IRowsetResynch |
IRowsetScroll | DBPROP_IrowsetScroll
IRowsetUpdate | DBPROP_IrowsetUpdate
ISequentialStream | DBPROP_IsequentialStream
IStorage | DBPROP_Istorage
IStream | DBPROP_Istream
ISupportErrorInfo | DBPROP_IsupportErrorInfo
Literal Bookmarks | DBPROP_LITERALBOOKMARKS
Literal Row Identity | DBPROP_LITERALIDENTITY
Lock Mode | DBPROP_LOCKMODE
Maximum Open Rows | DBPROP_MAXOPENROWS
Maximum Pending Rows | DBPROP_MAXPENDINGROWS
Maximum Rows | DBPROP_MAXROWS
Notification Granularity | DBPROP_NOTIFICATIONGRANULARITY
Notification Phases | DBPROP_NOTIFICATIONPHASES
Objects Transacted | DBPROP_TRANSACTEDOBJECT
Others' Changes Visible | DBPROP_OTHERUPDATEDELETE
Others' Inserts Visible | DBPROP_OTHERINSERT
Own Changes Visible | DBPROP_OWNUPDATEDELETE
Own Inserts Visible | DBPROP_OWNINSERT
Preserve on Abort | DBPROP_ABORTPRESERVE
Preserve on Commit | DBPROP_COMMITPRESERVE
Quick Restart | DBPROP_QUICKRESTART
Reentrant Events | DBPROP_REENTRANTEVENTS
Remove Deleted Rows | DBPROP_REMOVEDELETED
Report Multiple Changes | DBPROP_REPORTMULTIPLECHANGES
Return Pending Inserts | DBPROP_RETURNPENDINGINSERTS
Row Delete Notification | DBPROP_NOTIFYROWDELETE
Row First Change Notification | DBPROP_NOTIFYROWFIRSTCHANGE
Row Insert Notification | DBPROP_NOTIFYROWINSERT
Row Privileges | DBPROP_ROWRESTRICT
Row Resynchronization Notification | DBPROP_NOTIFYROWRESYNCH
Row Threading Model | DBPROP_ROWTHREADMODEL
Row Undo Change Notification | DBPROP_NOTIFYROWUNDOCHANGE
Row Undo Delete Notification | DBPROP_NOTIFYROWUNDODELETE
Row Undo Insert Notification | DBPROP_NOTIFYROWUNDOINSERT
Row Update Notification | DBPROP_NOTIFYROWUPDATE
Rowset Fetch Position Change Notification | DBPROP_NOTIFYROWSETFETCHPOSITIONCHANGE
Rowset Release Notification | DBPROP_NOTIFYROWSETRELEASE
Scroll Backwards | DBPROP_CANSCROLLBACKWARDS
Server Data on Insert | DBPROP_SERVERDATAONINSERT
Skip Deleted Bookmarks | DBPROP_BOOKMARKSKIP
Strong Row Identity | DBPROP_STRONGIDENTITY
Updatability | DBPROP_UPDATABILITY
Use Bookmarks | DBPROP_BOOKMARKS

Siehe auch Ausführliche Informationen für spezielle Implementierungen sowie funktionale Informationen zum OLE DB-Provider für Microsoft Jet entnehmen Sie der Dokumentation zu OLE DB-Provider für Microsoft Jet im MDAC SDK.


Microsoft OLE DB-Provider für SQL Server

Der Microsoft OLE DB-Provider für SQL Server, SQLOLEDB, ermöglicht ADO den Zugriff auf Microsoft SQL Server.

Parameter der Verbindungszeichenfolge

Wenn Sie eine Verbindung zu diesem Provider herstellen möchten, müssen Sie das Provider-Argument für die ConnectionString-Eigenschaft folgendermaßen festlegen:

SQLOLEDB

Dieser Wert kann auch festgelegt oder gelesen werden, indem Sie die Provider-Eigenschaft verwenden.

Typische Verbindungszeichenfolgen

Dies ist eine typische Verbindungszeichenfolge für diesen Provider:

"Provider=SQLOLEDB;Data Source=serverName;Initial Catalog=databaseName; User ID=userName;Password=userPassword;"

Dabei werden die folgenden Schlüsselwörter verwendet:

Schlüsselwort | Beschreibung
Provider | Gibt den Microsoft OLE DB-Provider für SQL Server an.
Data Source oder Server | Gibt den Namen eines Servers an.
Initial Catalog oder Database | Gibt den Namen einer Datenbank auf dem Server an.
User ID oder uid | Gibt den Benutzernamen an (für die SQL Server-Authentifizierung).
Password oder pwd | Gibt das Benutzerkennwort an (für die SQL Server-Authentifizierung).

Providerspezifische Verbindungsparameter

Der Provider unterstützt verschiedene providerspezifische Verbindungsparameter zusätzlich zu den von ADO definierten Verbindungsparametern. Wie die ADO-Verbindungseigenschaften können auch diese providerspezifischen Eigenschaften über die Properties-Auflistung eines Connection-Objekts oder als Teil einer Verbindungszeichenfolge festgelegt werden.

Parameter | Beschreibung
Trusted_Connection | Gibt den Benutzerauthentifizierungsmodus an. Mögliche Werte sind Yes und No. Der Standardwert ist No. Wird diese Eigenschaft auf Yes festgelegt, verwendet SQLOLEDB den Microsoft Windows NT-Authentifizierungsmodus, um den Benutzerzugriff auf die SQL Server-Datenbank zu gewähren, die durch die Location- und Datasource-Eigenschaftswerte angegeben ist. Wird diese Eigenschaft auf Nein festgelegt, verwendet SQLOLEDB den gemischten Modus, um den Benutzerzugriff auf die SQL Server-Datenbank zu gewähren. Die Anmeldung und das Kennwort für SQL Server werden in den Eigenschaften User Id und Password angegeben.
Current Language | Gibt einen Sprachennamen von SQL Server an. Dies ist die Sprache, die für die Auswahl und Formatierung von Systemmeldungen verwendet wird. Die Sprache muss auf dem Computer mit SQL Server installiert sein, ansonsten schlägt das Herstellen der Verbindung fehl.
Network Address | Gibt die Netzwerkadresse des Computers mit SQL Server an, die durch die Location-Eigenschaft angegeben ist.
Network Library | Gibt den Namen der Netzwerkbibliothek (DLL) an, die für den Datenaustausch mit einem Computer unter SQL Server verwendet wird. Der Name darf den Pfad oder die DLL-Dateinamenerweiterung nicht enthalten. Die Standardeinstellung ist durch die SQL Server-Clientkonfiguration vorgegeben.
Use Procedure for Prepare | Gibt an, ob SQL Server bei der Vorbereitung von Befehlen (mit der Prepared-Eigenschaft) temporär gespeicherte Prozeduren erstellt.
Auto Translate | Gibt an, ob OEM/ANSI-Zeichen konvertiert werden. Diese Eigenschaft kann auf True oder False festgelegt werden. Der Standardwert ist True. Wird diese Eigenschaft auf True festgelegt, führt SQLOLEDB die OEM/ANSI-Zeichenkonvertierung durch, wenn Multibytezeichenfolgen vom SQL Server-Computer abgerufen oder an ihn geschickt werden. Wird diese Eigenschaft auf False festgelegt, führt SQLOLEDB keine OEM/ANSI-Zeichenkonvertierung bei Multibytezeichenfolgen durch.
Packet Size | Gibt die Netzwerkpaketgröße in Byte an. Der Eigenschaftswert für die Paketgröße muss zwischen 512 und 32767 liegen. Die standardmäßige SQLOLEDB-Netzwerkpaketgröße ist 4096.
Application Name | Gibt den Namen der Clientanwendung an.
Workstation ID | Eine Zeichenfolge, die die Arbeitsstation bezeichnet.

Verwenden des "Command"-Objekts

SQLOLEDB akzeptiert eine Mischung aus ODBC, ANSI und einen spezifischen Transact-SQL von SQL Server als gültige Syntax. Die folgende SQL-Anweisung verwendet z. B. eine Escapesequenz von ODBC SQL, um die LCASE-Zeichenfolgenfunktion anzugeben:

SELECT customerid={fn LCASE(CustomerID)} FROM Customers

LCASE gibt eine Zeichenfolge zurück, in der alle Großbuchstaben entsprechend in Kleinbuchstaben konvertiert sind. Die ANSI SQL-Zeichenfolgenfunktion LOWER führt dieselbe Operation durch, so dass die folgende SQL-Anweisung die ANSI-Entsprechung der oben genannten ODBC-Anweisung darstellt:

SELECT customerid=LOWER(CustomerID) FROM Customers

SQLOLEDB verwendet beide Anweisungen erfolgreich, wenn sie als Text für einen Befehl angegeben sind.

Gespeicherte Prozeduren

Wenn Sie eine gespeicherte Prozedur in SQL Server mit einem SQLOLEDB-Befehl ausführen, verwenden Sie die Escapesequenz zum Aufrufen einer ODBC-Prozedur im Befehlstext. SQLOLEDB verwendet dann Remoteprozeduraufrufe für SQL Server, um die Verwendung des Befehls zu optimieren. Die folgende ODBC SQL-Anweisung beispielsweise wird als Befehlstext der Transact-SQL vorgezogen:

ODBC SQL

{call SalesByCategory('Produce', '1995')}

Transact-SQL

EXECUTE SalesByCategory 'Produce', '1995'

Verhalten des "Recordset"-Objekts

SQLOLEDB kann keine SQL Server-Cursor verwenden, um ein aus mehreren Rowsets bestehendes Ergebnis zu unterstützen, das durch mehrere Befehle erstellt wurde. Wenn ein Nutzer ein Recordset abruft, für das eine Unterstützung durch SQL Server-Cursor erforderlich ist, tritt ein Fehler auf, falls der verwendete Befehlstext mehr als einen einzelnen Datensatz als Ergebnis erzeugt.

Scrollfähige Recordsets von SQLOLEDB werden durch SQL Server-Cursor unterstützt. SQL Server erstellt Beschränkungen für Cursor, die auf Änderungen durch andere Benutzer der Datenbank reagieren. Im Besonderen können die Zeilen bei manchen Cursorn nicht sortiert werden, und wenn Sie versuchen, ein Recordset mit einem Befehl zu erstellen, der eine ORDER BY-Klausel von SQL enthält, schlägt dies möglicherweise fehl.

Dynamische Eigenschaften

Der Microsoft OLE DB-Provider für SQL Server fügt der Properties-Auflistung der ungeöffneten Objekte Connection, Recordset und Command mehrere dynamische Eigenschaften hinzu.

Die folgenden Tabellen stellen einen Index der ADO- und OLE DB-Namen für die dynamischen Eigenschaften dar. Die OLE DB Programmer's Reference verweist mit dem Begriff "Beschreibung" auf Namen von ADO-Eigenschaften. Weitere Informationen zu diesen Eigenschaften finden Sie in der OLE DB Programmer's Reference. Suchen Sie im Index nach dem Namen der OLE DB-Eigenschaft, oder lesen Sie Anhang C: OLE DB-Eigenschaften.

Dynamische Verbindungseigenschaften

Die folgenden Eigenschaften werden zu der Properties-Auflistung des Connection-Objekts hinzugefügt.

ADO-Eigenschaftenname | OLE DB-Eigenschaftenname
Active Sessions | DBPROP_ACTIVESESSIONS
Asynchable Abort | DBPROP_ASYNCTXNABORT
Asynchable Commit | DBPROP_ASYNCTNXCOMMIT
Autocommit Isolation Levels | DBPROP_SESS_AUTOCOMMITISOLEVELS
Catalog Location | DBPROP_CATALOGLOCATION
Catalog Term | DBPROP_CATALOGTERM
Column Definition | DBPROP_COLUMNDEFINITION
Connect Timeout | DBPROP_INIT_TIMEOUT
Current Catalog | DBPROP_CURRENTCATALOG
Data Source | DBPROP_INIT_DATASOURCE
Data Source Name | DBPROP_DATASOURCENAME
Data Source Object Threading Model | DBPROP_DSOTHREADMODEL
DBMS Name | DBPROP_DBMSNAME
DBMS Version | DBPROP_DBMSVER
Extended Properties | DBPROP_INIT_PROVIDERSTRING
GROUP BY Support | DBPROP_GROUPBY
Heterogeneous Table Support | DBPROP_HETEROGENEOUSTABLES
Identifier Case Sensitivity | DBPROP_IDENTIFIERCASE
Initial Catalog | DBPROP_INIT_CATALOG
Isolation Levels | DBPROP_SUPPORTEDTXNISOLEVELS
Isolation Retention | DBPROP_SUPPORTEDTXNISORETAIN
Locale Identifier | DBPROP_INIT_LCID
Maximum Index Size | DBPROP_MAXINDEXSIZE
Maximum Row Size | DBPROP_MAXROWSIZE
Maximum Row Size Includes BLOB | DBPROP_MAXROWSIZEINCLUDESBLOB
Maximum Tables in SELECT | DBPROP_MAXTABLESINSELECT
Multiple Parameter Sets | DBPROP_MULTIPLEPARAMSETS
Multiple Results | DBPROP_MULTIPLERESULTS
Multiple Storage Objects | DBPROP_MULTIPLESTORAGEOBJECTS
Multi-Table Update | DBPROP_MULTITABLEUPDATE
NULL Collation Order | DBPROP_NULLCOLLATION
NULL Concatenation Behavior | DBPROP_CONCATNULLBEHAVIOR
OLE DB Version | DBPROP_PROVIDEROLEDBVER
OLE Object Support | DBPROP_OLEOBJECTS
Open Rowset Support | DBPROP_OPENROWSETSUPPORT
ORDER BY Columns in Select List | DBPROP_ORDERBYCOLUMNSINSELECT
Output Parameter Availability | DBPROP_OUTPUTPARAMETERAVAILABILITY
Pass By Ref Accessors | DBPROP_BYREFACCESSORS
Password | DBPROP_AUTH_PASSWORD
Persist Security Info | DBPROP_AUTH_PERSIST_SENSITIVE_AUTHINFO
Persistent ID Type | DBPROP_PERSISTENTIDTYPE
Prepare Abort Behavior | DBPROP_PREPAREABORTBEHAVIOR
Prepare Commit Behavior | DBPROP_PREPARECOMMITBEHAVIOR
Procedure Term | DBPROP_PROCEDURETERM
Prompt | DBPROP_INIT_PROMPT
Provider Friendly Name | DBPROP_PROVIDERFRIENDLYNAME
Provider Name | DBPROP_PROVIDERFILENAME
Provider Version | DBPROP_PROVIDERVER
Read-Only Data Source | DBPROP_DATASOURCEREADONLY
Rowset Conversions on Command | DBPROP_ROWSETCONVERSIONSONCOMMAND
Schema Term | DBPROP_SCHEMATERM
Schema Usage | DBPROP_SCHEMAUSAGE
SQL Support | DBPROP_SQLSUPPORT
Structured Storage | DBPROP_STRUCTUREDSTORAGE
Subquery Support | DBPROP_SUBQUERIES
Table Term | DBPROP_TABLETERM
Transaction DDL | DBPROP_SUPPORTEDTXNDDL
User ID | DBPROP_AUTH_USERID
User Name | DBPROP_USERNAME
Window Handle | DBPROP_INIT_HWND

Dynamische "Recordset"-Eigenschaften

Die folgenden Eigenschaften werden zu der Properties-Auflistung des Recordset-Objekts hinzugefügt.

ADO-Eigenschaftenname | OLE DB-Eigenschaftenname
Access Order | DBPROP_ACCESSORDER
Blocking Storage Objects | DBPROP_BLOCKINGSTORAGEOBJECTS
Bookmark Type | DBPROP_BOOKMARKTYPE
Bookmarkable | DBPROP_IROWSETLOCATE
Change Inserted Rows | DBPROP_CHANGEINSERTEDROWS
Column Privileges | DBPROP_COLUMNRESTRICT
Column Set Notification | DBPROP_NOTIFYCOLUMNSET
Command Time Out | DBPROP_COMMANDTIMEOUT
Defer Column | DBPROP_DEFERRED
Delay Storage Object Updates | DBPROP_DELAYSTORAGEOBJECTS
Fetch Backwards | DBPROP_CANFETCHBACKWARDS
Hold Rows | DBPROP_CANHOLDROWS
IAccessor | DBPROP_Iaccessor
IColumnsInfo | DBPROP_IcolumnsInfo
IColumnsRowset | DBPROP_IcolumnsRowset
IConnectionPointContainer | DBPROP_IconnectionPointContainer
IConvertType | DBPROP_IconvertType
Immobile Rows | DBPROP_IMMOBILEROWS
IRowset | DBPROP_Irowset
IRowsetChange | DBPROP_IrowsetChange
IRowsetIdentity | DBPROP_IrowsetIdentity
IRowsetInfo | DBPROP_IrowsetInfo
IRowsetLocate | DBPROP_IrowsestLocate
IRowsetResynch |
IRowsetScroll | DBPROP_IrowsetScroll
IRowsetUpdate | DBPROP_IrowsetUpdate
ISequentialStream | DBPROP_IsequentialStream
ISupportErrorInfo | DBPROP_IsupportErrorInfo
Literal Bookmarks | DBPROP_LITERALBOOKMARKS
Literal Row Identity | DBPROP_LITERALIDENTITY
Maximum Open Rows | DBPROP_MAXOPENROWS
Maximum Pending Rows | DBPROP_MAXPENDINGROWS
Maximum Rows | DBPROP_MAXROWS
Notification Granularity | DBPROP_NOTIFICATIONGRANULARITY
Notification Phases | DBPROP_NOTIFICATIONPHASES
Objects Transacted | DBPROP_TRANSACTEDOBJECT
Others' Changes Visible | DBPROP_OTHERUPDATEDELETE
Others' Inserts Visible | DBPROP_OTHERINSERT
Own Changes Visible | DBPROP_OWNUPDATEDELETE
Own Inserts Visible | DBPROP_OWNINSERT
Preserve on Abort | DBPROP_ABORTPRESERVE
Preserve on Commit | DBPROP_COMMITPRESERVE
Quick Restart | DBPROP_QUICKRESTART
Reentrant Events | DBPROP_REENTRANTEVENTS
Remove Deleted Rows | DBPROP_REMOVEDELETED
Report Multiple Changes | DBPROP_REPORTMULTIPLECHANGES
Return Pending Inserts | DBPROP_RETURNPENDINGINSERTS
Row Delete Notification | DBPROP_NOTIFYROWDELETE
Row First Change Notification | DBPROP_NOTIFYROWFIRSTCHANGE
Row Insert Notification | DBPROP_NOTIFYROWINSERT
Row Privileges | DBPROP_ROWRESTRICT
Row Resynchronization Notification | DBPROP_NOTIFYROWRESYNCH
Row Threading Model | DBPROP_ROWTHREADMODEL
Row Undo Change Notification | DBPROP_NOTIFYROWUNDOCHANGE
Row Undo Delete Notification | DBPROP_NOTIFYROWUNDODELETE
Row Undo Insert Notification | DBPROP_NOTIFYROWUNDOINSERT
Row Update Notification | DBPROP_NOTIFYROWUPDATE
Rowset Fetch Position Change Notification | DBPROP_NOTIFYROWSETFETCHPOSISIONCHANGE
Rowset Release Notification | DBPROP_NOTIFYROWSETRELEASE
Scroll Backwards | DBPROP_CANSCROLLBACKWARDS
Server Cursor | DBPROP_SERVERCURSOR
Skip Deleted Bookmarks | DBPROP_BOOKMARKSKIPPED
Strong Row Identity | DBPROP_STRONGITDENTITY
Unique Rows | DBPROP_UNIQUEROWS
Updatability | DBPROP_UPDATABILITY
Use Bookmarks | DBPROP_BOOKMARKS

Dynamische Befehlseigenschaften

Die folgenden Eigenschaften werden zu der Properties-Auflistung des Command-Objekts hinzugefügt.

ADO-Eigenschaftenname | OLE DB-Eigenschaftenname
Access Order | DBPROP_ACCESSORDER
Blocking Storage Objects | DBPROP_BLOCKINGSTORAGEOBJECTS
Bookmark Type | DBPROP_BOOKMARKTYPE
Bookmarkable | DBPROP_IROWSETLOCATE
Change Inserted Rows | DBPROP_CHANGEINSERTEDROWS
Column Privileges | DBPROP_COLUMNRESTRICT
Column Set Notification | DBPROP_NOTIFYCOLUMNSET
Defer Column | DBPROP_DEFERRED
Delay Storage Object Updates | DBPROP_DELAYSTORAGEOBJECTS
Fetch Backwards | DBPROP_CANFETCHBACKWARDS
Hold Rows | DBPROP_CANHOLDROWS
IAccessor | DBPROP_Iaccessor
IColumnsInfo | DBPROP_IcolumnsInfo
IColumnsRowset | DBPROP_IcolumnsRowset
IConnectionPointContainer | DBPROP_IconnectionPointContainer
IConvertType | DBPROP_IconvertType
Immobile Rows | DBPROP_IMMOBILEROWS
IRowset | DBPROP_Irowset
IRowsetChange | DBPROP_IrowsetChange
IRowsetIdentity | DBPROP_IrowsetIdentity
IRowsetInfo | DBPROP_IrowsetInfo
IRowsetLocate | DBPROP_IrowsetLocate
IRowsetResynch |
IRowsetScroll | DBPROP_IrowsetScroll
IRowsetUpdate | DBPROP_IrowsetUpdate
ISequentialStream | DBPROP_IsequentialStream
ISupportErrorInfo | DBPROP_IsupportErrorInfo
Literal Bookmarks | DBPROP_LITERALBOOKMARKS
Literal Row Identity | DBPROP_LITERALIDENTITY
Lock Mode | DBPROP_LOCKMODE
Maximum Open Rows | DBPROP_MAXOPENROWS
Maximum Pending Rows | DBPROP_MAXPENDINGROWS
Maximum Rows | DBPROP_MAXROWS
Notification Granularity | DBPROP_NOTIFICATIONGRANULARITY
Notification Phases | DBPROP_NOTIFICATIONPHASES
Objects Transacted | DBPROP_TRANSACTEDOBJECT
Others' Changes Visible | DBPROP_OTHERUPDATEDELETE
Others' Inserts Visible | DBPROP_OTHERINSERT
Own Changes Visible | DBPROP_OWNUPDATEDELETE
Own Inserts Visible | DBPROP_OWNINSERT
Preserve on Abort | DBPROP_ABORTPRESERVE
Preserve on Commit | DBPROP_COMMITPRESERVE
Quick Restart | DBPROP_QUICKRESTART
Reentrant Events | DBPROP_REENTRANTEVENTS
Remove Deleted Rows | DBPROP_REMOVEDELETED
Report Multiple Changes | DBPROP_REPORTMULTIPLECHANGES
Return Pending Inserts | DBPROP_RETURNPENDINGINSERTS
Row Delete Notification | DBPROP_NOTIFYROWDELETE
Row First Change Notification | DBPROP_NOTIFYROWFIRSTCHANGE
Row Insert Notification | DBPROP_NOTIFYROWINSERT
Row Privileges | DBPROP_ROWRESTRICT
Row Resynchronization Notification | DBPROP_NOTIFYROWRESYNCH
Row Threading Model | DBPROP_ROWTHREADMODEL
Row Undo Change Notification | DBPROP_NOTIFYROWUNDOCHANGE
Row Undo Delete Notification | DBPROP_NOTIFYROWUNDODELETE
Row Undo Insert Notification | DBPROP_NOTIFYROWUNDOINSERT
Row Update Notification | DBPROP_NOTIFYROWUPDATE
Rowset Fetch Position Change Notification | DBPROP_NOTIFYROWSETFETCHPOSITIONCHANGE
Rowset Release Notification | DBPROP_NOTIFYROWSETRELEASE
Scroll Backwards | DBPROP_CANSCROLLBACKWARDS
Server Data on Insert | DBPROP_SERVERDATAONINSERT
Server Cursor | DBPROP_SERVERCURSOR
Skip Deleted Bookmarks | DBPROP_BOOKMARKSKIP
Strong Row Identity | DBPROP_STRONGIDENTITY
Updatability | DBPROP_UPDATABILITY
Use Bookmarks | DBPROP_BOOKMARKS

Siehe auch Ausführliche Informationen für spezielle Implementierungen sowie funktionale Informationen zum Microsoft OLE DB-Provider für SQL Server entnehmen Sie der Dokumentation zu OLE DB-Provider für SQL Server im MDAC SDK.


Microsoft OLE DB-Provider für Oracle

Mit dem Microsoft OLE DB-Provider für Oracle kann ADO auf Oracle-Datenbanken zugreifen.

Parameter der Verbindungszeichenfolge

Wenn Sie eine Verbindung zu diesem Provider herstellen möchten, müssen Sie das Provider-Argument der ConnectionString-Eigenschaft folgendermaßen festlegen:

MSDAORA

Beim Lesen der Provider-Eigenschaft wird diese Zeichenfolge ebenfalls zurückgegeben.

Wird in einer Oracle-Datenbank eine verbundene Abfrage mit einem Cursor vom Typ Keyset oder einem dynamischen Cursor ausgeführt, dann tritt ein Fehler auf. Oracle unterstützt nur einen statischen schreibgeschützten Cursor.

Typische Verbindungszeichenfolgen

Dies ist eine typische Verbindungszeichenfolge für diesen Provider:

"Provider=MSDAORA;Data Source=serverName;User ID=userName; Password=userPassword;"

Dabei werden die folgenden Schlüsselwörter verwendet:

Schlüsselwort | Beschreibung
Provider | Gibt den Microsoft OLE DB-Provider für Oracle an.
Data Source | Gibt den Namen eines Servers an.
User ID | Gibt den Benutzernamen an.
Password | Gibt das Benutzerkennwort an.

Providerspezifische Verbindungsparameter

Der Provider unterstützt verschiedene providerspezifische Verbindungsparameter zusätzlich zu den von ADO definierten Verbindungsparametern. Wie die ADO-Verbindungseigenschaften können auch diese providerspezifischen Eigenschaften über die Properties-Auflistung eines Connection-Objekts oder als Teil einer Verbindungszeichenfolge festgelegt werden.

Diese Parameter werden in der OLE DB Programmer's Reference ausführlich behandelt. (Der Index für dynamische Eigenschaften von ADO stellt Querverweise zwischen diesen Parameternamen und den entsprechenden OLE DB-Eigenschaften her.)

Parameter | Beschreibung
Window Handle | Gibt das Fensterhandle an, das für die Aufforderungen zur Eingabe zusätzlicher Informationen verwendet werden soll.
Locale Identifier | Gibt eine eindeutige 32-Bit-Zahl an (z. B. 1033), die Einstellungen bezüglich der Sprache des Benutzers angibt. Diese Einstellungen legen fest, wie Datums- und Zeitwerte formatiert werden, wie Elemente alphabetisch sortiert werden, wie Zeichenfolgen verglichen werden usw.
OLE DB Services | Gibt eine Bitmaske an, in der die OLE DB-Dienste angegeben sind, die aktiviert oder deaktiviert werden sollen.
Prompt | Gibt an, ob der Benutzer aufgefordert werden soll, ob eine Verbindung hergestellt werden soll.
Extended Properties | Eine Zeichenfolge, die providerspezifische erweiterte Verbindungsinformationen enthält. Verwenden Sie diese Eigenschaft nur für providerspezifische Verbindungsinformationen, die nicht mit den üblichen Eigenschaften beschrieben werden können.


Microsoft OLE DB-Provider für Internet Publishing

Der Microsoft OLE DB-Provider für Internet Publishing ermöglicht ADO den Zugriff auf Ressourcen, die von Microsoft FrontPage oder Microsoft Internet Information Server versorgt werden. Zu diesen Ressourcen zählen Webquelldateien, wie z.B. HTML-Dateien oder Windows 2000-Webordner.

Parameter der Verbindungszeichenfolge

Wenn Sie eine Verbindung zu diesem Provider herstellen möchten, müssen Sie das Provider-Argument der ConnectionString-Eigenschaft folgendermaßen festlegen:

MSDAIPP.DSO

Dieser Wert kann auch festgelegt oder gelesen werden, indem Sie die Provider-Eigenschaft verwenden.

Typische Verbindungszeichenfolgen

Dies ist eine typische Verbindungszeichenfolge für diesen Provider:

"Provider=MSDAIPP.DSO;Data Source=ResourceURL;User ID=userName;Password=userPassword;"

-oder-

"URL=ResourceURL;User ID=userName;Password=userPassword;"

Dabei werden die folgenden Schlüsselwörter verwendet:

Schlüsselwort | Beschreibung
Provider | Gibt den OLE DB-Provider für Internet Publishing an.
Data Source -oder- URL | Gibt den URL einer Datei oder eines Verzeichnisses an, die bzw. das in einem Webordner veröffentlicht wird.
User ID | Gibt den Benutzernamen an.
Password | Gibt das Benutzerkennwort an.

Wenn Sie die ResourceURL-Option für "URL=" in der Verbindungszeichenfolge auf einen ungültigen Wert festlegen, öffnet der Internet Publishing-Provider standardmäßig ein Dialogfeld, in dem Sie zur Eingabe eines gültigen Wertes aufgefordert werden. Dieses Verhalten ist für eine Komponente auf der mittleren Ebene einer Anwendung unerwünscht, weil dadurch das Programm unterbrochen wird, bis das Dialogfeld geschlossen wird, und der Client scheint eingefroren zu sein, da er keine Antwort von der Komponente erhalten hat.

Anmerkung Wenn MSDAIPP.DSO mit dem Providerschlüsselwort der Verbindungszeichenfolge oder mit der Provider-Eigenschaft explizit als Providerwert angegeben wird, können Sie "URL=" nicht für die Verbindungszeichenfolge verwenden. Andernfalls wird ein Fehler gemeldet. Geben Sie stattdessen einfach den URL an, wie unter Verwenden von ADO mit dem OLE DB-Provider für Internet Publishing beschrieben.


Microsoft Data Shaping Service für OLE DB (ADO-Serviceprovider)

Microsoft Data Shaping Service für OLE DB

Der Microsoft Data Shaping Service für OLE DB-Serviceprovider unterstützt die Erstellung hierarchischer (strukturierter) Recordset-Objekte von einem Datenprovider.

Provider-Schlüsselwort

Um den Data Shaping Service für OLE DB aufzurufen, geben Sie in der Verbindungszeichenfolge das folgende Schlüsselwort und den dazu gehörenden Wert an.

"Provider=MSDataShape"

Dynamische Eigenschaften

Wenn dieser Serviceprovider aufgerufen wird, werden der Properties-Auflistung des Connection-Objekts die folgenden dynamischen Eigenschaften hinzugefügt.

Name der dynamischen Eigenschaft | Beschreibung
Unique Reshape Names | Gibt an, ob Recordset-Objekte mit identischem Wert für die Name-Eigenschaft zulässig sind. Wenn diese dynamische Eigenschaft den Wert True besitzt und ein neues Recordset-Objekt mit dem Namen eines bereits existierenden erstellt wird, dann wird der Name des neuen Recordset-Objekts modifiziert, um seine Eindeutigkeit zu gewährleisten. Hat die Eigenschaft den Wert False und wird dann ein neues Recordset-Objekt erstellt, das denselben Namen wie ein bereits existierendes Recordset-Objekt besitzt, dann haben beide Recordset-Objekte denselben Namen. Deshalb kann keines der beiden Recordset-Objekte neu strukturiert werden, solange beide Recordsets existieren. Der Standardwert der Eigenschaft ist False.
Data Provider | Gibt den Namen des Providers an, der zu strukturierende Zeilen zur Verfügung stellt.

Sie können überschreibbare dynamische Eigenschaften setzen, indem Sie die entsprechenden Namen als Schlüsselwörter in der Verbindungszeichenfolge angeben. So können Sie beispielsweise in Microsoft Visual Basic die dynamische Eigenschaft Data Provider auf "MSDASQL" setzen, indem Sie Folgendes angeben:

Dim cn as New ADODB.Connection
cn.Open "Provider=MSDataShape;Data Provider=MSDASQL"

Ebenso können Sie eine dynamische Eigenschaft setzen oder abrufen, indem Sie den entsprechenden Namen als Index für die Properties-Eigenschaft angeben. In dem folgenden Beispiel rufen Sie den derzeitigen Wert der dynamischen Eigenschaft Data Provider ab und drucken ihn aus. Anschließend setzen Sie einen neuen Wert:

Debug.Print cn.Properties("Data Provider")
cn.Properties("Data Provider") = "MSDASQL"

Weitere Informationen zum Strukturieren von Daten finden Sie unter dem Thema Datenstrukturierung.


Microsoft OLE DB Persistence Provider (ADO-Serviceprovider)

Microsoft OLE DB Persistence Provider

Der Microsoft OLE DB Persistence Provider ermöglicht Ihnen, ein Recordset-Objekt in eine Datei zu speichern und dieses später aus der Datei wiederherzustellen. Schemainformationen, Daten und nicht gespeicherte Änderungen bleiben erhalten.

Speichern können Sie das Recordset entweder im proprietären ADTG-Format (Advanced Data Table Gram) oder im offenen XML-Format (Extensible Markup Language).

Provider-Schlüsselwort

Um diesen Provider aufzurufen, geben Sie in der Verbindungszeichenfolge folgendes Schlüsselwort und folgenden Wert an:

"Provider=MSPersist"

Fehler

Die folgenden von diesem Provider ausgelösten Fehler können in Ihrer Anwendung auftreten.

Konstante | Beschreibung
E_BADSTREAM | Die zu öffnende Datei hat kein gültiges Format (weder ADTG- noch XML-Format).
E_CANTPERSISTROWSET | Das zu speichernde Recordset-Objekt hat Merkmale, die seine Speicherung verhindern.

Hinweise

Der Microsoft OLE DB Persistence Provider legt keine dynamischen Eigenschaften offen.

Derzeit können parametrisierte hierarchische Recordset-Objekte nicht gespeichert werden.

Weitere Informationen über die dauerhafte Speicherung von Recordset-Objekten finden Sie unter dem Thema Recordset-Persistenz.


Microsoft OLE DB Remoting Provider (ADO-Serviceprovider)

Microsoft OLE DB Remoting Provider

Der Microsoft OLE DB-Remoting Provider ermöglicht es einem lokalen Benutzer eines Clientcomputers, Datenprovider auf einem Remotecomputer aufzurufen. Geben Sie die Parameter des Datenproviders für den Remotecomputer so an, als wären Sie ein lokaler Benutzer des Rempotecomputers. Geben Sie anschließend die vom Remoting Provider verwendeten Parameter an, um auf den Remotecomputer zuzugreifen. Im Endeffekt können Sie auf den Remotecomputer genauso zugreifen wie ein lokaler Benutzer.

Provider-Schlüsselwort

Um den OLE DB Remoting Provider aufzurufen, geben Sie in der Verbindungszeichenfolge folgendes Schlüsselwort und folgenden Wert an: (Achten Sie auf das Leerzeichen im Namen des Providers.)

"Provider=MS Remote"

Zusätzliche Schlüsselwörter

Wenn dieser Serviceprovider aufgerufen wird, sind die folgenden zusätzlichen Schlüsselwörter relevant:

Schlüsselwort | Beschreibung
Data Source | Gibt den Namen der Remote-Datenquelle an. Er wird an den OLE DB Remoting Provider zur Verarbeitung übergeben. Dieses Schlüsselwort entspricht der Connect-Eigenschaft eines RDS.DataControl-Objekts.

Dynamische Eigenschaften

Wenn dieser Serviceprovider aufgerufen wird, werden der Properties-Auflistung des Connection-Objekts die folgenden dynamischen Eigenschaften hinzugefügt.

Name der dynamischen Eigenschaft | Beschreibung
DFMode Gibt den DataFactory-Modus an. Eine Zeichenfolge, die die gewünschte Version des DataFactory-Objekts auf dem Server angibt. Setzen Sie diese Eigenschaft vor dem Öffnen einer Verbindung, um eine bestimmte Version der DataFactory anzufordern. Ist die angeforderte Version nicht verfügbar, dann wird versucht, die Vorgängerversion zu verwenden. Gibt es keine Vorgängerversion, tritt ein Fehler auf. Falls DFMode eine Versionsnummer übergibt, die kleiner als die Nummer der verfügbaren Version ist, tritt ein Fehler auf. Diese Eigenschaft ist schreibgeschützt, nachdem eine Verbindung erstellt wurde.

Folgende Zeichenfolgen-Konstanten sind zulässig:

  • "25" – Version 2.5 (Standardwert)

  • "21" – Version 2,1

  • "20" – Version 2,0

  • "15" – Version 1.5
Current DFMode Gibt die aktuelle Versionsnummer der auf dem Server befindlichen DataFactory an. Überprüfen Sie diese Eigenschaft, um zu ermitteln, ob der in der DFMode-Eigenschaft angeforderten Version entsprochen wurde.

Folgende Wert vom Datentyp Long sind zulässig:

  • 25 – Version 2.5 (Standardwert)

  • 21 – Version 2,1

  • 20 – Version 2,0

  • 15 – Version 1.5

Wenn Sie den MSRemote-Provider verwenden und die Zuweisung "DFMode=20;" in die Verbindungszeichenfolge aufnehmen, kann dies die Serverleistung beim Aktualisieren verbessern. Mit dieser Einstellung benutzt das auf dem Server installierte RDSServer.DataFactory-Objekt einen Modus, der weniger Ressourcen beansprucht. Allerdings sind bei dieser Konfiguration die folgenden Aktionen nicht möglich:

  • Verwendung parametrisierter Abfragen.

  • Zugriff auf Parameter- oder Spalteninformationen vor dem Aufruf der Execute-Methode.

  • Festlegung von Transact Updates auf True.

  • Abrufen des Zeilenstatus.

  • Aufrufen der Resync-Methode.

  • Aktualisierung (explizit oder automatisch) über die Update Resync-Eigenschaft.

  • Festlegung der Eigenschaften Command oder Recordset.

  • Verwendung von adCmdTableDirect.
Handler | Gibt den Namen eines serverbasierten Anpassungsprogramms (oder eines Handlers) an, mit dem die Funktionalität von RDSServer.DataFactory sowie aller durch die Behandlungsroutine verwendeten Parameter erweitert werden. Dabei müssen die einzelnen Elemente durch Kommas (",") voneinander getrennt werden. Ein Wert vom Datentyp String.
Internet Timeout | Gibt die maximale Zeit in Millisekunden an, die abgewartet wird, damit eine Anforderung zum Server und zurück übermittelt wird. (Standardwert ist 5 Minuten).
Remote Provider | Gibt den Namen des Datenproviders an, der auf dem Remoteserver verwendet werden soll.
Remote Server | Gibt den Namen des Servers und des Kommunikationsprotokolls an, die für diese Verbindung verwendet werden sollen. Diese Eigenschaft entspricht der Server-Eigenschaft des RDS.DataControl-Objekts.

Sie können überschreibbare dynamische Eigenschaften setzen, indem Sie die entsprechenden Namen als Schlüsselwörter in der Verbindungszeichenfolge angeben. Setzen Sie beispielsweise die dynamische Eigenschaft Internet Timeout auf fünf Sekunden, indem Sie Folgendes angeben:

Dim cn as New ADODB.Connection
cn.Open "Provider=MS Remote;Internet Timeout=5000"

Ebenso können Sie eine dynamische Eigenschaft setzen oder abrufen, indem Sie den entsprechenden Namen als Index für die Properties-Eigenschaft angeben. In dem folgenden Beispiel rufen Sie den derzeitigen Wert der dynamischen Eigenschaft Data Provider ab und geben ihn aus. Anschließend setzen Sie einen neuen Wert:

Debug.Print cn.Properties("Internet Timeout")
cn.Properties("Internet Timeout") = 5000

Hinweise

In ADO 2.0 konnte der OLE DB-Remoting Provider lediglich im Parameter ActiveConnection der Open-Methode des Recordset-Objekts angegeben werden. Ab Version ADO 2.1 kann der Provider auch im ConnectionString-Parameter der Open-Methode des Connection-Objekts angegeben werden.

Ein Gegenstück zur SQL-Eigenschaft des RDS.DataControl-Objekts ist hingegen nicht verfügbar. Stattdessen wird das Source-Argument der Open-Methode des Recordset-Objekts verwendet.

Eine Angabe der Art "...;Remote Provider=MS Remote;..." würde zu einem aus vier Ebenen bestehenden Szenario führen. Szenarien mit mehr als drei Stufen sind jedoch nicht getestet worden und sollten auch nicht erforderlich sein.

Beispiel

In diesem Beispiel wird eine Abfrage der Authors-Tabelle in der Pubs-Datenbank durchgeführt, und zwar auf einem Server namens YourServer. Die Namen der Remote-Datenquelle und des Remoteservers werden in der Open-Methode des Connection-Objekts angegeben, während die SQL-Abfrage in der Open-Methode des Recordset-Objekts angegeben wird. Ein Recordset-Objekt wird zurückgegeben, bearbeitet und zum Aktualisieren der Datenquelle verwendet.

Dim rs as New ADODB.Recordset
Dim cn as New ADODB.Connection
cn.Open  "Provider=MS Remote;Data Source=pubs;" & _
         "Remote Server=http://YourServer"
rs.Open "SELECT * FROM authors", cn
...                ' Das Recordset bearbeiten
rs.UpdateBatch     ' Gleichbedeutend mit SubmitChanges von RDS
...


Microsoft Cursordienst für OLE DB (ADO-Servicekomponente)

Microsoft Cursordienst für OLE DB

Der Microsoft Cursordienst für OLE DB-Zusätze ergänzt die Cursor-Unterstützungsfunktionen der Datenprovider. Daraus resultiert, dass der Benutzer eine relativ einheitliche Funktionalität aller Datenprovider wahrnimmt.

Der Cursordienst macht dynamische Eigenschaften verfügbar und optimiert das Verhalten bestimmter Methoden. So ermöglicht beispielsweise die dynamische Eigenschaft Optimize die Erstellung von temporären Indizes zur vereinfachten Durchführung bestimmter Operationen, wie z. B. der Find-Methode.

Der Cursordienst ermöglicht in allen Fällen die Unterstützung von Stapelaktualisierungen. Er simuliert darüber hinaus leistungsfähigere Cursortypen, beispielsweise dynamische Cursor, wenn ein Datenprovider lediglich weniger leistungsfähige Cursor, z. B. statische Cursor, zur Verfügung stellen kann.

Schlüsselwort

Um diese Komponente aufzurufen, setzen Sie die CursorLocation-Eigenschaft des Recordset- oder des Connection -Objekts auf adUseClient.

connection.CursorLocation=adUseClient
recordset.CursorLocation=adUseClient

Dynamische Eigenschaften

Wenn der Cursordienst für OLE DB aufgerufen wird, werden der Properties-Auflistung des Recordset-Objekts dynamische Eigenschaften hinzugefügt. Die vollständige Liste aller dynamischen Eigenschaften des Connection- und des Recordset-Objekts ist im Index der dynamischen Eigenschaften von ADO aufgeführt. Die Namen der gegebenenfalls zugeordneten OLE DB-Eigenschaften stehen hinter dem ADO-Namen in Klammern.

Nach dem Start des Cursordienstes sind Änderungen an einigen der dynamischen Eigenschaften für die zugrunde liegende Datenquelle nicht sichtbar. Beispielsweise ist das Setzen der Command Timeout-Eigenschaft eines Recordset-Objekts für den zugrunde liegenden Datenprovider nicht sichtbar.

…
Recordset1.CursorLocation = adUseClient     ' Cursordienst aufrufen
Recordset1.Open "authors", _
    "Provider=SQLOLEDB;Data Source=DBServer;User Id=usr;" & _
    "Password=pwd;Initial Catalog=pubs;",,adCmdTable
Recordset1.Properties.Item("Command Time out") = 50
' Eigenschaft 'Command Time out' auf DBServer hat noch den
' Standardwert (30).
…

Wenn Ihre Anwendung den Cursordienst erfordert und Sie gleichzeitig aber auch dynamische Eigenschaften für den zugrunde liegenden Provider festlegen müssen, sollten Sie diese Eigenschaften setzen, bevor Sie den Cursordienst aktivieren. Eigenschaftseinstellungen eines Command-Objekts werden unabhängig von der Cursorherkunft immer an den zugrunde liegenden Datenprovider weitergegeben. Deshalb können Sie ein auch Command-Objekt verwenden, wenn es gilt, jederzeit die Eigenschaften setzen zu können.

Name der Eigenschaft | Beschreibung
Auto Recalc (DBPROP_ADC_AUTORECALC) | Bei Recordsets, die mit dem Data Shaping Service erstellt wurden, gibt dieser Wert an, wie häufig Spalten mit berechneten Werten und Aggregatspalten neu berechnet werden. Die Standardeinstellung (Wert=1) legt fest, dass immer dann eine Neuberechnung erfolgen soll, wenn der Data Shaping Service feststellt, dass sich die Werte geändert haben. Bei einem Wert von 0 werden die Spalten mit berechneten Werten und die Aggregatspalten nur bei Ersterstellung der Hierarchie berechnet.
Batch Size (DBPROP_ADC_BATCHSIZE) | Gibt die Anzahl der Aktualisierungsbefehle an, die als Stapelbefehl kombiniert werden können, bevor sie an den Datenspeicher übermittelt werden. Je mehr Anweisungen per Stapelbefehl, desto weniger Datenverkehr von und zum Datenspeicher.
Cache Child Rows (DBPROP_ADC_CACHECHILDROWS) | Bei Recordsets, die mit dem Data Shaping Service erstellt wurden, gibt dieser Wert an, ob untergeordnete Recordsets zur späteren Verwendung in einem Zwischenspeicher abgelegt werden.
Cursor Engine Version (DBPROP_ADC_CEVER) | Gibt den Standort der aktuell verwendeten Cursorfunktion an.
Maintain Change Status (DBPROP_ADC_MAINTAINCHANGESTATUS) | Gibt den Text des Befehls an, der zur Resynchronisierung einer oder mehrerer Zeilen einer mehrere Tabellen umfassenden Inklusionsverknüpfung verwendet wird.
Optimize | Gibt an, ob ein Index erstellt werden soll. Ein Wert von True ermöglicht die temporäre Erstellung von Indizes zur verbesserten Durchführung bestimmter Operationen.
Reshape Name | Gibt den Namen des Recordsets an. Darauf kann innerhalb der aktuellen oder der nachfolgenden Datenstrukturierungsbefehle verwiesen werden.
Resync Command | Gibt eine benutzerdefinierte Befehlszeichenfolge an, die von der Resync-Methode verwendet wird, wenn die Unique Table-Eigenschaft aktiv ist.
Unique Catalog | Gibt den Namen der Datenbank an, die die Tabelle enthält, auf welche in der Unique Table-Eigenschaft verwiesen wird.
Unique Schema | Gibt den Namen des Eigentümers der Tabelle an, auf die in der Unique Table-Eigenschaft verwiesen wird.
Unique Table | Gibt den Namen der einen Tabelle in einem Recordset an, die aus mehreren Tabellen erstellt wurde und durch Einfügungen, Aktualisierungen und Löschvorgänge verändert werden kann.
Update Criteria (DBPROP_ADC_UPDATECRITERIA) | Gibt an, welche Felder in der WHERE–Klausel zur Behandlung von Kollisionen während einer Aktualisierung verwendet werden.
Update Resync (DBPROP_ADC_UPDATERESYNC) | Gibt an, ob automatisch nach einem Aufruf der UpdateBatch-Methode (und ihrem Verhalten) die Resync-Methode aufgerufen wird, falls die Unique Table-Eigenschaft definiert ist.

Ebenso können Sie eine dynamische Eigenschaft setzen oder abrufen, indem Sie den entsprechenden Namen als Index für die Properties-Eigenschaft angeben. In dem folgenden Beispiel rufen Sie den aktuellen Wert der dynamischen Eigenschaft Optimize auf, geben ihn aus und weisen dann einen neuen Wert zu:

Debug.Print rs.Properties("Optimize")
rs.Properties("Optimize") = True

Verhalten integrierter Eigenschaften

Der Cursordienst für OLE DB beeinflusst auch das Verhalten bestimmter integrierter Eigenschaften.

Name der Eigenschaft | Beschreibung
CursorType | Ergänzt die für ein Recordset verfügbaren Cursortypen.
LockType | Ergänzt die für ein Recordset verfügbaren Sperrtypen. Ermöglicht Stapelaktualisierungen.
Sort | Gibt einen oder mehrere Feldnamen an, nach denen die Sortierung im Recordset-Objekt durchgeführt wird. Außerdem wird angegeben, ob die einzelnen Felder in aufsteigender oder absteigender Reihenfolge sortiert werden.

Verhalten von Methoden

Der Cursordienst für OLE DB aktiviert oder beeinflusst das Verhalten der Append-Methode eines Field-Objekts, sowie der Methoden Open, Resync, UpdateBatch und Save eines Recordset-Objekts.


ADO-Glossar

A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

A

Absoluter URL

ActiveX-Steuerelement

ADISAPI

Advanced Data Internet Server Application Programming Interface

Aggregatfunktion

Alias

Apartmentthreading

Asynchroner Vorgang

Aufzählung

B

Berechneter Ausdruck

Bereich

Beziehung zwischen über- und untergeordneten Elementen

Bindungseintrag

Bitmaske

C

Clientebene

CLSID

COM

COM-Komponente

Component Object Model

Cursor

D

Datenbindung

Datendefinitionssprache

Datenprovider

Datenquellenebene

Datenquellenname

Datenstrukturierung

Datenverarbeitungssprache

Dauerhaft speichern

DCOM

DDL

Distributed Component Object Model

DLL

DML

DSN

Dynamic Link Library

Dynamische Eigenschaft

E

Ereignis

Ereignis-Handler

F

G

Geschäftsobjekt

Geschäftsregel

Gespeicherte Prozedur

Gleichgestelltes Element

H

Handler

Hierarchie

Hierarchisches Recordset

I

Internet Server Application Programming Interface

ISAPI

J

K

Kapitel

Kapitelalias

Klassenbezeichner

Knoten

Komponente

Konstante

L

Lesezeichen

M

Marshalling

MIME

MIME (Multi-Purpose Internet Mail Extension)

Mittlere Ebene

N

Nicht verbundenes Recordset

O

Objektvariable

ODBC

OLE DB

Open Database Connectivity

Ordinalwert

P

Parametrisierter Befehl

Pooling

ProgID

Programmtechnischer Bezeichner

Provider für Dokumentenquellen

Proxy

Q

R

Relativer URL

Remotedatenquelle

Ressourcendatensatz

Rowset

S

Schema

Schlüssel

Serviceprovider

Stamm

Standarddatenstrom

Struktur

Strukturiertes Recordset

Stub

Synchroner Vorgang

T

Teilweises Sperren

U

Übergeordneter Alias

Übergeordnetes Element

Uniform Resource Locator

Untergeordneter Alias

Untergeordnetes Element

Unterknoten

URL

V

Verbunddatei

Vergleichsoperator

Verteilte Anwendung

Vollständiges Sperren

W

Webserver

X

Y

Z

Zeichensatz


Microsoft ADOX Programmer's Reference

Bei Microsoft® ActiveX® Data Objects Extensions for Data Definition Language and Security (ADOX) handelt es sich um eine Erweiterung der ADO-Objekte und des ADO-Programmiermodells. In ADOX sind Objekte zur Erstellung und Veränderung von Schemas sowie für die Sicherheit enthalten. Da es sich hierbei um einen objektbasierten Ansatz zur Schemabearbeitung handelt, ist es möglich, Code zu schreiben, der mit verschiedenen Datenquellen arbeiten kann, ungeachtet der Unterschiede ihrer jeweiligen Syntax.

ADOX ist eine Bibliothek, die die zentralen ADO-Objekte begleitet. Es zeigt zusätzlichen Objekten zum Erstellen, Verändern und Löschen von Schemaobjekten an, z. B. Tabellen und Prozeduren. Außerdem enthält es Sicherheitsobjekte zum Verwalten von Benutzern und Gruppen sowie zum Erteilen und Widerrufen von Berechtigungen für Objekte.

Richten Sie einen Verweis auf die ADOX-Klassenbibliothek ein, um ADOX zusammen mit dem von Ihnen verwendeten Entwicklungsprogramm einzusetzen. Die Beschreibung der ADOX-Bibliothek lautet "Microsoft ADO-Erweiterungen für DDL und Security". Der Dateiname der ADOX-Bibliothek lautet Msadox.dll, und die Programm-ID (ProgID) ist "ADOX". Weitere Informationen zum Einrichten von Verweisen auf Bibliotheken finden Sie in der Dokumentation zum Entwicklungsprogramm.

Der Microsoft OLE DB-Provider für das Microsoft Jet-Datenbankmodul bietet vollständige Unterstützung von ADOX. Je nach Datenprovider werden einige ADOX-Features möglicherweise nicht unterstützt. Weitere Informationen zu den unterstützten Features von Microsoft OLE DB-Provider für ODBC, Microsoft OLE DB-Provider für Oracle oder Microsoft SQL Server OLE DB-Provider finden Sie in der Infodatei von MDAC.

In diesem Dokument wird davon ausgegangen, dass Sie über gute Kenntnisse der Programmiersprache Microsoft® Visual Basic® sowie über allgemeine Kenntnisse in ADO verfügen. Weitere Informationen zu ADO finden Sie unter ADO Programmer's Reference. Weitere Informationen zu ADOX finden Sie unter folgenden Themen:

  • ADOX-Objektmodell

  • ADOX-Objekte

  • ADOX-Auflistungen

  • ADOX-Eigenschaften

  • ADOX-Methoden

  • ADOX-Beispiele


Neue Features in ADOX

Themen zu Codebeispielen

Die Beispiele wurden erweitert, so dass jetzt Codebeispiele in Microsoft Visual C++® und zusätzliche Beispiele in Microsoft Visual Basic enthalten sind. Sie können diese Codebeispiele kopieren und in den Editor einfügen.


ADOX-API-Verzeichnis

Dieser Abschnitt der ADOX-Dokumentation enthält Themen für alle ADOX-Objekte, -Auflistungen, -Methoden und -Eigenschaften sowie ggf. Beispielcode. Weitere Informationen finden Sie im Index unter dem entsprechenden Thema oder den folgenden Themen:

  • ADOX-Objekte

  • ADOX-Auflistungen

  • ADOX-Eigenschaften

  • ADOX-Methoden

  • ADOX-Aufzählungskonstanten

  • ADOX-Beispiele


ADOX-Objektmodell

Das folgende Diagramm zeigt, wie Objekte in ADOX dargestellt werden und in welcher Beziehung sie zueinander stehen. Weitere Informationen zu einem bestimmten Objekt oder einer bestimmter Auflistung finden Sie unter dem jeweiligen Thema des Verzeichnisses oder unter ADOX-Objekte und ADOX-Auflistungen.

Die einzelnen Table-, Index- und Column-Objekte verfügen darüber hinaus über eine standardmäßige Properties-Auflistung von ADO.


ADOX-Objekte

ADOX-Objekte - Zusammenfassung

Objekt | Beschreibung
Catalog | Enthält Auflistungen, die den Schemakatalog einer Datenquelle beschreiben.
Column | Stellt eine Spalte einer Tabelle, eines Indexes oder eines Schlüssels dar.
Group | Stellt ein Gruppenkonto dar, das über Zugriffsberechtigungen innerhalb einer gesicherten Datenbank verfügt.
Index | Stellt einen Index einer Datenbanktabelle dar.
Key | Stellt das Feld eines Primär-, eines Fremd- oder eines eindeutigen Schlüssels einer Datenbanktabelle dar.
Procedure | Stellt eine gespeicherte Prozedur dar.
Table | Stellt eine Datenbanktabelle einschließlich Spalten, Indizes und Schlüsseln dar.
User | Stellt ein Benutzerkonto dar, das über Zugriffsberechtigungen innerhalb einer gesicherten Datenbank verfügt.
View | Stellt eine gefilterte Menge von Datensätzen oder eine virtuelle Tabelle dar.

Die Beziehungen zwischen diesen Objekten sind im ADOX-Objektmodell dargestellt.

Jedes Objekt kann in seiner dazugehörigen Auflistung enthalten sein. So kann z. B. ein Table-Objekt in einer Tables-Auflistung enthalten sein. Weitere Informationen erhalten Sie unter ADOX-Auflistungen oder unter einem der Themen zu den Auflistungen.


Catalog-Objekt (ADOX)

Catalog-Objekt

Enthält Auflistungen (Tables, Views, Users, Groups und Procedures), die den Schemakatalog einer Datenquelle erläutern.

Hinweise

Sie können das Catalog-Objekt ändern, indem Sie Objekte hinzufügen oder entfernen oder indem Sie vorhandene Objekte ändern. Einige Provider unterstützen möglicherweise nicht alle Catalog-Objekte oder nur das Anzeigen von Schemainformationen.

Mit den Eigenschaften und Methoden eines Catalog-Objekts können Sie Folgendes durchführen:

  • Öffnen des Katalogs, indem Sie die ActiveConnection-Eigenschaft auf ein Connection-Objekt von ADO oder eine gültige Verbindungszeichenfolge festlegen.

  • Erstellen eines neuen Katalogs mithilfe der Create-Methode.

  • Bestimmen der Eigentümer der Objekte in einem Catalog-Objekt mithilfe der GetObjectOwner- und SetObjectOwner-Methoden.


Column-Objekt (ADOX)

Column-Objekt

Stellt eine Spalte einer Tabelle, eines Indexes oder eines Schlüssels dar.

Hinweise

Der folgende Code erstellt ein neues Column-Objekt:

Dim obj As New Column

Mit den Eigenschaften und Auflistungen eines Column-Objekts können Sie Folgendes durchführen:

  • Identifizieren der Spalte mithilfe der Name-Eigenschaft.

  • Angeben des Datentyps der Spalte mithilfe der Type-Eigenschaft.

  • Bestimmen, ob die Spalte eine feste Länge hat oder ob sie Nullwerte enthalten kann, mithilfe der Attributes-Eigenschaft.

  • Angeben der maximalen Größe der Spalte mithilfe der DefinedSize-Eigenschaft.

  • Angeben der Skalierung für numerische Datenwerte mithilfe der NumericScale-Eigenschaft.

  • Angeben der maximalen Präzision für numerische Datenwerte mithilfe der Precision-Eigenschaft.

  • Angeben des Catalog-Objekts, das Eigentümer der Spalte ist, mithilfe der ParentCatalog-Eigenschaft.

  • Angeben des Namens der verbundenen Spalte in der verbundenen Tabelle für Schlüsselspalten mithilfe der RelatedColumn-Eigenschaft.

  • Angeben für Indexspalten, ob die Sortierreihenfolge aufsteigend oder absteigend ist, mithilfe der SortOrder-Eigenschaft.

  • Zugreifen auf providerspezifische Eigenschaften mithilfe der Properties-Auflistung.

    Anmerkung Möglicherweise unterstützt der Datenprovider nicht alle Eigenschaften von Column-Objekten. Wenn Sie einen Wert für eine vom Provider nicht unterstützte Eigenschaft festgelegt haben, tritt ein Fehler auf. Bei neuen Column-Objekten tritt der Fehler auf, wenn das Objekt an die Auflistung angehängt wird. Bei vorhandenen Objekten tritt der Fehler beim Festlegen der Eigenschaft auf.

    Beim Erstellen von Column-Objekten gewährleistet das Vorhandensein eines entsprechenden Standardwerts für eine optionale Eigenschaft nicht, dass der Provider die Eigenschaft unterstützt. Weitere Informationen zu den vom Provider unterstützten Eigenschaften finden Sie in der Dokumentation des Providers.


Group-Objekt (ADOX)

Group-Objekt

Stellt ein Gruppenkonto dar, das über Zugriffsberechtigungen innerhalb einer gesicherten Datenbank verfügt.

Hinweise

Die Groups-Auflistung eines Catalog-Objekts stellt alle Gruppenkonten des Katalogs dar. Die Groups-Auflistung für ein User-Objekt stellt nur die Gruppe dar, zu der der Benutzer gehört.

Mit den Eigenschaften, Auflistungen und Methoden eines Group-Objekts können Sie Folgendes durchführen:

  • Identifizieren der Gruppe mithilfe der Name-Eigenschaft.

  • Bestimmen, ob eine Gruppe über Schreib-, Lese- oder Löschberechtigungen verfügt, mithilfe der GetPermissions- und SetPermissions-Methoden.

  • Zugreifen auf die Benutzerkonten, die Mitglieder der Gruppe sind, mithilfe der Users-Auflistung.


Index-Objekt (ADOX)

Index-Objekt

Stellt einen Index einer Datenbanktabelle dar.

Hinweise

Der folgende Code erstellt ein neues Index-Objekt:

Dim obj As New Index

Mit den Eigenschaften und Auflistungen eines Index-Objekts können Sie Folgendes durchführen:

  • Identifizieren des Indexes mithilfe der Name-Eigenschaft.

  • Zugreifen auf die Datenbankspalten des Indexes mithilfe der Columns-Auflistung.

  • Angeben, ob die Indexschlüssel eindeutig sein müssen, mithilfe der Unique-Eigenschaft.

  • Angeben, ob es sich bei dem Index um den Primärschlüssel einer Tabelle handelt, mithilfe der PrimaryKey-Eigenschaft.

  • Angeben, ob Datensätze mit Nullwerten in den Indexfeldern Indexeinträge aufweisen, mithilfe der IndexNulls-Eigenschaft.

  • Angeben, ob der Index gruppiert ist, mithilfe der Clustered-Eigenschaft.

  • Zugreifen auf providerspezifische Indexeigenschaften mithilfe der Properties-Auflistung.

    Anmerkungen Ein Fehler tritt auf, wenn ein Column-Objekt an die Columns-Auflistung eines Index-Objekts angehängt wird, falls das Column-Objekt noch nicht in einem Table-Objekt existiert, das bereits an die Tables-Auflistung angehängt wurde.

    Möglicherweise unterstützt der Datenprovider nicht alle Eigenschaften von Index-Objekten. Wenn Sie einen Wert für eine Eigenschaft festgelegt haben, die vom Provider nicht unterstützt wird, tritt ein Fehler auf. Bei neuen Index-Objekten tritt der Fehler auf, wenn das Objekt an die Auflistung angehängt wird. Bei vorhandenen Objekten tritt der Fehler beim Festlegen der Eigenschaft auf.

    Beim Erstellen von Index-Objekten gewährleistet das Vorhandensein eines entsprechenden Standardwerts für eine optionale Eigenschaft nicht, dass der Provider die Eigenschaft unterstützt. Weitere Informationen zu den vom Provider unterstützten Eigenschaften finden Sie in der Dokumentation des Providers.


Key-Objekt (ADOX)

Key-Objekt

Stellt das Feld eines Primär-, eines Fremd- oder eines eindeutigen Schlüssels einer Datenbanktabelle dar.

Hinweise

Der folgende Code erstellt ein neues Key-Objekt:

Dim obj As New Key

Mit den Eigenschaften und Auflistungen eines Key-Objekts können Sie Folgendes durchführen:

  • Identifizieren des Schlüssels mithilfe der Name-Eigenschaft.

  • Bestimmen, ob es sich bei dem Schlüssel um einen Primär-, einen Fremd- oder einen eindeutigen Schlüssel handelt, mithilfe der Type-Eigenschaft.

  • Zugreifen auf die Datenbankspalten des Schlüssels mithilfe der Columns-Auflistung.

  • Angeben des Namens der verbundenen Tabelle mithilfe der RelatedTable-Eigenschaft.

  • Bestimmen, welche Aktion beim Löschen oder Aktualisieren eines Primärschlüssels durchgeführt werden soll, mithilfe der DeleteRule- und UpdateRule-Eigenschaften.


Procedure-Objekt (ADOX)

Procedure-Objekt

Stellt eine gespeicherte Prozedur dar. Wenn es in Verbindung mit dem Command-Objekt von ADO verwendet wird, kann das Procedure-Objekt zum Hinzufügen, Löschen oder Ändern gespeicherter Prozeduren verwendet werden.

Hinweise

Das Procedure-Objekt ermöglicht es Ihnen, eine gespeicherte Prozedur zu erstellen, ohne dass Sie die "CREATE PROCEDURE"-Syntax des Providers kennen oder verwenden müssen.

Mit den Eigenschaften eines Procedure-Objekts können Sie Folgendes durchführen:

  • Identifizieren der Prozedur mithilfe der Name-Eigenschaft.

  • Angeben des Command-Objekts von ADO, das zum Erstellen oder Ausführen der Prozedur verwendet werden kann, mithilfe der Command-Eigenschaft.

  • Zurückgeben von Datumsinformationen mithilfe der DateCreated- und DateModified-Eigenschaften.


Table-Objekt (ADOX)

Table-Objekt

Stellt eine Datenbanktabelle einschließlich Spalten, Indizes und Schlüsseln dar.

Hinweise

Der folgende Code erstellt ein neues Table-Objekt:

Dim obj As New Table

Mit den Eigenschaften und Auflistungen eines Table-Objekts können Sie Folgendes durchführen:

  • Identifizieren der Tabelle mithilfe der Name-Eigenschaft.

  • Bestimmen des Tabellentyps mithilfe der Type-Eigenschaft.

  • Zugreifen auf die Datenbankspalten der Tabelle mithilfe der Columns-Auflistung.

  • Zugreifen auf die Indizes der Tabelle mithilfe der Indexes-Auflistung.

  • Zugreifen auf die Schlüssel der Tabelle mithilfe der Keys-Auflistung.

  • Angeben des Catalog-Objekts, das Eigentümer der Tabelle ist, mithilfe der ParentCatalog-Eigenschaft.

  • Zurückgeben von Datumsinformationen mithilfe der DateCreated- und DateModified-Eigenschaften.

  • Zugreifen auf providerspezifische Tabelleneigenschaften mithilfe der Properties-Auflistung.

    Anmerkung Möglicherweise unterstützt der Datenprovider nicht alle Eigenschaften von Table-Objekten. Wenn Sie einen Wert für eine vom Provider nicht unterstützte Eigenschaft festgelegt haben, tritt ein Fehler auf. Bei neuen Table-Objekten tritt der Fehler auf, wenn das Objekt an die Auflistung angehängt wird. Bei vorhandenen Objekten tritt der Fehler beim Festlegen der Eigenschaft auf.

    Beim Erstellen von Table-Objekten gewährleistet das Vorhandensein eines entsprechenden Standardwerts für eine optionale Eigenschaft nicht, dass der Provider die Eigenschaft unterstützt. Weitere Informationen zu den vom Provider unterstützten Eigenschaften finden Sie in der Dokumentation des Providers.


User-Objekt (ADOX)

User-Objekt

Stellt ein Benutzerkonto dar, das über Zugriffsberechtigungen innerhalb einer gesicherten Datenbank verfügt.

Hinweise

Die Users-Auflistung eines Catalog-Objekts stellt alle Benutzer des Catalog-Objekts dar. Die Users-Auflistung eines Group-Objekts stellt nur die Benutzer der betreffenden Gruppe dar.

Mit den Eigenschaften, Auflistungen und Methoden eines User-Objekts können Sie Folgendes durchführen:

  • Identifizieren des Benutzers mithilfe der Name-Eigenschaft.

  • Ändern des Kennworts eines Benutzers mithilfe der ChangePassword-Methode.

  • Bestimmen, ob ein Benutzer über Schreib-, Lese- oder Löschberechtigungen verfügt, mithilfe der GetPermissions- und SetPermissions-Methoden.

  • Zugreifen auf die Gruppen, zu denen ein Benutzer gehört, mithilfe der Groups-Auflistung.


View-Objekt (ADOX)

View-Objekt

Stellt eine gefilterte Menge von Datensätzen oder eine virtuelle Tabelle dar. Wenn es in Verbindung mit dem Command-Objekt von ADO verwendet wird, kann das View-Objekt zum Hinzufügen, Löschen oder Ändern von Ansichten verwendet werden.

Hinweise

Eine Ansicht ist eine virtuelle Tabelle, die aus anderen Datenbanktabellen oder Ansichten erstellt wurde. Das View-Objekt ermöglicht es Ihnen, eine Ansicht zu erstellen, ohne dass Sie die "CREATE VIEW"-Syntax des Providers kennen oder verwenden müssen.

Mit den Eigenschaften eines View-Objekts können Sie Folgendes durchführen:

  • Identifizieren der Ansicht mithilfe der Name-Eigenschaft.

  • Angeben des Command-Objekts von ADO, das zum Hinzufügen, Löschen oder Ändern von Ansichten verwendet werden kann, mithilfe der Command-Eigenschaft.

  • Zurückgeben von Datumsinformationen mithilfe der DateCreated- und DateModified-Eigenschaften.


ADOX-Auflistungen

ADOX-Auflistungen - Zusammenfassung

Auflistung | Beschreibung
Spalten | Enthält alle Column-Objekte einer Tabelle, eines Indexes oder eines Schlüssels.
Gruppen | Enthält alle gespeicherten Group-Objekte eines Katalogs oder Benutzers.
Indizes | Enthält alle Index-Objekte einer Tabelle.
Schlüssel | Enthält alle Key-Objekte einer Tabelle.
Prozeduren | Enthält alle Procedure-Objekte eines Katalogs.
Tabellen | Enthält alle Table-Objekte eines Katalogs.
Benutzer | Enthält alle gespeicherten User-Objekte eines Katalogs oder einer Gruppe.
Ansichten | Enthält alle View-Objekte eines Katalogs.


Columns-Auflistung (ADOX)

Columns-Auflistung

Enthält alle Column-Objekte einer Tabelle, eines Indexes oder eines Schlüssels.

Hinweise

Die Append-Methode für eine Columns-Auflistung ist eine Eigenheit von ADOX. Sie können Folgendes durchführen:

  • Hinzufügen einer neuen Spalte zur Auflistung mithilfe der Append-Methode.

Die übrigen Eigenschaften und Methoden gehören zum Standard der ADO-Auflistungen. Sie können Folgendes durchführen:

  • Zugreifen auf eine Spalte in der Auflistung mithilfe der Item-Eigenschaft.

  • Zurückgeben der Anzahl der in der Auflistung enthaltenen Spalten mithilfe der Count-Eigenschaft.

  • Entfernen einer Spalte aus der Auflistung mithilfe der Delete-Methode.

  • Aktualisieren der Objekte in der Auflistung mithilfe der Refresh-Methode, um das Schema der aktuellen Datenbank anzuzeigen.

    Anmerkung Ein Fehler tritt auf, wenn ein Column-Objekt an die Columns-Auflistung eines Index-Objekts angehängt wird, falls das Column-Objekt noch nicht in einem Table-Objekt existiert, das bereits an die Tables-Auflistung angehängt wurde.


Groups-Auflistung (ADOX)

Groups-Auflistung

Enthält alle gespeicherten Group-Objekte eines Katalogs oder Benutzers.

Hinweise

Die Groups-Auflistung eines Catalog-Objekts stellt alle Gruppenkonten des Katalogs dar. Die Groups-Auflistung für ein User-Objekt stellt nur die Gruppe dar, zu der der Benutzer gehört.

Die Append-Methode für eine Groups-Auflistung ist eine Eigenheit von ADOX. Sie können Folgendes durchführen:

  • Hinzufügen einer neuen Sicherheitsgruppe zur Auflistung mithilfe der Append-Methode.

Die übrigen Eigenschaften und Methoden gehören zum Standard der ADO-Auflistungen. Sie können Folgendes durchführen:

  • Zugreifen auf eine Gruppe in der Auflistung mithilfe der Item-Eigenschaft.

  • Zurückgeben der Anzahl der in der Auflistung enthaltenen Gruppen mithilfe der Count-Eigenschaft.

  • Entfernen einer Gruppe aus der Auflistung mithilfe der Delete-Methode.

  • Aktualisieren der Objekte in der Auflistung mithilfe der Refresh-Methode, um das Schema der aktuellen Datenbank anzuzeigen.

    Anmerkung Vor dem Anhängen eines Group-Objekts an die Groups-Auflistung eines User-Objekts muss in der Groups-Auflistung des Catalog-Objekts bereits ein Group-Objekt mit dem gleichen Namen wie das anzuhängende Objekt existieren.


Index-Auflistung (ADOX)

Index-Auflistung

Enthält alle Index-Objekte einer Tabelle.

Hinweise

Die Append-Methode für eine Index-Auflistung ist eine Eigenheit von ADOX. Sie können Folgendes durchführen:

  • Hinzufügen eines neuen Indexes zur Auflistung mithilfe der Append-Methode.

Die übrigen Eigenschaften und Methoden gehören zum Standard der ADO-Auflistungen. Sie können Folgendes durchführen:

  • Zugreifen auf einen Index in der Auflistung mithilfe der Item-Eigenschaft.

  • Zurückgeben der Anzahl der in der Auflistung enthaltenen Indizes mithilfe der Count-Eigenschaft.

  • Entfernen eines Indexes aus der Auflistung mithilfe der Delete-Methode.

  • Aktualisieren der Objekte in der Auflistung mithilfe der Refresh-Methode, um das Schema der aktuellen Datenbank anzuzeigen.


Keys-Auflistung (ADOX)

Keys-Auflistung

Enthält alle Key-Objekte einer Tabelle.

Hinweise

Die Append-Methode für eine Keys-Auflistung ist eine Eigenheit von ADOX. Sie können Folgendes durchführen:

  • Hinzufügen eines neuen Schlüssels zur Auflistung mithilfe der Append-Methode.

Die übrigen Eigenschaften und Methoden gehören zum Standard der ADO-Auflistungen. Sie können Folgendes durchführen:

  • Zugreifen auf einen Schlüssel in der Auflistung mithilfe der Item-Eigenschaft.

  • Zurückgeben der Anzahl der in der Auflistung enthaltenen Schlüssel mithilfe der Count-Eigenschaft.

  • Entfernen eines Schlüssels aus der Auflistung mithilfe der Delete-Methode.

  • Aktualisieren der Objekte in der Auflistung mithilfe der Refresh-Methode, um das Schema der aktuellen Datenbank anzuzeigen.


Procedures-Auflistung (ADOX)

Procedures-Auflistung

Enthält alle Procedure-Objekte eines Katalogs.

Hinweise

Die Append-Methode für eine Procedures-Auflistung ist eine Eigenheit von ADOX. Sie können Folgendes durchführen:

  • Hinzufügen einer neuen Prozedur zur Auflistung mithilfe der Append-Methode.

Die übrigen Eigenschaften und Methoden gehören zum Standard der ADO-Auflistungen. Sie können Folgendes durchführen:

  • Zugreifen auf eine Prozedur in der Auflistung mithilfe der Item-Eigenschaft.

  • Zurückgeben der Anzahl der in der Auflistung enthaltenen Prozeduren mithilfe der Count-Eigenschaft.

  • Entfernen einer Prozedur aus der Auflistung mithilfe der Delete-Methode.

  • Aktualisieren der Objekte in der Auflistung mithilfe der Refresh-Methode, um das Schema der aktuellen Datenbank anzuzeigen.


Tables-Auflistung (ADOX)

Tables-Auflistung

Enthält alle Table-Objekte eines Katalogs.

Hinweise

Die Append-Methode für eine Tables-Auflistung ist eine Eigenheit von ADOX. Sie können Folgendes durchführen:

  • Hinzufügen einer neuen Tabelle zur Auflistung mithilfe der Append-Methode.

Die übrigen Eigenschaften und Methoden gehören zum Standard der ADO-Auflistungen. Sie können Folgendes durchführen:

  • Zugreifen auf eine Tabelle in der Auflistung mithilfe der Item-Eigenschaft.

  • Zurückgeben der Anzahl der in der Auflistung enthaltenen Tabellen mithilfe der Count-Eigenschaft.

  • Entfernen einer Tabelle aus der Auflistung mithilfe der Delete-Methode.

  • Aktualisieren der Objekte in der Auflistung mithilfe der Refresh-Methode, um das Schema der aktuellen Datenbank anzuzeigen.

Möglicherweise geben einige Provider in der Tables-Auflistung andere Schemaobjekte zurück, wie beispielsweise ein View-Objekt. Daher enthalten einige ADOX-Auflistungen möglicherweise Referenzen auf dasselbe Objekt. Falls Sie das Objekt aus einer Auflistung löschen, ist diese Änderung in einer anderen Auflistung, die auf das gelöschte Objekt verweist, erst sichtbar, wenn die Refresh-Methode in der Auflistung aufgerufen wird. Es werden beispielsweise beim OLE DB-Provider für Microsoft Jet, View-Objekte mit der Tables-Auflistung zurückgegeben. Legen Sie eine Ansicht ab, müssen Sie die Tables-Auflistung aktualisieren, bevor die Auflistung die Änderung widerspiegelt.


Users-Auflistung (ADOX)

Users-Auflistung

Enthält alle gespeicherten User-Objekte eines Catalog- oder Group-Objekts.

Hinweise

Die Users-Auflistung eines Catalog-Objekts stellt alle Benutzer des Katalogs dar. Die Users-Auflistung eines Group-Objekts stellt nur die Benutzer dar, die Mitglied der entsprechenden Gruppe sind.

Die Append-Methode für eine Users-Auflistung ist eine Eigenheit von ADOX. Sie können Folgendes durchführen:

  • Hinzufügen eines neuen Benutzers zur Auflistung mithilfe der Append-Methode.

Die übrigen Eigenschaften und Methoden gehören zum Standard der ADO-Auflistungen. Sie können Folgendes durchführen:

  • Zugreifen auf einen Benutzer in der Auflistung mithilfe der Item-Eigenschaft.

  • Zurückgeben der Anzahl der in der Auflistung enthaltenen Benutzer mithilfe der Count-Eigenschaft.

  • Entfernen eines Benutzers aus der Auflistung mithilfe der Delete-Methode.

  • Aktualisieren der Objekte in der Auflistung mithilfe der Refresh-Methode, um das Schema der aktuellen Datenbank anzuzeigen.

    Anmerkung Vor dem Anhängen eines User-Objekts an die Users-Auflistung eines Group-Objekts muss in der Users-Auflistung des Catalog-Objekts bereits ein User-Objekt mit dem gleichen Namen wie das anzuhängende Objekt existieren.


Views-Auflistung (ADOX)

Views-Auflistung

Enthält alle View-Objekte eines Katalogs.

Hinweise

Die Append-Methode für eine Views-Auflistung ist eine Eigenheit von ADOX. Sie können Folgendes durchführen:

  • Hinzufügen einer neuen Ansicht zur Auflistung mithilfe der Append-Methode.

Die übrigen Eigenschaften und Methoden gehören zum Standard der ADO-Auflistungen. Sie können Folgendes durchführen:

  • Zugreifen auf eine Ansicht in der Auflistung mithilfe der Item-Eigenschaft.

  • Zurückgeben der Anzahl der in der Auflistung enthaltenen Ansichten mithilfe der Count-Eigenschaft.

  • Entfernen einer Spalte aus der Auflistung mithilfe der Delete-Methode.

  • Aktualisieren der Objekte in der Auflistung mithilfe der Refresh-Methode, um das Schema der aktuellen Datenbank anzuzeigen.


ADOX-Eigenschaften

ADOX-Eigenschaft - Zusammenfassung

Eigenschaft | Beschreibung
ActiveConnection | Gibt das ADO Connection-Objekt an, zu dem der Katalog gehört.
Attributes | Beschreibt die Spaltenmerkmale.
Clustered | Gibt an, ob der Index gruppiert ist.
Command | Gibt ein ADO Command-Objekt an, das zum Erstellen oder Ausführen der Prozedur verwendet werden kann.
Count | Gibt die Anzahl der Objekte in einer Auflistung an.
DateCreated | Gibt das Datum an, an dem das Objekt erstellt wurde.
DateModified | Gibt das Datum an, an dem das Objekt zuletzt geändert wurde.
DefinedSize | Gibt die festgelegte maximale Größe der Spalte an.
DeleteRule | Gibt die Aktion an, die beim Löschen eines Primärschlüssels ausgeführt wird.
IndexNulls | Gibt an, ob Datensätze mit Nullwerten in den Indexfeldern Indexeinträge aufweisen.
Name | Gibt den Namen des Objekts an.
NumericScale | Gibt die Skalierung der numerischen Werte in der Spalte an.
ParentCatalog | Gibt den übergeordneten Katalog einer Tabelle oder Spalte an, um den Zugriff auf providerspezifische Eigenschaften bereitzustellen.
Precision | Gibt die maximale Genauigkeit von Datenwerten in Spalten an.
PrimaryKey | Gibt an, ob der Index den Primärschlüssel in der Tabelle darstellt.
RelatedColumn | Gibt den Namen der zugehörigen Spalte in der verbundenen Tabelle an (nur Schlüsselspalten).
RelatedTable | Gibt den Namen der verbundenen Tabelle an.
SortOrder | Gibt die Sortierreihenfolge für die Spalte an (nur Indexspalten).
Type (Column) | Gibt den Datentyp einer Spalte an.
Type (Key) | Gibt den Datentyp eines Schlüssels an.
Type (Table) | Gibt den Tabellentyp an.
Unique | Gibt an, ob die Indexschlüssel eindeutig sein müssen.
UpdateRule | Gibt die Aktion an, die beim Aktualisieren eines Primärschlüssels ausgeführt wird.


ActiveConnection-Eigenschaft (ADOX)

ActiveConnection-Eigenschaft

Gibt das ADO Connection-Objekt an, zu dem das Catalog-Objekt gehört.

Einstellungen und Rückgabewerte

Legt ein Connection-Objekt oder einen Wert vom Datentyp String fest, der die Definition für eine Verbindung enthält. Gibt das aktive Connection-Objekt zurück.

Hinweise

Der Standardwert ist ein Nullobjektverweis.


Attributes-Eigenschaft (ADOX)

Attributes-Eigenschaft

Beschreibt die Spaltenmerkmale.

Einstellungen und Rückgabewerte

Legt einen Wert vom Datentyp Long fest oder gibt diesen zurück. Der Wert gibt die Merkmale der Tabelle an, die vom Column-Objekt dargestellt werden. Dabei kann es sich um eine Kombination von ColumnAttributesEnum-Konstanten handeln: Der Standardwert ist Null (0); dies ist weder adColFixed noch adColNullable.


Clustered-Eigenschaft (ADOX)

Clustered-Eigenschaft

Gibt an, ob der Index gruppiert ist.

Einstellungen und Rückgabewerte

Legt einen booleschen Wert fest und gibt diesen zurück.

Hinweise

Der Standardwert ist False.

Diese Eigenschaft ist bei Index-Objekten, die bereits an eine Auflistung angehängt wurden, schreibgeschützt.


Command-Eigenschaft (ADOX)

Command-Eigenschaft

Gibt ein ADO Command-Objekt an, das zum Erstellen oder Ausführen der Prozedur verwendet werden kann.

Einstellungen und Rückgabewerte

Legt ein gültiges ADO Command-Objekt fest oder gibt dieses zurück.

Hinweise

Unterstützt der Provider keine beständigen Befehle, tritt beim Übertragen bzw. Festlegen dieser Eigenschaft ein Fehler auf.


DateCreated-Eigenschaft (ADOX)

DateCreated-Eigenschaft

Gibt das Datum an, an dem das Objekt erstellt wurde.

Rückgabewerte

Gibt einen Wert vom Datentyp Variant zurück, der das Erstellungsdatum angibt. Der Wert ist Null, wenn der Provider DateCreated nicht unterstützt.

Hinweise

Die DateCreated-Eigenschaft beträgt bei neu angehängten Objekten Null. Nach dem Anhängen eines neuen View- oder Procedure-Objekts müssen Sie die Refresh-Methode der Auflistung Views oder Procedures aufrufen, um Werte für die DateCreated-Eigenschaft zu erhalten.


DateModified-Eigenschaft (ADOX)

DateModified-Eigenschaft

Gibt das Datum an, an dem das Objekt zuletzt geändert wurde.

Rückgabewerte

Gibt einen Wert vom Datentyp Variant zurück, der das Änderungsdatum angibt. Der Wert ist Null, wenn der Provider DateModified nicht unterstützt.

Hinweise

Die DateModified-Eigenschaft beträgt bei neu angehängten Objekten Null. Nach dem Anhängen eines neuen View- oder Procedure-Objekts müssen Sie die Refresh-Methode der Auflistung Views oder Procedures aufrufen, um Werte für die DateModified-Eigenschaft zu erhalten.


DefinedSize-Eigenschaft (ADOX)

DefinedSize-Eigenschaft

Gibt die festgelegte maximale Größe der Spalte an.

Einstellungen und Rückgabewerte

Legt einen Wert vom Datentyp Long fest, der der maximalen Zeichenlänge von Datenwerten entspricht, oder gibt diesen zurück.

Hinweise

Der Standardwert ist Null (0).

Diese Eigenschaft ist bei Column-Objekten, die bereits an eine Auflistung angehängt wurden, schreibgeschützt.


DeleteRule-Eigenschaft (ADOX)

DeleteRule-Eigenschaft

Gibt die Aktion an, die beim Löschen eines Primärschlüssels ausgeführt wird.

Einstellungen und Rückgabewerte

Legt einen Wert vom Datentyp Long fest oder gibt diesen Wert zurück, bei dem es sich um eine der RuleEnum-Konstanten handeln kann. Der Standardwert ist adRINone.

Hinweise

Diese Eigenschaft ist bei Key-Objekten, die bereits an eine Auflistung angehängt wurden, schreibgeschützt.


IndexNulls-Eigenschaft (ADOX)

IndexNulls-Eigenschaft

Gibt an, ob Datensätze mit Nullwerten in den Indexfeldern Indexeinträge aufweisen.

Einstellungen und Rückgabewerte

Legt einen AllowNullsEnum-Wert fest und gibt diesen zurück. Der Standardwert ist adIndexNullsDisallow.

Hinweise

Diese Eigenschaft ist bei Index-Objekten, die bereits an eine Auflistung angehängt wurden, schreibgeschützt.


Name-Eigenschaft (ADOX)

Name-Eigenschaft

Gibt den Namen des Objekts an.

Einstellungen und Rückgabewerte

Legt einen Wert vom Datentyp String fest oder gibt einen solchen zurück.

Hinweise

Namen können innerhalb einer Auflistung mehrmals verwendet werden.

Die Name–Eigenschaft ist bei den Objekten Column, Group, Key, Index, Table und User schreibgeschützt. Die Name-Eigenschaft ist bei den Objekten Catalog, Procedure und View schreibgeschützt.

Bei Objekten mit Schreib-/Lesezugriff (Column, Group, Key, Index, Table und User) ist der Standardwert eine leere Zeichenfolge ("").

Anmerkungen

  • Für Schlüssel ist diese Eigenschaft bei Key-Objekten, die bereits an eine Auflistung angehängt wurden, schreibgeschützt.

  • Für Tabellen ist diese Eigenschaft bei Table-Objekten, die bereits an eine Auflistung angehängt wurden, schreibgeschützt.


NumericScale-Eigenschaft (ADOX)

NumericScale-Eigenschaft

Gibt die Skalierung der numerischen Werte in der Spalte an.

Einstellungen und Rückgabewerte

Legt einen Wert vom Datentyp Byte fest und gibt diesen zurück. Hierbei kann es sich um die Skalierung von Datenwerten in der Spalte handeln, wenn als Type-Eigenschaft adNumeric oder adDecimal festgelegt ist. NumericScale wird für alle anderen Datentypen ignoriert.

Hinweise

Der Standardwert ist Null (0).

NumericScale ist bei Column-Objekten, die bereits an eine Auflistung angehängt wurden, schreibgeschützt.


ParentCatalog-Eigenschaft (ADOX)

ParentCatalog-Eigenschaft

Gibt den übergeordneten Katalog einer Tabelle oder Spalte an, um den Zugriff auf providerspezifische Eigenschaften bereitzustellen.

Einstellungen und Rückgabewerte

Legt ein Catalog-Objekt fest und gibt dieses zurück. Das Festlegen von ParentCatalog für ein geöffnetes Catalog-Objekt ermöglicht den Zugriff auf providerspezifische Eigenschaften, bevor eine Tabelle oder Spalte einer Catalog-Auflistung angehängt wird.

Hinweise

Einige Datenprovider erlauben das Schreiben von providerspezifischen Eigenschaftswerten nur bei der Erstellung (wenn eine Tabelle oder Spalte der zugehörigen Catalog-Auflistung angehängt wird). Geben Sie zunächst den Catalog in den ParentCatalog-Eigenschaften an, um auf diese Eigenschaften zugreifen zu können, bevor Sie diese Objekte einem Catalog hinzufügen.

Wird die Tabelle oder Spalte einem anderen Catalog als dem ParentCatalog hinzugefügt, tritt ein Fehler auf.


Precision-Eigenschaft (ADOX)

Precision-Eigenschaft

Gibt die maximale Genauigkeit von Datenwerten in Spalten an.

Einstellungen und Rückgabewerte

Legt einen Wert vom Datentyp Long fest und gibt diesen zurück. Hierbei handelt es sich um die maximale Genauigkeit von Datenwerten in Spalten, wenn die Type-Eigenschaft einen numerischen Typ aufweist. Precision wird für alle anderen Datentypen ignoriert.

Hinweise

Der Standardwert ist Null (0).

Diese Eigenschaft ist bei Column-Objekten, die bereits an eine Auflistung angehängt wurden, schreibgeschützt.


PrimaryKey-Eigenschaft (ADOX)

PrimaryKey-Eigenschaft

Gibt an, ob der Index den Primärschlüssel in der Tabelle darstellt.

Einstellungen und Rückgabewerte

Legt einen booleschen Wert fest und gibt diesen zurück.

Hinweise

Der Standardwert ist False.

Diese Eigenschaft ist bei Index-Objekten, die bereits an eine Auflistung angehängt wurden, schreibgeschützt.


RelatedColumn-Eigenschaft (ADOX)

RelatedColumn-Eigenschaft

Gibt den Namen der zugehörigen Spalte in der verbundenen Tabelle an (nur Schlüsselspalten).

Einstellungen und Rückgabewerte

Legt einen Wert vom Datentyp String fest und gibt diesen zurück. Hierbei handelt es sich um den Namen der zugehörigen Spalte in der verbundenen Tabelle.

Hinweise

Der Standardwert ist eine leere Zeichenfolge ("").

Diese Eigenschaft ist bei Column-Objekten, die bereits an eine Auflistung angehängt wurden, schreibgeschützt.


RelatedTable-Eigenschaft (ADOX)

RelatedTable-Eigenschaft

Gibt den Namen der verbundenen Tabelle an.

Einstellungen und Rückgabewerte

Legt einen Wert vom Datentyp String fest und gibt diesen zurück.

Hinweise

Der Standardwert ist eine leere Zeichenfolge ("").

Handelt es sich bei dem Schlüssel um einen Fremdschlüssel, ist RelatedTable der Name der Tabelle, die den Schlüssel enthält.


SortOrder-Eigenschaft (ADOX)

SortOrder-Eigenschaft

Gibt die Sortierreihenfolge für die Spalte an (nur Indexspalten).

Einstellungen und Rückgabewerte

Legt einen Wert vom Datentyp Long fest oder gibt diesen Wert zurück, bei dem es sich um eine der SortOrderEnum-Konstanten handeln kann. Der Standardwert ist adSortAscending.

Hinweise

Diese Eigenschaft betrifft nur Column-Objekte in der Columns-Auflistung eines Index.


Type-Eigenschaft (Column) (ADOX)

Type-Eigenschaft (Column)

Gibt den Datentyp einer Spalte an.

Einstellungen und Rückgabewerte

Legt einen Wert vom Datentyp Long fest oder gibt diesen Wert zurück, bei dem es sich um eine der DataTypeEnum-Konstanten handeln kann. Der Standardwert ist adVarWChar.

Hinweise

Diese Eigenschaft bietet Schreib-/Lesezugriff, bis das Column-Objekt an eine Auflistung oder ein anderes Objekt angehängt wurde. Anschließend ist sie schreibgeschützt.


Type-Eigenschaft (Key) (ADOX)

Type-Eigenschaft (Key)

Gibt den Typ eines Schlüssels an.

Einstellungen und Rückgabewerte

Legt einen Wert vom Datentyp Long fest oder gibt diesen Wert zurück, bei dem es sich um eine der KeyTypeEnum-Konstanten handeln kann. Der Standardwert ist adKeyPrimary.

Hinweise

Diese Eigenschaft ist bei Key-Objekten, die bereits an eine Auflistung angehängt wurden, schreibgeschützt.


Type-Eigenschaft (Table) (ADOX)

Type-Eigenschaft (Table)

Gibt den Tabellentyp an.

Rückgabewerte

Gibt einen Wert vom Datentyp String zurück, der den Tabellentyp angibt, z. B. "TABELLE", "SYSTEMTABELLE" oder "GLOBAL TEMPORÄR".

Hinweise

Die Eigenschaft ist schreibgeschützt.


Unique-Eigenschaft (ADOX)

Unique-Eigenschaft

Gibt an, ob die Indexschlüssel eindeutig sein müssen.

Einstellungen und Rückgabewerte

Legt einen booleschen Wert fest und gibt diesen zurück.

Hinweise

Der Standardwert ist False.

Diese Eigenschaft ist bei Index-Objekten, die bereits an eine Auflistung angehängt wurden, schreibgeschützt.


UpdateRule-Eigenschaft (ADOX)

UpdateRule-Eigenschaft

Gibt die Aktion an, die beim Aktualisieren eines Primärschlüssels ausgeführt wird.

Einstellungen und Rückgabewerte

Legt einen Wert vom Datentyp Long fest oder gibt diesen Wert zurück, bei dem es sich um eine der RuleEnum-Konstanten handeln kann. Der Standardwert ist adRINone.

Hinweise

Diese Eigenschaft ist bei Key-Objekten, die bereits an die Auflistung angehängt wurden, schreibgeschützt.


ADOX-Methoden

Zusammenfassung der ADOX-Methoden

Methode | Beschreibung
Append (Spalten) | Fügt der Columns-Auflistung ein neues Column-Objekt hinzu.
Append (Gruppen) | Fügt der Groups-Auflistung ein neues Group-Objekt hinzu.
Append (Indizes) | Fügt der Indexes-Auflistung ein neues Index-Objekt hinzu.
Append (Schlüssel) | Fügt der Keys-Auflistung ein neues Key-Objekt hinzu.
Append (Prozeduren) | Fügt der Procedures-Auflistung ein neues Procedure-Objekt hinzu.
Append (Tabellen) | Fügt der Tables-Auflistung ein neues Table-Objekt hinzu.
Append (Benutzer) | Fügt der Users-Auflistung ein neues User-Objekt hinzu.
Append (Ansichten) | Fügt der Views-Auflistung ein neues View-Objekt hinzu.
ChangePassword | Ändert das Kennwort für ein Benutzerkonto.
Create | Erstellt einen neuen Katalog.
Delete | Entfernt ein Objekt aus einer Auflistung.
GetObjectOwner | Gibt den Eigentümer eines Objekts in einem Katalog zurück.
GetPermissions | Gibt die Berechtigungen einer Gruppe oder eines Benutzers für ein Objekt zurück.
Refresh | Aktualisiert die Objekte in einer Auflistung, um Objekte aufzunehmen, die vom Provider erhältlich und spezifisch für ihn sind.
SetObjectOwner | Gibt den Eigentümer eines Objekts in einem Katalog an.
SetPermissions | Gibt die Berechtigungen einer Gruppe oder eines Benutzers für ein Objekt an.


Append-Methode (ADOX Columns)

Append-Methode (Columns)

Fügt der Columns-Auflistung ein neues Column-Objekt hinzu.

Syntax

Columns.Append Column [, Type] [, DefinedSize]

Parameter

Column Das anzuhängende Column-Objekt oder der Name der Spalte, die erstellt und angehängt werden soll.

Type Optional. Ein Wert vom Datentyp Long, der den Datentyp der Spalte angibt. Der Parameter Type entspricht der Type-Eigenschaft eines Column-Objekts.

DefinedSize Optional. Ein Wert vom Datentyp Long, der die Größe der Spalte angibt. Der Parameter DefinedSize entspricht der DefinedSize-Eigenschaft eines Column-Objekts.

Anmerkung Ein Fehler tritt auf, wenn ein Column-Objekt an die Columns-Auflistung eines Index-Objekts angehängt wird, falls das Column-Objekt noch nicht in einem Table-Objekt existiert, das bereits an die Tables-Auflistung angehängt wurde.


Append-Methode (ADOX Groups)

Append-Methode (Groups)

Fügt der Groups-Auflistung ein neues Group-Objekt hinzu.

Syntax

Groups.Append Group

Parameter

Group Das anzuhängende Group-Objekt oder der Name der Gruppe, die erstellt und angehängt werden soll.

Hinweise

Die Groups-Auflistung eines Catalog-Objekts stellt alle Gruppenkonten des Katalogs dar. Die Groups-Auflistung für ein User-Objekt stellt nur die Gruppe dar, zu der der Benutzer gehört.

Es tritt ein Fehler auf, wenn der Provider das Erstellen von Gruppen nicht unterstützt.

Anmerkung Vor dem Anhängen eines Group-Objekts an die Groups-Auflistung eines User-Objekts muss in der Groups-Auflistung des Catalog-Objekts bereits ein Group-Objekt mit dem gleichen Namen wie das anzuhängende Objekt existieren.


Append-Methode (ADOX Indexes)

Append-Methode (Indexes)

Fügt der Indexes-Auflistung ein neues Index-Objekt hinzu.

Syntax

Indexes.Append Index [, Columns]

Parameter

Index Das anzuhängende Index-Objekt oder der Name des Indexes, der erstellt und angehängt werden soll.

Columns Optional. Ein Wert vom Datentyp Variant, der den/die Namen der zu indizierenden Spalte(n) angibt. Der Parameter Columns entspricht dem Wert/den Werten der Name-Eigenschaft eines oder mehrerer Column-Objekte.

Hinweise

Der Parameter Columns kann entweder einen Spaltennamen oder ein Array von Spaltennamen verwenden.

Ein Fehler tritt auf, wenn der Provider das Erstellen von Indizes nicht unterstützt.


Append-Methode (ADOX Keys)

Append-Methode (Keys)

Fügt der Keys-Auflistung ein neues Key-Objekt hinzu.

Syntax

Keys.Append Key [, KeyType] [, Column] [, RelatedTable] [, RelatedColumn]

Parameter

Key Das anzuhängende Key-Objekt oder der Name des Schlüssels, der erstellt und angehängt werden soll.

KeyType Optional. Ein Wert vom Datentyp Long, der den Schlüsseltyp angibt. Der Parameter Key entspricht der Type-Eigenschaft eines Key-Objekts.

Column Optional. Ein Wert vom Datentyp String, der den Namen der zu indizierenden Spalte angibt. Der Parameter Columns entspricht dem Wert der Name-Eigenschaft eines Column-Objekts.

RelatedTable Optional. Ein Wert vom Datentyp String, der den Namen der verbundenen Tabelle angibt. Der Parameter RelatedTable entspricht dem Wert der Name-Eigenschaft eines Table-Objekts.

RelatedColumn Optional. Ein Wert vom Datentyp String, der den Namen der verbundenen Spalte für einen unbekannten Schlüssel angibt. Der Parameter RelatedColumn entspricht dem Wert der Name-Eigenschaft eines Column-Objekts.

Hinweise

Der Parameter Columns kann entweder einen Spaltennamen oder ein Array von Spaltennamen verwenden.


Append-Methode (ADOX Procedures)

Append-Methode (Procedures)

Fügt der Procedures-Auflistung ein neues Procedure-Objekt hinzu.

Syntax

Procedures.Append Name, Command

Parameter

Name Ein Wert vom Datentyp String, der den Namen der Prozedur angibt, die erstellt und angehängt werden soll.

Command Ein Command-Objekt von ADO, das die Prozedur darstellt, die erstellt und angehängt werden soll.

Hinweise

Erstellt eine neue Prozedur in der Datenquelle mit dem Namen und den Attributen, die im Command-Objekt angegeben sind.

Stellt der vom Benutzer angegebene Befehlstext eine Ansicht und nicht eine Prozedur dar, hängt das Verhalten vom jeweils verwendeten Provider ab. Die Append-Methode schlägt fehl, wenn der Provider keine beständigen Befehle unterstützt.

Anmerkung: Beim Verwenden von OLE DB-Provider für Microsoft Jet ermöglicht die Append-Methode der Procedures-Auflistung im Parameter Command die Angabe von View und nicht von Procedure. Das View-Objekt wird zur Datenquelle und anschließend zur Procedures-Auflistung hinzugefügt. Werden die Procedures- und Views-Auflistungen aktualisiert, steht das View-Objekt nach einem Append-Vorgang nicht länger in der Procedures-Auflistung zur Verfügung und wird in der Views-Auflistung aufgeführt.


Append-Methode (ADOX Tables)

Append-Methode (Tables)

Fügt der Tables-Auflistung ein neues Table-Objekt hinzu.

Syntax

Tables.Append Table

Parameter

Table Ein Wert vom Datentyp Variant, der eine Referenz auf das anzuhängende Table-Objekt oder den Namen der zu erstellenden und anzuhängenden Tabelle enthält.

Hinweise

Ein Fehler tritt auf, wenn der Provider das Erstellen von Tabellen nicht unterstützt.


Append-Methode (ADOX Users)

Append-Methode (Users)

Fügt der Users-Auflistung ein neues User-Objekt hinzu.

Syntax

Users.Append User[, Password]

Parameter

User Ein Wert vom Datentyp Variant, der das anzuhängende User-Objekt oder den Namen des zu erstellenden und anzuhängenden Benutzers enthält.

Password Optional. Ein Wert vom Datentyp String, der das Kennwort für den Benutzer enthält. Der Parameter Password entspricht dem von der ChangePassword-Methode eines User-Objekts angegebenen Wert.

Hinweise

Die Users-Auflistung eines Catalog-Objekts stellt alle Benutzer des Katalogs dar. Die Users-Auflistung eines Group-Objekts stellt nur die Benutzer dar, die Mitglied der entsprechenden Gruppe sind.

Es tritt ein Fehler auf, wenn der Provider das Erstellen von Benutzern nicht unterstützt.

Anmerkung Vor dem Anhängen eines User-Objekts an die Users-Auflistung eines Group-Objekts muss in der Users-Auflistung des Catalog-Objekts bereits ein User-Objekt mit dem gleichen Namen wie das anzuhängende Objekt existieren.


Append-Methode (ADOX Views)

Append-Methode (Views)

Erstellt ein neues View-Objekt und hängt es an die Views-Auflistung an.

Syntax

Views.Append Name, Command

Parameter

Name Ein Wert vom Datentyp String, der den Namen der zu erstellenden Ansicht angibt.

Command Ein Command-Objekt von ADO, das die zu erstellende Ansicht darstellt.

Hinweise

Erstellt eine neue Ansicht in der Datenquelle mit dem Namen und den Attributen, die im Command-Objekt angegeben sind.

Stellt der vom Benutzer angegebene Befehlstext eine Prozedur und nicht eine Ansicht dar, hängt das Verhalten vom jeweils verwendeten Provider ab. Die Append-Methode schlägt fehl, wenn der Provider keine beständigen Befehle unterstützt.

Anmerkung: Beim Verwenden von OLE DB-Provider für Microsoft Jet ermöglicht die Append-Methode der Views-Auflistung im Parameter Command die Angabe von Procedure und nicht von View. Das Procedure-Objekt wird zur Datenquelle und anschließend zur Views-Auflistung hinzugefügt. Werden die Procedures- und Views-Auflistungen aktualisiert, steht das Procedure-Objekt nach einem Append-Vorgang nicht länger in der Views-Auflistung zur Verfügung und wird in der Procedures-Auflistung aufgeführt.


ChangePassword-Methode (ADOX)

ChangePassword-Methode

Ändert das Kennwort für ein Benutzerkonto.

Syntax

User.ChangePassword OldPassword, NewPassword

Parameter

OldPassword Ein Wert vom Datentyp String, der das vorhandene Kennwort des Benutzers angibt. Wenn der Benutzer derzeit über kein Kennwort verfügt, verwenden Sie eine leere Zeichenfolge ("") für OldPassword.

NewPassword Ein Wert vom Datentyp String, der das neue Kennwort angibt.

Hinweise

Das alte Kennwort muss aus Sicherheitsgründen zusätzlich zum neuen Kennwort angegeben werden.

Ein Fehler tritt auf, wenn der Provider die Verwaltung von Sicherheitseigenschaften nicht unterstützt.


Create-Methode (ADOX)

Create-Methode

Erstellt einen neuen Katalog.

Syntax

Catalog.Create ConnectString

Parameter

ConnectString Ein Wert vom Datentyp String, der für die Verbindung mit der Datenquelle verwendet wird.

Hinweise

Die Create-Methode erstellt und öffnet eine neue ADO-Verbindung mit der in ConnectString angegebenen Datenquelle. Wenn dieser Vorgang erfolgreich war, wird das neue Connection-Objekt der ActiveConnection-Eigenschaft zugewiesen.

Es tritt ein Fehler auf, wenn der Provider das Erstellen neuer Kataloge nicht unterstützt.


Delete-Methode (ADOX Collections)

Delete-Methode (Collections)

Entfernt ein Objekt aus einer Auflistung.

Syntax

Collection.Delete Name

Parameter

Name Ein Wert vom Datentyp Variant, der den Namen oder die Ordinalposition (Index) des zu löschenden Objekts angibt.

Hinweise

Ein Fehler tritt auf, wenn der Name in der Auflistung nicht existiert.

Bei Tables- und Users-Auflistungen tritt ein Fehler auf, wenn der Provider das Löschen von Tabellen bzw. Benutzern nicht unterstützt. Bei Procedures- und Views-Auflistungen schlägt die Delete-Methode fehl, wenn der Provider keine dauerhaften (persistenten) Befehle unterstützt.


GetObjectOwner-Methode (ADOX)

GetObjectOwner-Methode

Gibt den Eigentümer eines Objekts in einem Catalog-Objekt zurück.

Syntax

Owner = Catalog.GetObjectOwner(ObjectName, ObjectType [, ObjectTypeId])

Rückgabewert

Gibt einen Wert vom Datentyp String zurück, der den Namen des User- oder Group-Objekts angibt, das Eigentümer des Objekts ist.

Parameter

ObjectName Ein Wert vom Datentyp String, der den Namen des Objekts angibt, für den der Eigentümer zurückgegeben werden soll.

ObjectType Ein Wert vom Datentyp Long, bei dem es sich um eine der ObjectTypeEnum-Konstanten handeln kann, die den Objekttyp angibt, für den der Eigentümer abgefragt werden soll.

ObjectTypeId Optional. Ein Wert vom Datentyp Variant, der die GUID für einen Providerobjekttyp angibt, der nicht in der OLE DB-Spezifikation definiert ist. Dieser Parameter wird benötigt, wenn ObjectType auf adPermObjProviderSpecific festgelegt ist, andernfalls wird er nicht verwendet.

Hinweise

Es tritt ein Fehler auf, wenn der Provider das Zurückgeben von Objekteigentümern nicht unterstützt.


GetPermissions-Methode (ADOX)

GetPermissions-Methode

Gibt die Berechtigungen einer Gruppe oder eines Benutzers für ein Objekt bzw. einen Objektcontainer zurück.

Syntax

ReturnValue = GroupOrUser.GetPermissions(Name, ObjectType
[, ObjectTypeId])

Rückgabewert

Gibt einen Wert vom Datentyp Long zurück, der eine Bitmaske angibt, in der die Berechtigungen der Gruppe oder des Benutzers für das Objekt enthalten sind. Bei diesem Wert kann es sich um eine oder mehrere der RightsEnum-Konstanten handeln.

Parameter

Name Ein Wert vom Datentyp Variant, der den Namen des Objekts angibt, für den Berechtigungen festgelegt werden sollen. Legen Sie für Name einen Nullwert fest, wenn Sie die Berechtigungen für den Objektcontainer abfragen möchten.

ObjectType Ein Wert vom Datentyp Long, bei dem es sich um eine der ObjectTypeEnum-Konstanten handeln kann, die den Objekttyp angibt, für den die Berechtigungen abgefragt werden sollen.

ObjectTypeId Optional. Ein Wert vom Datentyp Variant, der die GUID für einen Providerobjekttyp angibt, der nicht in der OLE DB-Spezifikation definiert ist. Dieser Parameter wird benötigt, wenn ObjectType auf adPermObjProviderSpecific festgelegt ist, andernfalls wird er nicht verwendet.


SetObjectOwner-Methode (ADOX)

SetObjectOwner-Methode

Gibt den Eigentümer eines Objekts in einem Catalog-Objekt an.

Syntax

Catalog.SetObjectOwner ObjectName, ObjectType , OwnerName [, ObjectTypeId]

Parameter

ObjectName Ein Wert vom Datentyp String, der den Namen des Objekts angibt, für den der Eigentümer angegeben werden soll.

ObjectType Ein Wert vom Datentyp Long, bei dem es sich um eine der ObjectTypeEnum-Konstanten handeln kann, die den Eigentümertyp angibt.

OwnerName Ein Wert vom Datentyp String, der den Namen des User- oder Group-Objekts angibt, das Eigentümer des Objekts werden soll.

ObjectTypeId Optional. Ein Wert vom Datentyp Variant, der die GUID für einen Providerobjekttyp angibt, der nicht in der OLE DB-Spezifikation definiert ist. Dieser Parameter wird benötigt, wenn ObjectType auf adPermObjProviderSpecific festgelegt ist, andernfalls wird er nicht verwendet.

Hinweise

Ein Fehler tritt auf, wenn der Provider das Angeben von Objekteigentümern nicht unterstützt.


SetPermissions-Methode (ADOX)

SetPermissions-Methode

Gibt die Berechtigungen einer Gruppe oder eines Benutzers für ein Objekt an.

Syntax

GroupOrUser.SetPermissions Name, ObjectType, Action, Rights [, Inherit]
[, ObjectTypeId]

Parameter

Name Ein Wert vom Datentyp String, der den Namen des Objekts angibt, für den Berechtigungen festgelegt werden sollen.

ObjectType Ein Wert vom Datentyp Long, bei dem es sich um eine der ObjectTypeEnum-Konstanten handeln kann, die den Objekttyp angibt, für den die Berechtigungen abgefragt werden sollen.

Action Ein Wert vom Datentyp Long, bei dem es sich um eine der ActionEnum-Konstanten handeln kann, die den Typ der durchzuführenden Aktion beim Festlegen von Berechtigungen angibt.

Rights Ein Wert vom Datentyp Long, bei dem es sich um eine Bitmaske einer oder mehrerer ActionEnum-Konstanten handeln kann, die die festzulegenden Rechte angibt.

Inherit Optional. Ein Wert vom Datentyp Long, bei dem es sich um eine der InheritTypeEnum-Konstanten handeln kann, die angibt, wie Objekte diese Berechtigungen erben. Der Standardwert ist adInheritNone.

ObjectTypeId Optional. Ein Wert vom Datentyp Variant, der die GUID für einen Providerobjekttyp angibt, der nicht in der OLE DB-Spezifikation definiert ist. Dieser Parameter wird benötigt, wenn ObjectType auf adPermObjProviderSpecific festgelegt ist, andernfalls wird er nicht verwendet.

Hinweise

Ein Fehler tritt auf, wenn der Provider das Festlegen von Zugriffsrechten für Gruppen oder Benutzer nicht unterstützt.

Anmerkung Beim Aufrufen von SetPermissions, werden beim Festlegen von Actions auf adAccessRevoke Einstellungen des Parameters Rights außer Kraft gesetzt. Legen Sie adAccessRevoke nicht für Actions fest, wenn die im Parameter Rights angegebenen Rechte wirksam werden sollen.


ADOX-Aufzählungskonstanten

Als Hilfe für das Debuggen führen die ADOX-Aufzählungskonstanten einen Wert für jede Konstante auf. Dieser Wert ist jedoch lediglich eine Empfehlung und kann je nach Version variieren. Der Code sollte nur vom Namen und nicht vom Wert der Aufzählungskonstanten abhängen.

Die folgenden Aufzählungskonstanten sind definiert:

Aufzählung | Beschreibung
ActionEnum | Gibt an, welcher Aktionstyp durchzuführen ist, wenn SetPermissions aufgerufen wird.
AllowNullsEnum | Gibt an, ob Datensätze mit Nullwerten indiziert werden.
ColumnAttributesEnum | Gibt Merkmale eines Column-Objekts an.
DataTypeEnum | Gibt den Datentyp von Field, Parameter oder Property an.
InheritTypeEnum | Gibt an, wie Objekte mit SetPermissions festgelegte Berechtigungen erben.
KeyTypeEnum | Gibt den Typ des Key-Objekts an: primär, fremd oder eindeutig.
ObjectTypeEnum | Gibt den Typ des Datenbankobjekts an, für das Berechtigungen oder Eigentum festgelegt werden sollen.
RightsEnum | Gibt die Rechte oder Berechtigungen einer Gruppe oder eines Benutzers für ein Objekt an.
RuleEnum | Gibt die zu befolgende Regel an, wenn ein Key-Objekt gelöscht wird.
SortOrderEnum | Gibt die Sortierreihenfolge für eine indizierte Spalte an.


ActionEnum

Gibt an, welcher Aktionstyp durchzuführen ist, wenn SetPermissions aufgerufen wird.

Konstante | Wert | Beschreibung
adAccessDeny | 3 | Der Gruppe oder dem Benutzer werden die angegebenen Berechtigungen verweigert.
adAccessGrant | 1 | Die Gruppe oder der Benutzer erhält mindestens die angeforderten Berechtigungen.
adAccessRevoke | 4 | Alle der Gruppe oder dem Benutzer ausdrücklich gewährten Zugriffsrechte werden widerrufen.
adAccessSet | 2 | Die Gruppe oder der Benutzer erhält genau die angeforderten Berechtigungen.


AllowNullsEnum

Gibt an, ob Datensätze mit Nullwerten indiziert werden.

Konstante | Wert | Beschreibung
adIndexNullsAllow | 0 | Der Index ermöglicht Einträge, bei denen die Schlüsselspalten den Wert Null haben. Wird ein Nullwert in eine Schlüsselspalte eingegeben, wird der Eintrag in den Index eingefügt.
adIndexNullsDisallow | 1 | Standard. Der Index ermöglicht keine Einträge, bei denen die Schlüsselspalten den Wert Null haben. Wird ein Nullwert in eine Schlüsselspalte eingegeben, tritt ein Fehler auf.
adIndexNullsIgnore | 2 | Der Index fügt keine Einträge mit Nullschlüsseln ein. Wird ein Nullwert in eine Schlüsselspalte eingegeben, wird der Eintrag ignoriert, und es tritt kein Fehler auf.
adIndexNullsIgnoreAny | 4 | Der Index fügt keine Einträge ein, bei denen einige Schlüsselspalten Nullwerte aufweisen. Wird bei einem Index mit einem mehrspaltigen Schlüssel ein Nullwert in einigen Spalten eingegeben, wird der Eintrag ignoriert, und es tritt kein Fehler auf.


ColumnAttributesEnum

Gibt Merkmale eines Column-Objekts an.

Konstante | Wert | Beschreibung
adColFixed | 1 | Die Spalte hat eine feste Länge.
adColNullable | 2 | Die Spalte kann Nullwerte enthalten.


InheritTypeEnum

Gibt an, wie Objekte mit SetPermissions festgelegte Berechtigungen übernehmen.

Konstante | Wert | Beschreibung
adInheritBoth | 3 | Sowohl Objekte als auch andere Container, die im primären Objekt enthalten sind, erben den Eintrag.
adInheritContainers | 2 | Andere Container, die im primären Objekt enthalten sind, erben den Eintrag.
adInheritNone | 0 | Standard. Es tritt keine Vererbung auf.
adInheritNoPropagate | 4 | Die adInheritObjects- und adInheritContainers-Attribute werden nicht an einen geerbten Eintrag weitergegeben.
adInheritObjects | 1 | Nicht-Container-Objekte im Container erben die Berechtigungen.


KeyTypeEnum

Gibt den Typ des Key-Objekts an: primär, fremd oder eindeutig.

Konstante | Wert | Beschreibung
adKeyPrimary | 1 | Standard. Dieser Schlüssel ist ein Primärschlüssel.
adKeyForeign | 2 | Dieser Schlüssel ist ein Fremdschlüssel.
adKeyUnique | 3 | Dieser Schlüssel ist eindeutig.


ObjectTypeEnum

Gibt den Typ des Datenbankobjekts an, für das Berechtigungen oder Eigentum festgelegt werden sollen.

Konstante | Wert | Beschreibung
adPermObjColumn | 2 | Das Objekt ist eine Spalte.
adPermObjDatabase | 3 | Das Objekt ist eine Datenbank.
adPermObjProcedure | 4 | Das Objekt ist eine Prozedur.
adPermObjProviderSpecific | -1 | Das Objekt ist ein vom Provider festgelegter Typ. Ein Fehler tritt auf, wenn der Parameter ObjectType adPermObjProviderSpecific ist und ObjectTypeId nicht angegeben wird.
adPermObjTable | 1 | Das Objekt ist eine Tabelle.
adPermObjView | 5 | Das Objekt ist eine Ansicht.


RightsEnum

Gibt die Rechte oder Berechtigungen einer Gruppe oder eines Benutzers für ein Objekt an.

Konstante | Wert | Beschreibung
adRightCreate | 16384 (&H4000) | Der Benutzer bzw. die Gruppe hat die Berechtigung, neue Objekte dieses Typs zu erstellen.
adRightDelete | 65536 (&H10000) | Der Benutzer bzw. die Gruppe hat die Berechtigung, Daten aus einem Objekt zu löschen. Bei Objekten wie beispielsweise Table-Objekten hat der Benutzer die Berechtigung, Datenwerte aus Datensätzen zu löschen.
adRightDrop | 256 (&H100) | Der Benutzer bzw. die Gruppe hat die Berechtigung, Objekte aus dem Katalog zu entfernen. Table-Objekte können beispielsweise durch den SQL-Befehl DROP TABLE gelöscht werden.
adRightExclusive | 512 (&H200) | Der Benutzer bzw. die Gruppe hat die Berechtigung, exklusiv auf das Objekt zuzugreifen.
adRightExecute | 536870912 (&H20000000) | Der Benutzer bzw. die Gruppe hat die Berechtigung, das Objekt auszuführen.
adRightFull | 268435456 (&H10000000) | Der Benutzer bzw. die Gruppe hat alle Berechtigungen für das Objekt.
adRightInsert | 32768 (&H8000) | Der Benutzer bzw. die Gruppe hat die Berechtigung, das Objekt einzufügen. Bei Objekten wie beispielsweise Table-Objekten hat der Benutzer die Berechtigung, Datenwerte in die Tabelle einzufügen.
adRightMaximumAllowed | 33554432 (&H2000000) | Der Benutzer bzw. die Gruppe hat die höchstmögliche Anzahl der vom Provider erlaubten Berechtigungen. Spezielle Berechtigungen hängen vom Provider ab.
adRightNone | 0 | Der Benutzer bzw. die Gruppe hat keine Berechtigungen für das Objekt.
adRightRead | -2147483648 (&H80000000) | Der Benutzer bzw. die Gruppe hat die Berechtigung, das Objekt zu lesen. Bei Objekten wie beispielsweise Table-Objekten hat der Benutzer die Berechtigung, Datenwerte in der Tabelle zu lesen.
adRightReadDesign | 1024 (&H400) | Der Benutzer bzw. die Gruppe hat die Berechtigung, den Entwurf für das Objekt zu lesen.
adRightReadPermissions | 131072 (&H20000) | Der Benutzer bzw. die Gruppe kann die spezifischen Berechtigungen für ein Objekt im Katalog anzeigen, aber nicht ändern.
adRightReference | 8192 (&H2000) | Der Benutzer bzw. die Gruppe hat die Berechtigung, auf das Objekt zu verweisen.
adRightUpdate | 1073741824 (&H40000000) | Der Benutzer bzw. die Gruppe hat die Berechtigung, das Objekt zu aktualisieren. Bei Objekten wie beispielsweise Table-Objekten hat der Benutzer die Berechtigung, die Daten in der Tabelle zu aktualisieren.
adRightWithGrant | 4096 (&H1000) | Der Benutzer bzw. die Gruppe hat die Berechtigung, Berechtigungen für das Objekt zu erteilen.
adRightWriteDesign | 2048 (&H800) | Der Benutzer bzw. die Gruppe hat die Berechtigung, den Entwurf für das Objekt zu ändern.
adRightWriteOwner | 524288 (&H80000) | Der Benutzer bzw. die Gruppe hat die Berechtigung, den Eigentümer des Objekts zu ändern.
adRightWritePermissions | 262144 (&H40000) | Der Benutzer bzw. die Gruppe darf die spezifischen Berechtigungen für ein Objekt im Katalog ändern.


RuleEnum

Gibt die zu befolgende Regel an, wenn ein Key-Objekt gelöscht wird.

Konstante | Wert | Beschreibung
adRICascade | 1 | Änderungen kaskadieren.
adRINone | 0 | Standard. Es findet keine Aktion statt.
adRISetDefault | 3 | Für den Fremdschlüssel wird der Standardwert festgelegt.
adRISetNull | 2 | Für den Fremdschlüssel wird der Wert Null festgelegt.


SortOrderEnum

Gibt die Sortierreihenfolge für eine indizierte Spalte an.

Konstante | Wert | Beschreibung
adSortAscending | 1 | Standard. Die Sortierreihenfolge für die Spalte ist aufsteigend.
adSortDescending | 2 | Die Sortierreihenfolge für die Spalte ist absteigend.


ADO-Codebeispiele

Verwenden Sie die folgenden Codebeispiele, um zu erfahren, wie Sie die Objekte, Methoden, Eigenschaften und Ereignisse von ADOX einsetzen können.

Anmerkung Fügen Sie das gesamte Codebeispiel in den Code-Editor ein. Wenn nur Teile der Beispiele verwendet werden oder die Absatzformatierung verloren geht, wird das Beispiel möglicherweise nicht ordnungsgemäß ausgeführt.

  • ADOX-Codebeispiele in Microsoft Visual Basic

  • ADOX-Codebeispiele in Microsoft Visual C++


ADOX-Codebeispiele in Microsoft Visual Basic

Diese Themen enthalten Beispielcode, um Ihnen das Verständnis der Verwendung von ADOX zu erleichtern. Alle Codebeispiele wurden mit Microsoft Visual Basic geschrieben.

Anmerkung Fügen Sie das gesamte Codebeispiel, von "Sub" bis "End Sub", in den Code-Editor ein. Wenn Sie nur Teile der Beispiele verwenden oder die Absatzformatierung verloren geht, wird das Beispiel möglicherweise nicht ordnungsgemäß ausgeführt.

Methoden

  • Beispiel für die Append-Methode von Spalten und Tabellen, Name-Eigenschaft (VB)

  • Beispiel für die Close-Methode von Verbindungen, Table Type-Eigenschaft (VB)

  • Beispiel für die Create-Methode (VB)

  • Beispiel für die Methoden GetObjectOwner und SetObjectOwner (VB)

  • Beispiel für die Methoden GetPermissions und SetPermissions (VB)

  • Beispiel für die Append- und ChangePassword-Methoden von Gruppen und Benutzern (VB)

  • Beispiel für die Append-Methode von Indizes (VB)

  • Beispiel für die Append-Methode von Schlüsseln, die Type-Eigenschaft von Schlüsseln und die Eigenschaften RelatedColumn, RelatedTable und UpdateRule (VB)

  • Beispiel für die Append-Methode von Prozeduren (VB)

  • Beispiel für die Delete-Methode von Prozeduren (VB)

  • Beispiel für die Refresh-Methode von Prozeduren (VB)

  • Beispiel für die Append-Methode von Ansichten (VB)

  • Beispiel für die Delete-Methode von Ansichten (VB)

  • Beispiel für die Refresh-Methode von Ansichten (VB)

Eigenschaften

  • Beispiel für die Attributes-Eigenschaft (VB)

  • Beispiel für die ActiveConnection-Eigenschaft (VB)

  • Beispiel für die Clustered-Eigenschaft (VB)

  • Beispiel für die Eigenschaften Command und CommandText (VB)

  • Beispiel für die Command-Eigenschaft, Parameters-Auflistung (VB)

  • Beispiel für die CommandText-Eigenschaft, Views-Auflistung (VB)

  • Beispiel für die Eigenschaften DateCreated und DateModified (VB)

  • Beispiel für die DefinedSize-Eigenschaft (VB)

  • Beispiel für die DeleteRule-Eigenschaft (VB)

  • Beispiel für die IndexNulls-Eigenschaft (VB)

  • Beispiel für die Type-Eigenschaft von Schlüsseln und die Eigenschaften RelatedColumn, RelatedTable und UpdateRule, Append-Methode von Schlüsseln (VB)

  • Beispiel für die Name-Eigenschaft, Append-Methode von Spalten und Tabellen (VB)

  • Beispiel für die Eigenschaften NumericScale und Precision (VB)

  • Beispiel für die ParentCatalog-Eigenschaft (VB)

  • Beispiel für die Eigenschaften PrimaryKey und Unique (VB)

  • Beispiel für die SortOrder-Eigenschaft (VB)

  • Beispiel für die Table Type-Eigenschaft, Close-Methode einer Verbindung (VB)

Auflistungen

  • Beispiel für die Parameters-Auflistung, Command-Eigenschaft (VB)

  • Beispiel für die Views-Auflistung, CommandText-Eigenschaft (VB)

  • Beispiel für die Auflistungen Views und Fields (VB)


Beispiel für die Attributes-Eigenschaft (VB)

Dieses Beispiel verdeutlicht die Attributes-Eigenschaft eines Column-Objekts. Durch Festlegen von adColNullable kann der Benutzer den Wert eines Recordset Field-Objekts auf eine leere Zeichenfolge festlegen. In diesem Fall kann der Benutzer zwischen einem Datensatz mit unbekannten Daten und einem mit nicht relevanten Daten unterscheiden.

Sub AttributesX()

    Dim cnn As New ADODB.Connection
    Dim cat As New ADOX.Catalog
    Dim colTemp As New ADOX.Column
    Dim rstEmployees As New Recordset
    Dim strMessage As String
    Dim strInput As String

    ' Den Katalog verbinden.
    cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;data source=c:\" & _
        "Programme\Microsoft Office\Office\Samples\Northwind.mdb;"
    Set cat.ActiveConnection = cnn

    Set tblEmp = cat.Tables("Employees")

    ' Neues Field-Objekt erstellen und an die Fields-Auflistung der
    ' Employees-Tabelle anhängen.
    colTemp.Name = "FaxPhone"
    colTemp.Type = adVarWChar
    colTemp.DefinedSize = 24
    colTemp.Attributes = adColNullable
    cat.Tables("Employees").Columns.Append colTemp

    ' Employees-Tabelle zur Aktualisierung als Recordset öffnen
    rstEmployees.Open "Employees", cnn, adOpenKeyset, adLockOptimistic

    With rstEmployees
        ' Benutzereingabe einlesen.
        strMessage = "Enter fax number for " & _
            !FirstName & " " & !LastName & "." & vbCr & _
            "[? - unknown, X - has no fax]"
        strInput = UCase(InputBox(strMessage))
        If strInput <> "" Then
            Select Case strInput
                Case "?"
                    !FaxPhone = Null
                Case "X"
                    !FaxPhone = ""
                Case Else
                    !FaxPhone = strInput
            End Select
            .Update

            ' Bericht drucken.
            Debug.Print "Name - Fax number"
            Debug.Print !FirstName & " " & !LastName & " - ";

            If IsNull(!FaxPhone) Then
                Debug.Print "[Unknown]"
            Else
                If !FaxPhone = "" Then
                    Debug.Print "[Has no fax]"
                Else
                    Debug.Print !FaxPhone
                End If
            End If

        End If

        .Close
    End With

    ' Neues Feld löschen, da es sich um ein Beispiel handelt.
    tblEmp.Columns.Delete colTemp.Name
    cnn.Close

End Sub


Beispiel für die ActiveConnection-Eigenschaft (VB)

Durch Festlegen der ActiveConnection-Eigenschaft auf eine gültige geöffnete Verbindung wird der Katalog "geöffnet". Über einen geöffneten Katalog können Sie auf die im Katalog enthaltenen Schemaobjekte zugreifen.

Sub OpenConnection()

    Dim cnn As New ADODB.Connection
    Dim cat As New ADOX.Catalog

    cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
        "Data Source= c:\Programme\Microsoft Office\" & _
        "Office\Samples\Northwind.mdb;"
    Set cat.ActiveConnection = cnn
    Debug.Print cat.Tables(0).Type

End Sub

Durch Festlegen der ActiveConnection-Eigenschaft auf eine gültige Verbindungszeichenfolge wird der Katalog ebenfalls "geöffnet".

Sub OpenConnectionWithString()

    Dim cat As New ADOX.Catalog

    cat.ActiveConnection = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
        "Data Source=c:\Programme\Microsoft Office\" & _
        "Office\Samples\Northwind.mdb;"
    Debug.Print cat.Tables(0).Type

End Sub


Beispiel für die Clustered-Eigenschaft (VB)

Dieses Beispiel verdeutlicht die Clustered-Eigenschaft eines Index-Objekts. Beachten Sie, dass Microsoft Jet-Datenbanken keine gruppierten Indizes unterstützen, weshalb dieses Beispiel False für die Clustered-Eigenschaft aller Indizes der Northwind-Datenbank zurückgibt.

Sub ClusteredX()
    Dim cnn As New ADODB.Connection
    Dim cat As New ADOX.Catalog
    Dim tblLoop As ADOX.Table
    Dim idxLoop As ADOX.Index
    Dim strCnn as String

   StrCnn = "Provider=SQLOLEDB;Data Source=srv;Initial Catalog=pubs;" & _
            "User Id=sa;Password=;"
    ' Den Katalog verbinden.
   cnn.Open strCnn
    cat.ActiveConnection = cnn

    ' Tabellen aufzählen
    For Each tblLoop In cat.Tables
        ' Indizes aufzählen
        For Each idxLoop In tblLoop.Indexes
            Debug.Print tblLoop.Name & " " & _
                idxLoop.Name & " " & idxLoop.Clustered
        Next idxLoop
    Next tblLoop

End Sub


Beispiel für die Append-Methode von Spalten und Tabellen, Name-Eigenschaft (VB)

Mit dem folgenden Code wird gezeigt, wie eine neue Tabelle erstellt wird.

Sub CreateTable()

    Dim tbl As New Table
    Dim cat As New ADOX.Catalog

' Den Katalog öffnen.
    ' Das Catalog-Objekt öffnen.
    cat.ActiveConnection = _
        "Provider=Microsoft.Jet.OLEDB.4.0;" & _
        "Data Source=c:\Programme\Microsoft Office\" & _
        "Office\Samples\Northwind.mdb;"

    tbl.Name = "MyTable"
    tbl.Columns.Append "Column1", adInteger
    tbl.Columns.Append "Column2", adInteger
    tbl.Columns.Append "Column3", adVarWChar, 50
    cat.Tables.Append tbl

End Sub


Beispiel für die Eigenschaften Command und CommandText (VB)

Mit dem folgenden Code wird gezeigt, wie die Command-Eigenschaft verwendet wird, um den Text einer Prozedur zu aktualisieren.

Sub ProcedureText()

    Dim cnn As New ADODB.Connection
    Dim cat As New ADOX.Catalog
    Dim cmd As New ADODB.Command

    ' Das Connection-Objekt öffnen
    cnn.Open _
        "Provider=Microsoft.Jet.OLEDB.4.0;" & _
        "Data Source=c:\Programme\Microsoft Office\" & _
        "Office\Samples\Northwind.mdb;"

    ' Den Katalog öffnen
    Set cat.ActiveConnection = cnn

    ' Das Command-Objekt abrufen
    Set cmd = cat.Procedures("CustomerById").Command

    ' CommandText aktualisieren
    cmd.CommandText = "Select CustomerId, CompanyName, ContactName " & _
        "From Customers " & _
        "Where CustomerId = [CustId]"

    ' Die Prozedur aktualisieren
    Set cat.Procedures("CustomerById").Command = cmd

End Sub


Beispiel für die Close-Methode von Verbindungen, Table Type-Eigenschaft (VB)

Durch Festlegen der ActiveConnection-Eigenschaft auf Nothing wird der Katalog "geschlossen". Zugeordnete Auflistungen enthalten dann keine Daten. Objekte, die aus Schemaobjekten im Katalog erstellt wurden, sind verwaist. Sämtliche Eigenschaften dieser Objekte, die zwischengespeichert wurden, sind zwar weiterhin verfügbar, jedoch ist es nicht möglich, Eigenschaften zu lesen, wenn hierzu der Provider angerufen werden muss.

Sub CloseConnectionByNothing()

    Dim cnn As New Connection
    Dim cat As New Catalog
    Dim tbl As Table

    cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
        "Data Source= c:\Programme\Microsoft Office\" & _
        "Office\Samples\Northwind.mdb;"
    Set cat.ActiveConnection = cnn
    Set tbl = cat.Tables(0)
    Debug.Print tbl.Type    ' tbl.Type-Daten zwischenspeichern
    Set cat.ActiveConnection = Nothing
    Debug.Print tbl.Type    ' tbl ist verwaist
    ' Vorige Zeile ist erfolgreich, falls diese Daten zwischengespeichert
    ' wurden
    Debug.Print tbl.Columns(0).DefinedSize
    ' Vorige Zeile schlägt fehl, falls diese Daten nicht
    ' zwischengespeichert wurden

End Sub

Das Schließen eines zum "Öffnen" des Katalogs verwendeten Connection-Objekts hat die gleichen Auswirkungen wie das Festlegen der ActiveConnection-Eigenschaft auf Nothing.

Sub CloseConnection()

    Dim cnn As New Connection
    Dim cat As New Catalog
    Dim tbl As Table

    cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
        "Data Source= c:\Programme\Microsoft Office\" & _
        "Office\Samples\Northwind.mdb;"
    Set cat.ActiveConnection = cnn
    Set tbl = cat.Tables(0)
    Debug.Print tbl.Type    ' tbl.Type-Daten zwischenspeichern
    cnn.Close
    Debug.Print tbl.Type    ' tbl ist verwaist
    ' Vorige Zeile ist erfolgreich, falls diese Daten zwischengespeichert
    ' wurden
    Debug.Print tbl.Columns(0).DefinedSize
    ' Vorige Zeile schlägt fehl, falls diese Daten nicht
    ' zwischengespeichert wurden

End Sub


Beispiel für die Create-Methode (VB)

Mit dem folgenden Code wird gezeigt, wie eine neue Microsoft Jet-Datenbank mit der Create-Methode erstellt wird.

Sub CreateDatabase()

    Dim cat As New ADOX.Catalog
    cat.Create "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\new.mdb"

End Sub


Beispiel für die Eigenschaften DateCreated und DateModified (VB)

Dieses Beispiel verdeutlicht die Eigenschaften DateCreated und DateModified durch Hinzufügen eines neuen Column-Objekts zu einem vorhandenen Table-Objekt sowie durch Erstellen eines neuen Table-Objekts. Zum Ausführen dieses Beispiels ist die Prozedur DateOutput erforderlich.

Sub DateCreatedX()
    Dim cat As New ADOX.Catalog
    Dim tblEmployees As ADOX.Table
    Dim tblNewTable As ADOX.Table

    ' Den Katalog verbinden.
    cat.ActiveConnection = _
        "Provider=Microsoft.Jet.OLEDB.4.0;" & _
        "Data Source=c:\Programme\" & _
        "Microsoft Office\Office\Samples\Northwind.mdb;"

    With cat
        Set tblEmployees = .Tables("Employees")

        ' Aktuelle Informationen über die Employees-Tabelle drucken.
        DateOutput "Current properties", tblEmployees

        ' Spalte erstellen und an die Employees-Tabelle anhängen.
        tblEmployees.Columns.Append "NewColumn", adInteger
        .Tables.Refresh

        ' Neue Informationen über die Employees-Tabelle drucken.
        DateOutput "After creating a new column", tblEmployees

        ' Neue Spalte löschen, da es sich um ein Beispiel handelt.
        tblEmployees.Columns.Delete "NewColumn"

        ' Neues Table-Objekt erstellen und an die Northwind-Datenbank
        ' anhängen.
        Set tblNewTable = New ADOX.Table
        tblNewTable.Name = "NewTable"
        tblNewTable.Columns.Append "NewColumn", adInteger
        .Tables.Append tblNewTable
        .Tables.Refresh

        ' Informationen über das neue Table-Objekt drucken.
        DateOutput "After creating a new table", .Tables("NewTable")

        ' Neues Table-Objekt löschen, da es sich um ein Beispiel handelt.
        .Tables.Delete tblNewTable.Name

    End With

End Sub

Sub DateOutput(strTemp As String, tblTemp As ADOX.Table)
    ' DateCreated und DateModified für das angegebene Table-Objekt
    ' drucken.
    Debug.Print strTemp
    Debug.Print "    Table: " & tblTemp.Name
    Debug.Print "        DateCreated = " & tblTemp.DateCreated
    Debug.Print "        DateModified = " & tblTemp.DateModified
    Debug.Print
End Sub


Beispiel für die DefinedSize-Eigenschaft (VB)

Dieses Beispiel verdeutlicht die DefinedSize-Eigenschaft eines Column-Objekts. Mit diesem Code wird die Größe der Spalte FirstName in der Employees-Tabelle der Northwind-Datenbank neu festgelegt. Die Änderung der Werte im FirstName-Field-Objekt eines Recordsets, das auf der Employees-Tabelle basiert, wird anschließend angezeigt. Beachten Sie, dass nach dem Neudefinieren der DefinedSize-Eigenschaft standardmäßig das FirstName-Feld mit Leerstellen aufgefüllt wird.

Public Sub DefinedSizeX()

    Dim rstEmployees As ADODB.Recordset
    Dim catNorthwind As New ADOX.Catalog
    Dim colFirstName As ADOX.Column
    Dim colNewFirstName As New ADOX.Column
    Dim aryFirstName() As String
    Dim i As Integer
    Dim strCnn As String

    strCnn = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
             "Data Source=c:\Programme\" & _
             "Microsoft Office\Office\Samples\Northwind.mdb;"

    ' Ein Recordset für die Employees-Tabelle öffnen.
    Set rstEmployees = New ADODB.Recordset
    rstEmployees.Open "Employees", strCnn, adOpenKeyset, , adCmdTable
    ReDim aryFirstName(rstEmployees.RecordCount)

    ' Ein Catalog-Objekt für die Northwind-Datenbank mithilfe derselben
    ' Verbindung wie für rstEmployees öffnen.
    Set catNorthwind.ActiveConnection = rstEmployees.ActiveConnection

    ' Das Recordset durchlaufen und den Inhalt, die definierte Größe und
    ' die tatsächliche Größe des FirstName-Feldes anzeigen.
    ' Außerdem FirstName-Werte im aryFirstName-Array speichern.
    rstEmployees.MoveFirst
    Debug.Print " "
    Debug.Print "Original Defined Size and Actual Size"
    i = 0
    Do Until rstEmployees.EOF
        Debug.Print "Employee name: " & rstEmployees!FirstName & _
            " " & rstEmployees!LastName
        Debug.Print "    FirstName Defined size: " _
            & rstEmployees!FirstName.DefinedSize
        Debug.Print "    FirstName Actual size: " & _
            rstEmployees!FirstName.ActualSize
            aryFirstName(i) = rstEmployees!FirstName
        rstEmployees.MoveNext
        i = i + 1
    Loop
    rstEmployees.Close

    ' DefinedSize für FirstName im Katalog neu definieren
    Set colFirstName = catNorthwind.Tables("Employees").Columns("FirstName")
    colNewFirstName.Name = colFirstName.Name
    colNewFirstName.Type = colFirstName.Type
    colNewFirstName.DefinedSize = colFirstName.DefinedSize + 1

    ' Neue FirstName-Spalte an den Katalog anhängen
    catNorthwind.Tables("Employees").Columns.Delete colFirstName.Name
    catNorthwind.Tables("Employees").Columns.Append colNewFirstName

    ' Employees-Tabelle im Recordset zum Aktualisieren öffnen
    rstEmployees.Open "Employees", catNorthwind.ActiveConnection, _
        adOpenKeyset, adLockOptimistic, adCmdTable

    ' Das Recordset durchlaufen und den Inhalt, die definierte Größe und
    ' die tatsächliche Größe des FirstName-Feldes anzeigen.
    ' Außerdem FirstName-Werte aus aryFirstName wiederherstellen.
    rstEmployees.MoveFirst
    Debug.Print " "
    Debug.Print "New Defined Size and Actual Size"
    i = 0
    Do Until rstEmployees.EOF
        rstEmployees!FirstName = aryFirstName(i)
        Debug.Print "Employee name: " & rstEmployees!FirstName & _
            " " & rstEmployees!LastName
        Debug.Print "    FirstName Defined size: " _
            & rstEmployees!FirstName.DefinedSize
        Debug.Print "    FirstName Actual size: " & _
            rstEmployees!FirstName.ActualSize
        rstEmployees.MoveNext
        i = i + 1
    Loop
    rstEmployees.Close

    ' Ursprüngliche FirstName-Spalte im Katalog wiederherstellen
    catNorthwind.Tables("Employees").Columns.Delete colNewFirstName.Name
    catNorthwind.Tables("Employees").Columns.Append colFirstName

    ' Ursprüngliche FirstName-Werte in der Employees-Tabelle
    ' wiederherstellen
    rstEmployees.Open "Employees", catNorthwind.ActiveConnection, _
        adOpenKeyset, adLockOptimistic, adCmdTable

    rstEmployees.MoveFirst
    i = 0
    Do Until rstEmployees.EOF
        rstEmployees!FirstName = aryFirstName(i)
        rstEmployees.MoveNext
        i = i + 1
    Loop
    rstEmployees.Close

    Set catNorthwind = Nothing

End Sub


Beispiel für die DeleteRule-Eigenschaft (VB)

Dieses Beispiel verdeutlicht die DeleteRule-Eigenschaft eines Key-Objekts. Mit diesem Code wird ein neues Table-Objekt angehängt und anschließend ein neuer Primärschlüssel festgelegt, wobei DeleteRule auf adRICascade festgelegt wird.

DeleteRule Prop

Sub DeleteRuleX()

    Dim kyPrimary As New ADOX.Key
    Dim cat As New ADOX.Catalog
    Dim tblNew As New ADOX.Table

    ' Den Katalog verbinden
    cat.ActiveConnection = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
                     "data source=c:\Programme\" & _
                     "Microsoft Office\Office\Samples\Northwind.mdb;"

    ' Neue Tabelle benennen
    tblNew.Name = "NewTable"

    ' Ein numerisches Feld und ein Textfeld an die neue Tabelle anhängen.
    tblNew.Columns.Append "NumField", adInteger, 20
    tblNew.Columns.Append "TextField", adVarWChar, 20

    ' Die neue Tabelle anhängen
    cat.Tables.Append tblNew

    ' Den Primärschlüssel definieren
    kyPrimary.Name = "NumField"
    kyPrimary.Type = adKeyPrimary
    kyPrimary.RelatedTable = "Customers"
    kyPrimary.Columns.Append "NumField"
    kyPrimary.Columns("NumField").RelatedColumn = "CustomerId"
    kyPrimary.DeleteRule = adRICascade

    ' Den Primärschlüssel anhängen
    cat.Tables("NewTable").Keys.Append kyPrimary

    ' Die Tabelle löschen, da es sich um ein Beispiel handelt
    cat.Tables.Delete tblNew.Name

End Sub


Beispiel für die Methoden GetObjectOwner und SetObjectOwner (VB)

Dieses Beispiel verdeutlicht die Methoden GetObjectOwner und SetObjectOwner. Bei diesem Code wird vom Vorhandensein eines Gruppenkontos ausgegangen (siehe das Beispiel für die Append- und ChangePassword-Methoden von Gruppen und Benutzern, um zu verstehen, wie diese Gruppe zum System hinzugefügt wird). Der Eigentümer der Tabelle Categories wird auf Accounting festgelegt.

Sub OwnersX()

    Dim tblLoop As New ADOX.Table
    Dim cat As New ADOX.Catalog
    Dim strOwner As String

    ' Das Catalog-Objekt öffnen.
    cat.ActiveConnection = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
        "Data Source=c:\Programme\" & _
        "Microsoft Office\Office\Samples\Northwind.mdb;" & _
        "jet oledb:system database=" & _
        "c:\Programme\Microsoft Office\Office\system.mdw"

    ' Den ursprünglichen Besitzer von Categories drucken
    strOwner = cat.GetObjectOwner("Categories", adPermObjTable)
    Debug.Print "Owner of Categories: " & strOwner

    ' Den Besitzer von Categories auf Accounting festlegen
    cat.SetObjectOwner "Categories", adPermObjTable, "Accounting"

    ' Die Besitzer aller Tabellen und Spalten im Katalog auflisten.
    For Each tblLoop In cat.Tables
        Debug.Print "Table: " & tblLoop.Name
        Debug.Print "   Owner: " & _
            cat.GetObjectOwner(tblLoop.Name, adPermObjTable)
    Next tblLoop

    ' Den ursprünglichen Besitzer von Categories wiederherstellen
    cat.SetObjectOwner "Categories", adPermObjTable, strOwner

End Sub


Beispiel für die Methoden GetPermissions und SetPermissions (VB)

Dieses Beispiel verdeutlicht die Methoden GetPermissions und SetPermissions. Mit dem folgenden Code wird dem Benutzer Admin Vollzugriff auf die Tabelle Orders erteilt.

Sub GrantPermissions()

    Dim cnn As New ADODB.Connection
    Dim cat As New ADOX.Catalog
    Dim lngPerm As Long

    ' Eine Verbindung zur Northwind-Datenbank mithilfe des
    ' Microsoft Jet 4.0-Providers öffnen
    cnn.Provider = "Microsoft.Jet.OLEDB.4.0"
    cnn.Open "data source=c:\Programme\" & _
        "Microsoft Office\Office\Samples\Northwind.mdb;" & _
        "jet oledb:system database=" & _
        "c:\Programme\Microsoft Office\Office\system.mdw"

    Set cat.ActiveConnection = cnn

    ' Ursprüngliche Berechtigungen abrufen
    lngPerm = cat.Users("admin").GetPermissions("Orders", adPermObjTable)
    Debug.Print "Original permissions: " & Str(lngPerm)

    ' Alle Berechtigungen aufheben
    cat.Users("admin").SetPermissions "Orders", adPermObjTable, _
        adAccessRevoke, adRightFull

    ' Berechtigungen anzeigen
    Debug.Print "Revoked permissions: " & _
        Str(cat.Users("admin").GetPermissions("Orders", adPermObjTable))

    ' Dem Benutzer Admin vollständige Rechte für das Orders-Objekt
    ' erteilen
    cat.Users("admin").SetPermissions "Orders", adPermObjTable, _
        adAccessSet, adRightFull

    ' Berechtigungen anzeigen
    Debug.Print "Full permissions: " & _
        Str(cat.Users("admin").GetPermissions("Orders", adPermObjTable))

    ' Ursprüngliche Berechtigungen wiederherstellen
    cat.Users("admin").SetPermissions "Orders", adPermObjTable, _
        adAccessSet, lngPerm

    ' Berechtigungen anzeigen
    Debug.Print "Final permissions: " & _
        Str(cat.Users("admin").GetPermissions("Orders", adPermObjTable))


Beispiel für die Append- und ChangePassword-Methoden von Gruppen und Benutzern (VB)

Dieses Beispiel verdeutlicht die Append-Methode der Groups-Auflistung sowie die Append-Methode der Users-Auflistung, indem ein neues Group- sowie ein neues User-Objekt dem System hinzugefügt werden. Das neue Group-Objekt wird der Groups-Auflistung des neuen User-Objekts angehängt. Dadurch wird das neue User-Objekt dem Group-Objekt hinzugefügt. Darüber hinaus wird die ChangePassword-Methode verwendet, um das User-Kennwort anzugeben.

Sub GroupX()

    Dim cat As ADOX.Catalog
    Dim usrNew As ADOX.User
    Dim usrLoop As ADOX.User
    Dim grpLoop As ADOX.Group

    Set cat = New ADOX.Catalog
    cat.ActiveConnection = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
        "Data Source=c:\Programme\" & _
        "Microsoft Office\Office\Samples\Northwind.mdb;" & _
        "jet oledb:system database=c:\samples\system.mdb"

    With cat
        ' Eine neue Gruppe mithilfe einer Zeichenfolge erstellen und
        ' anhängen.
        .Groups.Append "Accounting"

        ' Einen neuen Benutzer mithilfe eines Objekts erstellen und
        ' anhängen.
        Set usrNew = New ADOX.User
        usrNew.Name = "Pat Smith"
        usrNew.ChangePassword "", "Password1"
        .Users.Append usrNew

        ' Die Benutzerin Pat Smith zum Mitglied der Accounting-Gruppe
        ' machen, indem das entsprechende Group-Objekt erstellt und zur
        ' Groups-Auflistung der Benutzerin hinzugefügt wird. Das Gleiche
        ' kann erreicht werden, indem ein User-Objekt, das Pat Smith
        ' darstellt, erstellt und an die Users-Auflistung der Accounting-
        ' Gruppe angehängt wird.
        usrNew.Groups.Append "Accounting"

        ' Alle User-Objekte in der Users-Auflistung des Katalogs
        ' aufzählen.
        For Each usrLoop In .Users
            Debug.Print "  " & usrLoop.Name
            Debug.Print "    Belongs to these groups:"
            ' Alle Group-Objekte in der Groups-Auflistung jedes User-
            ' Objekts aufzählen.
            If usrLoop.Groups.Count <> 0 Then
                For Each grpLoop In usrLoop.Groups
                    Debug.Print "    " & grpLoop.Name
                Next grpLoop
            Else
                Debug.Print "    [None]"
            End If
        Next usrLoop

        ' Alle Group-Objekte in der Groups-Auflistung des
        ' Standardarbeitsbereichs aufzählen.
        For Each grpLoop In .Groups
            Debug.Print "  " & grpLoop.Name
            Debug.Print "    Has as its members:"
            ' Alle User-Objekte in der Users-Auflistung jedes
            ' Group-Objekts aufzählen.
            If grpLoop.Users.Count <> 0 Then
                For Each usrLoop In grpLoop.Users
                    Debug.Print "    " & usrLoop.Name
                Next usrLoop
            Else
                Debug.Print "    [None]"
            End If
        Next grpLoop

        ' Neue User- und Group-Objekte löschen, da es sich lediglich um
        ' ein Beispiel handelt.
        .Users.Delete "Pat Smith"
        .Groups.Delete "Accounting"

    End With

End Sub


Beispiel für die Append-Methode von Indizes (VB)

Mit dem folgenden Code wird gezeigt, wie ein neuer Index erstellt wird. Der Index erstreckt sich über zwei Spalten einer Tabelle.

Sub CreateIndex()

    Dim tbl As New Table
    Dim idx As New ADOX.Index
    Dim cat As New ADOX.Catalog

' Den Katalog öffnen.
    ' Das Catalog-Objekt öffnen.
    cat.ActiveConnection = _
        "Provider=Microsoft.Jet.OLEDB.4.0;" & _
        "Data Source=c:\Programme\Microsoft Office\" & _
        "Office\Samples\Northwind.mdb;"

    ' Die Tabelle definieren und an den Katalog anhängen
    tbl.Name = "MyTable"
    tbl.Columns.Append "Column1", adInteger
    tbl.Columns.Append "Column2", adInteger
    tbl.Columns.Append "Column3", adVarWChar, 50
    cat.Tables.Append tbl

    ' Einen mehrspaltigen Index definieren
    idx.Name = "multicolidx"
    idx.Columns.Append "Column1"
    idx.Columns.Append "Column2"

    ' Den Index an die Tabelle anhängen
    tbl.Indexes.Append idx

End Sub


Beispiel für die IndexNulls-Eigenschaft (VB)

Dieses Beispiel verdeutlicht die IndexNulls-Eigenschaft eines Index-Objekts. Der Code erstellt einen neuen Index und legt den Wert von IndexNulls je nach Benutzereingabe (aus einem mit List1 bezeichneten Listenfeld) fest. Der Index wird anschließend an die Employees-Tabelle im Northwind-Catalog angehängt. Der neue Index wird für ein Recordset-Objekt übernommen, das auf der Employees-Tabelle basiert, und das Recordset-Objekt geöffnet. Ein neuer Datensatz wird der Employees-Tabelle hinzugefügt, wobei im indizierten Feld ein Null-Wert eingefügt wird. Ob dieser neue Datensatz angezeigt wird, hängt von der Einstellung der IndexNulls-Eigenschaft ab.

Sub IndexNullsX()

    Dim cnn As New ADODB.Connection
    Dim catNorthwind As New ADOX.Catalog
    Dim idxNew As New ADOX.Index
    Dim rstEmployees As New ADODB.Recordset
    Dim varBookmark As Variant

    ' Den Katalog verbinden.
    cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
        "data source=c:\Programme\" & _
        "Microsoft Office\Office\Samples\Northwind.mdb;"

    Set catNorthwind.ActiveConnection = cnn

    ' Die Country-Spalte an den neuen Index anhängen
    idxNew.Columns.Append "Country"
    idxNew.Name = "NewIndex"

    ' IndexNulls auf der Grundlage der vom Benutzer im Listenfeld List1
    ' ausgewählten Option festlegen
    Select Case List1.List(List1.ListIndex)
        Case "Allow"
            idxNew.IndexNulls = adIndexNullsAllow
        Case "Ignore"
            idxNew.IndexNulls = adIndexNullsIgnore
        Case Else
            End
    End Select

    ' Den neuen Index an die Employees-Tabelle anhängen
    catNorthwind.Tables("Employees").Indexes.Append idxNew

    rstEmployees.Index = idxNew.Name
    rstEmployees.Open "Employees", cnn, adOpenKeyset, _
        adLockOptimistic, adCmdTableDirect

    With rstEmployees
        ' Einen neuen Datensatz zur Employees-Tabelle hinzufügen.
        .AddNew
        !FirstName = "Gary"
        !LastName = "Haarsager"
        .Update

        ' Den neuen Datensatz mit einem Lesezeichen versehen
        varBookmark = .Bookmark

        ' Den neuen Index zum Festlegen der Reihenfolge der Datensätze
        ' verwenden.
        .MoveFirst

        Debug.Print "Index = " & .Index & _
            ", IndexNulls = " & idxNew.IndexNulls
        Debug.Print "  Country - Name"

        ' Das Recordset aufzählen. Der Wert der IndexNulls-Eigenschaft
        ' bestimmt, ob der neue Datensatz in der Ausgabe angezeigt wird.
        Do While Not .EOF
            Debug.Print "    " & _
                IIf(IsNull(!Country), "[Null]", !Country) & _
                " - " & !FirstName & " " & !LastName
            .MoveNext
        Loop

        ' Den neuen Datensatz löschen, da es sich um ein Beispiel
        ' handelt.
        .Bookmark = varBookmark
        .Delete

        .Close
    End With

    ' Den neuen Index löschen, da es sich um ein Beispiel
    ' handelt.
    catNorthwind.Tables("Employees").Indexes.Delete idxNew.Name
    Set catNorthwind = Nothing

End Sub


Beispiel für die Append-Methode von Schlüsseln, für die Type-Eigenschaft von Schlüsseln und die Eigenschaften RelatedColumn, RelatedTable und UpdateRule (VB)

Mit dem folgenden Code wird gezeigt, wie ein neuer Fremdschlüssel erstellt wird. Dabei wird davon ausgegangen, dass zwei Tabellen (Customers und Orders) vorhanden sind.

Sub CreateKey()

    Dim kyForeign As New ADOX.Key
    Dim cat As New ADOX.Catalog

    ' Den Katalog verbinden
    cat.ActiveConnection = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
        "Data Source=c:\Programme\Microsoft Office\" & _
        "Office\Samples\Northwind.mdb;"

    ' Den Fremdschlüssel definieren
    kyForeign.Name = "CustOrder"
    kyForeign.Type = adKeyForeign
    kyForeign.RelatedTable = "Customers"
    kyForeign.Columns.Append "CustomerId"
    kyForeign.Columns("CustomerId").RelatedColumn = "CustomerId"
    kyForeign.UpdateRule = adRICascade

    ' Den Fremdschlüssel anhängen
    cat.Tables("Orders").Keys.Append kyForeign

    ' Den Schlüssel löschen, da es sich um ein Beispiel handelt
    cat.Tables("Orders").Keys.Delete kyForeign.Name
End Sub


Beispiel für die Eigenschaften NumericScale und Precision (VB)

Dieses Beispiel verdeutlicht die Eigenschaften NumericScale und Precision des Column-Objekts. Der Code zeigt die zugehörigen Werte für die Order Details-Tabelle in der Northwind-Datenbank an.

Sub NumericScalePrecX()

    Dim cnn As New ADODB.Connection
    Dim cat As New ADOX.Catalog
    Dim tblOD As ADOX.Table
    Dim colLoop As ADOX.Column

    ' Den Katalog verbinden.
    cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
        "data source=c:\Programme\" & _
        "Microsoft Office\Office\Samples\Northwind.mdb;"
    Set cat.ActiveConnection = cnn

    ' Die Order Details-Tabelle abrufen
    Set tblOD = cat.Tables("Order Details")

    ' Die numerische Skalierung und Genauigkeit von Feldern mit kurzen
    ' ganzen Zahlen anzeigen.
    For Each colLoop In tblOD.Columns
        If colLoop.Type = adSmallInt Then
            MsgBox "Column: " & colLoop.Name & vbCr & _
                "Numeric scale: " & _
                    colLoop.NumericScale & vbCr & _
                "Precision: " & colLoop.Precision
        End If
    Next colLoop

End Sub


Beispiel für die Parameters-Auflistung, Command-Eigenschaft (VB)

Mit dem folgenden Code wird gezeigt, wie die Command-Eigenschaft mit dem Command-Objekt verwendet wird, um Parameterinformationen für die Prozedur abzurufen.

Sub ProcedureParameters()

    Dim cnn As New ADODB.Connection
    Dim cmd As ADODB.Command
    Dim prm As ADODB.Parameter
    Dim cat As New ADOX.Catalog

    ' Das Connection-Objekt öffnen
    cnn.Open _
        "Provider=Microsoft.Jet.OLEDB.4.0;" & _
        "Data Source=c:\Programme\Microsoft Office\" & _
        "Office\Samples\Northwind.mdb;"

    ' Den Katalog öffnen
    Set cat.ActiveConnection = cnn

    ' Das Command-Objekt abrufen
    Set cmd = cat.Procedures("CustomerById").Command

    ' Parameterdaten abrufen
    cmd.Parameters.Refresh
    For Each prm In cmd.Parameters
        Debug.Print prm.Name & ":" & prm.Type
    Next

End Sub


Beispiel für die ParentCatalog-Eigenschaft (VB)

Mit dem folgenden Code wird gezeigt, wie die ParentCatalog-Eigenschaft verwendet wird, um auf eine providerspezifische Eigenschaft zuzugreifen, bevor einem Katalog eine Tabelle hinzugefügt wird. Bei der Eigenschaft handelt es sich um AutoIncrement, die in einer Microsoft Jet-Datenbank ein AutoIncrement-Feld erstellt.

Sub CreateAutoIncrColumn()

    Dim cnn As New ADODB.Connection
    Dim cat As New ADOX.Catalog
    Dim tbl As New ADOX.Table

    cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
        "Data Source= c:\Programme\" & _
        "Microsoft Office\Office\Samples\Northwind.mdb;"
    Set cat.ActiveConnection = cnn

    With tbl
        .Name = "MyContacts"
        Set .ParentCatalog = cat
        ' Felder erstellen und an das neue Table-Objekt anhängen.
        .Columns.Append "ContactId", adInteger
        ' Automatische Vergrößerung für die ContactId-Spalte festlegen.
        .Columns("ContactId").Properties("AutoIncrement") = True
        .Columns.Append "CustomerID", adVarWChar
        .Columns.Append "FirstName", adVarWChar
        .Columns.Append "LastName", adVarWChar
        .Columns.Append "Phone", adVarWChar, 20
        .Columns.Append "Notes", adLongVarWChar
    End With

    cat.Tables.Append tbl

    Set cat = Nothing

End Sub


Beispiel für die Eigenschaften PrimaryKey und Unique (VB)

Dieses Beispiel verdeutlicht die Eigenschaften PrimaryKey und Unique eines Index-Objekts. Der Code erstellt eine neue Tabelle mit zwei Spalten. Die Eigenschaften PrimaryKey und Unique dienen der Verwendung einer Spalte als Primärschlüssel, für den doppelte Werte nicht zulässig sind.

Sub PrimaryKeyX()

    Dim catNorthwind As New ADOX.Catalog
    Dim tblNew As New ADOX.Table
    Dim idxNew As New ADOX.Index
    Dim idxLoop As New ADOX.Index
    Dim colLoop As New ADOX.Column

    ' Den Katalog verbinden
    catNorthwind.ActiveConnection="Provider=Microsoft.Jet.OLEDB.4.0;" & _
        "data source=c:\Programme\" & _
        "Microsoft Office\Office\Samples\Northwind.mdb;"

    ' Die neue Tabelle benennen
    tblNew.Name = "NewTable"

    ' Ein numerisches Feld und ein Textfeld an die neue Tabelle anhängen.
    tblNew.Columns.Append "NumField", adInteger, 20
    tblNew.Columns.Append "TextField", adVarWChar, 20

    ' Einen neuen Primärschlüsselindex für die NumField-Spalte
    ' an die Tabelle anhängen
    idxNew.Name = "NumIndex"
    idxNew.Columns.Append "NumField"
    idxNew.PrimaryKey = True
    idxNew.Unique = True
    tblNew.Indexes.Append idxNew

    ' Einen Index für TextField an die neue Tabelle anhängen.
    ' Achtung: Das Festlegen des Index- und des Spaltennamens als
    ' Parameter der Append-Methode ist eine andere Technik als zuvor
    tblNew.Indexes.Append "TextIndex", "TextField"

    ' Die neue Tabelle anhängen
    catNorthwind.Tables.Append tblNew

    With tblNew

        Debug.Print tblNew.Indexes.Count & " Indexes in " & _
            tblNew.Name & " Table"

        ' Die Indexes-Aufzählung aufzählen.
        For Each idxLoop In .Indexes

            With idxLoop
                Debug.Print "Index " & .Name
                Debug.Print "   Primary key = " & .PrimaryKey
                Debug.Print "   Unique = " & .Unique

                ' Die Columns-Auflistung jedes Index-Objekts aufzählen.
                Debug.Print "    Columns"
                For Each colLoop In .Columns
                    Debug.Print "       " & colLoop.Name
                Next colLoop

            End With

        Next idxLoop

    End With

    ' Die neue Tabelle löschen, da es sich um ein Beispiel handelt.
    catNorthwind.Tables.Delete tblNew.Name
    Set catNorthwind = Nothing

End Sub


Beispiel für die Append-Methode von Prozeduren (VB)

Mit dem folgenden Code wird gezeigt, wie ein Command-Objekt und die Append-Methode der Procedures-Auflistung verwendet werden, um eine neue Prozedur in der zugrunde liegenden Datenquelle zu erstellen.

Sub CreateProcedure()

    Dim cnn As New ADODB.Connection
    Dim cmd As New ADODB.Command
    Dim prm As ADODB.Parameter
    Dim cat As New ADOX.Catalog

    ' Das Connection-Objekt öffnen
    cnn.Open _
        "Provider=Microsoft.Jet.OLEDB.4.0;" & _
        "Data Source=c:\Programme\Microsoft Office\" & _
        "Office\Samples\Northwind.mdb;"

    ' Den parametrisierten Befehl erstellen (Microsoft Jet-spezifisch)
    Set cmd.ActiveConnection = cnn
    cmd.CommandText = "PARAMETERS [CustId] Text;" & _
        "Select * From Customers Where CustomerId = [CustId]"

    ' Das Catalog-Objekt öffnen
    Set cat.ActiveConnection = cnn

    ' Die neue Prozedur erstellen
    cat.Procedures.Append "CustomerById", cmd

End Sub


Beispiel für die Delete-Methode von Prozeduren (VB)

Mit dem folgenden Code wird gezeigt, wie mithilfe der Delete-Methode der Procedures-Auflistung eine Prozedur gelöscht wird.

Sub DeleteProcedure()

Dim cat As New ADOX.Catalog

    ' Das Catalog-Objekt öffnen.
    cat.ActiveConnection = _
        "Provider=Microsoft.Jet.OLEDB.4.0;" & _
        "Data Source=c:\Programme\Microsoft Office\" & _
        "Office\Samples\Northwind.mdb;"

    ' Die Prozedur löschen.
    cat.Procedures.Delete "CustomerById"

End Sub


Beispiel für die Refresh-Methode von Prozeduren (VB)

Mit dem folgenden Code wird gezeigt, wie die Procedures-Auflistung eines Catalog-Objektes aktualisiert wird. Dies ist erforderlich, bevor auf Procedure-Objekte im Catalog-Objekt zugegriffen werden kann.

Sub ProcedureRefresh()

    Dim cat As New ADOX.Catalog

    ' Das Catalog-Objekt öffnen
    cat.ActiveConnection = _
        "Provider=Microsoft.Jet.OLEDB.4.0;" & _
        "Data Source=c:\Programme\" & _
        "Microsoft Office\Office\Samples\Northwind.mdb;"

    ' Die Procedures-Auflistung aktualisieren
    cat.Procedures.Refresh

End Sub


Beispiel für die SortOrder-Eigenschaft (VB)

Dieses Beispiel verdeutlicht die SortOrder-Eigenschaft eines Column-Objekts, das zu der Columns-Auflistung eines Index-Objekts hinzugefügt wurde. Der Code hängt einen aufsteigend sortierten Index an die Spalte Country in der Employees-Tabelle an und zeigt anschließend die Datensätze an. Der Code hängt anschließend einen absteigend sortierten Index an die Spalte Country in der Employees-Tabelle an und zeigt die Datensätze erneut an. Der Unterschied zwischen aufsteigend und absteigend sortiertem Index wird angezeigt.

Sub SortOrderX()

    Dim cnn As New ADODB.Connection
    Dim catNorthwind As New ADOX.Catalog
    Dim idxAscending As New ADOX.Index
    Dim idxDescending As New ADOX.Index
    Dim rstEmployees As New ADODB.Recordset

    ' Den Katalog verbinden.
    cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
        "data source=c:\Programme\" & _
        "Microsoft Office\Office\Samples\Northwind.mdb;"
    Set catNorthwind.ActiveConnection = cnn

    ' Die Country-Spalte an den neuen Index anhängen
    idxAscending.Columns.Append "Country"
    idxAscending.Columns("Country").SortOrder = adSortAscending
    idxAscending.Name = "Ascending"

    ' Den neuen Index an die Employees-Tabelle anhängen
    catNorthwind.Tables("Employees").Indexes.Append idxAscending

    rstEmployees.Index = idxAscending.Name
    rstEmployees.Open "Employees", cnn, adOpenKeyset, _
        adLockOptimistic, adCmdTableDirect

    With rstEmployees
        .MoveFirst
        Debug.Print "Index = " & .Index
        Debug.Print "  Country - Name"

        ' Das Recordset aufzählen. Der Wert der
        ' IndexNulls-Eigenschaft bestimmt, ob der neue
        ' Datensatz in der Ausgabe angezeigt wird.
        Do While Not .EOF
            Debug.Print "    " & !Country & " - " & _
                !FirstName & " " & !LastName
            .MoveNext
        Loop

        .Close
    End With

    ' Die Country-Spalte an den neuen Index anhängen
    idxDescending.Columns.Append "Country"
    idxDescending.Columns("Country").SortOrder = adSortDescending
    idxDescending.Name = "Descending"

    ' Absteigenden Index an die Employees-Tabelle anhängen
    catNorthwind.Tables("Employees").Indexes.Append idxDescending

    rstEmployees.Index = idxDescending.Name
    rstEmployees.Open "Employees", cnn, adOpenKeyset, _
        adLockOptimistic, adCmdTableDirect

'    DisplaySortedRecords (rstEmployees)

     With rstEmployees
        .MoveFirst
        Debug.Print "Index = " & .Index
        Debug.Print "  Country - Name"

        ' Das Recordset aufzählen. Der Wert der
        ' IndexNulls-Eigenschaft bestimmt, ob der neue
        ' Datensatz in der Ausgabe angezeigt wird.
        Do While Not .EOF
            Debug.Print "    " & !Country & " - " & _
                !FirstName & " " & !LastName
            .MoveNext
        Loop

        .Close
    End With

    ' Die neuen Indizes löschen, da es sich um ein Beispiel handelt.
    catNorthwind.Tables("Employees").Indexes.Delete idxAscending.Name
    catNorthwind.Tables("Employees").Indexes.Delete idxDescending.Name
    Set catNorthwind = Nothing

End Sub


Beispiel für die Auflistungen Views und Fields (VB)

Mit dem folgenden Code wird gezeigt, wie die Command-Eigenschaft mit dem Recordset-Objekt verwendet wird, um Feldinformationen für die Ansicht abzurufen.

Sub ViewFields()

    Dim cnn As New ADODB.Connection
    Dim rst As New ADODB.Recordset
    Dim fld As ADODB.Field
    Dim cat As New ADOX.Catalog

    ' Das Connection-Objekt öffnen
    cnn.Open _
        "Provider=Microsoft.Jet.OLEDB.4.0;" & _
        "Data Source=c:\Programme\Microsoft Office\" & _
        "Office\Samples\Northwind.mdb;"

    ' Den Katalog öffnen
    Set cat.ActiveConnection = cnn

    ' Den Wert von Source für das Recordset festlegen
    Set rst.Source = cat.Views("AllCustomers").Command

    ' Feldinformationen abrufen
    rst.Fields.Refresh
    For Each fld In rst.Fields
        Debug.Print fld.Name & ":" & fld.Type
    Next

End Sub


Beispiel für die Append-Methode von Ansichten (VB)

Mit dem folgenden Code wird gezeigt, wie ein Command-Objekt und die Append-Methode der Views-Auflistung verwendet werden, um eine neue Ansicht in der zugrunde liegenden Datenquelle zu erstellen.

Sub CreateView()

    Dim cmd As New ADODB.Command
    Dim cat As New ADOX.Catalog

    ' Das Catalog-Objekt öffnen
    cat.ActiveConnection = _
        "Provider=Microsoft.Jet.OLEDB.4.0;" & _
        "Data Source=c:\Programme\Microsoft Office\" & _
        "Office\Samples\Northwind.mdb;"

    ' Den Befehl erstellen, der die Ansicht darstellt.
        cmd.CommandText = "Select * From Customers"

    ' Die neue Ansicht erstellen
    cat.Views.Append "AllCustomers", cmd

End Sub


Beispiel für die Views-Auflistung, CommandText-Eigenschaft (VB)

Mit dem folgenden Code wird gezeigt, wie die Command-Eigenschaft verwendet wird, um den Text einer Ansicht zu aktualisieren.

Sub ViewText()

    Dim cnn As New ADODB.Connection
    Dim cat As New ADOX.Catalog
    Dim cmd As New ADODB.Command

    ' Das Connection-Objekt öffnen
    cnn.Open _
        "Provider=Microsoft.Jet.OLEDB.4.0;" & _
        "Data Source=c:\Programme\Microsoft Office\" & _
        "Office\Samples\Northwind.mdb;"

    ' Den Katalog öffnen
    Set cat.ActiveConnection = cnn

    ' Den Befehl abrufen
    Set cmd = cat.Views("AllCustomers").Command

    ' Den Wert von CommandText für das Command-Objekt aktualisieren
    cmd.CommandText = _
        "Select CustomerId, CompanyName, ContactName From Customers"

    ' Die Ansicht aktualisieren
    Set cat.Views("AllCustomers").Command. = cmd

End Sub


Beispiel für die Delete-Methode von Ansichten (VB)

Mit dem folgenden Code wird gezeigt, wie die Delete-Methode verwendet wird, um eine Ansicht aus einem Katalog zu löschen.

Sub DeleteView()

    Dim cat As New ADOX.Catalog

    ' Den Katalog öffnen
    cat.ActiveConnection = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
        "Data Source=c:\Programme\Microsoft Office\" & _
        "Office\Samples\Northwind.mdb;"

    ' Die Ansicht löschen
    cat.Views.Delete "AllCustomers"

End Sub


Beispiel für die Refresh-Methode von Ansichten (VB)

Mit dem folgenden Code wird gezeigt, wie die Views-Auflistung eines Catalog-Objektes aktualisiert wird. Dies ist erforderlich, bevor auf View-Objekte im Catalog-Objekt zugegriffen werden kann.

Sub ProcedureRefresh()

    Dim cat As New ADOX.Catalog

    ' Das Catalog-Objekt öffnen
    cat.ActiveConnection = _
        "Provider=Microsoft.Jet.OLEDB.4.0;" & _
        "Data Source=c:\Programme\" & _
        "Microsoft Office\Office\Samples\Northwind.mdb;"

    ' Die Procedures-Auflistung aktualisieren
    cat.Views.Refresh

End Sub


ADOX-Codebeispiele in Microsoft Visual C++

Diese Themen enthalten Beispielcode, um Ihnen das Verständnis der Verwendung von ADOX zu erleichtern. Alle Codebeispiele wurden mit Microsoft Visual C++ geschrieben.

Anmerkung Fügen Sie das gesamte Codebeispiel von Anfang bis Ende in den Code-Editor ein. Wenn Sie nur Teile der Beispiele verwenden oder die Absatzformatierung verloren geht, wird das Beispiel möglicherweise nicht ordnungsgemäß ausgeführt.

Methoden

  • Beispiel für die Append-Methode von Spalten und Tabellen, Name-Eigenschaft (VC++)

  • Beispiel für die Close-Methode von Verbindungen, Table Type-Eigenschaft (VC++)

  • Beispiel für die Create-Methode (VC++)

  • Beispiel für die Methoden GetObjectOwner und SetObjectOwner (VC++)

  • Beispiel für die Methoden GetPermissions und SetPermissions (VC++)

  • Beispiel für die Append- und ChangePassword-Methoden von Gruppen und Benutzern (VC++)

  • Beispiel für die Append-Methode von Indizes (VC++)

  • Beispiel für die Append-Methode von Schlüsseln, die Type-Eigenschaft von Schlüsseln und die Eigenschaften RelatedColumn, RelatedTable und UpdateRule (VC++)

Eigenschaften

  • Beispiel für die Attributes-Eigenschaft (VC++)

  • Beispiel für die ActiveConnection-Eigenschaft (VC++)

  • Beispiel für die Clustered-Eigenschaft (VC++)

  • Beispiel für die Eigenschaften Command und CommandText (VC++)

  • Beispiel für die Command-Eigenschaft, Parameters-Auflistung (VC++)

  • Beispiel für die Eigenschaften DateCreated und DateModified (VC++)

  • Beispiel für die DefinedSize-Eigenschaft (VC++)

  • Beispiel für die DeleteRule-Eigenschaft (VC++)

  • Beispiel für die IndexNulls-Eigenschaft (VC++)

  • Beispiel für die Type-Eigenschaft von Schlüsseln und die Eigenschaften RelatedColumn, RelatedTable und UpdateRule, Append-Methode von Schlüsseln (VC++)

  • Beispiel für die Name-Eigenschaft, Append-Methode von Spalten und Tabellen (VC++)

  • Beispiel für die Eigenschaften NumericScale und Precision (VC++)

  • Beispiel für die ParentCatalog-Eigenschaft (VC++)

  • Beispiel für die Eigenschaften PrimaryKey und Unique (VC++)

  • Beispiel für die Table Type-Eigenschaft; Close-Methode von Verbindungen (VC++)

Auflistungen

  • Beispiel für die Parameters-Auflistung, Command-Eigenschaft (VC++)


Beispiel für die Attributes-Eigenschaft (VC++)

Dieses Beispiel verdeutlicht die Attributes-Eigenschaft eines Column-Objekts. Durch Festlegen von adColNullable kann der Benutzer den Wert eines Recordset Field-Objekts auf eine leere Zeichenfolge festlegen. In diesem Fall kann der Benutzer zwischen einem Datensatz mit unbekannten Daten und einem mit nicht relevanten Daten unterscheiden.

#import "c:\Programme\Gemeinsame Dateien\system\ado\msado15.dll"
#import "c:\ Programme \Gemeinsame Dateien\system\ado\msadox.dll" \
    no_namespace

#include "iostream.h"
#include "stdio.h"
#include "conio.h"
#include "AttributesX.h"

// Funktionsdeklarationen
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void AttributesX(void);

//////////////////////////////////////////////////////////
//                                                      //
//         Hauptfunktion                                //
//                                                      //
//////////////////////////////////////////////////////////
void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    AttributesX();

    ::CoUninitialize();
}

//////////////////////////////////////////////////////////
//                                                      //
//        AttributesX-Funktion                          //
//                                                      //
//////////////////////////////////////////////////////////
void AttributesX(void)
{
    HRESULT hr = S_OK;

    // ADOX-Objektzeiger definieren.
    // Die Zeiger bei der Definition initialisieren.
    // Sie befinden sich im ADOX::-Namespace.
    _CatalogPtr m_pCatalog  = NULL;
    _ColumnPtr m_pColumn  = NULL;
    _TablePtr m_pTable  = NULL;

    // ADODB-Objektzeiger definieren.
    ADODB::_ConnectionPtr m_pCnn         = NULL;
    ADODB::_RecordsetPtr m_pRstEmployees  = NULL;

    IADORecordBinding *picRs  = NULL;   // Deklarierter
                                        // Schnittstellenzeiger
    CEmployeeRs emprs;            // Class-Objekt von C++

    // Zeichenfolgenvariablen definieren.
    _bstr_t strcnn("Provider=Microsoft.Jet.OLEDB.4.0;"
        "Data Source= c:\\Programme\\Microsoft Office\\"
        "Office\\Samples\\Northwind.mdb;");

    try
    {
        // Den Katalog verbinden.
        TESTHR(hr = m_pCnn.CreateInstance(__uuidof (ADODB::Connection)));
        TESTHR(hr = m_pCatalog.CreateInstance(__uuidof (Catalog)));
        TESTHR(hr = m_pColumn.CreateInstance(__uuidof(Column)));
        TESTHR(hr = m_pRstEmployees.CreateInstance(
            __uuidof(ADODB::Recordset)));
        m_pCnn->Open(strcnn,"","",NULL);

        m_pCatalog->PutActiveConnection(
            _variant_t((IDispatch *) m_pCnn));
        m_pTable= m_pCatalog->Tables->GetItem("Employees");

        // Ein neues Field-Objekt erstellen und an die Fields-Auflistung
        // der Employees-Tabelle anhängen.
        m_pColumn->Name = "FaxPhone";
        m_pColumn->Type = adVarWChar;
        m_pColumn->DefinedSize = 24;
        m_pColumn->Attributes = adColNullable;

        m_pCatalog->Tables->GetItem("Employees")->Columns->
            Append("FaxPhone",adVarWChar,24);

        // Die Employees-Tabelle zum Aktualisieren als Recordset öffnen.
        m_pRstEmployees->Open("Employees",
            _variant_t((IDispatch *) m_pCnn),
            ADODB::adOpenKeyset,ADODB::adLockOptimistic,
            ADODB::adCmdTable);

        // Benutzereingaben abrufen.
        printf("Enter fax number for : %s %s\n",(LPSTR) (_bstr_t)
            m_pRstEmployees->Fields->GetItem("LastName")->Value,
           (LPSTR) (_bstr_t) m_pRstEmployees->Fields->
            GetItem("FirstName")->Value);
        printf("[? - unknown, X - has no fax] : \n");
        char strInput[10];
        gets(strInput);
        char* strTemp = strtok(strInput," \t");
        _variant_t vNull;
        vNull.vt = VT_BSTR;
        vNull.bstrVal = NULL;
        if(strTemp!=NULL)
        {
            if(strcmp(strTemp,"?") == 0)
            {
                m_pRstEmployees->Fields->GetItem("FaxPhone")->
                    PutValue(vNull);
            }
            else if( (strcmp(strTemp,"X") == 0) |
                     (strcmp(strTemp,"x") == 0) )
           {
                m_pRstEmployees->Fields->GetItem("FaxPhone")->
                    PutValue("");
            }
            else
            {
                m_pRstEmployees->Fields->GetItem("FaxPhone")->
                    PutValue(strTemp);
            }
            m_pRstEmployees->Update();

            // Einen IADORecordBinding-Schnittstellenzeiger öffnen, um
            // ihn zum Binden des Recordsets an eine Klasse zu verwenden
            TESTHR(hr = m_pRstEmployees->QueryInterface(
                __uuidof(IADORecordBinding),(LPVOID*)&picRs));

            // Das Recordset jetzt an eine Klasse von C++ binden
            TESTHR(hr = picRs->BindToRecordset(&emprs));

            // Bericht drucken.
            printf("\nName - Fax number\n");
            printf("%s %s ",emprs.lemp_LastNameStatus == adFldOK ?
                emprs.m_szemp_LastName : "<NULL>",
                emprs.lemp_FirstNameStatus == adFldOK ?
                emprs.m_szemp_FirstName : "<NULL>");

            if (emprs.lemp_FaxphoneStatus == adFldNull)
                printf("- [Unknown]");
            else if (strcmp((LPSTR)emprs.m_szemp_Faxphone,"") == 0)
                printf("- [Has no fax]");
            else
                printf("- %s",emprs.m_szemp_Faxphone);
        }
        m_pRstEmployees->Close();

        // Das neue Feld löschen, da es sich um ein Beispiel handelt.
        m_pTable->Columns->Delete(m_pColumn->Name);

        // Die IADORecordset-Schnittstelle jetzt freigeben
        if(picRs)
            picRs->Release();
        m_pCnn->Close();
    }

    catch(_com_error &e)
    {
        // Den Benutzer ggf. über Fehler benachrichtigen.
        _bstr_t bstrSource(e.Source());
        _bstr_t bstrDescription(e.Description());

        printf("\n\tSource :  %s \n\tdescription : %s \n ",
            (LPCSTR)bstrSource,(LPCSTR)bstrDescription);
    }

    catch(...)
    {
        cout << "Error occured in include files...."<< endl;
    }
}

AttributesX.h

#include "icrsint.h"

// Diese Klasse extrahiert LastName, FirstName und FaxPhone aus der
// Employees-Tabelle

class CEmployeeRs : public CADORecordBinding
{
BEGIN_ADO_BINDING(CEmployeeRs)
        // Die LastName-Spalte ist das zweite Feld in der Tabelle
        ADO_VARIABLE_LENGTH_ENTRY2(2,adVarChar,m_szemp_LastName,
            sizeof(m_szemp_LastName),lemp_LastNameStatus,TRUE)
        // Die FirstName-Spalte ist das 17. Feld in der Tabelle
        ADO_VARIABLE_LENGTH_ENTRY2(17,adVarChar,m_szemp_FirstName,
            sizeof(m_szemp_FirstName),lemp_FirstNameStatus,TRUE)
        // Die FaxPhone-Spalte ist das 18. Feld in der Tabelle
        ADO_VARIABLE_LENGTH_ENTRY2(18,adVarChar,m_szemp_Faxphone,
            sizeof(m_szemp_Faxphone),lemp_FaxphoneStatus,TRUE)
END_ADO_BINDING()

public:
    CHAR m_szemp_LastName[21];
    ULONG lemp_LastNameStatus;
    CHAR m_szemp_FirstName[11];
    ULONG lemp_FirstNameStatus;
    CHAR m_szemp_Faxphone[25];
    ULONG lemp_FaxphoneStatus;
};


Beispiel für die ActiveConnection-Eigenschaft (VC++)

Durch Festlegen der ActiveConnection-Eigenschaft auf eine gültige geöffnete Verbindung wird der Katalog "geöffnet". Über einen geöffneten Katalog können Sie auf die im Katalog enthaltenen Schemaobjekte zugreifen.

#import "c:\Programme\Gemeinsame Dateien\system\ado\msado15.dll"
#import "c:\Programme\Gemeinsame Dateien\system\ado\msadox.dll" \
    no_namespace

#include "iostream.h"
#include "stdio.h"
#include "conio.h"

// Funktionsdeklarationen
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void OpenConnectionX(void);
void OpenConnectionWithStringX(void);

//////////////////////////////////////////////////////////
//                                                      //
//         Hauptfunktion                                //
//                                                      //
//////////////////////////////////////////////////////////
void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    OpenConnectionX();

    OpenConnectionWithStringX();

    ::CoUninitialize();
}

//////////////////////////////////////////////////////////
//                                                      //
//     OpenConnectionX-Funktion                         //
//                                                      //
//////////////////////////////////////////////////////////
void OpenConnectionX(void)
{
   HRESULT   hr = S_OK;

    // ADOX-Objektzeiger definieren.
    // Die Zeiger bei der Definition initialisieren.
    // Sie befinden sich im ADOX::-Namespace.
    _CatalogPtr m_pCatalog = NULL;

    // ADODB-Objektzeiger definieren.
    ADODB::_ConnectionPtr m_pCnn   = NULL;

    // Zeichenfolgenvariablen definieren.
    _bstr_t strcnn("Provider=Microsoft.JET.OLEDB.4.0;"
        "Data source = c:\\Programme\\Microsoft Office\\"
        "Office\\Samples\\Northwind.mdb;");

       try
    {
        TESTHR(hr = m_pCnn.CreateInstance(__uuidof(ADODB::Connection)));
        TESTHR(hr = m_pCatalog.CreateInstance(__uuidof (Catalog)));
        m_pCnn->Open(strcnn,"","",NULL);
        m_pCatalog->PutActiveConnection(
            _variant_t((IDispatch *) m_pCnn));
        _variant_t vIndex = (short) 0;
        cout<<m_pCatalog->Tables->GetItem(vIndex)->Type<<endl;
        m_pCnn->Close();
    }

    catch(_com_error &e)
    {
        // Den Benutzer ggf. über Fehler benachrichtigen.
        _bstr_t bstrSource(e.Source());
        _bstr_t bstrDescription(e.Description());

        printf("\n\tSource :  %s \n\tdescription : %s \n ",
            (LPCSTR)bstrSource,(LPCSTR)bstrDescription);
    }

    catch(...)
    {
        cout << "Error occured in include files...."<< endl;
    }
}

//////////////////////////////////////////////////////////
//                                                      //
//         OpenConnectionWithStringX-Funktion           //
//                                                      //
//////////////////////////////////////////////////////////
void OpenConnectionWithStringX(void)
{
   HRESULT   hr = S_OK;

    // ADOX-Objektzeiger definieren.
    // Die Zeiger bei der Definition initialisieren.
    // Sie befinden sich im ADOX::-Namespace.
   _CatalogPtr m_pCatalog = NULL;

   // Zeichenfolgenvariablen definieren.
    _bstr_t strcnn("Provider=Microsoft.JET.OLEDB.4.0;"
                "Data source = c:\\Programme\\Microsoft Office\\"
            "Office\\Samples\\Northwind.mdb;");

       try
    {
        TESTHR(hr = m_pCatalog.CreateInstance(__uuidof (Catalog)));
        m_pCatalog->PutActiveConnection(strcnn);
        _variant_t vIndex = (short) 0;
        cout<<m_pCatalog->Tables->GetItem(vIndex)->Type<<endl;
    }

    catch(_com_error &e)
    {
        // Den Benutzer ggf. über Fehler benachrichtigen.
        _bstr_t bstrSource(e.Source());
        _bstr_t bstrDescription(e.Description());

        printf("\n\tSource :  %s \n\tdescription : %s \n ",
           (LPCSTR)bstrSource,(LPCSTR)bstrDescription);
    }
    catch(...)
    {
        cout << "Error occured in include files...."<< endl;
    }
}


Beispiel für die Clustered-Eigenschaft (VC++)

Dieses Beispiel verdeutlicht die Clustered-Eigenschaft eines Index-Objekts. Beachten Sie, dass Microsoft Jet-Datenbanken keine gruppierten Indizes unterstützen, weshalb dieses Beispiel False für die Clustered-Eigenschaft aller Indizes der Northwind-Datenbank zurückgibt.

#import "c:\Programme\Gemeinsame Dateien\system\ado\msadox.dll" \
    no_namespace

#include "iostream.h"
#include "stdio.h"
#include "conio.h"

//Funktionsdeklarationen
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void ClusteredX(void);

//////////////////////////////////////////////////////////
//                                                      //
//     Hauptfunktion                                    //
//                                                      //
//////////////////////////////////////////////////////////
void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    ClusteredX();

    ::CoUninitialize();
}

//////////////////////////////////////////////////////////
//                                                      //
//       ClusteredX-Funktion                            //
//                                                      //
//////////////////////////////////////////////////////////
void ClusteredX()
{
    HRESULT hr = S_OK;

    // ADOX-Objektzeiger definieren.
    // Die Zeiger bei der Definition initialisieren.
    // Sie befinden sich im ADOX::-Namespace.
    _CatalogPtr m_pCatalog = NULL;
    _TablePtr m_pTable = NULL;
    _IndexPtr m_pIndex = NULL;

    // Andere Variablen jetzt definieren
    _variant_t vIndex;
    try
    {
        TESTHR(hr = m_pCatalog.CreateInstance(__uuidof(Catalog)));

        // Verbindung zum Katalog herstellen.
        m_pCatalog->PutActiveConnection(
            "Provider=Microsoft.Jet.OLEDB.4.0;data source="
            "c:\\Programme\\Microsoft Office\\Office\\Samples"
            "\\Northwind.mdb;");

        int iLineCnt = 1;
        // Tabellen aufzählen.
        for(short iTable = 0;iTable < m_pCatalog->Tables->Count;iTable++)
        {
            vIndex = iTable;
            m_pTable = m_pCatalog->Tables->GetItem(vIndex);

            // Indizes aufzählen.
            for(short iIndex = 0;iIndex < m_pTable->Indexes->Count;
                iIndex++)
            {
                vIndex = iIndex;
                m_pIndex = m_pTable->Indexes->GetItem(vIndex);
                cout << m_pTable->Name << " " ;
                cout << m_pIndex->Name << " " << (m_pIndex->
                    GetClustered() ? "True" : "False") << endl;
                 if (iLineCnt%15 == 0)
                {
                    printf("\nPress any key to continue...\n");
                    getch();
                }
                iLineCnt++;
            }
        }
    }
    catch(_com_error &e)
    {
        // Den Benutzer ggf. über Fehler benachrichtigen.
        _bstr_t bstrSource(e.Source());
        _bstr_t bstrDescription(e.Description());

        printf("\n\tSource :  %s \n\tdescription : %s \n ",
            (LPCSTR)bstrSource,(LPCSTR)bstrDescription);
    }

    catch(...)
    {
        cout << "Error occured in include files...."<< endl;
    }
}


Beispiel für die Append-Methode von Spalten und Tabellen, Name-Eigenschaft (VC++)

Mit dem folgenden Code wird gezeigt, wie eine neue Tabelle erstellt wird.

#import "c:\Programme\Gemeinsame Dateien\system\ado\msadox.dll" \
    no_namespace

#include "iostream.h"
#include "stdio.h"
#include "conio.h"

// Funktionsdeklarationen
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void CreateTableX(void);

//////////////////////////////////////////////////////////
//                                                      //
//       Hauptfunktion                                  //
//                                                      //
//////////////////////////////////////////////////////////
void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    CreateTableX();

    ::CoUninitialize();
}

//////////////////////////////////////////////////////////
//                                                      //
//       CreateTableX-Funktion                          //
//                                                      //
//////////////////////////////////////////////////////////
void CreateTableX()
{
        HRESULT hr = S_OK;

        // ADOX-Objektzeiger definieren.
        // Die Zeiger bei der Definition initialisieren.
        // Sie befinden sich im ADOX::-Namespace.
        _CatalogPtr m_pCatalog = NULL;
        _TablePtr m_pTable = NULL;

        try
        {
            TESTHR(hr = m_pCatalog.CreateInstance(__uuidof(Catalog)));

            // Den Katalog öffnen
            m_pCatalog->PutActiveConnection(
                "Provider=Microsoft.Jet.OLEDB.4.0;" \
                "data source=c:\\Programme\\Microsoft Office"
                "\\Office\\Samples\\Northwind.mdb;");

            TESTHR(hr = m_pTable.CreateInstance(__uuidof(Table)));
            m_pTable->PutName("MyTable");
            m_pTable->Columns->Append("Column1",adInteger,0);
            m_pTable->Columns->Append("Column2",adInteger,0);
            m_pTable->Columns->Append("Column3",adVarWChar,50);
            m_pCatalog->Tables->Append(
                _variant_t((IDispatch *)m_pTable));

            // Die Tabelle löschen
            m_pCatalog->Tables->Delete("MyTable");
        }

    catch(_com_error &e)
    {
        // Den Benutzer ggf. über Fehler benachrichtigen.
        _bstr_t bstrSource(e.Source());
        _bstr_t bstrDescription(e.Description());

        printf("\n\tSource :  %s \n\tdescription : %s \n ",
            (LPCSTR)bstrSource,(LPCSTR)bstrDescription);
    }

    catch(...)
    {
        cout << "Error occured in include files...."<< endl;
    }
}


Beispiel für die Eigenschaften Command und CommandText (VC++)

Mit dem folgenden Code wird gezeigt, wie die Command-Eigenschaft verwendet wird, um den Text einer Prozedur zu aktualisieren.

#import "c:\Programme\Gemeinsame Dateien\system\ado\msadox.dll" \
    no_namespace
#import "c:\Programme\Gemeinsame Dateien\system\ado\msado15.dll"

#include "iostream.h"
#include "stdio.h"
#include "conio.h"

// Funktionsdeklarationen
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void ProcedureTextX(void);

//////////////////////////////////////////////////////////
//                                                      //
//      Hauptfunktion                                   //
//                                                      //
//////////////////////////////////////////////////////////
void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    ProcedureTextX();

    ::CoUninitialize();
}

//////////////////////////////////////////////////////////
//                                                      //
//       ProcedureTextX-Funktion                        //
//                                                      //
//////////////////////////////////////////////////////////
void ProcedureTextX()
{
    HRESULT hr = S_OK;

    // ADOX-Objektzeiger definieren.
    // Die Zeiger bei der Definition initialisieren.
    // Sie befinden sich im ADOX::-Namespace.
    _CatalogPtr m_pCatalog = NULL;

    // ADODB-Objektzeiger definieren.
    ADODB::_ConnectionPtr m_pCnn = NULL;
    ADODB::_CommandPtr m_pCommand = NULL;

    try
    {
        // Das Connection-Objekt öffnen
        TESTHR(hr = m_pCnn.CreateInstance(__uuidof(ADODB::Connection)));
        TESTHR(hr = m_pCatalog.CreateInstance(__uuidof(Catalog)));
        TESTHR(hr = m_pCommand.CreateInstance(__uuidof(ADODB::Command)));
        m_pCnn->Open("Provider=Microsoft.Jet.OLEDB.4.0;"
            "data source=c:\\Programme\\Microsoft Office"
            "\\Office\\Samples\\Northwind.mdb;","","",NULL);

        // Den Katalog öffnen
        m_pCatalog->PutActiveConnection(_variant_t((IDispatch *)m_pCnn));

        // Den Befehl abrufen
        m_pCommand = m_pCatalog->Procedures->GetItem("CustomerById")->
            GetCommand();

        // CommandText aktualisieren
        m_pCommand->PutCommandText("PARAMETERS [CustId] Text;select "
            "CustomerId, CompanyName, ContactName"
            "from Customers where CustomerId = [CustId]");

        // Die Prozeduren aktualisieren
        m_pCatalog->Procedures->GetItem("CustomerById")->PutCommand(
            _variant_t((IDispatch *)m_pCommand));
    }

    catch(_com_error &e)
    {
        // Den Benutzer ggf. über Fehler benachrichtigen.
        _bstr_t bstrSource(e.Source());
        _bstr_t bstrDescription(e.Description());

        printf("\n\tSource :  %s \n\tdescription : %s \n ",
            (LPCSTR)bstrSource,(LPCSTR)bstrDescription);
    }

    catch(...)
    {
        cout << "Error occured in include files...."<< endl;
    }
}


Beispiel für die Close-Methode von Verbindungen, Table Type-Eigenschaft (VC++)

Durch Festlegen der ActiveConnection-Eigenschaft auf Nothing wird der Katalog "geschlossen". Zugeordnete Auflistungen enthalten dann keine Daten. Objekte, die aus Schemaobjekten im Katalog erstellt wurden, sind verwaist. Sämtliche Eigenschaften dieser Objekte, die zwischengespeichert wurden, sind zwar weiterhin verfügbar, jedoch ist es nicht möglich, Eigenschaften zu lesen, wenn hierzu der Provider angerufen werden muss.

#import "c:\Programme\Gemeinsame Dateien\system\ado\msadox.dll" \
    no_namespace
#import "c:\Programme\Gemeinsame Dateien\system\ado\msado15.dll"

#include "iostream.h"
#include "stdio.h"
#include "conio.h"

// Funktionsdeklarationen
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void CloseConnectionByNothingX(void);
void CloseConnectionX(void);

//////////////////////////////////////////////////////////
//                                                      //
//     Hauptfunktion                                    //
//                                                      //
//////////////////////////////////////////////////////////
void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    CloseConnectionByNothingX();

    CloseConnectionX();

    ::CoUninitialize();
}

//////////////////////////////////////////////////////////
//                                                      //
//        CloseConnectionByNothingX-Funktion            //
//                                                      //
//////////////////////////////////////////////////////////
void CloseConnectionByNothingX(void)
{
    HRESULT hr = S_OK;

    // ADOX-Objektzeiger definieren.
    // Die Zeiger bei der Definition initialisieren.
    // Sie befinden sich im ADOX::-Namespace.

    _CatalogPtr m_pCatalog = NULL;
    _TablePtr m_pTable = NULL;

    // ADODB-Objektzeiger definieren
    ADODB::_ConnectionPtr m_pCnn = NULL;

    // Andere Variablen definieren
    _variant_t vIndex = (short) 0;

    try
    {
        TESTHR(hr = m_pCnn.CreateInstance(__uuidof(ADODB::Connection)));

        TESTHR(hr = m_pCatalog.CreateInstance(__uuidof(Catalog)));

        m_pCnn->Open("Provider=Microsoft.Jet.OLEDB.4.0;"
            "Data Source= c:\\Programme\\Microsoft Office\\"
            "Office\\Samples\\Northwind.mdb;","","",NULL);

        m_pCatalog->PutActiveConnection(_variant_t((IDispatch *)m_pCnn));

        m_pTable = m_pCatalog->Tables->GetItem(vIndex);

        // Daten aus m_pTable.Type zwischenspeichern
        cout << m_pTable->Type << endl;

        _variant_t vCnn;
        vCnn.vt = VT_DISPATCH;
        vCnn.pdispVal = NULL;
        m_pCatalog->PutActiveConnection(vCnn);

        // m_pTable ist verwaist
        cout << m_pTable->Type << endl;

        // Die vorige Zeile ist erfolgreich, falls diese Daten
        // zwischengespeichert wurden
        cout << m_pTable->Columns->GetItem(vIndex)->DefinedSize << endl;
        // Die vorige Zeile schlägt fehl, falls diese Daten nicht
        // zwischengespeichert wurden
    }

    catch(_com_error &e)
    {
        // Den Benutzer ggf. über Fehler benachrichtigen.
        _bstr_t bstrSource(e.Source());
        _bstr_t bstrDescription(e.Description());

        printf("\n\tSource :  %s \n\tdescription : %s \n ",(LPCSTR)bstrSource,(LPCSTR)bstrDescription);
    }

    catch(...)
    {
        cout << "Error occured in include files...."<< endl;
    }
}

//////////////////////////////////////////////////////////
//                                                      //
//     CloseConnectionX-Funktion                        //
//                                                      //
//////////////////////////////////////////////////////////
void CloseConnectionX()
{
    HRESULT hr = S_OK;

    // ADOX-Objektzeiger definieren.
    // Die Zeiger bei der Definition initialisieren.
    // Sie befinden sich im ADOX::-Namespace.

    _CatalogPtr m_pCatalog = NULL;
    _TablePtr m_pTable = NULL;

    // ADODB-Objektzeiger definieren
    ADODB::_ConnectionPtr m_pCnn = NULL;

    // Andere Variablen definieren
    _variant_t vIndex = (short) 0;
    try
    {
        TESTHR(hr = m_pCnn.CreateInstance(__uuidof(ADODB::Connection)));
        m_pCnn->Open("Provider=Microsoft.Jet.OLEDB.4.0;"
            "Data Source= c:\\Programme\\Microsoft Office\\"
            "Office\\Samples\\Northwind.mdb;","","",NULL);

        TESTHR(hr = m_pCatalog.CreateInstance(__uuidof(Catalog)));
        m_pCatalog->PutActiveConnection(_variant_t((IDispatch *)m_pCnn));

        m_pTable = m_pCatalog->Tables->GetItem(vIndex);

        // Daten aus m_pTable.Type zwischenspeichern
        cout << m_pTable->Type << endl;

        m_pCnn->Close();

        // m_pTable ist verwaist
        cout << m_pTable->Type << endl;

        // Die vorige Zeile ist erfolgreich, falls diese Daten
        // zwischengespeichert wurden
        cout << m_pTable->Columns->GetItem(vIndex)->DefinedSize << endl;
        // Die vorige Zeile schlägt fehl, falls diese Daten nicht
        // zwischengespeichert wurden
    }

    catch(_com_error &e)
    {
        // Den Benutzer ggf. über Fehler benachrichtigen.
        _bstr_t bstrSource(e.Source());
        _bstr_t bstrDescription(e.Description());

        printf("\n\tSource :  %s \n\tdescription : %s \n ",
            (LPCSTR)bstrSource,(LPCSTR)bstrDescription);
    }

    catch(...)
    {
        cout << "Error occured in include files...."<< endl;
    }
}


Beispiel für die Create-Methode (VC++)

Mit dem folgenden Code wird gezeigt, wie eine neue Microsoft Jet-Datenbank mit der Create-Methode erstellt wird.

#import "c:\Programme\Gemeinsame Dateien\system\ado\msadox.dll" no_namespace
#import "c:\Programme\Gemeinsame Dateien\system\ado\msado15.dll"

#include "iostream.h"
#include "stdio.h"
#include "conio.h"

// Funktionsdeklarationen
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void CreateDatabaseX(void);

//////////////////////////////////////////////////////////
//                                                      //
//     Hauptfunktion                                    //
//                                                      //
//////////////////////////////////////////////////////////
void main()
{
    if(FAILED(CoInitialize(NULL)))
        return;

    CreateDatabaseX();

    ::CoUninitialize();
}

//////////////////////////////////////////////////////////
//                                                      //
//     CreateDatabaseX-Funktion                         //
//                                                      //
//////////////////////////////////////////////////////////
void CreateDatabaseX()
{
    HRESULT hr = S_OK;

    // ADOX-Objektzeiger definieren.
    // Die Zeiger bei der Definition initialisieren.
    // Sie befinden sich im ADOX::-Namespace.

    _CatalogPtr m_pCatalog = NULL;

    // ActiveConnection für den Katalog auf diese Zeichenfolge festlegen
    _bstr_t strcnn("Provider=Microsoft.JET.OLEDB.4.0;"
                "Data source = c:\\new.mdb");
    try
    {
        TESTHR(hr = m_pCatalog.CreateInstance(__uuidof (Catalog)));
        m_pCatalog->Create(strcnn);

    }

    catch(_com_error &e)
    {
        // Den Benutzer ggf. über Fehler benachrichtigen.
        _bstr_t bstrSource(e.Source());
        _bstr_t bstrDescription(e.Description());

        printf("\n\tSource :  %s \n\tdescription : %s \n ",(LPCSTR)bstrSource,(LPCSTR)bstrDescription);

    }

    catch(...)
    {
        cout << "Error occured in include files...."<< endl;
    }

}


Beispiel für die Eigenschaften DateCreated und DateModified (VC++)

Dieses Beispiel verdeutlicht die Eigenschaften DateCreated und DateModified durch Hinzufügen eines neuen Column-Objekts zu einem vorhandenen Table-Objekt sowie durch Erstellen eines neuen Table-Objekts. Zum Ausführen dieses Beispiels ist die Prozedur DateOutput erforderlich.

#import "c:\Programme\Gemeinsame Dateien\system\ado\msadox.dll" \
    no_namespace
#import "c:\Programme\Gemeinsame Dateien\system\ado\msado15.dll"

#include "iostream.h"
#include "stdio.h"
#include "conio.h"

// Funktionsdeklarationen
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void DateCreatedX(void);
void DateOutPut(_bstr_t strTemp , _TablePtr tblTemp);

//////////////////////////////////////////////////////////
//                                                      //
//        Hauptfunktion                                 //
//                                                      //
//////////////////////////////////////////////////////////
void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    DateCreatedX();

    ::CoUninitialize();
}

//////////////////////////////////////////////////////////
//                                                      //
//       DateCreatedX-Funktion                          //
//                                                      //
//////////////////////////////////////////////////////////
void DateCreatedX()
{
    HRESULT hr = S_OK;

    // ADOX-Objektzeiger definieren.
    // Die Zeiger bei der Definition initialisieren.
    // Sie befinden sich im ADOX::-Namespace.
    _CatalogPtr m_pCatalog = NULL;
    _TablePtr m_pTblEmployees = NULL;
    _TablePtr m_pTblNew = NULL;

    // ActiveConnection für den Katalog auf diese Zeichenfolge festlegen
    _bstr_t strCnn("Provider=Microsoft.Jet.OLEDB.4.0;"
        "Data Source= c:\\Programme\\Microsoft Office\\"
        "Office\\Samples\\Northwind.mdb;");

    try
    {
        TESTHR(hr = m_pCatalog.CreateInstance(__uuidof (Catalog)));

        // Den Katalog verbinden.
        m_pCatalog->PutActiveConnection(strCnn);

        m_pTblEmployees = m_pCatalog->Tables->GetItem("Employees");

        // Aktuelle Informationen über die Employees-Tabelle drucken.
        DateOutPut((_bstr_t)"Current properties", m_pTblEmployees);

        // Eine Spalte erstellen und an die Employees-Tabelle anhängen.
        m_pTblEmployees->Columns->Append("NewColumn", adInteger,0);

        m_pCatalog->Tables->Refresh();

        // Neue Informationen über die Employees-Tabelle drucken.
        DateOutPut((_bstr_t)"After creating a new column",
            m_pTblEmployees);

        // Die neue Spalte lösche, da es sich um ein Beispiel handelt.
        m_pTblEmployees->Columns->Delete("NewColumn");

        // Ein neues Table-Objekt erstellen und an die Northwind-
        // Datenbank anhängen.
         TESTHR(hr = m_pTblNew.CreateInstance(__uuidof(Table)));

        m_pTblNew->Name = "NewTable";
        m_pTblNew->Columns->Append("NewColumn", adInteger,0);
        m_pCatalog->Tables->Append(_variant_t((IDispatch*)m_pTblNew));
        m_pCatalog->Tables->Refresh();

        // Informationen über das neue Table-Objekt drucken.
        DateOutPut((_bstr_t)"After creating a new table", m_pCatalog->
            Tables->GetItem("NewTable"));

        // Das neue Table-Objekt löschen, da es sich um ein Beispiel
        // handelt.
        m_pCatalog->Tables->Delete(m_pTblNew->Name);
}

    catch(_com_error &e)
    {
        // Den Benutzer ggf. über Fehler benachrichtigen.
        _bstr_t bstrSource(e.Source());
        _bstr_t bstrDescription(e.Description());

        printf("\n\tSource :  %s \n\tdescription : %s \n ",
            (LPCSTR)bstrSource,(LPCSTR)bstrDescription);
    }

    catch(...)
    {
        cout << "Error occured in include files...."<< endl;
    }
}

//////////////////////////////////////////////////////////
//                                                      //
//        DateOutPut-Funktion                           //
//                                                      //
//////////////////////////////////////////////////////////
void DateOutPut(_bstr_t strTemp , _TablePtr tblTemp)
{
    // Daten in DateCreated und DateModified für das
    // angegebene Table-Objekt drucken.
    cout << strTemp << endl;
    cout << "    Table: " << tblTemp->GetName() << endl;
    cout << "        DateCreated = " << (_bstr_t)tblTemp->
        GetDateCreated() << endl;
    cout << "        DateModified = " << (_bstr_t)tblTemp->
        GetDateModified() << endl;
}


Beispiel für die DefinedSize-Eigenschaft (VC++)

Dieses Beispiel verdeutlicht die DefinedSize-Eigenschaft eines Column-Objekts. Mit diesem Code wird die Größe der Spalte FirstName in der Employees-Tabelle der Northwind-Datenbank neu festgelegt. Die Änderung der Werte im FirstName-Field-Objekt eines Recordsets, das auf der Employees-Tabelle basiert, wird anschließend angezeigt. Beachten Sie, dass nach dem Neudefinieren der DefinedSize-Eigenschaft standardmäßig das FirstName-Feld mit Leerstellen aufgefüllt wird.

#import "c:\Programme\Gemeinsame Dateien\system\ado\msadox.dll" \
    no_namespace
#import "C:\Programme\Gemeinsame Dateien\System\ADO\msado15.dll" \
     rename("EOF", "EndOfFile")

#include "iostream.h"
#include "stdio.h"
#include "conio.h"

// Funktionsdeklarationen
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void DefinedSizeX(void);

//////////////////////////////////////////////////////////
//                                                      //
//      Hauptfunktion                                   //
//                                                      //
//////////////////////////////////////////////////////////
void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    DefinedSizeX();

    ::CoUninitialize();
}

//////////////////////////////////////////////////////////
//                                                      //
//      DefinedSizeX-Funktion                           //
//                                                      //
//////////////////////////////////////////////////////////
void DefinedSizeX(void)
{
    HRESULT hr = S_OK;

    // ADOX-Objektzeiger definieren.
    // Die Zeiger bei der Definition initialisieren.
    // Sie befinden sich im ADOX::-Namespace.
    _CatalogPtr m_pCatNorthwind   = NULL;
    _ColumnPtr m_pColFirstName    = NULL;
    _ColumnPtr m_pColNewFirstName = NULL;

    // ADODB-Objektzeiger definieren
    ADODB::_RecordsetPtr m_pRstEmployees  = NULL;

    // Zeichenfolgenvariablen definieren.
    _bstr_t strCnn("Provider=Microsoft.Jet.OLEDB.4.0;data source="
        "c:\\Programme\\Microsoft Office\\Office\\Samples\\"
        "Northwind.mdb;");
    _bstr_t aryFirstName[10];

    try
    {
        // Ein Recordset für die Employees-Tabelle öffnen.
        TESTHR(hr = m_pRstEmployees.CreateInstance(
            __uuidof(ADODB::Recordset)));
        TESTHR(hr = m_pCatNorthwind.CreateInstance(__uuidof (Catalog)));
        TESTHR(hr = m_pColNewFirstName.CreateInstance(__uuidof(Column)));
        m_pRstEmployees->Open("Employees",strCnn,ADODB::adOpenKeyset,
            ADODB::adLockReadOnly,ADODB::adCmdTable);
        long lngSize = m_pRstEmployees->RecordCount;
        aryFirstName[lngSize];

        // Einen Katalog für die Northwind-Datenbank mithilfe
        // derselben Verbindung wie für rstEmployees öffnen.
        m_pCatNorthwind->PutActiveConnection(m_pRstEmployees->
            GetActiveConnection());

        // Das Recordset durchlaufen und den Inhalt, die
        // definierte Größe sowie die tatsächliche Größe des
        // FirstName-Feldes anzeigen.
        // Außerdem die FirstName-Werte im aryFirstName-Array speichern.
        m_pRstEmployees->MoveFirst();
        printf("\nOriginal Defined Size and Actual Size");
        int iCount=0;
        while (!(m_pRstEmployees->EndOfFile))
        {
            printf("\nEmployee Name:");
            printf("%s ",(LPSTR)(_bstr_t)m_pRstEmployees->Fields->
                GetItem("FirstName")->Value);
            printf("%s\n",(LPSTR)(_bstr_t)m_pRstEmployees->Fields->
                GetItem("LastName")->Value);
            printf("  FirstName Defined size: %d\n",m_pRstEmployees->
                Fields->GetItem("FirstName")->DefinedSize) ;
            printf("  FirstName Actual size: %d\n",m_pRstEmployees->
                Fields->GetItem("FirstName")->ActualSize);
            aryFirstName[iCount] = (_bstr_t) m_pRstEmployees->Fields->
                GetItem("FirstName")->Value;
            m_pRstEmployees->MoveNext();
            iCount++;
            if(iCount%5==0)
            {
                printf("Press any key to continue...");
                getch();
                system("cls");
            }
        }
        m_pRstEmployees->Close();

        // DefinedSize für FirstName im Katalog neu definieren.
        m_pColFirstName = m_pCatNorthwind->Tables->GetItem("Employees")->
            Columns->GetItem("FirstName");
        m_pColNewFirstName->Name = m_pColFirstName->Name;
        m_pColNewFirstName->Type = m_pColFirstName->Type;
        m_pColNewFirstName->DefinedSize =
            (m_pColFirstName->DefinedSize) + 1;

        // Die neue FirstName-Spalte an den Katalog anhängen.
        m_pCatNorthwind->Tables->GetItem("Employees")->Columns->
            Delete(m_pColFirstName->Name);
        m_pCatNorthwind->Tables->GetItem("Employees")->Columns->
            Append(_variant_t((IDispatch*)m_pColNewFirstName,true),
            adVarWChar,m_pColNewFirstName->DefinedSize);

        // Die Employees-Tabelle zum Aktualisieren im Recordset öffnen.
        m_pRstEmployees->Open("Employees",m_pCatNorthwind->
            GetActiveConnection(),ADODB::adOpenKeyset,
            ADODB::adLockOptimistic,ADODB::adCmdTable);

        // Das Recordset durchlaufen und den Inhalt, die
        // definierte Größe sowie die tatsächliche Größe des
        // FirstName-Feldes anzeigen. Außerdem
        // die FirstName-Werte aus aryFirstName wiederherstellen.
        printf("Press any key to continue...");
        getch();
        system("cls");
        m_pRstEmployees->MoveFirst();
        printf("\n\nNew Defined Size and Actual Size");
        iCount=0;
        while (!(m_pRstEmployees->EndOfFile))
        {
            m_pRstEmployees->Fields->GetItem("FirstName")->Value =
                aryFirstName[iCount];
            printf("\nEmployee Name: ");
            printf("%s ",(LPSTR) (_bstr_t)m_pRstEmployees->Fields->
                GetItem("FirstName")->Value);
            printf("%s\n",(LPSTR)(_bstr_t)m_pRstEmployees->Fields->
                GetItem("LastName")->Value);
            printf("  FirstName Defined size: %d\n",m_pRstEmployees->
                Fields->GetItem("FirstName")->DefinedSize );
            printf("  FirstName Actual size: %d\n",m_pRstEmployees->
                Fields->GetItem("FirstName")->ActualSize );
            m_pRstEmployees->MoveNext();
            iCount++;
            if(iCount%5==0)
            {
                printf("Press any key to continue...");
                getch();
                system("cls");
            }
        }
        m_pRstEmployees->Close();

        // Die ursprüngliche FirstName-Spalte im Katalog wiederherstellen
        m_pCatNorthwind->Tables->GetItem("Employees")->Columns->
            Delete(m_pColNewFirstName->Name);
        m_pCatNorthwind->Tables->GetItem("Employees")->Columns->
            Append(_variant_t((IDispatch*)m_pColFirstName,true),
            adVarWChar,m_pColFirstName->DefinedSize);

        // Die ursprünglichen FirstName-Werte in der Employees-Tabelle
        // wiederherstellen.
        m_pRstEmployees->Open("Employees",m_pCatNorthwind->
            GetActiveConnection(),ADODB::adOpenKeyset,
            ADODB::adLockOptimistic,ADODB::adCmdTable);

        m_pRstEmployees->MoveFirst();
        iCount = 0;
        while(!(m_pRstEmployees->EndOfFile))
        {
            m_pRstEmployees->Fields->GetItem("FirstName")->Value =
                aryFirstName[iCount];
            m_pRstEmployees->MoveNext();
            iCount++;
        }
        m_pRstEmployees->Close();
        m_pCatNorthwind = NULL;
    }

    catch(_com_error &e)
    {
        // Den Benutzer ggf. über Fehler benachrichtigen.
        _bstr_t bstrSource(e.Source());
        _bstr_t bstrDescription(e.Description());

        printf("\n\tSource :  %s \n\tdescription : %s \n ",
            (LPCSTR)bstrSource,(LPCSTR)bstrDescription);
    }

    catch(...)
    {
        cout << "Error occured in include files...."<< endl;
    }
}


Beispiel für die DeleteRule-Eigenschaft (VC++)

Dieses Beispiel verdeutlicht die DeleteRule-Eigenschaft eines Key-Objekts. Mit diesem Code wird ein neues Table-Objekt angehängt und anschließend ein neuer Primärschlüssel festgelegt, wobei DeleteRule auf adRICascade festgelegt wird.

#import "c:\Programme\Gemeinsame Dateien\system\ado\msadox.dll" \
    no_namespace
#import "c:\Programme\Gemeinsame Dateien\system\ado\msado15.dll"

#include "iostream.h"
#include "stdio.h"
#include "conio.h"

// Funktionsdeklarationen
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void DeleteRuleX(void);

//////////////////////////////////////////////////////////
//                                                      //
//      Hauptfunktion                                   //
//                                                      //
//////////////////////////////////////////////////////////
void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    DeleteRuleX();

    ::CoUninitialize();
}

//////////////////////////////////////////////////////////
//                                                      //
//       DeleteRuleX-Funktion                           //
//                                                      //
//////////////////////////////////////////////////////////
void DeleteRuleX(void)
{
    HRESULT hr = S_OK;

    // ADOX-Objektzeiger definieren.
    // Die Zeiger bei der Definition initialisieren.
    // Sie befinden sich im ADOX::-Namespace.
    _KeyPtr m_pKeyPrimary = NULL;
    _CatalogPtr m_pCatalog   = NULL;
    _TablePtr m_pTblNew  = NULL;

    // Zeichenfolgenvariablen definieren.
    _bstr_t strcnn("Provider=Microsoft.JET.OLEDB.4.0;"
                "Data source = c:\\Programme\\Microsoft Office"
                "\\Office\\Samples\\Northwind.mdb;");
    try
    {
        TESTHR(hr = m_pKeyPrimary.CreateInstance(__uuidof(Key)));
        TESTHR(hr = m_pCatalog.CreateInstance(__uuidof (Catalog)));
        TESTHR(hr = m_pTblNew.CreateInstance(__uuidof(Table)));

        // Den Katalog verbinden.
        m_pCatalog->PutActiveConnection(strcnn);

        // Die neue Tabelle benennen.
        m_pTblNew->Name = "NewTable";

        // Ein numerisches Feld und ein Textfeld an die neue Tabelle
        // anhängen.
        m_pTblNew->Columns->Append("NumField",adInteger,20);
        m_pTblNew->Columns->Append("TextField",adVarWChar,20);

        // Die neue Tabelle anhängen.
        m_pCatalog->Tables->Append(_variant_t((IDispatch*)m_pTblNew));

        // Den Primärschlüssel definieren.
        m_pKeyPrimary->Name = "NumField";
        m_pKeyPrimary->Type = adKeyPrimary;
        m_pKeyPrimary->RelatedTable = "Customers";
        m_pKeyPrimary->Columns->Append("NumField",adInteger,20);
        m_pKeyPrimary->Columns->GetItem("NumField")->RelatedColumn =
            "CustomerId";
        m_pKeyPrimary->DeleteRule = adRICascade;

        // Das Folgende wird verwendet, um einen optionalen Spalten-
        // parameter an die Append-Methode des Schlüssels zu übergeben
        _variant_t vOptional;
        vOptional.vt = VT_ERROR;
        vOptional.scode = DISP_E_PARAMNOTFOUND;

        // Den Primärschlüssel anhängen.
        m_pCatalog->Tables->GetItem("NewTable")->Keys->Append(
            _variant_t((IDispatch*)m_pKeyPrimary),
            adKeyPrimary,vOptional,L"",L"");

        // Die Tabelle löschen, da es sich um ein Beispiel handelt.
        m_pCatalog->Tables->Delete(m_pTblNew->Name);
    }

    catch(_com_error &e)
    {
        // Den Benutzer ggf. über Fehler benachrichtigen.
        _bstr_t bstrSource(e.Source());
        _bstr_t bstrDescription(e.Description());

        printf("\n\tSource :  %s \n\tdescription : %s \n ",
            (LPCSTR)bstrSource,(LPCSTR)bstrDescription);
    }

    catch(...)
    {
        cout << "Error occured in include files...."<< endl;
    }
}


Beispiel für die Methoden GetObjectOwner und SetObjectOwner (VC++)

Dieses Beispiel verdeutlicht die Methoden GetObjectOwner und SetObjectOwner. Bei diesem Code wird vom Vorhandensein eines Gruppenkontos ausgegangen (siehe das Beispiel für die Append- und ChangePassword-Methoden von Gruppen und Benutzern, um zu verstehen, wie diese Gruppe zum System hinzugefügt wird). Der Eigentümer der Categories-Tabelle wird auf Accounting festgelegt.

#import "c:\Programme\Gemeinsame Dateien\system\ado\msadox.dll" \
    no_namespace

#include "iostream.h"
#include "stdio.h"
#include "conio.h"

// Funktionsdeklarationen
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void OwnersX(void);

//////////////////////////////////////////////////////////
//                                                      //
//        Hauptfunktion                                 //
//                                                      //
//////////////////////////////////////////////////////////
void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    OwnersX();

        ::CoUninitialize();
}

//////////////////////////////////////////////////////////
//                                                      //
//      OwnersX-Funktion                                //
//                                                      //
//////////////////////////////////////////////////////////
void OwnersX()
{
    HRESULT hr = S_OK;

    // ADOX-Objektzeiger definieren.
    // Die Zeiger bei der Definition initialisieren.
    // Sie befinden sich im ADOX::-Namespace.
    _TablePtr m_pTable = NULL;
    _CatalogPtr m_pCatalog = NULL;

    try
    {
        TESTHR(hr = m_pCatalog.CreateInstance(__uuidof(Catalog)));
        TESTHR(hr = m_pTable.CreateInstance(__uuidof(Table)));

        // Das Catalog-Objekt öffnen.
        m_pCatalog->PutActiveConnection(
            "Provider=Microsoft.Jet.OLEDB.4.0;" \
            "data source=c:\\Programme\\Microsoft Office\\"
                "Office\\Samples\\Northwind.mdb;"
                "jet oledb:system database=c:\\WINNT\\system32\\"
                "system.mdw");

        // Den ursprünglichen Besitzer von Categories drucken
        _bstr_t strOwner = m_pCatalog->GetObjectOwner("Categories",
            adPermObjTable);
        cout << "Owner of Categories: " << strOwner << "\n" << endl;
        int iLineCnt = 2;

        // Die neue Gruppe mithilfe einer Zeichenfolge erstellen und
        // anhängen.
        m_pCatalog->Groups->Append("Accounting");

        // Den Besitzer von Categories auf Accounting festlegen.
        m_pCatalog->SetObjectOwner("Categories",
            adPermObjTable,"Accounting");

        _variant_t vIndex;
        // Die Besitzer aller Tabellen und Spalten im Katalog auflisten.
        for (long iIndex = 0;iIndex < m_pCatalog->Tables->Count;iIndex++)
        {
            vIndex = iIndex;
            m_pTable = m_pCatalog->Tables->GetItem(vIndex);
            cout << "Table: " << m_pTable->Name << endl;
            cout << "   Owner: " << m_pCatalog->
                GetObjectOwner(m_pTable->Name,adPermObjTable) << endl;
            if (iLineCnt%16 == 0)
                {
                    printf("\nPress any key to continue...\n");
                    getch();
                }
                iLineCnt = iLineCnt + 2;
        }

        // Den ursprünglichen Besitzer von Categories wiederherstellen
        m_pCatalog->SetObjectOwner("Categories",adPermObjTable,strOwner);

        // Accounting löschen
        m_pCatalog->Groups->Delete("Accounting");
    }
    catch(_com_error &e)
    {
        // Den Benutzer ggf. über Fehler benachrichtigen.
        _bstr_t bstrSource(e.Source());
        _bstr_t bstrDescription(e.Description());

        printf("\n\tSource :  %s \n\tdescription : %s \n ",
             (LPCSTR)bstrSource,(LPCSTR)bstrDescription);
    }

    catch(...)
    {
        cout << "Error occured in include files...."<< endl;
    }
}


Beispiel für die Methoden GetPermissions und SetPermissions (VC++)

Dieses Beispiel verdeutlicht die Methoden GetPermissions und SetPermissions. Mit dem folgenden Code wird dem Benutzer Admin Vollzugriff auf die Orders-Tabelle erteilt.

#import "c:\Programme\Gemeinsame Dateien\system\ado\msadox.dll" \
    no_namespace
#import "c:\Programme\Gemeinsame Dateien\system\ado\msado15.dll"

#include "iostream.h"
#include "stdio.h"
#include "conio.h"

// Funktionsdeklarationen
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void GrantPermissionsX(void);

//////////////////////////////////////////////////////////
//                                                      //
//     Hauptfunktion                                    //
//                                                      //
//////////////////////////////////////////////////////////
void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    GrantPermissionsX();

    ::CoUninitialize();
}

//////////////////////////////////////////////////////////
//                                                      //
//    GrantPermissionsX-Funktion                        //
//                                                      //
//////////////////////////////////////////////////////////
void GrantPermissionsX()
{
    HRESULT hr = S_OK;

    // ADOX-Objektzeiger definieren.
    // Die Zeiger bei der Definition initialisieren.
    // Sie befinden sich im ADOX::-Namespace.
    _CatalogPtr m_pCatalog = NULL;

    //ADODB-Objektzeiger definieren
    ADODB::_ConnectionPtr m_pCnn = NULL;

    // Andere Variablen jetzt definieren.
    try
    {
        TESTHR(hr = m_pCnn.CreateInstance(__uuidof(ADODB::Connection)));

        // Eine Verbindung zur Northwind-Datenbank
        // mithilfe des Microsoft Jet 4.0-Providers öffnen
        m_pCnn->PutProvider("Microsoft.Jet.OLEDB.4.0");
        m_pCnn->Open("data source=c:\\Programme\\"  \
        "Microsoft Office\\Office\\Samples\\Northwind.mdb;"  \
        "jet oledb:system database=c:\\WINNT\\system32\\system.mdw",
            "","",NULL);

         TESTHR(hr = m_pCatalog.CreateInstance(__uuidof(Catalog)));

        m_pCatalog->PutActiveConnection(_variant_t((IDispatch *)m_pCnn));

        // Ursprüngliche Berechtigungen abrufen
        long lngPerm = m_pCatalog->Users->GetItem("admin")->
            GetPermissions("Orders",adPermObjTable);
        long lngOrgPerm = lngPerm;
        cout << "Original Permissions: " << lngPerm << "\n" << endl;

        // Alle Berechtigungen aufheben
        m_pCatalog->Users->GetItem("admin")->SetPermissions("Orders",
            adPermObjTable,adAccessRevoke,adRightFull,adInheritNone);

        // Berechtigungen anzeigen
        lngPerm = m_pCatalog->Users->GetItem("admin")->
            GetPermissions("Orders",adPermObjTable);
        cout << "Revoked permissions: " << lngPerm << "\n" << endl;

        // Dem Benutzer Admin vollständige Rechte für das Orders-Objekt
        // erteilen
        m_pCatalog->Users->GetItem("admin")->SetPermissions("Orders",
            adPermObjTable,adAccessSet,adRightFull,adInheritNone);

        // Berechtigungen anzeigen
        lngPerm = m_pCatalog->Users->GetItem("admin")->
            GetPermissions("Orders",adPermObjTable);
        cout << "Full permissions: " << lngPerm << "\n" << endl;

        // Ursprüngliche Berechtigungen wiederherstellen
        m_pCatalog->Users->GetItem("admin")->SetPermissions("Orders",
            adPermObjTable,adAccessSet,(RightsEnum) lngOrgPerm,
            adInheritNone);

        // Berechtigungen anzeigen
        lngPerm = m_pCatalog->Users->GetItem("admin")->
            GetPermissions("Orders",adPermObjTable);
        cout << "Final permissions: " << lngPerm << "\n" << endl;
    }
    catch(_com_error &e)
    {
        // Den Benutzer ggf. über Fehler benachrichtigen.
        _bstr_t bstrSource(e.Source());
        _bstr_t bstrDescription(e.Description());

        printf("\n\tSource :  %s \n\tdescription : %s \n ",
              (LPCSTR)bstrSource,(LPCSTR)bstrDescription);
    }

    catch(...)
    {
        cout << "Error occured in include files...."<< endl;
    }
}


Beispiel für die Append- und ChangePassword-Methoden von Gruppen und Benutzern (VC++)

Dieses Beispiel verdeutlicht die Append-Methode der Groups-Auflistung sowie die Append-Methode der Users-Auflistung, indem ein neues Group- sowie ein neues User-Objekt dem System hinzugefügt werden. Das neue Group-Objekt wird der Groups-Auflistung des neuen User-Objekts angehängt. Dadurch wird das neue User-Objekt dem Group-Objekt hinzugefügt. Darüber hinaus wird die ChangePassword-Methode verwendet, um das User-Kennwort anzugeben.

#import "c:\Programme\Gemeinsame Dateien\system\ado\msadox.dll" \
    no_namespace

#include "iostream.h"
#include "stdio.h"
#include "conio.h"

// Funktionsdeklarationen
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void GroupX(void);

//////////////////////////////////////////////////////////
//                                                      //
//      Hauptfunktion                                   //
//                                                      //
//////////////////////////////////////////////////////////
void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    GroupX();

    ::CoUninitialize();
}

//////////////////////////////////////////////////////////
//                                                      //
//         GroupX-Funktion                              //
//                                                      //
//////////////////////////////////////////////////////////
void GroupX(void)
{
    HRESULT hr = S_OK;

    // ADOX-Objektzeiger definieren.
    // Die Zeiger bei der Definition initialisieren.
    // Sie befinden sich im ADOX::-Namespace.
    _CatalogPtr m_pCatalog   = NULL;
    _UserPtr m_pUserNew   = NULL;
    _UserPtr m_pUser  = NULL;
    _GroupPtr m_pGroup = NULL;

    // Zeichenfolgenvariablen definieren.
    _bstr_t strCnn("Provider=Microsoft.JET.OLEDB.4.0;"
        "Data source = c:\\Programme\\Microsoft Office\\"
        "Office\\Samples\\Northwind.mdb;"
        "jet oledb:system database=c:\\WINNT\\system32\\system.mdw");

    try
    {
        TESTHR(hr = m_pCatalog.CreateInstance(__uuidof (Catalog)));
        m_pCatalog->PutActiveConnection(strCnn);

        // Die neue Gruppe mithilfe einer Zeichenfolge erstellen und
        // anhängen.
        m_pCatalog->Groups->Append("Accounting");

        // Die neue Benutzerin mithilfe eines Objekts erstellen und
        // anhängen.
        TESTHR(hr = m_pUserNew.CreateInstance(__uuidof(User)));
        m_pUserNew->PutName("Pat Smith");
        m_pUserNew->ChangePassword("","Password1");
        m_pCatalog->Users->Append(
            _variant_t((IDispatch *)m_pUserNew),"");

        // Die Benutzerin Pat Smith zum Mitglied der Accounting-Gruppe
        // machen, indem das entsprechende Group-Objekt erstellt und zur
        // Groups-Auflistung der Benutzerin hinzugefügt wird. Das Gleiche
        // kann erreicht werden, indem ein User-Objekt, das Pat Smith
        // darstellt, erstellt und an die Users-Auflistung der
        // Accounting-Gruppe angehängt wird.
        m_pUserNew->Groups->Append("Accounting");

        // Alle User-Objekte in der Users-Auflistung des Katalogs
        // aufzählen.
        long lUsrIndex;
        long lGrpIndex;
        _variant_t vIndex;
        for(lUsrIndex=0;lUsrIndex<=m_pCatalog->Users->Count;lUsrIndex++)
        {
            vIndex = lUsrIndex;
            m_pUser = m_pCatalog->Users->GetItem(vIndex);
            cout<<"  "<<m_pUser->Name <<endl;
            cout<<"   Belongs to these groups:"<<endl;

            // Alle Group-Objekte in der Groups-Auflistung jedes User-
            // Objekts aufzählen.
            if(m_pUser->Groups->Count != 0)
            {
                for(lGrpIndex=0;lGrpIndex<=m_pUser->Groups->
                    Count;lGrpIndex++)
                {
                    vIndex = lGrpIndex;
                    m_pGroup = m_pUser->Groups->GetItem(vIndex);
                    cout<<"     "<< m_pGroup->Name<<endl;
                }
            }
            else
            {
                cout<<"       [None]"<<endl;
            }
        }

        // Alle Group-Objekte in der Groups-Auflistung des
        // Standardarbeitsbereichs aufzählen.
        for(lGrpIndex=0;lGrpIndex<=m_pCatalog->Groups->Count;lGrpIndex++)
        {
            vIndex = lGrpIndex;
            m_pGroup = m_pCatalog->Groups->GetItem(vIndex);
            cout<<"   "<< m_pGroup->Name <<endl;
            cout<<"    Has as its members:"<<endl;

            // Alle User-Objekte in der Users-Auflistung jedes
            // Group-Objekts aufzählen.
            if(m_pGroup->Users->Count != 0)
            {
                for(lUsrIndex=0;lUsrIndex<=m_pGroup->Users->Count;
                    lUsrIndex++)
                {
                    vIndex = lUsrIndex;
                    m_pUser = m_pGroup->Users->GetItem(vIndex);
                    cout<<"    "<<m_pUser->Name<<endl;
                }
            }
            else
            {
                cout<<"      [None]"<<endl;
            }
        }

        // Neue User- und Group-Objekte löschen, da es sich lediglich um
        // ein Beispiel handelt.
        m_pCatalog->Users->Delete("Pat Smith");
        m_pCatalog->Groups->Delete("Accounting");
    }

    catch(_com_error &e)
    {
        // Den Benutzer ggf. über Fehler benachrichtigen.
        _bstr_t bstrSource(e.Source());
        _bstr_t bstrDescription(e.Description());

        printf("\n\tSource :  %s \n\tdescription : %s \n ",
             (LPCSTR)bstrSource,(LPCSTR)bstrDescription);
    }

    catch(...)
    {
        cout << "Error occured in include files...."<< endl;
    }
}


Beispiel für die Append-Methode von Indizes (VC++)

Mit dem folgenden Code wird gezeigt, wie ein neuer Index erstellt wird. Der Index erstreckt sich über zwei Spalten einer Tabelle.

#import "c:\Programme\Gemeinsame Dateien\system\ado\msadox.dll" \
    no_namespace

#include "iostream.h"
#include "stdio.h"
#include "conio.h"

// Funktionsdeklarationen
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void CreateIndexX(void);

//////////////////////////////////////////////////////////
//                                                      //
//      Hauptfunktion                                   //
//                                                      //
//////////////////////////////////////////////////////////
void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    CreateIndexX();

    ::CoUninitialize();
}

//////////////////////////////////////////////////////////
//                                                      //
//        CreateIndexX-Funktion                         //
//                                                      //
//////////////////////////////////////////////////////////
void CreateIndexX(void)
{
    HRESULT hr = S_OK;

    // ADOX-Objektzeiger definieren.
    // Die Zeiger bei der Definition initialisieren.
    // Sie befinden sich im ADOX::-Namespace.
    _TablePtr m_pTable   = NULL;
    _IndexPtr m_pIndex    = NULL;
    _CatalogPtr m_pCatalog = NULL;

    // Andere Variablen definieren
    _bstr_t strcnn("Provider=Microsoft.JET.OLEDB.4.0;"
        "Data source = c:\\Programme\\Microsoft Office\\"
        "Office\\Samples\\Northwind.mdb;");
    try
    {
        TESTHR(hr = m_pTable.CreateInstance(__uuidof(Table)));
        TESTHR(hr = m_pIndex.CreateInstance(__uuidof(Index)));
        TESTHR(hr = m_pCatalog.CreateInstance(__uuidof (Catalog)));

        // Das Catalog-Objekt öffnen.
        m_pCatalog->PutActiveConnection(strcnn);

        // Die Tabelle öffnen und an den Katalog anhängen.
        m_pTable->Name = "MyTable";
        m_pTable->Columns->Append("Column1",adInteger,0);
        m_pTable->Columns->Append("Column2",adInteger,0);
        m_pTable->Columns->Append("Column3",adVarWChar,50);
        m_pCatalog->Tables->Append(_variant_t((IDispatch *)m_pTable));

        // Einen mehrspaltigen Index definieren.
        m_pIndex->Name = "multicolidx";
        m_pIndex->Columns->Append("Column1",adInteger,0);
        m_pIndex->Columns->Append("Column2",adInteger,0);

        // Den Index an die Tabelle anhängen.
        m_pTable->Indexes->Append(_variant_t((IDispatch *)m_pIndex));

        // Die Tabelle löschen.
        m_pCatalog->Tables->Delete("MyTable");
    }

    catch(_com_error &e)
    {
        // Den Benutzer ggf. über Fehler benachrichtigen.
        _bstr_t bstrSource(e.Source());
        _bstr_t bstrDescription(e.Description());

        printf("\n\tSource :  %s \n\tdescription : %s \n ",
             (LPCSTR)bstrSource,(LPCSTR)bstrDescription);
    }

    catch(...)
    {
        cout << "Error occured in include files...."<< endl;
    }
}


Beispiel für die IndexNulls-Eigenschaft (VC++)

Dieses Beispiel verdeutlicht die IndexNulls-Eigenschaft eines Index-Objekts. Der Code erstellt einen neuen Index und legt den Wert von IndexNulls je nach Benutzereingabe fest. Der Index wird anschließend an die Employees-Tabelle im Northwind-Catalog angehängt. Der neue Index wird für ein Recordset-Objekt übernommen, das auf der Employees-Tabelle basiert, und das Recordset-Objekt geöffnet. Ein neuer Datensatz wird der Employees-Tabelle hinzugefügt, wobei im indizierten Feld ein Null-Wert eingefügt wird. Ob dieser neue Datensatz angezeigt wird, hängt von der Einstellung der IndexNulls-Eigenschaft ab.

#import "c:\Programme\Gemeinsame Dateien\system\ado\msadox.dll" \
    no_namespace
#import "C:\Programme\Gemeinsame Dateien\System\ADO\msado15.dll" \
    rename("EOF", "EndOfFile")

#include "iostream.h"
#include "stdio.h"
#include "conio.h"
#include "IndexNullsX.h"

// Funktionsdeklarationen
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void IndexNullsX(_bstr_t);

//////////////////////////////////////////////////////////
//                                                      //
//      Hauptfunktion                                   //
//                                                      //
//////////////////////////////////////////////////////////
void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    printf("\nShow records having indexed field value = NULL? (Y/N):");
    char input = getche();

    if(toupper(input)=='Y')
    {
        IndexNullsX("Allow");
    }
    else if(toupper(input)=='N')
    {
        IndexNullsX("Ignore");
    }
    else
    {
       exit(0);
    }

    ::CoUninitialize();
}

//////////////////////////////////////////////////////////
//                                                      //
//      IndexNullsX-Funktion                            //
//                                                      //
//////////////////////////////////////////////////////////
void IndexNullsX(_bstr_t strSel)
{
    HRESULT hr = S_OK;

    // ADOX-Objektzeiger definieren.
    // Die Zeiger bei der Definition initialisieren.
    // Sie befinden sich im ADOX::-Namespace.
    _CatalogPtr m_pCatalog     = NULL;
    _IndexPtr m_pIndexNew      = NULL;

    // ADODB-Objektzeiger definieren
    ADODB::_ConnectionPtr m_pCnn           = NULL;
    ADODB::_RecordsetPtr  m_pRstEmployees  = NULL;

    // Andere Variablen definieren
    IADORecordBinding *picRs  = NULL; // Deklarierter
                                      // Schnittstellenzeiger
    CEmployeeRs emprs;          // Class-Objekt von C++

    // Zeichenfolgenvariable definieren.
    _bstr_t strCnn("Provider=Microsoft.Jet.OLEDB.4.0;"
        "data source=c:\\Programme\\Microsoft Office\\Office\\"
        "Samples\\Northwind.mdb;");

    try
    {
        TESTHR(hr = m_pCnn.CreateInstance(__uuidof(ADODB::Connection)));
        TESTHR(hr = m_pCatalog.CreateInstance(__uuidof (Catalog)));
        TESTHR(hr = m_pIndexNew.CreateInstance(__uuidof(Index)));
        TESTHR(hr = m_pRstEmployees.CreateInstance(
            __uuidof(ADODB::Recordset)));

        // Den Katalog verbinden.
        m_pCnn->Open(strCnn,"","",NULL);
        m_pCatalog->PutActiveConnection(_variant_t((IDispatch *)m_pCnn));

        // Die Country-Spalte an den neuen Index anhängen.
        m_pIndexNew->Columns->Append("Country",adVarWChar,0);
        m_pIndexNew->Name = "NewIndex";

        // IndexNulls anhand der Benutzereingabe festlegen
        if(strcmp((LPSTR)strSel,"Allow")==0)
        {
            m_pIndexNew->IndexNulls = adIndexNullsAllow;
        }
        else if(strcmp((LPSTR)strSel,"Ignore")==0)
        {
            m_pIndexNew->IndexNulls = adIndexNullsIgnore;
        }

        // Den neuen Index an die Employees-Tabelle anhängen
        m_pCatalog->Tables->GetItem("Employees")->Indexes->Append(
            _variant_t((IDispatch *)m_pIndexNew));
        m_pRstEmployees->Index = m_pIndexNew->Name;
        m_pRstEmployees->Open("Employees",
            _variant_t((IDispatch *)m_pCnn),
            ADODB::adOpenKeyset,ADODB::adLockOptimistic,
            ADODB::adCmdTableDirect);

        // Einen neuen Datensatz zur Employees-Tabelle hinzufügen.
        m_pRstEmployees->AddNew();
        m_pRstEmployees->Fields->GetItem("FirstName")->Value =
             (_bstr_t) "Gary";
        m_pRstEmployees->Fields->GetItem("LastName")->Value =
             (_bstr_t) "Haarsager";
        m_pRstEmployees->Update();

        // Den neuen Datensatz mit einem Lesezeichen versehen.
        _variant_t varBookmark = m_pRstEmployees->Bookmark;

        // Den neuen Index zum Festlegen der Reihenfolge der Datensätze
        // verwenden.
        m_pRstEmployees->MoveFirst();
        printf("\n\nIndex = %s,",(LPSTR) m_pRstEmployees->Index);
        printf("IndexNulls = %d\n\n",m_pIndexNew->IndexNulls);
        cout<<"Country            -        Name"<<endl;

        // Einen IADORecordBinding-Schnittstellenzeiger öffnen, um
        // ihn zum Binden des Recordsets an eine Klasse zu verwenden
        TESTHR(hr = m_pRstEmployees->QueryInterface(
            __uuidof(IADORecordBinding),(LPVOID*)&picRs));

        // Das Recordset jetzt an eine Klasse von C++ binden
        TESTHR(hr = picRs->BindToRecordset(&emprs));

        // Das Recordset aufzählen. Der Wert der
        // IndexNulls-Eigenschaft bestimmt, ob der neue
        // Datensatz in der Ausgabe angezeigt wird.
        while(!(m_pRstEmployees->EndOfFile))
        {
            printf("%s    -    %s %s\n",
                emprs.lemp_CountryStatus == adFldOK ?
                emprs.m_szemp_Country :"[Null]",
                emprs.lemp_FirstNameStatus == adFldOK ?
                emprs.m_szemp_FirstName :"<NULL>",
                emprs.lemp_LastNameStatus == adFldOK ?
                emprs.m_szemp_LastName :"<NULL>");
            m_pRstEmployees->MoveNext();
        }

        // Den neuen Datensatz löschen, da es sich um ein Beispiel
        // handelt.
        m_pRstEmployees->Bookmark = varBookmark;
        m_pRstEmployees->Delete(ADODB::adAffectCurrent);
        m_pRstEmployees->Close();

        // Den neuen Index löschen, da es sich um ein Beispiel handelt.
        m_pCatalog->Tables->GetItem("Employees")->Indexes->
            Delete(m_pIndexNew->Name);
        m_pCatalog = NULL;
    }

    catch(_com_error &e)
    {
        // Den Benutzer ggf. über Fehler benachrichtigen.
        _bstr_t bstrSource(e.Source());
        _bstr_t bstrDescription(e.Description());

        printf("\n\tSource :  %s \n\tdescription : %s \n ",
             (LPCSTR)bstrSource,(LPCSTR)bstrDescription);
    }

    catch(...)
    {
        cout << "Error occured in include files...."<< endl;
    }
}

IndexNullX.h

// IndexNullsX.h

#include "icrsint.h"

// Diese Klasse extrahiert LastName, Country und FirstName aus der
// Employees-Tabelle

class CEmployeeRs : public CADORecordBinding
{
BEGIN_ADO_BINDING(CEmployeeRs)
        // Die LastName-Spalte ist das zweite Feld in der Tabelle
        ADO_VARIABLE_LENGTH_ENTRY2(2,adVarChar,m_szemp_LastName,
            sizeof(m_szemp_LastName),lemp_LastNameStatus,TRUE)
        // Die Country-Spalte ist das 11. Feld in der Tabelle
        ADO_VARIABLE_LENGTH_ENTRY2(11,adVarChar,m_szemp_Country,
            sizeof(m_szemp_Country),lemp_CountryStatus,TRUE)
        // Die FirstName-Spalte ist das 17. Feld in der Tabelle
        ADO_VARIABLE_LENGTH_ENTRY2(17,adVarChar,m_szemp_FirstName,
            sizeof(m_szemp_FirstName),lemp_FirstNameStatus,TRUE)
END_ADO_BINDING()

public:
    CHAR m_szemp_LastName[21];
    ULONG lemp_LastNameStatus;
    CHAR m_szemp_Country[16];
    ULONG lemp_CountryStatus;
    CHAR m_szemp_FirstName[11];
    ULONG lemp_FirstNameStatus;
};


Beispiel für die Append-Methode von Schlüsseln, für die Type-Eigenschaft von Schlüsseln und die Eigenschaften RelatedColumn, RelatedTable und UpdateRule (VC++)

Mit dem folgenden Code wird gezeigt, wie ein neuer Fremdschlüssel erstellt wird. Dabei wird davon ausgegangen, dass zwei Tabellen (Customers und Orders) vorhanden sind.

#import "c:\Programme\Gemeinsame Dateien\system\ado\msadox.dll" \
    no_namespace
#import "c:\Programme\Gemeinsame Dateien\system\ado\msado15.dll"

#include "iostream.h"
#include "stdio.h"
#include "conio.h"

// Funktionsdeklarationen
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void CreateKeyX(void);

//////////////////////////////////////////////////////////
//                                                      //
//      Hauptfunktion                                   //
//                                                      //
//////////////////////////////////////////////////////////
void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    CreateKeyX();

    ::CoUninitialize();
}

//////////////////////////////////////////////////////////
//                                                      //
//        CreateKeyX-Funktion                           //
//                                                      //
//////////////////////////////////////////////////////////
void CreateKeyX(void)
{
    HRESULT hr = S_OK;

    // ADOX-Objektzeiger definieren.
    // Die Zeiger bei der Definition initialisieren.
    // Sie befinden sich im ADOX::-Namespace.
    _KeyPtr m_pKeyForeign = NULL;
    _CatalogPtr m_pCatalog   = NULL;

    // Andere Variablen definieren
    _bstr_t strcnn("Provider=Microsoft.JET.OLEDB.4.0;"
                "Data source = c:\\Programme\\Microsoft Office\\"
                "Office\\Samples\\Northwind.mdb;");
    try
    {
        TESTHR(hr = m_pKeyForeign.CreateInstance(__uuidof(Key)));
        TESTHR(hr = m_pCatalog.CreateInstance(__uuidof (Catalog)));
        m_pCatalog->PutActiveConnection(strcnn);

        // Den Fremdschlüssel definieren.
        m_pKeyForeign->Name = "CustOrder";
        m_pKeyForeign->Type = adKeyForeign;
        m_pKeyForeign->RelatedTable = "Customers";
        m_pKeyForeign->Columns->Append("CustomerId",adVarWChar,0);
        m_pKeyForeign->Columns->GetItem("CustomerId")->RelatedColumn =
            "CustomerId";
        m_pKeyForeign->UpdateRule = adRICascade;

        // Das Folgende wird verwendet, um einen optionalen Spalten-
        // parameter an die Append-Methode des Schlüssels zu übergeben
        _variant_t vOptional;
        vOptional.vt = VT_ERROR;
        vOptional.scode = DISP_E_PARAMNOTFOUND;

        // Den Fremdschlüssel anhängen.
        m_pCatalog->Tables->GetItem("Orders")->Keys->
            Append(_variant_t((IDispatch *)m_pKeyForeign),
            adKeyPrimary,vOptional,L"",L"");

        // Den Schlüssel löschen, da es sich um ein Beispiel handelt.
        m_pCatalog->Tables->GetItem("Orders")->Keys->
            Delete(m_pKeyForeign->Name);
    }

    catch(_com_error &e)
    {
        // Den Benutzer ggf. über Fehler benachrichtigen.
        _bstr_t bstrSource(e.Source());
        _bstr_t bstrDescription(e.Description());

        printf("\n\tSource :  %s \n\tdescription : %s \n ",
             (LPCSTR)bstrSource,(LPCSTR)bstrDescription);
    }

    catch(...)
    {
        cout << "Error occured in include files...."<< endl;
    }
}


Beispiel für die Eigenschaften NumericScale und Precision (VC++)

Dieses Beispiel verdeutlicht die Eigenschaften NumericScale und Precision des Column-Objekts. Der Code zeigt die zugehörigen Werte für die Order Details-Tabelle in der Northwind-Datenbank an.

#import "c:\Programme\Gemeinsame Dateien\system\ado\msadox.dll" \
    no_namespace
#import "c:\Programme\Gemeinsame Dateien\system\ado\msado15.dll"

#include "iostream.h"
#include "stdio.h"
#include "conio.h"

// Funktionsdeklarationen
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void NumericScalePrecX(void);

//////////////////////////////////////////////////////////
//                                                      //
//       Hauptfunktion                                  //
//                                                      //
//////////////////////////////////////////////////////////
void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    NumericScalePrecX();

    ::CoUninitialize();
}

//////////////////////////////////////////////////////////
//                                                      //
//          NumericScalePrecX-Funktion                  //
//                                                      //
//////////////////////////////////////////////////////////
void NumericScalePrecX(void)
{
    HRESULT hr = S_OK;

    // ADOX-Objektzeiger definieren.
    // Die Zeiger bei der Definition initialisieren.
    // Sie befinden sich im ADOX::-Namespace.
    _CatalogPtr m_pCatalog = NULL;
    _TablePtr m_pTable = NULL;
    _ColumnPtr m_pColumn = NULL;

    //ADODB-Objektzeiger definieren
    ADODB::_ConnectionPtr m_pCnn = NULL;

    // Zeichenfolgenvariablen deklarieren
    _bstr_t strCnn("Provider=Microsoft.Jet.OLEDB.4.0;"
        "Data Source=c:\\Programme\\Microsoft Office\\"
        "Office\\Samples\\Northwind.mdb;");
    try
    {
        TESTHR(hr = m_pCnn.CreateInstance(__uuidof(ADODB::Connection)));

        TESTHR(hr = m_pCatalog.CreateInstance(__uuidof (Catalog)));

        // Den Katalog verbinden.
        m_pCnn->Open (strCnn, "", "", NULL);

        m_pCatalog->PutActiveConnection(variant_t((IDispatch *)m_pCnn));

        // Die Order Details-Tabelle abrufen
        m_pTable = m_pCatalog->Tables->GetItem("Order Details");

        // Die numerische Skalierung und Genauigkeit von Feldern mit
        // kurzen ganzen Zahlen anzeigen.
        _variant_t vIndex;
        for (long lIndex=0; lIndex < m_pTable->Columns->Count; lIndex++)
        {
            vIndex = lIndex ;
            m_pColumn = m_pTable->Columns->GetItem(vIndex);
                if(m_pColumn->Type == adSmallInt)
                {
                    cout << "Column: " << m_pColumn->GetName() << endl;
                    cout << "Numeric scale: " << (_bstr_t) m_pColumn->
                        GetNumericScale() << endl;
                    cout << "Precision: " << m_pColumn->GetPrecision() <<
                        endl;
                }
        }
    }

    catch(_com_error &e)
    {
        // Den Benutzer ggf. über Fehler benachrichtigen.
        _bstr_t bstrSource(e.Source());
        _bstr_t bstrDescription(e.Description());

        printf("\n\tSource :  %s \n\tdescription : %s \n ",
             (LPCSTR)bstrSource,(LPCSTR)bstrDescription);
    }

    catch(...)
    {
        cout << "Error occured in include files...."<< endl;
    }
}


Beispiel für die Parameters-Auflistung, Command-Eigenschaft (VC++)

Mit dem folgenden Code wird gezeigt, wie die Command-Eigenschaft mit dem Command-Objekt verwendet wird, um Parameterinformationen für die Prozedur abzurufen.

#import "c:\Programme\Gemeinsame Dateien\system\ado\msadox.dll" \
    no_namespace
#import "c:\Programme\Gemeinsame Dateien\system\ado\msado15.dll"

#include "iostream.h"
#include "stdio.h"
#include "conio.h"

// Funktionsdeklarationen
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void ProcedureParametersX(void);

//////////////////////////////////////////////////////////
//                                                      //
//    Hauptfunktion                                     //
//                                                      //
//////////////////////////////////////////////////////////
void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    ProcedureParametersX();

    ::CoUninitialize();
}

//////////////////////////////////////////////////////////
//                                                      //
//      ProcedureParametersX-Funktion                   //
//                                                      //
//////////////////////////////////////////////////////////
void ProcedureParametersX()
{
    HRESULT hr = S_OK;

    // ADOX-Objektzeiger definieren.
    // Die Zeiger bei der Definition initialisieren.
    // Sie befinden sich im ADOX::-Namespace.
    _CatalogPtr m_pCatalog = NULL;

    //ADODB-Objektzeiger definieren.
    ADODB::_ConnectionPtr m_pCnn = NULL;
    ADODB::_CommandPtr m_pCommand = NULL;
    ADODB::_ParameterPtr m_pParameter = NULL;

    try
    {
        TESTHR(hr = m_pCnn.CreateInstance(__uuidof(ADODB::Connection)));

        // Das Connection-Objekt öffnen
        m_pCnn->Open("Provider=Microsoft.Jet.OLEDB.4.0;"
                "Data Source=c:\\Programme\\Microsoft Office\\"
                "Office\\Samples\\Northwind.mdb;","","",NULL);

        TESTHR(hr = m_pCatalog.CreateInstance(__uuidof(Catalog)));

        // Das Catalog-Objekt öffnen
        m_pCatalog->PutActiveConnection(_variant_t((IDispatch *)m_pCnn));

        // Das Command-Objekt abrufen
        m_pCommand = m_pCatalog->Procedures->GetItem("CustomerById")->
            GetCommand();

        _variant_t vIndex;

        // Parameterinformationen abrufen
        m_pCommand->Parameters->Refresh();
        for (long lIndex = 0; lIndex < m_pCommand->Parameters->Count;
            lIndex ++)
        {
            vIndex = lIndex;
            m_pParameter = m_pCommand->Parameters->GetItem(vIndex);
            cout << m_pParameter->Name << ":" << m_pParameter->Type <<
                "\n" << endl;
        }
    }
    catch(_com_error &e)
    {
        // Den Benutzer ggf. über Fehler benachrichtigen.
        _bstr_t bstrSource(e.Source());
        _bstr_t bstrDescription(e.Description());

        printf("\n\tSource :  %s \n\tdescription : %s \n ",
             (LPCSTR)bstrSource,(LPCSTR)bstrDescription);
    }

    catch(...)
    {
        cout << "Error occured in include files...."<< endl;
    }
}


Beispiel für die ParentCatalog-Eigenschaft (VC++)

Mit dem folgenden Code wird gezeigt, wie die ParentCatalog-Eigenschaft verwendet wird, um auf eine providerspezifische Eigenschaft zuzugreifen, bevor einem Katalog eine Tabelle hinzugefügt wird. Bei der Eigenschaft handelt es sich um AutoIncrement, die in einer Microsoft Jet-Datenbank ein AutoIncrement-Feld erstellt.

#import "c:\Programme\Gemeinsame Dateien\system\ado\msadox.dll" \
    no_namespace
#import "c:\Programme\Gemeinsame Dateien\system\ado\msado15.dll"

#include "iostream.h"
#include "stdio.h"
#include "conio.h"

// Funktionsdeklarationen
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void CreateAutoIncrColumnX(void);

//////////////////////////////////////////////////////////
//                                                      //
//      Hauptfunktion                                   //
//                                                      //
//////////////////////////////////////////////////////////
void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    CreateAutoIncrColumnX();

     ::CoUninitialize();
}

//////////////////////////////////////////////////////////
//                                                      //
//       CreateAutoIncrColumnX-Funktion                 //
//                                                      //
//////////////////////////////////////////////////////////
void CreateAutoIncrColumnX(void)
{
    HRESULT hr = S_OK;

    // ADOX-Objektzeiger definieren.
    // Die Zeiger bei der Definition initialisieren.
    // Sie befinden sich im ADOX::-Namespace.
    _CatalogPtr m_pCatalog = NULL;
    _TablePtr m_pTable = NULL;

    // ADODB-Objektzeiger definieren.
    ADODB::_ConnectionPtr m_pCnn = NULL;

    //Zeichenfolgenvariablen definieren
    _bstr_t strCnn("Provider=Microsoft.Jet.OLEDB.4.0;"
        "Data Source=c:\\Programme\\Microsoft Office\\"
        "Office\\Samples\\Northwind.mdb;");
    try
    {
        TESTHR(hr = m_pCnn.CreateInstance(__uuidof(ADODB::Connection)));

        TESTHR(hr = m_pCatalog.CreateInstance(__uuidof (Catalog)));

        TESTHR(hr = m_pTable.CreateInstance(__uuidof (Table)));

        // Den Katalog verbinden.
        m_pCnn->Open (strCnn, "", "", NULL);

        m_pCatalog->PutActiveConnection(variant_t((IDispatch *)m_pCnn));

        m_pTable->Name="MyContacts";
        m_pTable->ParentCatalog = m_pCatalog;

        // Felder erstellen und an das neue Table-Objekt anhängen.
        m_pTable->Columns->Append("ContactId", adInteger,0);

        // Automatische Vergrößerung für die ContactId-Spalte festlegen
        m_pTable->Columns->GetItem("ContactId")->Properties->
            GetItem("AutoIncrement")->Value = true;
        m_pTable->Columns->Append("CustomerID", adVarWChar,0);
        m_pTable->Columns->Append("FirstName", adVarWChar,0);
        m_pTable->Columns->Append("LastName", adVarWChar,0);
        m_pTable->Columns->Append("Phone", adVarWChar, 20);
        m_pTable->Columns->Append("Notes", adLongVarWChar,0);
        m_pCatalog->Tables->Append(_variant_t((IDispatch*)m_pTable));

        // Die Datenbank aktualisieren.
        m_pCatalog->Tables->Refresh();

        // Die neue Tabelle löschen, da es sich lediglich um ein Beispiel
        // handelt
        m_pCatalog->Tables->Delete("MyContacts");

        m_pCatalog = NULL;
    }

    catch(_com_error &e)
    {
        // Den Benutzer ggf. über Fehler benachrichtigen.
        _bstr_t bstrSource(e.Source());
        _bstr_t bstrDescription(e.Description());

        printf("\n\tSource :  %s \n\tdescription : %s \n ",
             (LPCSTR)bstrSource,(LPCSTR)bstrDescription);
    }

    catch(...)
    {
        cout << "Error occured in include files...."<< endl;
    }
}


Beispiel für die Eigenschaften PrimaryKey und Unique (VC++)

Dieses Beispiel verdeutlicht die Eigenschaften PrimaryKey und Unique eines Index-Objekts. Der Code erstellt eine neue Tabelle mit zwei Spalten. Die Eigenschaften PrimaryKey und Unique dienen der Verwendung einer Spalte als Primärschlüssel, für den doppelte Werte nicht zulässig sind.

#import "c:\Programme\Gemeinsame Dateien\system\ado\msadox.dll" \
    no_namespace
#import "c:\Programme\Gemeinsame Dateien\system\ado\msado15.dll"

#include "iostream.h"
#include "stdio.h"
#include "conio.h"

// Funktionsdeklarationen
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void PrimaryKeyX(void);

//////////////////////////////////////////////////////////
//                                                      //
//    Hauptfunktion                                     //
//                                                      //
//////////////////////////////////////////////////////////
void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    PrimaryKeyX();

    ::CoUninitialize();
}

//////////////////////////////////////////////////////////
//                                                      //
//        PrimaryKeyX-Funktion                          //
//                                                      //
//////////////////////////////////////////////////////////
void PrimaryKeyX()
{
    HRESULT hr = S_OK;

    // ADOX-Objektzeiger definieren.
    // Die Zeiger bei der Definition initialisieren.
    // Sie befinden sich im ADOX::-Namespace.
    _CatalogPtr m_pCatalog = NULL;
    _TablePtr m_pTableNew = NULL;
    _IndexPtr m_pIndexNew  = NULL;
    _IndexPtr m_pIndex  = NULL;
    _ColumnPtr m_pColumn = NULL;

    // Eine Zeichenfolgenvariable definieren
    _bstr_t strcnn("Provider=Microsoft.JET.OLEDB.4.0;"
        "Data Source = c:\\Programme\\"
        "Microsoft Office\\Office\\Samples\\Northwind.mdb;");

    try
    {
        TESTHR(hr = m_pCatalog.CreateInstance(__uuidof(Catalog)));
        TESTHR(hr = m_pTableNew.CreateInstance(__uuidof(Table)));
        TESTHR(hr = m_pIndexNew.CreateInstance(__uuidof(Index)));
        TESTHR(hr = m_pIndex.CreateInstance(__uuidof(Index)));
        TESTHR(hr = m_pColumn.CreateInstance(__uuidof(Column)));

        // Den Katalog verbinden
        m_pCatalog->PutActiveConnection(strcnn);

        // Die neue Tabelle benennen
        m_pTableNew->Name = "NewTable";

        // Ein numerisches Feld und ein Textfeld an die neue Tabelle
        // anhängen.
        m_pTableNew->Columns->Append("NumField", adInteger, 20);
        m_pTableNew->Columns->Append("TextField", adVarWChar, 20);

        // Neuen Primärschlüsselindex für die NumField-Spalte
        // an die neue Tabelle anhängen
        m_pIndexNew->Name = "NumIndex";
        m_pIndexNew->Columns->Append("NumField",adInteger,0);
        // Hier ist "-1" statt "true" erforderlich.
        m_pIndexNew->PutPrimaryKey(-1);
        m_pIndexNew->PutUnique(-1);
        m_pTableNew->Indexes->Append(
            _variant_t ((IDispatch*)m_pIndexNew));

        // Einen Index für TextField an die neue Tabelle anhängen.
        // Achtung: Das Festlegen des Index- und des Spaltennamens als
        // Parameter der Append-Methode ist eine andere Technik als zuvor
        m_pTableNew->Indexes->Append("TextIndex", "TextField");

        // Die neue Tabelle anhängen
        m_pCatalog->Tables->Append(_variant_t ((IDispatch*)m_pTableNew));

        cout << m_pTableNew->Indexes->Count << " Indexes in "
            << m_pTableNew->Name << " Table" << endl;
        m_pCatalog->Tables->Refresh();

        _variant_t vIndex;
        // Die Indexes-Auflistung aufzählen.
        for (long lIndex = 0;lIndex < m_pTableNew->Indexes->Count;
             lIndex++)
        {
            vIndex = lIndex;
            m_pIndex = m_pTableNew->Indexes->GetItem(vIndex);
            cout << "Index " << m_pIndex->Name << endl;
            cout << "   Primary key = " << (m_pIndex->GetPrimaryKey() ?
                "True" : "False") << endl;
            cout << "   Unique = "  << (m_pIndex->GetUnique() ? "True" :
                "False") << endl;

            // Die Columns-Auflistung jedes Index-Objekts
            // aufzählen.
            cout << "    Columns" << endl;

            for (long lIndex = 0;lIndex < m_pIndex->Columns->Count;
                 lIndex++)
            {
                vIndex = lIndex  ;
                m_pColumn = m_pIndex->Columns->GetItem(vIndex);
                cout << "       " << m_pColumn->Name << endl;
            }
        }

        // Die neue Tabelle löschen, da es sich um ein Beispiel handelt
        m_pCatalog->Tables->Delete(m_pTableNew->Name);
        m_pCatalog = NULL;
    }

    catch(_com_error &e)
    {
        // Den Benutzer ggf. über Fehler benachrichtigen.
        _bstr_t bstrSource(e.Source());
        _bstr_t bstrDescription(e.Description());

        printf("\n\tSource :  %s \n\tdescription : %s \n ",
              (LPCSTR)bstrSource,(LPCSTR)bstrDescription);
    }

    catch(...)
    {
        cout << "Error occured in include files...."<< endl;
    }
}


Microsoft ADO MD-Programmierhandbuch

Microsoft ADO MD Programmer's Reference

Microsoft® ActiveX® Data Objects (Multidimensional) (ADO MD) bietet einfachen Zugriff auf multidimensionale Daten aus Sprachen, z. B. Microsoft Visual Basic, Microsoft Visual C++ und Microsoft Visual J++™. ADO MD erweitert Microsoft ActiveX Data Objects (ADO) auf Objekte, die für multidimensionale Daten spezifisch sind, z. B. die CubeDef- und Cellset-Objekte. Mit ADO MD können Sie ein multidimensionales Schema durchsuchen, einen Cube abfragen und die Ergebnisse abrufen.

Wie ADO verwendet auch ADO MD einen zugrunde liegenden OLE DB-Provider, um Zugriff auf die Daten zu erhalten. Für eine Zusammenarbeit mit ADO MD muss es sich bei dem Provider um einen multidimensionalen Datenprovider (MDP) handeln, wie er in der OLE DB für OLAP-Spezifikation definiert ist. MDPs zeigen Daten in multidimensionalen Ansichten an, im Gegensatz zu tabellarischen Datenprovidern (TDPs), die Daten in Tabellenansichten anzeigen. Weitere Informationen über die von Ihrem Provider unterstützte spezifische Syntax und spezifische Verhaltensweisen finden Sie in der Dokumentation Ihres OLAP OLE DB-Providers.

Bei diesem Dokument wird davon ausgegangen, dass Sie über gute Kenntnisse der Programmiersprache Visual Basic sowie allgemeine Kenntnisse von ADO und OLAP verfügen. Weitere Informationen finden Sie in der ADO Programmer's Reference und in der OLE DB for OLAP Programmer's Reference. Weitere Informationen zu ADO MD finden Sie unter folgenden Themen:

  • Neue Features in ADO MD

  • Übersicht über multidimensionale Schemas und Daten

  • Arbeiten mit multidimensionalen Daten

  • Verwenden von ADO mit ADO MD

  • Programmieren mit ADO MD

  • ADO MD-Objektmodell


Neue Features in ADO MD

ADO MD-Beispiele

Die Beispiele in Visual Basic wurden verbessert, und jetzt sind auch Beispiele in Visual Basic Scripting Edition enthalten. Sie können diese Codebeispiele kopieren und in Ihren Editor einfügen.


Übersicht über multidimensionale Schemas und Daten

Grundlegendes zu multidimensionalen Schemas

Das zentrale Metadatenobjekt in ADO MD ist der Cube. Dieser besteht aus einer strukturierten Menge von verbundenen Dimensionen, Hierarchien, Ebenen und Mitgliedern.

Eine Dimension ist eine unabhängige Kategorie von Daten aus Ihrer multidimensionalen Datenbank, die sich aus Ihren Geschäftsentitäten herleitet. Eine Dimension enthält typischerweise Elemente, die als Abfragekriterien für die Maße der Datenbank verwendet werden sollen.

Eine Hierarchie ist ein Aggregationspfad einer Dimension. Eine Dimension kann über mehrere Granularitätsebenen verfügen, die aus Beziehungen zwischen über- und untergeordneten Elementen besteht. Eine Hierarchie definiert, in welcher Beziehung diese Ebenen zueinander stehen.

Eine Ebene ist ein Aggregationsschritt in einer Hierarchie. Bei Dimensionen mit mehreren Informationsschichten ist jede Schicht eine Ebene.

Ein Mitglied ist ein Datenelement in einer Dimension. Typischerweise verwenden Sie Mitglieder, um eine Überschrift zu erstellen oder ein Maß der Datenbank zu beschreiben.

Cubes werden in ADO MD durch CubeDef-Objekte dargestellt. Dimensionen, Hierarchien, Ebenen und Mitglieder werden ebenfalls durch ihre entsprechenden ADO MD-Objekte dargestellt: Dimension, Hierarchy, Level und Member.

Dimensionen

Die Dimensionen eines Cubes hängen von den Geschäftsentitäten und Datentypen ab, die in der Datenbank abgebildet werden sollen. Typischerweise stellt jede Dimension einen unabhängigen Eingangspunkt oder Mechanismus zum Auswählen von Daten dar.

Ein Cube mit Verkaufsdaten hat z. B. die folgenden fünf Dimensionen: Verkäufer/in, Geografie, Zeit, Produkte und Maße. Die Maßedimension enthält tatsächliche Verkaufsdatenwerte, während die anderen Dimensionen zum Kategorisieren und Gruppieren der Verkaufsdatenwerte verwendet werden.

Die Geografiedimension umfasst folgende Menge von Mitgliedern:

{All, North America, Europe, Canada, USA, UK, Germany, Canada-West,
Canada-East, USA-NW, USA-SW, USA-NE, USA-SE, England, Scotland,
Wales,Ireland, Germany-North, Germany-South, Ottawa, Toronto,
Vancouver, Calgary, Seattle, Boise, Los Angeles, Houston,
Shreveport, Miami, Boston, New York, London, Dover, Glasgow,
Edinburgh, Cardiff, Pembroke, Belfast, Londonderry, Berlin,
Hamburg, Munich, Stuttgart}

Hierarchien

Hierarchien definieren, wie die Ebenen einer Dimension zusammengefasst oder gruppiert werden können. Eine Dimension kann über mehr als eine Hierarchie verfügen. Eine natürliche Hierarchie existiert in der Geografiedimension:

Ebenen

In dem Beispiel der oben abgebildeten Geografiedimension stellt jedes Feld eine Ebene in der Hierarchie dar.

Jede Ebene verfügt über eine Mitgliedermenge, und zwar wie folgt:

  • Die Welt = {Alle}

  • Kontinente = {Nordamerika, Europa}

  • Staaten = {Kanada, USA, GB, Deutschland}

  • Regionen = {Ostkanada, Westkanada, NO-USA, NW-USA, SO-USA, SW-USA, England, Irland, Schottland, Wales, Norddeutschland, Süddeutschland}

  • Städte = {Ottawa, Toronto, Vancouver, Calgary, Seattle, Boise, Los Angeles, Houston, Shreveport, Miami, Boston, New York, London, Dover, Glasgow, Edinburgh, Cardiff, Pembroke, Belfast, Londonderry, Berlin, Hamburg, München, Stuttgart}

Mitglieder

Mitglieder auf der Blattebene einer Hierarchie haben keine untergeordneten Elemente, und Mitglieder auf der Stammebene haben keine übergeordneten Elemente. Alle anderen Mitglieder haben mindestens je ein übergeordnetes und ein untergeordnetes Element. Ein Querschnitt eines Teiles der Geografiedimension der Hierarchiestruktur ergibt z. B. die folgenden Beziehungen zwischen über- und untergeordneten Elementen:

  • {Alle} (übergeordnet den Elementen) {Europa, Nordamerika}

  • {Nordamerika} (übergeordnet den Elementen) {Kanada, USA}

  • {USA} (übergeordnet den Elementen) {USA-NO, USA-NW, USA-SO, USA-SW}

  • {USA-NW} (übergeordnet den Elementen) {Boise, Seattle}

Mitglieder können dabei mit einer Hierarchie oder mehreren Hierarchien pro Dimension zusammengestellt werden. Betrachten Sie beispielsweise eine Zeitdimension, bei der es zwei Arten gibt, die Tag-Ebene zur Jahr-Ebene zusammenzufassen.

Dieses Beispiel verdeutlicht ein weiteres Merkmal: Einige Mitglieder der Wochenebene der Jahres-Wochen-Hierarchie werden auf keiner Ebene der Jahres-Quartals-Hierarchie angezeigt. Daher braucht eine Hierarchie nicht alle Mitglieder einer Dimension einzuschließen.


Arbeiten mit multidimensionalen Daten

Ein Cellset ist das Ergebnis einer Abfrage über multidimensionale Daten. Es besteht aus einer Auflistung von Achsen, normalerweise höchstens vier Achsen und meist nur zwei oder drei. Eine Achse ist eine Auflistung von Mitgliedern aus einer Dimension oder mehreren Dimensionen, die für die Suche oder das Filtern bestimmter Werte in einem Cube verwendet wird.

Eine Position ist ein Punkt auf einer Achse. Bei einer Achse, die aus einer einzigen Dimension besteht, stellen diese Positionen eine Untermenge der Mitglieder der Dimension dar. Wenn eine Achse aus mehr als einer Dimension besteht, ist jede Position eine Verbundentität aus n Teilen, wobei n die Anzahl der entlang dieser Achse orientierten Dimensionen ist. Jeder Bestandteil der Position ist ein Mitglied aus einer beteiligten Dimension.

Wenn z. B. die Geografie- und Produktdimensionen eines Cubes, der Verkaufsdaten enthält, entlang der x-Achse eines Cellsets orientiert sind, kann eine Position entlang dieser Achse die Mitglieder USA und Computer enthalten. In diesem Beispiel ist es für die Bestimmung einer Position entlang der x-Achse erforderlich, dass Mitglieder aus jeder Dimension entlang der Achse orientiert sind.

Eine Zelle ist ein Objekt, das am Schnittpunkt von Achsenkoordinaten sitzt. Zu jeder Zelle gehören mehrere Informationen, einschließlich der Daten selbst, einer formatierten Zeichenfolge (die anzeigbare Form von Zellendaten) und dem Ordinalwert der Zelle. (Jede Zelle stellt einen eindeutigen Ordinalwert im Cellset dar. Der Ordinalwert der ersten Zelle im Cellset ist null, während die ganz links stehende Zelle in der zweiten Reihe eines Cellsets mit acht Spalten einen Ordinalwert von acht hätte.)

Angenommen, ein Cube hat die folgenden sechs Dimensionen (beachten Sie bitte, dass dieses Cubeschema leicht von dem unter Übersicht über multidimensionale Schemas und Daten aufgeführten Beispiel abweicht):

  • Verkäufer/in

  • Geografie (natürliche Hierarchie) - Kontinente, Staaten, Länder usw.

  • Quartale - Quartale, Monate, Tage

  • Jahre

  • Maße - Verkäufe, ProzentÄnderung, BudgetierteVerkäufe

  • Produkte

Das folgende Cellset stellt die 1991 getätigten Verkäufe für alle Produkte dar:

Anmerkung Die Zellenwerte im Beispiel können als geordnete Paare von Achsenposition-Ordinalzahlen angezeigt werden, wobei die erste Ziffer die Position auf der x-Achse und die zweite Ziffer die Position auf der y-Achse darstellt.

Die Merkmale dieses Cellsets lauten wie folgt:

  • Achsendimensionen: Quartale, Verkäufer/in, Geografie

  • Filterdimensionen: Maße, Jahre, Produkte

  • Zwei Achsen: SPALTE (x oder Achse 0) und ZEILE (y oder Achse 1)

  • x-Achse: zwei geschachtelte Dimensionen, Verkäufer/in und Geografie

  • y-Achse: Quartaledimension

Die x-Achse verfügt über zwei geschachtelte Dimensionen: Verkäufer/in und Geografie. Aus Geografie werden vier Mitglieder ausgewählt: Seattle, Boston, USA-North und Japan. Zwei Mitglieder werden aus Verkäufer/in ausgewählt: Valentine und Nash. Dies ergibt insgesamt acht Positionen auf dieser Achse (8 = 4*2).

Jede Koordinate wird als eine Position mit zwei Mitgliedern dargestellt - einem Mitglied aus der Verkäufer/in-Dimension und dem anderen aus der Geografiedimension:

(Valentine, Seattle), (Valentine, Boston), (Valentine, USA_North),
(Valentine, Japan), (Nash, Seattle), (Nash, Boston), (Nash, USA_North),
(Nash, Japan)

Die y-Achse verfügt nur über eine Dimension, die die folgenden acht Positionen enthält:

Jan, Feb, Mar, Qtr2, Qtr3, Oct, Nov, Dec

Cellsets, Zellen, Achsen und Positionen werden in ADO MD alle durch entsprechende Objekte dargestellt: Cellset, Cell, Axis und Position.


Verwenden von ADO mit ADO MD

Bei ADO und ADO MD handelt es sich um verwandte, aber getrennte Objektmodelle. ADO stellt Objekte für die Verbindung mit Datenquellen, das Ausführen von Befehlen, das Abrufen von Tabellendaten und Schemametadaten im Tabellenformat sowie das Anzeigen von Fehlerinformationen des Providers zur Verfügung. ADO MD stellt Objekte für das Abrufen von multidimensionalen Daten und das Anzeigen von multidimensionalen Schemametadaten zur Verfügung.

Wenn Sie mit einem MDP arbeiten, können Sie wahlweise ADO, ADO MD oder beide mit Ihrer Anwendung verwenden. Durch eine Referenz auf beide Bibliotheken innerhalb des Projekts erhalten Sie vollständigen Zugriff auf die von Ihrem MDP zur Verfügung gestellten Funktionen.

Für Verbraucher ist es häufig hilfreich, eine flächige, tabellarische Ansicht einer multidimensionalen Datenmenge abzurufen. Dies können Sie erreichen, indem Sie das Recordset-Objekt von ADO verwenden. Geben Sie die Quelle für das Cellset-Objekt als den Source-Parameter für die Open-Methode eines Recordset-Objekts statt als Quelle eines ADO MD-Cellsets an.

Möglicherweise ist es auch hilfreich, die Schemametadaten in einer Tabellenansicht statt als Objekthierarchie anzuzeigen. Die OpenSchema-Methode von ADO im Connection-Objekt ermöglicht es dem Benutzer, ein Recordset-Objekt zu öffnen, das Schemainformationen enthält. Der QueryType-Parameter der OpenSchema-Methode verfügt über mehrere SchemaEnum-Werte, die sich speziell auf MDPs beziehen. Diese Werte lauten wie folgt:

  • adSchemaCubes

  • adSchemaDimensions

  • adSchemaHierarchies

  • adSchemaLevels

  • adSchemaMeasures

  • adSchemaMembers

Um Werte vom Datentyp Enum von ADO mit ADO MD-Eigenschaften oder -Methoden zu verwenden, muss das Projekt eine Referenz sowohl auf die ADO- als auch auf die ADO MD-Bibliothek enthalten. Beispielsweise können Sie die adState-Werte vom Datentyp Enum von ADO mit der State-Eigenschaft von ADO MD verwenden. Weitere Informationen zum Einrichten von Referenzen auf Bibliotheken finden Sie in der Dokumentation zum Entwicklungstool.

Weitere Informationen zu den ADO-Objekten und -Methoden finden Sie unter ADO Programmer's Reference.


Programmieren mit ADO MD

Richten Sie eine Referenz auf die ADO MD-Klassenbibliothek ein, um ADO MD zusammen mit dem von Ihnen verwendeten Entwicklungstool einzusetzen. Die Beschreibung der ADO MD-Bibliothek lautet Microsoft Data Access - ActiveX Data Objects (Multi-Dimensional). Der Dateiname der ADO MD-Bibliothek ist msadomd.dll und die Programm-ID (ProgID) "ADOMD". Weitere Informationen zum Einrichten von Referenzen auf Bibliotheken finden Sie in der Dokumentation zum Entwicklungstool.


ADO MD API-Verzeichnis

Dieser Abschnitt der ADO MD-Dokumentation enthält Themen für alle ADO MD-Objekte, -Auflistungen, -Methoden und -Eigenschaften sowie gegebenenfalls Beispielcode. Weitere Informationen finden Sie im Index unter dem entsprechenden Thema oder den folgenden Themen:

  • ADO MD-Objekte

  • ADO MD-Auflistungen

  • ADO MD-Eigenschaften

  • ADO MD-Methoden

  • ADO MD-Aufzählungskonstanten

  • ADO MD-Beispiele


ADO MD-Objektmodell

Das folgende Diagramm zeigt, wie diese Objekte in ADO MD dargestellt werden und in welcher Beziehung sie zueinander stehen.

Das Axis- und das Cell-Objekt verfügen jeweils über eine Positions-Auflistung.

Das Level- und das Position-Objekt verfügen jeweils über eine Members-Auflistung.

Die Objekte Axis, Cell, Cellset, CubeDef, Dimension, Hierarchy, Level und Member verfügen jeweils über eine standardmäßige ADO Properties-Auflistung.


ADO MD-Objekte

ADO MD-Objekte - Zusammenfassung

Objekt | Beschreibung
Axis | Stellt eine Positions- oder Filterachse eines Cellsets dar, das ausgewählte Elemente einer Dimension oder mehrerer Dimensionen enthält.
Catalog | Enthält für einen multidimensionalen Datenprovider (MDP) spezielle multidimensionale Schemainformationen (d. h. Cubes und zugrunde liegende Dimensionen, Hierarchien, Ebenen und Elemente).
Cell | Stellt die Daten am Nullpunkt der Achsenkoordinaten dar, die in einem Cellset enthalten sind.
Cellset | Stellt das Ergebnis einer multidimensionalen Abfrage dar. Es handelt sich hierbei um eine Auflistung von Zellen, die aus Cubes oder anderen Cellsets ausgewählt wurden.
CubeDef | Stellt einen Cube aus einem multidimensionalen Schema dar, das eine Menge verbundener Dimensionen enthält.
Dimension | Stellt eine der Dimensionen eines multidimensionalen Cubes dar, der eine oder mehrere Elementhierarchien enthält.
Hierarchy | Stellt eine Möglichkeit dar, um Elemente einer Dimension zusammenzufassen oder zu gruppieren. Eine Dimension kann dabei mit einer oder mehreren Hierarchien zusammengefasst werden.
Level | Enthält einen Satz von Elementen, die jeweils den gleichen Rang in einer Hierarchie aufweisen.
Member | Stellt ein Ebenenelement eines Cubes, die untergeordneten Elemente eines Ebenenelements oder ein Positionselement entlang der Achse eines Cellsets dar.
Position | Stellt eine Gruppe einzelner oder mehrerer Elemente verschiedener Dimensionen dar, die einen Punkt entlang der Achse festlegen.

Darüber hinaus ist das Catalog-Objekt mit einem ADO Connection-Objekt verbunden, das in der standardmäßigen ADO-Bibliothek enthalten ist:

Objekt | Beschreibung
Connection | Stellt eine geöffnete Verbindung mit einer Datenquelle dar.

Die Beziehungen zwischen diesen Objekten sind im ADO MD-Objektmodell dargestellt.

Zahlreiche ADO MD-Objekte können in einer zugehörigen Auflistung enthalten sein. Beispielsweise kann ein CubeDef-Objekt in einer CubeDefs-Auflistung eines Catalogs enthalten sein. Weitere Informationen hierzu finden Sie unter ADO MD-Auflistungen.


Axis-Objekt (ADO MD)

Axis-Objekt

Stellt eine Positions- oder Filterachse eines Cellsets dar, das ausgewählte Elemente einer Dimension oder mehrerer Dimensionen enthält.

Hinweise

Ein Axis-Objekt kann in einer Axes-Auflistung enthalten sein oder von einer FilterAxis-Eigenschaft eines Cellset-Objekts zurückgegeben werden.

Mit den Auflistungen und Eigenschaften eines Axis-Objekts können Sie folgende Verfahren ausführen:

  • Die Axis mit der Name-Eigenschaft identifizieren.

  • Eine Iteration der einzelnen Positionen entlang von Axis mithilfe der Positions-Auflistung durchführen.

  • Die Anzahl der Dimensionen auf Axis mithilfe der DimensionCount-Eigenschaft anfordern.

  • Providerspezifische Attribute von Axis mithilfe der standardmäßigen ADO Properties-Auflistung anfordern.


Catalog-Objekt (ADO MD)

Catalog-Objekt

Enthält für einen multidimensionalen Datenprovider (MDP) spezielle multidimensionale Schemainformationen (d. h. Cubes und zugrunde liegende Dimensionen, Hierarchien, Ebenen und Elemente).

Hinweise

Mit den Auflistungen und Eigenschaften eines Catalog-Objekts können Sie folgende Verfahren ausführen:

  • Den Katalog öffnen, indem Sie die ActiveConnection-Eigenschaft auf ein standardmäßiges ADO-Connection-Objekt oder eine gültige Verbindungszeichenfolge festlegen.

  • Den Catalog mit der Name-Eigenschaft identifizieren.

  • Eine Iteration der einzelnen Cubes in einem Katalog mithilfe der CubeDefs-Auflistung ausführen.


Cell-Objekt (ADO MD)

Cell-Objekt

Stellt die Daten am Nullpunkt der Achsenkoordinaten dar, die in einem Cellset enthalten sind.

Hinweise

Ein Cell-Objekt wird von der Item-Eigenschaft eines Cellset-Objekts zurückgegeben.

Mit den Auflistungen und Eigenschaften eines Cell-Objekts können Sie folgende Verfahren ausführen:

  • Zurückgeben der Cell-Daten mithilfe der Value-Eigenschaft.

  • Zurückgeben der Zeichenfolge, die die formatierte Anzeige der Value-Eigenschaft darstellt, mithilfe der FormattedValue-Eigenschaft.

  • Zurückgeben des Cell-Ordinalwertes innerhalb von Cellset mithilfe der Ordinal-Eigenschaft.

  • Bestimmen der Cell-Position eines CubeDef-Objekts mithilfe der Positions-Auflistung.

  • Abrufen weiterer Cell-Informationen mithilfe der standardmäßigen ADO Properties-Auflistung.

Die Properties-Auflistung enthält vom Provider zur Verfügung gestellte Eigenschaften. In der folgenden Tabelle sind möglicherweise zur Verfügung stehende Eigenschaften aufgeführt. Je nach Implementierung des Providers kann die tatsächliche Eigenschaftenliste von der hier angegebenen abweichen. Eine umfangreichere Liste der verfügbaren Eigenschaften finden Sie in der Dokumentation des Providers.

Name | Beschreibung
BackColor | Bei der Zellenanzeige verwendete Hintergrundfarbe.
FontFlags | Spezielle Schriftarteffekte mithilfe einer Bitmaske.
FontName | Beim Anzeigen des Zellenwertes verwendete Schriftart.
FontSize | Beim Anzeigen des Zellenwertes verwendete Schriftgröße.
ForeColor | Bei der Zellenanzeige verwendete Vordergrundfarbe.
FormatString | Wert in einer formatierten Zeichenfolge.


Cellset-Objekt (ADO MD)

Cellset-Objekt

Stellt das Ergebnis einer multidimensionalen Abfrage dar. Es handelt sich hierbei um eine Auflistung von Zellen, die aus Cubes oder anderen Cellsets ausgewählt wurden.

Hinweise

Daten in einem Cellset werden über einen direkten, datenfeldähnlichen Zugriff abgerufen. Sie können einen Drilldown zu einem bestimmten Element ausführen, um Daten zu diesem Element anzufordern. Beispielsweise gibt der folgende Code die Überschrift des ersten Elements an der ersten Position auf der ersten Achse des Cellsets cst zurück:

cst.Axes(0).Positions(0).Members(0).Caption

Dabei ist kein Konzept der aktuellen Zelle innerhalb des Cellsets vorhanden. Vielmehr ruft die Item-Eigenschaft ein bestimmtes Cell-Objekt aus einem Cellset ab. Die Argumente der Item-Eigenschaft legen fest, welche Zelle abgerufen wird. Sie können jedoch auch den eindeutigen Ordinalwert einer Zelle angeben. Darüber hinaus können Sie Zellen abrufen, indem Sie deren Positionsnummern entlang der Achsen des Cellsets verwenden. Weitere Informationen zum Abrufen von Zellen finden Sie unter der Item-Eigenschaft.

Mit den Auflistungen, Methoden und Eigenschaften eines Cellset-Objekts können Sie folgende Verfahren ausführen:

  • Zuordnen einer geöffneten Verbindung zu einem Cellset-Objekt durch Festlegen seiner ActiveConnection-Eigenschaft.

  • Ausführen und Abrufen von Ergebnissen multidimensionaler Abfragen mithilfe der Open-Methode.

  • Abrufen eines Cell-Objekts von einem Cellset mithilfe der Item-Eigenschaft.

  • Zurückgeben der Axis-Objekte, die das Cellset mit der Axes-Auflistung festlegen.

  • Abrufen von Informationen zu den Dimensionen, die als Filter für Cellset-Daten mit der FilterAxis-Eigenschaft verwendet werden.

  • Zurück- oder Angeben der Abfrage, die zum Festlegen des Cellsets mit der Source-Eigenschaft verwendet wird.

  • Zurückgeben des aktuellen Cellset-Status (geöffnet, geschlossen, ausgeführt oder verbunden) mithilfe der State-Eigenschaft.

  • Schließen eines geöffneten Cellsets mit der Close-Methode.

  • Abrufen providerspezifischer Cellset-Informationen mithilfe der standardmäßigen ADO Properties-Auflistung.


CubeDef-Objekt (ADO MD)

CubeDef-Objekt

Stellt einen Cube aus einem multidimensionalen Schema dar, das eine Menge verbundener Dimensionen enthält.

Hinweise

Mit den Auflistungen und Eigenschaften eines CubeDef-Objekts können Sie folgende Verfahren ausführen:

  • Identifizieren eines CubeDef-Objekts mithilfe der Name-Eigenschaft.

  • Zurückgeben einer Zeichenfolge, die den Cube mit der Description-Eigenschaft beschreibt.

  • Zurückgeben der Dimensionen, aus denen der Cube besteht, mithilfe der Dimensions-Auflistung.

  • Abrufen weiterer CubeDef-Informationen mithilfe der standardmäßigen ADO Properties-Auflistung.

Die Properties-Auflistung enthält vom Provider zur Verfügung gestellte Eigenschaften. In der folgenden Tabelle sind möglicherweise zur Verfügung stehende Eigenschaften aufgeführt. Je nach Implementierung des Providers kann die tatsächliche Eigenschaftenliste von der hier angegebenen abweichen. Eine umfangreichere Liste der verfügbaren Eigenschaften finden Sie in der Dokumentation des Providers.

Name | Beschreibung
CatalogName | Der Katalogname, zu dem dieser Cube gehört.
CreatedOn | Datum und Uhrzeit der Cube-Erstellung.
CubeGUID | Cube-GUID.
CubeName | Der Name des Cubes.
CubeType | Der Typ des Cubes.
DataUpdatedBy | Die ID des Benutzers, der die letzte Datenaktualisierung durchgeführt hat.
Description | Eine sinnvolle Beschreibung des Cubes.
LastSchemaUpdate | Datum und Uhrzeit der letzten Schemaaktualisierung.
SchemaName | Der Schemaname, zu dem dieser Cube gehört.
SchemaUpdatedBy | Die ID des Benutzers, der die letzte Schemaaktualisierung durchgeführt hat.


Dimension-Objekt (ADO MD)

Dimension-Objekt

Stellt eine der Dimensionen eines multidimensionalen Cubes dar, der eine Hierarchie oder mehrere Hierarchien von Elementen enthält.

Hinweise

Mit den Auflistungen und Eigenschaften eines Dimension-Objekts können Sie folgende Verfahren ausführen:

  • Identifizieren der Dimension mithilfe der Eigenschaften Name und UniqueName.

  • Zurückgeben einer sinnvollen Zeichenfolge, die die Dimension mit der Description-Eigenschaft beschreibt.

  • Zurückgeben des Hierarchy-Objekts, aus dem die Dimension besteht, mithilfe der Hierarchies-Auflistung.

  • Verwendung der standardmäßigen ADO Properties-Auflistung, um zusätzliche Informationen zum Dimension-Objekt anzufordern.

Die Properties-Auflistung enthält vom Provider zur Verfügung gestellte Eigenschaften. In der folgenden Tabelle sind möglicherweise zur Verfügung stehende Eigenschaften aufgeführt. Je nach Implementierung des Providers kann die tatsächliche Eigenschaftenliste von der hier angegebenen abweichen. Eine umfangreichere Liste der verfügbaren Eigenschaften finden Sie in der Dokumentation des Providers.

Name | Beschreibung
CatalogName | Der Katalogname, zu dem dieser Cube gehört.
CubeName | Der Name des Cubes.
DefaultHierarchy | Der eindeutige Name der Standardhierarchie.
Description | Eine sinnvolle Beschreibung des Cubes.
DimensionCaption | Eine der Dimension zugeordnete Beschriftung oder Überschrift.
DimensionCardinality | Die Anzahl der Elemente in der Dimension.
DimensionGUID | Die GUID der Dimension.
DimensionName | Der Name der Dimension.
DimensionOrdinal | Die Ordinalzahl der Dimension innerhalb der Dimensionengruppe, aus denen der Cube besteht.
DimensionType | Der Typ der Dimension.
DimensionUniqueName | Der eindeutige Name der Dimension.
SchemaName | Der Schemaname, zu dem dieser Cube gehört.


Hierarchy-Objekt (ADO MD)

Hierarchy-Objekt

Stellt eine Möglichkeit dar, um Elemente einer Dimension zusammenzufassen oder zu gruppieren. Eine Dimension kann dabei mit einer Hierarchie oder mehreren Hierarchien zusammengefasst werden.

Hinweise

Mit den Auflistungen und Eigenschaften eines Hierarchy-Objekts können Sie folgende Verfahren ausführen:

  • Identifizieren der Hierarchie mithilfe der Eigenschaften Name und UniqueName.

  • Zurückgeben einer sinnvollen Zeichenfolge, die die Hierarchie mit der Description-Eigenschaft beschreibt.

  • Zurückgeben des Level-Objekts, aus dem die Dimension besteht, mithilfe der Levels-Auflistung.

  • Verwendung der standardmäßigen ADO Properties-Auflistung, um zusätzliche Informationen zum Hierarchy-Objekt anzufordern.

Die Properties-Auflistung enthält vom Provider zur Verfügung gestellte Eigenschaften. In der folgenden Tabelle sind möglicherweise zur Verfügung stehende Eigenschaften aufgeführt. Je nach Implementierung des Providers kann die tatsächliche Eigenschaftenliste von der hier angegebenen abweichen. Eine umfangreichere Liste der verfügbaren Eigenschaften finden Sie in der Dokumentation des Providers.

Name | Beschreibung
AllMember | Das Element auf der höchsten Zusammenfassungsebene in der Hierarchie.
CatalogName | Der Katalogname, zu dem dieser Cube gehört.
CubeName | Der Name des Cubes.
DefaultMember | Der eindeutige Name des Standardelements für diese Hierarchie.
Description | Eine sinnvolle Beschreibung der Hierarchie.
DimensionType | Der Dimensionstyp, zu dem diese Hierarchie gehört.
DimensionUniqueName | Der eindeutige Name der Dimension.
HierarchyCaption | Eine der Hierarchie zugeordnete Beschriftung oder Überschrift.
HierarchyCardinality | Die Anzahl der Elemente in der Hierarchie.
HierarchyGUID | Die GUID der Hierarchie.
HierarchyName | Der Name der Hierarchie.
HierarchyUniqueName | Der eindeutige Name der Hierarchie.
SchemaName | Der Schemaname, zu dem dieser Cube gehört.


Level-Objekt (ADO MD)

Level-Objekt

Enthält einen Satz von Elementen, die jeweils den gleichen Rang in einer Hierarchie aufweisen.

Hinweise

Mit den Auflistungen und Eigenschaften eines Level-Objekts können Sie folgende Verfahren ausführen:

  • Identifizieren des Level-Objekts mithilfe der Eigenschaften Name und UniqueName.

  • Zurückgeben einer zu verwendenden Zeichenfolge, wenn Level mit der Caption-Eigenschaft angezeigt wird.

  • Zurückgeben einer sinnvollen Zeichenfolge, die Level mit der Description-Eigenschaft beschreibt.

  • Zurückgeben des Member-Objekts, aus dem Level besteht, mithilfe der Members-Auflistung.

  • Zurückgeben der Ebenenanzahl vom Level-Stamm mit der Depth-Eigenschaft.

  • Verwenden der standardmäßigen ADO Properties-Auflistung, um zusätzliche Informationen zum Level-Objekt anzufordern.

Die Properties-Auflistung enthält vom Provider zur Verfügung gestellte Eigenschaften. In der folgenden Tabelle sind möglicherweise zur Verfügung stehende Eigenschaften aufgeführt. Je nach Implementierung des Providers kann die tatsächliche Eigenschaftenliste von der hier angegebenen abweichen. Eine umfangreichere Liste der verfügbaren Eigenschaften finden Sie in der Dokumentation des Providers.

Name | Beschreibung
CatalogName | Der Katalogname, zu dem dieser Cube gehört.
CubeName | Der Name des Cubes.
Description | Eine sinnvolle Beschreibung der Ebene.
DimensionUniqueName | Der eindeutige Name der Dimension.
HierarchyUniqueName | Der eindeutige Name der Hierarchie.
LevelCaption | Eine der Ebene zugeordnete Beschriftung oder Überschrift.
LevelCardinality | Die Anzahl der Elemente in der Ebene.
LevelGUID | Die GUID der Ebene.
LevelName | Der Name der Ebene.
LevelNumber | Der Abstand zwischen der Ebene und dem Hierarchiestamm.
LevelType | Der Typ der Ebene.
LevelUniqueName | Der eindeutige Name der Ebene.
SchemaName | Der Schemaname, zu dem dieser Cube gehört.


Member-Objekt (ADO MD)

Member-Objekt

Stellt ein Ebenenelement eines Cubes, die untergeordneten Elemente eines Ebenenelements oder ein Positionselement entlang der Achse eines Cellsets dar.

Hinweise

Die Member-Eigenschaften sind je nach verwendetem Kontext unterschiedlich. Ein Member eines Level-Objekts in einem CubeDef-Objekt verfügt über eine Children-Eigenschaft, die die Members auf der nächstniedrigeren Hierarchieebene des aktuellen Members zurückgibt. Bei einem Member einer Position ist die Children-Auflistung stets leer. Darüber hinaus betrifft die Type-Eigenschaft nur Members einer Level.

Ein Member einer Position verfügt über zwei Eigenschaften, DrilledDown und ParentSameAsPrev, die sich speziell für die Cellset-Anzeige eignen. Wird auf diese Eigenschaften eines Members einer Level zugegriffen, tritt ein Fehler auf.

Mit den Auflistungen und Eigenschaften eines Member-Objekts einer Level können Sie folgende Verfahren ausführen:

  • Identifizieren des Member-Objekts mithilfe der Eigenschaften Name und UniqueName.

  • Zurückgeben einer zu verwendenden Zeichenfolge, wenn Member mit der Caption-Eigenschaft angezeigt wird.

  • Zurückgeben einer sinnvollen Zeichenfolge, die eine Member-Einheit oder -Formel mit der Description-Eigenschaft beschreibt.

  • Bestimmen der Merkmale von Member mit der Type-Eigenschaft.

  • Anfordern von Informationen zum Level des Members mit der LevelDepth- und LevelName-Eigenschaft.

  • Anfordern verwandter Members in einer Hierarchie mit den Eigenschaften Parent und Children.

  • Zählen der untergeordneten Elemente von Member mit der ChildCount-Eigenschaft.

  • Verwenden der standardmäßigen ADO Properties-Auflistung, um zusätzliche Informationen zum Level-Objekt anzufordern.

Mit den Auflistungen und Eigenschaften eines Member-Objekts einer Position entlang einer Achse können Sie folgende Verfahren ausführen:

  • Identifizieren des Member-Objekts mithilfe der Eigenschaften Name und UniqueName.

  • Zurückgeben einer zu verwendenden Zeichenfolge, wenn Member mit der Caption-Eigenschaft angezeigt wird.

  • Zurückgeben einer sinnvollen Zeichenfolge, die eine Member-Einheit oder -Formel mit der Description-Eigenschaft beschreibt.

  • Anfordern von Informationen zum Level des Members mit der LevelDepth- und LevelName-Eigenschaft.

  • Zählen der untergeordneten Elemente eines Members mit der ChildCount-Eigenschaft.

  • Verwenden der DrilledDown-Eigenschaft, um zu bestimmen, ob diesem Member mindestens ein untergeordnetes Element direkt auf Axis folgt.

  • Verwenden der ParentSameAsPrev-Eigenschaft, um zu bestimmen, ob das übergeordnete Element dieses Members dem übergeordneten Element des direkten Member-Vorgängers entspricht.

  • Verwenden der standardmäßigen ADO Properties-Auflistung, um zusätzliche Informationen zum Level-Objekt anzufordern.

Die Properties-Auflistung enthält vom Provider zur Verfügung gestellte Eigenschaften. In der folgenden Tabelle sind möglicherweise zur Verfügung stehende Eigenschaften aufgeführt. Je nach Implementierung des Providers kann die tatsächliche Eigenschaftenliste von der hier angegebenen abweichen. Eine umfangreichere Liste der verfügbaren Eigenschaften finden Sie in der Dokumentation des Providers.

Name | Beschreibung
CatalogName | Der Katalogname, zu dem dieser Cube gehört.
ChildrenCardinality | Die Anzahl der zugehörigen untergeordneten Elemente.
CubeName | Der Name des Cubes.
Description | Eine sinnvolle Beschreibung des Elements.
DimensionUniqueName | Der eindeutige Name der Dimension.
HierarchyUniqueName | Der eindeutige Name der Hierarchie.
LevelNumber | Der Abstand zwischen der Ebene und dem Hierarchiestamm.
LevelUniqueName | Der eindeutige Name der Ebene.
MemberCaption | Eine dem Element zugeordnete Beschriftung oder Überschrift.
MemberGUID | Die GUID des Elements.
MemberName | Der Name des Elements.
MemberOrdinal | Die Ordinalzahl des Elements.
MemberType | Der Typ des Elements.
MemberUniqueName | Der eindeutige Name des Elements.
ParentCount | Die Anzahl der zugehörigen übergeordneten Elemente.
ParentLevel | Die Ebenennummer des zugehörigen übergeordneten Elements.
ParentUniqueName | Der eindeutige Name des zugehörigen übergeordneten Elements.
SchemaName | Der Schemaname, zu dem dieser Cube gehört.


Position-Objekt (ADO MD)

Position-Objekt

Stellt eine Gruppe einzelner oder mehrerer Elemente verschiedener Dimensionen dar, die einen Punkt entlang der Achse festlegen.

Hinweise

Mit den Auflistungen und Eigenschaften eines Position-Objekts können Sie folgende Verfahren ausführen:

  • Verwenden der Ordinal-Eigenschaft, um die Ordinalposition der Position entlang der Achse zurückzugeben.

  • Verwenden der Members-Auflistung, um die Elemente zurückzugeben, aus denen die Position entlang von Axis besteht.


ADO MD-Auflistungen (ADO MD)

ADO MD-Auflistungen

ADO MD-Auflistung - Zusammenfassung

Auflistung | Beschreibung
Axes | Enthält die Axis-Objekte, die ein Cellset festlegen.
CubeDefs | Enthält die CubeDef-Objekte, die einen Cube eines multidimensionalen Katalogs darstellen.
Dimensions | Enthält die Dimension-Objekte, aus denen ein Cube besteht.
Hierarchies | Enthält die festgelegten Hierarchy-Objekte einer Dimension.
Levels | Enthält die Level-Objekte, aus denen eine Hierarchie besteht.
Members | Enthält die Member-Objekte einer Ebene oder Position entlang einer Achse.
Positions | Enthält die Position-Objekte, die einen Punkt auf einer Achse festlegen.


Axes-Auflistung (ADO MD)

Axes-Auflistung

Enthält die Axis-Objekte, die ein Cellset festlegen.

Hinweise

Ein Cellset-Objekt enthält eine Axes-Auflistung. Nachdem Cellset geöffnet wurde, enthält diese Auflistung mindestens eine Axis. Eine ausführliche Erklärung zum Verwenden von Axis-Objekten finden Sie unter Axis-Objekt.

Anmerkung Die Filterachse von Cellset ist nicht in der Axes-Auflistung enthalten. Weitere Informationen hierzu finden Sie unter FilterAxis-Eigenschaft.

Axes ist eine standardmäßige ADO-Auflistung. Mit den Eigenschaften und Methoden einer Auflistung können Sie folgende Verfahren ausführen:

  • Die Anzahl der Objekte in der Auflistung mit der Count-Eigenschaft erhalten.

  • Ein Objekt aus der Auflistung mit der Item-Standardeigenschaft zurückgeben.

  • Die Objekte in der Auflistung vom Provider mit der Refresh-Methode aktualisieren.


CubeDefs-Auflistung (ADO MD)

CubeDefs-Auflistung

Enthält die CubeDef-Objekte, die einen Cube eines multidimensionalen Katalogs darstellen.

Hinweise

CubeDefs ist eine standardmäßige ADO-Auflistung. Mit den Eigenschaften und Methoden einer Auflistung können Sie folgende Verfahren ausführen:

  • Die Anzahl der Objekte in der Auflistung mit der Count-Eigenschaft erhalten.

  • Ein Objekt aus der Auflistung mit der Item-Standardeigenschaft zurückgeben.

  • Die Objekte in der Auflistung vom Provider mit der Refresh-Methode aktualisieren.


Dimensions-Auflistung (ADO MD)

Dimensions-Auflistung

Enthält die Dimension-Objekte, aus denen ein Cube besteht.

Hinweise

Dimensions ist eine standardmäßige ADO-Auflistung. Mit den Eigenschaften und Methoden einer Auflistung können Sie folgende Verfahren ausführen:

  • Die Anzahl der Objekte in der Auflistung mit der Count-Eigenschaft erhalten.

  • Ein Objekt aus der Auflistung mit der Item-Standardeigenschaft zurückgeben.

  • Die Objekte in der Auflistung vom Provider mit der Refresh-Methode aktualisieren.


Hierarchies-Auflistung (ADO MD)

Hierarchies-Auflistung

Enthält die von einer Dimension festgelegten Hierarchy-Objekte.

Hinweise

Hierarchies ist eine standardmäßige ADO-Auflistung. Mit den Eigenschaften und Methoden einer Auflistung können Sie folgende Verfahren ausführen:

  • Die Anzahl der Objekte in der Auflistung mit der Count-Eigenschaft erhalten.

  • Ein Objekt aus der Auflistung mit der Item-Standardeigenschaft zurückgeben.

  • Die Objekte in der Auflistung vom Provider mit der Refresh-Methode aktualisieren.


Levels-Auflistung (ADO MD)

Levels-Auflistung

Enthält die Level-Objekte, aus denen eine Hierarchie besteht.

Hinweise

Levels ist eine standardmäßige ADO-Auflistung. Mit den Eigenschaften und Methoden einer Auflistung können Sie folgende Verfahren ausführen:

  • Die Anzahl der Objekte in der Auflistung mit der Count-Eigenschaft erhalten.

  • Ein Objekt aus der Auflistung mit der Item-Standardeigenschaft zurückgeben.

  • Die Objekte in der Auflistung vom Provider mit der Refresh-Methode aktualisieren.


Members-Auflistung (ADO MD)

Members-Auflistung

Enthält die Member-Objekte einer Ebene oder Position entlang einer Achse.

Hinweise

Members-Auflistungen werden verwendet, um die folgenden Typen von Elementen aufzunehmen:

  • Die Elemente, aus denen eine Ebene in einem Cube besteht. Diese sind in der Members-Auflistung eines Level-Objekts enthalten. Beispielsweise stellen in der Übersicht über multidimensionale Schemas und Daten Kanada, USA, Großbritannien und Deutschland die vier Elemente auf der Staatenebene dar.

  • Die Elemente, bei denen es sich um die untergeordneten Elemente eines bestimmten Elements in der Hierarchie handelt. Diese Elemente werden von der Children-Eigenschaft des übergeordneten Member-Objekts zurückgegeben. Um bei diesem Beispiel zu bleiben: Die beiden untergeordneten Elemente von Kanada sind Kanada-Ost und Kanada-West.

  • Die Elemente, die eine angegebene Position entlang der Achse eines Cellsets festlegen. Beispielsweise sind im Cellset unter Arbeiten mit multidimensionalen Daten die beiden ersten Elemente der ersten Position auf der x-Achse Valentine und Seattle. Diese Elemente sind in der Members-Auflistung eines Position-Objekts enthalten.

Members ist eine standardmäßige ADO-Auflistung. Mit den Eigenschaften und Methoden einer Auflistung können Sie folgende Verfahren ausführen:

  • Die Anzahl der Objekte in der Auflistung mit der Count-Eigenschaft erhalten.

  • Ein Objekt aus der Auflistung mit der Item-Standardeigenschaft zurückgeben.

  • Die Objekte in der Auflistung vom Provider mit der Refresh-Methode aktualisieren.


Positions-Auflistung (ADO MD)

Positions-Auflistung

Enthält die Position-Objekte, die einen Punkt auf einer Achse festlegen.

Hinweise

Positions ist eine standardmäßige ADO-Auflistung. Mit den Eigenschaften und Methoden einer Auflistung können Sie folgende Verfahren ausführen:

  • Die Anzahl der Objekte in der Auflistung mit der Count-Eigenschaft erhalten.

  • Ein Objekt aus der Auflistung mit der Item-Standardeigenschaft zurückgeben.

  • Die Objekte in der Auflistung vom Provider mit der Refresh-Methode aktualisieren.


ADO MD-Eigenschaften

ADO MD-Eigenschaft - Zusammenfassung

Eigenschaft | Beschreibung
ActiveConnection | Gibt an, zu welchem ADO Connection-Objekt das aktuelle Cellset bzw. der Katalog derzeit gehört.
Caption | Gibt die beim Anzeigen eines Level- oder Member-Objekts zu verwendende Textüberschrift an.
ChildCount | Gibt die Anzahl der Elemente an, für die das aktuelle Member-Objekt das übergeordnete Element in der Hierarchie ist.
Children | Gibt eine Auflistung von Member-Objekten zurück, für die das aktuelle Member-Objekt das übergeordnete Element in der Hierarchie ist.
Count | Gibt die Anzahl der Objekte in einer Auflistung an.
Depth | Gibt die Anzahl der Ebenen zwischen dem Level-Objekt und dem Stamm der Hierarchieebene an.
Description | Gibt eine Texterläuterung des aktuellen Objekts zurück.
DimensionCount | Gibt die Anzahl der Dimensionen auf einer Achse an.
DrilledDown | Gibt an, ob dem Element auf der Achse untergeordnete Elemente unmittelbar folgen.
FilterAxis | Gibt Filterinformationen für das aktuelle Cellset an.
Item | Ruft eine Zelle aus einem Cellset mithilfe ihrer Koordinaten ab.
Item | Gibt ein bestimmtes Element einer Auflistung nach Namen oder Ordinalzahl geordnet zurück.
FormattedValue | Gibt die formatierte Anzeige eines Zellenwertes an.
LevelDepth | Gibt die Anzahl der Ebenen zwischen dem Stamm der Hierarchie und einem Element an.
LevelName | Gibt den Namen der Ebene eines Elements an.
Name | Gibt den Namen eines Objekts an.
Ordinal (Cell) | Gibt eine Zelle anhand ihrer Position in einem Cellset eindeutig an.
Ordinal (Position) | Gibt eine Position entlang einer Achse eindeutig an.
Parent | Gibt das übergeordnete Element des aktuellen Elements in einer Hierarchie an.
ParentSameAsPrev | Gibt an, ob das übergeordnete Element dieser Position mit dem übergeordneten direkten Vorgängerelement identisch ist.
Source | Gibt die Quelle für die Daten im Cellset an.
State | Gibt den aktuellen Status des Cellsets an.
Type | Gibt den Typ des aktuellen Elements an.
UniqueName | Gibt einen eindeutigen Namen für das aktuelle Objekt an.
Value | Gibt den Wert der aktuellen Zelle an.


ActiveConnection-Eigenschaft (ADO MD)

ActiveConnection-Eigenschaft

Gibt an, zu welchem Connection-Objekt von ADO das aktuelle Cellset oder der Katalog derzeit gehört.

Einstellungen und Rückgabewerte

Legt einen Wert vom Datentyp Variant fest, der eine Zeichenfolge mit der Definition für eine Verbindung oder ein Connection-Objekt enthält, oder gibt ihn zurück. Der Standardwert ist eine leere Zeichenfolge.

Hinweise

Sie können diese Eigenschaft auf ein gültiges Connection-Objekt oder auf eine gültige Verbindungszeichenfolge festlegen. Ist diese Eigenschaft auf eine Verbindungszeichenfolge festgelegt, erstellt der Provider ein neues Connection-Objekt mithilfe dieser Definition und öffnet die Verbindung.

Wenn Sie das ActiveConnection-Argument der Open-Methode zum Öffnen eines Cellset -Objekts verwenden, übernimmt die ActiveConnection-Eigenschaft den Wert des Arguments.

Das Festlegen der ActiveConnection-Eigenschaft eines Catalog-Objekts auf Nothing gibt die zugeordneten Daten frei, einschließlich der Daten in der CubeDefs-Auflistung sowie allen verbundenen Dimension-, Hierarchy-, Level- und Member-Objekten. Das Schließen eines zum Öffnen eines Catalog-Objekts verwendeten Connection-Objekts hat die gleichen Auswirkungen wie das Festlegen der ActiveConnection-Eigenschaft auf Nothing.

Wenn Sie versuchen, die ActiveConnection-Eigenschaft für ein geöffnetes Cellset-Objekt zu ändern, tritt ein Fehler auf.

Anmerkung Achten Sie beim Arbeiten mit Visual Basic darauf, das Schlüsselwort Set zu verwenden, wenn Sie die ActiveConnection-Eigenschaft auf ein Connection-Objekt festlegen. Wenn Sie das Schlüsselwort Set auslassen, setzen Sie lediglich die ActiveConnection-Eigenschaft der Standardeigenschaft des Connection-Objekts, ConnectionString, gleich. Der Code funktioniert; Sie stellen jedoch eine zusätzliche Verbindung zur Datenquelle her, was sich möglicherweise negativ auf die Leistung auswirken könnte.

Legen Sie beim Verwenden des MSOLAP-Datenproviders die Datenquelle einer Verbindungszeichenfolge auf einen Servernamen und den Startkatalog auf einen Katalognamen der Datenquelle fest. Legen Sie als Speicherort die vollständige Pfadangabe zur CUB-Datei fest, um sich mit einer vom Server getrennten Cube-Datei zu verbinden. Legen Sie in beiden Fällen für den Provider dessen Namen fest. Beispielsweise wird durch die folgende Zeichenfolge eine Verbindung zwischen dem Katalog Bobs Video Store auf einem Server mit der Bezeichnung Servername und dem MSOLAP-Provider hergestellt:

"Data Source=Servername;Initial Catalog=Bobs Video Store;Provider=msolap"

Die folgende Zeichenfolge stellt eine Verbindung zu einer lokalen Cube-Datei im Pfad C:\MSDASDK\samples\oledb\olap\data\bobsvid.cub her:

"Location=C:\MSDASDK\samples\oledb\olap\data\bobsvid.cub;Provider=msolap"


Caption-Eigenschaft (ADO MD)

Caption-Eigenschaft

Gibt die beim Anzeigen eines Level - oder Member-Objekts zu verwendende Textüberschrift an.

Rückgabewerte

Gibt einen Wert vom Datentyp String zurück, der schreibgeschützt ist.


ChildCount-Eigenschaft (ADO MD)

ChildCount-Eigenschaft

Gibt die Anzahl der Elemente an, für die das aktuelle Member-Objekt das übergeordnete Element in der Hierarchie ist.

Rückgabewerte

Gibt einen ganzzahligen Wert vom Datentyp Long zurück, der schreibgeschützt ist.

Hinweise

Verwenden Sie die ChildCount-Eigenschaft, um eine ungefähre Angabe über die Anzahl der untergeordneten Elemente eines Member-Objekts zu erhalten. Die tatsächliche Anzahl der untergeordneten Elemente eines Member-Objekts wird mithilfe der Children-Eigenschaft zurückgegeben.

Für Member-Objekte eines Position-Objekts kann als maximale Anzahl 65.536 zurückgegeben werden. Liegt die tatsächliche Anzahl der untergeordneten Elemente darüber, wird dennoch nur der Wert 65536 zurückgegeben. Die Anwendung sollte den ChildCount-Wert 65536 daher als gleich oder größer als 65.536 untergeordnete Elemente interpretieren.

Verwenden Sie bei Member-Objekten eines Level-Objekts die Count-Eigenschaft der ADO-Auflistung auf die Children-Auflistung, um die genaue Anzahl der untergeordneten Elemente zu bestimmen. Das Bestimmen der genauen Anzahl ist möglicherweise zeitintensiv, wenn es sich um eine große Anzahl untergeordneter Elemente in der Auflistung handelt.


Children-Eigenschaft (ADO MD)

Children-Eigenschaft

Gibt eine Members-Auflistung zurück, für die das aktuelle Member-Objekt das übergeordnete Element in der Hierarchie ist.

Rückgabewerte

Gibt eine Members-Auflistung zurück, die schreibgeschützt ist.

Hinweise

Die Children-Eigenschaft enthält eine Members-Auflistung, für die das aktuelle Member-Objekt das übergeordnete Element in der Hierarchie ist. Member-Objekte auf Blattebene verfügen in der Members-Auflistung über kein untergeordnetes Element. Diese Eigenschaft wird nur bei Member-Objekten unterstützt, die zu einem Level-Objekt gehören. Wird auf diese Eigenschaft von einem zum Position-Objekt gehörenden Member-Objekt aus verwiesen, tritt ein Fehler auf.


Depth-Eigenschaft (ADO MD)

Depth-Eigenschaft

Gibt die Anzahl der Ebenen zwischen dem Level-Objekt und dem Stamm der Hierarchie an.

Rückgabewerte

Gibt eine Ganzzahl zurück, die schreibgeschützt ist.

Hinweise

Ein Level am Hierarchiestamm weist einen Depth-Wert von null (0) auf.


Description-Eigenschaft (ADO MD)

Description-Eigenschaft

Gibt eine Texterläuterung des aktuellen Objekts zurück.

Rückgabewerte

Gibt einen Wert vom Datentyp String zurück, der schreibgeschützt ist.

Hinweise

Bei Member-Objekten bezieht sich die Description-Eigenschaft nur auf Elemente von Einheiten und Formeln. Für alle anderen Typen von Elementen gibt Description eine leere Zeichenfolge ("") zurück. Weitere Informationen zu den verschiedenen Typen von Elementen finden Sie unter der Type-Eigenschaft.

Diese Eigenschaft wird nur bei Member-Objekten unterstützt, die zu einem Level-Objekt gehören. Wird auf diese Eigenschaft von einem zum Position-Objekt gehörenden Member-Objekt aus verwiesen, tritt ein Fehler auf.


DimensionCount-Eigenschaft (ADO MD)

DimensionCount-Eigenschaft

Gibt die Anzahl der Dimensionen auf einer Achse an.

Rückgabewerte

Gibt einen ganzzahligen Wert vom Datentyp Long zurück, der schreibgeschützt ist.


DrilledDown-Eigenschaft (ADO MD)

DrilledDown-Eigenschaft

Gibt an, ob dem Element auf der Achse untergeordnete Elemente unmittelbar folgen.

Rückgabewerte

Gibt einen booleschen Wert zurück, der schreibgeschützt ist. Die DrilledDown-Eigenschaft gibt True zurück, wenn keine untergeordneten Elemente des aktuellen Elements auf der Achse vorhanden sind. DrilledDown gibt False zurück, wenn mindestens ein untergeordnetes Element des aktuellen Elements auf der Achse vorhanden ist.

Hinweise

Verwenden Sie die DrilledDown-Eigenschaft, um zu bestimmen, ob diesem Element mindestens ein untergeordnetes Element direkt auf der Achse folgt. Diese Information ist hilfreich beim Anzeigen von Elementen.

Diese Eigenschaft wird nur bei Member-Objekten unterstützt, die zu einem Position-Objekt gehören. Wird auf diese Eigenschaft von einem zum Level-Objekt gehörenden Member-Objekt aus verwiesen, tritt ein Fehler auf.


FilterAxis-Eigenschaft (ADO MD)

FilterAxis-Eigenschaft

Gibt Filterinformationen zum aktuellen Cellset an.

Rückgabewerte

Gibt ein Axis-Objekt zurück, das schreibgeschützt ist.

Hinweise

Verwenden Sie die FilterAxis-Eigenschaft, um Informationen über die Dimensionen zurückzugeben, die zum Unterteilen der Daten verwendet wurden. Die DimensionCount-Eigenschaft des Axis-Objekts gibt die Anzahl der Teildimensionen zurück. Diese Achse verfügt für gewöhnlich nur über eine Zeile.

Das von der FilterAxis-Eigenschaft zurückgegebene Axis-Objekt ist nicht in der Axes-Auflistung für ein Cellset-Objekt enthalten.


FormattedValue-Eigenschaft (ADO MD)

FormattedValue-Eigenschaft

Gibt die formatierte Anzeige eines Zellenwertes an.

Rückgabewerte

Gibt einen Wert vom Datentyp String zurück, der schreibgeschützt ist.

Hinweise

Verwenden Sie die FormattedValue-Eigenschaft, um eine formatierte Werteanzeige der Value-Eigenschaft eines Cell-Objekts zu erhalten. Ist der Wert einer Zelle beispielsweise 1056,87, wobei der Wert für den Währungsbetrag steht, wird FormattedValue als DM 1.056,87 angezeigt.


Item-Eigenschaft (ADO MD Cellset)

Item-Eigenschaft (Cellset)

Ruft eine Zelle aus einem Cellset mithilfe ihrer Koordinaten ab.

Syntax

Set Cell = Cellset.Item ( Positions )

Parameter

Positions Ein Array von Werten vom Datentyp Variant, die eine Zelle eindeutig angeben. Positions kann einer der folgenden Werte sein:

  • Ein Array von Positionsnummern

  • Ein Array von Elementnamen

  • Die Ordinalposition

Hinweise

Verwenden Sie die Item-Eigenschaft, um ein Cell-Objekt innerhalb eines Cellset-Objekts zurückzugeben. Wenn die Item-Eigenschaft die Zelle, die dem Argument Positions entspricht, nicht finden kann, tritt ein Fehler auf.

Die Item-Eigenschaft ist die Standardeigenschaft für das Cellset-Objekt. Die folgenden Syntaxformen sind austauschbar:

Cellset.Item ( Positions )

Cellset ( Positions )

Das Argument Positions gibt an, welche Zelle zurückgegeben werden soll. Sie können die Zelle über die Ordinalposition oder über die Position entlang jeder Achse angeben. Wenn Sie die Zelle über die Position entlang jeder Achse angeben, können Sie den numerischen Wert der Position oder die Namen der Elemente für jede Position angeben.

Die Ordinalposition ist eine Nummer, die eine Zelle innerhalb des Cellsets eindeutig identifiziert. Vom Konzept her werden Zellen in einem Cellset-Objekt nummeriert, als ob das Cellset-Objekt ein p-dimensionales Array wäre, wobei p die Anzahl der Achsen darstellt. Zellen werden in aufsteigender Reihenfolge adressiert. Nachstehend finden Sie die Formel zur Berechnung der Ordinalzahl einer Zelle:

Wenn Elementnamen als Zeichenfolgen an Item übergeben werden, müssen die Elemente in aufsteigender Reihenfolge der numerischen Achsenbezeichner aufgelistet werden. Innerhalb einer Achse müssen die Elemente in aufsteigender Reihenfolge der Dimensionsschachtelung aufgelistet werden, d. h., das Element der äußersten Dimension wird zuerst genannt, gefolgt von Elementen der inneren Dimensionen. Jede Dimension sollte durch eine gesonderte Zeichenfolge dargestellt werden, und die Liste der Elementzeichenfolgen sollte durch Kommas getrennt sein.

Anmerkung Das Abrufen von Zellen über den Elementnamen wird von Ihrem Datenprovider möglicherweise nicht unterstützt. Weitere Informationen erhalten Sie in der Dokumentation des Providers.


LevelDepth-Eigenschaft (ADO MD)

LevelDepth-Eigenschaft

Gibt die Anzahl der Ebenen zwischen dem Stamm der Hierarchie und einem Element an.

Rückgabewerte

Gibt einen ganzzahligen Wert vom Datentyp Long zurück, der schreibgeschützt ist.

Hinweise

Verwenden Sie die LevelDepth-Eigenschaft, um die Entfernung zwischen dem Member-Objekt und der Stammebene der Hierarchie bestimmen zu können. Die LevelDepth eines Elements ist auf der Stammebene 0; dies entspricht der Depth-Eigenschaft eines Level-Objekts.


LevelName-Eigenschaft (ADO MD)

LevelName-Eigenschaft

Gibt den Namen der Ebene eines Elements an.

Rückgabewerte

Gibt einen Wert vom Datentyp String zurück, der schreibgeschützt ist.

Hinweise

Verwenden Sie die LevelName-Eigenschaft, um den Ebenennamen abzurufen, zu dem ein Element gehört. Dies entspricht der Name-Eigenschaft eines Level-Objekts.


Name-Eigenschaft (ADO MD)

Name-Eigenschaft

Gibt den Namen eines Objekts an.

Rückgabewerte

Gibt einen Wert vom Datentyp String zurück, der schreibgeschützt ist.

Hinweise

Sie können die Name-Eigenschaft eines Objekts durch einen Ordinalverweis abrufen. Danach können Sie anhand des Namens direkt auf das Objekt verweisen. Wenn beispielsweise cdf.CubeDefs(0).Name "Bobs Video Store" zurückgibt, können Sie mit cdf.CubeDefs("Bobs Video Store") auf dieses CubeDef-Objekt referenzieren.


Ordinal-Eigenschaft (ADO MD Cell)

Ordinal-Eigenschaft (Cell)

Gibt eine Zelle anhand ihrer Position in einem Cellset eindeutig an.

Rückgabewerte

Gibt einen ganzzahligen Wert vom Datentyp Long zurück, der schreibgeschützt ist.

Hinweise

Der Ordinalwert einer Zelle stellt einen eindeutigen Bezeichner im Cellset dar. Vom Konzept her werden Zellen in einem Cellset nummeriert, als ob es sich bei diesem um ein p-dimensionales Datenfeld handelt, wobei p der Anzahl der Achsen entspricht. Zellen werden bei null beginnend in aufsteigender Reihenfolge nummeriert. Nachstehend finden Sie die Formel zur Berechnung der Ordinalzahl einer Zelle:

Der Ordinalwert einer Zelle kann mit der Item-Eigenschaft des Cellset-Objekts verwendet werden, um das Cell-Objekt rasch abrufen zu können.


Ordinal-Eigenschaft (ADO MD Position)

Ordinal-Eigenschaft (Position)

Gibt eine Position entlang einer Achse eindeutig an.

Rückgabewerte

Gibt einen ganzzahligen Wert vom Datentyp Long zurück, der schreibgeschützt ist.

Hinweise

Die Ordinal-Eigenschaft eines Position-Objekts entspricht dem Position-Index in einer Positions-Auflistung.

Eine Zelle kann mithilfe der Ordinal-Eigenschaft des Position-Objekts entlang jeder einzelnen Achse direkt abgerufen werden, indem die Item-Eigenschaft des Cellset-Objekts verwendet wird.


Parent-Eigenschaft (ADO MD)

Parent-Eigenschaft

Gibt das übergeordnete Element des aktuellen Elements in einer Hierarchie an.

Rückgabewerte

Gibt ein Member-Objekt zurück, das schreibgeschützt ist.

Hinweise

Ein Element auf der obersten Ebene einer Hierarchie (dem Stamm) verfügt über keine übergeordneten Elemente. Diese Eigenschaft wird nur bei Member-Objekten unterstützt, die zu einem Level-Objekt gehören. Wird auf diese Eigenschaft von einem zum Position-Objekt gehörenden Member-Objekt aus verwiesen, tritt ein Fehler auf.


ParentSameAsPrev-Eigenschaft (ADO MD)

ParentSameAsPrev-Eigenschaft

Gibt an, ob das übergeordnete Element dieses Positionselements mit dem übergeordneten Element des direkten Vorgängerelements identisch ist.

Rückgabewerte

Gibt einen booleschen Wert zurück, der schreibgeschützt ist.

Hinweise

Diese Eigenschaft wird nur bei Member-Objekten unterstützt, die zu einem Position-Objekt gehören. Wird auf diese Eigenschaft von einem zum Level-Objekt gehörenden Member-Objekt aus verwiesen, tritt ein Fehler auf.


Source-Eigenschaft (ADO MD)

Source-Eigenschaft

Gibt die Quelle für die Daten im Cellset an.

Einstellungen und Rückgabewerte

Legt einen Wert vom Datentyp Variant fest, der für geschlossene Cellset-Objekte Schreib-/Lesezugriff bietet und für geöffnete Cellset-Objekte schreibgeschützt ist, oder gibt diesen Wert zurück. Der Wert vom Datentyp Variant sollte einen gültigen Wert vom Datentyp String enthalten, z. B. eine MDX-Abfrage.


State-Eigenschaft (ADO MD)

State-Eigenschaft

Gibt den aktuellen Status des Cellsets an.

Rückgabewerte

Gibt einen ganzzahligen Wert vom Datentyp Long zurück, der die aktuelle Bedingung des Cellset-Objekts angibt und schreibgeschützt ist. Dabei sind die folgenden Werte gültig: adStateClosed (0) und adStateOpen (1).

Hinweise

In Ihrem Projekt muss eine Referenz auf die ADO-Typbibliothek vorhanden sein, um Namen von ObjectStateEnum-Konstanten verwenden zu können. Weitere Informationen hierzu finden Sie unter Verwenden von ADO mit ADO MD.


Type-Eigenschaft (ADO MD)

Type-Eigenschaft

Gibt den Typ des aktuellen Elements an.

Rückgabewerte

Gibt einen MemberTypeEnum-Wert zurück, der schreibgeschützt ist.

Hinweise

Diese Eigenschaft wird nur bei Member-Objekten unterstützt, die zu einem Level-Objekt gehören. Wird auf diese Eigenschaft von einem zum Position-Objekt gehörenden Member-Objekt aus verwiesen, tritt ein Fehler auf.


UniqueName-Eigenschaft (ADO MD)

UniqueName-Eigenschaft

Gibt einen eindeutigen Namen für das aktuelle Objekt an.

Rückgabewerte

Gibt einen Wert vom Datentyp String zurück, der schreibgeschützt ist.


Value-Eigenschaft (ADO MD)

Value-Eigenschaft

Gibt den Wert der aktuellen Zelle an.

Rückgabewerte

Gibt einen Wert vom Datentyp Variant zurück, der schreibgeschützt ist.


ADO MD-Methoden

Zusammenfassung der Methoden für ADO MD

Methode | Beschreibung
Close | Schließt ein geöffnetes Cellset.
Open | Ruft die Ergebnisse einer multidimensionalen Abfrage ab und gibt die Ergebnisse an ein Cellset zurück.
Refresh | Aktualisiert die Objekte in einer Auflistung, um Objekte zu übernehmen, die vom Provider erhältlich und für ihn spezifisch sind.


Close-Methode (ADO MD)

Close-Methode

Schließt ein geöffnetes Cellset.

Syntax

Cellset.Close

Hinweise

Die Verwendung der Close-Methode zum Schließen eines Cellset-Objekts gibt die zugeordneten Daten frei, einschließlich der Daten in allen verbundenen Objekten vom Typ Cell, Axis, Position oder Member. Das Schließen eines Cellset-Objekts entfernt dieses nicht aus dem Speicher. Sie können seine Eigenschaftseinstellungen ändern und es zu einem späteren Zeitpunkt erneut öffnen. Um ein Objekt vollständig aus dem Speicher zu entfernen, legen Sie die Objektvariable auf Nothing fest.

Später können Sie die Open-Methode aufrufen, um das Cellset-Objekt mit der gleichen oder einer anderen Quellzeichenfolge erneut zu öffnen. Solange das Cellset-Objekt geschlossen ist, wird ein Fehler erzeugt, wenn Eigenschaften abgerufen oder Methoden aufgerufen werden, die einen Verweis auf die zugrunde liegenden Daten oder Metadaten enthalten.


Open-Methode (ADO MD)

Open-Methode

Ruft die Ergebnisse einer multidimensionalen Abfrage ab und gibt die Ergebnisse an ein Cellset zurück.

Syntax

Cellset.Open Source, ActiveConnection

Parameter

Source Optional. Ein Wert vom Datentyp Variant, der eine gültige multidimensionale Abfrage ergibt, z. B. eine Multidimensional Expression-Abfrage (MDX). Das Source-Argument entspricht der Source-Eigenschaft. Weitere Informationen zu MDX finden Sie in der OLE DB for OLAP Programmer's Reference im Microsoft Data Access Components SDK.

ActiveConnection Optional. Ein Wert vom Datentyp Variant, der eine Zeichenfolge ergibt, die entweder einen gültigen Namen einer ADO-Connection-Objektvariablen oder eine Definition für eine Verbindung angibt. Das ActiveConnection-Argument gibt die Verbindung an, in der das Cellset-Objekt geöffnet werden soll. Wenn Sie eine Verbindungsdefinition für dieses Argument übergeben, öffnet ADO eine neue Verbindung unter Verwendung der festgelegten Parameter. Das ActiveConnection-Argument entspricht der ActiveConnection-Eigenschaft.

Hinweise

Die Open-Methode erzeugt einen Fehler, wenn einer der Parameter ausgelassen wurde und der entsprechende Eigenschaftenwert vor dem Versuch, das Cellset-Objekt zu öffnen, nicht festgelegt wurde.


ADO MD-Aufzählungskonstanten

Als Hilfe für das Debuggen führen die ADO MD-Aufzählungskonstanten einen Wert für jede Konstante auf. Dieser Wert ist jedoch lediglich eine Empfehlung und kann von einer Version von ADO MD zur anderen variieren. Der Code sollte nur vom Namen und nicht vom Wert der Aufzählungskonstanten abhängen.

Die folgende Aufzählung ist definiert.

  • MemberTypeEnum


MemberTypeEnum

Gibt die Einstellungen für die Type–Eigenschaft eines Member-Objekts an.

Konstante | Wert | Beschreibung
adMemberAll | 4 | Gibt an, dass das Member-Objekt alle Elemente der Ebene darstellt.
adMemberFormula | 3 | Gibt an, dass das Member-Objekt mithilfe eines Formelausdrucks berechnet wird.
adMemberMeasure | 2 | Gibt an, dass das Member-Objekt zur Measures-Dimension gehört und eine quantitative Eigenschaft darstellt.
adMemberRegular | 1 | Standard. Gibt an, dass das Member-Objekt eine Instanz einer Geschäftseinheit darstellt.
adMemberUnknown | 0 | Der Typ des Elements kann nicht bestimmt werden.


ADO MD-Beispiele

Verwenden Sie die folgenden Codebeispiele, um zu erfahren, wie Sie die Objekte, Methoden und Eigenschaften von ADO MD einsetzen können. Diese Beispiele sind eine Untermenge der Beispielanwendungen, die in Microsoft SQL Server OLAP Services für SQL Server 7.0 installiert sind.

Diese Beispiele verwenden den OLE DB-Provider von MSOLAP und werden gegen einen lokalen Host von Microsoft SQL Server OLAP Services ausgeführt. Die Beispiele sollen jedoch fundamentale ADO MD-Programmiertechniken veranschaulichen und lassen sich leicht auf andere Datenquellen und Provider übertragen.

  • ADO MD-Codebeipiele in Visual Basic

  • ADO MD-Codebeispiele in Visual Basic Scripting Edition


ADO MD-Codebeispiele in Visual Basic

Für folgende Beispiele ist Microsoft Visual Basic, Version 5.0, mit Service Pack 3 oder Visual Basic, Version 6.0, erforderlich.

Anmerkung Fügen Sie das gesamte Codebeispiel von Anfang bis Ende in den Code-Editor ein. Wenn nur Teile der Beispiele verwendet werden oder die Absatzformatierung verloren geht, wird das Beispiel möglicherweise nicht ordnungsgemäß ausgeführt.

  • Cellset-Beispiel

  • Catalog-Beispiel


Cellset-Beispiel (VB)

Dieses Visual Basic-Projekt veranschaulicht die Grundlagen der Verwendung von ADO MD für das Zugreifen auf Daten eines Cubes. Es zeigt Überschriften der Elemente bei Spalten- und Zeilenköpfen und anschließend formatierte Werte bestimmter Zellen innerhalb des Cellsets an.

Private Sub cmdCellSettoDebugWindow_Click()
Dim cat As New ADOMD.Catalog
Dim cst As New ADOMD.Cellset
Dim i As Integer
Dim j As Integer
Dim strServer As String
Dim strSource As String
Dim strColumnHeader As String
Dim strRowText As String

On Error GoTo Error_cmdCellSettoDebugWindow_Click
Screen.MousePointer = vbHourglass
'*-----------------------------------------------------------------------
'* Den Server auf den lokalen Host festlegen
'*-----------------------------------------------------------------------
    strServer = "LOCALHOST"

'*-----------------------------------------------------------------------
'* Die Quelle der MDX-Abfragezeichenfolge festlegen
'*-----------------------------------------------------------------------
    strSource = strSource & "SELECT "
    strSource = strSource & "{[Measures].members} ON COLUMNS,"
    strSource = strSource & _
        "NON EMPTY [Store].[Store City].members ON ROWS"
    strSource = strSource & " FROM Sales"

'*-----------------------------------------------------------------------
'* ActiveConnection festlegen
'*-----------------------------------------------------------------------
        cat.ActiveConnection = "Data Source=" & strServer & _
            ";Provider=msolap;"

'*-----------------------------------------------------------------------
'* Die Quelle des Cellsets auf die MDX-Abfragezeichenfolge festlegen
'*-----------------------------------------------------------------------
        cst.Source = strSource

'*-----------------------------------------------------------------------
'* Die aktive Verbindung des Cellsets auf die aktuelle Verbindung
'* festlegen
'*-----------------------------------------------------------------------
    Set cst.ActiveConnection = cat.ActiveConnection

'*-----------------------------------------------------------------------
'* Das Cellset öffnen
'*-----------------------------------------------------------------------
    cst.Open

'*-----------------------------------------------------------------------
'* Platz für den Zeilenheadertext bereitstellen
'*-----------------------------------------------------------------------
strColumnHeader = vbTab & vbTab & vbTab & vbTab & vbTab & vbTab

'*-----------------------------------------------------------------------
'* Die Spaltenheader durchlaufen
'*-----------------------------------------------------------------------
       For i = 0 To cst.Axes(0).Positions.Count - 1
            strColumnHeader = strColumnHeader & _
                cst.Axes(0).Positions(i).Members(0).Caption & vbTab & _
                    vbTab & vbTab & vbTab
       Next
       Debug.Print vbTab & strColumnHeader & vbCrLf

'*-----------------------------------------------------------------------
'* Die Zeilenheader durchlaufen und Daten für jede Zeile bereitstellen
'*-----------------------------------------------------------------------
        strRowText = ""
        For j = 0 To cst.Axes(1).Positions.Count - 1
            strRowText = strRowText & _
                cst.Axes(1).Positions(j).Members(0).Caption & vbTab & _
                    vbTab & vbTab & vbTab
            For k = 0 To cst.Axes(0).Positions.Count - 1
                strRowText = strRowText & cst(k, j).FormattedValue & _
                    vbTab & vbTab & vbTab & vbTab
            Next
            Debug.Print strRowText & vbCrLf
            strRowText = ""
        Next

    Screen.MousePointer = vbDefault
Exit Sub

Error_cmdCellSettoDebugWindow_Click:
   Beep
   Screen.MousePointer = vbDefault
   MsgBox "The Following Error has occurred:" & vbCrLf & _
      Err.Description, vbCritical, " Error!"
   Exit Sub
End Sub


Catalog-Beispiel (VB)

Dieses Visual Basic-Projekt erstellt mithilfe von MDX einen neuen Cube. Anschließend dokumentiert es die Struktur eines Cubes in einem Microsoft Word-Dokument.

Private Sub cmdCreateDocForCube_Click()
Dim cn As ADODB.Connection
Dim s As String
Dim strProvider As String
Dim strDataSource As String
Dim strSourceDSN As String
Dim strSourceDSNSuffix As String
Dim strCreateCube As String
Dim strInsertInto As String

On Error GoTo Error_cmdCreateDocForCube_Click

'*-----------------------------------------------------------------------
'* Der folgende Code erstellt eine Cubedatei und dokumentiert ihre
'* Eigenschaften mithilfe einer OLE-Verbindung in Word 8.0
'*-----------------------------------------------------------------------

'*-----------------------------------------------------------------------
'* Einen Provider zur Verbindungszeichenfolge hinzufügen.
'*-----------------------------------------------------------------------
strProvider = "PROVIDER=MSOLAP"

'*-----------------------------------------------------------------------
'* Als DATA SOURCE den Namen der zu erstellenden Datei hinzufügen.
'*-----------------------------------------------------------------------

strDataSource = "DATA SOURCE=c:\DocumentCube.cub"

'*-----------------------------------------------------------------------
'* SOURCE_DSN für die Datenquelle zur Verbindungszeichenfolge hinzufügen.
'* Der Wert muss in Anführungszeichen gesetzt werden, damit er beim
'* Analysieren als ein einzelner Wert erkannt wird. Hier kann eine ODBC-
'* Verbindungszeichenfolge oder eine OLE DB-Verbindungszeichenfolge
'* verwendet werden (wie von der Datenquellenlokator-Komponente
'* zurückgegeben).
'*-----------------------------------------------------------------------

strSourceDSN = "SOURCE_DSN=FoodMart"

'*-----------------------------------------------------------------------
'* Möglicherweise sollen zur Laufzeit noch einige andere Parameter
'* angewendet werden, diese werden jedoch nicht in der Cubedatei
'* gespeichert oder in der Ausgabezeichenfolge zurückgegeben.
'*-----------------------------------------------------------------------

' strSourceDSNSuffix = "UID=;PWD="

'*-----------------------------------------------------------------------
'* CREATE CUBE hinzufügen. Damit wird die Struktur des Cubes definiert,
'* aber nicht die Daten im Cube. Die BNF hierfür ist in der
'* OLE DB for OLAP Programmer's Reference dokumentiert. Beachten Sie,
'* dass Namen in doppelte Anführungszeichen oder in eckige Klammern
'* eingeschlossen werden können.
'*-----------------------------------------------------------------------

strCreateCube = "CREATECUBE=CREATE CUBE Sample( "
strCreateCube = strCreateCube & "DIMENSION [Product],"
        strCreateCube = strCreateCube & "LEVEL [All Products]  TYPE ALL,"
        strCreateCube = strCreateCube & "LEVEL [Product Family] ,"
        strCreateCube = strCreateCube & "LEVEL [Product Department] ,"
        strCreateCube = strCreateCube & "LEVEL [Product Category] ,"
        strCreateCube = strCreateCube & "LEVEL [Product Subcategory] ,"
        strCreateCube = strCreateCube & "LEVEL [Brand Name] ,"
        strCreateCube = strCreateCube & "LEVEL [Product Name] ,"
strCreateCube = strCreateCube & "DIMENSION [Store],"
        strCreateCube = strCreateCube & "LEVEL [All Stores]  TYPE ALL,"
        strCreateCube = strCreateCube & "LEVEL [Store Country] ,"
        strCreateCube = strCreateCube & "LEVEL [Store State] ,"
        strCreateCube = strCreateCube & "LEVEL [Store City] ,"
        strCreateCube = strCreateCube & "LEVEL [Store Name] ,"
strCreateCube = strCreateCube & "DIMENSION [Store Type],"
        strCreateCube = strCreateCube & _
            "LEVEL [All Store Type]  TYPE ALL,"
        strCreateCube = strCreateCube & "LEVEL [Store Type] ,"
strCreateCube = strCreateCube & "DIMENSION [Time] TYPE TIME,"
    strCreateCube = strCreateCube & "HIERARCHY [Column],"
        strCreateCube = strCreateCube & "LEVEL [All Time]  TYPE ALL,"
        strCreateCube = strCreateCube & "LEVEL [Year]  TYPE YEAR,"
        strCreateCube = strCreateCube & "LEVEL [Quarter]  TYPE QUARTER,"
        strCreateCube = strCreateCube & "LEVEL [Month]  TYPE MONTH,"
        strCreateCube = strCreateCube & "LEVEL [Week]  TYPE WEEK,"
        strCreateCube = strCreateCube & "LEVEL [Day]  TYPE DAY,"
    strCreateCube = strCreateCube & "HIERARCHY [Formula],"
        strCreateCube = strCreateCube & _
            "LEVEL [All Formula Time]  TYPE ALL,"
        strCreateCube = strCreateCube & "LEVEL [Year]  TYPE YEAR,"
        strCreateCube = strCreateCube & "LEVEL [Quarter]  TYPE QUARTER,"
        strCreateCube = strCreateCube & _
            "LEVEL [Month]  TYPE MONTH OPTIONS (SORTBYKEY) ,"
strCreateCube = strCreateCube & "DIMENSION [Warehouse],"
        strCreateCube = strCreateCube & _
            "LEVEL [All Warehouses]  TYPE ALL,"
        strCreateCube = strCreateCube & "LEVEL [Country] ,"
        strCreateCube = strCreateCube & "LEVEL [State Province] ,"
        strCreateCube = strCreateCube & "LEVEL [City] ,"
        strCreateCube = strCreateCube & "LEVEL [Warehouse Name] ,"
strCreateCube = strCreateCube & "MEASURE [Store Invoice] "
    strCreateCube = strCreateCube & "Function Sum "
    strCreateCube = strCreateCube & "Format '#.#',"
strCreateCube = strCreateCube & "MEASURE [Supply Time] "
    strCreateCube = strCreateCube & "Function Sum "
    strCreateCube = strCreateCube & "Format '#.#',"
strCreateCube = strCreateCube & "MEASURE [Warehouse Cost] "
    strCreateCube = strCreateCube & "Function Sum "
    strCreateCube = strCreateCube & "Format '#.#',"
strCreateCube = strCreateCube & "MEASURE [Warehouse Sales] "
    strCreateCube = strCreateCube & "Function Sum "
    strCreateCube = strCreateCube & "Format '#.#',"
strCreateCube = strCreateCube & "MEASURE [Units Shipped] "
    strCreateCube = strCreateCube & "Function Sum "
    strCreateCube = strCreateCube & "Format '#.#',"
strCreateCube = strCreateCube & "MEASURE [Units Ordered] "
    strCreateCube = strCreateCube & "Function Sum "
    strCreateCube = strCreateCube & "Format '#.#')"
'*-----------------------------------------------------------------------
'* INSERT INTO hinzufügen. Damit wird definiert, woher die Daten stammen
'* und wie sie der bereits definierten Cubestruktur zugeordnet werden.
'* Beachten Sie, dass die SELECT-Klausel möglicherweise einfach an die
'* relationale Datenbank weitergegeben wird. Daher kann beispielsweise
'* eine gespeicherte Prozedur als Eingabeparameter übergeben werden.
'* Falls notwendig, könnte all dieses in Anführungszeichen gesetzt
'* werden. Beachten Sie auch, dass die Spalten in der SELECT-Klausel
'* eine beliebige Reihenfolge besitzen können. Es genügt, die
'* Reihenfolge der Liste von Ebenen- und Measurenamen so anzupassen,
'* dass sie der Reihenfolge bei SELECT entspricht.
'*-----------------------------------------------------------------------
strInsertInto = strInsertInto &
    "INSERTINTO=INSERT INTO Sample( " & _
        "Product.[Product Family], Product.[Product Department],"
strInsertInto = strInsertInto &
    "Product.[Product Category], Product.[Product Subcategory],"
strInsertInto = strInsertInto &
    "Product.[Brand Name], Product.[Product Name],"
strInsertInto = strInsertInto &
    "Store.[Store Country], Store.[Store State], Store.[Store City],"
strInsertInto = strInsertInto &
    "Store.[Store Name], [Store Type].[Store Type], [Time].[Column],"
strInsertInto = strInsertInto &
    "[Time].Formula.Year, [Time].Formula.Quarter, " & _
        "[Time].Formula.Month.[Key],"
strInsertInto = strInsertInto &
    "[Time].Formula.Month.Name, Warehouse.Country, " & _
        "Warehouse.[State Province],"
strInsertInto = strInsertInto &
    "Warehouse.City, Warehouse.[Warehouse Name], " * _
        "Measures.[Store Invoice],"
strInsertInto = strInsertInto &
    "Measures.[Supply Time], Measures.[Warehouse Cost], " & _
        "Measures.[Warehouse Sales],"
strInsertInto = strInsertInto &
    "Measures.[Units Shipped], Measures.[Units Ordered] )"
'*-----------------------------------------------------------------------
'* Falls nötig, Optionen zu INSERT INTO hinzufügen. Damit kann gesteuert
'* werden, ob die SELECT-Klausel analysiert oder nur weitergegeben wird
'* und ob der Speichermodus MOLAP oder ROLAP (DEFER_DATA) ist.
'* strInsertInto = strInsertInto & " OPTIONS ATTEMPT_ANALYSIS"
'*-----------------------------------------------------------------------

'*-----------------------------------------------------------------------
'* Die SELECT-Klausel für die INSERT INTO-Anweisung hinzufügen. Beachten
'* Sie, dass diese lediglich durch Verkettung ans Ende der INSERT INTO-
'* Anweisung angehängt wird. OLAP Services gibt sie an die Quelldatenbank
'* weiter, wenn sie nicht analysiert werden kann. Beachten Sie, dass OLAP
'* Services die SELECT-Klausel nur analysieren kann, wenn jede Spalte
'* durch den Tabellennamen qualifiziert ist.
'*-----------------------------------------------------------------------

strInsertInto = strInsertInto &
    "SELECT product_class.product_family AS Col1,"
strInsertInto = strInsertInto &
    "product_class.product_department AS Col2,"
strInsertInto = strInsertInto & "product_class.product_category AS Col3,"
strInsertInto = strInsertInto &
    "product_class.product_subcategory AS Col4,"
strInsertInto = strInsertInto & "product.brand_name AS Col5,"
strInsertInto = strInsertInto & "product.product_name AS Col6,"
strInsertInto = strInsertInto & "store.store_country AS Col7,"
strInsertInto = strInsertInto & "store.store_state AS Col8,"
strInsertInto = strInsertInto & "store.store_city AS Col9,"
strInsertInto = strInsertInto & "store.store_name AS Col10,"
strInsertInto = strInsertInto & "store.store_type AS Col11,"
strInsertInto = strInsertInto & "time_by_day.the_date AS Col12,"
strInsertInto = strInsertInto & "time_by_day.the_year AS Col13,"
strInsertInto = strInsertInto & "time_by_day.quarter AS Col14,"
strInsertInto = strInsertInto & "time_by_day.month_of_year AS Col15,"
strInsertInto = strInsertInto & "time_by_day.the_month AS Col16,"
strInsertInto = strInsertInto & "warehouse.warehouse_country AS Col17,"
strInsertInto = strInsertInto &
    "warehouse.warehouse_state_province AS Col18,"
strInsertInto = strInsertInto & "warehouse.warehouse_city AS Col19,"
strInsertInto = strInsertInto & "warehouse.warehouse_name AS Col20,"
strInsertInto = strInsertInto &
    "inventory_fact_1997.store_invoice AS Col21,"
strInsertInto = strInsertInto &
    "inventory_fact_1997.supply_time AS Col22,"
strInsertInto = strInsertInto &
    "inventory_fact_1997.warehouse_cost AS Col23,"
strInsertInto = strInsertInto &
    "inventory_fact_1997.warehouse_sales AS Col24,"
strInsertInto = strInsertInto &
    "inventory_fact_1997.units_shipped AS Col25,"
strInsertInto = strInsertInto &
    "inventory_fact_1997.units_ordered AS Col26 "
strInsertInto = strInsertInto &
    "From [inventory_fact_1997], [product], [product_class], " &_
        "[time_by_day], [store], [warehouse] "
strInsertInto = strInsertInto &
    "Where [inventory_fact_1997].[product_id] = [product]." &_
        "[product_id] And "
strInsertInto = strInsertInto &
    "[product].[product_class_id] = [product_class]." &_
        "[product_class_id] And "
strInsertInto = strInsertInto &
    "[inventory_fact_1997].[time_id] = [time_by_day].[time_id] And "
strInsertInto = strInsertInto &
    "[inventory_fact_1997].[store_id] = [store].[store_id] And "
strInsertInto = strInsertInto &
    "[inventory_fact_1997].[warehouse_id] = [warehouse].[warehouse_id]"

'*-----------------------------------------------------------------------
'* Den Cube erstellen, indem die Verbindungszeichenfolge an Open
'* übergeben wird.
'*-----------------------------------------------------------------------

Set cn = New ADODB.Connection
s = strProvider & ";" & strDataSource & ";" & strSourceDSN & ";" & _
    strCreateCube & ";" & strInsertInto & ";"
Screen.MousePointer = vbHourglass
cn.Open s

'*-----------------------------------------------------------------------
'* Die Cubedatei wird auf die Festplatte geschrieben. Ein Word-Dokument
'* kann erstellt werden, indem Word durch Visual Basic gesteuert wird.
'*-----------------------------------------------------------------------

Dim cat As New ADOMD.Catalog
Dim cdf As ADOMD.CubeDef
Dim di As Integer
Dim hi As Integer
Dim le As Integer
Dim mem As Integer
Dim docWord As Word.Document
Dim rngCurrent As Word.Range
Dim SenCount As Integer
Dim strServer As String
Dim strSource As String
Dim strCubeName As String

'*-----------------------------------------------------------------------
'* Die Verbindung zur Cubedatei wird hergestellt
'*-----------------------------------------------------------------------
cat.ActiveConnection = "DATA SOURCE=c:\DocumentCube.cub;Provider=msolap;"

'*-----------------------------------------------------------------------
'* Die Cubedefinition wird auf den Namen des Cubes in der Cubedatei
'* festgelegt
'*-----------------------------------------------------------------------
Set cdf = cat.CubeDefs("Sample")

'*-----------------------------------------------------------------------
'* Ein Objekt wird erstellt, das Daten von Word 8.0 aufnehmen kann
'*-----------------------------------------------------------------------
Set appword = CreateObject("Word.Application.8")

'*-----------------------------------------------------------------------
'* Die Dokumentvariable wird erstellt
'*-----------------------------------------------------------------------
   Set docWord = appword.Documents.Add()

   Set rngCurrent = docWord.Content

   SenCount = 0

'*-----------------------------------------------------------------------
'* Titel und Kopfzeile des Cubes werden in das Dokument geschrieben
'*-----------------------------------------------------------------------
   With rngCurrent
       .InsertAfter "Report for Sample Cube"
       .InsertAfter vbCrLf
       SenCount = SenCount + 1
       docWord.Paragraphs(SenCount).Range.Bold = True
       docWord.Paragraphs(SenCount).Range.Underline = wdUnderlineSingle
       docWord.Paragraphs(SenCount).Range.Italic = False
       docWord.Paragraphs(SenCount).Range.Font.Size = 18

'*-----------------------------------------------------------------------
'* Eigenschaften des Cubes werden in das Dokument geschrieben
'*-----------------------------------------------------------------------
For i = 0 To cdf.Properties.Count - 1
    .InsertAfter "(" & i & ") " & cdf.Properties(i).Name & ": " & _
        cdf.Properties(i).Value
    .InsertAfter vbCrLf
    SenCount = SenCount + 1
    docWord.Paragraphs(SenCount).Range.Bold = False
    docWord.Paragraphs(SenCount).Range.Italic = True
    docWord.Paragraphs(SenCount).Range.Font.Size = 8
Next i

'*-----------------------------------------------------------------------
'*  Dimensionsname(n) werden in das Dokument geschrieben
'*-----------------------------------------------------------------------
    For di = 0 To cdf.Dimensions.Count - 1
    .InsertAfter "Dimension: " & cdf.Dimensions(di).Name
    .InsertAfter vbCrLf
    SenCount = SenCount + 1
    docWord.Paragraphs(SenCount).Range.Bold = True
    docWord.Paragraphs(SenCount).Range.Italic = False
    docWord.Paragraphs(SenCount).Range.Font.Size = 14

'*-----------------------------------------------------------------------
'* Die Dimensionseigenschaften werden in das Dokument geschrieben
'*-----------------------------------------------------------------------
    For i = 0 To cdf.Dimensions(di).Properties.Count - 1
        .InsertAfter "(" & i & ") " & _
            cdf.Dimensions(di).Properties(i).Name & ": " & _
            cdf.Dimensions(di).Properties(i).Value
        .InsertAfter vbCrLf
        SenCount = SenCount + 1
        docWord.Paragraphs(SenCount).Range.Bold = False
        docWord.Paragraphs(SenCount).Range.Italic = True
        docWord.Paragraphs(SenCount).Range.Font.Size = 8
    Next i

'*-----------------------------------------------------------------------
'*  Hierarchiename(n) werden in das Dokument geschrieben
'*-----------------------------------------------------------------------
    For hi = 0 To cdf.Dimensions(di).Hierarchies.Count - 1
        .InsertAfter vbTab & "Hierarchy: " & _
            cdf.Dimensions(di).Hierarchies(hi).Name
        .InsertAfter vbCrLf
        SenCount = SenCount + 1
        docWord.Paragraphs(SenCount).Range.Bold = True
        docWord.Paragraphs(SenCount).Range.Italic = False
        docWord.Paragraphs(SenCount).Range.Font.Size = 12

'*-----------------------------------------------------------------------
'* Hierarchieeigenschaften werden in das Dokument geschrieben
'*-----------------------------------------------------------------------
    For i = 0 To cdf.Dimensions(di).Hierarchies(hi).Properties.Count - 1
        .InsertAfter vbTab & "(" & i & ") " & _
            cdf.Dimensions(di).Hierarchies(hi).Properties(i).Name & _
            ": " & cdf.Dimensions(di).Hierarchies(hi).Properties(i).Value
        .InsertAfter vbCrLf
        SenCount = SenCount + 1
        docWord.Paragraphs(SenCount).Range.Bold = False
        docWord.Paragraphs(SenCount).Range.Italic = True
        docWord.Paragraphs(SenCount).Range.Font.Size = 8
    Next i

'*-----------------------------------------------------------------------
'*  Ebenenname(n) werden in das Dokument geschrieben
'*-----------------------------------------------------------------------
    For le = 0 To cdf.Dimensions(di).Hierarchies(hi).Levels.Count - 1
        .InsertAfter vbTab & vbTab & "Level: " & _
            cdf.Dimensions(di).Hierarchies(hi).Levels(le).Name & _
            " with a Member Count of: " & _
            cdf.Dimensions(di).Hierarchies(hi).Levels(le).Members.Count
        .InsertAfter vbCrLf
        SenCount = SenCount + 1
        docWord.Paragraphs(SenCount).Range.Bold = True
        docWord.Paragraphs(SenCount).Range.Italic = False
        docWord.Paragraphs(SenCount).Range.Font.Size = 10

'*-----------------------------------------------------------------------
'* Ebeneneigenschaften werden in das Dokument geschrieben
'*-----------------------------------------------------------------------
    For i = 0 To
       cdf.Dimensions(di).Hierarchies(hi).Levels(le).Properties.Count - 1
        .InsertAfter vbTab & vbTab & "(" & i & ") " & _
             cdf.Dimensions(di).Hierarchies(hi).Levels(le)._
                 Properties(i).Name & ": " & _
             cdf.Dimensions(di).Hierarchies(hi).Levels(le)._
                 Properties(i).Value
        .InsertAfter vbCrLf
        SenCount = SenCount + 1
        docWord.Paragraphs(SenCount).Range.Bold = False
        docWord.Paragraphs(SenCount).Range.Italic = True
        docWord.Paragraphs(SenCount).Range.Font.Size = 8
    Next i

    Next le
    Next hi
    Next di

'*-----------------------------------------------------------------------
'* Für das Word-Dokument wird Visible festgelegt
'*-----------------------------------------------------------------------
        appword.Visible = True
    End With
   Screen.MousePointer = vbDefault

'*-----------------------------------------------------------------------
'* Für das Word-Objekt wird Nothing festgelegt, um die OLE-Verbindung zu
'* beenden
'*-----------------------------------------------------------------------
   Set appword = Nothing
Exit Sub

Error_cmdCreateDocForCube_Click:
    Screen.MousePointer = vbDefault
    MsgBox Err.Description
End Sub


ADO MD-Codebeispiele in Visual Basic, Scripting Edition

Für folgende Beispiele ist Microsoft Active Server Pages (ASP) für Microsoft Internet Information Server, Version 4.0, erforderlich.

Anmerkung Fügen Sie das gesamte Codebeispiel von Anfang bis Ende in den Code-Editor ein. Wenn nur Teile der Beispiele verwendet werden oder die Absatzformatierung verloren geht, wird das Beispiel möglicherweise nicht ordnungsgemäß ausgeführt.

  • Axis-Beispiel

  • Members-Beispiel

  • CubeDef-Beispiel


Axis-Beispiel (VBScript)

Diese Active Server Page zeigt OLAP-Daten aus einer MDX-Abfragezeichenfolge an und schreibt das resultierende Cellset in eine HTML-Tabellenstruktur.

<%@ Language=VBScript %>
<%
'************************************************************************
'*** Active Server Pages zeigt OLAP-Daten aus der standardmäßigen
'*** MDX-Verbindungszeichenfolge an und schreibt das resultierende
'*** Cellset in eine HTML-Tabellenstruktur.
'************************************************************************
Response.Buffer=True
Response.Expires=0
%>
<HTML>
<HEAD>
<META NAME="GENERATOR" Content="Microsoft Visual Studio 6.0">
</HEAD>
<BODY bgcolor=Ivory>
<FONT FACE=Verdana>

<%

Dim cat,cst,i,j,strSource,csw,intDC0,intDC1,intPC0,intPC1

'************************************************************************
'*** Connection-Objekte für den multidimensionalen Katalog und das Cellset
'*** festlegen
'************************************************************************
Set cat = Server.CreateObject("ADOMD.Catalog")
Set cst = Server.CreateObject("ADOMD.CellSet")

'************************************************************************
'*** Standardeinstellungen eines bekannten OLAP-Servers als Servername
'*** für die Verbindung verwenden. Das Session-Objekt für den Servernamen '*** auf den Standardwert festlegen.
'************************************************************************
'*** OLAPServerName muss auf einen OLAP-Server festgelegt werden, der
'*** im Netzwerk vorhanden ist
'************************************************************************
    OLAPServerName = "Please set to present OLAP Server"
    cat.ActiveConnection = "Data Source=" & OLAPServerName & _
        ";Initial Catalog=FoodMart;Provider=msolap;"

'************************************************************************
'*** Standardmäßige MDX-Abfragezeichenfolge einer bekannten Abfrage
'*** verwenden, die mit dem Standardserver korrekt arbeitet. MDXQuery
'*** für das Session-Objekt auf den Standardwert festlegen.
'************************************************************************
    strSource = strSource & "SELECT "
    strSource = strSource & "{[Measures].members} ON COLUMNS,"
    strSource = strSource & _
        "NON EMPTY [Store].[Store City].members ON ROWS"
    strSource = strSource & " FROM Sales"

'************************************************************************
'*** Die Source-Eigenschaft des Cellsets auf strSource festlegen, damit
'*** sie an die Open-Methode des Cellsets übergeben werden kann
'************************************************************************
    cst.Source = strSource

'************************************************************************
'*** ActiveConnection für das Cellset so festlegen, dass ActiveConnection
'*** des aktiven Katalogs verwendet wird
'************************************************************************
Set cst.ActiveConnection = cat.ActiveConnection

'************************************************************************
'*** Das Cellset mithilfe der Open-Methode öffnen
'************************************************************************
cst.Open

'************************************************************************
'*** intDC0 und intDC1 für beide Achsen auf Dimensionszähler minus 1
'*** festlegen. intPC0 und intPC1 für beide Achsen auf Positionszähler
'*** minus 1 festlegen.
'************************************************************************
intDC0 = cst.Axes(0).DimensionCount-1
intDC1 = cst.Axes(1).DimensionCount-1

intPC0 = cst.Axes(0).Positions.Count - 1
intPC1 = cst.Axes(1).Positions.Count - 1

'************************************************************************
'*** HTML-Tabellenstruktur erstellen, die das von der MDX-Abfrage
'*** zurückgegebene Recordset enthalten soll '************************************************************************
        Response.Write "<Table width=100% border=1>"

'************************************************************************
'*** Diese Schleife erstellt Spaltenheader
'************************************************************************
        For h=0 to intDC0
            Response.Write "<TR>"

'************************************************************************
'*** Diese Schleife erstellt Leerraum vor den Spaltenheadern, um sie
'*** passend zum Zeilenheader auszurichten
'************************************************************************
            For c=0 to intDC1
                Response.Write "<TD></TD>"
            Next

'************************************************************************
'*** Durchlaufen von Axes(0).Positions, um Elementbeschriftungen in den
'*** Tabellenheader zu schreiben.
'************************************************************************
            For i = 0 To intPC0
                Response.Write "<TH>"
                Response.Write "<FONT size=-2>"
                Response.Write cst.Axes(0).Positions(i).Members(h).Caption
                Response.Write "</FONT>"
                Response.Write "</TH>"
            Next
            Response.Write "</TR>"
        Next
'************************************************************************
'*** Verwenden von Array-Werten zum Formatieren des Zeilenheaders, um
'*** Leerraum vorn unter den Zeilenheadertiteln bereitzustellen.
'************************************************************************
        For j = 0 To intPC1
            Response.Write "<TR>"
            For h=0 to intDC1
                Response.Write "<TD><B>"
                Response.Write "<FONT size=-2>"
                Response.Write cst.Axes(1).Positions(j).Members(h).Caption
                Response.Write "</FONT>"
                Response.Write "</B></TD>"
            Next
            For k = 0 To intPC0
                Response.Write "<TD align=right bgcolor="
                Response.Write csw
                Response.Write ">"
                Response.Write "<FONT size=-2>"
                Response.Write cst(k, j).FormattedValue
                Response.Write "</FONT>"
                Response.Write "</TD>"
            Next
            Response.Write "</TR>"
        Next
        Response.Write "</Table>"

%>
</FONT>
</BODY>
</HTML>


Members-Beispiel (VBScript)

In diesem Beispiel wird eine MDX-Abfragezeichenfolge verwendet, um OLAP-Daten abzurufen, und das resultierende Cellset wird mithilfe spaltenübergreifender Features für multidimensionale Cellsets in eine HTML-Tabellenstruktur geschrieben.

<%@ Language=VBScript %>
<%
'************************************************************************
'*** Active Server Pages zeigt OLAP-Daten aus der standardmäßigen oder
'*** bereitgestellten MDX-Verbindungszeichenfolge an und schreibt das
'*** resultierende Cellset in eine HTML-Tabellenstruktur. Diese ASP-
'*** Seite stellt ColSpan-Features für multidimensionale Cellsets bereit.
'************************************************************************
Response.Buffer=True
Response.Expires=0
%>
<html>
<head>
<meta NAME="GENERATOR" Content="Microsoft Visual Studio 6.0">
</head>
<body bgcolor="Ivory">
<font FACE="Verdana">

<%

Dim cat,cst,i,j,strSource,csw,LevelValue,intDC0,intDC1,intPC0, intPC1
'************************************************************************
'*** Servername und MDX-Verbindungszeichenfolge aus dem Textfeld und dem
'*** Textbereich zusammenstellen und den gleichnamigen Session-Objekten
'*** zuweisen
'************************************************************************
Session("ServerName")=Request.Form("strServerName")
Session("InitialCatalog")=Request.Form("strInitialCatalog")
Session("MDXQuery")=Request.Form("MDXQuery")

'************************************************************************
'*** Connection-Objekte für den multidimensionalen Katalog und das Cellset
'*** festlegen
'************************************************************************
Set cat = Server.CreateObject("ADOMD.Catalog")
Set cst = Server.CreateObject("ADOMD.CellSet")

'************************************************************************
'*** Prüfen, ob der Servername für das Session-Objekt vorhanden ist.
'*** Falls ja: ActiveConnection mithilfe des Servernamens und mit
'*** MSOLAP als Verbindungsprovider erstellen.
'*** Falls nein: Standardeinstellungen eines bekannten OLAP-Servers
'*** als Servernamen für die Verbindung verwenden. Den Servernamen für
'*** das Session-Objekt auf den Standardwert festlegen.
'************************************************************************
If Len(Session("ServerName")) > 0 Then
    cat.ActiveConnection = "Data Source=" & Session("ServerName") & _
        ";Initial Catalog=" & Session("InitialCatalog") & _
        ";Provider=msolap;"
Else

'************************************************************************
'*** OLAPServerName muss auf einen OLAP-Server festgelegt werde, der
'*** im Netzwerk vorhanden ist
'************************************************************************
    OLAPServerName = "Please set to present OLAP Server"
    cat.ActiveConnection = "Data Source=" & OLAPServerName & _
        ";Initial Catalog=FoodMart;Provider=msolap;"
    Session("ServerName") = OLAPServerName
    Session("InitialCatalog") = "FoodMart"
End if
'************************************************************************
'*** Prüfen, ob MDXQuery für das Session-Objekt vorhanden ist.
'*** Falls ja: strSource mithilfe von MDXQuery für das Session-Objekt
'*** festlegen.
'*** Falls nein: Standardmäßige MDX-Abfragezeichenfolge einer bekannten
'*** Abfrage verwenden, die mit dem Standardserver korrekt arbeitet.
'*** MDXQuery für das Session-Object auf den Standardwert festlegen.
'************************************************************************
If Len(Session("MDXQuery")) < 5 Then
    strSource = strSource & "SELECT "
    strSource = strSource & "CROSSJOIN({[Store].[Store Country].MEMBERS},"
    strSource = strSource & "{[Measures].[Store " & _
        "Invoice],[Measures].[Supply Time]}) ON COLUMNS,"
    strSource = strSource & "CROSSJOIN({[Time].[Year].MEMBERS},"
    strSource = strSource & "CROSSJOIN({[Store Type].[Store " & _
        "Type].Members},{[Product].[Product Family].members})) ON ROWS"
    strSource = strSource & " FROM Warehouse"
Else
    strSource = Session("MDXQuery")
End if

'************************************************************************
'*** Die Source-Eigenschaft des Cellsets auf strSource festlegen, um sie
'*** an die Open-Methode des Cellsets weiterzugeben
'************************************************************************
    cst.Source = strSource

'************************************************************************'*** ActiveConnection des Cellsets so festlegen, dass ActiveConnection
'*** des aktuellen Katalogs verwendet wird
'************************************************************************
Set cst.ActiveConnection = cat.ActiveConnection

'************************************************************************
'*** Das Cellset mithilfe der Open-Methode öffnen
'************************************************************************
cst.Open

'************************************************************************
'*** Standard-HTML-Code, der den Servernamen und MDX-Abfrageinformationen
'*** abfragt. Beachten Sie, dass die Bereitstellungsaktion die Daten
'*** derselben Seite wieder zum Verarbeiten bereitstellt, so dass der
'*** Zustand der Session-Variablen verwendet wird, um das Aussehen der
'*** Seite zu verändern.
'************************************************************************
%>
<form action="ASPADOComplex.asp" method="POST" id="form1" name="form1">
<table>
<tr><td align="left">
<b>Olap Server name:</b><br><input type="text" id="strServerName" name="strServerName" value="<%=Session("ServerName")%>" size="20">
<br>
<b>Catalog name:</b><br><input type="text" id="strInitialCatalog" name="strInitialCatalog" value="<%=Session("InitialCatalog")%>" size="20">
</td><td align="center">
<b>MDX Query:</b><br>
<textarea rows="7" cols="70" id="textareaMDX" name="MDXQuery" wrap="soft">
<%=Session("MDXQuery")%>
</textarea>
</td></tr>
</table>
<table>
<tr><td>
<input type="submit" value="Submit MDX Query" id="submit1" name="submit1">
</td><td>
<input type="reset" value="Reset" id="reset1" name="reset1">
</td></tr>
</table>
</form>
<p align="left">
<font color="Black" size="-3">
<%=strSource%>
</font>
</p>
<%
'************************************************************************
'*** intDC0 und intDC1 für beide Achsen auf Dimensionszähler minus 1
'*** festlegen. intPC0 und intPC1 für beide Achsen auf Positionszähler
'*** minus 1 festlegen.
'************************************************************************
intDC0 = cst.Axes(0).DimensionCount-1
intDC1 = cst.Axes(1).DimensionCount-1

intPC0 = cst.Axes(0).Positions.Count - 1
intPC1 = cst.Axes(1).Positions.Count - 1

'************************************************************************
'*** HTML-Tabellenstruktur erstellen, die das von der MDX-Abfrage
'*** zurückgegebene Recordset enthalten soll '************************************************************************
Response.Write "<Table width=100% border=1>"

'************************************************************************
'*** Diese Schleife erstellt Spaltenheader für alle Dimensionen auf der
'*** Grundlage der Anzahl der Dimensionen für Axes(0)
'************************************************************************
For h=0 to intDC0
    Response.Write "<TR>"

'************************************************************************
'*** Diese Schleife erstellt Leerraum vor den Spaltenheadern, um sie
'*** passend zum Zeilenheader auszurichten
'************************************************************************
    For c=0 to intDC1
        Response.Write "<TD></TD>"
    Next

'************************************************************************
'*** Prüfen, ob die aktuelle Dimension gleich der letzten Dimension ist.
'*** Falls ja: Tabellenheadertitel einfach ohne ColSpan-Wert in die
'*** HTML-Ausgabe schreiben.
'*** Falls nein: Tabellenheadertitel mit ColSpan-Wert in die
'*** HTML-Ausgabe schreiben.
'************************************************************************
    If h = intDC0 then

'************************************************************************
'*** Durchlaufen von Axes(0).Positions, um Elementbeschriftungen in den
'*** Tabellenheader zu schreiben.
'************************************************************************
        For i = 0 To intPC0
            Response.Write "<TH>"
            Response.Write "<FONT size=-2>"
            Response.Write cst.Axes(0).Positions(i).Members(h).Caption
            Response.Write "</FONT>"
            Response.Write "</TH>"
        Next
    Else

'************************************************************************
'*** Durchlaufen von Axes(0).Positions, um Elementbeschriftungen in den
'*** Tabellenheader zu schreiben, wobei die Spaltenspanne für doppelte
'*** Elementbeschriftungen beachtet wird.
'************************************************************************
        CaptionCount = 1
        LastCaption = cst.Axes(0).Positions(0).Members(h).Caption
        Response.Write "<TH"
        For t=1 to intPC0

'************************************************************************
'*** Prüfen, ob die aktuelle Elementbeschriftung gleich LastCaption ist.
'*** Falls ja: 1 zu CaptionCount addieren, um den Colspan-Wert zu erhöhen
'*** Falls nein: Tabellenheadertitel mit ColSpan-Werten in die HTML-
'*** Ausgabe schreiben und dabei die aktuellen Werte von CaptionCount für
'*** Colspan und von LastCaption für die Headerzeichenfolge verwenden
'************************************************************************
            If LastCaption = _
                cst.Axes(0).Positions(t).Members(h).Caption then
                CaptionCount = CaptionCount+1

'************************************************************************
'*** Prüfen, ob die letzte Position erreicht wurde.
'*** Falls ja: HTML-Code zum Beenden der Tabellenzeile schreiben, der
'*** die aktuellen Werte von CaptionCount and LastCaption verwendet.
'************************************************************************
                If t = intPC0 then
                    Response.Write " colspan=" & CaptionCount & _
                        "><FONT size=-2>" & LastCaption & "</FONT></TH>"
                End if

            Else
                Response.Write " colspan=" & CaptionCount & _
                    "><FONT size=-2>" & LastCaption & "</FONT></TH><TH"
                CaptionCount = 1
                LastCaption=cst.Axes(0).Positions(t).Members(h).Caption
            End if
        Next
            End if
            Response.Write "</TR>"
        Next

'************************************************************************
'*** Durchlaufen von Axes(1).Positions, um zunächst Elementbeschriftungen
'*** in Tabellenzeilenheader und dann Cellset-Daten in die
'*** Tabellenstruktur zu schreiben
'************************************************************************
        Dim aryRows()
        Dim intArray,Marker
        intArray=0

'************************************************************************
'*** Festlegen des Array-Wertes für die Zeilenheaderformatierung
'************************************************************************
        For a=1 To intDC1
            intArray = intArray+(intPC1+1)
        Next
        intArray = intArray-1
        ReDim aryRows(intArray)
        Marker=0

'************************************************************************
'*** Verwenden von Array-Werten zum Formatieren des Zeilenheaders, um
'*** Leerraum vorn unter den Zeilenheadertiteln bereitzustellen
'************************************************************************
        For j = 0 To intPC1
            Response.Write "<TR>"
            For h=0 to intDC1
                If h=intDC1 then
                    Response.Write "<TD><B>"
                    Response.Write "<FONT size=-2>"
                    Response.Write cst.Axes(1).Positions(j).Members(h).Caption
                    Response.Write "</FONT>"
                    Response.Write "</B></TD>"
                Else
                    aryRows(Marker) = _
                        cst.Axes(1).Positions(j).Members(h).Caption
                    If Marker < intDC1 then
                        Response.Write "<TD><B>"
                        Response.Write "<FONT size=-2>"
                        Response.Write _
                            cst.Axes(1).Positions(j).Members(h).Caption
                        Response.Write "</FONT>"
                        Response.Write "</B></TD>"
                        Marker = Marker + 1
                    Else
                        If aryRows(Marker) = aryRows(Marker - intDC1) then
                            Response.Write "<TD>&nbsp;</TD>"
                            Marker = Marker + 1
                        Else
                            Response.Write "<TD><B>"
                            Response.Write "<FONT size=-2>"
                            Response.Write _
                                cst.Axes(1).Positions(j).Members(h).Caption
                            Response.Write "</FONT>"
                            Response.Write "</B></TD>"
                            Marker = Marker + 1
                        End if
                    End if
                End if
            Next

'************************************************************************
'*** Verändern der Zellhintergrundfarbe
'************************************************************************
            If (j+1) Mod 2 = 0 Then
                csw = "#cccccc"
            Else
                csw = "#ccffff"
            End If
            For k = 0 To intPC0
                Response.Write "<TD align=right bgcolor="
                Response.Write csw
                Response.Write ">"
                Response.Write "<FONT size=-2>"

'************************************************************************
'*** Die FormattedValue-Eigenschaft positioniert Daten
'************************************************************************
                Response.Write cst(k, j).FormattedValue
                Response.Write "</FONT>"
                Response.Write "</TD>"
            Next
            Response.Write "</TR>"
        Next
        Response.Write "</Table>"

%>
</font>
</body>
</html>


CubeDef-Beispiel (VBScript)

In diesem Beispiel werden Metadaten eines Cubes auf einer Webseite angezeigt.

<%@ Language=VBScript %>
<%
Response.Buffer=True
'Response.Expires=0
%>
<html>
<head>
<meta NAME="GENERATOR" Content="Microsoft Visual Studio 6.0">
</head>
<body>

<%
Server.ScriptTimeout=360
Dim cat,cdf,di,hi,le,mem,strServer,strSource,strCubeName

'************************************************************************
'*** Session-Variablen festlegen
'************************************************************************
Session("CubeName") = Request.Form("strCubeName")
Session("CatalogName") = Request.Form("strCatalogName")
Session("ServerName") = Request.Form("strServerName")
Session("chkDim") = Request.Form("chkDimension")
Session("chkHier") =  Request.Form("chkHierarchy")
Session("chkLev") =  Request.Form("chkLevel")

'************************************************************************
'*** Catalog-Objekt erstellen
'************************************************************************
Set cat = Server.CreateObject("ADOMD.Catalog")

If Len(Session("ServerName")) > 0 Then
    cat.ActiveConnection = "Data Source=" & Session("ServerName") & ";Initial Catalog=" & Session("CatalogName") & ";Provider=msolap;"
Else
'************************************************************************
'*** OLAPServerName muss auf einen OLAP-Server festgelegt werden, der
'*** im Netzwerk vorhanden ist
'************************************************************************
OLAPServerName = "Please set to present OLAP Server"
    cat.ActiveConnection = "Data Source=" & OLAPServerName & _
        ";Initial Catalog=FoodMart;Provider=msolap;"
    Session("ServerName") = OLAPServerName
    Session("InitialCatalog") = "FoodMart"
End if

If Len(Session("CubeName")) > 0 Then
    Set cdf = cat.CubeDefs(Session("CubeName"))
Else
    Set cdf = cat.CubeDefs("Sales")
    Session("CubeName")="Sales"
End if

'************************************************************************
'*** Daten im HTML-Formular sammeln
'************************************************************************
%>
<form action="ASPADOCubeDoc.asp" method="post" id="form1" name="form1">
<table>
    <tr>
        <td>
        <b>Olap Server name:  </b><br><input type="text" id="strServerName" name="strServerName" value="<%=Session("ServerName")%>" size="20"><br>

        <b>Catalog Name:  </b><br><input type="text" id="strCatalogName" name="strCatalogName" value="<%=Session("CatalogName")%>" size="20"><br>

        <b>Cube Name:  </b><br><input type="text" id="strCubeName" name="strCubeName" value="<%=Session("CubeName")%>" size="20">
        </td>
        <td <TD>
            <b>Add Property Detail:  </b><br>
            Dimension Detail: <input type="checkbox" id="chkDimension" name="chkDimension"><br>

            Hierarchy Detail: <input type="checkbox" id="chkHierarchy" name="chkHierarchy"><br>

            Level Detail: <input type="checkbox" id="chkLevel" name="chkLevel">
        </td>
    </tr>
</table>
<input type="submit" value="Cube Information" id="submit1" name="submit1"><input type="reset" value="Reset" id="reset1" name="reset1">
</form>
<%

'************************************************************************
'*** Beginn des Berichts
'************************************************************************
Response.Write "<H3>Report for " & Session("CubeName") & " Cube</H3>"
Response.Write "<OL TYPE='i'>"

'************************************************************************
'*** Eigenschaften des Cubes anzeigen
'************************************************************************
                For i = 0 To cdf.Properties.Count - 1
                    Response.Write "<LI>"
                    Response.Write "<FONT size=-2>" & cdf.Properties(i).Name & ": " & cdf.Properties(i).Value & "</FONT>"
                Next
                Response.Write "</OL>"
                Response.Write "<UL TYPE='SQUARE'>"
 '************************************************************************
'*** Schleife, die den Namen und die Eigenschaften von Dimensionen
'*** anzeigt, wenn das Kontrollkästchen aktiviert ist
'************************************************************************
        For di = 0 To cdf.Dimensions.Count - 1
            Response.Write "<LI>"
            Response.Write "<FONT size=4><B>Dimension: " & _
                cdf.Dimensions(di).Name & "</B></FONT>"
            If Request.Form("chkDimension") = "on" Then
                Response.Write "<OL TYPE='1'>"
                For i = 0 To cdf.Dimensions(di).Properties.Count - 1
                    Response.Write "<LI>"
                    Response.Write "<FONT size=-2>" & _
                        cdf.Dimensions(di).Properties(i).Name & ": " & _
                        cdf.Dimensions(di).Properties(i).Value & "</FONT>"
                Next
                Response.Write "</OL>"
            End If
            Response.Write "<UL TYPE= 'Circle'>"
'************************************************************************
'*** Schleife, die den Namen und die Eigenschaften von Hierarchien
'*** anzeigt, wenn das Kontrollkästchen aktiviert ist
'************************************************************************
            For hi = 0 To cdf.Dimensions(di).Hierarchies.Count - 1
                Response.Write "<LI>"
                Response.Write "<FONT size=3><B>Hierarchy: " & _
                    cdf.Dimensions(di).Hierarchies(hi).Name & "</B></FONT>"
                If Request.Form("chkHierarchy") = "on" Then
                    Response.Write "<OL TYPE='1'>"
                    For i = 0 To _
                        cdf.Dimensions(di).Hierarchies(hi).Properties.Count - 1
                        Response.Write "<LI>"
                        Response.Write "<FONT size=-2>" & _
                            cdf.Dimensions(di).Hierarchies(hi).Properties(i)._
                            Name & ": " & _
                            cdf.Dimensions(di).Hierarchies(hi).Properties(i)._
                            Value & "</FONT>"
                    Next
                    Response.Write "</OL>"
                End If
                Response.Write "<UL TYPE='Disc'>"
'************************************************************************
'*** Schleife, die den Namen und die Eigenschaften von Ebenen
'*** anzeigt, wenn das Kontrollkästchen aktiviert ist
'************************************************************************
        For le = 0 To cdf.Dimensions(di).Hierarchies(hi).Levels.Count - 1
                    Response.Write "<LI>"
                    Response.Write "<FONT size=2><B>Level: " & _
                        cdf.Dimensions(di).Hierarchies(hi).Levels(le).Name & _
                        " with a Member Count of: " & _
                        cdf.Dimensions(di).Hierarchies(hi).Levels(le)._
                        Properties("LEVEL_CARDINALITY") & "</B></FONT>"
                    If Request.Form("chkLevel") = "on" Then
                        Response.Write "<OL TYPE='1'>"
                        For i = 0 To
                            cdf.Dimensions(di).Hierarchies(hi).Levels(le)._
                            Properties.Count - 1
                            Response.Write "<LI>"
                            Response.Write "<FONT size=-2>" & _
                                cdf.Dimensions(di).Hierarchies(hi).Levels(le)._
                                Properties(i).Name & ": " & _
                                cdf.Dimensions(di).Hierarchies(hi).Levels(le)._
                                Properties(i).Value & "</FONT>"
                        Next
                        Response.Write "</OL>"
                    End If
                Next
                Response.Write "</UL>"
            Next
            Response.Write "</UL>"
        Next
        Response.Write "</UL>"
%>
</body>
</html>


Absoluter URL <Definition>

Absoluter URL

Ein vollqualifizierter URL, der die Position einer Ressource angibt, die sich im Internet oder in einem Intranet befindet. Siehe auch URL und relativer URL.


ActiveX-Steuerelement <Definition>

ActiveX-Steuerelement

Selbstregistrierende prozessinterne COM-Komponente, die häufig (entweder zur Entwurfs- oder Laufzeit) über ein visuelles Element verfügt. ActiveX-Steuerelemente können auch mit einem Active Document-Container, wie z. B. Microsoft Internet Explorer, kommunizieren.


ADISAPI (Advanced Data Internet Server Application Programming Interface) <Definition>

ADISAPI (Advanced Data Internet Server Application Programming Interface)

Eine ISAPI-DLL, die Analyse, Automatisierungssteuerung, Recordset-Marshalling sowie MIME-Packaging bietet. Die ADISAPI-Komponente arbeitet über die API, die von Internet-Informationsdienste (IIS) bereitgestellt wird. Siehe auch ISAPI.


Aggregatfunktion <Definition>

Aggregatfunktion

In einer Abfrage ist dies eine Funktion, wie z. B. COUNT, AVG oder STDEV, die unter Verwendung aller Zeilen einer Tabellenspalte einen Wert errechnet. Beim Schreiben von Ausdrücken sowie beim Programmieren können Sie SQL-Aggregatfunktionen (einschließlich der drei oben genannten) und Domänenaggregatfunktionen verwenden, um verschiedene Statistiken festzulegen.


Alias <Definition>

Alias

Ein alternativer Name, den Sie einer Spalte oder einem Ausdruck in einer SELECT-Anweisung von SQL geben. Dieser Name ist meist kürzer und aussagekräftiger. Beispielsweise ist RobertsVerkauf der Alias in der nachstehenden SELECT-Anweisung: "Select wr-Verkauf as RobertsVerkauf from VerkaufDB". Ein Alias kann zur dynamischen Zuweisung von Spalten verwendet werden, um Bindungen auf dem DataControl-Objekt zu steuern.


Apartmentthreading <Definition>

Apartmentthreading

Ein COM-Threadingmodell, bei dem alle Aufrufe eines Objekts in einem Thread auftreten. Beim Apartmentthreading synchronisiert und marshallt COM Aufrufe. Siehe auch COM.


Asynchroner Vorgang <Definition>

Asynchroner Vorgang

Ein Vorgang, der das Steuerelement an das aufrufende Programm zurückgibt, ohne bis zum Abschluss des Vorgangs zu warten. Bevor der Vorgang abgeschlossen ist, wird weiterhin der Code ausgeführt. Siehe auch Synchroner Vorgang.


Bindungseintrag <Definition>

Bindungseintrag

Zuordnung zwischen einem Feld in einer Tabelle und einer Variablen. In den Erweiterungen von ADO Visual C++ werden Recordset-Felder C/C++-Variablen zugeordnet.


Bitmaske <Definition>

Bitmaske

Numerischer Wert, der zum bitweisen Wertvergleich mit anderen numerischen Werten dient, meist, um Optionen in Parametern oder Rückgabewerten zu kennzeichnen. In der Regel wird der Vergleich mit bitweisen logischen Operatoren durchgeführt, wie z. B. And und Or in Visual Basic bzw. & und | in C++.

Z. B. können die FieldAttributeEnum-Werte in ADO als Bitmasken verwendet werden, um die Attribute eines Feldes zu bestimmen. Angenommen, Sie möchten ermitteln, ob ein Feld aktualisiert werden konnte. In Visual Basic können Sie dies mit folgendem Ausdruck testen:

Field.Attributes AND adFldUpdatable

Ist das Ergebnis TRUE, kann das Feld aktualisiert werden.


Lesezeichen <Definition>

Lesezeichen

Marker, der eine Zeile in einer Gruppe von Zeilen eindeutig identifiziert, so dass der Benutzer sich rasch an die betreffende Position bewegen kann.


Geschäftsobjekt <Definition>

Geschäftsobjekt

Objekt, das eine definierte Menge von Operationen ausführt, wie z. B. Datenüberprüfung oder Geschäftsregellogik. Geschäftsobjekte befinden sich in der Regel auf der mittleren Ebene.


Geschäftsregel <Definition>

Geschäftsregel

Die Kombination aus Überprüfungen, Anmeldebestätigungen, Suchvorgängen in Datenbanken, Richtlinien und algorithmischen Transformationen, welche die Art der Geschäftsabläufe eines Unternehmens bestimmt. Sie wird auch als Geschäftslogik bezeichnet.


Berechneter Ausdruck <Definition>

Berechneter Ausdruck

Ausdruck, der nicht konstant ist, dessen Wert jedoch von anderen Werten abhängt. Um ausgewertet werden zu können, muss ein berechneter Ausdruck Werte aus anderen Quellen, zumeist aus anderen Feldern und Zeilen, anfordern und berechnen.


Kapitel <Definition>

Kapitel

Verweis auf einen Zeilenbereich aus einer Datenquelle. In ADO handelt es sich bei einem Kapitel in der Regel um einen Verweis auf ein anderes Recordset.

Kapitelspalten ermöglichen das Festlegen einer Beziehung zwischen über- und untergeordneten Elementen, bei der das übergeordnete Element (Parent) das die Kapitelspalte enthaltende Recordset und das untergeordnete Element (Child) das vom Kapitel dargestellte Recordset ist.


Kapitelalias <Definition>

Kapitelalias

Alias, der sich auf die dem übergeordneten Element angehängte Spalte bezieht.


Zeichensatz <Definition>

Zeichensatz

Zuordnung einer Menge von Zeichen zu den entsprechenden numerischen Werten. Unicode ist z. B. ein 16-Bit-Zeichensatz, der alle vorhandenen Zeichen codieren kann und als weltweiter Standard zur Zeichencodierung verwendet wird.


Untergeordnetes Element (Child) <Definition>

Untergeordnetes Element (Child)

Die abhängige Seite einer hierarchischen Beziehung. Ein untergeordnetes Element ist ein Knoten in einer hierarchischen Struktur, der einen anderen, dem Stamm näheren Knoten, über sich hat. Siehe auch untergeordneter Alias, Beziehung zwischen über- und untergeordneten Elementen, übergeordnetes Element.


Untergeordneter Alias <Definition>

Untergeordneter Alias

Alias, der sich auf das untergeordnete Element bezieht. Siehe auch Alias, untergeordnetes Element.


CLSID (Klassenbezeichner) <Definition>

CLSID (Klassenbezeichner)

Universeller eindeutiger Bezeichner (Universal Unique Identifier, UUID), der eine COM-Komponente identifiziert. Jede COM-Komponente hat einen CLSID in der Windows-Registrierung, so dass sie von anderen Anwendungen geladen werden kann. Siehe auch ProgID, COM.


Clientebene <Definition>

Clientebene

Logische Ebene eines verteilten Systems, die dem Benutzer in der Regel Daten anzeigt und seine Eingaben verarbeitet; manchmal Front-End genannt. In der Regel fordert die Clientebene je nach Eingabe Daten von einem Server an, formatiert sie und zeigt das Ergebnis an. Siehe auch Mittlere Ebene, Datenquellenebene, verteilte Anwendung.


COM (Component Object Model) <Definition>

COM (Component Object Model)

Binärer Standard, durch den Objekte in einer vernetzten Umgebung interoperieren können – unabhängig davon, welche Programmiersprache verwendet wurde und auf welchem Computer sie sich befinden. Zu COM-basierten Technologien gehören ActiveX-Steuerelemente, Automatisierung sowie OLE (Object Linking and Embedding). Mithilfe von COM kann ein Objekt seine Funktionalität anderen Komponenten und Hostanwendungen anzeigen. Es definiert sowohl die Art und Weise, in der das Objekt sich selbst anzeigt, als auch wie die Anzeige über Prozesse und Netzwerke hinweg funktioniert. COM definiert auch den Lebenszyklus des Objekts.


COM-Komponente <Definition>

COM-Komponente

Binäre Datei, wie z. B. DLL-, OCX- sowie einige EXE-Dateien, die den COM-Standard für das Bereitstellen von Objekten unterstützt. Eine solche Datei enthält Code für eine oder mehrere Class Factories, COM-Klassen, Mechanismen für Registrierungseinträge, das Laden von Code usw.


Vergleichsoperator <Definition>

Vergleichsoperator

Ein Operator, der zwei Ausdrücke miteinander vergleicht und einen booleschen Wert zurückgibt.

Ein Kriterienparameter, der als ">" (größer als), "<" (kleiner als), "=" (gleich) ">=" (größer oder gleich), "<=" (kleiner oder gleich), "<>" (ungleich) oder "like" (Mustervergleich) ausgedrückt werden kann.


Komponente <Definition>

Komponente

Ein Objekt, das Daten und Code einschließt und eine klar definierte Gruppe von öffentlich verfügbaren Diensten bietet.


Verbunddatei <Definition>

Verbunddatei

Eine Implementierung von COM-strukturiertem Speicher für Dateien. Eine Verbunddatei speichert getrennte Objekte in einer einzelnen strukturierten Datei, die aus zwei Hauptelementen besteht: Speicherobjekten und Datenstromobjekten. Zusammen funktionieren sie wie ein Dateisystem innerhalb einer Datei. Weitere Informationen finden Sie unter "Compound Files" im Microsoft® Platform SDK.

Anzahl einzelner Dateien, die in einer physischen Datei gebunden sind. Auf jede einzelne Datei in einer Verbunddatei kann so zugegriffen werden, als wäre sie physisch eine einzelne Datei.


Konstante <Definition>

Konstante

Ein numerischer Wert oder Zeichenfolgenwert, der sich nicht ändert. Benannte ADO-Aufzählungen (Aufzählungskonstanten) können im Code anstelle von tatsächlichen Werten verwendet werden, z. B. ist adUseClient ein Konstante, deren Wert 3 beträgt. (Const adUseClient = 3). Siehe auch Aufzählung.


Cursor <Definition>

Cursor

Ein Datenbankelement, das Datensatznavigation, Aktualisierbarkeit von Daten sowie Sichtbarmachung von Datenbankänderungen durch andere Benutzer steuert.


Datenbindung <Definition>

Datenbindung

Der Vorgang, bei dem die Objekte oder Steuerelemente einer Anwendung mit einer Datenquelle verbunden werden. Ein mit einer Datenquelle verbundenes Steuerelement wird datengebundenes Steuerelement genannt.

Die Inhalte eines datengebundenen Steuerelements sind mit Werten aus einer Datenbank verbunden. So kann z. B. ein Grid-Steuerelement, das an ein Recordset-Objekt gebunden ist, aktualisiert werden, wenn auch die Zeilen im Recordset aktualisiert werden. Wenn die neuen Werte vom Recordset abgerufen werden, werden in der Tabelle neue Werte angezeigt.


Datenprovider <Definition>

Datenprovider

Software, die Daten direkt einer ADO-Anwendung zur Verfügung stellt. Siehe auch Serviceprovider.


Datenstrukturierung <Definition>

Datenstrukturierung

Eine Technik, die sich einer (Strukturierungssprache genannten) formalisierten Syntax bedient, um ein spezielles (strukturiertes Recordset genanntes) Recordset-Objekt zu definieren. Dieses enthält nicht nur Daten, sondern auch Verweise auf andere Recordset-Objekte und/oder berechnete Werte, die auf diesen anderen Recordset-Objekte basieren.


DCOM <Definition>

DCOM

Eine Austauschmöglichkeit, durch die COM-Komponenten über ein Netzwerk direkt miteinander kommunizieren können. Siehe auch COM, Komponente.


DDL (Datendefinitionssprache, Data Definition Language) <Definition>

DDL (Datendefinitionssprache, Data Definition Language)

Die Anweisungen in SQL, die nicht zum Bearbeiten, sondern zum Definieren von Daten vorgesehen sind. Ein Datenbankschema wird mithilfe von DDL erstellt oder geändert. Z. B. sind CREATE TABLE, CREATE INDEX, GRANT und REVOKE SQL DDL-Anweisungen.


Standarddatenstrom <Definition>

Standarddatenstrom

Text- oder binärer Datenstrom (dargestellt durch ein Stream-Objekt), der während des Benutzens bestimmter OLE DB-Providers – wie z. B. Microsoft OLE DB-Provider für Internet Publishing – mit Record- oder Recordset–Objekten verbunden ist. Der Standarddatenstrom enthält in der Regel den Inhalt einer Datei, wie z. B. den HTML-Code für den Stamm einer Website.


Nicht verbundenes Recordset <Definition>

Nicht verbundenes Recordset

Ein Recordset-Objekt in einem Clientcache, der keine aktive Verbindung mehr zu einem Server hat. Ist aus irgendeinem Grund erneuter Zugriff auf die ursprüngliche Datenquelle notwendig, z. B. zur Datenaktualisierung, muss die Verbindung erneut aufgebaut werden. Auf die Auflistungen, Methoden und Eigenschaften eines nicht verbundenen Recordsets kann immer noch zugegriffen werden.


Verteilte Anwendung <Definition>

Verteilte Anwendung

Ein Programm, das so geschrieben ist, dass seine Verarbeitung auf mehrere Computer in einem Netzwerk verteilt stattfinden kann. In der Regel ist eine verteilte Anwendung in Präsentation, Geschäftslogik und Schichten zur Datenspeicherung, die sogenannten Ebenen, unterteilt. Siehe auch Clientebene, mittlere Ebene, Datenquellenebene.


DLL (Dynamic Link Library) <Definition>

DLL (Dynamic Link Library)

Datei, die eine oder mehrere Funktionen enthält, die getrennt von den sie verwendenden Prozessen kompiliert, verbunden und gespeichert sind. Das Betriebssystem ordnet die DLLs dem Adressraum des aufrufenden Prozesses zu, wenn der Prozess beginnt oder während er ausgeführt wird.


DML (Datenverarbeitungssprache, Data Manipulation Language) <Definition>

DML (Datenverarbeitungssprache, Data Manipulation Language)

Die Anweisungen in SQL, die nicht zum Definieren, sondern zum Verarbeiten von Daten vorgesehen sind. Die Werte in einer Datenbank werden mithilfe von DML ausgewählt und geändert. Z. B. sind INSERT, UPDATE, DELETE und SELECT SQL DML-Anweisungen.


Provider für Dokumentenquellen <Definition>

Provider für Dokumentenquellen

Eine besondere Klasse von Providern, die Ordner und Dokumente verwalten. Wenn ein Dokument durch ein Record-Objekt dargestellt wird, oder ein Dokumentenordner durch ein Recordset-Objekt dargestellt wird, füllt der Provider für Dokumentenquellen diese Objekte mit einer eindeutigen Gruppe von Felder auf, welche die Merkmale des Dokuments beschreiben, und nicht das Dokument selbst. Siehe auch Ressourcendatensatz.


DSN (Datenquellenname, Data Source Name) <Definition>

DSN (Datenquellenname, Data Source Name)

Die Auflistung von Informationen, die verwendet wird, um die Anwendung mit einer bestimmten ODBC-Datenbank zu verbinden. Der ODBC-Treiber-Manager erstellt mithilfe dieser Informationen eine Verbindung zur Datenbank. Ein DSN kann in einer Datei (Datei-DSN) oder in der Windows-Registrierung (System-DSN) gespeichert werden.


Datenquellenebene <Definition>

Datenquellenebene

Logische Ebene eines verteilten Systems, die einen Computer darstellt, auf dem ein DBMS ausgeführt wird, z. B. eine SQL Server-Datenbank. Siehe auch Clientebene, mittlere Ebene, verteilte Anwendung.


Dynamische Eigenschaft <Definition>

Dynamische Eigenschaft

Eine für Datenprovider oder den Cursordienst spezifische Eigenschaft. Die Properties-Auflistung eines Objekts wird mit diesen Eigenschaften automatisch (dynamisch) aufgefüllt. Ein Objekt hat keine dynamischen Eigenschaften, bevor es nicht mit einer Datenquelle über einen bestimmten Datenprovider verbunden ist. Siehe auch Datenprovider, Cursor.


Aufzählung <Definition>

Aufzählung

Liste benannter Konstanten. Aufzählungswerte brauchen nicht eindeutig zu sein. Der Name jedes Wertes muss jedoch innerhalb des Bereichs, in dem die Aufzählung definiert ist, eindeutig sein. In ADO werden Aufzählungen für numerische Parameter- und Rückgabewerte verwendet, um den ADO-Code sinnvoll zu strukturieren und dem Entwickler die numerischen Werte zu ersparen (die von Version zu Version variieren können). Verwenden Sie z .B. zum Öffnen eines statischen Recordsets den Aufzählungswert adOpenStatic:

Recordset.Open ,,adOpenStatic

Auch bekannt als Aufzählungskonstante. Siehe auch Konstante.


Ereignis <Definition>

Ereignis

Von einem Objekt erkannte Aktion, für die Sie einen Antwortcode schreiben können. Ereignisse können u. a. durch Befehlsausführungen, Transaktionsabschlüsse, Navigationen im Recordset, Datenaktualisierungen sowie andere Aktionen generiert werden. Siehe auch Ereignis-Handler.


Ereignis-Handler <Definition>

Ereignis-Handler

Ein Ereignis-Handler ist der Code, der beim Eintreten eines Ereignisses ausgeführt wird. Siehe auch Ereignis.


Handler <Definition>

Handler

Routine, die eine häufige und vergleichsweise einfache Bedingung oder Vorgang verwaltet, wie z. B. Wiederherstellung nach Fehlern oder Datenverwaltung.


Hierarchisches Recordset <Definition>

Hierarchisches Recordset

Ein Recordset-Objekt, das ein weiteres enthält. Siehe auch Datenstrukturierung, Kapitel.

Weitere Informationen finden Sie unter Zugreifen auf Zeilen in einem hierarchischen Recordset


Hierarchie <Definition>

Hierarchie

Im Allgemeinen ist eine Hierarchie eine Struktur mit einer höchsten Ebene und mehreren untergeordneten Ebenen. In ADO werden hierarchische Recordset-Objekte zum Darstellen der unter- und übergeordneten Beziehungen zwischen einem Datensatz und einem Kapitel verwendet. In ADO kann auch mithilfe von Record- und Stream-Objekten auf hierarchische Strukturen, wie z. B. Ordner und Dokumente zugegriffen werden. ADO MD enthält auch Hierarchy–Objekte, um eine Beziehung zwischen den Ebenen einer Dimension in einem OLAP-Cube darzustellen. Siehe auch hierarchische Recordsets, Beziehung zwischen über- und untergeordneten Elementen, Kapitel, Struktur.


ISAPI (Internet Server Application Programming Interface) <Definition>

ISAPI (Internet Server Application Programming Interface)

Eine Zusammenstellung verschiedener Funktionen für Internetserver, wie z. B. ein Windows NT®-Server/Windows 2000 Server, der Microsoft® Internet-Informationsdienste (IIS) ausführt.


Schlüssel <Definition>

Schlüssel

Eine oder mehrere Spalten in einer Tabelle, durch die eine Zeile eindeutig definiert wird, oft für die Indexerstellung einer Tabelle verwendet.


Marshalling <Definition>

Marshalling

Vorgang des Verpackens, Übertragens und Entpackens von Parametern von Schnittstellenmethoden über Thread- oder Prozessgrenzen hinweg.


Mittlere Ebene <Definition>

Mittlere Ebene

Die logische Ebene in einem verteilten System zwischen einer Benutzeroberfläche bzw. einem Webclient und der Datenbank. In der Regel werden Geschäftsobjekte hier instanziiert. Die mittlere Ebene ist eine Auflistung von Geschäftsregeln und Funktionen, die aufgrund der empfangenen Daten erstellen und funktionieren. Dies wird durch Geschäftsregeln erreicht, die sich oft ändern können und aus diesem Grund in Komponenten gekapselt sind, die physisch von der Anwendungslogik getrennt sind. Wird auch als Anwendungsserverebene bezeichnet. Siehe auch verteilte Anwendung, Clientebene, Datenquellenebene.


MIME (Multi-Purpose Internet Mail Extension) <Definition>

MIME (Multi-Purpose Internet Mail Extension)

Internetprotokoll, das ursprünglich entwickelt wurde, um den Austausch von E-Mail-Nachrichten mit stark formatiertem Inhalt über heterogene Netzwerk-, Computer- und E-Mail-Umgebungen zu ermöglichen. In der Praxis wurde MIME auch in andere als Mail-Anwendungen übernommen und erweitert.

MIME ist ein Standard, mit dem Binärdaten im Internet veröffentlicht und gelesen werden können. Der Header einer Datei mit Binärdaten enthält den MIME-Typ der Daten. Hierdurch werden Clientprogramme (z. B. Webbrowser und Mailanwendungen) darüber informiert, dass die Daten anders als reiner Text behandelt werden müssen. Der Header eines Webdokuments mit einer JPEG-Grafik enthält z. B. den MIME-Typ, der für dieses JPEG-Dateiformat typisch ist. Dadurch kann ein Browser die Datei mit dem JPEG-Viewer anzeigen, sofern dieser vorhanden ist.


Knoten <Definition>

Knoten

Ein Element in einer hierarchischen Struktur. Ein Knoten kann der Stamm sein oder ein Element, das einem anderen Knoten untergeordnet ist. Ein Knoten kann auch mehreren Elementen übergeordnet sein. Siehe auch Hierarchie, Struktur, Stamm, untergeordnetes Element, übergeordnetes Element.


Objektvariable <Definition>

Objektvariable

Eine Variable, die einen Verweis auf ein Objekt enthält. Bei objCustomObject handelt es sich z. B. um eine Variable, die auf ein Objekt des Typs CustomObject verweist:

Set objCustomObject = CreateObject(adodb.Recordset)


ODBC (Open Database Connectivity) <Definition>

ODBC (Open Database Connectivity)

Eine standardmäßige Schnittstelle für Programmiersprachen, die für den Verbindungsaufbau zu zahlreichen Datenquellen verwendet wird. In der Regel wird auf diese Schnittstelle über die Systemsteuerung zugegriffen, in der Datenquellennamen (Data Source Names, DSNs) zugewiesen werden können, um bestimmte ODBC-Treiber zu verwenden.


OLE DB <Definition>

OLE DB

Eine Gruppe von Schnittstellen, die unter Verwendung von COM Daten aus mehreren Quellen zur Verfügung stellt. OLE DB-Schnittstellen stellen Anwendungen mit einheitlichem Zugriff auf Daten bereit, die in unterschiedlichen Informationsquellen gespeichert sind. Diese Schnittstellen unterstützen die DBMS-Funktionalität in einem der Datenquelle angemessenen Umfang, und ermöglichen dadurch die Datenfreigabe. Siehe auch COM.


Teilweises Sperren <Definition>

Teilweises Sperren

Typ von Sperre, bei dem die Datenseite, die ein oder mehrere Datensätze (einschließlich des gerade bearbeiteten) enthält, anderen Benutzern zwar nicht zur Verfügung steht, während der Datensatz durch die Update-Methode aktualisiert wird, jedoch vor und nach dem Aufrufen der Update-Methode.

Eine Teilsperre wird verwendet, wenn das Recordset-Objekt mit dem Parameter oder der Eigenschaft LockType geöffnet wird, der bzw. die auf adLockOptimistic oder adLockBatchOptimistic gesetzt ist Siehe auch vollständiges Sperren.


Ordinalwert <Definition>

Ordinalwert

Numerische Position eines Elements in einer Reihenfolge. In einer ADO-Auflistung beträgt der Ordinalwert des ersten Elements null (0). Der Wert des nächsten Elements beträgt eins (1), usw.


Parametrisierter Befehl <Definition>

Parametrisierter Befehl

Abfrage oder Befehl, mit dessen Hilfe Sie Parameterwerte festlegen können, bevor der Befehl ausgeführt wird. Eine SQL-Zeichenfolge kann z. B. parametrisiert werden, indem Parametermarker in die SQL-Zeichenfolge eingebettet werden (sie sind mit dem Zeichen "?" gekennzeichnet). Dann werden von der Anwendung Werte für jeden Parameter angegeben, und der Befehl wird ausgeführt.


Übergeordnetes Element (Parent) <Definition>

Übergeordnetes Element (Parent)

Die steuernde Seite einer hierarchischen Beziehung. In einer hierarchischen Struktur hat das übergeordnete Element in der Hierarchie direkt unter sich mindestens einen untergeordneten Knoten. Siehe auch übergeordneter Alias, Beziehung zwischen über- und untergeordneten Elementen, untergeordnetes Element.


Übergeordneter Alias <Definition>

Übergeordneter Alias

Alias, der sich auf das übergeordnete Element bezieht. Siehe auch Alias, übergeordnetes Element.


Beziehung zwischen über- und untergeordneten Elementen <Definition>

Beziehung zwischen über- und untergeordneten Elementen

Beziehung in einer hierarchischen Struktur, in der sich das übergeordnete Element mindestens eine Ebene über einem direkt mit ihr verbundenen untergeordneten Element befindet. Ein untergeordnetes Element muss ein übergeordnetes Element haben und befindet sich eine Ebene unter diesem. Siehe auch übergeordnetes Element, untergeordnetes Element.


Dauerhaft speichern <Definition>

Dauerhaft speichern

Daten in einem dauerhaften Zustand speichern, wie z. B. beim Speichern eines Recordset-Objekts in eine Datei.


Vollständiges Sperren <Definition>

Vollständiges Sperren

Typ von Sperre, bei dem die Seite, die einen oder mehrere Datensätze enthält - zu denen auch der gerade bearbeitete Datensatz gehört- anderen Benutzern nicht zur Verfügung steht, so dass eine Aktualisierung vorgenommen werden kann. Das Vorliegen einer vollständigen Sperre wird vom OLE DB-Provider festgelegt. In der Regel werden Datensätze bei Beginn des Bearbeitens gesperrt und stehen erst wieder zur Verfügung, nachdem die Update–Methode abgeschlossen ist.

Eine vollständige Sperre wird aktiviert, wenn das Recordset-Objekt mit dem Parameter oder der Eigenschaft LockType geöffnet wird, der bzw. die auf adLockPessimistic gesetzt ist Siehe auch teilweises Sperren.


Pooling <Definition>

Pooling

Eine Leistungsoptimierung, bei der Auflistungen zuvor zugewiesener Ressourcen verwendet werden, wie z. B. Objekte oder Datenbankverbindungen. Es ist effizienter, eine vorhandene Ressource aus dem Pool zu beziehen, als eine neue zu erstellen.


ProgID (Programmtechnischer Bezeichner) <Definition>

ProgID (Programmtechnischer Bezeichner)

Ein eindeutiger Name, der durch eine COM-Anwendung zur Windows-Registrierung zugeordnet ist. Der ProgID für eine ADO-Verbindung lautet "ADODB.Connection". Siehe auch CLSID, COM.


Proxy <Definition>

Proxy

Ein schnittstellenspezifisches Objekt, das das benötigte Marshalling von Parametern und die erforderliche Kommunikation zur Verfügung stellt, damit ein Client ein Anwendungsobjekt aufrufen kann, das in einer anderen Ausführungsumgebung ausgeführt wird, wie z. B. auf einem anderen Thread oder in einem anderen Prozess. Der Proxy befindet sich auf dem Client und tauscht mit einem entsprechenden Stub, der sich beim aufgerufenen Anwendungsobjekt befindet, Daten aus. Siehe auch Stub.


Relativer URL <Definition>

Relativer URL

Ein unvollständiger URL, der eine Ressource im Internet oder in einem Intranet angibt, deren Position relativ zu einem Startpunkt ist. Dieser wird durch einen absoluten URL oder ein entsprechendes ADO Connection-Objekt angegeben. Die verketteten absoluten und relativen URL bilden so einen vollständigen URL. Siehe auch URL und absoluter URL.


Remotedatenquelle <Definition>

Remotedatenquelle

Eine Datenquelle, die auf einem anderen als dem lokalen Computer vorhanden ist (auf dem die Clientanwendung ausgeführt wird).


Ressourcendatensatz <Definition>

Ressourcendatensatz

Datensatz von einem Provider für Dokumentenquellen, der Felder für die Definition und Beschreibung eines Ordners oder Dokuments enthält. Das Dokument selbst ist nicht im Ressourcendatensatz enthalten, aber in der Regel kann darauf vom Standarddatenstrom oder einem Feld im Ressourcendatensatz, das einen URL enthält, zugegriffen werden. Siehe auch Provider für Dokumentenquellen, Standarddatenstrom, URL.


Stamm <Definition>

Stamm

Das oberste Element in einer hierarchischen Struktur. Dem Stammknoten sind keine Elemente übergeordnet, aber möglicherweise Elemente untergeordnet. Siehe auch Hierarchie, Struktur, übergeordnetes Element, untergeordnetes Element.


Rowset <Definition>

Rowset

Ein aus Zeilen bestehender Satz einer Datenquelle, in dem alle Zeilen das gleiche Feldschema aufweisen. Ein Rowset kann alle oder nur einige Tabellenfelder darstellen. Darüber hinaus kann es auch eine virtuelle Tabelle darstellen, die von einer Abfrage oder der Kombination von zwei bzw. mehr Tabellen erstellt wurde. In ADO werden Rowsets durch Recordset–Objekte dargestellt.


Schema <Definition>

Schema

Beschreibung einer Datenbank für das Datenbankverwaltungssystem (database management system, DBMS), das in der Regel unter Verwendung der vom DBMS bereitgestellten Datendefinitionssprache erstellt wird. Ein Schema legt Attribute der Datenbank fest, wie z. B. Tabellen, Spalten und Eigenschaften.


Bereich <Definition>

Bereich

Referenzbereich für ein Objekt, eine Variable oder einen Datensatzbereich in einer Ansicht oder Tabelle. Auf lokale Variablen kann z. B. nur innerhalb der Prozedur, in der sie definiert wurden, verwiesen werden. Auf öffentliche Variablen kann von überall innerhalb der Anwendung zugegriffen werden. Objekte, wie z. B. die aktuelle Datenbank, liegen im Bereich, wenn sie sich auf dem definierten Suchpfad befinden. Datensatzbereiche können mit einer Scope-Klausel in vielen Befehlen angegeben werden.


Serviceprovider <Definition>

Serviceprovider

Software, die einen Dienst einkapselt, indem Daten erstellt und verarbeitet werden, und so den Funktionsumfang in ADO-Anwendungen erweitert. Der Provider stellt nicht direkt Daten zur Verfügung, sondern vielmehr einen Dienst, wie z. B. eine Abfrageverarbeitung. Der Serviceprovider kann dann die Daten verarbeiten, die ein Datenprovider zur Verfügung gestellt hat. Siehe auch Datenprovider.


Strukturiertes Recordset <Definition>

Strukturiertes Recordset

Ein Recordset, dessen Spalten speziell so definiert wurden, dass sie nicht nur Daten, sondern auch Verweise (genannt Kapitel) auf andere Recordset-Objekte und/oder auf anderen Recordset-Objekten basierende berechnete Werte enthalten.


Gleichgestelltes Element <Definition>

Gleichgestelltes Element

Zwei oder mehr Knoten in einer hierarchischen Struktur, die sich in der Hierarchie auf derselben Ebene befinden. Der Stammknoten in einer Hierarchie hat keine gleichgestellten Elemente.


Gespeicherte Prozedur <Definition>

Gespeicherte Prozedur

Eine zuvor kompilierte Auflistung von Code, wie z. B. SQL-Anweisungen und optionale Anweisungen zur Ablaufsteuerung, die unter einem Namen gespeichert sind und als eine Einheit verarbeitet werden. Gespeicherte Prozeduren werden in einer Datenbank gespeichert; sie können mit einem Aufruf aus einer Anwendung ausgeführt werden und erlauben vom Benutzer deklarierte Variablen, bedingte Ausführung und weitere leistungsfähige Programmierfunktionen.


Stub <Definition>

Stub

Ein schnittstellenspezifisches Objekt, das das benötigte Marshalling von Parametern und die erforderliche Kommunikation zur Verfügung stellt, damit ein Anwendungsobjekt Aufrufe von einem Client erhalten kann, der in einer anderen Ausführungsumgebung ausgeführt wird, wie z. B. auf einem anderen Thread oder in einem anderen Prozess. Der Stub befindet sich am gleichen Ort wie das Anwendungsobjekt und tauscht mit einem entsprechenden Proxy, der sich bei dem ihn aufrufenden Client befindet, Daten aus. Siehe auch Proxy.


Unterknoten <Definition>

Unterknoten

Siehe untergeordnetes Element.


Synchroner Vorgang <Definition>

Synchroner Vorgang

Ein durch Code initiierter Vorgang, der abgeschlossen ist, bevor der nächste Vorgang starten kann. Siehe auch asynchroner Vorgang.


Struktur <Definition>

Struktur

Struktur, die eine hierarchische Beziehung zwischen Elementen (Knoten) darstellt. Ein Knoten befindet sich auf der obersten Ebene der Struktur (dem Stamm). Unterhalb des Stammes können sich mehrere untergeordnete Elemente befinden. Jedes untergeordnete Element kann seinerseits anderen Elementen übergeordnet sein, was zu einer baumähnlichen Verzweigung führt. Ein typisches Beispiel für diese Struktur ist ein Ordner, der Dokumente und weitere Ordner enthält. Siehe auch Hierarchie, Knoten, Stamm, untergeordnetes Element, übergeordnetes Element.


URL (Uniform Resource Locator) <Definition>

URL (Uniform Resource Locator)

Gibt den Speicherort einer Ressource an, die sich im Internet oder einem Intranet befindet. Ein vollständiger URL besteht aus einem Schema (wie z. B. FTP, HTTP, mailto, file usw.), auf das ein Doppelpunkt, der Name eines Servers und der vollständige Pfad einer Ressource (wie z. B. der eines Dokuments, einer Grafik oder eine sonstige Datei) folgen. Im Folgenden sind einige Beispiele für URLs angegeben:

http://www.domain.com/default.html
ftp://ftp.server.somewhere/ftp.file
file://Server/Share/File.doc

Siehe auch absoluter URL und relativer URL.


Webserver <Definition>

Webserver

Ein Computer, der Webdienste und –seiten für Benutzer des Intranets und Internets zur Verfügung stellt.


Randleiste zu Schritt 2: Erstellen eines Befehls (Übungen zu ADO)

Befehle können parametrisiert werden. Ein parametrisierter Befehl besteht aus Befehlstext, der beim Aufruf durch einen vom Benutzer bereit gestellten Wert modifiziert werden kann.

Ein Platzhalterzeichen ("?") zeigt den Teil des Befehlstextes an, der geändert wird. Bei Ausführung des Befehls wird jeder Platzhalter im Befehlstext durch den Wert des entsprechenden Parameter-Objekts in der Parameters-Auflistung ersetzt.

Es gibt zwei Arten, ein Parameter-Objekt zu erstellen und es an die Parameters-Auflistung des Command-Objekts anzuhängen. Die erste Möglichkeit besteht darin, ein neues Parameter-Objekt zu erstellen, dessen Eigenschaften Name, Type, Direction, Size und Value einzeln festzulegen und dann das Objekt zur Parameters-Auflistung hinzuzufügen. Bei der zweiten Vorgehensweise wird die CreateParameter-Methode des Command-Objekts benutzt, um in Form einer einzigen Programmanweisung das Parameter-Objekt zu erstellen, dessen Eigenschaften festzulegen und anschließend das neu erstellte Parameter-Objekt an die Auflistung anzuhängen.

Zuletzt rufen Sie eine der Methoden Command. Execute oder Recordset. Open auf, um die Platzhalter durch die Parameter zu ersetzen und ein Recordset-Objekt zu erhalten. Setzen Sie die Value-Eigenschaft des Parameter-Objekts auf einen anderen Autornamen. Rufen Sie dann die Execute-Methode oder die beiden Methoden Close und Open des Recordset-Objekts auf, um ein neues Recordset-Objekt für einen anderen Autor zu erhalten.

Sie können die Leistung der parametrisierten Befehle mit der Prepared-Eigenschaft optimieren. Beachten Sie, dass die Execute-Methode nicht in der Lage ist, die Eigenschaften CursorType oder LockType des Recordset-Objekts zu bestimmen.

Es folgt ein kurzes Beispiel:

Public Sub main()
Dim cnn As New ADODB.Connection
Dim cmd As New ADODB.Command
Dim prm As ADODB.Parameter
Dim strCmd As String

strCmd = "SELECT * FROM Authors WHERE au_lname = ?"
cmd.CommandText = strCmd
cmd.Parameters.Append _
    cmd.CreateParameter("last name", adVarChar, adParamInput, 40, "")

cnn.Open "dsn=Pubs;uid=sa;pwd=;"
cmd.ActiveConnection = cnn

cmd.Parameters("last name") = "Ringer"
DisplayRst cmd.Execute
cmd.Parameters("last name") = "Karsen"
DisplayRst cmd.Execute

cnn.Close
End Sub

Private Sub DisplayRst(rst As ADODB.Recordset)
If rst.EOF = True Then
    Debug.Print "No recordset returned for Name = '"; _
                    rst.ActiveCommand.Parameters(0); "'"
End If
While rst.EOF = False
    Debug.Print "Name = '"; rst!au_fname; " "; rst!au_lname; "'"
    rst.MoveNext
Wend
End Sub

Zurück Schritt 2: Erstellen eines Befehls


Tabellenschema zu Schritt 4: Ändern der Daten (Übungen zu ADO)

Die folgende Liste gibt das Schema der Tabelle Authors in der Pubs-Datenbank an:

Spaltenname | Datentyp (Länge in Bytes) | Nullfähig?
au_id | ID (11) | Nein
au_lname | varchar(40) | Nein
au_fname | varchar(20) | Nein
Phone | char(12) | Nein
Address | varchar(40) | Ja
City | varchar(20) | Ja
State | char(2) | Ja
Zip | char(5) | Ja
Contract | bit | Nein

Zurück Schritt 4: Ändern der Daten