Page de démarrage Microsoft ActiveX Data Objects (ADO)

Page de démarrage ActiveX Data Objects (ADO) 2.5

ADO
Version 2.5

Objectif

Microsoft ActiveX Data Objects (ADO) permet à vos applications client d'accéder à des données situées sur un serveur de bases de données et de les manipuler par le biais d'un fournisseur OLE DB. ADO a l'avantage d'être facile d'emploi et rapide, d'utiliser peu de mémoire et d'espace disque. ADO offre les fonctionnalités de base permettant de créer des applications client/serveur et des applications Web.

RDS

ADO intègre également la fonction RDS (Remote Data Service), qui permet de déplacer des données d'un serveur vers une application cliente ou une page Web, de manipuler les données sur le client, puis de renvoyer les mises à jour au serveur en un simple aller-retour.

ADO MD

Le modèle ADO MD, ActiveX Data Objects (Multidimensional) de Microsoft, simplifie l'accès aux données multidimensionnelles à partir de langages de programmation tels que Microsoft Visual Basic, Microsoft Visual C++ et Microsoft Visual J++. ADO MD enrichit la gamme ADO (ActiveX Data Objects) de Microsoft avec des objets spécifiques aux données multidimensionnelles, tels que les objets CubeDef et Cellset. Le modèle ADO MD vous permet de parcourir un schéma multidimensionnel, d'interroger un cube et d'extraire les résultats obtenus.

À l'instar d'ADO, ADO MD utilise un fournisseur OLE DB sous-jacent pour l'accès aux données. Pour fonctionner en association avec ADO MD, le fournisseur doit être un fournisseur de données multidimensionnelles (MDP) défini par les spécifications OLAP de OLE DB. Les fournisseurs MDP présentent les données sous forme d'affichages multidimensionnels, à la différence des fournisseurs de données tabulaires (TDP) qui les présentent sous forme de tableaux. Consultez la documentation de votre fournisseur OLAP-OLE DB pour des informations complémentaires sur la syntaxe particulière et les comportements pris en charge par votre fournisseur.

ADOX

Microsoft ActiveX Data Objects Extensions pour le langage de définition des données et la sécurité (ADOX) est une extension des objets et du modèle de programmation ADO. ADOX contient des objets pour la création et la modification de schémas, aussi bien que pour la sécurité. Du fait que la manipulation des schémas repose sur une approche à base d'objets, il est possible d'écrire du code qui fonctionnera avec différentes sources de données, quelles que soient les différences dans leur syntaxe d'origine.

ADOX est une bibliothèque auxiliaire du noyau des objets ADO. Elle propose des objets supplémentaires pour créer, modifier et supprimer des objets de schéma tels que les tables et les procédures. Sont aussi inclus des objets de sécurité pour mettre à jour les utilisateurs et les groupes, et pour accorder et refuser des autorisations sur des objets.

Composants principaux de ADO 2.5

Guide du programmeur

Présentation de l'utilisation de ADO, RDS, ADO MD et ADOX.

Guide de référence du programmeur

Cette section de la documentation ADO contient des rubriques concernant chaque objet, collection, propriété, propriété dynamique, méthode, événement et énumération ADO, RDS, ADO MD et ADOX.

Commentaires

Vous pouvez envoyer vos commentaires sur la documentation ADOou les exemples directement à l'équipe de documentation ADO.

Voir aussi

  • Articles techniques ADO
  • OLE DB

© 1998-2003 Microsoft Corporation. Tous droits réservés.


Guide du programmeur ADO

Guide du programmeur ADO 2.5

Guide du programmeur ADO 2.5

Pour obtenir une présentation du Guide du programmeur Microsoft ActiveX Data Objects (ADO), consultez les rubriques suivantes :

  • Introduction
  • Nouveautés dans ADO
  • Conditions préalables
  • Famille ADO des bibliothèques
  • Rôle de ADO dans Microsoft Data Access
  • Tableau des tâches ADO
  • Tableau des technologies ADO


Introduction

Le Guide de référence du programmeur ADO a été créé pour aider les développeurs qui ne sont pas encore familiarisés avec ADO en leur fournissant une présentation complète de cette technologie. Ce guide décrit les bibliothèques de la famille ADO et utilise des exemples de code dans de nombreux langages afin d'expliquer l'utilisation des bibliothèques, les pratiques recommandés pour l'utilisation des bibliothèques, ainsi que les trucs et les astuces permettant de tirer le meilleur de vos applications ADO.

Le Guide de référence du programmeur ADO contient les sections et chapitres suivants :

  • Section I : ActiveX Data Objects (ADO)
    • Chapitre 1 : Principes ADO
    • Chapitre 2 : Obtention des données
    • Chapitre 3 : Examen des données
    • Chapitre 4 : Modification des données
    • Chapitre 5 : Mise à jour et persistance des données
    • Chapitre 6 : Gestion des erreurs
    • Chapitre 7 : Gestion des événements ADO
    • Chapitre 8 : Curseurs et verrous
    • Chapitre 9 : Mise en forme des données
    • Chapitre 10 : Enregistrement et flux
  • Section II : Remote Data Service (RDS)
    • Chapitre 11 : Principes RDS
    • Chapitre 12 : Didacticiel RDS
    • Chapitre 13 : Utilisation et sécurité RDS
  • Section III : ActiveX Data Objects (Multidimensionnel) (ADO MD)
    • Chapitre 14 : Principes ADO MD
  • Section IV : Extensions ADO pour le langage de définition de données et la sécurité (ADOX)
    • Chapitre 15 : Principes ADOX
  • Section V : Annexes
    • Annexe A : Fournisseurs
    • Annexe B : Erreurs ADO
    • Annexe C : Programmation avec ADO
    • Annexe D : Exemples d'ADO
  • Glossaire ADO


Nouveautés de ADO

ADO 2.5 comprend de nouvelles fonctionnalités ainsi qu'une documentation enrichie dont vous trouverez les détails ci-dessous. ADO, ADO MD et ADOX sont inclus dans cette description.

Nouvelles fonctionnalités

Objets Record et Stream

Cette version de ADO introduit l'objet Record, qui peut représenter et gérer des répertoires et des fichiers dans un système de fichiers, ou des dossiers et des messages dans un système de messagerie. Un objet Record peut également représenter une ligne dans un objet Recordset, même si les objets Record et Recordset utilisent des méthodes et des propriétés différentes.

Le nouvel objet Stream fournit le moyen de lire, écrire et gérer le flux binaire d'octets ou de texte qui constitue un fichier ou un message.

Utilisation des URL

Cette version introduit également l'utilisation des URL (Uniform Resource Locators), en plus des chaînes de connexion et des textes de commande, pour nommer les objets d'un magasin de données. Vous pouvez utiliser les URL avec les objets Connection et Recordset existants, mais aussi avec les nouveaux objets Record et Stream.

À partir de cette version, ADO prend en charge les fournisseurs OLE DB qui reconnaissent leurs propres modèles d'URL. Par exemple, le fournisseur OLE DB Provider for Internet Publishing , qui accède au système de fichiers Windows 2000, reconnaît le modèle HTTP existant.

Champs spéciaux pour les fournisseurs de source de document

Une classe spéciale de fournisseurs, appelés fournisseurs de source de document, gère les dossiers et les documents. Lorsqu'un objet Record représente un document ou qu'un objet Recordset représente un dossier de documents, le fournisseur de source de document remplit ces objets à l'aide d'un ensemble unique de champs qui décrivent les caractéristiques du document. Ces champs constituent un objet Record ou Recordset de ressources.

Nouvelles rubriques de référence

Cette version introduit les nouvelles propriétés suivantes.

Propriété | Description
Charset | Indique le jeu de caractères dans lequel le contenu d'un objet Stream texte doit être traduit.
EOS | Indique si la position actuelle est située à la fin du flux.
LineSeparator | Indique le caractère binaire à utiliser comme séparateur de ligne dans les objets Stream texte.
Mode | Indique les autorisations de modification de données associées à un objet Connection, Record ou Stream.
ParentURL | Indique une chaîne d'URL absolue qui pointe vers l'objet Record parent de l'objet Record actuel.
Position | Indique la position actuelle dans un objet Stream.
RecordType | Indique le type d'objet Record.
Size | Indique la taille du flux en octets.
Source | Indique l'entité représentée par l'objet Record.
State | Indique, pour tout objet applicable, si l'objet est dans un état ouvert ou fermé. Pour tous les objets applicables qui exécutent une méthode asynchrone, indique si l'objet est en cours de connexion, d'exécution ou d'extraction.
Type | Indique le type des données (binaires ou texte) contenues dans l'objet Stream.

Cette version introduit les nouvelles méthodes suivantes.

Méthode | Description
CopyRecord | Copie un fichier ou un répertoire et son contenu à un autre emplacement.
CopyTo | Copie le nombre spécifié de caractères ou d'octets (en fonction de Type) de l'objet Stream vers un autre objet Stream.
DeleteRecord | Supprime un fichier ou un répertoire et tous ses sous-répertoires.
Flush | Vide le contenu de l'objet Stream restant dans le tampon ADO vers l'objet sous-jacent auquel l'objet Stream est associé.
GetChildren | Renvoie un objet Recordset dont les lignes représentent les fichiers et sous-répertoires du répertoire représenté par cet objet Record.
LoadFromFile | Charge le contenu d'un fichier existant dans un objet Stream.
MoveRecord | Déplace un fichier ou un répertoire et son contenu vers un autre emplacement.
Open | Ouvre un objet Record existant ou crée un fichier ou répertoire.
Open | Ouvre un objet Stream pour manipuler des flux de données binaires ou de texte.
Read | Lit un nombre d'octets spécifié à partir d'un objet Stream binaire.
ReadText | Lit un nombre spécifié de caractères dans un objet Stream de texte.
SaveToFile | Enregistre le contenu binaire d'un objet Stream dans un fichier.
SetEOS | Définit la position correspondant à la fin du flux.
SkipLine | Ignore une ligne entière lors de la lecture d'un objet Stream de texte.
Write | Écrit des données binaires dans un objet Stream.
WriteText | Écrit une chaîne de texte spécifiée dans un objet Stream.

Documents nouveaux ou enrichis

Rubriques d'exemples de code

Les exemples comprennent désormais du code Microsoft Visual C++® et Microsoft Visual J++®. Vous pouvez copier et coller ces exemples de code dans votre éditeur.

Rubriques relatives aux fournisseurs

Une nouvelle rubrique a été ajoutée pour expliquer comment utiliser ADO avec le fournisseur OLE DB Provider for Internet Publishing.

Programmation avec ADO

Cette nouvelle section contient des conseils et des astuces pour utiliser ADO avec divers langages de programmation. Elle contient les index de syntaxe existants pour les Extensions Visual C++ pour ADO et ADO/WFC, mais aussi des informations nouvelles qui concernent spécialement les développeurs utilisant Microsoft Visual Basic®, Microsoft Visual Basic® Scripting Edition, Microsoft JScript®, Microsoft Visual C++ ou Microsoft Visual J++.

© 1998-2002 Microsoft Corporation. Tous droits réservés.


Conditions requises

Le Guide de référence du programmeur ADO s'adresse à des développeurs d'horizons différents. Les lecteurs doivent toutefois disposer au minimum d'un niveau moyen d'expérience dans le développement d'applications dans Microsoft Visual Basic, car la plupart des exemples du guide sont écrits dans ce langage. D'autres exemples sont écrit en Microsoft Visual C++; Java; Visual Basic, Scripting Edition (VBScript) et Microsoft JScript.

Étant donné qu'ADO est utilisé pour accéder à des données provenant de sources différentes, il peut être également préférable les lecteurs maîtrisent les principes essentiels des systèmes de gestion des bases de données relationnelles, du traitement analytique en ligne (OLAP), ainsi que d'Internet et de ses protocoles.

ADO fait partie de la stratégie Microsoft Data Access (UDA). (Pour plus d'informations sur UDA, consultez "Le rôle d'ADO dans Microsoft Data Access," plus loin dans ce chapitre.) Il interopère en tant que tel avec la technologie OLE DB. OLE DB est fondé sur le modèle Microsoft COM (Component Object Model). Par conséquent, il peut être également utile d'être familiarisé avec COM pour comprendre certains des concepts les plus avancés d'ADO.


La famille de bibliothèques ADO

La famille ADO se compose de trois bibliothèques principales : ADO (avec RDS), ADO MD et ADOX.

ADO

ADO permet à vos applications client d'accéder à des données situées sur un serveur de bases de données et de les manipuler par le biais d'un fournisseur OLE DB. ADO a l'avantage d'être facile d'emploi et rapide, d'utiliser peu de mémoire et d'espace disque. ADO offre les fonctionnalités de base permettant de créer des applications client/serveur et des applications Web.

ADO intègre également la fonction RDS (Remote Data Service), qui permet de déplacer des données d'un serveur vers une application cliente ou une page Web, de manipuler les données sur le client, puis de renvoyer les mises à jour au serveur en un simple aller-retour.

ADO MD

Le modèle ADO MD (Microsoft ActiveX Data Objects (Multidimensional) (ADO MD) simplifie l'accès aux données multidimensionnelles à partir de langages de programmation tels que Microsoft Visual Basic, Microsoft Visual C++ et Microsoft Visual J++. ADO MD enrichit la gamme ADO d'objets spécifiques aux données multidimensionnelles, tels que les objets CubeDef et Cellset. Le modèle ADO MD vous permet de parcourir un schéma multidimensionnel, d'interroger un cube et d'extraire les résultats obtenus.

À l'instar d'ADO, ADO MD utilise un fournisseur OLE DB sous-jacent pour l'accès aux données. Pour fonctionner en association avec ADO MD, le fournisseur doit être un fournisseur de données multidimensionnelles (MDP) défini par les spécifications OLAP de OLE DB. Les fournisseurs MDP présentent les données sous forme d'affichages multidimensionnels, à la différence des fournisseurs de données tabulaires (TDP) qui les présentent sous forme de tableaux. Pour plus d'informations sur la syntaxe et les comportements pris en charge par votre fournisseur, consultez la documentation de votre fournisseur OLE DB pour OLAP.

ADOX

Microsoft ActiveX Data Objects Extensions pour le langage de définition des données et la sécurité (ADOX) est une extension des objets et du modèle de programmation ADO. ADOX contient des objets pour la création et la modification de schémas, aussi bien que pour la sécurité. Du fait que la manipulation des schémas repose sur une approche à base d'objets, il est possible d'écrire du code qui fonctionnera avec différentes sources de données, quelles que soient les différences dans leur syntaxe d'origine.

ADOX est une bibliothèque auxiliaire du noyau des objets ADO. Elle propose des objets supplémentaires pour créer, modifier et supprimer des objets de schéma tels que les tables et les procédures. Sont aussi inclus des objets de sécurité pour mettre à jour les utilisateurs et les groupes, et pour accorder et refuser des autorisations sur des objets.

Voir aussi

Section I : ActiveX Data Objects (ADO) | Section II : Remote Data Service (RDS) | Section III : ADO (Multidimensionnel) (ADO MD) | Section IV : Extensions pour le langage de définition des données et la sécurité (ADOX)


Le rôle d'ADO dans Microsoft Data Access

Les composants MDAC (Microsoft Data Access Components) offrent un accès aux données qui est indépendant des magasins de données, des outils et des langages. Ils fournissent une interface de haut niveau facile à utiliser et une interface de bas niveau très performante avec la plupart des magasins de données existants. Vous pouvez utiliser cette souplesse pour intégrer différents magasins de données et utiliser les outils, applications et services de votre choix pour créer les solutions adaptées à vos besoins. Ces technologies constituent l'architecture essentielle de l'accès aux données générales dans les systèmes d'exploitation Microsoft Windows.

Il existe trois technologies principales dans MDAC. ADO (ActiveX Data Objects) est une interface (avec OLE DB) de haut niveau facile à utiliser. OLE DB est une interface de bas niveau très performante avec une grande variété de magasins de données. ADO et OLE DB peuvent travailler tous deux avec des données relationnelles (tabulaires) et non-relationnelles (hiérarchiques ou flux). Enfin, ODBC (Open Database Connectivity) est une autre interface de bas niveau très performante conçue spécifiquement pour les magasins de données relationnelles.

ADO fournit une couche d'abstraction entre votre application client ou intermédiaire et les interfaces OLE DB de bas niveau. ADO utilise un petit ensemble d'objets Automation afin de créer une interface simple et efficace avec OLE DB. Cette interface fait d'ADO le choix idéal pour les développeurs de langages de niveaux supérieurs, tels que Visual Basic et même VBScript, qui veulent accéder aux données sans devoir apprendre les subtilités de COM et OLE DB.


Tableau des tâches ADO

Le tableau ci-dessous répertorie les tâches de programmation contenues dans le Guide du programmeur ADO et fournit des références pour chaque tâche. Ces références peuvent être des descriptions textuelles ou des exemples de code dans lesquels vous trouverez des informations sur la fonctionnalité ADO qui effectue la tâche.

Tâche ADO | Références
Connexion à un fournisseur de données | Établissement d'une connexion
Exécution de commandes ou appel de procédures stockées | Utilisation de l'objet Command
Ouverture d'un Recordset | La méthode Open de l'objet Recordset
Détermination de la taille d'un Recordset | Comptage des lignes et Les limites d'un Recordset
Déplacement jusqu'à un enregistrement spécifique | Navigation parmi les données
Accès aux valeurs des données | La collection Fields
Recherche de données | Utilisation de Recordsets
Modification des données et des valeurs | Modification d'enregistrements existants
Ajout de nouvelles données | Ajout d'enregistrements
Suppression de données | Suppression d'enregistrements à l'aide de la méthode Delete
Publication de modifications apportées à la source de données | Mise à jour des données
Commencement, validation et annulation de transactions | Traitement des transactions
Enregistrement d'enregistrements dans un fichier (XML ou binaire) | Persistance des données
Traitement des erreurs | Erreurs ADO
Traitement des événements, programmation asynchrone | Résumé des gestionnaires d'événements ADO
Choix d'un emplacement et d'un type de curseur | Types de curseurs
Choix de types de verrous | Types de verrous
Renvoi des enregistrements apparentés dans un Recordset | Résumé sur la mise en forme des données
Accès aux données semi-structurées | Chapitre 10 : Enregistrement et flux
Publication dans IIS | Utilisation d'ADO pour Internet Publishing


Tableau des technologies ADO

Le tableau ci-dessous répertorie les produits, outils et technologies Microsoft traités dans le Guide du programmeur ADO. Il fournit des liens, dès qu'ils existent, vers les rubriques pertinentes du guide.

Produit ou technologie Microsoft | Références
Access/Jet | Utilisation de Recordsets Chapitre 15 : Principes ADOX Microsoft Jet and Replication Objects Fournisseur OLE DB Microsoft pour Jet
Active Directory Service Interfaces | Microsoft OLE DB Provider pour le service Microsoft Active Directory
COM/DCOM | Pré-requis Marquage des objets Business sécurisés pour les scripts Enregistrement d'objets Business côté client pour une utilisation avec DCOM Définition du format marshaling de chaînes DCOM Activation de l'exécution d'une DLL sur DCOM Exécution d'objets Business dans les services de composants
FrontPage | Microsoft OLE DB Provider pour Internet Publishing
Indexing Service | Microsoft OLE DB Provider pour le service d'indexation Microsoft
Internet Explorer | Codes d'erreur Internet Explorer
Internet Information Services | Chapitre 10 : Enregistrement et flux Objets Stream et persistance Utilisation d'ADO pour Internet Publishing Solutions pour l'accès aux données à distance Configuration de serveurs virtuels sur IIS Spécification du nombre de threads par processeur sur IIS Sécurisation des applications RDS « Erreur du serveur Internet : accès refusé » Microsoft OLE DB Provider pour Internet Publishing Codes d'erreur Internet Information Services
JScript | Gestion des erreurs dans d'autres langages Programmation des ADO en JScript Exemples de code ADO en Microsoft JScript
ODBC | Le rôle d'ADO dans Microsoft Data Access Utilisation de l'objet Connection Utilisation de RDS avec la fonction de regroupement de connexions ODBC Fournisseur OLE DB Microsoft pour ODBC
OLE DB | Le rôle d'ADO dans Microsoft Data Access Fournisseurs OLE DB Annexe A : Fournisseurs Erreurs du fournisseur
Oracle | Fournisseur OLE DB Microsoft pour Oracle
SQL Server 2000 | Contrôle des transactions Appel d'une procédure stockée à l'aide d'une commande Comptage des lignes Curseur à défilement en avant seulement Flux de commandes Vérification de l'existence d'un espace de base de données TempDB suffisant Réduction de l'utilisation de l'espace du fichier journal Microsoft OLE DB Provider pour SQL Server
Transaction Server | Exécution d'objets Business dans les services de composants
VBScript | Gestion des erreurs dans d'autres langages Fonctions Visual Basic pour Applications Flux de commandes Solutions pour l'accès aux données à distance Scénario RDS Didacticiel RDS (VBScript) Programmation des ADO en VBScript Exemples de code ADO en Microsoft Visual Basic Scripting Edition
Visual Basic | Erreurs Erreurs ADO Instanciation d'événements ADO par langage Fonctions Visual Basic pour Applications Chapitre 12 : Didacticiel RDS Utilisation d'ADO avec Microsoft Visual Basic Exemples de code ADO en Microsoft Visual Basic
Visual C++ | Gestion des erreurs dans d'autres langages Instanciation d'événements ADO par langage Utilisation d'ADO avec Microsoft Visual C++ Exemples de code ADO en Microsoft Visual C++
Visual J++ | Gestion des erreurs dans d'autres langages Instanciation d'événements ADO par langage Didacticiel RDS (Visual J++) Utilisation d'ADO avec Microsoft Visual J++ Exemples de code ADO en Microsoft Visual J++
Visual Studio | Annexe D : Exemples d'ADO
Windows 2000 | Configuration système requise pour l'application Carnet d'adresses Affectation de privilèges Invité sur un serveur Web Enregistrement d'un objet Business personnalisé Sécurisation des applications RDS Configuration de RDS sous Windows 2000
XML | Persistance d'enregistrements au format XML Chapitre 10 : Enregistrement et flux Flux de commandes Récupération de jeux de résultats dans des flux


Section I : ActiveX Data Objects (ADO)

Cette section contient les chapitres suivants :

  • Chapitre 1 : Notions fondamentales relatives à ADO
  • Chapitre 2 : Obtention des données
  • Chapitre 3 : Examen des données
  • Chapitre 4 : Modification des données
  • Chapitre 5 : Mise à jour et persistance des données
  • Chapitre 6 : Gestion des erreurs
  • Chapitre 7 : Gestion d'événements ADO
  • Chapitre 8 : Description des curseurs et des verrous
  • Chapitre 9 : Mise en forme des données
  • Chapitre 10 : Objets Record et Stream


Chapitre 1 : Principes ADO

Ce chapitre présente la bibliothèque ADO. Il indique ce que ADO vous permet de faire, passe en revue les objets de la hiérarchie ADO, et présente une application ADO simple qui emploie de nombreux objets ADO pour récupérer, modifier et mettre à jour les données d'une source de données. Enfin, ce chapitre abord deux points qu'il est important de comprendre pour écrire des applications ADO : les fournisseurs OLE DB et les erreurs.


Ce que vous pouvez faire avec ADO

ADO offre aux développeurs un modèle d'objet logique et puissant pour accéder, modifier et mettre à jour par programmation une grande variété de sources de données par l'intermédiaire d'interfaces système OLE DB. L'usage le plus commun d'ADO consiste à interroger une ou plusieurs tables dans une base de données relationnelles, de récupérer et d'afficher les résultats dans une application et éventuellement de permettre aux utilisateurs d'apporter des modifications aux données et de les enregistrer. Les autres opérations qui peuvent se faire par programmation avec ADO sont les suivantes :

  • Interrogation d'une base de données avec SQL et affichage des résultats.
  • Accès aux informations d'un magasin de fichiers via Internet.
  • Manipulation des messages et des dossiers d'un système de messagerie.
  • Enregistrement des données d'une base de données dans un fichier XML.
  • Autorisation à un utilisateur de réviser et de modifier les données de tables de bases de données.
  • Création et réutilisation de commandes de base de données paramétrées.
  • Exécution de procédures stockées.
  • Création dynamique d'une structure souple, appelée Recordset, pour contenir, manipuler et circuler dans les données.
  • Exécution d'opérations de bases de données transactionnelles.
  • Filtrage et tri de copies locales d'informations de base de données basés sur des critères d'exécution.
  • Création et manipulation de résultats hiérarchiques à partir de bases de données.
  • Liaison de champs de données à des composants liés aux bases de données.
  • Création de Recordsets distants et déconnectés.

ADO doit présenter une vaste gamme d'options et de paramètres pour fournir une flexibilité de ce type. Il est donc important d'adopter une approche méthodique pour apprendre à utiliser ADO dans une application, en décomposant chacun de vos objectifs en éléments gérables.

Quatre opérations principales sont impliquées dans la plupart des programmes ADO : obtention, examen, modification et mise à jour des données. Les quatre prochains chapitres abordent chacune de ces opérations de manière plus détaillée.

Avant de procéder, familiarisez-vous avec les objets du Modèle d'objet ADO. Passez ensuite en revue HelloData: une application ADO simple. Cette application est écrite en Visual Basic et effectue chacune des quatre opérations ADO principales.

© 1998-2002 Microsoft Corporation. Tous droits réservés.


Le modèle d'objets ADO

ADO n'a besoin que de neuf objets et quatre collections pour remplir toutes ses fonctions. Le tableau ci-dessous les présente.

Objet ou collection | Description
Objet Connection | Représente une session unique avec une source de données. Dans le cas d'un système de base de données client/serveur, il peut correspondre à une connexion réseau au serveur. Selon les fonctionnalités prises en charge par le fournisseur, certaines collections, méthodes ou propriétés d'un objet Connection peuvent ne pas être disponibles.
Objet Command | Définit une commande spécifique, telle qu'une requête SQL, destinée à être exécutée sur une source de données.
Objet Recordset | Représente la totalité des jeux d'enregistrements d'une table de base ou les résultats d'une commande exécutée. Tous les objets Recordset se composent d'enregistrements (lignes) et de champs (colonnes).
Objet Record | Représente une ligne de données, provenant soit d'un Recordset, soit du fournisseur. Selon votre fournisseur, cet enregistrement peut représenter un enregistrement de base de données ou un autre type d'objet comme un fichier ou un répertoire.
Objet Stream | Représente un flux de données binaires ou de texte. Par exemple, un document XML peut être chargé dans un flux à des fins d'entrée de commande ou renvoyé par un fournisseur en tant que résultat d'une requête. Un objet Stream peut être utilisé pour manipuler des champs ou des enregistrements contenant ces flux de données.
Objet Parameter | Représente un paramètre ou un argument relatif à un objet Command basé sur une requête paramétrée ou une procédure stockée.
Objet Field | Représente une colonne de données avec un type de données commun. Chaque objet Field correspond à une colonne du Recordset.
Objet Property | Représente une caractéristique d'un objet ADO défini par le fournisseur. Les objets ADO ont deux types de propriétés : intégrées et dynamiques. Les propriétés intégrées sont les propriétés implémentées dans ADO et immédiatement accessibles à tout nouvel objet. L'objet Property est un conteneur de propriétés dynamiques, définies par le fournisseur sous-jacent.
Objet Error | Contient des détails sur les erreurs d'accès aux données propres à une seule opération concernant le fournisseur.
Collection Fields | Contient tous les objets Field d'un objet Recordset ou Record.
Collection Properties | Comprend tous les objets Property pour une occurrence spécifique d'un objet.
Collection Parameters | Comprend tous les objets Parameter d'un objet Command.
Collection Errors | Contient tous les objets Error créés en réponse à un échec unique lié au fournisseur.

Les figures suivantes illustrent les objets et collections ADO. Cliquez sur un objet ou sur une collection pour plus d'informations extraites du guide de référence du programmeur ADO.


HelloData : une application ADO simple

Pour préparer le terrain en vue de l'exploration de la bibliothèque ADO, prenons comme exemple une application ADO simple appelée « HelloData ». Cette application parcourt chacune des quatre opérations ADO principales (obtention, analyse, modification et mise à jour de données). Afin de se concentrer sur les notions de base d'ADO et d'éviter tout encombrement de code, cet exemple illustre la gestion d'erreurs minimale.

L'application interroge la base de données exemple Northwind qui est comprise dans Microsoft SQL Server 2000.

Pour exécuter HelloData

  1. Créez un nouveau projet EXE standard Visual Basic qui fait référence à la bibliothèque ADO 2.5.
  2. Créez quatre boutons de commande dans la partie supérieure du formulaire, en affectant aux propriétés Name et Caption les valeurs indiquées dans le tableau ci-après.
  3. Sous ces boutons, ajoutez un Contrôle Microsoft DataGrid (Msdatgrd.ocx). Le fichier Msdatgrd.ocx est intégré à Visual Basic et se trouve dans le répertoire \windows\system32 ou \winnt\system32. Pour ajouter le contrôle DataGrid à la boîte à outils Visual Basic, sélectionnez Composants dans le menu Projet. Ensuite, activez la case à cocher Microsoft DataGrid Control 6.0 (SP3) (OLEDB), puis cliquez sur OK. Pour ajouter le contrôle au projet, déplacez le contrôle DataGrid de la boîte à outils vers le formulaire Visual Basic.
  4. Créez une zone de texte sur le formulaire, sous la grille et affectez-lui les propriétés indiquées dans le tableau. Le formulaire doit ressembler à celui illustré ci-après lorsque vous avez terminé.
  5. Pour finir, copiez le code figurant dans la section Code HelloData et collez-le dans l'éditeur de code du formulaire. Appuyez sur F5 pour l'exécuter.
Remarque Dans l'exemple suivant, et dans tout le guide, l'ID utilisateur « MyId » et le mot de passe « 123aBc » sont utilisés pour l'authentification sur le serveur. Vous devez remplacer ces valeurs par les informations d'identification valides sur votre serveur. Remplacez également la valeur « MyServer » par le nom de votre serveur.

Pour plus d'informations sur le code, consultez Détails du code HelloData.

Type de contrôle | Propriété | Valeur
Form | Nom | Form1
 | Height | 6500
 | Width | 6500
MS DataGrid | Nom | grdDisplay1
TextBox | Nom | txtDisplay1
 | Multiline | true
CommandButton | Nom | cmdGetData
 | Caption | Get Data
CommandButton | Nom | cmdExamineData
 | Caption | Examine Data
CommandButton | Nom | cmdEditData
 | Caption | Edit Data
CommandButton | Nom | cmdUpdateData
 | Caption | Update Data


Détails du code HelloData

L'application HelloData parcourt les opérations de base d'une application ADO standard : obtention, analyse, modification et mise à jour de données. Lorsque vous démarrez l'application, cliquez sur le premier bouton Get Data. La sous-routine GetData() s'exécute.

GetData

GetData insère une chaîne de connexion valide dans une variable au niveau module, m_sConnStr. Pour plus d'informations sur les chaînes de connexion, consultez Création d'une chaîne de connexion.

Affectez un gestionnaire d'erreurs en utilisant une instruction OnError Visual Basic. Pour plus d'informations sur la gestion d'erreurs dans ADO, consultez le Chapitre 6 : Gestion d'erreurs. Un nouvel objet Connection est créé et la propriété CursorLocation a la valeur adUseClient car l'exemple HelloData crée un objet Recordset déconnecté. Cela signifie qu'une fois que les données ont été extraites de la source de données, la connexion physique à la source de données est rompue. Toutefois, vous pouvez encore utiliser les données mise en mémoire cache locale dans l'objet Recordset.

Une fois l'objet Connection ouvert, affectez une chaîne SQL à une variable (sSQL). Un nouvel objet Recordset (m_oRecordset1) est instancié. À la ligne de code suivante, ouvrez l'objet Recordset sur l'objet Connection existant, en passant sSQL comme la source du Recordset. Vous aidez ADO à déterminer que la chaîne SQL passée comme la source du Recordset est la définition texte d'une commande en passant adCmdText dans l'argument final à la méthode Open de l'objet Recordset. Cette ligne définit également les propriétés LockType et CursorType associées au Recordset.

La ligne de code suivante affecte à la propriété MarshalOptions la valeur adMarshalModifiedOnly. La propriété MarshalOptions indique les enregistrements qui doivent faire l'objet de marshaling au niveau intermédiaire (ou sur le serveur Web). Pour plus d'informations sur le marshaling, consultez la documentation COM. Lorsque vous utilisez adMarshalModifiedOnly avec un curseur côté client (CursorLocation = adUseClient), seuls les enregistrements modifiés sur le client sont réécrits au niveau intermédiaire. En affectant à la propriété MarshalOptions la valeur adMarshalModifiedOnly, vous pouvez améliorer les performances car un nombre inférieur de lignes fait l'objet du marshaling.

Ensuite, déconnectez l'objet Recordset en affectant à la propriété ActiveConnection la valeur Nothing. Pour plus d'informations, consultez Déconnexion et reconnexion d'un objet Recordset dans le Chapitre 5 : Mise à jour et persistance des données.

Fermez la connexion à la source de données et détruisez l'objet Connection existant. Vous libérez ainsi les ressources qu'il consommait.

La dernière étape consiste à définir l'objet Recordset comme DataSource pour le contrôle Microsoft DataBound Grid sur la feuille de façon à pouvoir afficher facilement les données du Recordset sur la feuille.

Cliquez sur le second bouton, Examine Data. La sous-routine ExamineData s'exécute.

ExamineData

La sous-routine ExamineData utilise plusieurs méthodes et propriétés de l'objet Recordset pour afficher des informations sur les données du Recordset. Elle indique le nombre d'enregistrements en utilisant la propriété RecordCount. Elle s'exécute en boucle dans le Recordset et imprime la valeur de la propriété AbsolutePosition dans la zone de texte de la feuille. Pendant la boucle, la valeur de la propriété Bookmark pour le troisième enregistrement est également insérée dans une variable Variant, vBookmark, en vue d'une utilisation ultérieure.

La routine explore directement le troisième enregistrement en utilisant la variable signet stockée précédemment. Cette routine appelle la sous-routine WalkFields, qui s'exécute en boucle dans la collection Fields de l'objet Recordset et affiche des informations sur chaque objet Field de la collection.

Pour finir, ExamineData utilise la propriété Filter de l'objet Recordset pour analyser uniquement les enregistrements dont la propriété CategoryId a la valeur 2. Les résultats de l'application de ce filtre sont immédiatement visibles dans la grille sur la feuille.

Pour plus d'informations sur la fonctionnalité illustrée dans la sous-routine ExamineData, consultez le Chapitre 3 : Analyse des données.

Ensuite, cliquez sur le troisième bouton, Edit Data. La sous-routine EditData s'exécute.

EditData

Lorsque le code entre dans la sous-routine EditData, l'objet Recordset est toujours filtré en fonction d'un CategoryId égal à 2, ainsi, seuls les éléments correspondants au critère du filtre sont visibles. La routine s'exécute en boucle dans l'objet Recordset et augmente le prix de chaque élément visible dans cet objet de 10 %. La valeur du champ Price est modifiée en affectant à la propriété Value de ce champ une valeur égale à un nouveau montant valide.

N'oubliez pas que l'objet Recordset est déconnecté de la source de données. Les modifications liées à la routine EditData sont effectuées uniquement sur une copie des données mise en mémoire cache locale. Pour plus d'informations, consultez le Chapitre 4 : Modification des données.

Les modifications ne sont pas apportées à la source de données tant que vous ne cliquez pas sur le quatrième bouton, Update Data. La sous-routine UpdateData s'exécute.

UpdateData

La routine UpdateData supprime d'abord le filtre appliqué à l'objet Recordset. Le code supprime et réinitialise m_oRecordset1 comme DataSource pour le contrôle Microsoft Bound DataGrid sur la feuille, de façon à ce que l'objet Recordset non filtré s'affiche dans la grille.

Le code vérifie ensuite si vous pouvez vous déplacer vers l'arrière dans l'objet Recordset en utilisant la méthode Supports et l'argument adMovePrevious.

La routine se déplace vers le premier enregistrement en utilisant la méthode MoveFirst et affiche les valeurs d'origine et en cours des champs en utilisant les méthodes OriginalValue et Value de l'objet Field. Ces propriétés et la propriété UnderlyingValue (qui n'est pas utilisée ici), sont présentées dans le Chapitre 5 : Mise à jour et persistance des données.

Ensuite, un objet Connection est créé et utilisé pour rétablir une connexion à la source de données. Vous pouvez reconnecter l'objet Recordset à la source de données en définissant l'objet Connection comme ActiveConnection pour l'objet Recordset. Pour envoyer les mises à jour au serveur, le code appelle la méthode UpdateBatch sur l'objet Recordset.

Si la mise à jour par lots réussit, une variable balise au niveau module, m_flgPriceUpdated, prend la valeur True. Ainsi, vous n'oublierez pas de nettoyer les modifications apportées à la base de données.

Pour finir, le code passe au premier enregistrement dans l'objet Recordset et affiche les valeurs en cours et d'origine. Ces valeurs sont identiques à celles existantes après l'appel de la méthode UpdateBatch.

Pour plus d'informations sur la mise à jour des données, notamment sur les mesures à prendre lorsque les données changent sur le serveur alors que l'objet Recordset est déconnecté, consultez le Chapitre 5 : Mise à jour et persistance des données.

Form_Unload

La sous-routine Form_Unload est essentielle pour plusieurs raisons. Tout d'abord, comme il s'agit d'un exemple d'application, Form_Unload nettoie les modifications apportées à la base de données avant de quitter l'application. Ensuite, le code illustre comment exécuter directement une commande à partir d'un objet Connection ouvert en utilisant la méthode Execute. Pour finir, elle illustre l'exécution d'une requête de renvoi non productrice de lignes (requête UPDATE) sur la source de données.


Code HelloData

'BeginHelloData
Option Explicit

Dim m_oRecordset As ADODB.Recordset
Dim m_sConnStr As String
Dim m_flgPriceUpdated As Boolean

Private Sub cmdGetData_Click()
    GetData

    If Not m_oRecordset Is Nothing Then
        If m_oRecordset.State = adStateOpen Then
            ' Set the proper states for the buttons.
            cmdGetData.Enabled = False
            cmdExamineData.Enabled = True
        End If
    End If
End Sub

Private Sub cmdExamineData_Click()
    ExamineData
End Sub

Private Sub cmdEditData_Click()
    EditData
End Sub

Private Sub cmdUpdateData_Click()
    UpdateData

    ' Set the proper states for the buttons.
    cmdUpdateData.Enabled = False
End Sub

Private Sub GetData()
    On Error GoTo GetDataError

    Dim sSQL As String
    Dim oConnection1 As ADODB.Connection

    m_sConnStr = "Provider='SQLOLEDB';Data Source='MySqlServer';" & _
                "Initial Catalog='Northwind';Integrated Security='SSPI';"

    ' Create and Open the Connection object.
    Set oConnection1 = New ADODB.Connection
    oConnection1.CursorLocation = adUseClient
    oConnection1.Open m_sConnStr

    sSQL = "SELECT ProductID, ProductName, CategoryID, UnitPrice " & _
             "FROM Products"

    ' Create and Open the Recordset object.
    Set m_oRecordset = New ADODB.Recordset
    m_oRecordset.Open sSQL, oConnection1, adOpenStatic, _
                        adLockBatchOptimistic, adCmdText

    m_oRecordset.MarshalOptions = adMarshalModifiedOnly

    ' Disconnect the Recordset.
    Set m_oRecordset.ActiveConnection = Nothing
    oConnection1.Close
    Set oConnection1 = Nothing

    ' Bind Recordset to the DataGrid for display.
    Set grdDisplay1.DataSource = m_oRecordset

    Exit Sub

GetDataError:
    If Err <> 0 Then
        If oConnection1 Is Nothing Then
           HandleErrs "GetData", m_oRecordset.ActiveConnection
        Else
           HandleErrs "GetData", oConnection1
        End If
    End If

    If Not oConnection1 Is Nothing Then
        If oConnection1.State = adStateOpen Then oConnection1.Close
        Set oConnection1 = Nothing
    End If
End Sub

Private Sub ExamineData()
    On Err GoTo ExamineDataErr

    Dim iNumRecords As Integer
    Dim vBookmark As Variant

    iNumRecords = m_oRecordset.RecordCount

    DisplayMsg "There are " & CStr(iNumRecords) & _
                " records in the current Recordset."

    ' Loop through the Recordset and print the
    ' value of the AbsolutePosition property.
    DisplayMsg "****** Start AbsolutePosition Loop ******"

    Do While Not m_oRecordset.EOF
        ' Store the bookmark for the 3rd record,
        ' for demo purposes.
        If m_oRecordset.AbsolutePosition = 3 Then _
            vBookmark = m_oRecordset.Bookmark

        DisplayMsg m_oRecordset.AbsolutePosition

        m_oRecordset.MoveNext
    Loop

    DisplayMsg "****** End AbsolutePosition Loop ******" & vbCrLf

    ' Use our bookmark to move back to 3rd record.
    m_oRecordset.Bookmark = vBookmark
    MsgBox vbCr & "Moved back to position " & _
            m_oRecordset.AbsolutePosition & " using bookmark.", , _
            "Hello Data"

    ' Display meta-data about each field. See WalkFields() sub.
    Call WalkFields

    ' Apply a filter on the type field.
    MsgBox "Filtering on type field. (CategoryID=2)", _
            vbOKOnly, "Hello Data"

    m_oRecordset.Filter = "CategoryID=2"

    ' Set the proper states for the buttons.
    cmdExamineData.Enabled = False
    cmdEditData.Enabled = True

    Exit Sub

ExamineDataErr:
    HandleErrs "ExamineData", m_oRecordset.ActiveConnection
End Sub

Private Sub EditData()
    On Error GoTo EditDataErr

    'Recordset still filtered on CategoryID=2.
    'Increase price by 10% for filtered records.
    MsgBox "Increasing unit price by 10%" & vbCr & _
        "for all records with CategoryID = 2.", , "Hello Data"

    m_oRecordset.MoveFirst

    Dim cVal As Currency
    Do While Not m_oRecordset.EOF
        cVal = m_oRecordset.Fields("UnitPrice").Value
        m_oRecordset.Fields("UnitPrice").Value = (cVal * 1.1)
        m_oRecordset.MoveNext
    Loop

    ' Set the proper states for the buttons.
    cmdEditData.Enabled = False
    cmdUpdateData.Enabled = True

    Exit Sub

EditDataErr:
    HandleErrs "EditData", m_oRecordset.ActiveConnection
End Sub

Private Sub UpdateData()
    On Error GoTo UpdateDataErr

    Dim oConnection2 As New ADODB.Connection

    MsgBox "Removing Filter (adFilterNone).", , "Hello Data"
    m_oRecordset.Filter = adFilterNone

    Set grdDisplay1.DataSource = Nothing
    Set grdDisplay1.DataSource = m_oRecordset

    MsgBox "Applying Filter (adFilterPendingRecords).", , "Hello Data"
    m_oRecordset.Filter = adFilterPendingRecords

    Set grdDisplay1.DataSource = Nothing
    Set grdDisplay1.DataSource = m_oRecordset

    DisplayMsg "*** PRE-UpdateBatch values for 'UnitPrice' field. ***"

    ' Display Value, UnderlyingValue, and OriginalValue for
    ' type field in first record.
    If m_oRecordset.Supports(adMovePrevious) Then
        m_oRecordset.MoveFirst
        DisplayMsg "OriginalValue   = " & _
            m_oRecordset.Fields("UnitPrice").OriginalValue
        DisplayMsg "Value           = " & _
            m_oRecordset.Fields("UnitPrice").Value
    End If

    oConnection2.ConnectionString = m_sConnStr
    oConnection2.Open

    Set m_oRecordset.ActiveConnection = oConnection2
    m_oRecordset.UpdateBatch

    m_flgPriceUpdated = True

    DisplayMsg "*** POST-UpdateBatch values for 'UnitPrice' field ***"

    If m_oRecordset.Supports(adMovePrevious) Then
         m_oRecordset.MoveFirst
         DisplayMsg "OriginalValue   = " & _
             m_oRecordset.Fields("UnitPrice").OriginalValue
         DisplayMsg "Value           = " & _
             m_oRecordset.Fields("UnitPrice").Value
    End If

    MsgBox "See value comparisons in txtDisplay.", , _
           "Hello Data"

    'Clean up
    oConnection2.Close
    Set oConnection2 = Nothing
    Exit Sub

UpdateDataErr:
    If Err <> 0 Then
        HandleErrs "UpdateData", oConnection2
    End If

    If Not oConnection2 Is Nothing Then
        If oConnection2.State = adStateOpen Then oConnection2.Close
        Set oConnection2 = Nothing
    End If
End Sub

Private Sub WalkFields()
    On Error GoTo WalkFieldsErr

    Dim iFldCnt As Integer
    Dim oFields As ADODB.Fields
    Dim oField As ADODB.Field
    Dim sMsg As String

    Set oFields = m_oRecordset.Fields

    DisplayMsg "****** BEGIN FIELDS WALK ******"

    For iFldCnt = 0 To (oFields.Count - 1)
        Set oField = oFields(iFldCnt)
        sMsg = ""
        sMsg = sMsg & oField.Name
        sMsg = sMsg & vbTab & "Type: " & GetTypeAsString(oField.Type)
        sMsg = sMsg & vbTab & "Defined Size: " & oField.DefinedSize
        sMsg = sMsg & vbTab & "Actual Size: " & oField.ActualSize

        grdDisplay1.SelStartCol = iFldCnt
        grdDisplay1.SelEndCol = iFldCnt
        DisplayMsg sMsg
        MsgBox sMsg, , "Hello Data"
    Next iFldCnt

    DisplayMsg "****** END FIELDS WALK ******" & vbCrLf

    'Clean up
    Set oField = Nothing
    Set oFields = Nothing
    Exit Sub

WalkFieldsErr:
    Set oField = Nothing
    Set oFields = Nothing

    If Err <> 0 Then
        MsgBox Err.Source & "-->" & Err.Description, , "Error"
    End If
End Sub

Private Function GetTypeAsString(dtType As ADODB.DataTypeEnum) As String
    ' To save space, we are only checking for data types
    ' that we know are present.
    Select Case dtType
        Case adChar
            GetTypeAsString = "adChar"
        Case adVarChar
            GetTypeAsString = "adVarChar"
        Case adVarWChar
            GetTypeAsString = "adVarWChar"
        Case adCurrency
            GetTypeAsString = "adCurrency"
        Case adInteger
            GetTypeAsString = "adInteger"
    End Select
End Function

Private Sub HandleErrs(sSource As String, ByRef m_oConnection As ADODB.Connection)
    DisplayMsg "ADO (OLE) ERROR IN " & sSource
    DisplayMsg vbTab & "Error: " & Err.Number
    DisplayMsg vbTab & "Description: " & Err.Description
    DisplayMsg vbTab & "Source: " & Err.Source

    If Not m_oConnection Is Nothing Then
        If m_oConnection.Errors.Count <> 0 Then
            DisplayMsg "PROVIDER ERROR"
            Dim oError1 As ADODB.Error
            For Each oError1 In m_oConnection.Errors
                DisplayMsg vbTab & "Error: " & oError1.Number
                DisplayMsg vbTab & "Description: " & oError1.Description
                DisplayMsg vbTab & "Source: " & oError1.Source
                DisplayMsg vbTab & "Native Error:" & oError1.NativeError
                DisplayMsg vbTab & "SQL State: " & oError1.SQLState
            Next oError1
            m_oConnection.Errors.Clear
            Set oError1 = Nothing
        End If
    End If

    MsgBox "Error(s) occurred. See txtDisplay1 for specific information.", , _
           "Hello Data"

    Err.Clear
End Sub

Private Sub DisplayMsg(sText As String)
    txtDisplay1.Text = (txtDisplay1.Text & vbCrLf & sText)
End Sub

Private Sub Form_Resize()
    grdDisplay1.Move 100, 700, Me.ScaleWidth - 200, (Me.ScaleHeight - 800) / 2
    txtDisplay1.Move 100, grdDisplay1.Top + grdDisplay1.Height + 100, _
                    Me.ScaleWidth - 200, (Me.ScaleHeight - 1000) / 2
End Sub

Private Sub Form_Load()
    cmdGetData.Enabled = True
    cmdExamineData.Enabled = False
    cmdEditData.Enabled = False
    cmdUpdateData.Enabled = False

    grdDisplay1.AllowAddNew = False
    grdDisplay1.AllowDelete = False
    grdDisplay1.AllowUpdate = False
    m_flgPriceUpdated = False
End Sub

Private Sub Form_Unload(Cancel As Integer)
    On Error GoTo ErrHandler:

    Dim oConnection3 As New ADODB.Connection
    Dim sSQL As String
    Dim lAffected As Long

    ' Undo the changes we've made to the database on the server.
    If m_flgPriceUpdated Then
        sSQL = "UPDATE Products SET UnitPrice=(UnitPrice/1.1) " & _
            "WHERE CategoryID=2"
        oConnection3.Open m_sConnStr
        oConnection3.Execute sSQL, lAffected, adCmdText

        MsgBox "Restored prices for " & CStr(lAffected) & _
            " records affected.", , "Hello Data"
    End If

    'Clean up
    oConnection3.Close
    Set oConnection3 = Nothing
    m_oRecordset.Close
    Set m_oRecordset = Nothing
    Exit Sub

ErrHandler:

    If Not oConnection3 Is Nothing Then
        If oConnection3.State = adStateOpen Then oConnection3.Close
        Set oConnection3 = Nothing
    End If
    If Not m_oRecordset Is Nothing Then
        If m_oRecordset.State = adStateOpen Then m_oRecordset.Close
        Set m_oRecordset = Nothing
    End If
End Sub

'EndHelloData


Fournisseurs OLE DB

L'Introduction du Guide du programmeur ADO décrit la relation qui existe entre ADO et le reste de l'architecture Microsoft Data Access. OLE DB définit un ensemble d'interfaces COM qui offrent aux applications un accès uniforme aux données stockées dans différentes sources d'informations. Cette approche permet à une source de données de partager ses données via des interfaces qui prennent en charge les fonctionnalités SGBD nécessaires à la source de données. Par conception, l'architecture OLE DB très performante repose sur l'utilisation d'un modèle souple de services à base de composants. Plutôt que de disposer d'un nombre de couches intermédiaires imposé entre l'application et les données, OLE DB nécessite uniquement le nombre de composants requis pour accomplir une tâche donnée.

Supposons par exemple qu'un exemple souhaite exécuter une requête. Prenez les scénarios suivants :

  • Les données résident dans une base de données relationnelles pour laquelle il existe actuellement un pilote ODBC mais pas de fournisseur OLE DB natif : l'application utilise ADO pour communiquer avec le fournisseur OLE DB pour ODBC, qui charge ensuite le pilote ODBC approprié. Le pilote transmet l'instruction SQL au SGBD, qui récupère les données.
  • Les données résident dans Microsoft SQL Server pour lequel il existe un fournisseur OLE DB natif : l'application utilise ADO pour communiquer directement avec le Fournisseur OLE DB pour Microsoft SQL Server. Aucun intermédiaire n'est requis.
  • Les données résident dans Microsoft Exchange Server, pour lequel il existe un fournisseur OLE DB mais qui ne dispose pas d'un moteur permettant de traiter les requêtes SQL : l'application utilise ADO pour communiquer avec le Fournisseur OLE DB pour Microsoft Exchange et fait appel à un composant de traitement des requêtes OLE DB pour traiter les requêtes.
  • Les données résident dans le système de fichiers Microsoft NTFS sous forme de documents : on accède aux données à l'aide d'un fournisseur OLE DB natif via le service d'indexation Microsoft, qui indexe le contenu et les propriétés des documents dans le système de fichiers afin de permettre de réaliser des recherches de contenu efficaces.

Dans tous les exemples précédents, l'application est en mesure de lancer des requêtes sur les données. Les besoins de l'utilisateur sont satisfaits à l'aide d'un nombre minimum de composants. Dans chaque cas, des composants supplémentaires sont utilisés uniquement s'ils sont nécessaires et seuls les composants requis sont appelés. Ce chargement à la demande de composants réutilisables et partageables contribue grandement au niveau de performance élevé que l'on constate lorsqu'on utilise OLE DB.

Les fournisseurs appartiennent à deux catégories : les fournisseurs de données et les fournisseurs de services. Un fournisseur de données possède ses propres données qu'il présente sous forme de tableaux dans votre application. Un fournisseur de services encapsule un service en produisant et en consommant des données, et augmente les fonctionnalités de vos applications ADO. Un fournisseur de services peut encore être décrit comme un composant service, qui doit travailler en collaboration avec les autres fournisseurs de service, ou composants service.

ADO fournit une interface de haut niveau et cohérente vis-à-vis des différents fournisseurs OLE DB.


Fournisseurs de données

Les fournisseurs de données représentent différentes sources de données telles que des bases de données SQL, des fichiers séquentiels indexés, des feuilles de calcul, des magasins de documents et des fichiers de courrier. Les fournisseur exposent les données de manière uniforme à l'aide d'une abstraction commune que l'on appelle un ensemble de lignes.

ADO tient sa puissance et sa flexibilité du fait qu'il peut se connecter à différents types de fournisseurs de données en utilisant le même modèle de programmation, quelles que soient les fonctionnalités du fournisseur. Toutefois, étant donné que chaque fournisseur de données est unique, la manière avec laquelle votre application interagit avec ADO varie en fonction du fournisseur de données.

Par exemple, les capacités et fonctionnalités du Fournisseur OLE DB pour SQL Server, qui est utilisé pour accéder aux bases de données Microsoft SQL Server, sont considérablement différentes de celles du Fournisseur Microsoft OLE DB Provider pour Internet Publishing, utilisé pour accéder aux magasins de fichiers d'un serveur Web.


Fournisseurs et composants de services

Les fournisseurs de services sont des composants qui étendent les fonctionnalités des fournisseurs de données par l'intermédiaire d'interfaces étendues qui ne sont pas «nativement » prises en charge par le magasin de données.

Microsoft Data Access offre une architecture à base de composants qui permet à des composants individuels et spécialisés d'implémenter des ensembles discrets de fonctionnalités de base de données, ou « services », au-dessus de magasins moins performants. Ainsi, plutôt que de forcer chaque magasin de données à fournir sa propre implémentation de fonctionnalités étendue ou de forcer les applications génériques à implémenter des fonctionnalités de base de données en interne, les composants service offrent une implémentation commune que tout application peut utiliser en accédant à n'importe quel magasin de données. Le fait que certaines fonctionnalités soient implémentées nativement par le magasin de données et d'autres par des composants génériques est transparent pour l'application.

Par exemple, un moteur de curseur tel que le Microsoft Cursor Service pour OLE DB, est un composant de service qui peut consommer des données à partir d'un magasin de données séquentiel, à défilement en avant seulement pour produire des données défilables. D'autres fournisseurs de service communément utilisés par ADO comprennent le Fournisseur de persistance Microsoft OLE DB (pour enregistrer les données dans un fichier), le Microsoft Data Shaping Service pour OLE DB (pour les Recordsets hiérarchiques) et le Microsoft OLE DB Remoting Provider (pour invoquer les fournisseurs de données sur un ordinateur distant).

Pour plus d'informations sur les fournisseurs de services et de données, consultez Annexe A : Fournisseurs.


Erreurs

Toute opération liée aux objets ADO peut générer une ou plusieurs erreurs du fournisseur. À mesure que chaque erreur se produit, un ou plusieurs objets Error sont placés dans la collection Errors de l'objet Connection. Pour plus d'informations sur la gestion des avertissements et des erreurs dans votre application ADO, consultez le Chapitre 6 : Gestion des erreurs.

Les erreurs d'application peuvent être générées par un mécanisme distinct. Par exemple, en Visual Basic, l'objet Err contiendra des erreurs de niveau application.


Chapitre 2 : Obtention des données

Le chapitre précédent a présenté quatre opérations importantes impliquées dans la création d'une application ADO : obtenir, examiner, modifier et mettre à jour les données. Le présent chapitre s'intéresse aux détails des concepts associés à la première de ces opérations : l'obtention des données.

Plusieurs objets ADO peuvent jouer un rôle dans cette opération. Vous devez d'abord vous connecter à la source des données à l'aide d'un objet Connection ADO (qui sera parfois créé implicitement). Vous transmettez ensuite des instructions à la source de données sur ce que vous voulez faire à l'aide d'un objet Command ADO (qui peut être également créé implicitement). Le résultat de la transmission d'une commande à une source de données et à la réception de sa réponse sera généralement représenté dans un objet Recordset ADO.

Pour obtenir des données, votre application doit être en communication avec un source de données, comme un système SGBD, un magasin de données ou un fichier de texte délimité par des virgules. Cette communication représente une connection, l'environnement nécessaire à l'échange de données.

Le modèle d'objet ADO représente le concept d'une connexion avec l'objet Connection, la fondation sur laquelle l'essentiel de la fonctionnalité ADI repose. L'objectif de l'objet Connection est de :

  • définir les informations nécessaires à ADO pour communiquer avec les sources de données et créer des sessions ;
  • définir les capacités transactionnelles de la session ;
  • vous permettre de créer et d'exécuter des commandes sur la source de données ;
  • fournir des informations sur la conception de la source de données sous-jacente sous la forme d'ensembles de lignes de schéma. Pour plus d'informations sur les ensembles de lignes de schéma, consultez OpenSchema, méthode.


Établissement d'une connexion

Pour vous connecter à une source de données, vous devez spécifier une chaîne de connexion, dont les paramètres peuvent différer pour chaque fournisseur et chaque source de données. Pour plus d'informations, consultez Création de la chaîne de connexion.

En règle générale, ADO ouvre une connexion à l'aide de la méthode Open de l'objet Connection. La syntaxe de la méthode Open est indiquée ici :

Dim connection as New ADODB.Connection
connection.Open ConnectionString, UserID, Password, OpenOptions

Par ailleurs, vous pouvez faire appel à une technique de raccourci, Recordset.Open, pour ouvrir une connexion implicite et émettre une commande sur cette connexion en une seule opération. Pour ce faire, transmettez une chaîne de connexion valide comme argument ActiveConnection de la méthode Open. Voici la syntaxe de chaque méthode dans Visual Basic :

Dim recordset as ADODB.Recordset
Set recordset = New ADODB.Recordset
recordset.Open Source, ActiveConnection, CursorType, LockType, Options
Note Quand devrez-vous utiliser un objet Connection plutôt que le raccourci Recordset.Open ? Utilisez l'objet Connection si vous avez l'intention d'ouvrir plusieurs objets Recordset, ou lorsque vous exécutez plusieurs commandes. Une connexion est encore créée implicitement par ADO lorsque vous utilisez le raccourci Recordset.Open.


Utilisation de l'objet Connection

Un objet Connection représente une session unique avec une source de données. Dans le cas d'un système de base de données client/serveur, il peut correspondre à une connexion réseau au serveur. Selon les fonctionnalités prises en charge par le fournisseur, certaines collections, méthodes ou propriétés d'un objet Connection peuvent ne pas être disponibles.

Avant d'ouvrir un objet Connection, vous devez définir certaines informations sur la source de données et le type de connexion. Le paramètre ConnectionString de la méthode Open de l'objet Connection —ou la propriété ConnectionString de l'objet Connection —contient la plupart de ces informations. Une chaîne de connexion est une chaîne de caractères qui définit un nombre variable d'arguments. Les arguments—certains requis par ADO, d'autres spécifiques à des fournisseurs—contiennent des informations dont l'objet Connection doit disposer pour effectuer son travail. Les arguments qui composent le paramètre ConnectionString sont séparés à l'aide de points-virgules (;).

Note Vous pouvez également spécifier un nom de source de données (DSN) ODBC ou un fichier de liens de données (UDL) dans une chaîne de connexion. Pour plus d'information sur les DSN, consultez Data Sources dans la partie 1 du guide ODBC Programmer's Reference (en anglais). Pour plus d'informations sur les UDL, consultez Data Link API Overview dans le guide OLE DB Programmer's Reference (en anglais).


Création de la chaîne de connexion

ADO prend directement en charge cinq arguments dans une chaîne de connexion. D'autres arguments sont passés au fournisseur nommé dans l'argument Provider, sans être traités par ADO.

Argument | Description
Provider | Nom du fournisseur utilisé pour la connexion.
File Name | Nom d'un fichier spécifique du fournisseur (par exemple, un objet de source de données rendu persistant) qui contient des informations de connexion prédéfinies.
URL | Spécifie la chaîne de connexion sous la forme d'une URL absolue identifiant une ressource telle qu'un fichier ou un répertoire.
Remote Provider | Nom du fournisseur à utiliser pour ouvrir une connexion côté client. (Remote Data Service uniquement.)
Remote Server | Nom du chemin du serveur à utiliser pour ouvrir une connexion côté client. (Remote Data Service uniquement.)
Note Dans les exemples suivants et dans le Guide du programmeur ADO, le numéro d'identification utilisateur « MyId » associé au mot de passe « 123aBc » permet de s'authentifier vis-à-vis du serveur. Remplacez ces valeurs par les informations d'accès que vous utilisez pour vous connecter à votre serveur. Remplacez également « MySqlServer » par le nom de votre serveur.

L'application HelloData du chapitre 1 a utilisé la chaîne de connexion suivante :

m_sConnStr = "Provider='SQLOLEDB';Data Source='MySqlServer';" & _
             "Initial Catalog='Northwind';Integrated Security='SSPI';"

Le seul paramètre ADO fourni dans cette chaîne de connexion était « Provider=SQLOLEDB », qui indiquait le fournisseur OLE DB Microsoft pour SQL Server. Les autres paramètres valides pouvant être transmis dans la chaîne de connexion peuvent être déterminés par référence à la documentation des fournisseurs individuels. Selon la documentation du fournisseur OLE DB pour SQL Server, vous pouvez remplacer « Server » par le paramètre Data Source et « Database » par le paramètre Initial Catalog. Dans ces conditions, la chaîne de connexion produira des résultats identique aux premiers :

m_sConnStr = "Provider='SQLOLEDB';Server='MySqlServer';" & _
             "Database='Northwind';Integrated Security='SSPI';"

Pour ouvrir la connexion, transmettez la chaîne de connexion comme premier argument de la méthode Open de l'objet Connection :

objConn.Open m_sConnStr

Il est également possible pour fournir nombre de ces informations en définissant les propriétés de l'objet Connection avant d'ouvrir la connexion. Par exemple, vous pourriez obtenir le même résultat qu'avec la chaîne de connexion ci-dessus avec le code suivant :

With objConn
   .Provider = "SQLOLEDB"
   .DefaultDatabase = "Northwind"
   .Properties("Data Source") = "MySqlServer"
   .Properties("Integrated Security") = "SSPI"
   .Open
End With


Contrôle des transactions

Une transaction délimite le début et la fin d'une série d'opérations d'accès à des données effectuées lors d'une connexion. Selon les capacités de transaction de votre source de données, l'objet Connection vous permet également de créer et de gérer des transactions. Par exemple, si vous utilisez le fournisseur Microsoft OLE DB pour SQL Server pour accéder à une base de données sur Microsoft SQL Server 2000, vous pouvez créer plusieurs transactions imbriquées pour les commandes que vous exécutez.

ADO veille à ce que les modifications résultant d'opérations dans une source de données soient apportées toutes ensembles ou pas du tout.

Si vous annulez la transaction ou qu'une de ses opérations échoue, aucune opération interne à la transaction n'aboutira. La source de données n'est donc pas modifiée par la transaction.

Le modèle d'objet ADO n'inclut pas explicitement de transactions, mais les représente à l'aide d'un ensemble de méthodes d'objets Connection (BeginTrans, CommitTrans et RollbackTrans).

Pour plus d'informations sur les transactions, consultez Chapitre 5 : Mise à jour et persistance des données.


Utilisation de l'objet Command

Une fois effectuée la connexion à une source de données, vous devez exécuter des demandes par rapport à cette dernière pour obtenir des jeux de résultats. ADO encapsule ce type de fonctionnalité de commande dans l'objet Command.

L'objet Command vous permet de demander n'importe quel type d'opération au fournisseur, en supposant que ce dernier interprète correctement la chaîne de commande. En règle générale, les fournisseurs de données interrogent une base de données et renvoient des enregistrements dans un objet Recordset. Les objets Recordset sont traités ultérieurement dans d'autres chapitres, y compris celui-ci ; en attendant, ils doivent être considérés comme des outils qui permettent de conserver et de consulter des jeux de résultats. À l'instar de nombreux objets ADO, selon la fonctionnalité du fournisseur, certaines collections, méthodes ou propriétés d'objet Command risquent de générer des erreurs lorsqu'elles sont référencées.

Il n'est pas toujours nécessaire de créer un objet Command pour exécuter une commande sur une source de données. Vous pouvez utiliser la méthode Execute sur l'objet Connection ou la méthode Open sur l'objet Recordset. Cependant, vous devez recourir à un objet Command pour réutiliser une commande dans votre code ou pour transmettre des informations détaillées sur des paramètres en même temps que votre commande. Ces scénarios sont approfondis ultérieurement au cours de ce chapitre.

Remarque Certains objets Command peuvent renvoyer un jeu de résultats sous forme d'un flux binaire ou d'un Record unique au lieu d'un Recordset, si cela est pris en charge par le fournisseur. De même, certains objets Command ne sont pas destinés à renvoyer des jeux de résultats (par exemple, une requête SQL Update). Ce chapitre décrit le scénario le plus courant, à savoir l'exécution d'objets Command qui renvoient des résultats dans un objet Recordset. Pour plus d'informations sur le renvoi de résultats dans des objets Record ou Stream, consultez le Chapitre 10 : Objets Record et Stream.


Vue d'ensemble de l'objet Command

Avec les collections, méthodes et propriétés d'un objet Command, vous pouvez :

  • Définir le texte exécutable de la commande (par exemple, une instruction SQL ou une procédure stockée) à l'aide de la propriété CommandText.
  • Définir des requêtes paramétrées ou des arguments de procédures stockées à l'aide d'objets Parameter et de la collection Parameters.
  • Exécuter une commande et renvoyer un objet Recordset, le cas échéant, à l'aide de la méthode Execute.
  • Spécifier le type de commande avant son exécution, à l'aide de la propriété CommandType, afin d'optimiser les performances.
  • Vérifier si le fournisseur sauvegarde ou non une version préparée (c'est-à-dire compilée) de la commande avant son exécution, à l'aide de la propriété Prepared.
  • Définir le délai d'attente (en secondes) observé par le fournisseur pour l'exécution d'une commande à l'aide de la propriété CommandTimeout.
  • Associer une connexion ouverte à un objet Command en définissant sa propriété ActiveConnection ;
  • Définir la propriété Name afin d'identifier l'objet Command en tant que méthode sur l'objet Connection associé.
  • Passer un objet Command à la propriété Source d'un Recordset pour obtenir des données.

© 1998-2002 Microsoft Corporation. Tous droits réservés.


Création et exécution d'une commande simple

Bien qu'il ne s'agisse pas de l'usage habituel de l'objet Command, le code ci-dessous illustre la méthode de base d'utilisation de l'objet Command pour exécuter une commande sur une source de données. Dans le cas présent, il s'agit d'une commande de renvoi de lignes, qui renvoie les résultats d'exécution de la commande dans un objet Recordset.

    'BeginBasicCmd
    On Error GoTo ErrHandler:

    Dim objConn As New ADODB.Connection
    Dim objCmd As New ADODB.Command
    Dim objRs As New ADODB.Recordset

    objCmd.CommandText = "SELECT OrderID, OrderDate, " & _
                         "RequiredDate, ShippedDate " & _
                         "FROM Orders " & _
                         "WHERE CustomerID = 'ALFKI' " & _
                         "ORDER BY OrderID"
    objCmd.CommandType = adCmdText

    ' Connect to the data source.
    Set objConn = GetNewConnection
    objCmd.ActiveConnection = objConn

    ' Execute once and display...
    Set objRs = objCmd.Execute

    Debug.Print "ALFKI"
    Do While Not objRs.EOF
        Debug.Print vbTab & objRs(0) & vbTab & objRs(1) & vbTab & _
                    objRs(2) & vbTab & objRs(3)
        objRs.MoveNext
    Loop

    'clean up
    objRs.Close
    objConn.Close
    Set objRs = Nothing
    Set objConn = Nothing
    Set objCmd = Nothing
    Exit Sub

ErrHandler:
    'clean up
    If objRs.State = adStateOpen Then
        objRs.Close
    End If

    If objConn.State = adStateOpen Then
        objConn.Close
    End If

    Set objRs = Nothing
    Set objConn = Nothing
    Set objCmd = Nothing

    If Err <> 0 Then
        MsgBox Err.Source & "-->" & Err.Description, , "Error"
    End If
'EndBasicCmd

La commande à exécuter est spécifiée à l'aide de la propriété CommandText.

Note Plusieurs exemples de cette section appellent une fonction utilitaire, GetNewConnection, afin d'établir une connexion avec le fournisseur de données. Pour éviter la redondance, elle n'est listée qu'une seule fois, ici :
'BeginNewConnection
Private Function GetNewConnection() As ADODB.Connection
    Dim oCn As New ADODB.Connection
    Dim sCnStr As String

    sCnStr = "Provider='SQLOLEDB';Data Source='MySqlServer';" & _
             "Integrated Security='SSPI';Database='Northwind';"
    oCn.Open sCnStr

    If oCn.State = adStateOpen Then
        Set GetNewConnection = oCn
    End If

End Function
'EndNewConnection


Paramètres de l'objet Command

L'exemple suivant illustre une utilisation plus intéressante qui peut être faite de l'objet Command, dans laquelle le texte de la commande SQL a été modifié pour la rendre paramétrée. Cela permet de réutiliser la commande, et de transmettre une valeur différente pour le paramètre à chaque fois. Étant donné que la propriété Prepared de l'objet Command est définie comme True, ADO nécessite que le fournisseur compile la commande spécifiée dans CommandText avant de l'exécuter pour la première fois. Il retient également la commande compilée en mémoire. Cela ralentit légèrement l'exécution de la commande la première fois qu'elle est exécutée en raison du travail nécessaire à sa préparation, mais produit des gains de performances chaque fois que la commande est appelée par la suite. Par conséquent, les commandes ne doivent être préparées que si elles doivent être utilisées plusieurs fois.

'BeginManualParamCmd
    On Error GoTo ErrHandler:

    Dim objConn As New ADODB.Connection
    Dim objCmd As New ADODB.Command
    Dim objParm1 As New ADODB.Parameter
    Dim objRs As New ADODB.Recordset

    ' Set the CommandText as a parameterized SQL query.
    objCmd.CommandText = "SELECT OrderID, OrderDate, " & _
                         "RequiredDate, ShippedDate " & _
                         "FROM Orders " & _
                         "WHERE CustomerID = ? " & _
                         "ORDER BY OrderID"
    objCmd.CommandType = adCmdText

    ' Prepare command since we will be executing it more than once.
    objCmd.Prepared = True

    ' Create new parameter for CustomerID. Initial value is ALFKI.
    Set objParm1 = objCmd.CreateParameter("CustId", adChar, _
                    adParamInput, 5, "ALFKI")
    objCmd.Parameters.Append objParm1

    ' Connect to the data source.
    Set objConn = GetNewConnection
    objCmd.ActiveConnection = objConn

    ' Execute once and display...
    Set objRs = objCmd.Execute

    Debug.Print objParm1.Value
    Do While Not objRs.EOF
        Debug.Print vbTab & objRs(0) & vbTab & objRs(1) & vbTab & _
                    objRs(2) & vbTab & objRs(3)
        objRs.MoveNext
    Loop

    ' ...then set new param value, re-execute command, and display.
    objCmd("CustId") = "CACTU"
    Set objRs = objCmd.Execute

    Debug.Print objParm1.Value
    Do While Not objRs.EOF
        Debug.Print vbTab & objRs(0) & vbTab & objRs(1) & vbTab & _
                    objRs(2) & vbTab & objRs(3)
        objRs.MoveNext
    Loop

    'clean up
    objRs.Close
    objConn.Close
    Set objRs = Nothing
    Set objConn = Nothing
    Set objCmd = Nothing
    Set objParm1 = Nothing
    Exit Sub

ErrHandler:
    'clean up
    If objRs.State = adStateOpen Then
        objRs.Close
    End If

    If objConn.State = adStateOpen Then
        objConn.Close
    End If

    Set objRs = Nothing
    Set objConn = Nothing
    Set objCmd = Nothing
    Set objParm1 = Nothing

    If Err <> 0 Then
        MsgBox Err.Source & "-->" & Err.Description, , "Error"
    End If
'EndManualParamCmd

Tous les fournisseurs ne prennent pas en charge les commandes préparées. Si le fournisseur ne prend pas en charge la préparation des commandes, il peut renvoyer une erreur dès que la propriété est définie comme True. S'il ne renvoie pas d'erreur, il ignore la requête de préparation de la commande et définit la propriété Prepared en False.


Appel d'une procédure stockée à l'aide d'une commande

Vous pouvez également utiliser une commande en appelant une procédure stockée. Le code suivant appelle une procédure stockée dans la base de données Northwind, appelée CustOrdersOrders, qui est définie comme suit :

CREATE PROCEDURE CustOrdersOrders @CustomerID nchar(5) AS
SELECT OrderID, OrderDate, RequiredDate, ShippedDate
FROM Orders
WHERE CustomerID = @CustomerID
ORDER BY OrderID

Cette procédure stockée est similaire à la commande utilisée dans Command Object Parameters, dans la mesure où elle prend le paramètre d'identification d'un client et renvoie les informations sur les commandes de ce client. Le code ci-dessous utilise cette procédure stockée en tant que source de Recordset ADO.

L'utilisation de la procédure stockée vous permet d'accéder à une autre capacité d'ADO : la méthode Refresh de la collection Parameters. Cette méthode permet à ADO de remplir automatiquement toutes les informations sur les paramètres requis par la commande lors de l'exécution. Cette technique pénalise les performances dans la mesure où ADO doit interroger la source de données sur les paramètres.

D'autres différences importantes existent entre le code ci-dessous et le code des Paramètres de l'objet Command, dans lequel les paramètres sont entrés manuellement. D'abord, ce code ne définit pas la propriété Prepared en True car il s'agit d'une procédure stockée SQL Server qui est, par définition, précompilée. Deuxièmement, la propriété CommandType de l'objet Command s'est changée en adCmdStoredProc dans le deuxième exemple pour informer ADO que la commande était une procédure stockée.

'BeginAutoParamCmd
    On Error GoTo ErrHandler:

    Dim objConn As New ADODB.Connection
    Dim objCmd As New ADODB.Command
    Dim objParm1 As New ADODB.Parameter
    Dim objRs As New ADODB.Recordset

    ' Set CommandText equal to the stored procedure name.
    objCmd.CommandText = "CustOrdersOrders"
    objCmd.CommandType = adCmdStoredProc

    ' Connect to the data source.
    Set objConn = GetNewConnection
    objCmd.ActiveConnection = objConn

    ' Automatically fill in parameter info from stored procedure.
    objCmd.Parameters.Refresh

    ' Set the param value.
    objCmd(1) = "ALFKI"

    ' Execute once and display...
    Set objRs = objCmd.Execute

    Debug.Print objParm1.Value
    Do While Not objRs.EOF
        Debug.Print vbTab & objRs(0) & vbTab & objRs(1) & vbTab & _
                    objRs(2) & vbTab & objRs(3)
        objRs.MoveNext
    Loop

    ' ...then set new param value, re-execute command, and display.
    objCmd(1) = "CACTU"
    Set objRs = objCmd.Execute

    Debug.Print objParm1.Value
    Do While Not objRs.EOF
        Debug.Print vbTab & objRs(0) & vbTab & objRs(1) & vbTab & _
                    objRs(2) & vbTab & objRs(3)
        objRs.MoveNext
    Loop

    'clean up
    objRs.Close
    objConn.Close
    Set objRs = Nothing
    Set objConn = Nothing
    Set objCmd = Nothing
    Set objParm1 = Nothing
    Exit Sub

ErrHandler:
    'clean up
    If objRs.State = adStateOpen Then
        objRs.Close
    End If

    If objConn.State = adStateOpen Then
        objConn.Close
    End If

    Set objRs = Nothing
    Set objConn = Nothing
    Set objCmd = Nothing
    Set objParm1 = Nothing

    If Err <> 0 Then
        MsgBox Err.Source & "-->" & Err.Description, , "Error"
    End If
'EndAutoParamCmd

© 1998-2002 Microsoft Corporation. Tous droits réservés.


Commandes nommées

Vous pouvez définir la propriété Name sur un objet Command puis exécuter la commande en l'appelant comme s'il s'agissait d'une méthode sur la propriété ActiveConnection de l'objet Command. Vous en trouverez l'illustration dans l'exemple suivant, dans lequel la commande est nommée GetCustomers. Notez que le code est transmis à la « méthode » GetCustomers dans un objet Recordset déclaré et instancié. Vous pouvez également transmettre des paramètres à la méthode s'ils sont requis par la Command.

'BeginNamedCmd
    On Error GoTo ErrHandler:

    Dim objConn As New ADODB.Connection
    Dim objCmd As New ADODB.Command
    Dim objRs As New ADODB.Recordset

    ' Connect to the data source.
    Set objConn = GetNewConnection

    objCmd.CommandText = "SELECT CustomerID, CompanyName FROM Customers"
    objCmd.CommandType = adCmdText

    'Name the command.
    objCmd.Name = "GetCustomers"

    objCmd.ActiveConnection = objConn

    ' Execute using Command.Name from the Connection.
    objConn.GetCustomers objRs

    ' Display.
    Do While Not objRs.EOF
        Debug.Print objRs(0) & vbTab & objRs(1)
        objRs.MoveNext
    Loop

    'clean up
    objRs.Close
    objConn.Close
    Set objRs = Nothing
    Set objConn = Nothing
    Set objCmd = Nothing
    Exit Sub

ErrHandler:
    'clean up
    If objRs.State = adStateOpen Then
        objRs.Close
    End If

    If objConn.State = adStateOpen Then
        objConn.Close
    End If

    Set objRs = Nothing
    Set objConn = Nothing
    Set objCmd = Nothing

    If Err <> 0 Then
        MsgBox Err.Source & "-->" & Err.Description, , "Error"
    End If
'EndNamedCmd


Ajout de données à un Recordset

Le Recordset est probablement l'objet ADO le plus employé. Dans ADO, un Recordset s'apparente à la combinaison d'un jeu de résultats d'une source de données et des comportements de ses curseurs associés. Par conséquent, vous pouvez mettre des données dans un Recordset puis utiliser les méthodes et propriétés du Recordset pour naviguer au sein des lignes de données, consulter les valeurs des lignes et manipuler le jeu de résultats en fonction de vos besoins.

Cette section s'attachera à l'ajout de données dans le Recordset. Pour plus d'informations sur la navigation au sein des données ou à la mise à jour des données, consultez le Chapitre 4 : Modification des données et le Chapitre 5 : Mise à jour et persistance des données. Vous n'avez pas toujours besoin d'utiliser les capacités avancées d'un objet Command pour ajouter votre jeu de résultats dans un Recordset. Vous pouvez souvent exécuter votre commande en définissant la propriété Source sur le Recordset ou en transmettant une chaîne de commande à la méthode Open de l'objet Recordset.

Il existe de nombreuses manières d'ajouter des données de votre source de données dans un Recordset. La technique que vous employez dépend des besoins de votre application et des capacités de votre fournisseur.


La méthode Open de l'objet Recordset

Tout ce qui est nécessaire à l'ouverture d'un Recordset ADO est intégré dans la méthode Open. Vous pouvez l'utiliser sans créer explicitement d'autres objets. La syntaxe de cette méthode est la suivante :

recordset.Open Source, ActiveConnection, CursorType, LockType, Options

Tous les arguments sont facultatifs car les informations qu'ils transmettent peuvent être communiqués à ADO par d'autres moyens. Toutefois, comprendre chaque argument vous aidera à comprendre de nombreux concepts ADO importants. Les rubriques suivantes examineront chacun des arguments de la méthode en détail.

Arguments Source et Options

Les arguments Source et Options apparaissent dans la même rubrique car ils sont étroitement liés.

recordset.Open Source, ActiveConnection, CursorType, LockType, Options

L'argument Source est une Variant qui évalue un objet Command valide, une commande textuelle (par exemple, une instruction SQL), un nom de table, un appel de procédure stockée, une URL, ou le nom d'un fichier ou d'un objet Stream qui contient un Recordset stocké de manière persistante. Si Source est un chemin d'accès à un fichier, il peut être un chemin complet (« C:\dir\file.rst »), un chemin relatif (« ..\file.rst »), ou une URL (« http://files/file.rst »). Vous pouvez également spécifier ces informations dans la propriété Source de l'objet Recordset et laisser l'argument Source vide.

L'argument Options est une valeur de type Long qui indique l'une et/ou l'autre des informations suivantes :

  • Comment le fournisseur doit évaluer l'argument Source s'il représente autre chose qu'un objet Command.
  • Si le Recordset doit être restauré d'un fichier où il avait été précédemment enregistré.

Cet argument peut contenir un masque binaire de valeurs CommandTypeEnum ou ExecuteOptionEnum. Une valeur CommandTypeEnum transmise dans l'argument Options définit la propriété CommandType du Recordset.

Note Les valeurs ExecuteOpenEnum de adExecuteNoRecords et adExecuteStream ne peuvent pas être utilisées avec la méthode Open.

Si la valeur de la propriété CommandType est égale à adCmdUnknown (la valeur par défaut), vous risquez de subir une baisse des performances, car ADO doit effectuer des appels au fournisseur afin de déterminer si la propriété CommandText est une instruction SQL, une procédure stockée ou un nom de table. Si vous savez quel type de commande vous utilisez, définir la propriété CommandType indique à ADO d'aller directement au code approprié. Si la propriété CommandType ne correspond pas au type de commande de la propriété CommandText, une erreur se produit lorsque vous appelez la méthode Open.

Pour plus d'informations sur l'utilisation de ces constantes énumérées pour Options et avec d'autres méthodes et propriétés ADO, consultez CommandTypeEnum et ExecuteOptionEnum.

Argument ActiveConnection

Vous pouvez transmettre un objet Connection ou une chaîne de connexion en tant qu'argument ActiveConnection.

recordset.Open Source, ActiveConnection, CursorType, LockType, Options

L'argument ActiveConnection correspond à la propriété ActiveConnection et spécifie dans quelle connexion ouvrir l'objet Recordset. Si vous passez une définition de connexion à cet argument, ADO ouvre une nouvelle connexion à l'aide des paramètres spécifiés. Après avoir ouvert le Recordset avec un curseur côté client (CursorLocation = adUseClient), vous pouvez changer la valeur de cette propriété pour envoyer des mises à jour à un autre fournisseur. Vous pouvez aussi définir cette propriété en Nothing (dans Microsoft Visual Basic) ou en NULL afin de déconnecter le Recordset de n'importe quel fournisseur. Changer ActiveConnection pour un curseur côté serveur génère toutefois une erreur.

Si vous transmettez un objet Command dans l'argument Source et transmettez également un argument ActiveConnection, une erreur se produit car la propriété ActiveConnection de l'objet Command doit déjà être définie en tant qu'objet Connection ou que chaîne de connexion valide.

Argument CursorType

recordset.Open Source, ActiveConnection, CursorType, LockType, Options

Comme expliqué dans La signification de l'emplacement du curseur, le type de curseur utilisé par votre application détermine quelles capacités sont disponibles dans le Recordset qui en résulte (s'il y en a). Pour un examen détaillé des types de curseur, consultez le Chapitre 8 : Curseurs et verrous.

L'argument CursorType peut accepter n'importe quelle valeur CursorTypeEnum.

Argument LockType

recordset.Open Source, ActiveConnection, CursorType, LockType, Options

Définissez l'argument LockType pour spécifier quel type de verrouillage le fournisseur doit utiliser pour ouvrir le Recordset. Les différents types de verrouillage sont traités dans le Chapitre 8 : Curseurs et verrous.

L'argument LockType peut accepter n'importe quelle valeur LockTypeEnum.

Extraction de plusieurs Recordsets

Vous devez de temps en temps exécuter une commande qui renvoie plusieurs jeux de résultats, telle la procédure stockée exécutée sur une base de données SQL Server de l'exemple suivant. La procédure stockée contient une clause COMPUTE pour renvoyer le prix moyen de tous les produits de la table. La définition de la procédure stockée est la suivante :

CREATE PROCEDURE ProductsWithAvgPrice
AS
SELECT ProductID, ProductName, UnitPrice
  FROM PRODUCTS
  COMPUTE AVG(UnitPrice)

Le Fournisseur OLE DB Microsoft pour SQL Server renvoie plusieurs jeux de résultats vers ADO lorsque la commande contient une clause COMPUTE. Par conséquent, le code ADO doit employer la méthode NextRecordset pour accéder aux données du deuxième jeu de résultats, comme illustré ci-dessous :

'BeginNextRs
    On Error GoTo ErrHandler:

    Dim objConn As New ADODB.Connection
    Dim objCmd As New ADODB.Command
    Dim objRs As New ADODB.Recordset

    Set objConn = GetNewConnection
    objCmd.ActiveConnection = objConn

    objCmd.CommandText = "ProductsWithAvgPrice"
    objCmd.CommandType = adCmdStoredProc

    Set objRs = objCmd.Execute

    Do While Not objRs.EOF
        Debug.Print objRs(0) & vbTab & objRs(1) & vbTab & _
                    objRs(2)
        objRs.MoveNext
    Loop

    Set objRs = objRs.NextRecordset

    Debug.Print "AVG. PRICE = $ " & objRs(0)

    'clean up
    objRs.Close
    objConn.Close
    Set objRs = Nothing
    Set objConn = Nothing
    Set objCmd = Nothing
    Exit Sub

ErrHandler:
    'clean up
    If objRs.State = adStateOpen Then
        objRs.Close
    End If

    If objConn.State = adStateOpen Then
        objConn.Close
    End If

    Set objRs = Nothing
    Set objConn = Nothing
    Set objCmd = Nothing

    If Err <> 0 Then
        MsgBox Err.Source & "-->" & Err.Description, , "Error"
    End If
'EndNextRs

Pour plus d'informations, consultez NextRecordset.


Chapitre 3 : Examen des données

Dans le chapitre 2, vous avez appris à récupérer des données dans une source de données sous forme d'objet Recordset. L'objet du présent chapitre est de décrire le Recordset de manière plus détaillée, notamment en matière de navigation à l'intérieur du Recordset et de consultation de ses données.

Le diagramme suivant illustre le modèle d'objet de l'objet Recordset. Pour plus d'informations, cliquez sur un objet ou sur une collection.

Les Recordsets ont des méthodes et des propriétés conçues pour faciliter la navigation à l'intérieur de ces jeux de résultats et pour examiner leur contenu. Suivant la fonctionnalité prise en charge par le fournisseur, certaines méthodes ou propriétés Recordset peuvent ne pas être disponibles. Pour continuer à explorer l'objet Recordset, imaginez un Recordset qui serait renvoyé de la base de données Microsoft SQL Server 2000 Les Comptoirs, à l'aide du code suivant :

'BeginRsTour
Public Sub RecordsetTour()
    On Error GoTo ErrHandler:

    Dim objRs As New ADODB.Recordset
    Dim strSQL As String

    strSQL = "SELECT ProductID, ProductName, UnitPrice FROM Products " & _
        "WHERE CategoryID = 7"          '7 = Produce

    objRs.Open strSQL, strConnStr, adOpenForwardOnly, _
        adLockReadOnly, adCmdText

    'Clean up
    objRs.Close
    Set objRs = Nothing
    Exit Sub

ErrHandler:
    If Not objRs Is Nothing Then
        If objRs.State = adStateOpen Then objRs.Close
        Set objRs = Nothing
    End If

    If Err <> 0 Then
        MsgBox Err.Source & "-->" & Err.Description, , "Error"
    End If
End Sub
'EndRsTour

Cette requête SQL renvoie un Recordset de cinq lignes (enregistrements) et trois colonnes (champs). Les valeurs de chaque ligne sont indiquées dans la table suivante.

CHAMP 0 Name = ProductID | CHAMP 1 Name = ProductName | CHAMP 2 Name = UnitPrice
7 | Uncle Bob's Organic Dried Pears | 30,0000
14 | Tofu | 23,2500
28 | Rssle Sauerkraut | 45,6000
51 | Manjimup Dried Apples | 53,0000
74 | Longlife Tofu | 10,0000

La section suivante décrit comment localiser la position courante du curseur dans cet exemple de Recordset.


Localisation de l'enregistrement actuel

La position courante du curseur dans le Recordset identifie la position de l'enregistrement courant. Partant du principe de la commande émise renvoie des résultats, le curseur est automatiquement placé au niveau du premier enregistrement lorsque la méthode Open du Recordset est appelée. Ainsi, avec l'exemple de Recordset, le curseur se trouverait sur le premier enregistrement, « Uncle Bob's Organic Dried Pears ».


Comptage des lignes

La propriété RecordCount renvoie une valeur de type Long qui indique le nombre d'enregistrements contenus dans le Recordset. Utilisez la propriété RecordCount pour découvrir combien d'enregistrements se trouvent dans un objet Recordset. La propriété renvoie la valeur -1 lorsque ADO ne peut pas déterminer le nombre d'enregistrements ou si le fournisseur ou le type de curseur ne prend pas en charge la propriété RecordCount. Lire la propriété RecordCount sur un Recordset fermé produit une erreur.

La propriété RecordCount dépend des capacités du fournisseur et du type de curseur. La propriété RecordCount renvoie -1 pour un curseur à défilement en avant seulement, renvoie le compte du nombre d'enregistrements pour un curseur statique ou à jeu de clés, et renvoie soit -1 soit le compte pour un curseur dynamique, selon la source de données.

L'exemple de Recordset présenté au chapitre Examen des données renverrait –1 car un curseur à défilement vers l'avant seulement a été ouvert. Pour utiliser la propriété RecordCount, vous devez ouvrir le Recordset avec un curseur plus sophistiqué (statique ou à jeu de clés).

Dans certains cas, votre fournisseur ou curseur peut être incapable de fournir la valeur RecordCount sans récupérer préalablement tous les enregistrements de la source de données. Pour imposer ce type de récupération, appelez la méthode MoveLast du Recordset avant d'appeler RecordCount.

Si vous deviez remplacer la ligne de code qui appelle la méthode Open du Recordset par la ligne ci-dessous :

oRs.Open sSQL, sCnStr, adOpenStatic, adLockOptimistic, adCmdText

vous pourriez utiliser la propriété RecordCount car les curseurs statiques du Fournisseur OLE DB Microsoft pour SQL Server prennent en charge RecordCount. Par exemple, le code suivant permet d'imprimer le nombre d'enregistrements renvoyés par la commande dans la fenêtre de débogage, à condition que le curseur prenne en charge la propriété RecordCount :

Debug.Print oRs.RecordCount   ' Output: 4

À partir de ce point, partez du principe que ces paramètres de types de curseurs et de verrous plus performants (et plus chers) sont utilisés.


Les limites d'un Recordset

Les propriétés BOF et EOF permettent de savoir si un objet Recordset contient des enregistrements ou si vous avez dépassé les limites d'un objet Recordset lorsque vous passez d'un enregistrement à l'autre. Considérez BOF et EOF comme des enregistrements « fantômes » qui sont positionnés au début et à la fin du Recordset. Sur la base de l'exemple de Recordset du chapitre Examen des données, il se présenterait comme suit :

ProductID | ProductName | UnitPrice
BOF |  |
7 | Uncle Bob's Organic Dried Pears | 30,0000
14 | Tofu | 23,2500
28 | Rssle Sauerkraut | 45,6000
51 | Manjimup Dried Apples | 53,0000
74 | Longlife Tofu | 10,0000
EOF |  |

La propriété BOF renvoie la valeur True (-1) si l'enregistrement actuel est positionné avant le premier enregistrement ; elle renvoie la valeur False (0) si l'enregistrement actuel est positionné sur ou après le premier enregistrement.

La propriété EOF renvoie la valeur True si l'enregistrement actuel est positionné après le dernier enregistrement ; elle renvoie la valeur False si l'enregistrement actuel est positionné sur ou avant le dernier enregistrement.

Si la propriété BOF ou la propriété EOF a la valeur True, il n'y a pas d'enregistrement courant, comme le montre le code suivant :

If oRs.BOF And oRs.EOF Then
    ' Command returned no records.
End If

Si vous ouvrez un objet Recordset qui ne contient aucun enregistrement, les propriétés BOF et EOF sont toutes deux définies comme True et la valeur de la propriété RecordCount de l'objet Recordset dépend du type du curseur. La valeur -1 sera renvoyée pour les curseurs dynamiques (CursorType = adOpenDynamic) et la valeur 0 pour les autres curseurs.

Lorsque vous ouvrez un objet Recordset qui contient au moins un enregistrement, le premier enregistrement est l'enregistrement courant et les propriétés BOF et EOF sont False.

Si vous supprimez le dernier enregistrement restant dans l'objet Recordset, le curseur est laissé dans un état indéterminé. Selon votre fournisseur, les propriétés BOF et EOF peuvent demeurer False jusqu'à ce que vous essayiez de repositionner l'enregistrement courant.


Navigation parmi les données

À présent que vous avez exécuté une commande sur la source de données et déterminé que le jeu de résultats contient des données, vous pouvez circuler parmi les résultats à l'aide des méthodes de navigation et des propriétés fournies par l'objet Recordset. Les rubriques suivantes décrivent comment utiliser ces méthodes et propriétés dans l'exemple de Recordset :

  • Accès direct à un enregistrement
  • Moyens supplémentaires d'accéder à un Recordset
  • Utilisation de signets
  • Utilisation de pages
  • Positionnement du Recordset


Accès direct à un enregistrement

La méthode Move vous permet d'avancer ou de reculer dans le Recordset d'un nombre spécifié d'enregistrements à l'aide de la syntaxe suivante :

oRs.Move NumRecords, Start

La méthode Move est prise en charge sur tous les objets Recordset.

Si l'argument NumRecords est supérieur à zéro, la position de l'enregistrement actuel se déplace vers l'avant (vers la fin de l'objet Recordset). Si NumRecords est inférieur à zéro, la position de l'enregistrement actuel se déplace vers l'arrière (vers le début de l'objet Recordset).

Si l'appel de méthode Move déplace la position de l'enregistrement courant à un endroit situé avant le premier enregistrement, ADO définit l'enregistrement courant à la position avant le premier enregistrement dans le Recordset (BOF est True). Toute tentative de recul alors que la propriété BOF est déjà True génère une erreur.

Si l'appel de méthode Move déplace la position de l'enregistrement courant à un endroit situé après le dernier enregistrement, ADO définit l'enregistrement courant à la position après le dernier enregistrement dans le Recordset (EOF est True). Toute tentative de mouvement en avant alors que la propriété EOF est déjà True génère une erreur.

Une erreur est également générée si vous appelez la méthode Move à partir d'un objet Recordset vide.

Si vous transmettez un signet dans l'argument Start, le déplacement s'effectue par rapport à l'enregistrement associé à ce signet, à condition que l'objet Recordset prenne en charge les signets. Un signet s'obtient à l'aide de la propriété Bookmark. Si vous ne la spécifiez pas, le déplacement s'effectue par rapport à l'enregistrement courant.

Si vous utilisez la propriété CacheSize pour placer dans la mémoire cache locale des enregistrements provenant du fournisseur, le fait de passer un argument NumRecords qui place la position de l'enregistrement actuel en dehors du groupe d'enregistrements actuellement en mémoire cache oblige ADO à extraire un nouveau groupe d'enregistrements à partir de l'enregistrement de destination. La propriété CacheSize détermine la taille du nouveau groupe à extraire et l'enregistrement de destination est le premier extrait.


Moyens supplémentaires d'accéder à un Recordset

Les quatre méthodes suivantes permettent de circuler, ou de défiler, dans le Recordset : MoveFirst, MoveLast, MoveNext et MovePrevious. (Certaines de ces méthodes ne fonctionnent pas sur les curseurs à défilement vers l'avant seulement.)

MoveFirst place l'enregistrement courant au premier enregistrement du Recordset. MoveLast place l'enregistrement courant au niveau du dernier enregistrement du Recordset. Pour utiliser MoveFirst ou MoveLast, l'objet Recordset doit prend en charge les signets ou les déplacements vers l'arrière du curseur, sans quoi l'appel de la méthode génère une erreur.

MoveNext déplace l'enregistrement courant d'une position vers l'avant. Si vous vous trouvez sur le dernier enregistrement au moment d'appeler MoveNext, EOF sera défini comme True. MovePrevious déplace l'enregistrement courant d'une position vers l'arrière. Si vous vous trouvez sur le premier enregistrement au moment d'appeler MovePrevious, BOF sera défini comme True. Il est préférable de vérifier les propriétés EOF et BOF lorsque vous utilisez ces méthodes, et de déplacer le curseur vers l'arrière jusqu'à une position d'enregistrement courant valide si vous partez de l'une ou l'autre extrémité du Recordset, comme illustré ici :

. . .
oRs.MoveNext
If oRs.EOF Then oRs.MoveLast
. . .

Ou, dans le cas de la méthode MovePrevious :

. . .
oRs.MovePrevious
If oRs.BOF Then oRs.MoveFirst
. . .

Dans les cas où le Recordset a été filtré ou trié et que les données de l'enregistrement courant ont été modifiées, la position peut également changer. Dans les cas de ce type, la méthode MoveNext fonctionne normalement, mais sachez que la position est déplacée d'un enregistrement vers l'avant depuis la nouvelle position, pas depuis l'ancienne position. Par exemple, changer les données dans l'enregistrement courant, de sorte que l'enregistrement soit placé à la fin du Recordset trié, signifierait qu'appeler la méthode MoveNext amènerait ADO à définir l'enregistrement courant à la position située après le dernier enregistrement du Recordset (EOF = True).

Le comportement des différentes méthodes Move de l'objet Recordset dépend, dans une certaine mesure, des données contenues dans le Recordset. Les nouveaux enregistrements ajoutés dans le Recordset sont initialement ajoutés dans un ordre particulier, qui est défini par la source de données et peut dépendre implicitement ou explicitement des données du nouvel enregistrement. Par exemple, si un tri ou une jointure est effectuée à l'intérieur de la requête qui remplit le Recordset, le nouvel enregistrement sera inséré à l'endroit approprié dans le Recordset. Si l'ordre n'est pas explicitement spécifié lors de la création du Recordset, les modifications apportées à l'implémentation de la source de données peuvent entraîner des modifications imprévues dans l'ordre des lignes renvoyées. De plus, les fonctions de tri, de filtrage et de modification du Recordset peuvent affecter l'ordre, voire les lignes du jeu d'enregistrements qui seront visibles.

Par conséquent, les méthodes MoveNext, MovePrevious, MoveFirst, MoveLast et Move sont toutes sensibles aux autres opérations effectuées sur le même Recordset. ADO essaiera toujours de conserver votre position courante tant que vous ne la déplacez pas explicitement, mais les différentes interventions opérées sur le jeu d'enregistrements peuvent rendre difficile de comprendre les effets d'un déplacement ultérieur. Par exemple, si vous appelez MoveFirst pour vous positionner sur la première ligne d'un Recordset trié et que vous changez l'ordre de tri de croissant en décroissant, vous n'avez pas changé de ligne, mais celle-ci est désormais la dernière du Recordset. MoveFirst vous place sur une autre ligne (ma nouvelle première ligne).

Autre exemple : si vous êtes positionné sur une ligne donnée au milieu d'un Recordset et que vous appelez successivement les méthodes Delete puis MoveNext, vous vous trouvez désormais sur l'enregistrement qui suit immédiatement l'enregistrement supprimé. Mais appeler la méthode MovePrevious transforme l'enregistrement qui précède celui que vous avez supprimé en enregistrement courant, car l'enregistrement supprimé n'est plus comptabilisé comme membre actif du Recordset.

Il est particulièrement difficile de définir des appellations de méthodes de déplacement cohérentes et valables d'un fournisseur à un autre, surtout lorsque ces méthodes produisent des déplacements relatifs à l'enregistrement courant—MovePrevious, MoveNext et Move—alors que les données de l'enregistrement courant sont changeantes. Par exemple, si vous travaillez sur un Recordset trié et filtré, et que vous changez les données de l'enregistrement courant de manière à ce qu'il précède tous les autres enregistrements, mais que les données que vous avez modifiées ne correspondent plus avec le filtre, il n'est pas évident de savoir où vous emmènera l'opération MoveNext. La conclusion la plus prudente consiste à dire qu'un déplacement relatif au sein d'un Recordset est plus risqué qu'un déplacement absolu (comme utiliser MoveFirst ou MoveLast) lorsque les données changent alors que les enregistrements sont modifiés, ajoutés ou supprimés. Le tri et le filtrage doivent être basés sur une clé primaire, ou un identificateur, car ce type de valeur ne change pas.


Utilisation de signets

Il est souvent utile de retourner directement à un enregistrement spécifique après avoir circulé dans le Recordset sans avoir à faire défiler tous les enregistrements et comparer les valeurs. Par exemple, si vous essayez de rechercher un enregistrement à l'aide de la méthode Find mais que la recherche ne renvoie aucun enregistrement, vous êtes automatiquement placé à l'une ou l'autre extrémité du Recordset. Si votre fournisseur les prend en charge, les signets peuvent être utiles pour marquer votre place avant d'utiliser la méthode Find pour pouvoir revenir à votre emplacement. Un signet est une valeur de type Variant qui identifie de manière unique un enregistrement dans un objet Recordset.

Vous pouvez également utiliser un tableau Variant de signets avec la méthode Filtrer du Recordset afin de filtrer un ensemble sélectionné d'enregistrements. Pour plus d'informations sur cette technique, consultez Filtrage des résultats dans la rubrique, Utilisation de Recordsets, plus loin dans ce chapitre.

Vous pouvez utiliser la propriété Bookmark pour placer un signet sur un enregistrement, ou définir l'enregistrement courant d'un objet Recordset comme étant l'enregistrement identifié par un signet valide. Le code suivant utilise la propriété Bookmark pour définir un signet, puis retourne à l'enregistrement marqué par un signet après s'être déplacé vers d'autres enregistrements. Pour déterminer si votre Recordset prend en charge les signets, utilisez la méthode Supports.

'BeginBookmarkEg
    Dim varBookmark As Variant
    Dim blnCanBkmrk As Boolean

    objRs.Open strSQL, strConnStr, adOpenStatic, adLockOptimistic, adCmdText

    If objRs.RecordCount > 4 Then
        objRs.Move 4                       ' move to the fifth record
        blnCanBkmrk = objRs.Supports(adBookmark)
        If blnCanBkmrk = True Then
            varBookmark = objRs.Bookmark   ' record the bookmark
            objRs.MoveLast                 ' move to a different record
            objRs.Bookmark = varBookmark   ' return to the bookmarked (sixth) record
        End If
    End If
'EndBookmarkEg

La méthode Supports est traitée plus en détail ultérieurement.

À l'exception des cas de Recordsets clonés, les signets sont uniques au Recordset dans lequel ils ont été créés, même si la même commande est utilisée. Cela signifie que vous ne pouvez pas utiliser un Bookmark provenant d'un Recordset pour vous déplacer au même enregistrement dans un deuxième Recordset ouvert avec la même commande.


Utilisation de pages

Utilisez la propriété PageCount pour déterminer combien de pages de données contient l'objet Recordset. Les Pages sont des groupes d'enregistrements sont la taille est égale à la valeur de la propriété PageSize. Même si la dernière page est incomplète car il y a moins d'enregistrements que dans la valeur PageSize, elle est comptabilisée comme une page supplémentaire dans la valeur PageCount. Si l'objet Recordset ne prend pas en charge cette propriété, la valeur PageCount sera de -1 pour indiquer que PageCount est indéterminable.

Utilisez la propriété PageSize pour déterminer combien d'enregistrements constituent une page logique de données. Le fait de définir la taille d'une page vous permet d'utiliser la propriété AbsolutePage pour atteindre le premier enregistrement d'une page particulière. Cette méthode est particulièrement utile avec les scénarios de serveur Web lorsque vous voulez permettre à l'utilisateur de regrouper les données par page et de consulter ainsi plusieurs enregistrements à la fois.

Cette propriété peut être définie à tout moment et sa valeur est utilisée pour calculer la position du premier enregistrement d'une page.

Utilisez la propriété AbsolutePage pour identifier le numéro de la page sur laquelle se trouve l'enregistrement courant. À nouveau, pour que cette propriété soit disponible, la fonctionnalité appropriée doit être prise en charge par le fournisseur de données.

AbsolutePage commence à la valeur 1 qui correspond au premier enregistrement du Recordset. Vous pouvez la définir pour qu'elle atteigne le premier enregistrement d'une page donnée. Le nombre total de pages peut être obtenu avec la propriété PageCount.


Positionnement du Recordset

Utilisez la propriété AbsolutePosition pour atteindre un enregistrement en fonction de son numéro d'ordre dans l'objet Recordset ou pour déterminer le numéro d'ordre de l'enregistrement actuel. Pour que cette propriété soit disponible, la fonctionnalité appropriée doit être prise en charge par le fournisseur de données.

AbsolutePosition commence à la valeur 1 qui correspond au premier enregistrement du Recordset. Comment mentionné précédemment, vous pouvez obtenir le nombre total d'enregistrements contenus dans l'objet Recordset à partir de la propriété RecordCount.

Lorsque vous définissez la propriété AbsolutePosition, même s'il s'agit d'un enregistrement se trouvant en mémoire cache, ADO recharge en mémoire cache un nouveau groupe d'enregistrements à partir de celui que vous avez spécifié. La propriété CacheSize définit la taille de ce groupe d'enregistrements.

Note Vous ne devez pas utiliser la propriété AbsolutePosition à la place du numéro d'enregistrement. La position d'un enregistrement change si vous supprimez un enregistrement en amont. Par ailleurs, la valeur AbsolutePosition d'un enregistrement donné n'est pas obligatoirement la même à chaque fois que l'objet Recordset est interrogé ou ouvert une nouvelle fois. Les signets restent la méthode la plus commode pour enregistrer une position et la retrouver ; ils constituent également la seule méthode de positionnement parmi tous les types d'objets Recordset.


Structure du Recordset

Chaque Recordset dispose d'une collection de Fields composée d'un ou plusieurs objets Field. Un objet Field représente généralement une colonne de table. Les rubriques suivantes expliquent comment naviguer à l'intérieur d'un collection de Fields et comment recueillir des informations sur chaque champ. Elles indiqueront ensuite de quel type d'information l'objet Field met à votre disposition ainsi que comment l'utiliser.

  • La collection Fields
  • L'objet Field
  • Utilisation de Recordsets


La collection Fields

La collection Fields est l'une des collections intrinsèques d'ADO. Une collection est un ensemble ordonné d'éléments auquel on peut faire référence comme à une unité. Pour plus d'informations sur les collections ADO, consultez Le modèle d'objet ADO dans le Chapitre 1.

La collection Fields contient un objet Field pour chaque champ (colonne) du Recordset. Comme toutes les collections ADO, elle possède des propriétés Count et Item, ainsi que des méthodes Append et Refresh. Elle dispose également de méthodes CancelUpdate, Delete, Resync et Update, qui ne sont pas disponibles aux autres collections ADO.

Examen de la collection Fields

Considérez la collection Fields de l'exemple de Recordset présenté dans ce chapitre. L'exemple de Recordset dérive de l'instruction SQL

SELECT ProductID, ProductName, UnitPrice FROM Products WHERE CategoryID = 7

Par conséquent, vous devriez trouver que la collection Fields du Recordset contient trois champs.

'BeginWalkFields
    Dim objFields As ADODB.Fields

    objRs.Open strSQL, strConnStr, adOpenForwardOnly, adLockReadOnly, adCmdText

    Set objFields = objRs.Fields

    For intLoop = 0 To (objFields.Count - 1)
        Debug.Print objFields.Item(intLoop).Name
    Next
'EndWalkFields

Ce code détermine simplement le nombre d'objets Field contenus dans la collection Fields à l'aide de la propriété Count et s'exécute en boucle dans la collection, renvoyant la valeur de la propriété Name de chaque objet Field. Vous pouvez utiliser de nombreuses autres propriétés Field pour recueillir des informations sur un champ. Pour plus d'informations sur l'interrogation d'un Field, consultez L'objet Field.

Comptage des colonnes

Comme vous l'avez sans doute deviné, la propriété Count renvoie le nombre véritable d'objets Field qui sont contenus dans la collection Fields. Étant donné que la numérotation des membres d'une collection commence à zéro, vous devez toujours faire en sorte dans le code que les boucles commencent toujours avec le membre zéro et se terminent par la valeur de la propriété Count moins 1. Si vous utilisez Microsoft Visual Basic et souhaitez exécuter une boucle sur les membres d'une collection sans vérifier la propriété Count, utilisez la commande For Each...Next.

Si la valeur de la propriété Count est zéro, cela signifie qu'il n'y a aucun objet dans la collection.

Accès au Field

Comme avec n'importe quelle collection ADO, la propriété Item est la propriété par défaut de la collection. Elle renvoie l'objet Field individuel spécifié par le nom ou l'index qui lui est transmis. Par conséquent, les instructions suivantes sont équivalentes pour l'exemple de Recordset:

objField = objRecordset.Fields.Item("ProductID")
objField = objRecordset.Fields("ProductID")
objField = objRecordset.Fields.Item(0)
objField = objRecordset.Fields(0)

Si ces méthodes sont équivalentes, laquelle est la meilleure ? Cela dépend. Utiliser un index pour récupérer un Field dans la collection est plus rapide car il accède au Field directement, sans devoir effectuer une consultation de chaîne. D'un autre côté, l'ordre des Fields au sein de la collection doit être connu, et si l'ordre change, la référence à l'index du Field devra être modifiée dès que cela se produira. Bien que légèrement moins rapide, l'utilisation du nom du Field offre plus de souplesse car elle ne dépend pas de l'ordre des Fields dans la collection.

Utilisation de la méthode Refresh

Contrairement à d'autres collections ADO, l'utilisation de la méthode Refresh sur la collection Fields ne produit pas d'effet visible. Pour récupérer les modifications de la structure de base de données sous-jacente, vous devez utiliser soit la méthode Requery, soit, si l'objet Recordset ne prend pas en charge les signets, la méthode MoveFirst, qui nécessitera que la commande soit exécutée à nouveau sur le fournisseur.

Ajout de champs dans un jeu d'enregistrements

La méthode Append est utilisée pour ajouter des champs dans un Recordset.

Vous pouvez utiliser la méthode Append pour fabriquer un Recordset par programmation sans ouvrir de connexion avec une source de données. Une erreur d'exécution se produira si la méthode Append est appelée sur la collection Fields d'un Recordset ouvert ou d'un Recordset où la propriété ActiveConnection a été définie. Vous pouvez ajouter des champs uniquement dans un Recordset qui n'est pas ouvert et n'a pas encore été connecté à une source de données. Toutefois, pour spécifier des valeurs pour les Fields qui viennent d'être ajoutés, le Recordset doit être préalablement ouvert.

Les développeurs ont souvent besoin d'espace pour stocker temporairement des données, ou veulent que des données agissent comme si elles provenaient d'un serveur de sorte qu'elles puissent participer à la liaison de données dans une interface utilisateur. ADO (conjointement au Microsoft Cursor Service pour OLE DB) permet au développeur de créer un objet Recordset vide en spécifiant des informations de colonnes et en appelant la méthode Open. Dans l'exemple suivant, trois nouveaux champs sont ajoutés à un nouvel objet Recordset. Ensuite, le Recordset est ouvert, deux nouveaux enregistrements sont ajoutés et le Recordset est stocké de manière persistante dans un fichier. (Pour plus d'informations sur la persistance des objets Recordset, consultez le Chapitre 5 : Mise à jour et persistance des données.)

    'BeginFabricate
    Dim objRs As New ADODB.Recordset

    With objRs.Fields
        .Append "StudentID", adChar, 11, adFldUpdatable
        .Append "FullName", adVarChar, 50, adFldUpdatable
        .Append "PhoneNmbr", adVarChar, 20, adFldUpdatable
    End With

    With objRs
        .Open

        .AddNew
        .Fields(0) = "123-45-6789"
        .Fields(1) = "John Doe"
        .Fields(2) = "(425) 555-5555"
        .Update

        .AddNew
        .Fields(0) = "123-45-6780"
        .Fields(1) = "Jane Doe"
        .Fields(2) = "(615) 555-1212"
        .Update
    End With

    objRs.Save App.Path & "\FabriTest.adtg", adPersistADTG

    objRs.Close
    'EndFabricate

L'usage de la méthode Append des objets Fielddiffère de l'objet Recordset et de l'objet Record. Pour plus d'informations sur l'objet Record, consultez le Chapitre 10 : Enregistrements et flux.

Voir aussi

Fabrication d'objets Recordset hiérarchiques


L'objet Field

Chaque objet Field correspond généralement à une colonne dans une table de base de données. Toutefois, un objet Field peut également représenter un pointeur vers un autre Recordset, appelé un chapitre. Les exceptions, telles que les colonnes de chapitre, seront couvertes ultérieurement dans ce guide.

Utilisez la propriété Value des objets Field pour définir ou renvoyer des données pour l'enregistrement courant. Selon les fonctionnalités gérées par le fournisseur, certaines collections, méthodes ou propriétés d'un objet Field peuvent ne pas être disponibles.

Avec les collections, méthodes et propriétés d'un objet Field, vous pouvez :

  • renvoyer le nom d'un champ à l'aide de la propriété Name ;
  • afficher ou modifier les données contenues dans le champ à l'aide de la propriété Value. Value est la propriété par défaut de l'objet Field ;
  • renvoyer les caractéristiques de base d'un champ à l'aide des propriétés Type, Precision et NumericScale ;
  • renvoyer la taille déclarée d'un champ à l'aide de la propriété DefinedSize ;
  • Renvoyer la taille réelle des données d'un champ particulier à l'aide de la propriété ActualSize ;
  • déterminer les types de fonctionnalités pris en charge pour un champ donné à l'aide de la propriété Attributes et de la collection Properties ;
  • manipuler les valeurs de champs contenant des données longues binaires ou de texte à l'aide des méthodes AppendChunk et GetChunk.

Résolvez les irrégularités en matière de valeur dans les champs au cours de la mise à jour par lot à l'aide des propriétés OriginalValue et UnderlyingValue, si le fournisseur prend en charge les mises à jour par lot.

Description d'un champ

Les rubriques qui suivent traitent des propriétés de l'objet Field qui représentent les informations qui décrivent l'objet Field lui-même, c'est-à-dire les métadonnées relatives au champ. Ces informations peuvent être utilisées pour déterminer en grande partie le schéma du Recordset. Ces propriétés comprennent notamment les suivantes : Type, DefinedSize, ActualSize, Name, NumericScale et Precision.

Découvert du type de données

La propriété Type indique le type de données du champ. Les constantes énumérées du type de données qui sont prises en charge par ADO sont décrites dans DataTypeEnum dans le guide Référence du programmeur ADO.

Pour les types numériques à virgule flottante tels que adNumeric, vous pouvez obtenir des informations supplémentaires. La propriété NumericScale indique combien de chiffres à droite de la virgule décimale seront utilisés pour représenter les valeurs de l'objet Field. La propriété Precision spécifie le nombre de chiffres maximum utilisés pour représenter les valeurs du Field.

Détermination de la taille du champ

Utilisez la propriété DefinedSize pour définir la capacité d'un objet Field.

Utilisez la propriété ActualSize pour renvoyer la longueur véritable de la valeur d'un objet Field. Pour tous les champs, la propriété ActualSize est en lecture seule. Si ADO ne peut pas déterminer la longueur de la valeur de l'objet Field, la propriété ActualSize renvoie adUnknown.

Les propriétés DefinedSize et ActualSize ont différents objectifs. Considérez par exemple un objet Field dont le type déclaré est adVarChar dont la propriété DefinedSize a pour valeur 50, qui contient un caractère unique. La valeur renvoyée par la propriété ActualSize correspond à la longueur en octets de ce caractère.

Détermination du contenu du champ

L'identificateur de la colonne provenant de la source de données est représenté par la propriété Name de l'objet Field. La propriété Value de l'objet Field renvoie ou définit les données effectivement contenues dans le champ. Il s'agit de la propriété par défaut.

Pour modifier les données d'un champ, définissez la propriété Value à l'aide d'une nouvelle valeur du type approprié. Votre type de curseur doit prendre en charge les mises à jour pour modifier le contenu d'un champ. La validation de la base de données n'est pas effectuée ici en mode de traitement par lot, de sorte que vous n'avez pas besoin de rechercher les erreurs lorsque vous appelez UpdateBatch dans un cas de ce type. Certains fournisseurs prennent également en charge les propriétés UnderlyingValue et OriginalValue de l'objet Field ADO pour vous assister dans la résolution des conflits qui se produisent lorsque vous essayez d'effectuer des mises à jour par lot. Pour plus d'informations sur la résolution de conflits de ce type, consultez le Chapitre 4 : Modification des données.

Note Les valeurs Recordset Field ne peuvent pas être définies lorsque vous ajoutez de nouveaux Fields dans un Recordset. À la place, de nouveaux Fields peuvent être ajoutés dans un Recordset fermé. Le Recordset doit ensuite être ouvert, et seulement ensuite de nouvelles valeurs peuvent être affectées à ces Fields.

Informations supplémentaires sur le champ

Les objets ADO ont deux types de propriétés : intégrées et dynamiques. À ce stade, seules les propriétés intégrées de l'objet Field ont été traitées.

Les propriétés intégrées sont les propriétés implémentées dans ADO et immédiatement accessibles à tout nouvel objet, à l'aide de la syntaxe MyObject.Property. Elles n'apparaissent pas sous forme d'objets Property dans la collection Properties d'un objet.

Les propriétés dynamiques sont définies par le fournisseur de données sous-jacent, et apparaissent dans la collection Properties de l'objet ADO approprié. Par exemple, une propriété spécifique au fournisseur peut indiquer si un objet Recordset prend en charge les transactions ou les mises à jour. Ces propriétés supplémentaires apparaîtront sous forme d'objets Property dans la collection Properties du Recordset de cet objet. Les propriétés dynamiques peuvent être référencées par l'intermédiaire de la collection uniquement, à l'aide de la syntaxe MyObject.Properties(0) ou MyObject.Properties("Name").

Aucun de ces deux types de propriétés ne peut être supprimé.

Un objet Property dynamique comporte quatre propriétés intégrées qui lui sont propres :

  • La propriété Name est une chaîne qui identifie la propriété.
  • La propriété Type est un entier qui spécifie le type de données de la propriété.
  • La propriété Value est un variant qui contient la valeur de la propriété. Value est la propriété par défaut de l'objet Property.
  • La propriété Attributes est une valeur de type Long qui indique les caractéristiques de la propriété spécifiques au fournisseur.

La collection Properties de l'objet Field contient des métadonnées supplémentaires sur le champ. Le contenu de cette collection varie en fonction du fournisseur. Le code suivant permet d'examiner la collection Properties de l'exemple de Recordset présenté au début de ce chapitre. Il observe d'abord le contenu de la collection. Ce code utilise le fournisseur OLE DB pour SQL Server, de sorte que la collection Properties contienne des informations pertinentes sur ce fournisseur.

'BeginFieldProps
    Dim objProp As ADODB.Property

    For intLoop = 0 To (objFields.Count - 1)
        Debug.Print objFields.Item(intLoop).Name

        For Each objProp In objFields(intLoop).Properties
            Debug.Print vbTab & objProp.Name & " = " & objProp.Value
        Next objProp
    Next intLoop
'EndFieldProps

Gestion des données binaires

Utilisez la méthode AppendChunk sur un objet Field pour y ajouter des données de type caractères ou binaire volumineux. Dans les situations où la mémoire système est limitée, la méthode AppendChunk permet de manipuler des valeurs de type long par de longues portions plutôt qu'en intégralité.

Si la partie adFldLong de la propriété Attributes d'un objet Field est définie comme True, vous pouvez utiliser la méthode AppendChunk pour ce champ.

Le premier appel de la méthode AppendChunk sur un objet Field écrit les données dans le champ, en remplaçant le contenu existant. Les appels suivants de AppendChunk ajoutent les données au contenu existant. Si vous ajoutez des données à un champ puis que vous définissez ou lisez la valeur d'un autre champ dans l'enregistrement actuel, ADO suppose que vous avez fini d'ajouter des données au premier champ. Si vous rappelez la méthode AppendChunk pour le premier champ, ADO interprète cet appel comme une nouvelle opération AppendChunk et remplace les données existantes. L'accès aux champs dans d'autres objets Recordset qui ne sont pas des clones du premier objet Recordset n'interrompt pas les opérations AppendChunk.

Utilisez la méthode GetChunk sur un objet Field pour extraire une partie ou la totalité des caractères ou des données binaires qu'il contient. Si votre mémoire système est limitée, la méthode GetChunk vous permet de manipuler des valeurs longues par morceaux et non en totalité.

Les données renvoyées par la méthode GetChunk sont affectées à variable. Si Size est supérieur aux données restantes, la méthode GetChunk renvoie uniquement les données restantes sans compléter variable d'espaces vides. Si le champ est vide, la méthode GetChunk renvoie une valeur nulle.

Tout appel ultérieur de la méthode GetChunk récupère les données à partir de l'endroit où s'est arrêtée la dernière exécution de la méthode GetChunk. Toutefois, si vous récupérez des données d'un champ, puis définissez ou lisez la valeur d'un autre champ de l'enregistrement courant, ADO part du principe que vous avez terminé de récupérer les données du premier champ. Si vous rappelez la méthode GetChunk pour le premier champ, ADO interprète cet appel comme une nouvelle opération GetChunk et commence à lire les données depuis le début. L'accès à des champs d'autres objets Recordset qui ne sont pas des clones du premier objet Recordset ne perturbe pas les opérations GetChunk.

Si la partie adFldLong de la propriété Attributes d'un objet Field est définie comme True, vous pouvez utiliser la méthode GetChunk pour ce champ.

S'il n'y a pas d'enregistrement actuel lorsque vous utilisez la méthode GetChunk ou AppendChunk sur un objet Field, l'erreur 3021 (aucun enregistrement actuel) se produit.

Pour un exemple de l'utilisation de ces méthodes permettant de manipuler des données binaires, consultez les exemples des AppendChunk, méthode et GetChunk, méthode dans le guide de Référence du programmeur ADO.


Utilisation de Recordsets

L'objet Recordset possède des fonctionnalités intégrées qui vous permettent de réorganiser l'ordre des données dans le jeu de résultats, de rechercher un enregistrement donné sur la base de critères que vous spécifiez et même d'optimiser ces opérations de recherche à l'aide d'index. La disponibilité de ces fonctionnalités dépend du fournisseur et, dans certains cas, de la structure des données elles-mêmes, comme dans le cas de la propriété Index.

Organisation des données

La manière la plus efficace d'ordonner vos données de votre Recordset consiste souvent à spécifier une clause ORDER BY dans la commande SQL utilisée pour y renvoyer les résultats. Toutefois, vous pouvez devoir changer l'ordre des données dans un Recordset qui a déjà été créé. Vous pouvez utiliser la propriété Sort afin d'établir l'ordre dans lequel les lignes d'un Recordset sont parcourues. De plus, la propriété Filter détermine quels lignes sont accessibles lorsque les lignes sont parcourues.

La propriété Sort définit ou renvoie une valeur String qui indique les noms de champ dans le Recordset sur lequel s'effectue le tri. Chaque nom est séparé d'une virgule et peut être suivi d'un espace et du mot clé ASC (qui spécifie le tri dans l'ordre croissant) ou DESC (qui spécifie le tri des champs dans l'ordre décroissant). En l'absence de mot clé spécifié, l'ordre de tri par défaut est croissant.

L'opération de tri est efficace dans la mesure où elle ne réorganise pas physiquement les données, mais vous permet seulement d'y accéder dans l'ordre spécifié par un index.

La propriété Sort exige que la propriété CursorLocation ait la valeur adUseClient. Un index temporaire est créé pour chaque champ spécifié dans la propriété Sort s'il n'existe pas déjà un index.

Si vous définissez une chaîne vide pour la propriété Sort, les lignes reprennent leur position d'origine et les index temporaires sont supprimés. Les index existants ne sont pas supprimés.

Prenons un objet Recordset qui contient trois champs nommés respectivement firstName (prénom), middleInitial (initiale) et lastName (nom de famille). Affectez à la propriété Sort la chaîne "lastName DESC, firstName ASC" qui ordonne le Recordset dans l'ordre décroissant des noms de famille (lastName), puis dans l'ordre croissant des prénoms (firstName). L'initiale est ignorée.

Aucun champ référencé dans un critère de recherche ne peut être nommé « ASC » ou « DESC » car ces noms seraient en conflit avec les mots clés ASC et DESC. Si un champ a un nom qui provoque un conflit, attribuez-lui un alias à l'aide du mot clé AS dans la requête qui renvoie le Recordset.

Pour plus d'informations sur le filtrage dans le Recordset, consultez Filtrage des résultats, plus loin dans cette rubrique.

Rechercher un enregistrement spécifique

ADO dispose des méthodes Find et Seek pour repérer un enregistrement particulier dans un Recordset. La méthode Find est prise en charge par de nombreux fournisseurs mais est limitée à une seul critère de recherche. La méthode Seek permet d'effectuer sa recherche sur la base de plusieurs critères, mais n'est pas prise en charge par de nombreux fournisseurs.

Sur les champs, les index peuvent améliorer grandement les performances de la méthode Find de l'objet Recordset et des propriétés Sort et Filter. Vous pouvez créer un index interne pour un objet Field en définissant sa propriété Optimize dynamique. Cette propriété dynamique est ajoutée à la collection Properties de l'objet Field lorsque vous définissez la propriété CursorLocation en adUseClient. Souvenez-vous que cet index est interne à ADO, ce qui signifie que vous ne pouvez pas y accéder ou l'utiliser dans quelque autre but. Par ailleurs, cet index est distinct de la propriété Index de l'objet Recordset.

La méthode Find permet de repérer rapidement une valeur à l'intérieur d'une colonne (champ) d'un Recordset. Il est souvent possible d'améliorer la vitesse d'exécution de la méthode Find sur une colonne en utilisant la propriété Optimize pour créer un index sur cette colonne.

La méthode Find limite votre recherche au contenu d'un champ. Entre autres restrictions, la méthode Seek nécessite que vous ayez un index. Si vous devez effectuer votre recherche sur plusieurs champs qui ne constituent pas la base d'un index, ou si votre fournisseur ne prend pas en charge les index, vous pouvez limiter vos résultats à l'aide de la propriété Filter de l'objet Recordset.

Find

La méthode Find recherche dans un objet Recordset la ligne qui remplit le critère spécifié. Vous pouvez éventuellement préciser le sens de la recherche, la ligne de départ ou un décalage par rapport à la ligne de départ. Si le critère est rempli, la position de la ligne en cours devient l'enregistrement trouvé ; dans le cas contraire, la ligne en cours est positionnée à la fin (ou au début) de l'objet Recordset, suivant le sens de la recherche.

Le critère ne peut mentionner qu'un seul nom de colonne. En d'autres termes, cette méthode ne prend pas en charge les recherches dans plusieurs colonnes.

L'opérateur de comparaison du critère peut être « > » (supérieur à), « < » (inférieur à), « = » (égal à), « >= » (supérieur ou égal à), « <= » (inférieur ou égal à), « <> » (différent de) ou « LIKE » (condition).

La valeur spécifiée dans le critère peut être une chaîne, un nombre en virgule flottante ou une date. Les valeurs de type chaîne sont délimitées par des guillemets simples ou le symbole « # » (dièse), par exemple : « state = 'WA' » ou « state = #WA# ». Les dates sont délimitées par le symbole « # », par exemple : « start_date > #22/7/97# ».

Si l'opérateur de comparaison est « like », la chaîne indiquant la valeur de comparaison peut contenir un astérisque (*) pour rechercher une ou plusieurs occurrences d'un caractère ou d'une sous-chaîne. Par exemple, le critère « state like 'M*' » est rempli par les États du Maine et du Massachusetts. Vous pouvez également utiliser des astérisques en début et en fin de chaîne pour rechercher des valeurs qui contiennent une sous-chaîne. Par exemple, le critère « state like '*as*' » est rempli par les états de l'Alaska, de l'Arkansas et du Massachusetts.

Vous pouvez placer un astérisque à la fin seulement ou au début et à la fin d'une chaîne de critère, comme dans les exemples précédents. Vous ne pouvez pas placer un seul astérisque au début ('*str') ou à l'intérieur ('s*r') de la chaîne. Cela provoquerait une erreur.

Seek et Index

Utilisez la méthode Seek conjointement à la propriété Index si le fournisseur sous-jacent prend en charge les index sur l'objet Recordset. Utilisez la méthode Supports (adSeek) pour déterminer si le fournisseur sous-jacent prend en charge la méthode Seek, et la méthode Supports(adIndex) pour déterminer si le fournisseur prend en charge les index. (Par exemple, le Fournisseur OLE DB Microsoft pour Jet prend en charge Seek et Index.)

Si la méthode Seek ne trouve pas la ligne désirée, il ne se produit aucune erreur, et la ligne est positionnée à la fin de l'objet Recordset. Avant d'utiliser cette méthode, affectez l'index désiré à la propriété Index.

La méthode Seek n'est prise en charge que par les curseurs côté serveur. Elle n'est pas prise en charge lorsque la propriété CursorLocation de l'objet Recordset a pour valeur adUseClient.

Cette méthode ne peut être utilisée que lorsque l'objet Recordset a été ouvert avec une valeur CommandTypeEnum égale à adCmdTableDirect.

Filtrage des résultats

La méthode Find limite votre recherche au contenu d'un champ. Entre autres restrictions, la méthode Seek nécessite que vous ayez un index. Si vous devez effectuer votre recherche sur plusieurs champs qui ne constituent pas la base d'un index, ou si votre fournisseur ne prend pas en charge les index, vous pouvez limiter vos résultats à l'aide de la propriété Filter de l'objet Recordset.

Utilisez la propriété Filter pour afficher de manière sélective les enregistrements d'un Recordset. Le Recordset ainsi filtré devient le curseur en cours, ce qui signifie que les enregistrements qui ne répondent pas aux critères Filter ne sont pas disponibles dans le Recordset tant que le Filter n'est pas supprimé. D'autres propriétés qui renvoient des valeurs en fonction du curseur en cours sont affectées, notamment AbsolutePosition, AbsolutePage, RecordCount et PageCount. La raison en est que lorsque vous affectez une valeur particulière à la propriété Filter, l'enregistrement actuel est déplacé au niveau du premier enregistrement qui satisfait à la nouvelle valeur.

La propriété Filter emploie une variante d'argument. Cette valeur représente une des trois méthodes d'utilisation de la propriété Filter : une chaîne de critère, une constante FilterGroupEnum ou un tableaux de signets. Pour plus d'informations, consultez Filtrage à l'aide d'une chaîne de critère, Filtrage à l'aide d'une constante et Filtrage à l'aide de signets, plus loin dans cette rubrique.

Note Lorsque vous connaissez les données que vous voulez sélectionner, il est généralement plus efficace d'ouvrir un Recordset avec une instruction SQL qui filtre effectivement le jeu de résultats, plutôt que de compter sur la propriété Filter.

Pour supprimer un filtre d'un Recordset, utilisez la constante adFilterNone. Lorsque la valeur de la propriété Filter est une chaîne de longueur nulle (""), elle joue le même rôle que la constante adFilterNone.

Filtrage à l'aide d'une chaîne de critère

Cette chaîne de critère est composée de clauses de la forme FieldName Operator Value (par exemple : "LastName = 'Smith'"). Vous pouvez créer des clauses composées en concaténant des clauses individuelles avec AND (par exemple : "LastName = 'Smith' AND FirstName = 'John'") et OR (par exemple, "LastName = 'Smith' OR LastName = 'Jones'"). Utilisez les consignes ci-dessous pour les chaînes de critère :

  • FieldName doit être un nom de champ valide du Recordset. Si le nom de champ comporte des espaces, il doit être entouré de crochets droits.
  • Operator doit être l'un des opérateurs suivants : <, >, <=, >=, <>, = ou LIKE.
  • Value est la valeur à laquelle vous comparez les valeurs des champs (par exemple, 'Smith', #8/24/95#, 12.345 ou $50.00). Utilisez des guillemets simples (') avec les chaînes et des dièses (#) avec les dates. Pour les nombres, vous pouvez utiliser la virgule décimale, le symbole dollar et les notations scientifiques. Si l'opérateur est LIKE, Value peut utiliser des caractères génériques. Seuls les caractères génériques astérisque (*) et signe pourcentage (%) sont autorisés, et ils doivent être le dernier caractère de la chaîne. Value ne peut pas être nulle.
    Note Pour insérer des guillemets simples (') dans la Value du filtre, doublez chaque guillemet. Par exemple, pour effectuer un filtrage sur la valeur O'Malley, tapez la chaîne de critère "col1 = 'O''Malley'". Pour insérer des guillemets simples au début et à la fin de la valeur du filtre, entourez la chaîne de signes dièse (#). Par exemple, pour effectuer un filtrage sur la valeur '1', tapez la chaîne de critère "col1 = #'1'#".

Il n'y a pas de priorité entre AND et OR. Les clauses peuvent être regroupées entre parenthèses. Toutefois, vous ne pouvez pas regrouper des clauses reliées par OR, puis adjoindre ce groupe à une autre clause avec l'opérateur AND de la manière suivante :

(LastName = 'Smith' OR LastName = 'Jones') AND FirstName = 'John'

Ce filtre doit être construit ainsi :

(LastName = 'Smith' AND FirstName = 'John') OR (LastName = 'Jones' AND FirstName = 'John')

Dans une clause LIKE, vous pouvez utiliser un caractère générique au début et à la fin de la chaîne (par exemple : LastName Like '*mit*') ou uniquement à la fin de la chaîne (par exemple : LastName Like 'Smit*').

Filtrage à l'aide d'une constante

Les constantes suivantes vous permettent de filtrer des Recordsets.

Constante | Description
adFilterAffectedRecords
 Filtre de sorte de n'afficher que les enregistrements affectés par le dernier appel de méthode Delete, Resync, UpdateBatch ou CancelBatch.
adFilterConflictingRecords | Filtre de sorte de n'afficher que les enregistrements qui n'ont pas pu être actualisés lors de la dernière tentative de mise à jour par lots.
adFilterFetchedRecords | Filtre de sorte de n'afficher que les enregistrements placés en mémoire cache, c'est-à-dire le résultat du dernier appel pour l'extraction d'enregistrements de la base de données.
adFilterNone | Supprime le filtre en cours et rétablit l'affichage de tous les enregistrements.
adFilterPendingRecords | Filtre de sorte de n'afficher que les enregistrements modifiés qui n'ont pas été encore envoyés au serveur. S'applique seulement au mode de mise à jour par lots.

Les constantes de filtre facilitent la résolution de conflits individuels d'enregistrements en mode de mise à jour par lots en vous permettant par exemple d'afficher seulement les enregistrements affectés par le dernier appel de la méthode UpdateBatch, comme illustré dans l'exemple ci-dessous :

'BeginDeleteGroup
    'add some bogus records
    With objRs1
        For i = 0 To 8
            .AddNew
            .Fields("CompanyName") = "Shipper Number " & i + 1
            .Fields("Phone") = "(425) 555-000" & (i + 1)
            .Update
        Next i

    're-connect & update
        .ActiveConnection = GetNewConnection
        .UpdateBatch

    'filter on newly added records
        .Filter = adFilterAffectedRecords
        Debug.Print "Deleting the " & .RecordCount & _
                    " records you just added."

    'delete the newly added bogus records
        .Delete adAffectGroup
        .Filter = adFilterNone
        Debug.Print .RecordCount & " records remain."

        .Close
    End With
'EndDeleteGroup

Filtrage à l'aide de signets

Enfin, vous pouvez transmettre un tableau variant de signets à la propriété Filter. Le curseur qui en résulte contiend uniquement les enregistrements dont le signet a été transmis à la propriété. L'exemple de code suivant crée un tableau de signets à partir des enregistrements d'un Recordset qui contiennent un « B » dans le champ ProductName. Il transmet ensuite le tableau à la propriété Filter et affiche des informations sur le Recordset filtré qui en résulte.

'BeginFilterBkmk
    Dim vBkmkArray() As Variant
    Dim i As Integer

    'Recordset created using "SELECT * FROM Products" as command.
    'So, we will check to see if ProductName has a capital B, and
    'if so, add to the array.
    i = 0
    Do While Not objRs.EOF
        If InStr(1, objRs("ProductName"), "B") Then
            ReDim Preserve vBkmkArray(i)
            vBkmkArray(i) = objRs.Bookmark
            i = i + 1
            Debug.Print objRs("ProductName")
        End If
        objRs.MoveNext
    Loop

    'Filter using the array of bookmarks.
    objRs.Filter = vBkmkArray

    objRs.MoveFirst
    Do While Not objRs.EOF
        Debug.Print objRs("ProductName")
        objRs.MoveNext
    Loop
    'EndFilterBkmk

Création d'un clone de Recordset

Utilisez la méthode Clone pour créer plusieurs objets Recordset dupliqués, notamment si vous voulez conserver plusieurs enregistrements dans un jeu d'enregistrements particulier. La duplication par la méthode Clone est plus rationnelle que la création et l'ouverture d'un nouvel objet Recordset avec la même définition que l'enregistrement initial.

L'enregistrement actuel d'un clone nouvellement créé est défini au départ sur le premier enregistrement. Le pointeur d'enregistrement courant dans un Recordset cloné n'est pas synchronisé avec l'original et inversement. Vous pouvez naviguer indépendamment dans chaque Recordset.

Les modifications apportées à un objet Recordset apparaissent dans tous ses clones, indépendamment du type de curseur. Cependant, une fois que vous exécutez Requery sur le Recordset initial, les clones ne sont plus synchronisés sur le jeu d'enregistrements initial.

En fermant l'objet Recordset initial, vous ne fermez pas ses copies ; et en fermant une copie, vous ne fermez pas le jeu d'enregistrements initial ni l'une des autres copies.

Vous pouvez cloner un objet Recordset uniquement s'il prend en charge les signets. Les valeurs des signets sont interchangeables ; autrement dit, une référence signet d'un objet Recordset désigne le même enregistrement dans l'un de ses clones.


Chapitre 4 : Modification des données

Les deux chapitres précédents décrivent l'utilisation d'ADO pour se connecter à une source de données, exécuter une commande, obtenir des résultats dans un objet Recordset et naviguer à l'intérieur du Recordset. Ce chapitre aborde l'opération ADO fondamentale suivante : la modification des données.

Ce chapitre reprend l'exemple du Recordset du chapitre 3, à une différence importante près. Le code suivant est utilisé pour ouvrir le Recordset:

    . . .
'BeginEditIntro
    Dim strSQL As String
    Dim objRs1 As ADODB.Recordset

    strSQL = "SELECT * FROM Shippers"

    Set objRs1 = New ADODB.Recordset

    objRs1.Open strSQL, GetNewConnection, adOpenStatic, _
                adLockBatchOptimistic, adCmdText

    ' Disconnect the Recordset from the Connection object.
    Set objRs1.ActiveConnection = Nothing
'EndEditIntro

    . . .

La modification importante en termes de code implique de définir la propriété CursorLocation de l'objet Connection égale à adUseClient dans la fonction GetNewConnection (illustrée ci-dessous), qui indique l'utilisation d'un curseur client. Pour plus d'informations sur les différences entre les curseurs côté client et côté serveur, consultez le Chapitre 8 : Curseurs et verrous.

Le paramétrage adUseClient de la propriété CursorLocation déplace l'emplacement du curseur entre la source de données (le serveur SQL, dans le cas présent) et l'emplacement du code client (la station de travail). Ce paramétrage oblige ADO à invoquer le composant Client Cursor Engine pour OLE DB sur le client pour créer et gérer le curseur.

Vous pouvez avoir également remarqué que le paramètre LockType de la méthode Open a changé en adLockBatchOptimistic. Cela permet d'ouvrir le curseur en mode de traitement par lot. (Le fournisseur conserve en mémoire cache plusieurs modifications et les écrit dans la source de données sous-jacente uniquement lorsque vous appelez la méthode UpdateBatch.) Les modifications apportées à Recordset ne seront pas mises à jour tant que la méthode UpdateBatch ne sera pas appelée.

Enfin, le code de ce chapitre utilise une version modifiée de la fonction GetNewConnection, présentée au chapitre 2. Cette version de la fonction renvoie désormais un curseur côté client. La fonction se présente comme suit :

'BeginNewConnection
Public Function GetNewConnection() As ADODB.Connection
    Dim objConn1 As ADODB.Connection
    Set objConn1 = New ADODB.Connection

    strConnStr = "Provider=SQLOLEDB;Initial Catalog=Northwind;" & _
                 "Data Source=MySrvr;Integrated Security=SSPI;"

    objConn1.ConnectionString = strConnStr
    objConn1.CursorLocation = adUseClient
    objConn1.Open

    Set GetNewConnection = objConn1
End Function
'EndNewConnection


Modification d'enregistrements existants

Pour modifier des enregistrements existants, placez-vous sur la ligne qui contient les champs à modifier et changez la propriété Value des champs en question. Pour plus d'informations sur la propriété Value de l'objet Field, consultez le Chapitre 3 : Examen des données. Suivant le type de votre curseur, vous utiliserez la méthode Update ou UpdateBatch pour renvoyer les modifications à la source des données. Pour plus d'informations, consultez le Chapitre 5 : Mise à jour et persistance des données.

Il est généralement plus efficace d'utiliser une procédure stockée avec un objet Command pour effectuer des mises à jour, comme pour effectuer d'autres opérations, car une procédure stockée ne nécessite pas la création d'un curseur. Pour plus d'informations sur les curseurs, consultez le Chapitre 8 : Curseurs et verrous.


Ajout d'enregistrements

Utilisez la méthode AddNew pour créer et initialiser un nouvel enregistrement dans un Recordset existant. Vous pouvez utiliser la méthode Supports avec une valeur CursorOptionEnum de adAddNew pour vérifier si vous pouvez ajouter des enregistrements dans l'objet Recordset courant.

Une fois que vous avez appelé la méthode AddNew, le nouvel enregistrement devient l'enregistrement actuel et le reste après l'appel de la méthode Update. Si l'objet Recordset ne prend pas en charge les signets, vous ne pourrez peut-être pas accéder au nouvel enregistrement lorsque vous passez à un autre enregistrement. Selon le type de curseur utilisé, il se peut que vous n'ayez pas besoin d'appeler la méthode Requery pour rendre le nouvel enregistrement accessible.

Si vous appelez AddNew alors que vous apportez des modifications à l'enregistrement actuel ou pendant que vous ajoutez un nouvel enregistrement, ADO appelle la méthode Update pour enregistrer les modifications effectuées puis crée l'enregistrement.


Ajout d'enregistrements à l'aide de la méthode AddNew

Ci-dessous la syntaxe de la méthode AddNew :

recordset.AddNew FieldList, Values

Les arguments FieldList et Values sont facultatifs. FieldList peut être un nom, un tableau de noms ou des positions ordinales des champs dans le nouvel enregistrement.

L'argument Values est soit une valeur unique, soit un tableau de valeurs pour les champs du nouvel enregistrement.

En règle générale, pour ajouter un seul enregistrement, vous appelez la méthode AddNew sans préciser d'arguments. Spécifiquement, vous allez appeler AddNew, définir la Value de chaque champ du nouvel enregistrement, puis appeler Update et/ou UpdateBatch. Vous pouvez vérifier que votre Recordset prend en charge l'ajout de nouveaux enregistrements en utilisant la propriété Supports avec la constante énumérée adAddNew.

Le code suivant utilise cette technique pour ajouter un nouvel expéditeur à l'exemple Recordset. La valeur de champ ShipperID est fournie automatiquement par SQL Server, de sorte que le code n'essaie pas de fournir une valeur de champ pour les nouveaux enregistrements.

'BeginAddNew1.1
    If objRs1.Supports(adAddNew) Then
        With objRs1
            .AddNew
            .Fields("CompanyName") = "Sample Shipper"
            .Fields("Phone") = "(931) 555-6334"
            .Update
        End With
    End If
'EndAddNew1.1

Étant donné que ce code utilise un Recordset déconnecté avec un curseur côté client en mode de traitement par lot, vous devez reconnecter le Recordset à la source de données avec un nouvel objet Connection avant de pouvoir appeler la méthode UpdateBatch pour publier les modifications dans la base de données. Cela s'opère facilement à l'aide la nouvelle fonction GetNewConnection.

'BeginAddNew1.2
    'Re-establish a Connection and update
    Set objRs1.ActiveConnection = GetNewConnection
    objRs1.UpdateBatch
'EndAddNew1.2


Ajout de champs multiples

Il arrive qu'il soit plus efficace de transmettre un tableau de champs et de leurs valeurs correspondantes à la méthode AddNew, plutôt de que définir plusieurs fois Value pour chaque nouveau champ. Si FieldList est un tableau, les Values doivent également être un tableau comportant le même nombre de membres sans quoi une erreur se produit. L'ordre des noms de champ doit correspondre à l'ordre des valeurs de champ de chaque tableau. Le code suivant permet de transmettre un tableau de valeurs à la méthode AddNew.

'BeginAddNew2
    Dim avarFldNames As Variant
    Dim avarFldValues As Variant

    avarFldNames = Array("CompanyName", "Phone")
    avarFldValues = Array("Sample Shipper 2", "(931) 555-6334")

    If objRs1.Supports(adAddNew) Then
        objRs1.AddNew avarFldNames, avarFldValues
    End If

    'Re-establish a Connection and update
    Set objRs1.ActiveConnection = GetNewConnection
    objRs1.UpdateBatch
'EndAddNew2


Détermination du mode modification

ADO gère un tampon de modification associé à l'enregistrement actuel. La propriété EditMode indique si des modifications ont été effectuées dans cette mémoire tampon ou si un nouvel enregistrement a été créé. Utilisez la propriété EditMode pour déterminer l'état de modification de l'enregistrement actuel. Vous pouvez voir si des changements sont en attente, dans le cas où une procédure de modification a été interrompue, et déterminer si vous devez utiliser la méthode Update ou CancelUpdate.

EditMode renvoie une des constantes EditModeEnum, qui sont répertoriées dans la table suivante.

Constante | Description
adEditNone | Aucune modification n'est en cours.
adEditInProgress | Les données de l'enregistrement actuel ont été modifiées mais pas sauvegardées.
adEditAdd | La méthode AddNew a été appelée et l'enregistrement actuel placé en mémoire tampon est nouveau mais n'a pas encore été sauvegardé dans la base de données.
adEditDelete | L'enregistrement actuel a été supprimé.

Pour que EditMode puisse renvoyer une valeur valide, il faut qu'il y ait un enregistrement courant. EditMode renvoie une erreur si BOF ou EOF est True ou si l'enregistrement courant a été supprimé.


Utilisation de la méthode AddNew dans les modes de traitement immédiat et par lot

Le comportement de la méthode AddNew dépend du mode de mise à jour de l'objet Recordset et si vous transmettez les arguments Fieldlist et Values.

En mode de mise à jour immédiat (dans lequel le fournisseur écrit les modifications apportées aux données sous-jacentes une fois que vous avez appelé la méthode Update), appeler la méthode AddNew sans argument définit la propriété EditMode en adEditAdd. Le fournisseur met en cache local toutes les modifications apportées aux valeurs de champ. Appeler la méthode Update publie le nouvel enregistrement dans la base de données et réinitialise la propriété EditMode à la valeur adEditNone. Si vous transmettez les arguments FieldList et Values , ADO publie immédiatement le nouvel enregistrement dans la base de données (aucun appel Update n'est nécessaire). La valeur de la propriété EditMode ne change pas (adEditNone).

En mode de mise à jour de lot, appeler la méthode AddNew sans argument définit la propriété EditMode en adEditAdd. Le fournisseur met en cache local les modifications apportées aux valeurs de champ. Appeler la méthode Update ajoute le nouvel enregistrement dans le Recordset courant et redéfinit la propriété EditMode en adEditNone, mais le fournisseur ne publie pas les modifications apportées à la base de données sous-jacente avant que vous n'appeliez la méthode UpdateBatch. Si vous transmettez les arguments FieldList et Values, ADO envoie le nouvel enregistrement au fournisseur afin de le stocker en cache. Vous devez appeler la méthode UpdateBatch pour publier le nouvel enregistrement dans la base de données sous-jacente. Pour plus d'informations sur les méthodes Update et UpdateBatch, consultez le Chapitre 5 : Mise à jour et persistance des données.


Détermination des fonctionnalités prises en charge

La méthode Supports permet de déterminer si un objet Recordset spécifié prend en charge un type de fonctionnalité donné. Sa syntaxe est la suivante :

boolean = recordset.Supports( CursorOptions )

Supports renvoie une valeur de type Boolean qui indique si toutes les fonctionnalités identifiées par l'argument CursorOptions sont prises en charge par le fournisseur de données. Vous pouvez utiliser la méthode Supports pour déterminer les types de fonctionnalités qui sont pris en charge par un objet Recordset. Si l'objet Recordset prend en charge les fonctionnalités dont les constantes correspondantes se trouvent dans CursorOptions, la méthode Supports renvoie True. Si tel n'est pas le cas, elle renvoie False.

À l'aide de la méthode Supports, vous pouvez vérifier si l'objet Recordset a la capacité d'ajouter de nouveaux enregistrements, d'utiliser des signets, d'utiliser la méthode Find, d'utiliser le défilement, d'utiliser la propriété Index et d'effectuer des mises à jour par lot. Pour la liste complète des constantes et de leur signification, consultez CursorOptionEnum.

Bien que la méthode Supports puisse renvoyer True pour une fonctionnalité donnée, elle ne garantit pas que le fournisseur permette d'utiliser cette fonctionnalité en toutes circonstances. La méthode Supports indique simplement si le fournisseur prend en charge la fonctionnalité spécifiée, à condition que certaines conditions soient remplies. Par exemple, la méthode Supports peut indiquer qu'un objet Recordset prend en charge les mises à jour, même si le curseur est basé sur une jointure entre plusieurs tables, certaines d'entre elles contenant des colonnes ne pouvant pas être mises à jour.


Suppression d'enregistrements à l'aide de la méthode Delete

En utilisant la méthode Delete, vous marquez l'enregistrement actuel ou un groupe d'enregistrements d'un objet Recordset en vue de sa suppression. Si l'objet Recordset n'autorise pas la suppression d'enregistrements, une erreur se produit. Si vous êtes en mode de mise à jour immédiate, la suppression s'effectue immédiatement dans la base de données. Si un enregistrement ne peut pas être supprimé, (en raison de violations d'intégrité de la base de données, par exemple), l'enregistrement demeure en mode de modification après l'appel de la méthode Update. Cela signifie que vous devez annuler la mise à jour à l'aide de la méthode CancelUpdate avant de passer à l'enregistrement suivant (par exemple, à l'aide de Close, Move ou NextRecordset).

Si vous êtes en mode de mise à jour par lot, les enregistrements sont marqués pour être supprimés à partir du cache et la suppression se produit lorsque vous appelez la méthode UpdateBatch. (Pour consulter les enregistrements supprimés, définissez la propriété Filter en adFilterAffectedRecords après que Delete ait été appelé.)

La tentative d'extraction des valeurs des champs de l'enregistrement supprimé génère une erreur. Suite à sa suppression, l'enregistrement demeure en cours jusqu'à ce que vous sélectionniez un autre enregistrement. Par conséquent, dès lors que vous quittez un enregistrement supprimé, celui-ci n'est plus accessible.

Si vous imbriquez des suppressions dans une transaction, vous pouvez restaurer les enregistrements supprimés à l'aide de la méthode RollbackTrans. Si vous êtes en mode de mise à jour par lots, vous pouvez annuler une suppression ou un groupe de suppressions en attente à l'aide de la méthode CancelBatch.

En cas d'échec de la tentative de suppression d'enregistrements, provoquée par un conflit avec les données sous-jacentes (par exemple, un enregistrement ayant déjà été supprimé par un autre utilisateur), le fournisseur renvoie des avertissements à la collection Errors mais n'arrête pas l'exécution du programme. Une erreur d'exécution intervient uniquement en cas de conflit sur tous les enregistrements demandés.

Si la propriété dynamique Unique Table est définie et si le Recordset résulte d'une opération JOINDRE sur plusieurs tables, la méthode Delete n'annule que les lignes de la table mentionnée dans la propriété Unique Table.

La méthode Delete accepte un argument facultatif qui vous permet de spécifier les enregistrements qui sont affectés par l'opération Delete. Les seules valeurs valides pour cet argument sont l'une ou l'autre des constantes énumérées AffectEnum ADO suivantes :

  • adAffectCurrent Affecte uniquement l'enregistrement actuel.
  • adAffectGroup Affecte uniquement les enregistrements qui satisfont le paramètre de propriété Filter courant. La propriété Filter doit être définie à une valeur FilterGroupEnum ou à un tableau de Bookmarks pour utiliser cette option.

Le code suivant illustre un exemple de spécification de adAffectGroup lors de l'appel de la méthode Delete. Cet exemple ajoute certains exemples dans l'exemple de Recordset et met à jour la base de données. Il filtre ensuite le Recordset à l'aide de la constante énumérée de filtre adFilterAffectedRecords, qui ne laisse que les derniers enregistrements ajoutés visibles dans le Recordset. Enfin, il appelle la méthode Delete et spécifie que tous les enregistrements qui satisfont le paramètre courant de la propriété Filter (les nouveaux enregistrements) soient supprimés.

'BeginDeleteGroup
    'add some bogus records
    With objRs1
        For i = 0 To 8
            .AddNew
            .Fields("CompanyName") = "Shipper Number " & i + 1
            .Fields("Phone") = "(425) 555-000" & (i + 1)
            .Update
        Next i

    're-connect & update
        .ActiveConnection = GetNewConnection
        .UpdateBatch

    'filter on newly added records
        .Filter = adFilterAffectedRecords
        Debug.Print "Deleting the " & .RecordCount & _
                    " records you just added."

    'delete the newly added bogus records
        .Delete adAffectGroup
        .Filter = adFilterNone
        Debug.Print .RecordCount & " records remain."

        .Close
    End With
'EndDeleteGroup


Alternatives : Utilisation d'instructions SQL

ADO permet également l'utilisation de commandes à la place de ses propriétés et méthodes intégrées pour modifier les données. Suivant votre fournisseur, toutes les opérations mentionnées dans ce chapitre peuvent également être accomplies à l'aide de commandes transmises à votre source de données. Par exemple, les instructions SQL UPDATE peuvent être utilisées pour modifier les données sans utiliser la propriété Value d'un Field. Les instructions SQL INSERT peuvent être utilisées pour ajouter de nouveaux enregistrements dans une source de données, à la place de la méthode ADO AddNew. Pour plus d'informations sur SQL ou le langage de manipulation des données de votre fournisseur, consultez la documentation de votre source de données.

Par exemple, vous pouvez transmettre une chaîne SQL contenant une instruction DELETE à une base de données, comme le montre le code ci-dessous :

'BeginSQLDelete
strSQL = "DELETE FROM Shippers WHERE ShipperID = " & intId
objConn.Execute strSQL, , adCmdText + adExecuteNoRecords
'EndSQLDelete


Chapitre 5 : Mise à jour et persistance des données

Les chapitres précédents ont décrit comment utiliser ADO pour accéder aux données d'une source de données, comment circuler parmi les données et même comment modifier les données. Bien sûr, si l'objectif de votre application est de permettre aux utilisateurs d'apporter des modifications aux données, vous devez comprendre comment enregistrer ces modifications. Vous pouvez soit rendre persistantes les modifications du Recordset dans un fichier à l'aide de la méthode Save, ou renvoyer les modifications à la source de données pour les stocker, à l'aide des méthodes Update ou UpdateBatch.

Dans les chapitres précédents, vous avez modifié les données de plusieurs lignes de l'objet Recordset. ADO prend en charge deux principes de base en ce qui concerne l'ajout, la suppression et la modification des lignes de données.

Le premier est que les modifications ne sont pas apportées immédiatement à l'objet Recordset : elles sont effectuées dans une mémoire tampon de copie interne. Si vous décidez finalement de ne pas les appliquer, elles sont supprimées de la mémoire tampon de copie. Si vous décidez de les conserver, les modifications apportées à la mémoire tampon de copie sont appliquées à l'objet Recordset.

Le deuxième est que les modifications sont soit propagées à la source de données dès que vous déclarez que le travail sur une ligne est terminé (mode immédiat), ou que toutes les modifications apportées à un ensemble de lignes sont recueillies jusqu'à ce que vous déclariez que le travail sur l'ensemble est terminé (mode de traitement par lot). La propriété LockType détermine à quel moment les modifications sont apportées à la source de données sous-jacente. adLockOptimistic ou adLockPessimistic spécifie le mode immédiat, tandis que adLockBatchOptimistic spécifie le mode par lot. La propriété CursorLocation peut affecter quels paramètres LockType sont disponibles. Par exemple, le paramètre adLockPessimistic n'est pas pris en charge si la propriété CursorLocation est définie en adUseClient.

En mode immédiat, toute invocation de la méthode Update propage les modifications apportées à la source de données. En mode de traitement par lot, toute invocation de la méthode Update ou mouvement de la position de ligne courante entraîne l'enregistrement des modifications dans la mémoire tampon de copie, mais seule la méthode UpdateBatch propage les modifications à la source de données.


Mise à jour des données

Le comportement et la fonctionnalité de mise à jour dépend en grande partie du mode de mise à jour (type de verrou), du type de curseur et de l'emplacement du curseur.

Utilisez la méthode Update pour enregistrer les modifications que vous avez apportées à l'enregistrement actuel d'un objet Recordset depuis l'appel de la méthode AddNew ou depuis la modification des valeurs des champs dans un enregistrement existant. L'objet Recordset doit prendre en charge les mises à jour.

Si l'objet Recordset prend en charge la mise à jour par lots, vous pouvez mettre en mémoire cache locale plusieurs modifications apportées à un ou plusieurs enregistrements jusqu'à ce que vous appeliez la méthode UpdateBatch. Si vous modifiez l'enregistrement actuel ou ajoutez un nouvel enregistrement lorsque vous appelez la méthode UpdateBatch, ADO appelle automatiquement la méthode Update pour enregistrer les modifications en attente dans l'enregistrement actuel avant de transmettre les modifications par lots au fournisseur.

L'enregistrement actuel reste le même après l'appel de la méthode Update ou UpdateBatch.


Mode immédiat

Le mode immédiat est en vigueur lorsque la propriété LockType est définie en adLockOptimistic ou adLockPessimistic. En mode immédiat, les modifications apportées à un enregistrement sont propagées à la source de données dès que vous déclarez que le travail effectué sur une ligne est terminé en appelant la méthode Update.

Appel de la méthode Update

Si vous quittez l'enregistrement que vous ajoutez ou modifiez avant d'appeler la méthode Update, ADO appelle automatiquement la méthode Update pour enregistrer les modifications. Vous devez appeler la méthode CancelUpdate avant la navigation si vous voulez annuler les modifications apportées à l'enregistrement actuel ou supprimer un enregistrement que vous venez d'ajouter.

L'enregistrement actuel reste le même après l'appel de la méthode Update.

CancelUpdate, méthode

Utilisez la méthode CancelUpdate pour annuler toute modification apportée à la ligne en cours ou pour rejeter une ligne que vous venez d'ajouter. Vous ne pouvez pas annuler les modifications apportées à la ligne en cours ou à une nouvelle ligne après avoir appelé la méthode Update à moins que ces modifications fassent partie d'une transaction que vous pouvez annuler à l'aide de la méthode RollbackTrans ou partie d'une mise à jour par lot. En cas de mise à jour par lots, vous pouvez annuler l'exécution de la méthode Update à l'aide des méthodes CancelUpdate ou CancelBatch.

Si vous ajoutez une nouvelle ligne lorsque vous appelez la méthode CancelUpdate, la ligne en cours devient la ligne qui était en cours avant l'appel de AddNew.

Si vous n'avez ni modifié la ligne en cours ni ajouté une nouvelle ligne, l'appel de la méthode CancelUpdate génère une erreur.


Mode de traitement par lot

Le mode par lot est en vigueur lorsque la propriété LockType est paramétré en adLockBatchOptimistic et que la mise à jour par lot est prise en charge par le fournisseur. Certains paramètres de type de verrou ne sont pas disponibles suivant l'emplacement du curseur. Par exemple, le type de verrouillage pessimiste n'est pas disponible lorsque CursorLocation est défini en adUseClient. À l'inverse, un fournisseur peut ne pas prendre en charge un verrouillage de lot optimiste lorsque l'emplacement du curseur est sur le serveur. Vous devez utiliser la mise à jour par lots avec un curseur à jeu de clés ou statique uniquement.

La méthode UpdateBatch permet d'envoyer les modifications apportées au Recordset conservées dans la mémoire tampon au serveur afin de mettre à jour la source de données. Dans la section suivante, nous ouvrirons un Recordset en mode de traitement par lot, apporterons des modifications dans la mémoire tampon de copie et enverrons nos modifications à la source de données en faisant appel à la méthode UpdateBatch.


Envoi des mises à jour : Méthode UpdateBatch

Le code suivant permet d'ouvrir un Recordset en mode de traitement par lot en définissant la propriété LockType en adLockBatchOptimistic et la propriété CursorLocation en adUseClient. Il ajoute deux nouveaux enregistrements et modifie la valeur d'un champ dans un enregistrement existant, en enregistrant les valeurs originales, puis appelle la méthode UpdateBatch pour renvoyer les modifications à la source de données.

'BeginBatchUpdate
    strSQL = "SELECT ShipperId, CompanyName, Phone FROM Shippers"

    objRs1.CursorLocation = adUseClient
    objRs1.Open strSQL, strConn, adOpenStatic, adLockBatchOptimistic, adCmdText

    ' Change value of Phone field for first record in Recordset, saving value
    ' for later restoration.
    intId = objRs1("ShipperId")
    strPhone = objRs1("Phone")

    objRs1("Phone") = "(111) 555-1111"

    'Add two new records
    For i = 0 To 1
        objRs1.AddNew
        objRs1(1) = "New Shipper #" & CStr((i + 1))
        objRs1(2) = "(nnn) 555-" & i & i & i & i
    Next i

    ' Send the updates
    objRs1.UpdateBatch
'EndBatchUpdate

Si vous modifiez l'enregistrement courant ou ajoutez un nouvel enregistrement au moment d'appeler la méthode UpdateBatch, ADO appellera automatiquement la méthode Update pour enregistrer toutes les modifications en attente dans l'enregistrement courant avant de transmettre les modifications regroupées en lots au fournisseur.


Filtrage des enregistrements mis à jour

Avant d'appeler UpdateBatch, vous pouvez utiliser la propriété Filtrer du Recordset pour visualiser uniquement les enregistrements qui ont changé depuis l'ouverture du Recordset ou le dernier appel de la méthode UpdateBatch. Pour ce faire, définissez la propriété Filtrer en adFilterPendingRecords pour déterminer combien d'enregistrements seront mis à jour, comme illustré ci-dessous.

Cet exemple étend l'exemple UpdateBatch précédent en filtrant le Recordset juste avant d'appeler la méthode UpdateBatch, montrant à l'utilisateur quels enregistrements changeront et lui permettant d'annuler la mise à jour (à l'aide de la méthode CancelBatch).

'BeginFilterAffected
    objRs1.Filter = adFilterPendingRecords
    objRs1.MoveFirst

    strMsg = "The following " & objRs1.RecordCount & " values will " & _
             "be updated. Do you wish to proceed?"
    While Not objRs1.EOF
        strMsg = strMsg & vbCrLf & objRs1(0) & vbTab & objRs1(1) & vbTab & _
                 objRs1(2) & vbCrLf
        objRs1.MoveNext
    Wend

    blnResp = MsgBox(strMsg, vbYesNo, "Proceed with Update?")
    If blnResp = True Then
        objRs1.UpdateBatch
    Else
        objRs1.CancelBatch
    End If
'EndFilterAffected


Gestion des échecs de mise à jour

Lorsqu'une mise à jour se conclut par des erreurs, la résolution de ces dernières dépend de leur nature et de leur gravité, ainsi que de la logique de votre application. Néanmoins, si la base de données est partagée avec d'autres utilisateurs, il arrive souvent que quelqu'un d'autre modifie le champ avant vous. Ce type d'erreur est un conflit. ADO détecte cette situation et rapporte une erreur.

En cas d'erreurs de mise à jour, celles-ci sont interceptées par une routine de traitement des erreurs. Filtrez le Recordset avec la constante adFilterConflictingRecords de sorte que seules les lignes en conflit soient visibles. Dans cet exemple, la stratégie de résolution des erreurs réside dans l'impression des prénom et nom et l'auteur (au_fname et au_lname).

Le code permettant d'alerter l'utilisateur pour mettre à jour le conflit ressemble à ceci :

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


Détection et résolution des conflits

Si vous traitez votre Recordset en mode immédiat, vous risquez moins de rencontrer des problèmes de concurrence. D'un autre côté, si votre application utilise la mise à jour en mode par lot, le risque existe qu'un utilisateur modifie un enregistrement avant que les modifications apportées par un autre utilisateur au même enregistrement soient enregistrées. Dans un cas de ce type, il est préférable que votre application gère le conflit en douceur. Vous pouvez souhaiter que la dernière personne qui a envoyé une mise à jour au serveur « gagne ». Vous pouvez aussi préférer que l'utilisateur le plus récent puisse décider quelle mise à jour ait priorité en lui donnant le choix entre les deux valeurs en conflit.

Quelle que soit votre décision, ADO met à votre disposition des propriétés UnderlyingValue et OriginalValue de l'objet Field pour vous permettre de gérer ces types de conflits. Utilisez ces propriétés en combinaison avec la méthode Resync et la propriété Filter du Recordset.

Détection d'erreurs

Lorsque ADO rencontre un conflit au cours d'une mise à jour par lot, un avertissement est placé dans la collection Errors. Par conséquent, vous devez toujours rechercher les erreurs immédiatement après avoir appelé la méthode BatchUpdate. Si vous en trouvez, commencez par vérifier la supposition que vous avez rencontré un conflit. La première étape consiste à définir la propriété Filter du Recordsetà une valeur égale à adFilterConflictingRecords (la propriété Filter est traitée dans le chapitre précédent). Cela limite l'affichage de votre Recordset aux seuls enregistrements qui sont en conflit. Si la propriété RecordCount est égale à zéro après cette étape, vous savez que l'erreur ne provient pas d'un conflit.

Lorsque vous appelez la méthode BatchUpdate, ADO et le fournisseur génèrent des instructions SQL pour effectuer des mises à jour sur la source de données. Souvenez-vous que certaines sources de données ont des limites en ce qui concerne les types de colonnes pouvant être utilisés dans une clause WHERE.

Ensuite, appelez la méthode Resync sur le Recordset avec l'argument AffectRecords défini comme égal à adAffectGroup et l'argument ResyncValues défini comme égal à adResyncUnderlyingValues. La méthode Resync rafraîchit les données de l'objet Recordset courant dans la base de données sous-jacente. Avec adAffectGroup, vous veillez à ce que seuls les enregistrements visibles avec le paramétrage courant du filtre, à savoir les enregistrements en conflit, soient resynchronisés avec la base de données. Cela peut engendrer des différences de performances significatives notamment si vous traitez un Recordset volumineux. En paramétrant l'argument ResyncValues en adResyncUnderlyingValues lorsque vous appelez la méthode Resync, vous veillez à ce que la propriété UnderlyingValue contienne la valeur (en conflit) de la base de données, à ce que la propriété Value conserve la valeur entrée par l'utilisateur et à ce que la propriété OriginalValue conserve la valeur originale du champ (la valeur qu'il possédait avant le dernier appel UpdateBatch réussi). Vous pouvez ensuite utiliser ces valeurs pour résoudre le conflit par programmation ou faire en sorte que l'utilisateur choisisse la valeur voulue.

Cette technique est illustrée dans l'exemple de code ci-dessous. L'exemple crée artificiellement un conflit en utilisant un Recordset distinct pour modifier une valeur dans la table sous-jacente avant que la méthode UpdateBatch soit appelée.

'BeginConflicts
    On Error GoTo ErrHandler:

    Dim objRs1 As New ADODB.Recordset
    Dim objRs2 As New ADODB.Recordset
    Dim strSQL As String
    Dim strMsg As String

    strSQL = "SELECT * FROM Shippers WHERE ShipperID = 2"

    'Open Rs and change a value
    objRs1.CursorLocation = adUseClient
    objRs1.Open strSQL, strConn, adOpenStatic, adLockBatchOptimistic, adCmdText
    objRs1("Phone") = "(111) 555-1111"

    'Introduce a conflict at the db...
    objRs2.Open strSQL, strConn, adOpenKeyset, adLockOptimistic, adCmdText
    objRs2("Phone") = "(999) 555-9999"
    objRs2.Update
    objRs2.Close
    Set objRs2 = Nothing

    On Error Resume Next
    objRs1.UpdateBatch

    If objRs1.ActiveConnection.Errors.Count <> 0 Then
        Dim intConflicts As Integer

        intConflicts = 0

        objRs1.Filter = adFilterConflictingRecords

        intConflicts = objRs1.RecordCount

        'Resync so we can see the UnderlyingValue and offer user a choice.
        'This sample only displays all three values and resets to original.
        objRs1.Resync adAffectGroup, adResyncUnderlyingValues

        If intConflicts > 0 Then
            strMsg = "A conflict occurred with updates for " & intConflicts & _
                     " record(s)." & vbCrLf & "The values will be restored" & _
                     " to their original values." & vbCrLf & vbCrLf

            objRs1.MoveFirst
            While Not objRs1.EOF
                strMsg = strMsg & "SHIPPER = " & objRs1("CompanyName") & vbCrLf
                strMsg = strMsg & "Value = " & objRs1("Phone").Value & vbCrLf
                strMsg = strMsg & "UnderlyingValue = " & _
                                   objRs1("Phone").UnderlyingValue & vbCrLf
                strMsg = strMsg & "OriginalValue = " & _
                                   objRs1("Phone").OriginalValue & vbCrLf
                strMsg = strMsg & vbCrLf & "Original value has been restored."

                MsgBox strMsg, vbOKOnly, _
                      "Conflict " & objRs1.AbsolutePosition & _
                      " of " & intConflicts

                objRs1("Phone").Value = objRs1("Phone").OriginalValue
                objRs1.MoveNext
            Wend

            objRs1.UpdateBatch adAffectGroup
        Else
            'Other error occurred. Minimal handling in this example.
             strMsg = "Errors occurred during the update. " & _
                        objRs1.ActiveConnection.Errors(0).Number & " " & _
                        objRs1.ActiveConnection.Errors(0).Description
        End If

        On Error GoTo 0
    End If

    objRs1.MoveFirst

    'Clean up
    objRs1.Close
    Set objRs1 = Nothing
    Exit Sub

ErrHandler:

    If Not objRs1 Is Nothing Then
        If objRs1.State = adStateOpen Then objRs1.Close
        Set objRs1 = Nothing
    End If

    If Not objRs2 Is Nothing Then
        If objRs2.State = adStateOpen Then objRs2.Close
        Set objRs2 = Nothing
    End If

    If Err <> 0 Then
        MsgBox Err.Source & "-->" & Err.Description, , "Error"
    End If

'EndConflicts

Vous pouvez utiliser la propriété Status de l'objet Record courant ou d'un objet Field spécifique pour déterminer quel type de conflit s'est produit.

Pour plus d'informations sur la gestion des erreurs, consultez le Chapitre 6 : Gestion des erreurs.


Déconnexion et reconnexion du Recordset

Une des fonctionnalités les plus puissantes d'ADO est la capacité d'ouvrir un Recordset côté client, puis de déconnecter le Recordset de la source de données. Une fois le Recordset déconnecté, la connexion à la source de données peut être fermée, libérant ainsi les ressources serveur utilisée pour la maintenir ouverte. Vous pouvez continuer à visualiser et modifier les données du Recordset pendant sa déconnexion, puis les reconnecter plus tard à la source et envoyer vos mises à jour en mode de traitement par lot.

Pour déconnecter Recordset, ouvrez-le avec un emplacement de curseur adUseClient, puis définissez la propriété ActiveConnection en tant que Nothing. (Les utilisateurs C++ doivent définir ActiveConnection comme étant NULL pour procéder à la déconnexion.)

Nous utiliserons un Recordset déconnecté ultérieurement dans ce chapitre, lorsque nous aborderons la persistance du Recordset dans le cadre d'un scénario dans lequel nous les données d'un Recordset devront être disponibles à une application alors que l'ordinateur client ne sera pas connecté au réseau.


Mise à jour de résultats joints : Table unique

ADO vous permet de contrôler de près les modifications apportées à une table de base particulière dans un Recordset formé par une opération JOIN sur plusieurs tables de base à l'aide de la propriété dynamique Unique Table. Pour plus d'informations sur l'utilisation de Unique Table, consultez les rubriques du guide de référence du programmeur ADO sur les propriétés dynamiques Unique Table et Update Resynch.


Traitement des transactions

ADO propose les méthodes suivantes pour contrôler les transactions : BeginTrans, CommitTrans et RollbackTrans. Utilisez ces méthodes avec un objet Connection si vous souhaitez enregistrer ou annuler une série de modifications apportées aux données source en tant qu'unité unique. Par exemple, pour transférer de l'argent entre deux comptes, vous soustrayez un montant d'un compte et augmentez d'autant l'autre compte. Si l'une ou l'autre des mises à jour échoue, les comptes ne sont plus équilibrés. Effectuer ces modifications au sein d'une transaction ouverte garantit que les modifications seront effectuées en totalité ou pas du tout.

Note Certains fournisseurs ne prennent pas en charge les transactions. Vérifiez que la propriété définie par le fournisseur Transaction DDL apparaît dans la collection Properties de l'objet Connection, ce qui indique que le fournisseur prend en charge les transactions. Si le fournisseur ne prend pas en charge les transactions, l'appel de l'une de ces méthodes renvoie une erreur.

Une fois que vous appelez la méthode BeginTrans, le fournisseur ne valide plus les modifications immédiatement tant que vous n'avez pas appelé CommitTrans ou RollbackTrans pour mettre fin à la transaction.

L'appel de la méthode CommitTrans enregistre les modifications effectuées dans le cadre d'une transaction ouverte sur la connexion et met fin à la transaction. L'appel de la méthode RollbackTrans annule les modifications effectuées dans le cadre d'une transaction ouverte et met fin à la transaction. L'appel de l'une de ces méthodes alors qu'aucune transaction n'est ouverte génère une erreur.

En fonction de la propriété Attributes de l'objet Connection, l'appel de la méthode CommitTrans ou RollbackTrans peut lancer automatiquement une nouvelle transaction. Si la propriété Attributes a comme valeur adXactCommitRetaining, le fournisseur commence automatiquement une nouvelle transaction après l'appel de CommitTrans. Si la propriété Attributes a comme valeur adXactAbortRetaining, le fournisseur commence automatiquement une nouvelle transaction après l'appel de RollbackTrans.

Niveau d'isolation de la transaction

Utilisez la propriété IsolationLevel pour définir le niveau d'isolation d'un objet Connection. La valeur de cette propriété ne prend effet que lorsque vous rappelez la méthode BeginTrans. Si le niveau d'isolation que vous demandez n'est pas disponible, le fournisseur renvoie éventuellement le niveau d'isolation immédiatement supérieur. Pour plus d'informations sur les valeurs valides, consultez la propriété IsolationLevel dans le Guide de référence du programmeur ADO.

Transactions imbriquées

Pour les fournisseurs qui prennent en charge les transactions imbriquées, l'appel de la méthode BeginTrans dans le cadre d'une transaction en cours lance une nouvelle transaction, imbriquée. La valeur de retour indique le niveau de l'imbrication : une valeur de retour « 1 » correspond à une transaction de niveau supérieur (la transaction n'est pas imbriquée dans une autre transaction), « 2 » indique vous avez ouvert une transaction de deuxième niveau (une transaction imbriquée dans une transaction de niveau supérieur), et ainsi de suite. L'appel de CommitTrans ou de RollbackTrans affecte seulement la dernière transaction ouverte ; vous devez fermer ou annuler la transaction en cours avant de résoudre des transactions de niveau supérieur.


Persistance des données

L'informatique portable (et l'emploi grandissant des ordinateurs portables) a créé le besoin d'applications capables de fonctionner aussi bien connectées que déconnectées. ADO répond à ces nouveaux besoins en offrant au développeur la capacité d'enregistrer sur disque un Recordset de curseur client et de le recharger ultérieurement.

Il existe plusieurs scénarios dans lesquels vous pouvez utiliser ce type de fonctionnalité, notamment :

  • En déplacement : Lorsque vous emmenez une application en déplacement, il est vital de pouvoir modifier et ajouter des enregistrements pouvant être reconnectés et validés ultérieurement dans la base de données.
  • Consultations à mises à jour non fréquentes : Souvent dans une application, des tables sont utilisées à des fins de consultation, par exemple les tables de taxes. Elles sont rarement mises à jour et sont en lecture seule. Au lieu de relire ces données à partir du serveur chaque fois que l'application est démarrée, l'application peut simplement charger les données depuis un Recordset local rendu persistant.

Dans ADO, pour enregistrer et charger des Recordsets, utilisez les méthodes Recordset.Save et Recordset.Open(,,,,adCmdFile) sur l'objet Recordset ADO.

Vous pouvez utiliser la méthode Save du Recordset pour rendre persistant votre Recordset ADO dans un fichier sur disque. (Vous pouvez également enregistrer un Recordset dans un objet Stream ADO. Les objets Stream sont traités ultérieurement dans ce guide.) Ensuite, vous pourrez utiliser la méthode Open pour rouvrir le Recordset lorsque vous serez prêt à l'utiliser. Par défaut, ADO enregistre le Recordset dans le format propriétaire Microsoft ADTG (Advanced Data TableGram). Ce format binaire est spécifié à l'aide de la valeur PersistFormatEnum de adPersistADTG. Autrement, vous pouvez choisir d'enregistrer votre Recordset au format XML à l'aide de la propriété adPersistXML. Pour plus d'informations sur l'enregistrement de Recordsets au format XML, consultez Persistance d'enregistrements au format XML.

La syntaxe de la méthode Save est la suivante :

recordset.Save Destination, PersistFormat

La première fois que vous enregistrez l'objet Recordset, le paramètre Destination est facultatif. Si vous omettez Destination, un nouveau fichier est créé dont le nom est défini par la valeur de la propriété Source de l'objet Recordset.

Omettez le paramètre Destination lorsque vous appelez la méthode Save après avoir effectué un premier enregistrement de l'objet, faute de quoi une erreur d'exécution se produit. Si vous appelez la méthode Save ultérieurement en spécifiant un nouveau paramètre Destination, l'objet Recordset est enregistré au nouvel emplacement de destination. Toutefois, le nouveau fichier de destination et le fichier de destination d'origine sont tous les deux ouverts simultanément.

La méthode Save n'entraîne pas la fermeture des objets Recordset ou Destination ; vous pouvez donc continuer à travailler avec le Recordset et enregistrer vos dernières modifications. Destination reste ouvert tant que l'objet Recordset n'est pas fermé, ce qui permet aux autres applications de lire Destination, mais pas d'y écrire.

Pour des raisons de sécurité, la méthode Save permet uniquement l'utilisation de paramètres de sécurité faibles et personnalisés à partir d'un script exécuté par Microsoft Internet Explorer. Pour une présentation plus détaillée des problèmes de sécurité, consultez « ADO and RDS Security Issues in Microsoft Internet Explorer » sous ActiveX Data Objects (ADO) Technical Articles dans Microsoft Data Access Technical Articles.

Si la méthode Save est appelée au moment où une opération asynchrone de récupération, d'exécution ou de mise à jour d'un objet Recordset est en cours, la méthode Save attend que cette opération asynchrone soit terminée avant de s'exécuter.

Les enregistrements sont enregistrés à partir de la première ligne de l'objet Recordset. Lorsque l'exécution de la méthode Save est terminée, la première ligne de l'objet Recordset devient la ligne en cours.

Pour obtenir de meilleurs résultats, affectez à la propriété CursorLocation la valeur adUseClient avec Save. Si votre fournisseur ne prend pas en charge toutes les fonctionnalités nécessaires pour enregistrer des objets Recordset le Cursor Service fournira cette fonctionnalité.

Lorsqu'un objet Recordset est rendu persistant avec la propriété CursorLocation égale à adUseServer, les possibilités de mise à jour du Recordset sont limitées. En général, seules les mises à jour, insertions et suppressions qui ne concernent qu'une table sont autorisées (selon les fonctionnalités du fournisseur). La méthode Resync n'est pas disponible non plus dans cette configuration.

Étant donné que le paramètre Destination peut accepter n'importe quel objet qui prend en charge l'interface OLE DB IStream, vous pouvez enregistrer un Recordset directement dans l'objet Response ASP.

Dans l'exemple suivant, les méthodes Save et Open sont utilisées pour rendre persistant un Recordset puis le rouvrir plus tard :

'BeginPersist
    conn.ConnectionString = _
    "Provider='SQLOLEDB';Data Source='MySqlServer';" _
        & "Integrated Security='SSPI';Initial Catalog='pubs'"
    conn.Open

    conn.Execute "create table testtable (dbkey int " & _
        "primary key, field1 char(10))"
    conn.Execute "insert into testtable values (1, 'string1')"

    Set rst.ActiveConnection = conn
    rst.CursorLocation = adUseClient

    rst.Open "select * from testtable", conn, adOpenStatic, _
       adLockBatchOptimistic

    'Change the row on the client
    rst!field1 = "NewValue"

    'Save to a file--the .dat extension is an example; choose
    'your own extension. The changes will be saved in the file
    'as well as the original data.
    MyFile = Dir("c:\temp\temptbl.dat")
    If MyFile <> "" Then
        Kill "c:\temp\temptbl.dat"
    End If

    rst.Save "c:\temp\temptbl.dat", adPersistADTG
    rst.Close
    Set rst = Nothing

    'Now reload the data from the file
    Set rst = New ADODB.Recordset
    rst.Open "c:\temp\temptbl.dat", , adOpenStatic, _
       adLockBatchOptimistic, adCmdFile

    Debug.Print "After Loading the file from disk"
    Debug.Print "   Current Edited Value: " & rst!field1.Value
    Debug.Print "   Value Before Editing: " & rst!field1.OriginalValue

    'Note that you can reconnect to a connection and
    'submit the changes to the data source
    Set rst.ActiveConnection = conn
    rst.UpdateBatch
'EndPersist


Informations complémentaires sur la persistance d'un Recordset

L'objet ADO Recordset prend en charge le stockage du contenu d'un objet Recordset dans un fichier avec sa méthode Save. Le fichier stocké de manière permanente peut exister sur un lecteur local, un serveur réseau ou comme URL sur un site Web. Par la suite, le fichier peut être restauré à l'aide de la méthode Open de l'objet Recordset ou de la méthode Execute de l'objet Connection.

D'autre part, la méthode GetString convertit un objet Recordset dans un format où les colonnes et les lignes sont délimitées par des caractères que vous spécifiez.

Pour rendre un objet Recordset permanent, commencez par le convertir en un format enregistrable dans un fichier. Les objets Recordset peuvent être enregistrés dans le format propriétaire ADTG (Advanced Data TableGram) ou dans le format ouvert XML (Extensible Markup Language). Vous trouverez des exemples de format ADTG ci-dessous. Pour plus d'informations sur la persistance XML, consultez Rendre des enregistrements permanents au format XML.

Enregistrez les modifications en attente dans le fichier persistant. Vous pouvez ainsi émettre une requête qui renvoie un objet Recordset, modifie ce dernier et l'enregistre avec les changements en attente, restaure ultérieurement Recordset, puis met à jour la source de données avec les changements en attente ayant été enregistrés.

Pour plus d'informations sur le stockage persistant d'objets Stream, consultez Objets Stream et persistance dans le chapitre 10.

Pour obtenir un exemple de persistance d'un objet Recordset, consultez Scénario de persistance d'un Recordset XML.

Exemple

Enregistrer un Recordset :

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

Ouvrir un fichier persistant à l'aide de Recordset.Open :

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

Si l'objet Recordset n'a pas de connexion active, vous pouvez accepter toutes les valeurs par défaut et utiliser simplement le code suivant :

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

Ouvrir un fichier persistant à l'aide de Connection.Execute :

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

Ouvrir un fichier persistant à l'aide de RDS.DataControl :

Dans ce cas, la propriété Server n'est pas définie.

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

Voir aussi

GetString, méthode | Fournisseur de persistance Microsoft OLE DB | Recordset, objet | Objets Stream et persistance


Persistance de Recordsets filtrés et hiérarchiques

Si la propriété Filter est utilisée pour l'objet Recordset, seules les lignes accessibles sous le filtre sont enregistrées. Si l'objet Recordset est hiérarchique, l'objet Recordset enfant en cours et ses enfants sont enregistrés ainsi que l'objet Recordset parent. Si la méthode Save d'un objet Recordset enfant est appelée, le Recordset enfant et tous ses enfants sont enregistrés, mais pas le Recordset parent. Pour plus d'informations sur les Recordsets hiérarchiques, consultez le Chapitre 9 : Mise en forme des données.

Note L'enregistrement de Recordsets hiérarchiques (formes de données) au format XML est soumis à certaines restrictions. Pour plus d'informations, consultez Recordsets hiérarchiques dans XML.


Persistance d'enregistrements au format XML

Comme en format ADTG, la persistance du Recordset au format XML est implémentée par le Fournisseur de persistance Microsoft OLE DB. Ce fournisseur génère un ensemble de lignes à défilement en avant seulement et en lecture seule à partir d'un fichier XML enregistré ou d'un flux qui contient des informations de schéma générées par ADO. De même, il peut prendre un Recordset ADO, générer XML, et l'enregistrer dans un fichier ou autre objet qui implémente l'interface IStream COM. (En fait, un fichier n'est rien d'autre qu'un objet qui implémente l'interface IStream.) Pour les versions 2.5 et ultérieures, ADO compte sur le Microsoft XML Parser (MSXML) pour charger XML dans le Recordset et nécessite donc msxml.dll. Pour la version 2.5, MSXML est fourni avec Internet Explorer 5. Pour la version 2.6, MSXML est fournie avec SQL Server 2000.

Note L'enregistrement de Recordsets hiérarchiques (formes de données) au format XML est soumis à certaines restrictions. Vous ne pouvez pas enregistrer au format XML un objet Recordset hiérarchique qui contient des mises à jour en attente et vous ne pouvez pas enregistrer un objet Recordset hiérarchique paramétré. Pour plus d'informations, consultez Recordsets hiérarchiques dans XML.

La manière la plus simple de rendre des données persistantes dans XML et de les charger à nouveau via ADO consiste à utiliser respectivement les méthodes Save et Open. L'exemple de code ADO suivant illustre l'enregistrement de données de la table Titles dans un fichier nommé titles.sav.

Dim rs as new Recordset
Dim rs2 as new Recordset
Dim c as new Connection
Dim s as new Stream

' Query the Titles table.
c.Open "provider='sqloledb';data source='mydb';initial catalog='pubs';Integrated Security='SSPI'"
rs.cursorlocation = adUseClient
rs.Open "select * from titles", c, adOpenStatic

' Save to the file in the XML format. Note that if you don't specify
' adPersistXML, a binary format (ADTG) will be used by default.
rs.Save "titles.sav", adPersistXML

' Save the Recordset into the ADO Stream object.
rs.save s, adPersistXML
rs.Close
c.Close

set rs = nothing

' Reopen the file.
rs.Open "titles.sav",,,,adCmdFile
' Open the Stream back into a Recordset.
rs2.open s

ADO rend toujours persistant l'ensemble de l'objet Recordset. Si vous souhaitez uniquement rendre persistant un sous-ensemble de lignes de l'objet Recordset, utilisez la méthode Filter pour réduire le nombre de lignes ou modifier votre clause de sélection. Toutefois, vous devez ouvrir un objet Recordset avec un curseur côté client (CursorLocation = adUseClient) pour utiliser la méthode Filter afin d'enregistrer un sous-ensemble de lignes. Par exemple, pour extraire les titres qui commencent par la lettre « b », vous pouvez appliquer un filtre sur un objet Recordset ouvert :

rs.Filter "title_id like 'B*'"
rs.Save "btitles.sav", adPersistXML

ADO utilise toujours l'ensemble de lignes Client Cursor Engine pour produire un objet Recordset capable de défilement et dans lequel vous pouvez utiliser des signets, en plus des données à défilement vers l'avant seulement générées par le fournisseur de persistance.


Format de persistance XML

ADO utilise le codage UTF-8 pour rendre le flux XML permanent.

Le format ADO XML comprend deux sections, une section de schéma suivie d'une section des données. Voici un exemple de fichier XML pour la table Expéditeurs de la base de données Les Comptoirs. Diverses parties du code XML sont abordées à la suite de l'exemple.

<xml xmlns:s="uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882"
xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882"
xmlns:rs="urn:schemas-microsoft-com:rowset"
xmlns:z="#RowsetSchema">
  <s:Schema id="RowsetSchema">
    <s:ElementType name="row" content="eltOnly" rs:updatable="true">
      <s:AttributeType name="ShipperID" rs:number="1"
        rs:basetable="shippers" rs:basecolumn="ShipperID"
        rs:keycolumn="true">
        <s:datatype dt:type="int" dt:maxLength="4" rs:precision="10"
          rs:fixedlength="true" rs:maybenull="false"/>
      </s:AttributeType>
      <s:AttributeType name="CompanyName" rs:number="2"
        rs:nullable="true" rs:write="true" rs:basetable="shippers"
        rs:basecolumn="CompanyName">
        <s:datatype dt:type="string" dt:maxLength="40" />
      </s:AttributeType>
      <s:AttributeType name="Phone" rs:number="3" rs:nullable="true"
        rs:write="true" rs:basetable="shippers"
        rs:basecolumn="Phone">
        <s:datatype dt:type="string" dt:maxLength="24"/>
      </s:AttributeType>
      <s:extends type="rs:rowbase"/>
    </s:ElementType>
  </s:Schema>

  <rs:data>
    <z:row ShipperID="1" CompanyName="Speedy Express"
      Phone="(503) 555-9831"/>
    <z:row ShipperID="2" CompanyName="United Package"
      Phone="(503) 555-3199"/>
    <z:row ShipperID="3" CompanyName="Federal Shipping"
      Phone="(503) 555-9931"/>
  </rs:data>
</xml>

Les déclarations des espaces de noms, la section du schéma et la section des données sont montrées. La section du schéma contient les définitions pour la ligne, ShipperID, CompanyName et Phone.

Les définitions de la section du schéma sont conformes à la spécification XML-Data et peuvent être complètement validées (même si la validation n'a pas lieu dans Internet Explorer 5). Vous pouvez consulter cette spécification à l'adresse suivante : http://www.w3.org/TR/1998/NOTE-XML-data/. XML-Data est le seul format de schéma actuellement pris en charge pour la persistance de Recordset.

La section des données comporte trois lignes qui contiennent des informations sur les expéditeurs. Pour un ensemble de lignes vide, la section des données peut être vide, mais les balises <rs:data> doivent être présentes. En l'absence de données, vous pouvez tout simplement écrire la balise de manière sténographique sous la forme <rs:data/>. Toute balise précédée de « rs » indique qu'elle fait partie de l'espace de noms défini par urn:schemas-microsoft-com:rowset. La définition complète de ce schéma figure dans l'annexe de ce document.


Espaces de noms

Dans ADO, le format de persistance XML utilise quatre espaces de noms.

Préfixe | Description
s | Fait référence à l'espace de nom « XML-Data » qui contient les éléments et attributs qui définissent le schéma du Recordset courant.
dt | Fait référence à la spécification des définitions de type de données.
rs | Fait référence à l'espace de nom contenant les éléments et attributs spécifiques aux propriétés et attributs du Recordset ADO.
z | Fait référence au schéma de l'ensemble de lignes courant.

Conformément à la spécification, un client ne doit pas ajouter ses propres balises à ces espaces de noms. Par exemple, un client ne doit pas définir un espace de nom comme « urn:schemas-microsoft-com:rowset » puis écrire quelque chose comme « rs:MyOwnTag ». Pour plus d'informations sur les espaces de noms, consultez http://www.w3.org/TR/REC-xml-names/.

Important L'identificateur de la balise du schéma doit être « RowsetSchema » et l'espace de nom utilisé pour faire référence au schéma de l'ensemble de lignes courant doit pointer vers « #RowsetSchema ».

Notez que le préfixe de l'espace de nom, c'est-à-dire la partie à droite des deux points et à gauche du signe égal, est arbitraire.

xmlns:rs="urn:schemas-microsoft-com:rowset"

L'utilisateur peut définir cette partie comme n'importe quel nom à condition que ce nom soit utilisé systématiquement dans l'ensemble du document XML. ADO emploie toujours « s », « rs », « dt » et « z », mais ces préfixes ne sont pas codés en dur dans le composant de chargement.


Section du schéma

La section du schéma est requise. Comme l'illustre l'exemple précédent, ADO copie des métadonnées détaillées à propos de chaque colonne afin de préserver autant que possible la sémantique des valeurs de données en vue de la mise à jour. Toutefois, pour charger XML, ADO ne nécessite que le nom des colonnes et l'ensemble de lignes auquel elles appartiennent. Voici un exemple d'un schéma minimal :

<xml xmlns:s="uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882"
    xmlns:rs="urn:schemas-microsoft-com:rowset"
    xmlns:z="#RowsetSchema">
  <s:Schema id="RowsetSchema">
    <s:ElementType name="row" content="eltOnly">
      <s:AttributeType name="ShipperID"/>
      <s:AttributeType name="CompanyName"/>
      <s:AttributeType name="Phone"/>
      <s:Extends type="rs:rowbase"/>
    </s:ElementType>
  </s:Schema>
  <rs:data>
...
  </rs:data>
</xml>

Dans l'exemple ci-dessus, ADO traitera les données comme des chaînes de longueur variable car aucune information de type n'est incluse dans le schéma.

Création d'alias pour les noms de colonne

L'attribut rs:name vous permet de créer un alias pour un nom de colonne de sorte qu'un nom convivial peut apparaître dans les informations de colonne présentées par l'ensemble de lignes et un nom plus court être employé dans la section des données. Par exemple, le schéma ci-dessus peut être modifié pour mapper ShipperID et s1, CompanyName et s2 et Phone et s3, comme suit :

<s:Schema id="RowsetSchema">
<s:ElementType name="row" content="eltOnly" rs:updatable="true">
<s:AttributeType name="s1" rs:name="ShipperID" rs:number="1" ...>
...
</s:AttributeType>
<s:AttributeType name="s2" rs:name="CompanyName" rs:number="2" ...>
...
</s:AttributeType>
<s:AttributeType name="s3" rs:name="Phone" rs:number="3" ...>
...
</s:AttributeType>
...
</s:ElementType>
</s:Schema>

Ensuite, dans la section des données, la ligne utiliserait l'attribut du nom (pas rs:nom) pour faire référence à cette colonne :

"<row s1="1" s2="Speedy Express" s3="(503) 555-9831"/>

Créer des alias pour les noms de colonne est nécessaire chaque fois qu'un nom de colonne n'est pas un attribut légal ou ou un nom de balise dans XML. Par exemple, « LastName » doit avoir un alias car les noms qui contiennent des espaces sont des attributs illégaux. La ligne suivante ne sera pas correctement traitée par l'analyseur XML. Vous devez donc créer un alias en choisissant un nom qui ne contient pas d'espace :

<row last name="Jones"/>

La valeur que vous utilisez pour l'attribut du nom doit être employée de manière cohérente chaque fois que la colonne est référencée dans les sections du schéma et des données du document XML. L'exemple suivant illustre l'utilisation cohérente de s1 :

<s:Schema id="RowsetSchema">
  <s:ElementType name="row" content="eltOnly">
    <s:attribute type="s1"/>
    <s:attribute type="CompanyName"/>
    <s:attribute type="s3"/>
    <s:extends type="rs:rowbase"/>
  </s:ElementType>
  <s:AttributeType name="s1" rs:name="ShipperID" rs:number="1"
    rs:maydefer="true" rs:writeunknown="true">
    <s:datatype dt:type="i4" dt:maxLength="4" rs:precision="10"
      rs:fixedlength="true" rs:maybenull="true"/>
  </s:AttributeType>
</s:Schema>
<rs:data>
  <z:row s1="1" CompanyName="Speedy Express" s3="(503) 555-9831"/>
</rs:data>

De même, étant donné qu'aucun alias n'est défini pour CompanyName ci-dessus, CompanyName doit être systématiquement utilisé dans l'ensemble du document.

Types de données

Vous pouvez appliquer un type de données à une colonne à l'aide de l'attribut dt:type. Pour la liste définitive des types XML autorisés, consultez http://www.w3.org/TR/1998/NOTE-XML-data-0105/#Datatypes. Vous pouvez spécifier un type de données de deux manières : spécifiez directement l'attribut dt:type sur la définition de colonne elle-même ou utilisez la construction s:datatype comme élément imbriqué de la définition de la colonne. Par exemple,

<s:AttributeType name="Phone" >
  <s:datatype dt:type="string"/>
</s:AttributeType>

équivaut à

<s:AttributeType name="Phone" dt:type="string"/>

Si vous omettez entièrement l'attribut dt:type de la définition de ligne, le type de la colonne sera par défaut une chaîne de longueur variable.

Si vous disposez de plus d'informations sur le type que le simple nom du type (par exemple, dt:maxLength), il est préférable pour des raisons de lisibilité d'utiliser l'élément enfant s:datatype. Il s'agit d'une convention, qui n'est donc pas obligatoire.

Les exemples suivants illustrent comment inclure des informations de type dans votre schéma :

<!-- 1. String with no max length -->
<s:AttributeType name="title_id"/>
<!—or -->
<s:AttributeType name="title_id" dt:type="string"/>

<!—- 2. Fixed length string with max length of 6 -->
<s:AttributeType name="title_id">
    <s:datatype dt:type="string" dt:maxLength="6" rs:fixedlength="true" />
</s:AttributeType>

<!—- 3. Variable length string with max length of 6 -->
<s:AttributeType name="title_id">
    <s:datatype dt:type="string" dt:maxLength="6" />
</s:AttributeType>

<!—- 4. Integer -->
<s:AttributeType name="title_id" dt:type="int"/>

Le deuxième exemple illustre une utilisation subtile de l'attribut rs:fixedlength. Une colonne dont l'attribut rs:fixedlength est défini comme vrai signifie que les données doivent avoir une longueur définie dans le schéma. Dans ce cas, title_id peut avoir « 123456 » comme valeur légale, tout comme « 123 ». Cependant, « 123 » ne serait pas une valeur autorisée car sa longueur est de trois caractères, et non de six. Pour une description plus complète de la propriété fixedlength, consultez le Guide du programmeur OLE DB.

Gestion des valeurs nulles

Les valeurs nulles sont gérées par l'attribut rs:maybenull. Si cet attribut est défini comme étant vrai, le contenu de la colonne peut contenir une valeur nulle. De plus, si la colonne ne se trouve dans une ligne de données, l'utilisateur lisant les données à partir de l'ensemble de lignes obtiendra le statut null pour IRowset::GetData(). Partons des définitions de colonnes suivantes, extraites de la table Shippers :

<s:AttributeType name="ShipperID">
  <s:datatype dt:type="int" dt:maxLength="4"/>
</s:AttributeType>
<s:AttributeType name="CompanyName">
  <s:datatype dt:type="string" dt:maxLength="40" rs:maybenull="true"/>
</s:AttributeType>

Les définitions permettent à la colonne CompanyName d'être nulle, mais ShipperID ne peut pas contenir de valeur nulle. Si la section de données contenait la ligne suivante, le fournisseur de persistance définirait l'état des données de la colonne CompanyName à l'aide de la constante d'état OLE DB DBSTATUS_S_ISNULL :

<z:row ShipperID="1"/>

Si la ligne était entièrement vide, comme suit, le fournisseur de persistance renverrait le statut OLE DB DBSTATUS_E_UNAVAILABLE pour ShipperID et DBSTATUS_S_ISNULL pour CompanyName.

<z:row/>

Note qu'une chaîne vide n'est pas identique à une chaîne nulle.

<z:row ShipperID="1" CompanyName=""/>

Dans le cas de la ligne précédente, le fournisseur de persistance renvoie l'état OLE DB DBSTATUS_S_OK pour les deux colonnes. Dans ce cas, la colonne CompanyName est simplement "" (une chaîne vide).

Pour plus d'informations sur les constructions OLE DB pouvant être utilisées dans le schéma dans document XML pour OLE DB, consultez la définition de « urn:schemas-microsoft-com:rowset » et le Guide du programmeur OLE DB.


Section de données

La section des données définit les données de l'ensemble de lignes, ainsi que toute mise à jour, insertion ou suppression en attente. La section de données peut contenir plusieurs lignes ou ne pas en contenir du tout. Elle peut ne contenir que des données d'un ensemble de lignes, où la ligne est définie par le schéma. Par ailleurs, comme déjà signalé, les colonnes dépourvues de données peuvent être omises. Si un attribut ou sous-élément est utilisé dans la section de données alors que cette construction n'a pas été définie dans la section du schéma, celui est ignoré.

Chaîne

Les caractères XML réservés dans les données de texte doivent être remplacés par des entités de caractères appropriées. Par exemple, dans le nom de société « Joe's Garage », l'apostrophe doit être remplacé par une entité. La vraie ligne se présenterait comme suit :

<z:row CompanyName="Joe&apos;s Garage"/>

Les caractères suivants sont réservés dans XML et doivent être remplacés par des entités de caractères : {',",&,<,>}.

Binaire

Les données binaires sont codées en bin.hex (ce qui signifie qu'un octet mappe deux caractères, un caractère par quartet).

DateHeure

La variante de format VT_DATE n'est pas directement prise en charge par les types de données XML-Data. Le format correct des dates dotées d'un composant données et d'un composant heure est aaaa-mm-jjThh:mm:ss.

Pour plus d'informations sur les formats de date spécifiés par XML, consultez http://www.w3.org/TR/1998/NOTE-XML-data-0105/#Datatypes.

Lorsque la spécification XML-Data définit deux types de données équivalents (par exemple, i4 == int), ADO écrira le nom convivial, mais le lira dans les deux.

Gestion des modifications en attente

Un Recordset peut être ouvert en mode de mise à jour immédiate ou par lot. Lorsqu'un jeu d'enregistrements est ouvert en mode de mise à jour par lot avec des curseurs côté client, toutes les modifications apportées au Recordset sont dans un état d'attente jusqu'à ce que la méthode UpdateBatch soit appelée. Les modifications en attente sont également rendues persistantes lorsque le Recordset est enregistré. Dans XML, elles sont représentées par l'utilisation des éléments de mise à jour définis dans urn:schemas-microsoft-com:rowset. De plus, si un ensemble de lignes peut être mis à jour, la propriété pouvant être mise à jour doit être définie comme vraie dans la définition de la ligne. Par exemple, pour définir que la table Shippers contient des modifications en attente, la définition de la ligne se présentera comme suit :

<s:ElementType name="row" content="eltOnly" updatable="true">
  <s:attribute type="ShipperID"/>
  <s:attribute type="CompanyName"/>
  <s:attribute type="Phone"/>
  <s:extends type="rs:rowbase"/>
</s:ElementType>

Cela indique au fournisseur de persistance de ramener des données à la surface de sorte qu'ADO puisse construire un objet Recordset pouvant être mis à jour.

Les exemples de données suivantes montrent comment les insertions, les modifications et les suppressions apparaissent dans le fichier rendu persistant :

<rs:data>
  <z:row ShipperID="2" CompanyName="United Package"
    Phone="(503) 555-3199"/>
<rs:update>
  <rs:original>
    <z:row ShipperID="3" CompanyName="Federal Shipping"
      Phone="(503) 555-9931"/>
  </rs:original>
  <z:row Phone="(503) 552-7134"/>
</rs:update>
<rs:insert>
  <z:row ShipperID="12" CompanyName="Lightning Shipping"
    Phone="(505) 111-2222"/>
  <z:row ShipperID="13" CompanyName="Thunder Overnight"
    Phone="(505) 111-2222"/>
  <z:row ShipperID="14" CompanyName="Blue Angel Air Delivery"
    Phone="(505) 111-2222"/>
</rs:insert>
<rs:delete>
  <z:row ShipperID="1" CompanyName="Speedy Express" Phone="(503) 555-9831"/>
</rs:delete>
</rs:data>

Une mise à jour contient toujours l'ensemble de la ligne originale suivie des données de la ligne modifiée. La ligne modifiée peut contenir toutes les colonnes ou uniquement celles qui ont effectivement changé. Dans l'exemple précédent, la ligne de Shipper 2 n'est pas modifiée, tandis que seule la colonne Phone contient des valeurs modifiées pour Shipper 3 et est par conséquent la seule colonne incluse dans la ligne modifiée. Les lignes insérées pour Shippers 12, 13 et 14 sont regroupées sous une seule balise rs:insert. Notez que les lignes supprimées peuvent également être regroupées en lot, même si l'exemple ci-dessus ne l'illustre pas.


Recordsets hiérarchiques dans XML

ADO autorise la persistance d'objets Recordset hiérarchiques dans XML. Dans le cas d'objets Recordset hiérarchiques, la valeur d'un champ dans le Recordset parent est un autre Recordset. Les champs de ce type sont représentés comme des éléments enfants dans le flux XML plutôt que comme un attribut. L'exemple suivant illustre cette situation :

Rs.Open "SHAPE {select stor_id, stor_name, state from stores} APPEND ({select stor_id, ord_num, ord_date, qty from sales} AS rsSales RELATE stor_id TO stor_id)", "Provider=MSDataShape;DSN=pubs;UID=MyUserId;PWD=MyPassword;"

Ci-dessous le format XML du Recordset rendu persistant :

<xml xmlns:s="uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882"     xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882"     xmlns:rs="urn:schemas-microsoft-com:rowset"
    xmlns:z="#RowsetSchema">
  <s:Schema id="RowsetSchema">
    <s:ElementType name="row" content="eltOnly" rs:updatable="true">
      <s:AttributeType name="stor_id" rs:number="1"
        rs:writeunknown="true">
        <s:datatype dt:type="string" dt:maxLength="4"
          rs:fixedlength="true" rs:maybenull="false"/>
      </s:AttributeType>
      <s:AttributeType name="stor_name" rs:number="2" rs:nullable="true"
        rs:writeunknown="true">
          <s:datatype dt:type="string" dt:maxLength="40"/>
      </s:AttributeType>
      <s:AttributeType name="state" rs:number="3" rs:nullable="true"
        rs:writeunknown="true">
        <s:datatype dt:type="string" dt:maxLength="2"
          rs:fixedlength="true"/>
      </s:AttributeType>
      <s:ElementType name="rsSales" content="eltOnly"
        rs:updatable="true" rs:relation="010000000100000000000000">
        <s:AttributeType name="stor_id" rs:number="1"
          rs:writeunknown="true">
          <s:datatype dt:type="string" dt:maxLength="4"
            rs:fixedlength="true" rs:maybenull="false"/>
        </s:AttributeType>
        <s:AttributeType name="ord_num" rs:number="2"
          rs:writeunknown="true">
          <s:datatype dt:type="string" dt:maxLength="20"
            rs:maybenull="false"/>
        </s:AttributeType>
        <s:AttributeType name="ord_date" rs:number="3"
          rs:writeunknown="true">
            <s:datatype dt:type="dateTime" dt:maxLength="16"
              rs:scale="3" rs:precision="23" rs:fixedlength="true"
              rs:maybenull="false"/>
        </s:AttributeType>
        <s:AttributeType name="qty" rs:number="4" rs:writeunknown="true">
          <s:datatype dt:type="i2" dt:maxLength="2" rs:precision="5"
            rs:fixedlength="true" rs:maybenull="false"/>
        </s:AttributeType>
        <s:extends type="rs:rowbase"/>
      </s:ElementType>
      <s:extends type="rs:rowbase"/>
    </s:ElementType>
  </s:Schema>
  <rs:data>
    <z:row stor_id="6380" stor_name="Eric the Read Books" state="WA">
      <rsSales stor_id="6380" ord_num="6871"
        ord_date="1994-09-14T00:00:00" qty="5"/>
      <rsSales stor_id="6380" ord_num="722a"
        ord_date="1994-09-13T00:00:00" qty="3"/>
    </z:row>
    <z:row stor_id="7066" stor_name="Barnum's" state="CA">
      <rsSales stor_id="7066" ord_num="A2976"
        ord_date="1993-05-24T00:00:00" qty="50"/>
      <rsSales stor_id="7066" ord_num="QA7442.3"
        ord_date="1994-09-13T00:00:00" qty="75"/>
    </z:row>
    <z:row stor_id="7067" stor_name="News & Brews" state="CA">
      <rsSales stor_id="7067" ord_num="D4482"
        ord_date="1994-09-14T00:00:00" qty="10"/>
      <rsSales stor_id="7067" ord_num="P2121"
        ord_date="1992-06-15T00:00:00" qty="40"/>
      <rsSales stor_id="7067" ord_num="P2121"
        ord_date="1992-06-15T00:00:00" qty="20"/>
      <rsSales stor_id="7067" ord_num="P2121"
        ord_date="1992-06-15T00:00:00" qty="20"/>
    </z:row>
...
  </rs:data>
</xml>

L'ordre exact des colonnes dans le Recordset parent n'est pas évident lorsqu'il est rendu persistant de cette manière. Tout champ dans le parent peut contenir un Recordset enfant. Le fournisseur de persistance rend persistantes toutes les colonnes scalaires en tant qu'attributs, puis rend persistantes toutes les « colonnes » du Recordset enfant en tant qu'éléments enfants de la ligne parente. La position ordinale du champ dans le Recordset parent peut être obtenue en consultant la définition du schéma du Recordset. Chaque champ possède une propriété OLE DB, rs:number, définie dans l'espace de nom de schéma du Recordset qui contient le nombre ordinal de ce champ.

Les noms de tous les champs du Recordset enfant sont concaténés avec le nom du champ dans le Recordset parent qui contient cet enfant. Ce système vise à garantir qu'il n'y ait pas de collision de noms dans les cas où des Recordsets parent et enfant contiennent tous deux un champ provenant de deux deux tables différentes mais portant le même nom.

Lorsque vous enregistrez des Recordsets hiérarchiques dans XML, faites attention aux restrictions ADO suivantes :

  • Un Recordset hiérarchique ne peut pas être rendu persistant dans XML tant qu'il a des mises à jour en attente.
  • Un Recordset hiérarchique ne peut pas être rendu persistant (au format XML ou ADTG) s'il a été créé avec une commande de mise en forme paramétrée.
  • ADO enregistre la relation entre les Recordsets parent et enfant sous forme d'un objet binaire volumineux (BLOB). Des balises XML décrivant cette relation n'ont pas encore été définies dans l'espace de nom du schéma de l'ensemble de lignes.
  • Lorsqu'un Recordset hiérarchique est enregistré, tous les Recordsets enfants sont enregistrés conjointement. Si le Recordset courant est l'enfant d'un autre Recordset, son parent n'est pas enregistré. Tous les Recordsets enfants qui forment la sous-arborescence du Recordset courant sont enregistrés.

Lorsqu'un Recordset hiérarchique est rouvert à partir de son format rendu persistant en XML, tenez compte des restrictions suivantes :

  • Si l'enregistrement enfant contient des enregistrements pour lesquels il n'existe aucun enregistrement parent correspondant, ces lignes ne sont pas écrites dans la représentation XML du Recordset hiérarchique. Ainsi, ces lignes sont perdues lors de la réouverture du Recordset à partir de son emplacement rendu persistant.
  • Si un enregistrement enfant contient des références à plusieurs enregistrements parents, à la réouverture du Recordset, le Recordset enfant pourra contenir des enregistrements en double. Toutefois, ces doublons ne seront visibles que si l'utilisateur travaille directement avec l'ensemble de lignes enfant sous-jacent. Si un chapitre est utilisé pour naviguer à travers le Recordset enfant (la seule manière de naviguer dans ADO), les doublons ne sont pas visibles.


Propriétés dynamiques du Recordset au format XML

Les propriétés spécifiques au fournisseur du Recordset (provenant du composant Client Cursor Engine) sont actuellement rendues persistantes dans le format XML :

  • Update Resync
  • Unique Table
  • Unique Schema
  • Unique Catalog
  • Resync Command
  • IRowsetChange
  • 24IRowsetUpdate
  • CommandTimeout
  • BatchSize
  • UpdateCriteria
  • Reshape Name
  • AutoRecalc

Ces propriétés sont enregistrées dans la section du schéma en tant qu'attributs de la définition d'élément pour le Recordset qui est rendu persistant. Ces attributs sont définis dans l'espace de nom du schéma de l'ensemble de lignes et doit présenter le préfixe « rs: ».


Transformations XSLT

Il est possible d'appliquer des transformations XSLT au code XML généré pour lui faire adopter un autre format. La compréhension du format XML dans ADO permet de développer des modèles XSLT capables de rendre ce format plus convivial.

Par exemple, vous savez que chaque ligne de Recordset est enregistrée en tant qu'élément z:row dans l'élément rs:data. De même, chaque champ de Recordset est enregistré en tant que paire attribut-valeur correspondant à cet élément.

Le script XSLT suivant peut être appliqué au code XML de la section qui précède, afin de le transformer en tableau HTML à afficher dans le navigateur :

<?xml version="1.0" encoding="ISO-8859-1"?>
<html xmlns:xsl="http://www.w3.org/TR/WD-xsl">
<body STYLE="font-family:Arial, helvetica, sans-serif; font-size:12pt; background-color:white">
<table border="1" style="table-layout:fixed" width="600">
  <col width="200"></col>
  <tr bgcolor="teal">
    <th><font color="white">CustomerId</font></th>
    <th><font color="white">CompanyName</font></th>
    <th><font color="white">ContactName</font></th>
  </tr>
<xsl:for-each select="xml/rs:data/z:row">
  <tr bgcolor="navy">
    <td><font color="white"><xsl:value-of select="@CustomerID"/></font></td>
    <td><font color="white"><xsl:value-of select="@CompanyName"/></font></td>
    <td><font color="white"><xsl:value-of select="@ContactName"/></font></td>
  </tr>
</xsl:for-each>
</table>
</body>
</html>

Le script XSLT convertit le flux XML généré par la méthode ADO Save en un tableau HTML, qui affiche chaque champ de Recordset avec un titre de tableau. Des polices et des couleurs différentes sont également attribuées aux titres et aux lignes du tableau.


Enregistrement dans l'objet DOM XML

Vous pouvez également enregistrer un objet Recordset au format XML dans une instance d'un objet MSXML DOM comme l'illustre le code Visual Basic suivant :

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:\Program Files" & _
        "\Common Files\System\msadc\samples\NWind.mdb"
rsXML.Open sSQL, sConn
rsXML.Save xDOM, adPersistADO   'Save Recordset directly into a DOM tree.
...


Considérations relatives à la sécurité du code XML

L'exécution des méthodes ADO Save et Open sur l'objet Recordset dans Internet Explorer peut présenter certains dangers. Par conséquent, si ces méthodes sont utilisées dans un code de script qui s'exécute dans une application ou un contrôle hébergé dans un navigateur, la configuration de la sécurité du navigateur aura un impact sur son comportement.

Par défaut, Internet Explorer 5 impose des restrictions de sécurité pour ce type d'opérations dans les zones Internet. Dans une telle configuration, Recordset ne peut pas accéder au système de fichiers local du client ni aux sources de données situées à l'extérieur du domaine du serveur à partir duquel la page a été téléchargée. Plus précisément, lorsque Recordset est exécuté sur un navigateur hôte, il ne peut être réenregistré dans un fichier que s'il se trouve sur le serveur à partir duquel la page a été téléchargée. De même, vous ne pouvez ouvrir Recordset en le chargeant à partir d'un fichier que si ce dernier se trouve sur le serveur à partir duquel la page a été téléchargée.

Pour plus d'informations sur la sécurité dans Internet Explorer, consultez l'article technique « ADO and RDS Security Issues in Microsoft Internet Explorer » (en anglais).


Scénario de persistance d'un Recordset XML

Dans ce scénario, vous créez une application ASP (Active Server Pages) qui enregistre directement le contenu d'un objet Recordset dans un objet ASP Response.

Remarque Ce scénario nécessite que Internet Information Server (IIS), version 5.0 ou ultérieure, soit installé sur votre serveur.

L'objet Recordset renvoyé est affiché dans Internet Explorer via RDS.DataControl.

Pour créer ce scénario, procédez comme suit :

  1. Installez l'application.
  2. Obtenez les données.
  3. Envoyez les données.
  4. Recevez et affichez les données.

Suivant Étape 1 : installer l'application

Save, méthode


Étape 1 : installer l'application

Créez un répertoire virtuel IIS nommé « XMLPersist » avec des autorisations de script. Créez deux nouveaux fichiers texte dans le dossier auquel renvoie le répertoire virtuel : l'un nommé « XMLResponse.asp » et l'autre, « Default.htm ».

Suivant Étape 2 : obtenir les données


Étape 2 : obtenir les données

Au cours de cette étape, vous écrivez le code qui ouvre un objet ADO Recordset et préparez son envoi au client. Ouvrez le fichier XMLResponse.asp à l'aide d'un éditeur de texte tel que le Bloc-notes de Windows et insérez le code suivant :

<%@ language="VBScript" %>

<!-- #include file='adovbs.inc' -->

<%
  Dim strSQL, strCon
  Dim adoRec
  Dim adoCon
  Dim xmlDoc

  ' You will need to change "slqServer" below to the name of the SQL
  ' server machine to which you want to connect.
  strCon = "Provider=sqloledb;Data Source=sqlServer;Initial Catalog=Pubs;Integrated Security=SSPI;"
  Set adoCon = server.createObject("ADODB.Connection")
  adoCon.Open strCon

  strSQL = "SELECT Title, Price FROM Titles ORDER BY Price"
  Set adoRec = Server.CreateObject("ADODB.Recordset")
  adoRec.Open strSQL, adoCon, adOpenStatic, adLockOptimistic, adCmdText

Veillez à modifier la valeur du paramètre Data Source dans strCon en le remplaçant par le nom de votre ordinateur Microsoft SQL Server.

Laissez le fichier ouvert et passez à l'étape suivante.

Suivant Étape 3 : envoyer les données


Étape 3 : envoyer les données

Maintenant que vous avez un objet Recordset, vous devez l'envoyer au client en l'enregistrant au format XML dans l'objet ASP Response. Ajoutez le code suivant à la fin du fichier XMLResponse.asp :

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

  Response.Write "<?xml version='1.0'?>" & vbNewLine
  adoRec.save Response, adPersistXML
  adoRec.Close
  Set adoRec=Nothing
%>

Notez que l'objet ASP Response est spécifié comme destination de la méthode Save de l'objet Recordset. La destination de la méthode Save peut être n'importe quel objet prenant en charge l'interface IStream, par exemple un objet ADO Stream ou un nom de fichier qui comprend le chemin complet de l'emplacement où Recordset doit être enregistré.

Enregistrez et fermez le fichier XMLResponse.asp avant de passer à l'étape suivante. Copiez également le fichier adovbs.inc du dossier C:\Program Files\Common Files\System\Ado vers le dossier contenant le fichier XMLResponse.asp.

Suivant Étape 4 : recevoir les données


Étape 4 : recevoir et afficher les données

Au cours de cette étape, vous créez un fichier HTML contenant un objet RDS.DataControl incorporé qui pointe vers le fichier XMLResponse.asp pour obtenir l'objet Recordset. Ouvrez default.htm à l'aide d'un éditeur de texte tel que le Bloc-notes de Windows et insérez le code ci-dessous. Dans l'URL, remplacez « sqlserver » par le nom de votre serveur.

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

<TABLE DATASRC="#RDC1" border="1">
  <TR>
<TD><SPAN DATAFLD="title"></SPAN></TD>
<TD><SPAN DATAFLD="price"></SPAN></TD>
  </TR>
</TABLE>
<OBJECT CLASSID="clsid:BD96C556-65A3-11D0-983A-00C04FC29E33" ID="RDC1">
   <PARAM NAME="URL" VALUE="XMLResponse.asp">
</OBJECT>

</BODY>
</HTML>

Fermez le fichier default.htm et enregistrez-le dans le dossier où vous avez enregistré XMLResponse.asp. En utilisant Internet Explorer 4.0 ou une version ultérieure, ouvrez l'URL http://sqlserver/XMLPersist/default.htm et examinez les résultats. Les données s'affichent dans une table DHTML liée. À présent, ouvrez l'URL http://sqlserver/XMLPersist/XMLResponse.asp et examinez les résultats. Le contenu XML s'affiche.


Chapitre 6 : Gestion des erreurs

ADO utilise différentes méthodes pour notifier à une application les erreurs qui se produisent. Ce chapitre traite des types d'erreur qui peuvent se produire dans ADO et explique comment votre application se voit notifier ces erreurs. Il se termine par quelques suggestions sur la manière de gérer ces erreurs.

Comment ADO rapporte les erreurs ?

ADO vous notifie les erreurs de plusieurs manières :

  • Les erreurs ADO génèrent une erreur d'exécution. Gérez l'erreur ADO de la même manière que vous traiteriez n'importe quelle autre erreur d'exécution, en utilisant par exemple une instruction On Error dans Visual Basic.
  • Votre programme peut recevoir des erreurs de OLE DB. Une erreur OLE DB génère également une erreur d'exécution.
  • Si l'erreur est spécifique à votre fournisseur de données, un ou plusieurs objets Error sont placés dans la collection Errors de l'objet Connection qui a été utilisé pour accéder au magasin de données lorsque l'erreur s'est produite.
  • Si le processus qui a généré un événement a également produit une erreur, les informations liées à cette erreur sont placées dans un objet Error et transmises en tant que paramètre à l'événement. Pour plus d'informations sur les événements, consultez le Chapitre 7 : Gestion des événements ADO.
  • Les problèmes qui se produisent lors du traitement des mises à jour par lot ou d'autres opérations de ce type qui impliquent un Recordset peuvent être indiqués par la propriété Status de l'objet Recordset. Par exemple, des violations de contraintes de schéma ou des autorisations insuffisantes peuvent être spécifiées par des valeurs RecordStatusEnum.
  • Les problèmes impliquant un Field particulier de l'enregistrement actuel sont également indiqués par la propriété Status de chaque Field de la collection Fields du Record ou du Recordset. Par exemple, les mises à jour n'ayant pas pu être terminées ou les incompatibilités entre les types de données peuvent être spécifiées à l'aide de valeurs FieldStatusEnum.

Les sections suivantes décrivent chacune des méthodes de notification plus en détail.


Erreurs ADO

Les erreurs ADO sont signalées à votre programme en tant qu'erreurs d'exécution. Vous pouvez utiliser le mécanisme de détection des erreurs de votre langage de programmation afin de les détecter et de les traiter. Par exemple, dans Visual Basic, utilisez l'instruction On Error. Dans Visual J++, utilisez un bloc try-catch. Dans Visual C++, cela dépend de la méthode que vous employez pour accéder aux bibliothèques ADO. Avec #import, utilisez un bloc try-catch. Autrement, les programmeurs C++ doivent récupérer explicitement l'objet en erreur en faisant appel à la méthode GetErrorInfo. La sous-procédure Visual Basic suivante illustre l'interception d'une erreur ADO :

' BeginErrorHandlingVB01
Private Sub Form_Load()
    ' Turn on error handling
    On Error GoTo FormLoadError

    'Open the database and the recordset for processing.
    '
    Dim strCnn As String
    strCnn = "Provider='sqloledb';" & _
        "Data Source='MySqlServer';" & _
        "Initial Catalog='Northwind';Integrated Security='SSPI';"

    ' cnn is a Public Connection Object because
    ' it was defined WithEvents
    Set cnn = New ADODB.Connection
    cnn.Open strCnn

    ' The next line of code intentionally causes
    ' an error by trying to open a connection
    ' that has already been opened.
    cnn.Open strCnn

    ' rst is a Public Recordset because it
    ' was defined WithEvents
    Set rst = New ADODB.Recordset
    rst.Open "Customers", cnn

    Exit Sub

' Error handler
FormLoadError:
    Dim strErr As String
    Select Case Err
        Case adErrObjectOpen
            strErr = "Error #" & Err.Number & ": " & Err.Description & vbCrLf
            strErr = strErr & "Error reported by: " & Err.Source & vbCrLf
            strErr = strErr & "Help File: " & Err.HelpFile & vbCrLf
            strErr = strErr & "Topic ID: " & Err.HelpContext
            MsgBox strErr
            Debug.Print strErr
            Err.Clear
            Resume Next
        ' If some other error occurs that
        ' has nothing to do with ADO, show
        ' the number and description and exit.
        Case Else
            strErr = "Error #" & Err.Number & ": " & Err.Description & vbCrLf
            MsgBox strErr
            Debug.Print strErr
            Unload Me
    End Select
End Sub
' EndErrorHandlingVB01

Cette procédure d'événement Form_Load crée une erreur intentionnellement en essayant d'ouvrir deux fois le même objet Connection. La deuxième fois que la méthode Open est appelée, le gestionnaire d'erreur est activé. Dans ce cas, l'erreur est de type adErrObjectOpen, de sorte que le gestionnaire d'erreur affiche le message suivant avant de reprendre l'exécution du programme :

Error #3705: Operation is not allowed when the object is open.
Error reported by: ADODB.Connection
Help File: E:\WINNT\HELP\ADO260.CHM Topic ID: 1003705

Le message d'erreur contient chaque élément d'information fourni par l'objet Err de Visual Basic, à l'exception de la valeur LastDLLError, qui ne s'applique pas ici. Le numéro d'erreur vous indique quelle erreur s'est produite. La description est utile dans les cas où vous ne voulez pas traiter l'erreur personnellement. Vous pouvez vous contenter de la transmettre à l'utilisateur. Bien que vous souhaiterez généralement utiliser des messages personnalisés pour votre application, vous ne pouvez pas anticiper chaque erreur. La description fournit quelques indices quant au problème qui a eu lieu. Dans l'exemple de code, l'erreur a été rapportée par l'objet Connection. Vous verrez le type ou d'ID de programmation de l'objet, pas un nom de variable.

Note L'objet Visual Basic Err contient uniquement des informations sur l'erreur la plus récente. La collection Errors ADO de l'objet Connection contient un objet Error pour chaque erreur produite par l'opération ADO la plus récente. Utilisez la collection Errors plutôt que l'objet Err pour traiter plusieurs erreurs. Pour plus d'informations sur la collection Errors, consultez Provider Errors. Toutefois, en l'absence d'objet Connection valide, l'objet Err est la seule source d'informations sur les erreurs ADO.

Quels types d'opérations sont susceptibles de causer des erreurs ADO ? Les erreurs ADO communes peuvent impliquer d'ouvrir un objet tel qu'une Connection ou un Recordset, essayer de mettre à jour des données, ou d'appeler une méthode ou une propriété non prise en charge par votre fournisseur.

Des erreurs OLE DB peuvent également être transmises à votre application en tant qu'erreurs d'exécution dans la collection Errors. Pour plus d'informations sur les numéros d'erreurs OLE DB, consultez le chapitre 16 du guide OLE DB Programmer's Reference.


Référence d'erreur ADO

La constante ErrorValueEnum décrit les valeurs d'erreur ADO. Pour la liste complète de ces constantes énumérées, y compris leurs valeurs, consultez l'Annexe B : Erreurs ADO. Cette section présente certaines des erreurs les plus intéressantes et fournit certaines situations particulières qui peuvent en être la cause, et des solutions pour les corriger. La constante ErrorValueEnum et la petite valeur décimale positive sont répertoriées.

Numéro | Constante ErrorValueEnum | Description/Causes possibles
3000 | adErrProviderFailed | Le fournisseur n'a pas pu effectuer l'opération demandée.
3001 | adErrInvalidArgument | Les arguments sont de type incorrect, en dehors des limites autorisées ou en conflit les uns avec les autres. Cette erreur a souvent pour origine une erreur typographique dans une instruction SQL SELECT. Un nom de champ ou de table mal orthographié peut ainsi provoquer cette erreur. Cette erreur peut également se produire lorsqu'un champ ou une table nommée dans une instruction SELECT n'existe pas dans le magasin de données.
3002 | adErrOpeningFile | Impossible d'ouvrir le fichier. Un nom de fichier erroné a été spécifié, un fichier a été déplacé, renommé ou supprimé. En réseau, le lecteur peut être temporairement indisponible ou le trafic sur le réseau empêcher une connexion.
3003 | adErrReadFile | Impossible de lire le fichier. Le nom du fichier erroné est incorrectement spécifié, le fichier a été déplacé, supprimé ou peut s'être corrompu.
3004 | adErrWriteFile | Impossible d'écrire dans le fichier. Vous pouvez avoir fermé un fichier puis essayé d'y écrire des données, ou le fichier peut s'être corrompu. Si le fichier est situé sur un lecteur réseau, des conditions réseau particulières peuvent empêcher l'écriture de données sur un lecteur réseau.
3021 | adErrNoCurrentRecord | BOF ou EOF vaut True ou l'enregistrement actuel a été supprimé. L'opération demandée exige un enregistrement actuel. Une tentative a été faite de mettre à jour les enregistrements à l'aide de Find ou Seek pour déplacer le pointeur d'enregistrement sur l'enregistrement voulu. Si l'enregistrement n'est pas trouvé, EOF sera True. Cette erreur peut également se produire après un échec de AddNew ou Delete car il n'y a pas d'enregistrement lorsque ces méthodes échouent.
3219 | adErrIllegalOperation | L'opération demandée n'est pas autorisée dans ce contexte.
3220 | adErrCantChangeProvider | Le fournisseur indiqué est différent de celui déjà utilisé.
3246 | adErrInTransaction | Un objet Connection ne peut pas être explicitement fermé pendant une transaction. Un objet Recordset ou Connection qui participe actuellement à une transaction ne peut pas être fermé. Appelez soit RollbackTrans ou CommitTrans avant de fermer l'objet.
3251 | adErrFeatureNotAvailable | Le fournisseur ou l'objet ne prend pas en charge l'opération demandée. Certaines opérations dépendent d'une version particulière de fournisseur.
3265 | adErrItemNotFound | Impossible de trouver l'objet dans la collection correspondant au nom ou à la référence ordinale demandé. Un nom de table ou de champ incorrect a été spécifié.
3367 | adErrObjectInCollection | L'objet est déjà en collection. Ajout impossible. Un objet ne peut pas être ajouté deux fois dans la même collection.
3420 | adErrObjectNotSet | L'objet n'est plus valide.
3421 | adErrDataConversion | L'application utilise une valeur d'un type incorrect pour l'opération en cours. Vous avez peut-être fourni une chaîne à une opération qui attend un flux, par exemple.
3704 | adErrObjectClosed | Cette opération n'est pas autorisée si l'objet est fermé. Les objets Connection ou Recordset ont été fermés. Par exemple, une autre routine peut avoir fermé un objet global. Vous pouvez éviter cela en vérifiant la propriété State avant de tenter l'opération.
3705 | adErrObjectOpen | Cette opération n'est pas autorisée si l'objet est ouvert. On ne peut pas ouvrir un objet déjà ouvert. Les champs ne peuvent pas être ajoutés dans un Recordset ouvert.
3706 | adErrProviderNotFound | Impossible de trouver le fournisseur. Il est peut-être mal installé. Le nom du fournisseur est incorrectement spécifié, le fournisseur spécifié n'est pas installé sur l'ordinateur où votre code est exécuté ou l'installation s'est corrompue.
3707 | adErrBoundToCommand | La propriété ActiveConnection d'un objet Recordset, qui a un objet Command en tant que source, ne peut pas être modifiée. L'application a essayé d'assigner un nouvel objet Connection à un Recordset qui a un objet Command en tant que source.
3708 | adErrInvalidParamInfo | L'objet Parameter est défini de manière incorrecte. Des informations incohérentes ou incomplètes ont été fournies.
3709 | adErrInvalidConnection | La connexion ne peut pas être utilisée pour effectuer cette opération. Elle est fermée ou invalide dans ce contexte.
3710 | adErrNotReentrant | Impossible d'effectuer cette opération lors du traitement d'un événement. Une opération ne peut pas être effectuée dans le cadre d'un gestionnaire d'événement qui entraîne le déclenchement de l'événement. Par exemple, les méthodes de navigation ne doivent pas être appelées à partir du gestionnaire d'événement WillMove.
3711 | adErrStillExecuting | Impossible d'effectuer cette opération lors d'une exécution asynchrone.
3712 | adErrOperationCancelled | L'opération a été annulée par l'utilisateur. L'application a appelé la méthode CancelUpdate ou CancelBatch et l'opération courante a été annulée.
3713 | adErrStillConnecting | Impossible d'effectuer cette opération lors d'une connexion asynchrone.
3714 | adErrInvalidTransaction | La transaction de coordination n'est pas valide ou n'a pas été lancée.
3715 | adErrNotExecuting | Impossible d'effectuer cette opération hors exécution.
3716 | adErrUnsafeOperation | Les paramètres de sécurité définis sur cet ordinateur interdisent l'accès à une source de données sur un autre domaine.
3717 | adWrnSecurityDialog | À usage interne uniquement. Ne pas utiliser. (Cette entrée a été incluse dans un but d'exhaustivité. Cette erreur ne doit pas apparaître dans votre code.)
3718 | adWrnSecurityDialogHeader | À usage interne uniquement. Ne pas utiliser. (Cette entrée a été incluse dans un but d'exhaustivité. Cette erreur ne doit pas apparaître dans votre code.)
3719 | adErrIntegrityViolation | La valeur de données est en conflit avec les contraintes d'intégrité du champ. Une nouvelle valeur pour un Field créerait une clé en double. Une valeur qui constitue un côté d'une relation entre deux enregistrements peut ne pas pouvoir être mise à jour.
3720 | adErrPermissionDenied | Des droits insuffisants empêchent l'écriture dans ce champ. L'utilisateur nommé dans la chaîne de connexion ne possède pas les autorisations appropriées pour écrire dans un Field.
3721 | adErrDataOverflow | La valeur de données est trop grande pour être représentée par le type de données du champ. Une valeur numérique qui est trop importante pour le champ voulu a été assignée. Par exemple, une valeur d'entier long a été assignée à un champ d'entier court.
3722 | adErrSchemaViolation | La valeur de données est en conflit avec le type de données ou les contraintes d'intégrité du champ. Le magasin de données a des contraintes de validation qui diffèrent de la valeur Field.
3723 | adErrSignMismatch | Échec de la conversion car la valeur de données est signée alors que le type de données champ utilisé par le fournisseur est non signé.
3724 | adErrCantConvertvalue | Impossible de convertir la valeur de données pour des raisons autres qu'une non-concordance des signatures ou un débordement de données. Par exemple, la conversion aurait entraîné une troncature des données.
3725 | adErrCantCreate | Impossible de définir ou d'extraire la valeur de données car le type de données champ est inconnu ou le fournisseur ne dispose pas de ressources suffisantes pour exécuter l'opération.
3726 | adErrColumnNotOnThisRow | L'enregistrement ne contient pas ce champ. Un nom de champ incorrect a été spécifié ou un champ ne figurant pas dans la collection Fields de l'enregistrement courant a été référencé.
3727 | adErrURLDoesNotExist | L'URL source ou le parent de l'URL de destination n'existe pas. L'URL source ou de destination contient une erreur typographique. Vous pouvez avoir http://mysite/photo/myphoto.jpg à la place de http://mysite/photos/myphoto.jpg. C'est l'erreur typographique dans l'URL parent (dans notre exemple, photo au lieu de photos) qui a causé l'erreur.
3728 | adErrTreePermissionDenied | Autorisations insuffisantes pour accéder à la structure ou à la sous-structure. L'utilisateur nommé dans la chaîne de connexion ne dispose pas des autorisations appropriées.
3729 | adErrInvalidURL | L'URL contient des caractères invalides. Veillez à ce que l'URL soit correctement tapée. L'URL suit le schéma enregistré auprès du fournisseur courant (par exemple, le fournisseur Internet Publishing est enregistré pour http).
3730 | adErrResourceLocked | L'objet représenté par l'URL spécifiée est verrouillé par un ou plusieurs processus. Attendez que le processus ait terminé avant de réessayer. L'objet auquel vous essayez d'accéder est verrouillé par un autre utilisateur ou un autre processus de votre application. Cette situation est très susceptible de se produire dans un environnement multi-utilisateur.
3731 | adErrResourceExists | Impossible de réaliser l'opération de copie. L'objet nommé par l'URL de destination existe déjà. Spécifiez adCopyOverwrite pour remplacer l'objet. Si vous ne spécifiez pas adCopyOverwrite lorsque vous copiez les fichiers dans un répertoire, la copie échoue si vous essayez de copier un élément qui existe déjà dans l'emplacement de destination.
3732 | adErrCannotComplete | Le serveur ne peut pas exécuter l'opération. Cela peut se produire si le serveur est occupé par d'autres opérations ou manque de ressources.
3733 | adErrVolumeNotFound | Le fournisseur ne parvient pas à repérer le périphérique de stockage spécifié par l'URL. Veillez à ce que l'URL soit correctement tapée. L'URL du périphérique de stockage peut être incorrect, mais cette erreur peut se produire pour d'autres raisons. Le périphérique peut être hors ligne ou une volume de trafic réseau trop important empêche la connexion de se faire.
3734 | adErrOutOfSpace | Impossible de réaliser l'opération. Le fournisseur ne parvient pas à disposer de suffisamment d'espace de stockage. Le serveur manque peut-être d'espace disque ou de RAM pour stocker les fichiers temporaires.
3735 | adErrResourceOutOfScope | L'URL source ou de destination est hors de portée de l'enregistrement actuel.
3736 | adErrUnavailable | L'opération a échoué et le statut est indisponible. Le champ peut être indisponible ou l'opération ne pas été essayée. Un autre utilisateur peut avoir modifié ou supprimé le champ auquel vous essayez d'accéder.
3737 | adErrURLNamedRowDoesNotExist | L'enregistrement spécifié par cette URL n'existe pas. Vous essayiez d'ouvrir un fichier à l'aide d'un objet Record, mais le nom ou le chemin d'accès du fichier était erroné.
3738 | adErrDelResOutOfScope | L'URL de l'objet à supprimer se trouve hors de portée de l'enregistrement actuel.
3747 | adErrCatalogNotSet | Cette opération nécessite un ParentCatalog valide.
3748 | adErrCantChangeConnection | Connexion refusée. La nouvelle connexion demandée a des caractéristiques différentes de celle déjà en cours d'utilisation.
3749 | adErrFieldsUpdateFailed | Échec de mise à jour des champs. Pour plus d'informations, examinez la propriété Status des objets de champ individuels. Cette erreur se produit dans deux situations : lorsque vous changez la valeur d'un objet Field au cours du processus de modification ou d'ajout d'un enregistrement dans la base de données ; et lorsque vous modifiez les propriétés de l'objet Field lui-même. La mise à jour de Record ou Recordset a échoué en raison d'un problème lié à l'un des champs de l'enregistrement courant. Énumérez la collection Fields et vérifiez la propriété Status de chaque champ afin de déterminer la cause du problème.
3750 | adErrDenyNotSupported | Le fournisseur ne prend pas en charge les restrictions de partage. Une tentative de restriction du partage de fichier a été effectuée alors que ce concept n'est pas pris en charge par votre fournisseur.
3751 | adErrDenyTypeNotSupported | Le fournisseur ne prend pas en charge le type de restriction de partage demandé. Une tentative d'établissement d'un type particulier de restriction du partage des fichiers non pris en charge par votre fournisseur a été effectuée. Consultez la documentation de votre fournisseur pour déterminer les restrictions de partage de fichier prises en charge par votre fournisseur.


Erreurs du fournisseur

Lorsqu'une erreur de fournisseur se produit, une erreur d'exécution -2147467259 est renvoyée. Lorsque vous recevez cette erreur, vérifiez la collection Errors de l'objet Connection actif, qui contiendra une ou plusieurs erreurs décrivant ce qui s'est produit.

La collection Errors ADO

Étant donné qu'une opération ADO particulière peut produire plusieurs erreurs de fournisseur, ADO présente une collection d'objets erreur par l'intermédiaire de l'objet Connection. Cette collection ne contient aucun objet si une opération se conclut avec succès, mais contient un ou plusieurs objets Error si quelque chose ne s'est pas déroulé correctement et que le fournisseur a signalé une ou plusieurs erreurs. Examinez individuellement chaque erreur afin de déterminer la cause exacte de l'erreur.

Une fois que vous avez terminé de traiter les erreurs qui se sont produites, vous pouvez effacer la collection en faisant appel à la méthode Clear. Il est particulièrement important d'effacer explicitement la collection Errors avant d'appeler la méthode Resync, UpdateBatch ou CancelBatch sur un objet Recordset, d'appeler la méthode Open sur un objet Connection, ou de définir la propriété Filter sur un objet Recordset. En effaçant explicitement la collection, vous pouvez être certain qu'aucun objet Error de la collection ne sera oublié après l'exécution d'une opération précédente.

Certaines opérations peuvent générer des avertissements aussi bien que des erreurs. Les avertissements sont également représentés par les objets Error dans la collection Errors. Lorsqu'un fournisseur ajoute un avertissement dans la collection, il ne génère pas d'erreur d'exécution. Vérifiez la propriété Count de la collection Errors pour déterminer si un avertissement a été produit par une opération particulière. Si le résultat du compte est positif (au moins égal à un), cela signifie qu'un objet Error a été ajouté dans la collection. Une fois que vous avez déterminé que la collection Errors contient des erreurs ou des avertissements, vous pouvez répéter l'opération dans la collection et récupérer des informations sur chacun des objets Error qu'elle contient. Le court exemple Visual Basic suivant illustre cela :

' BeginErrorHandlingVB02
Private Function DeleteCustomer(ByVal CompanyName As String) As Long
    On Error GoTo DeleteCustomerError

    rst.Find "CompanyName='" & CompanyName & "'"

DeleteCustomerError:

    Dim objError As ADODB.Error
    Dim strError As String

    If cnn.Errors.Count > 0 Then
        For Each objError In cnn.Errors
            strError = strError & "Error #" & objError.Number & _
                " " & objError.Description & vbCrLf & _
                "NativeError: " & objError.NativeError & vbCrLf & _
                "SQLState: " & objError.SQLState & vbCrLf & _
                "Reported by: " & objError.Source & vbCrLf & _
                "Help file: " & objError.HelpFile & vbCrLf & _
                "Help Context ID: " & objError.HelpContext
        Next
        MsgBox strError
    End If
End Function
' EndErrorHandlingVB02

La routine de gestion des erreurs comprend une boucle For Each qui examine chaque objet de la collection Errors. Dans cet exemple, elle se contente d'accumuler un message à afficher. Dans un programme opérationnel, vous devriez écrire du code pour exécuter la tâche appropriée à chaque erreur, comme fermer tous les fichiers ouverts et fermer le programme de manière ordonnée.

L'objet Error

En examinant un objet Error, vous pouvez déterminer quelle erreur s'est produite et plus important encore, quelle application et quel objet a causé l'erreur. L'objet Error présente les propriétés suivantes :

Nom de la propriété | Description
Description | Texte décrivant l'erreur qui s'est produite.
HelpContext, HelpFile | Fait référence à la rubrique d'aide et au fichier d'aide qui contient une description de l'erreur qui s'est produite.
NativeError | Numéro d'erreur spécifique au fournisseur.
Numéro | Entier long qui représente le numéro (figurant dans ErrorValueEnum) de l'erreur qui s'est produite.
Source | Indique le nom de l'objet ou de l'application qui est à l'origine d'une erreur.
SQLState | Code d'erreur de cinq caractères de long que le fournisseur renvoie au cours du processus d'exécution d'une instruction SQL.

L'objet Error ADO ressemble beaucoup à l'objet standard Visual Basic Err. Ses propriétés décrivent l'erreur qui s'est produite. En plus du numéro de l'erreur, vous recevez également deux éléments d'information liés. La propriété NativeError contient une erreur spécifique au fournisseur que vous utilisez. Dans l'exemple précédent, puisqu'il s'agit du Fournisseur OLE DB Microsoft pour SQL Server, NativeError contiendra des erreurs spécifiques à SQL Server. La propriété SQLState possède un code de cinq lettres qui décrit une erreur dans un instruction SQL.

Erreurs liées aux événements

L'objet Error est également utilisé en cas d'erreurs liées à des événements. Vous pouvez déterminer si une erreur s'est produite au cours du processus qui a généré un événement ADO en vérifiant l'objet Error qui a été transmis en tant que paramètre d'événement.

Si l'opération qui cause un événement se conclut avec succès, le paramètre adStatus du gestionnaire d'événement sera défini comme adStatusOK. D'un autre côté, si l'opération qui a généré l'événement a échoué, le paramètre adStatus est défini comme adStatusErrorsOccurred. Dans ce cas, le paramètre pError contiendra un objet Error décrivant l'erreur.


Informations d'erreurs liées aux champs

Si une erreur est directement liée à un champ, par exemple si les données sont manquantes ou d'un type inapproprié pour le champ, vous avez la possibilité de récupérer d'autres informations sur la cause du problème en examinant la propriété Status de l'objet Field. Cette propriété a été améliorée de manière à fournir des informations spécifiques sur le problème. Ainsi, pour cet exemple, lorsqu'un appel à UpdateBatch échoue, la cause du problème peut être déterminée par l'examen de la propriété Status des Fields dans chacun des enregistrements concernés. La propriété contiendra une des valeurs de la constante FieldStatusEnum. La table suivante comprend les valeurs qui sont significatives en cas d'erreur.

Constante | Valeur | Description
adFieldCantConvertValue | 2 | Le champ ne peut être ni extrait ni stocké sans perte de données.
adFieldDataOverflow | 6 | Les données renvoyées par le fournisseur ont débordé le type de données du champ.
adFieldDefault | 13 | La valeur par défaut du champ a été utilisée lors de la définition des données.
adFieldIgnore | 15 | Ce champ a été ignoré lors de la définition des valeurs des données dans la source. Aucune valeur n'a été définie par le fournisseur.
adFieldIntegrityViolation | 10 | Le champ ne peut pas être modifié car il s'agit d'une entité calculée ou dérivée.
adFieldIsNull | 3 | Le fournisseur a renvoyé une valeur nulle.
adFieldOutOfSpace | 22 | Le fournisseur n'est pas en mesure d'obtenir un espace de stockage suffisant pour exécuter une opération de déplacement ou de copie.


Informations d'erreurs liées aux Recordsets

Au cours du traitement par lot, la propriété Status de l'objet Recordset apporte des informations sur les enregistrements individuels du Recordset. Avant l'exécution de la mise à jour par lot, la propriété Status du Recordset reflète des informations sur les enregistrements à ajouter, modifier ou supprimer. Lorsque la méthode UpdateBatch a été appelée, la propriété Status indique la réussite ou l'échec de l'opération. À mesure que vous passez d'un enregistrement à l'autre dans le Recordset, la valeur de la propriété Status change de manière à décrire l'état de l'enregistrement courant.


Gestion des erreurs dans d'autres langages

Jusqu'à présent, le présent chapitre s'est intéressé aux erreurs du point de vue de Microsoft Visual Basic. Le reste de cette section sera consacré à présenter la gestion des erreurs dans d'autres langages que Visual Basic.


Gestion des erreurs dans VBScript

Il y a peu de différences entre les méthodes utilisées dans Visual Basic et celles utilisées dans VBScript. La différence essentielle réside dans le fait que VBScript ne prend pas en charge le concept de gestion d'erreur avec poursuite de l'exécution au niveau d'une étiquette. En d'autres termes, vous ne pouvez pas utiliser On Error GoTo dans VBScript. À la place, utilisez On Error Resume Next, puis vérifiez à la fois Err.Number et la propriété Count de la collection Errors, comme illustré dans l'exemple suivant :

<!-- BeginErrorExampleVBS -->
<HTML>
<HEAD>
<META NAME="GENERATOR" Content="Microsoft Visual Studio 6.0">
<TITLE>Error Handling Example (VBScript)</TITLE>
</HEAD>
<BODY>

<h1>Error Handling Example (VBScript)</h1>

<%
    Dim errLoop
    Dim strError

    On Error Resume Next

    ' Intentionally trigger an error.
    Set cnn1 = Server.CreateObject("ADODB.Connection")
    cnn1.Open "nothing"

    If cnn1.Errors.Count > 0 Then
        ' Enumerate Errors collection and display
        ' properties of each Error object.
        For Each errLoop In cnn1.Errors
            strError = "Error #" & errLoop.Number & "<br>" & _
                "   " & errLoop.Description & "<br>" & _
                "   (Source: " & errLoop.Source & ")" & "<br>" & _
                "   (SQL State: " & errLoop.SQLState & ")" & "<br>" & _
                "   (NativeError: " & errLoop.NativeError & ")" & "<br>"
            If errLoop.HelpFile = "" Then
                strError = strError & _
                    "   No Help file available" & _
                    "<br><br>"
            Else
                strError = strError & _
                    "   (HelpFile: " & errLoop.HelpFile & ")" & "<br>" & _
                    "   (HelpContext: " & errLoop.HelpContext & ")" & _
                    "<br><br>"
            End If
            Response.Write ("<p>" & strError & "</p>")
        Next
    End If
%>

</BODY>
</HTML>
<!-- EndErrorExampleVBS -->


Gestion des erreurs dans Visual C++

Dans le modèle COM, la plupart des opérations renvoient un code HRESULT qui indique si une fonction s'est déroulée avec succès. La directive #import génère un code wrapper autour de chaque méthode ou propriété « brute » et vérifie le code HRESULT renvoyé. Si le code HRESULT indique un échec, le code wrapper rejette une erreur COM en appelant _com_issue_errorex() avec le code HRESULT renvoyé comme argument. Les objets erreur COM peuvent être capturés dans un bloc try-catch. (Pour des raisons d'efficacité, capturez une référence à un objet _com_error.)

N'oubliez pas qu'il s'agit d'erreurs ADO : elles découlent de l'échec d'une opération ADO. Les erreurs renvoyées par le fournisseur de données sous-jacent apparaissent en tant qu'objets Error dans la collection Errors de l'objet Connection.

La directive #import ne crée des routines de gestion d'erreurs que pour les méthodes et propriétés déclarées dans la DLL ADO. Toutefois, vous pouvez tirer parti de ce mécanisme de gestion des erreurs en écrivant votre propre macro ou fonction inline de vérification d'erreurs. Pour voir des exemples, consultez la rubrique Extensions Visual C++.


Gestion des erreurs dans Visual J++

Gérez les erreurs ADO dans vos applications Microsoft Visual J++ à l'aide d'un bloc try catch. Une fois qu'une erreur a été rejetée, vous pouvez répéter l'opération dans la collection, en traitant successivement chaque erreur. L'exemple Visual J++ suivant illustre une application console qui provoque délibérément une erreur.

Lorsque le bloc catch est activé, il appelle la fonction PrintProviderError pour afficher les erreurs. La fonction PrintProviderError se répète dans la collection Errors et envoie une ligne décrivant chaque erreur de la collection au périphérique de sortie standard.

// BeginErrorExampleVJ
/**
 * This class can take a variable number of parameters on the command
 * line. Program execution begins with the main() method. The class
 * constructor is not invoked unless an object of type 'Class1'
 * created in the main() method.
 */

import com.ms.wfc.data.*;
import java.io.* ;

public class ErrorExample
{
    /**
     * The main entry point for the application.
     *
     * @param args Array of parameters passed to the application
     * via the command line.
     */
    public static void main (String[] args)
    {
        DescriptionX();
        System.exit(0);
    }

    static void DescriptionX()
    {
        BufferedReader in = new
        BufferedReader(new InputStreamReader(System.in));

        // Define ADO Objects.
        Connection cnConn1 = null;

        try
        {
            // Create an error by trying to
            // Open a database that doesn't exist.
            cnConn1 = new Connection();
            cnConn1.open("nothing");
        }
        catch( AdoException ae )
        {
            // Notify user of any errors that result from ADO.
            PrintProviderError(cnConn1);
        }

        try
        {
            System.out.println("\nPress <Enter> key to continue.");
            in.readLine();
        }
        // System read requires this catch.
        catch( java.io.IOException je)
        {
            PrintIOError(je);
        }
    }

    // PrintProviderError Function
    static void PrintProviderError( Connection Cnn1 )
    {
        // Print Provider errors from Connection object.
        // ErrItem is an item object in the Connections Errors collection.
        com.ms.wfc.data.Error  ErrItem = null;
        long nCount = 0;
        int  i      = 0;

        nCount = Cnn1.getErrors().getCount();

        // If there are any errors in the collection, print them.
        if( nCount > 0);
        {
            // Collection ranges from 0 to 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 Function
    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");
    }
}
// EndErrorExampleVJ


Gestion des erreurs dans JScript

Votre code Microsoft JScript doit vérifier la propriété Count de la collection Errors de l'objet Connection. Si la valeur est supérieure à 0, répétez l'opération dans la collection et imprimez les valeurs comme vous le feriez dans n'importe quel autre langage.

<!-- BeginErrorExampleJS -->
<%@ Language=JScript %>
<HTML>
<HEAD>
<title>Error Handling Example (JScript)</title>
</HEAD>
<BODY>
<h1>Error Handling Example (JScript)</h1>
<%
    var cnn1 = Server.CreateObject("ADODB.Connection");
    var errLoop = Server.CreateObject("ADODB.Error");
    var strError = new String;

    try
    {
        // Intentionally trigger an error.
        cnn1.Open("nothing");
    }
    catch(e)
    {
        Response.Write(e.message);
    }
%>

</BODY>
</HTML>
<!-- EndErrorExampleJS -->


Anticipation d'erreurs

La prévention des erreurs est au moins aussi importante que leur gestion. Cette dernière section contient une courte liste des précautions que peut prendre votre application pour réduire le risque d'apparition des erreurs.

Vérifiez l'état des objets en vérifiant la valeur de la propriété State avant d'essayer d'effectuer une opération à l'aide de ces objets. Par exemple, si votre application utilise un objet Connection global, vérifiez sa propriété State pour savoir s'il est déjà ouvert avant d'appeler la méthode Open.

  • Tout programme qui accepte des données d'un utilisateur doit inclure le code pour valider ces données avant de les envoyer au magasin de données. Ne comptez pas sur le magasin de données, le fournisseur, ADO ou même le votre langage de programmation pour vous signaler les problèmes. Vous devez vérifier chaque octet entré par vos utilisateurs, en veillant à ce que les données soient du type approprié pour le champ voulu et que les champs requis ne soient pas vides.

Vérifiez les données avant d'essayer d'en écrire dans le magasin de données. La manière la plus simple pour le faire consiste à traiter l'événement WillMove ou WillUpdateRecordset. Pour plus d'informations sur le traitement des événements ADO, consultez le Chapitre 7 : Gestion des événements ADO.

Veillez à ce que les objets Recordset ne soient pas en dehors des limites du Recordset avant d'essayer de déplacer le pointeur d'enregistrement. Si vous essayez de MoveNext (passer au suivant) alors que EOF est vrai (True) ou de MovePrev (revenir au précédent) alors que BOF est vrai (True), une erreur se produit. Si vous effectuez une des méthodes Move alors que EOF et BOF sont tous deux True, une erreur est générée.

Des erreurs se produiront également si vous essayez d'effectuer des opérations telles que Seek et Find sur un Recordset vide.


Chapitre 7 : Gestion d'événements ADO

Le modèle d'événements ADO prend en charge certaines opérations ADO synchrones et asynchrones qui émettent des événements, ou notifications, avant le démarrage d'une opération ou lorsqu'elle est terminée. Un événement est en fait un appel à une routine de gestionnaire d'événements que vous définissez dans votre application.

Si vous fournissez des fonctions ou procédures de gestionnaire au groupe des événements qui se produisent avant le démarrage de l'opération, vous pouvez examiner ou modifier les paramètres passés à l'opération. Dans la mesure où cette dernière ne s'est pas encore exécutée, vous pouvez soit l'annuler soit la laisser s'effectuer.

Le groupe des événements qui se produisent après la fin de l'opération est particulièrement important si vous utilisez ADO de manière asynchrone. Par exemple, une application qui lance une opération asynchrone Recordset.Open est notifiée de l'aboutissement d'une opération par l'événement approprié.

L'utilisation du modèle d'événement ADO alourdit quelque peu votre application, mais elle est beaucoup plus souple que les autres méthodes de gestion d'opérations asynchrones, notamment le contrôle de la propriété State d'un objet avec une boucle.

Voir aussi

Résumé du gestionnaire d'événements ADO | Instanciation d'événements ADO par langage | Événements ADO | Paramètres des événements | Types d'événements


Résumé des gestionnaires d'événements ADO

Deux objets ADO peuvent déclencher des événements : l'objet Connection et l'objet Recordset. La famille ConnectionEvent correspond aux opérations effectuées sur l'objet Connection alors que la famille RecordsetEvent correspond aux opérations effectuées sur l'objet Recordset.

  • Événements Connection : les événements sont émis lorsqu'une transaction relative à une connexion commence, est validée ou annulée, lorsque Command s'exécute, lorsqu'un avertissement est généré pendant une opération Connection Event, lorsqu'un objet Connection commence ou se termine.
  • Événements Recordset : les événements sont émis dans le cadre d'opérations d'extraction asynchrones, mais aussi lorsque vous naviguez parmi les lignes d'un objet Recordset, modifiez un champ dans une ligne de Recordset, modifiez une ligne de Recordset, ouvrez Recordset avec un curseur côté serveur, fermez Recordset ou apportez une modification quelconque à Recordset.

Les tableaux suivants récapitulent et décrivent les événements.

ConnectionEvent | Description
BeginTransComplete, CommitTransComplete, RollbackTransComplete | Gestion des transactions — Notification que la transaction actuelle a démarré, a été validée ou annulée.
WillConnect, ConnectComplete, Disconnect | Gestion des connexions — Notification que la connexion actuelle va commencer, a commencé ou a abouti.
WillExecute, ExecuteComplete | Gestion de l'exécution d'une commande — Notification que l'exécution de la commande actuelle sur la connexion va commencer ou a abouti.
InfoMessage | Information — Notification qu'il existe des informations supplémentaires au sujet de l'opération actuelle.
RecordsetEvent | Description
FetchProgress, FetchComplete | État de l'extraction — Notification de la progression de l'extraction des données ou de l'aboutissement de l'opération d'extraction. Ces événements ne sont disponibles que si Recordset est ouvert via un curseur côté client..
WillChangeField, FieldChangeComplete | Gestion de la modification des champs — Notification que la valeur du champ actif va changer ou a changé.
WillMove, MoveComplete, EndOfRecordset | Gestion de l'exploration — Notification que l'emplacement de la ligne active d'un objet Recordset va changer, a changé ou va atteindre la fin de Recordset.
WillChangeRecord, RecordChangeComplete | Gestion de la modification des lignes — Notification qu'un élément de la ligne active de Recordset va changer ou a changé.
WillChangeRecordset, RecordsetChangeComplete | Gestion de la modification de l'objet Recordset — Notification qu'un élément du Recordset actif va changer ou a changé.

Voir aussi

Instanciation d'événements ADO par langage | Événements ADO | Paramètres des événements | Fonctionnement conjoint des gestionnaires d'événements | Types d'événements


Types d'événements

Il existe deux types de base d'événements. Les « événements Will », qui sont appelés avant le démarrage d'une opération, comprennent généralement « Will » dans leurs noms, par exemple WillChangeRecordset ou WillConnect. Les événements appelés après l'exécution d'un événement comprennent généralement « Complete » dans leurs noms, par exemple RecordChangeComplete ou ConnectComplete. Il existe des exceptions à ces règles, par exemple InfoMessage, mais elles se produisent après l'exécution de l'opération associée.

Événements Will

Les gestionnaires d'événements qui sont appelés avant le début de l'opération permettent d'examiner ou de modifier les paramètres de celle-ci pour ensuite l'annuler ou la laisser s'exécuter. Ces routines de gestionnaires d'événements portent souvent des noms de la forme WillEvent.

Événements Complete

Les gestionnaires d'événements qui sont appelés après l'exécution d'une opération peuvent notifier à votre application l'aboutissement d'une opération. Un tel gestionnaire d'événements est également notifié lorsqu'un gestionnaire d'événements Will annule une opération en attente. Ces routines de gestionnaires d'événements portent souvent des noms de la forme EventComplete.

Les événements Will et Complete sont généralement utilisés par paires.

Autres événements

Les autres gestionnaires d'événements, c'est-à-dire les événements dont les noms ne sont pas de la forme WillEvent ou EventComplete, ne sont appelés qu'après l'exécution d'une opération. Ces événements sont Disconnect, EndOfRecordset et InfoMessage.

Voir aussi

Résumé du gestionnaire d'événements ADO | Instanciation d'événements ADO par langage | Paramètres des événements | Fonctionnement conjoint des gestionnaires d'événements


Paramètres des événements

Chaque gestionnaire d'événements comporte un paramètre d'état qui le contrôle. Pour les événements Complete, ce paramètre sert également à signaler le succès ou l'échec de l'opération à l'origine de l'événement. La plupart des événements Complete comportent également un paramètre d'erreur pour fournir des informations sur une erreur ayant pu se produire, ainsi qu'un ou plusieurs paramètres d'objet qui font référence aux objets ADO utilisés pour effectuer l'opération. Par exemple, l'événement ExecuteComplete comprend des paramètres d'objet pour les objets Command, Recordset et Connection associés à l'événement. Dans l'exemple ci-après en Microsoft Visual Basic, vous pouvez identifier les objets pCommand, pRecordset et pConnection qui représentent les objets Command, Recordset et Connection utilisés par la méthode Execute.

Private Sub connEvent_ExecuteComplete(ByVal RecordsAffected As Long, _
     ByVal pError As ADODB.Error, _
     adStatus As ADODB.EventStatusEnum, _
     ByVal pCommand As ADODB.Command, _
     ByVal pRecordset As ADODB.Recordset, _
     ByVal pConnection As ADODB.Connection)

À l'exception de l'objet Error, les mêmes paramètres sont transmis aux événements Will. Cela vous permet d'examiner chacun des objets à utiliser dans l'opération en attente et de déterminer si l'opération doit aboutir.

Certains gestionnaires d'événements ont un paramètre Reason, qui donne des informations complémentaires sur l'origine de l'événement. Par exemple, les événements WillMove et MoveComplete peuvent se déclencher à la suite de l'appel d'une méthode de navigation (MoveNext, MovePrevious, etc.) ou en raison de la réexécution d'une requête.

Paramètre Status

Lorsque la routine de gestion des événements est appelée, le paramètre Status prend l'une des valeurs suivantes :

Valeur | Description
adStatusOK | Transmis aux événements Will et Complete. Cette valeur indique que l'opération ayant déclenché l'événement s'est exécutée correctement.
adStatusErrorsOccurred | Transmis aux événements Complete uniquement. Cette valeur indique que l'opération ayant déclenché l'événement ne s'est pas exécutée correctement, ou qu'un événement Will a annulé l'opération. Consultez le paramètre Error pour plus d'informations.
adStatusCantDeny | Transmis aux événements Will uniquement. Cette valeur indique que l'opération n'a pas pu être annulée par l'événement Will. L'opération doit s'exécuter.

Si vous déterminez dans votre événement Will que l'opération doit se poursuivre, ne modifiez pas le paramètre Status. Cependant, tant que le paramètre Status entrant n'a pas la valeur adStatusCantDeny, vous pouvez annuler l'opération en attente en remplaçant Status par adStatusCancel. Si vous procédez ainsi, le paramètre Status de l'événement Complete associé à l'opération prend la valeur adStatusErrorsOccurred. L'objet Error transmis à l'événement Complete contiendra la valeur adErrOperationCancelled.

Si vous ne souhaitez plus traiter un événement, vous pouvez affecter adStatusUnwantedEvent à Status et votre application ne recevra plus de notification de cet événement. Cependant, n'oubliez pas que certains événements peuvent se déclencher pour plusieurs raisons. Dans ce cas, vous devez spécifier adStatusUnwantedEvent pour chaque raison possible. Par exemple, pour arrêter de recevoir des notifications d'événements RecordChange en attente, vous devez affecter au paramètre Status la valeur adStatusUnwantedEvent pour adRsnAddNew, adRsnDelete, adRsnUpdate, adRsnUndoUpdate, adRsnUndoAddNew, adRsnUndoDelete et adRsnFirstChange lorsqu'ils se produisent.

Valeur | Description
adStatusUnwantedEvent | Demande à ce gestionnaire d'événements de ne plus recevoir de notification.
adStatusCancel | Demande l'annulation de l'opération sur le point d'être exécutée.

Paramètre Error

Le paramètre Error est une référence à un objet ADO Error. Lorsque le paramètre Status prend la valeur adStatusErrorsOccurred, l'objet Error contient des explications détaillées sur l'échec de l'opération. Si l'événement Will associé à un événement Complete a annulé l'opération en affectant adStatusCancel au paramètre Status, l'objet Error prend toujours la valeur adErrOperationCancelled.

Paramètre Object

Chaque événement reçoit un ou plusieurs objets qui représentent les objets impliqués dans l'opération. Par exemple, l'événement ExecuteComplete reçoit un objet Command, un objet Recordset et un objet Connection.

Paramètre Reason

Le paramètre Reason, adReason, fournit des informations supplémentaires sur le déclenchement de l'événement. Les événements comportant un paramètre adReason peuvent être appelés à plusieurs reprises, y compris pour une même opération et à chaque fois pour une raison différente. Par exemple, le gestionnaire d'événements WillChangeRecord est appelé pour les opérations qui sont sur le point d'effectuer ou d'annuler l'insertion, la suppression ou la modification d'un enregistrement. Si vous souhaitez traiter un événement uniquement lorsqu'il se produit pour une raison particulière, vous pouvez utiliser le paramètre adReason afin de filtrer les cas qui ne vous intéressent pas. Par exemple, si vous souhaitez traiter les événements de modification d'enregistrement uniquement lorsqu'ils se produisent, à la suite de l'ajout d'un enregistrement, vous pouvez procéder comme suit ou de manière similaire :

' BeginEventExampleVB01
Private Sub rsTest_WillChangeRecord(ByVal adReason As ADODB.EventReasonEnum, ByVal cRecords As Long, adStatus As ADODB.EventStatusEnum, ByVal pRecordset As ADODB.Recordset)
   If adReason = adRsnAddNew Then
       ' Process event
       '...
   Else
       ' Cancel event notification for all
       ' other possible adReason values.
       adStatus = adStatusUnwantedEvent
   End If
End Sub
' EndEventExampleVB01

Dans le cas présent, la notification peut se produire pour chacune des autres raisons. Cependant, elle ne se produira qu'une seule fois pour chaque raison. Après une seule notification pour chaque raison, vous ne recevez plus de notifications que pour l'ajout d'un nouvel enregistrement.

En revanche, vous ne devez affecter adStatusUnwantedEvent à adStatus qu'une seule fois, pour demander qu'un gestionnaire d'événements sans paramètre adReason arrête de recevoir des notifications d'événements.

Voir aussi

Résumé du gestionnaire d'événements ADO | Instanciation d'événements ADO par langage | Fonctionnement conjoint des gestionnaires d'événements | Types d'événements


Fonctionnement conjoint des gestionnaires d'événements

À moins de programmer en Visual Basic, tous les gestionnaires d'événements pour Connection et Recordset doivent être implémentés, même si vous n'utilisez pas réellement tous les événements. Le volume de travail impliqué par la mise en œuvre dépend de votre langage de programmation. Pour plus d'informations, consultez Instanciation d'événements ADO par langage.

Gestionnaires d'événements appariés

Chaque gestionnaire d'événements Will est associé à un gestionnaire d'événements Complete. Par exemple, lorsque votre application change la valeur d'un champ, le gestionnaire d'événements WillChangeField est appelé. Si la modification est acceptable, votre application laisse le paramètre adStatus intact et l'opération est effectuée. Lorsque l'opération aboutit, un événement FieldChangeComplete avertit votre application que l'opération s'est terminée. Si elle s'est correctement exécutée, adStatus contient adStatusOK ; dans le cas contraire, adStatus contient adStatusErrorsOccurred et vous devez vérifier l'objet Error pour déterminer l'origine de l'erreur.

Lorsque WillChangeField est appelé, vous pouvez décider que la modification ne doit pas être effectuée. Dans ce cas, affectez adStatusCancel à adStatus. L'opération est annulée et l'événement FieldChangeComplete reçoit une valeur adStatus de adStatusErrorsOccurred. L'objet Error contient adErrOperationCancelled de sorte que le gestionnaire FieldChangeComplete sait que l'opération a été annulée. Cependant, vous devez vérifier la valeur du paramètre adStatus avant de le modifier, car l'affectation de adStatusCancel à adStatus n'a aucun effet si le paramètre a la valeur adStatusCantDeny à l'entrée dans la procédure.

Parfois, une opération peut déclencher plusieurs événements. Par exemple, l'objet Recordset comprend des événements appariés pour les modifications de Field et les modifications de Record. Lorsque votre application change la valeur de Field, le gestionnaire d'événements WillChangeField est appelé. S'il détermine que l'opération peut se poursuivre, le gestionnaire d'événements WillChangeRecord est également appelé. Si ce dernier autorise également l'événement à poursuivre son exécution, la modification est effectuée et les gestionnaires d'événements FieldChangeComplete et RecordChangeComplete sont appelés. L'ordre d'appel des gestionnaires d'événements Will d'une opération particulière n'est pas défini ; par conséquent, vous devez éviter d'écrire du code qui dépend de l'appel de gestionnaires selon un ordre précis.

Dans les cas où plusieurs événements Will se déclenchent, l'un des événements peut annuler l'opération en attente. Par exemple, lorsque votre application modifie la valeur de Field, les gestionnaires d'événements WillChangeField et WillChangeRecord sont normalement appelés. Cependant, si l'opération est annulée dans le premier gestionnaire d'événements, son gestionnaire Complete associé est immédiatement appelé avec adStatusOperationCancelled. Le second gestionnaire n'est jamais appelé. Toutefois, si le premier gestionnaire d'événements autorise l'événement à poursuivre son exécution, le second gestionnaire d'événements est appelé. Si ce dernier annule alors l'opération, les deux événements Complete sont appelés comme dans les exemples précédents.

Gestionnaires d'événements non appariés

Tant que l'état transmis à l'événement n'est pas adStatusCantDeny, vous pouvez désactiver les notifications d'événements en renvoyant adStatusUnwantedEvent dans le paramètre Status. Par exemple, lorsque votre gestionnaire d'événements Complete est appelé pour la première fois, vous pouvez renvoyer adStatusUnwantedEvent. Ultérieurement, vous recevrez uniquement des événements Will. Cependant, certains événements peuvent être déclenchés pour plusieurs raisons. Dans ce cas, l'événement comporte un paramètre Reason. Lorsque vous renvoyez adStatusUnwantedEvent, vous ne recevez plus de notifications pour cet événement lorsqu'elles se produisent pour la raison particulière indiquée. En d'autres termes, vous recevrez des notifications pour chaque cause possible de déclenchement de l'événement.

Les gestionnaires d'événements Will uniques peuvent être utiles lorsque vous souhaitez examiner les paramètres utilisés au cours de l'opération. Vous pouvez modifier ces paramètres ou annuler l'opération.

Vous pouvez également laisser la notification des événements Complete activée. Lorsque votre premier gestionnaire d'événements Will est appelé, renvoyez adStatusUnwantedEvent. Vous ne recevrez par la suite que des événements Complete.

Les gestionnaires d'événements Complete uniques peuvent être utiles pour gérer des opérations asynchrones. À chaque opération asynchrone correspond un événement Complete.

Par exemple, il peut être très long de remplir un objet Recordset volumineux. Si votre application est correctement écrite, vous pouvez lancer une opération Recordset.Open(...,adAsyncExecute) et poursuivre d'autres traitements. Un événement ExecuteComplete vous signalera que Recordset est rempli.

Gestionnaires d'événements uniques et objets multiples

La souplesse d'un langage de programmation comme Microsoft Visual C++ vous permet d'utiliser un gestionnaire d'événements pour traiter des événements à partir de plusieurs objets. Par exemple, un gestionnaire d'événements Disconnect peut traiter des événements à partir de plusieurs objets Connection. Si l'une des connexions devait être interrompue, le gestionnaire d'événements Disconnect serait appelé. Vous pouvez identifier la connexion qui a déclenché l'événement car la valeur du paramètre d'objet du gestionnaire d'événements correspond à l'objet Connection en cause.

Remarque Cette technique n'est pas disponible dans Visual Basic car ce langage ne peut associer qu'un seul objet à un gestionnaire d'événements.

Voir aussi

Résumé du gestionnaire d'événements ADO | Instanciation d'événements ADO par langage | Paramètres des événements | Types d'événements


Instanciation d'événements ADO par langage

Chaque langage de programmation crée des instances d'événements ADO différentes. Tous les exemples qui suivent permettent de créer un gestionnaire d'événements ConnectComplete.

  • Visual Basic
  • Visual C++
  • Visual J++
  • VBScript
  • JScript
  • ADO/WFC


Visual Basic

Pour gérer les événements ADO dans Microsoft Visual Basic, vous devez déclarer une variable au niveau du module à l'aide du mot clé WithEvents. La variable peut être déclarée uniquement en tant que partie d'un module de classe et doit être déclarée au niveau du module. Ces indications ne sont pas aussi restrictives qu'elles paraissent car les objets Visual Basic Form sont également des classes. La manière la plus simple de gérer les événements ADO est de déclarer une variable avec WithEvents. L'exemple suivant permet de gérer l'événement ConnectComplete pour un objet Connection :

' BeginEventExampleVB02
Dim WithEvents connEvent As Connection
Attribute connEvent.VB_VarHelpID = -1
Dim strMsg As String

Private Sub Form_Load()
    On Error GoTo ErrHandler:

    Dim strConn As String

    ' Create a new object with event
    ' handling enabled.
    strConn = "Provider='sqloledb';" & _
        "Data Source='MySqlServer';" & _
        "Initial Catalog='Northwind';" & _
        "Integrated Security='SSPI';"
    Set connEvent = New ADODB.Connection
    connEvent.Open strConn

    Exit Sub

ErrHandler:
    MsgBox strMsg
End Sub

Private Sub connEvent_ConnectComplete(ByVal pError As ADODB.Error, _
    adStatus As ADODB.EventStatusEnum, _
    ByVal pConnection As ADODB.Connection)

    If adStatus = adStatusErrorsOccurred Then
        If Not pError Is Nothing Then
            Select Case pError.Number
                Case adErrOperationCancelled
                    ' The operation was cancelled in the
                    ' Will event. Notify the user and exit.
                    strMsg = "I'm sorry you can't connect right now." & vbCrLf
                    strMsg = strMsg & " Click OK to exit."
                    Unload Me
                Case Else
                    strMsg = "Error " & Format(pError.Number) & vbCrLf
                    strMsg = strMsg & pError.Description
                    strMsg = strMsg & " Click OK to exit."
                    Unload Me
            End Select
        Else
            strMsg = "Error occured. Click OK to exit."
            Unload Me
        End If
    End If
    'frmWait.btnOK.Enabled = True
End Sub
' EndEventExampleVB02

L'objet Connection est déclaré au niveau Form à l'aide du mot clé WithEvents pour activer la gestion d'événements. le gestionnaire d'événement Form_Load crée en réalité l'objet en affectant un nouvel objet Connection à connEvent et en ouvrant ensuite la connexion. Bien entendu, une véritable application effectuerait plus de traitement dans le gestionnaire d'événement Form_Load que n'en montre l'exemple.


Visual C++

Voici une brève description de la procédure à suivre pour instancier des événements ADO dans Microsoft Visual C++. Pour une description complète, consultez Exemple du modèle d'événements ADO (VC++).

Créez des classes dérivées des interfaces ConnectionEventsVt et RecordsetEventsVt situées dans le fichier adoint.h.

// BeginEventExampleVC01
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);
...
}
// EndEventExampleVC01

Mettez en œuvre chacune des méthodes du gestionnaire d'événement dans les deux classes. Il suffit que chaque méthode renvoie un HRESULT égal à S_OK. Toutefois, dès que vous déclarez que vos gestionnaires d'événements sont disponibles, ils sont appelés continuellement par défaut. Vous préférerez peut-être ne recevoir aucune autre notification après la première en choisissant la valeur adStatusUnwantedEvent pour adStatus.

// BeginEventExampleVC02
STDMETHODIMP CConnEvent::ConnectComplete(
            ADOError *pError,
            EventStatusEnum *adStatus,
            _ADOConnection *pConnection)
        {
        *adStatus = adStatusUnwantedEvent;
        return S_OK;
        }

// EndEventExampleVC02

Les classes d'événements héritant de IUnknown, vous devez également mettre en œuvre les méthodes QueryInterface, AddRef et Release. Utilisez aussi les constructeurs et destructeurs de classe. Choisissez les outils Visual C++ que vous connaissez le mieux pour vous faciliter cet aspect de la tâche.

Déclarez que vos gestionnaires d'événements sont disponibles en émettant QueryInterface sur les objets Recordset et Connection pour les interfaces IConnectionPointContainer et IConnectionPoint. Émettez ensuite IConnectionPoint::Advise pour chaque classe.

Par exemple, supposez que vous utilisez une fonction booléenne qui renvoie la valeur True si elle réussit à informer un objet Recordset que vous disposez de gestionnaires d'événements.

// BeginEventExampleVC03
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, (LPVOID *)&pCPC);
if (FAILED(hr)) return FALSE;
hr = pCPC->FindConnectionPoint(RecordsetEvents, &pCP);
pCPC->Release();    // Always Release now, even before checking.
if (FAILED(hr)) return FALSE;
hr = pCP->Advise(pRstEvent, &dwEvtClass);   //Turn on event support.
pCP->Release();
if (FAILED(hr)) return FALSE;
...
return TRUE;
...
// EndEventExampleVC03

À ce stade, les événements de la famille RecordsetEvent sont activés et vos méthodes seront appelées à mesure que les événements Recordset se produiront.

Ultérieurement, pour rendre vos gestionnaires d'événements non disponibles, recherchez de nouveau le point de connexion et émettez la méthode IConnectionPoint::Unadvise.

// BeginEventExampleVC04
...
hr = pCP->Unadvise(dwEvtClass);    //Turn off event support.
pCP->Release();
if (FAILED(hr)) return FALSE;
...
// EndEventExampleVC04

Vous devez libérer les interfaces et détruire les objets de classe comme il convient.

Le code suivant présente un exemple complet de classe de récepteur d'événement de Recordset.

// BeginEventExampleVC05
#include <adoint.h>

class CADORecordsetEvents : public RecordsetEventsVt
{
public :

   ULONG m_ulRefCount;
   CADORecordsetEvents():m_ulRefCount(1){}

   STDMETHOD(QueryInterface)(REFIID iid, LPVOID * ppvObject)
   {
      if (IsEqualIID(__uuidof(IUnknown), iid) ||
         IsEqualIID(__uuidof(RecordsetEventsVt), iid))
      {
         *ppvObject = this;
         return S_OK;
      }
      else
         return E_NOINTERFACE;
   }

   STDMETHOD_(ULONG, AddRef)()
   {
      return m_ulRefCount++;
   }

   STDMETHOD_(ULONG, Release)()
   {
      if (--m_ulRefCount == 0)
      {
         delete this;
         return 0;
      }
      else
         return m_ulRefCount;
   }

   STDMETHOD(WillChangeField)(
             LONG cFields,
          VARIANT Fields,
          EventStatusEnum *adStatus,
             _ADORecordset  *pRecordset)
   {
         *adStatus = adStatusUnwantedEvent;
         return S_OK;
   }

    STDMETHOD(FieldChangeComplete)(
             LONG cFields,
             VARIANT Fields,
             ADOError  *pError,
             EventStatusEnum  *adStatus,
             _ADORecordset  *pRecordset)
     {
         *adStatus = adStatusUnwantedEvent;
         return S_OK;
    }

    STDMETHOD(WillChangeRecord)(
            EventReasonEnum adReason,
            LONG cRecords,
            EventStatusEnum  *adStatus,
            _ADORecordset  *pRecordset)
   {
         *adStatus = adStatusUnwantedEvent;
         return S_OK;
   }

    STDMETHOD(RecordChangeComplete)(
            EventReasonEnum adReason,
            LONG cRecords,
            ADOError  *pError,
            EventStatusEnum  *adStatus,
         _ADORecordset  *pRecordset)
   {
      *adStatus = adStatusUnwantedEvent;
      return S_OK;
   }

    STDMETHOD(WillChangeRecordset)(
            EventReasonEnum adReason,
            EventStatusEnum  *adStatus,
            _ADORecordset  *pRecordset)
   {
      *adStatus = adStatusUnwantedEvent;
      return S_OK;
   }

    STDMETHOD(RecordsetChangeComplete)(
            EventReasonEnum adReason,
            ADOError *pError,
            EventStatusEnum  *adStatus,
            _ADORecordset  *pRecordset)
   {
      *adStatus = adStatusUnwantedEvent;
      return S_OK;
   }

    STDMETHOD(WillMove)(
            EventReasonEnum adReason,
            EventStatusEnum  *adStatus,
            _ADORecordset  *pRecordset)
   {
      *adStatus = adStatusUnwantedEvent;
      return S_OK;
   }

    STDMETHOD(MoveComplete)(
            EventReasonEnum adReason,
            ADOError  *pError,
            EventStatusEnum  *adStatus,
            _ADORecordset  *pRecordset)
    {
      *adStatus = adStatusUnwantedEvent;
      return S_OK;
   }

    STDMETHOD(EndOfRecordset)(
            VARIANT_BOOL  *fMoreData,
            EventStatusEnum  *adStatus,
            _ADORecordset  *pRecordset)
   {
      *adStatus = adStatusUnwantedEvent;
      return S_OK;
   }

    STDMETHOD(FetchProgress)(
            long Progress,
            long MaxProgress,
            EventStatusEnum  *adStatus,
            _ADORecordset  *pRecordset)
   {
      *adStatus = adStatusUnwantedEvent;
      return S_OK;
   }

    STDMETHOD(FetchComplete)(
            ADOError  *pError,
            EventStatusEnum  *adStatus,
            _ADORecordset  *pRecordset)
   {
      *adStatus = adStatusUnwantedEvent;
      return S_OK;
   }

};
// EndEventExampleVC05


Visual J++

Ce court exemple de code Microsoft Visual J++ montre comment vous pouvez associer votre propre fonction à un événement particulier.

// BeginEventExampleVJ
import com.ms.wfc.data.*;

public class EventExampleVJ
{
    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;
    }

    public static void main (String[] args)
    {
        EventExampleVJ Class1 = new EventExampleVJ();
        Connection conn = new Connection();

        conn.addOnConnectComplete(Class1.handler);     // Enable event support.
        conn.open("DSN=Pubs");
        conn.close();
        conn.removeOnConnectComplete(Class1.handler);  // Disable event support.
    }
}
// EndEventExampleVJ

D'abord, la méthode de classe onConnectionComplete est associée à l'événement ConnectionComplete par création d'un nouvel objet ConnectionEventHandler et affectation de la fonction onConnectComplete à l'objet.

La fonction principale crée ensuite un objet Connection et active la gestion d'événement en appelant la méthode addOnConnectComplete et en lui transmettant l'adresse de la fonction du gestionnaire.


VBScript

Microsoft Visual Basic Scripting Edition ne prend pas en charge les événements ADO.


JScript

Microsoft JScript ne prend pas en charge les événements ADO.


ADO/WFC

ADO pour Windows Foundation Classes (ADO/WFC) est conçu sur le modèle d'événements ADO et propose une interface de programmation d'application simplifiée. Généralement, ADO/WFC intercepte les événements ADO, consolide les paramètres d'événements en une seule classe d'événements, puis appelle votre gestionnaire d'événement.

Pour utiliser des événements ADO dans ADO/WFC

  1. Définissez votre propre gestionnaire d'événements pour traiter un événement. Par exemple, si vous souhaitez traiter l'événement ConnectComplete de la famille ConnectionEvent, vous pouvez utiliser le code suivant :
    public void onConnectComplete(Object sender,ConnectionEvent e)
{
    System.out.println("onConnectComplete:" + e);
}
  2. Définissez un objet handler pour représenter votre gestionnaire d'événements. L'objet handler doit être associé au type de données ConnectEventHandler pour un événement du type ConnectionEvent et au type de données RecordsetEventHandler pour un événement du type RecordsetEvent. Par exemple, utilisez le code suivant pour votre gestionnaire d'événements ConnectComplete :
        ConnectionEventHandler handler =
        new ConnectionEventHandler(this, "onConnectComplete");

    Le premier argument du constructeur ConnectionEventHandlerest une référence à la classe qui contient le gestionnaire d'événements identifié dans le second argument.

    Le compilateur Microsoft Visual J++ prend également en charge une syntaxe équivalente :

        ConnectionEventHandler handler =
        new ConnectionEventHandler(this.onConnectComplete);

    L'argument fait référence à la classe voulue (this) et à la méthode de la classe (onConnectComplete).

  3. Ajoutez votre gestionnaire d'événements à une liste de gestionnaires conçus pour traiter un type spécifique d'événement. Utilisez la méthode qui porte un nom du type addOn EventName(handler).
  4. En interne, ADO/WFC met en œuvre tous les gestionnaires d'événements ADO. Ainsi, un événement provoqué par une opération Connection ou Recordset est intercepté par un gestionnaire d'événements ADO/WFC.

    Le gestionnaire d'événements ADO/WFC transmet des paramètres ConnectionEvent ADO dans une instance de la classe ConnectionEvent ADO/WFC ou des paramètres RecordsetEvent ADO dans une instance de la classe RecordsetEvent ADO/WFC. Ces classes ADO/WFC consolident les paramètres d'événements ADO, c'est-à-dire que chaque classe ADO/WFC contient un membre de données pour chaque paramètre unique dans toutes les méthodes ConnectionEvent ou RecordsetEvent.

  5. ADO/WFC appelle alors votre gestionnaire d'événements avec l'objet d'événement ADO/WFC. Par exemple, votre gestionnaire onConnectComplete a une signature semblable à celle-ci :
        public void onConnectComplete(Object sender,ConnectionEvent e)

    Le premier argument correspond au type d'objet qui a transmis l'événement (Connection ou Recordset) et le second argument est l'objet d'événement ADO/WFC (ConnectionEvent ou RecordsetEvent).

    La signature de votre gestionnaire d'événements est plus simple qu'un événement ADO. Cependant, vous devez comprendre le modèle d'événements ADO pour connaître les paramètres à appliquer à un événement et comment procéder.

  6. À partir de votre gestionnaire d'événements, retournez au gestionnaire ADO/WFC de l'événement ADO. ADO/WFC recopie les membres de données d'événements ADO/WFC pertinents dans les paramètres d'événements ADO et le gestionnaire d'événements ADO est renvoyé.
  7. Une fois le traitement terminé, supprimez le gestionnaire de la liste des gestionnaires d'événements ADO/WFC. Utilisez la méthode qui porte un nom du type removeOn EventName(handler).

Voir aussi

Résumé des gestionnaires d'événements ADO | Programmation en ADO/WFC | Index de la syntaxe ADO/WFC | Paramètres des événements | Fonctionnement simultané de gestionnaires d'événements | Types d'événements


Chapitre 8 : Curseurs et verrous

Il est important de comprendre comment les curseurs fonctionnent pour pouvoir sélectionner le type de curseur le mieux adapté et le plus efficace pour répondre aux besoins en matière d'accès aux données d'une application. Une configuration de curseur inadaptée peut rendre les opérations d'accès aux données longues et fastidieuses.

De nombreuses capacités de l'objet Recordset ADO sont déterminées par le type et l'emplacement du curseur, ainsi que par le type du verrou.

Ce chapitre traite les rubriques suivantes :

  • Qu'est-ce qu'un curseur ?
  • Types de curseurs
  • La signification de l'emplacement du curseur
  • Microsoft Cursor Service pour OLE DB
  • Qu'est-ce qu'un verrou ?
  • Utilisation de la propriété CacheSize
  • Caractéristiques des curseurs et des verrous


Qu'est-ce qu'un curseur ?

Dans une base de données relationnelles, les opérations agissent sur un ensemble complet de lignes. L'ensemble de lignes renvoyé par une instruction SELECT se compose de toutes les lignes qui répondent aux conditions de la clause WHERE de l'instruction. Cet ensemble complet de lignes renvoyé par l'instruction s'appelle le jeu de résultats. Les applications, notamment celles qui sont interactives et en ligne, ne peuvent pas toujours travailler efficacement avec l'ensemble du jeu de résultats défini comme une unité. Ces applications ont besoin d'un mécanisme pour fonctionner avec une ligne ou un petit bloc de lignes à la fois. Les curseurs sont une extension des jeux de résultats qui fournissent ce mécanisme.

Un curseur est implémenté par une bibliothèque de curseurs. Une bibliothèque de curseurs est un logiciel, souvent mis en place dans le cadre d'un système de base de données ou d'une API d'accès aux données, qui sert à gérer les attributs de données renvoyés en provenance d'une source de données (un jeu de résultats). Ces attributs comprennent la gestion de la concurrence, la position du jeu de résultats, le nombre de lignes renvoyées, et si vous pouvez avancer et/ou reculer dans le jeu de résultats (défilabilité).

Un curseur garde trace de la position dans le jeu de résultats, et vous permet d'effectuer plusieurs opérations ligne par ligne sur un jeu de résultats, avec ou sans retour à la table d'origine. En d'autres termes, les curseurs renvoient conceptuellement un jeu de résultats basé sur les tables des bases de données. Le curseur est ainsi nommé car il indique la position courante dans le jeu de résultats, tout comme le curseur indique la position courante à l'écran de l'ordinateur.

Il est important de maîtriser le concept des curseurs avant de passer aux spécificités de leur utilisation dans ADO.

Les curseurs vous permettent de :

  • spécifier un positionnement au niveau de lignes spécifiques dans le jeu de résultats ;
  • extraire une ligne ou un bloc de lignes d'après la position du jeu de résultats courant ;
  • modifier des données dans les lignes à la position courante dans le jeu de résultats ;
  • définir différents niveaux de sensibilité aux modifications des données apportées par les autres utilisateurs.

Par exemple, prenons une application qui affiche une liste de produits proposés à un acheteur potentiel. L'acheteur fait défiler la liste afin de consulter les caractéristiques et les prix des produits, puis arrête son choix sur un produit. Des mouvements supplémentaires de défilement et de sélection se produisent dans le reste de la liste. Pour l'acheteur, les produits apparaissent un par un, mais l'application utilise un curseur défilable pour circuler vers le haut et le bas du jeu de résultats.

Vous pouvez utiliser des curseurs de différentes manières :

  • Sans la moindre ligne.
  • Avec tout ou partie des lignes dans une seule table.
  • Avec tout ou partie des lignes à partir de tables jointes de manière logique.
  • En lecture seule ou pouvant être mis à jour, au niveau du curseur ou du champ.
  • À défilement vers l'avant seulement ou entièrement défilables.
  • Avec le jeu de clés du curseur situé sur le serveur.
  • Sensible aux modifications apportées à la table sous-jacente par d'autres applications (telles que l'adhésion, le tri, les insertions, les mises à jour et les suppressions).
  • Existant sur le serveur ou sur le client.

Les curseurs en lecture seule aident les utilisateurs à naviguer dans le jeu de résultats. Les curseurs en lecture/écriture peuvent implémenter des mises à jour de lignes individuelles. Des curseurs complexes peuvent être définis avec des jeux de clés qui pointent en arrière, vers des lignes de tables de base. Alors que certains curseurs sont en lecture seule et vers l'avant seulement, d'autres peuvent défiler vers l'avant et vers l'arrière tout en offrant un affichage actualisé du jeu de résultats tenant compte des modifications que les autres applications produisent dans la base de données.

Toutes les applications n'ont pas besoin de curseurs pour accéder aux données ou les mettre à jour. Certaines requêtes ne nécessitent simplement pas de mise à jour de ligne directe à l'aide d'un curseur. Les curseurs doivent être une des dernières techniques à choisir pour récupérer des données. Choisissez ensuite le curseur produisant le moins d'impact possible. Lorsque vous créez un jeu de résultats à l'aide d'une procédure stockée, le jeu de résultats ne peut pas être mis à jour à l'aide d'une méthode de modification ou de mise à jour de curseur.

Concurrence

Dans certaines applications multi-utilisateurs, il est vital que les données présentées à l'utilisateur final soient aussi à jour que possible. Un exemple classique d'un système de ce type est le système de réservation d'une compagnie aérienne, où de nombreux utilisateurs peuvent essayer d'obtenir la même place sur un vol donné (et donc, un seul enregistrement). Dans un cas tel que celui-ci, l'application doit gérer par conception des opérations concurrentes sur un seul enregistrement.

Dans d'autres applications, la concurrence n'est pas un facteur aussi important. Dans ce cas, la dépense impliquée dans le maintien à jour en permanence des données n'est pas justifié.

Position

Un curseur garde également trace de la position courante dans un jeu de résultats. Considérez la position courante comme un pointeur vers l'enregistrement courant, à l'instar d'un index de tableau qui pointe vers la valeur à cette position particulière dans le tableau.

Défilabilité

Le type de curseur employé par votre application affecte également la capacité à se déplacer vers l'avant et vers l'arrière parmi les lignes du jeu de résultats. On appelle parfois cette capacité la défilabilité. La capacité à se déplacer vers l'avant et vers l'arrière à l'intérieur d'un jeu de résultats ajoute à la complexité du curseur, et est par conséquent plus onéreuse à implémenter. C'est pour cette raison que vous ne devez demander un curseur doté de cette fonctionnalité qu'en cas de nécessité.


Types de curseurs

En règle générale, votre application doit utiliser le curseur offrant l'accès aux données voulues le plus simple. Toute caractéristique au-delà des besoins élémentaires (défilement en avant seulement, lecture seule, statique, défilement, sans mémoire tampon) a un prix en termes de mémoire client, de charge réseau ou de performance. Dans de nombreux cas, les options par défaut du curseur génèrent un curseur plus complexe que nécessaire pour votre application.

Votre choix de type de curseur dépend de la manière avec laquelle votre application utilise le jeu de résultats ainsi que de plusieurs considérations de conception, telles que la taille du jeu de résultats, le pourcentage des données susceptibles d'être utilisées, la sensibilité aux modifications des données et les besoins en performances de l'application.

Au minimum, votre choix de curseur varie en fonction de ce que vous voulez faire des données, les visualiser ou les modifier :

  • Pour circuler au sein d'un jeu de résultats, mais modifier les données, utilisez un curseur à défilement vers l'avant uniquement ou un curseur statique.
  • Pour sélectionner quelques lignes au sein d'un vaste jeu de résultats, utilisez un curseur à jeu de clés.
  • Pour synchroniser un jeu de résultats vis-à-vis d'ajouts, modifications et suppressions récents par tous les utilisateurs concurrents, utilisez un curseur dynamique.

Bien que chaque type de curseur semble distinct, souvenez-vous que ces types de curseur ne sont pas tant des variantes différentes que le résultat de la superposition de caractéristiques et d'options.

Voir aussi

Curseur à défilement en avant seulement | Curseurs statiques | Curseurs à jeu de clés | Curseurs dynamiques


Curseurs à défilement en avant seulement

ADO 2.5

Curseur à défilement en avant seulement

Le type de curseur par défaut typique, appelé curseur à défilement en avant seulement (ou non défilable), ne peut que défiler vers l'avant dans le jeu de résultats. Un curseur à défilement en avant seulement ne permet pas le défilement (la capacité de faire défiler le jeu de résultats vers l'avant et vers l'arrière). Il permet uniquement la récupération de lignes du début à la fin du jeu de résultats. Avec certains curseurs à défilement en avant seulement (comme avec la bibliothèque de curseurs SQL Server), toutes les instructions d'insertion, de mise à jour et de suppression effectuées par l'utilisateur courant (ou validées par d'autres utilisateurs) qui affectent les lignes du jeu de résultats sont visibles à mesure que les lignes sont récupérées. Étant donné que le curseur ne peut pas défiler vers l'arrière, les modifications apportées aux lignes de la base de données après que la ligne a été récupérée ne sont pas visibles dans le curseur.

Lorsque les données de la ligne courant sont traitées, le curseur à défilement vers l'avant seulement libère les ressources qui étaient employées à contenir ces données. Les curseurs à défilement en avant seulement sont dynamiques par défaut, ce qui signifie que toutes les modifications sont détectées à mesure que la ligne courant est traitée. Cela permet une ouverture plus rapide du curseur et permet au jeu de résultats d'afficher les mises à jour apportées aux tables sous-jacentes.

Alors que les curseurs à défilement en avant seulement ne permettent pas le défilement vers l'arrière, votre application peut revenir au début du jeu de résultats en fermant et en rouvrant le curseur. Cette technique est efficace lorsque vous travaillez sur de petites quantités de données. Comme alternative, votre application peut lire une fois le jeu de résultats, mettre les données dans une mémoire cache locale, puis parcourir la mémoire cache locale.

Si votre application ne nécessite pas de défilement à l'intérieur du jeu de résultats, le curseur à défilement en avant seulement est la meilleure manière de récupérer rapidement et facilement les données. Utilisez adOpenForwardOnly et CursorTypeEnum pour indiquer que vous voulez utiliser un curseur à défilement en avant seulement dans ADO.

Voir aussi

Curseurs statiques | Curseurs à jeu de clés | Curseurs dynamiques


Curseurs statiques

Le curseur statique affiche toujours le jeu de résultats tel qu'il se trouvait au moment de l'ouverture du curseur. Suivant l'implémentation, les curseurs statiques sont soit en lecture seule, soit en lecture/écriture et permettent le défilement en avant et en arrière. En règle générale, le curseur statique ne détecte pas les modifications apportées à l'adhésion, à l'ordre ou aux valeurs du jeu de résultats lorsqu'elles se produisent après son ouverture. Les curseurs statiques peuvent détecter leurs propres mises à jour, suppressions et insertions, même s'ils n'y sont pas contraints.

Les curseurs statiques ne détectent jamais les autres mises à jours, suppressions et insertions. Supposons qu'un curseur statique récupère une ligne et qu'une autre application mette à jour cette ligne. Si l'application récupère à nouveau la ligne du curseur statique, les valeurs qu'elle y trouvera seront inchangées, malgré les modifications apportées. Tous les types de défilement sont autorisés, mais tous les fournisseurs ne prennent pas en charge les signets.

Si votre application ne détecte pas les modifications apportées aux données et nécessite le défilement, le curseur statique est le choix le mieux approprié. Utilisez le CursorTypeEnum de adOpenStatic pour indiquer que vous voulez utiliser un curseur à jeu de clés dans ADO.

Voir aussi

Curseur à défilement en avant seulement | Curseurs à jeu de clés | Curseurs dynamiques


Curseurs à jeu de clés

La fonctionnalité du curseur à jeu de clé se situe entre celles du curseur statique et dynamique dans sa capacité à détecter les modifications. Comme un curseur statique, il ne détecte pas toujours les modifications relatives à l'adhésion à un groupe et à l'ordre du jeu de résultats. Comme un curseur dynamique, il détecte les modifications apportées aux valeurs des lignes dans le jeu de résultats.

Les curseurs à jeu de clés sont contrôlés par un ensemble d'identificateurs (clés) uniques que l'on appelle jeu de clés. Les clés sont créées à partir d'un ensemble de colonnes qui identifient de manière unique les lignes du jeu de résultats. Le jeu de clés est l'ensemble de valeurs de clés de toutes les lignes renvoyées par l'instruction de la requête.

Avec les curseurs à jeu de clés, une clé est créée et enregistrée pour chaque ligne du curseur et stockée sur la station de travail client ou sur le serveur. Lorsque vous accédez à chaque ligne, la clé stockée est utilisée pour récupérer les valeurs de données courantes dans la source de données. Dans un curseur à jeu de clés, l'adhésion du jeu de résultats est gelée tant que le jeu de clés n'est pas entièrement rempli. Par la suite, les ajouts ou mises à jour qui affectent l'adhésion ne font plus partie du jeu de résultats tant que celui-ci n'est pas rouvert.

Les modifications apportées aux valeurs de données (effectuées par le propriétaire du jeu de clés ou par d'autres processus) sont visibles à mesure que l'utilisateur circule dans le jeu de résultats. Les insertions effectuées en dehors du curseur (par d'autres processus) ne sont visibles que si le curseur est fermé et rouvert. Les insertions effectuées depuis l'intérieur du curseur sont visibles à la fin du jeu de résultats.

Lorsqu'un curseur à jeu de clés essaie de récupérer une ligne qui a été supprimée, la ligne apparaît sous forme de « trou » dans le jeu de résultats. La clé correspondant à la ligne existe dans le jeu de clés, mais la ligne n'existe plus dans le jeu de résultats. Si les valeurs de clés d'une ligne sont mises à jour, la ligne est considérée comme ayant été supprimée, puis insérée, de sorte que ces lignes apparaissent également en tant que trous dans le jeu de résultats. Alors qu'un curseur à jeu de clés peut toujours détecter les lignes supprimées par d'autres processus, il peut également supprimer les clés des lignes qu'il supprime lui-même. Les curseurs à jeu de clés capables de cela ne peuvent pas détecter leurs propres suppressions car la preuve en a été supprimée.

Une mise à jour effectuée sur une colonne de clés correspond à la suppression de l'ancienne clé suivie de l'insertion de la nouvelle clé. La valeur de la nouvelle clé n'est pas visible si la mise à jour n'a pas été effectuée par l'intermédiaire du curseur. Si la mise à jour a été effectuée par l'intermédiaire du curseur, la valeur de la nouvelle clé est visible à la fin du jeu de résultats.

Il existe une variante du curseur à jeu de clés qui s'appelle le curseur standard à jeu de clés. Dans un curseur standard à jeu de clés, l'adhésion des lignes dans le jeu de résultats et l'ordre des lignes sont fixés au moment de l'ouverture du curseur, mais les modifications des valeurs apportées par le propriétaire du curseur et les modifications validées par d'autres processus sont visibles. Si une modification disqualifie l'adhésion d'une ligne ou affecte l'ordre d'une ligne, la ligne ne disparaît pas et ne bouge pas tant que le curseur n'a pas été fermé et rouvert. Les données insérées n'apparaissent pas, mais les modifications apportées aux données existantes n'apparaissent pas au moment où les lignes sont récupérées.

Il est difficile d'utiliser correctement le curseur à jeu de clés car la sensibilité aux modifications des données dépend d'une variété de circonstances, comme décrit ci-dessus. Toutefois, si votre application ne craint pas les mises à jour concurrentes, est capable de gérer les mauvaises clés par programmation et doit accéder directement à certaines lignes à clé, le curseur à jeu de clés peut être adapté à votre situation. Utilisez le CursorTypeEnum de adOpenKeyset pour indiquer que vous voulez utiliser un curseur à jeu de clés dans ADO.

Voir aussi

Curseur à défilement en avant seulement | Curseurs statiques | Curseurs dynamiques


Curseurs dynamiques

Les curseurs dynamiques détectent toutes les modifications apportées aux lignes dans le jeu de résultats, que celles-ci se produisent à l'intérieur du curseur ou qu'elles soient provoquées par d'autres utilisateurs, à l'extérieur du curseur. Toutes les instructions d'insertion, de mise à jour et de suppression apportées par tous les utilisateurs sont visibles dans le curseur. Le curseur dynamique peut détecter n'importe quelle modification apportée aux lignes, à l'ordre et aux valeurs du jeu de résultat après l'ouverture du curseur. Les mises à jour apportées à l'extérieur du curseur ne sont pas visibles avant d'être validées (à moins que le niveau d'isolation de transaction du curseur soit défini comme étant « non validé »).

Supposons par exemple qu'un curseur dynamique récupère deux lignes et une autre application, puis mette à jour une de ces lignes et supprime l'autre. Si le curseur dynamique récupère ensuite ces lignes, il ne trouvera pas la ligne supprimée, mais affichera les nouvelles valeurs de la ligne mise à jour.

Le curseur dynamique est préférable si votre application doit détecter toutes les mises à jour concurrentes effectuées par les autres utilisateurs. Utilisez adOpenDynamic et CursorTypeEnum pour indiquer que vous voulez utiliser un curseur dynamique dans ADO.

Curseur à défilement en avant seulement | Curseurs statiques | Curseurs à jeu de clés


La signification de l'emplacement du curseur

Chaque curseur utilise des ressources temporaires pour contenir ses données. Ces ressources peuvent être de la mémoire, un fichier d'échange sur disque, des fichiers disque temporaires ou même un espace de stockage temporaire dans la base de données. Le curseur s'appelle curseur côté client lorsque ces ressources se trouvent sur l'ordinateur client. Le curseur s'appelle curseur côté serveur lorsque ces ressources se trouvent sur le serveur.

Curseurs côté client

Dans ADO, vous appelez un curseur côté client à l'aide du CursorLocationEnum de adUseClient. Avec un curseur côté client qui n'est pas à jeu de clés, le serveur envoie via le réseau l'ensemble du jeu de résultat à l'ordinateur client. L'ordinateur client fournit et gère les ressources temporaires qui sont nécessaires au curseur et au jeu de résultat. L'application côté client peut parcourir l'ensemble du jeu de résultat pour déterminer quelles lignes lui sont nécessaires.

Les curseurs statiques et à jeu de clés peuvent peser lourdement sur votre station de travail s'ils contiennent trop de lignes. Si toutes les bibliothèques de curseur sont capables de créer des curseurs de milliers de lignes, les applications conçues pour gérer de tels ensembles de lignes peuvent se révéler peu performantes. Il existe des exceptions, bien sûr. Pour certaines applications, un curseur côté client de grande taille peut être parfaitement adapté et ne causer aucun problème de performance.

Un avantage évident du curseur côté client réside dans sa réactivité. Lorsque le jeu de résultats a été téléchargé dans l'ordinateur client, la navigation dans les lignes se fait très rapidement. Votre application est généralement plus évolutive avec les curseurs côté client car les besoins en ressources du curseur sont placés sur chaque client distinct et pas sur le serveur.

Curseurs côté serveur

Dans ADO, vous appelez un curseur côté serveur à l'aide du CursorLocationEnum de adUseServer. Avec un curseur côté client, le serveur gère le jeu de résultats à l'aide de ressources fournies par l'ordinateur serveur. Le curseur côté serveur ne renvoie que les données demandées via le réseau. Ce type de curseur offre parfois de meilleures performances que le curseur côté client, notamment dans les situations où un trafic réseau trop important pose problème.

Il faut toutefois signaler qu'un curseur côté serveur consomme, au moins temporairement, de précieuses ressources serveur pour chaque client actif. Vous devez tenir compte de cette consommation pour veiller à ce que votre matériel serveur soit capable de gérer tous les curseurs côté serveur demandés par les clients actifs. Par ailleurs, un curseur côté serveur peut être lent car il ne fournit d'accès qu'à une seule ligne ; aucun curseur par lot n'est disponible.

Les curseurs côté serveur sont utiles pour insérer, mettre à jour ou supprimer des enregistrements. Avec des curseurs côté serveur, vous pouvez avoir plusieurs instructions actives sur le même connexion.


Microsoft Cursor Service pour OLE DB

Lorsque vous sélectionnez un curseur côté client, ou définissez la propriété CursorLocation sur adUseClient, vous invoquez le composant Microsoft Cursor Service pour OLE DB. Vous pouvez également constater des références au « moteur du curseur client », qui est essentiellement la même chose que dans le contexte de l'ADO. Ce service complète les fonctions de support curseur des fournisseurs de données. Par conséquent, vous percevez des fonctionnalités relativement uniformes de la part de tous les fournisseurs de données.

Le service Cursor Service pour OLE DB met à disposition des propriétés dynamiques et améliore le comportement de certaines méthodes. La propriété dynamique Optimize, par exemple, permet de créer des index temporaires pour faciliter certaines opérations telles que la méthode Find.

Le service Cursor Service permet la prise en charge, dans tous les cas, de mises à jour par lot. Il simule également d'autres types de curseurs plus performants, tels que les curseurs dynamiques, lorsqu'un fournisseur de données ne peut fournir que des curseurs moins performants comme des curseurs statiques.

Voir aussi

Microsoft Cursor Service pour OLE DB

© 1998-2003 Microsoft Corporation. Tous droits réservés.


Qu'est-ce qu'un verrou ?

Le verrouillage est le processus au cours duquel un système SGBD limite l'accès à une ligne dans un environnement multi-utilisateur. Lorsqu'une ligne ou une colonne est verrouillée de manière exclusive, les autres utilisateurs ne sont pas autorisés à accéder aux données verrouillées tant que le verrou n'est pas relâché. Ce système veille à ce que deux utilisateurs ne puissent pas mettre simultanément à jour la même colonne dans une ligne.

Les verrous peuvent être de très gros consommateurs de ressources et ne doivent être utilisés qu'en cas de nécessité pour préserver l'intégrité des données. Dans une base de données où des centaines voire des milliers d'utilisateurs peuvent essayer d'accéder à un enregistrement à chaque seconde—comme c'est le cas d'une base de données consultables par Internet. Dans ces conditions, un verrouillage non indispensable peut entraîner des baisses de performance dans votre application.

Vous pouvez contrôler la manière avec laquelle la source de données et la bibliothèque de curseurs ADO gèrent la concurrence en choisissant l'option de verrouillage appropriée.

Définissez la propriété LockType avant d'ouvrir un objet Recordset pour spécifier le type de verrouillage que le fournisseur doit appliquer lorsqu'il ouvre l'objet. Lisez cette propriété pour renvoyer le type de verrouillage utilisé sur un objet Recordset ouvert.

Certains fournisseurs ne prennent pas en charge tous les types de verrouillage. Lorsqu'un fournisseur n'accepte pas la valeur demandée de la propriété LockType, il lui substitue un autre type de verrouillage. Pour connaître la fonctionnalité de verrouillage effectivement disponible dans un objet Recordset, utilisez la méthode Supports avec adUpdate et adUpdateBatch.

La valeur adLockPessimistic n'est pas prise en charge si la propriété CursorLocation a pour valeur adUseClient. Une valeur non prise en charge ne génère pas d'erreur car elle est remplacée par la valeur la plus proche de LockType.

La propriété LockType est accessible en lecture/écriture lorsque l'objet Recordset est fermé et en lecture seule lorsqu'il est ouvert.


Types de verrous

adLockBatchOptimistic

Mise à jour par lot optimiste. Obligatoire en mode de mise à jour par lots.

De nombreuses applications récupèrent plusieurs lignes à la fois et doivent ensuite réaliser des mises à jour coordonnées qui incluent la totalité de l'ensemble de lignes à insérer, mettre à jour ou supprimer. Avec des curseurs par lot, un seul aller au serveur est nécessaire, ce qui améliore les performances des mises à jour et réduit le trafic du réseau. Avec une bibliothèque de curseurs par lot, vous pouvez créer un curseur statique, puis vous déconnecter de la source de données. À ce stade, vous pouvez apporter des modifications aux lignes, vous reconnecter, puis publier les modifications à la source de données dans un lot.

adLockOptimistic

Indiquez que le fournisseur utilise un verrouillage optimiste—verrouillant uniquement les enregistrements lorsque vous appelez la méthode Update. Cela signifie qu'il existe une possibilité que les données puissent être modifiées par un autre utilisateur entre le moment où vous modifiez l'enregistrement et le moment où vous appelez le méthode Update, ce qui engendre un conflit. Utilisez ce type de verrou dans les situations où les risques de collision sont faibles ou facilement résolubles.

adLockPessimistic

Indique que le fournisseur utilise un verrouillage pessimiste, enregistrement par enregistrement. Le fournisseur fait ce qu'il faut pour garantir la modification des enregistrements, généralement en verrouillant des enregistrements au niveau de la source de données immédiatement avant de les modifier. Cela signifie bien sûr que les enregistrements sont indisponibles aux autres utilisateurs une fois que vous commencez à les modifier, jusqu'à ce que vous relâchiez le verrou en appelant la méthode Update. Utilisez ce type de verrou dans les systèmes où toute modification concurrente des données est à prescrire, comme dans un système de réservation.

adLockReadOnly

Indique des enregistrements en lecture seule. Vous ne pouvez pas modifier les données. Un verrou en lecture seule est le type de verrou le plus rapide car il ne nécessite pas que le serveur maintienne le verrouillage des enregistrements.

adLockUnspecified

Ne spécifie pas de type de curseur.


Utilisation de la propriété CacheSize

Utilisez la propriété CacheSize pour contrôler le nombre d'enregistrements pouvant être récupérés en une seule fois en mémoire locale. Par exemple, si la valeur de CacheSize est de cela signifie qu'après avoir ouvert l'objet Recordset, le fournisseur récupère les 10 premiers enregistrements en mémoire locale. Au fur et à mesure que vous vous déplacez dans l'objet Recordset, le fournisseur renvoie les données stockées en mémoire tampon locale. Dès que vous dépassez le dernier enregistrement stocké en mémoire cache, le fournisseur transfère les 10 enregistrements suivants de la source de données vers la mémoire cache.

Note CacheSize repose sur la propriété Maximum Open Rows spécifique au fournisseur (dans la collection Properties de l'objet Recordset). Vous ne pouvez pas définir CacheSize à une valeur supérieure à celle de Maximum Open Rows. Pour modifier le nombre de lignes pouvant être ouvertes par le fournisseur, définissez Maximum Open Rows.

La valeur de CacheSize peut être modifiée pour un même Recordset mais le changement n'est effectif que pour les enregistrements récupérés ultérieurement en mémoire cache à partir de la source de données. La modification de la valeur de la propriété n'affecte pas le contenu en cours de la mémoire cache.

S'il y a moins d'enregistrements à récupérer que ne le spécifie la valeur CacheSize, le fournisseur renvoie les enregistrements restants et aucun message d'erreur n'est généré.

Vous ne pouvez pas affecter la valeur zéro à la propriété CacheSize, sous peine de recevoir un message d'erreur.

Les enregistrements extraits de la mémoire cache ne reflètent pas les modifications de la source de données effectuées simultanément par d'autres utilisateurs. Pour forcer une mise à jour de toutes les données stockées en mémoire cache, utilisez la méthode Resync.

Si la valeur de CacheSize est supérieure à 1, les méthodes de navigation (Move, MoveFirst, MoveLast, MoveNext et MovePrevious) peuvent atteindre un enregistrement supprimé si la suppression intervient après la récupération des enregistrements dans le cache. Les suppressions qui interviennent après la récupération initiale des enregistrements ne sont répercutées dans le cache de données qu'après une tentative d'accès à une valeur issue d'une ligne supprimée. En affectant la valeur 1 à la propriété CacheSize, vous éliminez ce problème puisque les lignes supprimées ne sont pas récupérables en mémoire cache.


Caractéristiques des curseurs et des verrous

Si les caractéristiques d'un curseur dépendent des capacités du fournisseur, les avantages et inconvénients suivants s'appliquent généralement aux différents types de curseurs et de verrous.

Type de curseur et de verrou Avantages Désavantages
adOpenForwardOnly
  • Faibles besoins en ressources
  • Ne peut pas défiler vers l'arrière
  • Pas de concurrence des données
adOpenStatic
  • Défilable
  • Pas de concurrence des données
adOpenKeyset
  • Concurrence partielle des données
  • Défilable
  • Besoins en ressources plus importants
  • Indisponible dans un scénario déconnecté
adOpenDynamic
  • Grande concurrence des données
  • Défilable
  • Besoins en ressources importants
  • Indisponible dans un scénario déconnecté
adLockReadOnly
  • Faibles besoins en ressources
  • Très évolutif
  • Les données ne peuvent pas être mises à jour par l'intermédiaire du curseur
adLockBatchOptimistic
  • Mises à jour par lot
  • Permet les scénarios déconnectés
  • D'autre utilisateurs peuvent accéder aux données
  • Les données peuvent être modifiées par plusieurs utilisateurs à la fois
adLockPessimistic
  • Les données ne peuvent pas être modifiées par d'autres utilisateurs quand elles sont verrouillées
  • Empêche les autres utilisateurs d'accéder aux données quand elles sont verrouillées
adLockOptimistic
  • D'autre utilisateurs peuvent accéder aux données
  • Les données peuvent être modifiées par plusieurs utilisateurs à la fois


Chapitre 9 : Mise en forme des données

La mise en forme des données permet d'interroger une source de données et de renvoyer un objet Recordset qui représente une relation parent-enfant entre deux ou plusieurs entités logiques (hiérarchie). La relation entre clients et commandes est un exemple classique de relation hiérarchique. Pour chaque client d'une base de données, il peut exister zéro commande ou plus. Le langage SQL normal permet d'extraire des données à l'aide d'une syntaxe de jointure, mais cette méthode peut être inefficace et peu commode à cause de la répétition de données parentes redondantes dans chaque enregistrement renvoyé pour une relation parent-enfant donnée. La mise en forme des données peut relier un enregistrement parent unique de l'objet Recordset parent à plusieurs enregistrements enfants de l'objet Recordset enfant, ce qui évite ainsi la redondance d'une jointure. La plupart des utilisateurs trouvent le modèle de programmation de Recordset multiples parents-enfants plus naturel et plus facile à utiliser que le modèle de jointure de Recordset unique.

La syntaxe de mise en forme des données fournit d'autres avantages. Les développeurs peuvent créer des objets Recordset sans source de données sous-jacente en utilisant le mot clé NEW pour décrire les champs des Recordset parents et enfants. Le nouvel objet Recordset peut être rempli de données et stocké de façon permanente. Les développeurs ont également la possibilité d'effectuer divers calculs ou regroupements (par exemple, SUM, AVG et MAX) sur les champs enfants. La mise en forme des données permet également de créer un Recordset parent à partir d'un Recordset enfant en regroupant les enregistrements de l'enfant et en plaçant une ligne dans le parent pour chaque groupe contenu dans l'enfant.

Pour en savoir plus sur la mise en forme des données, consultez les rubriques suivantes :

  • Résumé sur la mise en forme des données
  • Fournisseurs requis pour la mise en forme des données
  • Généralités sur les commandes de mise en forme
  • Clause de mise en forme Append
  • Clause de mise en forme Compute
  • Fabrication d'objets Recordset hiérarchiques
  • Accès aux lignes d'un objet Recordset hiérarchique
  • Grammaire formelle des commandes de mise en forme
  • Fonctions Visual Basic pour Applications


Résumé sur la mise en forme des données

Les sections suivantes décrivent plusieurs concepts : mise en forme des données, objets Recordset hiérarchiques, remise en forme, regroupement de petits-enfants, formes paramétrées et enregistrement de formes dans des fichiers.

  • Mise en forme des données
  • Remise en forme
  • Regroupements de petits-enfants
  • Commandes paramétrées faisant intervenir des commandes COMPUTE
  • Stockage permanent des objets Recordset hiérarchiques


Mise en forme des données

La mise en forme des données vous permet de définir les colonnes d'un Recordset mis en forme, les relations entre les entités représentées par les colonnes et la façon dont les données occupent Recordset.

Les colonnes d'un objet Recordset mis en forme peuvent contenir des données en provenance d'un fournisseur de données comme Microsoft SQL Server, des références à un autre Recordset, des valeurs résultant d'un calcul sur une seule ligne d'un objet Recordset, des valeurs résultant d'une opération sur une colonne de la totalité d'un Recordset ; il peut également s'agir d'une colonne vide que vous venez de créer.

Lorsque vous extrayez la valeur d'une colonne qui contient une référence à un autre objet Recordset, ADO renvoie automatiquement le Recordset réel représenté par la référence. Un objet Recordset qui comprend un autre Recordset est dit hiérarchique. Les objets Recordset hiérarchiques mettent en évidence une relation parent-enfant où le Recordset conteneur est le parent et le Recordset contenu, l'enfant. La référence à un objet Recordset est en fait une référence à un sous-ensemble du Recordset enfant appelé un chapitre. Un seul parent peut faire référence à plusieurs objets Recordset enfants.

La syntaxe de la commande de mise en forme vous permet de créer par programmation un objet Recordset mis en forme. Vous pouvez alors accéder aux composants de l'objet Recordset par programmation ou via un contrôle visuel approprié. Une commande de mise en forme est émise comme tout autre texte de commande ADO.

La syntaxe des commandes de mise en forme vous permet de créer des objets Recordset hiérarchiques selon deux méthodes. La première méthode consiste à ajouter un objet Recordset enfant à un objet Recordset parent. Le parent et l'enfant ont en général une colonne en commun : la valeur de cette colonne dans une ligne du parent est identique à la valeur de la même colonne dans toutes les lignes de l'enfant.

La seconde méthode consiste à générer un Recordset parent à partir d'un Recordset enfant. Les enregistrements d'un Recordset enfant sont regroupés, généralement à l'aide de la clause BY, et une ligne est ajoutée au Recordset parent pour chaque groupe résultant dans l'enfant. Si la clause BY est omise, le Recordset enfant forme un groupe unique et le Recordset parent contient exactement une seule ligne. Cela peut être utile pour le calcul des totaux généraux dans l'ensemble d'un Recordset enfant.

Quelle que soit la méthode de formation du Recordset parent, ce dernier contient une colonne de chapitre qui sert à le lier à un Recordset enfant. Si vous le souhaitez, le Recordset parent peut également comporter des colonnes contenant des regroupements (SUM, MIN, MAX, etc.) basés sur les lignes enfants. Les objets Recordset parent et enfant peuvent posséder des colonnes qui contiennent une expression dans la ligne du Recordset, ainsi que des colonnes nouvelles et initialement vides.

Vous pouvez imbriquer des objets Recordset hiérarchiques sur autant de niveaux que vous le souhaitez (vous pouvez ainsi créer des objets Recordset enfants dont les parents sont eux-mêmes les enfants d'objets Recordset enfants, etc.).

Vous pouvez accéder aux composants Recordset de l'objet Recordset mis en forme par programmation ou via un contrôle visuel approprié.

Microsoft fournit un outil visuel qui génère des commandes de mise en forme (consultez The Data Environment Designer (en anglais) dans la documentation Visual Basic) et un autre outil qui affiche des curseurs hiérarchiques (consultez Using the Microsoft Hierarchical Flexgrid Control (en anglais) dans la documentation Visual Basic).

Pour obtenir des exemples de commandes de mise en forme et leurs hiérarchies résultantes, consultez Using the Data Shaping Service for OLE DB: A Closer Look (en anglais).


Remise en forme

Il est possible d'affecter un nom d'alias à un objet Recordset créé par une clause d'une commande de mise en forme (généralement à l'aide du mot clé AS). L'alias d'un objet Recordset mis en forme peut être référencé dans une commande complètement différente. Autrement dit, vous pouvez réutiliser (« reshape ») un objet Recordset précédemment mis en forme dans une nouvelle commande de mise en forme. Pour prendre en charge cette fonctionnalité, ADO fournit la propriété Reshape Name.

L'exécution d'une commande de remise en forme a deux fonctions : la première consiste à associer un objet Recordset existant à un nouvel objet Recordset parent.

Exemple

. . .
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
. . .

La seconde fonction consiste à permettre l'accès sans chapitre à des objets Recordset enfants existants via la syntaxe « SHAPE <nom du Recordset reformé> ».

Remarque Vous ne pouvez pas ajouter de colonnes à un objet Recordset existant, ni procéder à une remise en forme d'un Recordset paramétré ou d'objets Recordset dans une clause COMPUTE intermédiaire, ni effectuer des opérations de regroupement sur un Recordset descendant de l'objet Recordset faisant l'objet d'une remise en forme. L'objet Recordset faisant l'objet d'une remise en forme et la nouvelle commande de mise en forme doivent utiliser le même objet Connection.

Mise en forme des données


Regroupements de petits-enfants

La colonne de chapitre créée dans une clause de commande de mise en forme peut se voir affecter un nom d'alias de chapitre (généralement à l'aide du mot clé AS). Vous pouvez identifier n'importe quelle colonne (tous chapitres confondus) de l'objet Recordset mis en forme à l'aide d'un nom complet identifiant l'enfant qui contient cette colonne. Par exemple, si le chapitre parent chap1 contient un chapitre enfant chap2 qui comprend une colonne amt (« Montant »), le nom complet est chap1.chap2.amt. Ce nom complet peut ensuite être utilisé comme argument d'une fonction de regroupement (SUM, AVG, MAX, MIN, COUNT, STDEV ou ANY).

Mise en forme des données


Commandes paramétrées faisant intervenir des commandes COMPUTE

Une commande APPEND de mise en forme paramétrée classique comprend une clause qui crée un objet Recordset parent avec une commande de requête et une autre clause qui crée un objet Recordset enfant avec une commande de requête paramétrée, c'est-à-dire une commande contenant un espace réservé pour un paramètre (point d'interrogation, « ? »). L'objet Recordset mis en forme qui en résulte comprend deux niveaux : le niveau supérieur pour le parent et le niveau inférieur pour l'enfant.

La clause qui crée l'objet Recordset enfant peut alors être un nombre arbitraire de commandes COMPUTE de mise en forme imbriquées, où la commande de plus bas niveau contient la requête paramétrée. L'objet Recordset mis en forme qui en résulte comprend plusieurs niveaux : le niveau supérieur correspond au parent et le niveau le plus bas, à l'enfant, les niveaux intermédiaires étant occupés par un nombre arbitraire d'objets Recordset générés par les commandes COMPUTE de mise en forme.

L'utilisation la plus courante de cette fonctionnalité consiste à faire appel à la fonction et aux possibilités de regroupement des commandes COMPUTE de mise en forme pour créer des objets Recordset intermédiaires contenant des informations analytiques sur l'objet Recordset enfant. Par ailleurs, comme il s'agit d'une commande de mise en forme paramétrée, un nouvel objet Recordset enfant peut être récupéré lors de chaque accès à une colonne de chapitre du parent. Dans la mesure où les niveaux intermédiaires sont dérivés de l'enfant, ils sont également recalculés.

Mise en forme des données


Stockage permanent des objets Recordset hiérarchiques

Vous pouvez enregistrer un Recordset hiérarchique dans un fichier au format ADTG ou XML en appelant la méthode Save. Toutefois, l'enregistrement d'objets Recordset hiérarchiques au format XML est soumis à deux limites : Vous ne pouvez pas enregistrer au format XML un objet Recordset hiérarchique qui contient des mises à jour en attente et vous ne pouvez pas enregistrer un objet Recordset hiérarchique paramétré.

Pour plus d'informations sur le fournisseur Data Shaping, consultez Microsoft Data Shaping Service for OLE DB (ADO), ainsi que les détails relatifs au service Data Shaping pour OLE DB (OLE DB)

Voir aussi

Mise en forme des données | Grammaire formelle des commandes de mise en forme | Généralités sur les commandes de mise en forme


Fournisseurs requis pour la mise en forme des données

De manière générale, la mise en forme des données nécessite deux fournisseurs. Le fournisseur de services Data Shaping Service for OLE DB fournit la fonctionnalité de mise en forme et un fournisseur de données tel que OLE DB Provider for SQL Server fournit les lignes de données pour remplir l'objet Recordset mis en forme.

Le nom du fournisseur de services (MSDataShape) peut être spécifié par la valeur de la propriété Provider de l'objet Connection ou par le mot clé « Provider=MSDataShape; » de la chaîne de connexion.

Le nom du fournisseur de données peut être la valeur de la propriété dynamique Data Provider (qui est ajoutée à la collection Properties de l'objet Connection par le fournisseur de services Data Shaping Service for OLE DB) ou du mot clé « Data Provider=provider » de la chaîne de connexion.

Un fournisseur de données n'est pas nécessaire si Recordset n'est pas rempli (cas d'un Recordset fabriqué dont les colonnes sont créées avec le mot clé NEW). Dans ce cas, spécifiez « Data Provider=none; ».

Exemple

Dim cnn As New ADODB.Connection
cnn.Provider = "MSDataShape"
cnn.Open "Data Provider=SQLOLEDB;Integrated Security=SSPI;Database=Northwind"

Voir aussi

Mise en forme des données | Grammaire formelle des commandes de mise en forme | Généralités sur les commandes de mise en forme


Généralités sur les commandes de mise en forme

La mise en forme des données permet de définir les colonnes d'un Recordset mis en forme, les relations entre les entités représentées par les colonnes et la façon dont les données occupent Recordset.

Un objet Recordset mis en forme peut comprendre les types de colonnes suivants :

Type de colonne | Description
données | Champs provenant d'un objet Recordset renvoyé par une commande de requête à un fournisseur de données, une table ou un Recordset précédemment mis en forme.
chapitre | Référence à un autre Recordset, appelé chapitre. Les colonnes du chapitre permettent de définir une relation parent-enfant où le parent est l'objet Recordset qui contient la colonne du chapitre, l'enfant étant l'objet Recordset représenté par le chapitre.
regroupement | La valeur de cette colonne est dérivée en exécutant une fonction de regroupement sur toutes les lignes ou sur une colonne de toutes les lignes d'un Recordset enfant. (Consultez les fonctions de regroupement dans la rubrique suivante : Fonctions de regroupement, fonction CALC et mot clé NEW.)
expression calculée | La valeur de cette colonne est dérivée en calculant une expression Visual Basic pour Applications sur des colonnes situées dans la même ligne de Recordset. Cette expression est l'argument fourni à la fonction CALC. (Consultez « Expression calculée » dans les rubriques Fonctions de regroupement, fonction CALC et mot clé NEW et Fonctions Visual Basic pour Applications.
nouvelle | Champs créés mais vides qui peuvent être remplis de données ultérieurement. Cette colonne est définie à l'aide du mot clé NEW. (Consultez le mot clé NEW dans la rubrique Fonctions de regroupement, fonction CALC et mot clé NEW.)

Une commande de mise en forme peut contenir une clause spécifiant une commande de requête à un fournisseur de données qui doit renvoyer un objet Recordset. La syntaxe de la requête dépend des exigences du fournisseur de données sous-jacent. Dans la plupart des cas, il s'agira du langage SQL (Structured Query Language), bien que ADO ne nécessite l'utilisation d'aucun langage de requête particulier.

Vous pourriez utiliser une clause SQL JOIN pour relier deux tables, mais un objet Recordset hiérarchique risque de représenter plus efficacement les informations. Chaque ligne d'un objet Recordset créé par une clause JOIN reproduit des informations redondantes provenant de l'une des tables. Un objet Recordset hiérarchique contient un seul Recordset parent pour chacun de ses multiples objets Recordset enfants.

Les commandes de mise en forme peuvent être émises par des objets Recordset ou en définissant la propriété CommandText de l'objet Command et en appelant la méthode Execute.

Les commandes de mise en forme peuvent être imbriquées. En d'autres termes, la commande-parent ou la commande-enfant peut elle-même être une autre commande de mise en forme.

Le fournisseur de commandes de mise en forme renvoie toujours un curseur client, même lorsque l'utilisateur spécifie adUseServer comme emplacement de curseur.

Pour plus d'informations sur la navigation dans un objet Recordset hiérarchique, consultez Accès aux lignes d'un objet Recordset hiérarchique.

Pour plus d'informations sur la syntaxe correcte des commandes de mise en forme, consultez Grammaire formelle des commandes de mise en forme.


Fonctions de regroupement, fonction CALC et mot clé NEW

La mise en forme des données prend en charge les fonctions suivantes. Le nom affecté au chapitre qui contient la colonne à traiter est l'alias-chapitre.

Un alias-chapitre peut être un nom complet comprenant les noms de toutes les colonnes de chapitre, séparés par des points, jusqu'au chapitre qui contient le nom de colonne. Par exemple, si le chapitre parent chap1 contient un chapitre enfant chap2 qui comprend une colonne amt (« Montant »), le référencement complet à l'objet se fait de la manière suivante : chap1.chap2.amt.

Fonctions de regroupement | Description
SUM(alias-chapitre.nom-colonne) | Calcule la somme de toutes les valeurs de la colonne spécifiée.
AVG(alias-chapitre.nom-colonne) | Calcule la moyenne de toutes les valeurs de la colonne spécifiée.
MAX(alias-chapitre.nom-colonne) | Calcule la valeur maximale dans la colonne spécifiée.
MIN(alias-chapitre.nom-colonne) | Calcule la valeur minimale dans la colonne spécifiée.
COUNT(alias-chapitre.nom-colonne) | Compte le nombre de lignes dans l'alias spécifié. Si une colonne est spécifiée, seules les lignes pour lesquelles cette colonne est non nulle sont incluses dans le compte.
STDEV(alias-chapitre.nom-colonne) | Calcule l'écart type dans la colonne spécifiée.
ANY(alias-chapitre.nom-colonne) Valeur de la colonne spécifiée. ANY a une valeur prévisible uniquement lorsque la valeur de la colonne est la même pour toutes les lignes du chapitre.
Note Si la colonne ne contient pas la même valeur pour toutes les lignes du chapitre, la commande SHAPE renvoie arbitrairement une des valeurs pour qu'elle devienne la valeur de la fonction ANY.
Expression calculée | Description
CALC(expression) | Calcule une expression arbitraire, mais seulement dans la ligne du Recordset qui contient la fonction CALC. Toute expression utilisant ces Fonctions Visual Basic pour Applications (VBA) est autorisée.
Mot clé NEW | Description
NEW type-champ [(largeur | échelle| précision | erreur [, échelle | erreur])] | Ajoute au Recordset une colonne vide du type spécifié.

Le paramètre type-champ transmis avec le mot clé NEW peut être l'un quelconque des types de données suivants :

Types de données OLE DB | Équivalents du type de données ADO
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

Lorsque le nouveau champ est de type décimal (DBTYPE_DECIMAL dans OLE DB ou adDecimal dans ADO), vous devez spécifier sa précision et son échelle.

Voir aussi

Mise en forme des données | Grammaire formelle des commandes de mise en forme | Généralités sur les commandes de mise en forme


Envoi de commandes au fournisseur de données sous-jacent

Toute commande qui ne commence pas par SHAPE est transmise au fournisseur de données. Cela revient à émettre une commande sous la forme « SHAPE {commande du fournisseur} ». Ces commandes ne produisent pas forcément un objet Recordset. Par exemple, « SHAPE {DROP TABLE MyTable} » est une commande de mise en forme parfaitement correcte, à condition que le fournisseur de données prenne en charge la commande DROP TABLE.

Grâce à cette possibilité, les commandes normales du fournisseur comme les commandes de mise en forme peuvent partager la même connexion et la même transaction.

Voir aussi

Mise en forme des données | Grammaire formelle des commandes de mise en forme | Généralités sur les commandes de mise en forme


Clause de mise en forme Append

La clause APPEND des commandes de mise en forme ajoute une ou plusieurs colonnes à un objet Recordset. Il s'agit souvent de colonnes de chapitre qui font référence à un objet Recordset enfant.

Syntaxe

SHAPE [parent-command [[AS] parent-alias]] APPEND column-list

Description

Les différents éléments de cette clause sont les suivants :

commande-parent
Zéro ou l'une des valeurs suivantes (vous pouvez purement et simplement omettre parent-command) :
  • Commande du fournisseur entre accolades (« {} ») qui renvoie un objet Recordset. La commande est envoyée au fournisseur de données sous-jacent et sa syntaxe dépend des exigences de ce dernier. Dans la plupart des cas, il s'agira du langage SQL, bien que ADO ne nécessite l'utilisation d'aucun langage de requête spécifique.
  • Autre commande de mise en forme incorporée entre parenthèses.
  • Mot clé TABLE, suivi du nom d'une table du fournisseur de données.
alias-parent
Alias facultatif qui fait référence au Recordset parent.
liste-colonnes
Il peut s'agir d'un ou plusieurs des éléments suivants :
  • Colonne de regroupement.
  • Colonne calculée.
  • Nouvelle colonne créée avec la clause NEW.
  • Colonne de chapitre. La définition d'une colonne de chapitre est placée entre parenthèses (« () »). Voir la syntaxe ci-dessous :
SHAPE [parent-command [[AS] parent-alias]]
   APPEND (child-recordset [ [[AS] child-alias]
      RELATE parent-column TO child-column | PARAMETER param-number, ... ])
   [[AS] chapter-alias]
   [, ... ]
child-recordset
  • Commande du fournisseur entre accolades (« {} ») qui renvoie un objet Recordset. La commande est envoyée au fournisseur de données sous-jacent et sa syntaxe dépend des exigences de ce dernier. Dans la plupart des cas, il s'agira du langage SQL, bien que ADO ne nécessite l'utilisation d'aucun langage de requête spécifique.
  • Autre commande de mise en forme incorporée entre parenthèses.
  • Nom d'un Recordset mis en forme existant.
  • Mot clé TABLE, suivi du nom d'une table du fournisseur de données.
alias-enfant
Alias qui fait référence au Recordset enfant.
colonne-parent
Colonne de Recordset renvoyée par parent-command.
colonne-enfant
Colonne de Recordset renvoyée par child-command.
param-number
Consultez Fonctionnement des commandes paramétrées.
alias-chapitre
Alias qui fait référence à la colonne de chapitre ajoutée au parent.
Remarque La clause « parent-column TO child-column » est en fait une liste, où chaque relation définie est séparée par une virgule.
Remarque La clause qui suit le mot clé APPEND est en réalité une liste de clauses séparées par une virgule, chaque clause définissant une autre colonne à ajouter au parent.

Remarques

Lorsque vous construisez des commandes de fournisseur à partir d'entrées de l'utilisateur dans le cadre d'une commande SHAPE, SHAPE traite ces commandes comme des chaînes opaques et les transmet fidèlement au fournisseur. Dans l'exemple de commande SHAPE ci-dessous,

SHAPE {select * from t1} APPEND ({select * from t2} RELATE k1 TO k2)

SHAPE exécute deux commandes : select * from t1 et (select * from t2 RELATE k1 TO k2). Si l'utilisateur fournit une commande composée, qui comprend plusieurs commandes de fournisseur séparées par des points-virgules, SHAPE n'est pas capable de les différencier. Par conséquent, dans la commande SHAPE ci-dessous,

SHAPE {select * from t1; drop table t1} APPEND ({select * from t2} RELATE k1 TO k2)

SHAPE exécute select * from t1; drop table t1 et (select * from t2 RELATE k1 TO k2), sans parvenir à déterminer que drop table t1 est une commande de fournisseur séparée, et dans le cas présent, dangereuse. Les applications doivent toujours valider l'entrée de l'utilisateur pour éviter de tels risques d'attaques par des pirates.

Remarques

Lorsque vous construisez des commandes de fournisseur à partir d'entrées de l'utilisateur dans le cadre d'une commande SHAPE, SHAPE traite ces commandes comme des chaînes opaques et les transmet fidèlement au fournisseur. Dans l'exemple de commande SHAPE ci-dessous,

SHAPE {select * from t1} APPEND ({select * from t2} RELATE k1 TO k2)

SHAPE exécute deux commandes : select * from t1 et (select * from t2 RELATE k1 TO k2). Si l'utilisateur fournit une commande composée, qui comprend plusieurs commandes de fournisseur séparées par des points-virgules, SHAPE n'est pas capable de les différencier. Par conséquent, dans la commande SHAPE ci-dessous,

SHAPE {select * from t1; drop table t1} APPEND ({select * from t2} RELATE k1 TO k2)

SHAPE exécute select * from t1; drop table t1 et (select * from t2 RELATE k1 TO k2), sans parvenir à déterminer que drop table t1 est une commande de fournisseur séparée, et dans le cas présent, dangereuse. Les applications doivent toujours valider l'entrée de l'utilisateur pour éviter de tels risques d'attaques par des pirates.

Voir aussi

Mise en forme des données | Grammaire formelle des commandes de mise en forme | Généralités sur les commandes de mise en forme


Fonctionnement des commandes non paramétrées

Pour les commandes non paramétrées, toutes les commandes du fournisseur sont exécutées et les Recordsets sont créés pendant l'exécution des commandes. Si la commande est exécutée de manière synchrone, tous les Recordsets seront entièrement remplis. Si un mode de remplissage asynchrone a été sélectionné, l'état de remplissage des Recordsets dépendra du mode de remplissage et de la taille des Recordsets.

Par exemple, la commande-parent peut renvoyer un Recordset de clients d'une société à partir d'une table Customers et la commande-enfant peut renvoyer un Recordset des commandes relatives à tous les clients à partir d'une table Orders.

SHAPE {SELECT * FROM Customers}
   APPEND ({SELECT * FROM Orders} AS chapOrders
   RELATE customerID TO customerID)

Dans le cas de relations parent-enfant non paramétrées, les objets Recordset parent et enfant doivent être associés par une colonne en commun. Les colonnes sont nommées dans la clause RELATE, d'abord la colonne-parent, puis la colonne-enfant. Les colonnes peuvent avoir des noms différents dans leurs objets Recordset respectifs, mais elles doivent faire référence aux mêmes informations pour spécifier une relation significative. Par exemple, les objets Recordset Customers et Orders peuvent contenir tous les deux un champ customerID. Étant donné que l'adhésion du Recordset enfant est déterminée par la commande du fournisseur, il est possible que le Recordset enfant contienne des lignes orphelines. Ces lignes orphelines sont inaccessibles sans autre remise en forme.

La mise en forme des données ajoute une colonne de chapitre au Recordset parent. Les valeurs situées dans la colonne de chapitre sont des références à des lignes du Recordset enfant qui satisfont à la clause RELATE. Autrement dit, il doit y avoir la même valeur dans la colonne-parent d'une ligne parent donnée et dans la colonne-enfant de toutes les lignes de l'enfant du chapitre. Lorsque la même clause RELATE contient plusieurs clauses TO, celles-ci sont implicitement combinées par l'opérateur AND. Si les colonnes parentes de la clause RELATE ne constituent pas une clé pour le Recordset parent, une seule ligne enfant peut avoir plusieurs lignes parentes.

Lorsque vous accédez à une référence dans la colonne de chapitre, ADO extrait automatiquement le Recordset représenté par cette référence. Il convient de noter que dans une commande non paramétrée, bien que le Recordset enfant soit extrait en totalité, le chapitre ne présente qu'un sous-ensemble de lignes.

Si la colonne ajoutée n'a pas d'alias-chapitre, un nom lui sera généré automatiquement. Un objet Field pour la colonne sera ajouté dans la collection Fields de l'objet Recordset, et son type de données sera adChapter.

Pour plus d'informations sur la navigation dans un objet Recordset hiérarchique, consultez Accès aux lignes d'un objet Recordset hiérarchique.

Voir aussi

Mise en forme des données | Grammaire formelle des commandes de mise en forme | Généralités sur les commandes de mise en forme


Fonctionnement des commandes paramétrées

Si vous utilisez un objet Recordset enfant volumineux (par rapport à la taille du Recordset parent notamment) mais n'avez besoin d'accéder qu'à quelques chapitres enfants, il peut être plus efficace d'utiliser une commande paramétrée.

Une commande non paramétrée extrait l'intégralité des objets Recordset parent et enfant, ajoute une colonne de chapitre au parent, puis affecte à chaque ligne parent une référence au chapitre enfant associé.

Une commande paramétrée extrait l'intégralité du Recordset parent mais elle n'extrait que le Recordset du chapitre lorsque vous accédez à la colonne de chapitre. Cette différence dans la stratégie d'extraction peut se traduire par un gain de performances important.

Par exemple, vous pouvez spécifier :

SHAPE {SELECT * FROM customer}
   APPEND ({SELECT * FROM orders WHERE cust_id = ?}
   RELATE cust_id TO PARAMETER 0)

Les tables parent et enfant ont une colonne en commun, cust_id. La commande-enfant contient un espace réservé « ? » auquel fait référence la clause RELATE (c'est-à-dire « ...PARAMETER 0 »).

Remarque La clause PARAMETER concerne uniquement la syntaxe de la commande de mise en forme. Elle n'est associée ni à l'objet ADO Parameter, ni à la collection Parameters.

Lorsque la commande de mise en forme paramétrée est exécutée, voici ce qui se passe :

  1. La commande-parent est exécutée et renvoie un Recordset parent depuis la table Customers.
  2. Une colonne de chapitre est ajoutée à l'objet Recordset parent.
  3. Lorsque vous accédez à la colonne de chapitre d'une ligne parent, la commande-enfant est exécutée en utilisant la valeur de customer.cust_id comme valeur du paramètre.
  4. Toutes les lignes de l'ensemble de lignes du fournisseur de données créé à l'étape 3 sont utilisées pour remplir le Recordset enfant. Dans cet exemple, il s'agit de toutes les lignes de la table Orders dans lesquelles cust_id est égal à valeur de customer.cust_id. Par défaut, les Recordsets enfants seront mis en mémoire cache sur le client jusqu'à ce que toutes les références au Recordset parent soient libérées. Pour modifier ce comportement, affectez à la propriété dynamique Cache Child Rows du Recordset la valeur False.
  5. La référence des lignes enfants extraites (c'est-à-dire du chapitre du Recordset enfant) est placée dans la colonne de chapitre de la ligne en cours du Recordset parent.
  6. Si vous accédez à la colonne de chapitre d'une autre ligne, les étapes 3 à 5 se répètent.

La propriété dynamique Cache Child Rows a par défaut la valeur True. Le fonctionnement du cache varie en fonction des valeurs des paramètres de la requête. Dans une requête à un seul paramètre, le Recordset enfant correspondant à une valeur donnée de ce paramètre est placé en mémoire cache entre les demandes concernant un enfant de cette valeur. Le code suivant illustre ce mécanisme :

...
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      ' Next cust_id passed to Param 0, & new rs fetched
                   ' into RstChild.
Rst1.MovePrevious  ' RstChild now holds cached rs, saving round trip.
...

Dans une requête à deux paramètres ou davantage, un enfant en mémoire cache n'est utilisé que si toutes les valeurs des paramètres sont identiques aux valeurs en mémoire cache.

Commandes paramétrées et relations complexes entre parents et enfants

Outre l'utilisation de commandes paramétrées pour améliorer les performances d'une hiérarchie de type équijointure, les commandes paramétrées peuvent être utilisées pour gérer des relations parent-enfant plus complexes. Par exemple, prenons une base de données d'un championnat sportif contenant deux tables : une composée des équipes (team_id, team_name) et l'autre des parties (date, home_team, visiting_team).

Avec une hiérarchie non paramétrée, il n'y a pas moyen d'associer les tables d'équipes et de parties de telle manière que le Recordset enfant de chaque équipe contienne son planning complet. Vous pouvez créer des chapitres qui contiennent le planning des rencontres à domicile ou le planning des rencontres à l'extérieur, mais pas les deux. L'explication est que la clause RELATE vous limite aux relations parent-enfant de la forme (pc1=cc1) AND (pc2=pc2). Ainsi, si votre commande inclut "RELATE team_id TO home_team, team_id TO visiting_team", vous n'obtiendrez que les parties où une équipe jouait contre elle-même. Vous cherchez à obtenir "(team_id=home_team) OR (team_id=visiting_team)", mais le fournisseur Shape ne prend pas en charge la clause OR.

Pour obtenir le résultat voulu, vous pouvez utiliser une commande paramétrée. Par exemple :

SHAPE {SELECT * FROM teams}
APPEND ({SELECT * FROM games WHERE home_team = ? OR visiting_team = ?}
        RELATE team_id TO PARAMETER 0,
               team_id TO PARAMETER 1)

Cet exemple exploite la souplesse de la clause SQL WHERE pour obtenir le résultat que vous cherchez.

Voir aussi

Mise en forme des données | Grammaire formelle des commandes de mise en forme | Généralités sur les commandes de mise en forme


Commandes hybrides

Les commandes hybrides sont des commandes partiellement paramétrées. Par exemple :

SHAPE {select * from plants}
   APPEND( {select * from customers where country = ?}
           RELATE PlantCountry TO PARAMETER 0,
             PlantRegion TO CustomerRegion )

Dans le cas d'une commande hybride, la mise en cache fonctionne comme pour les commandes paramétrées normales.

Voir aussi

Mise en forme des données | Grammaire formelle des commandes de mise en forme | Généralités sur les commandes de mise en forme


Clauses de mise en forme COMPUTE intermédiaires

Il est autorisé d'incorporer une ou plusieurs clauses COMPUTE entre le parent et l'enfant dans une commande de mise en forme paramétrée, comme dans l'exemple suivant :

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)

Voir aussi

Mise en forme des données | Grammaire formelle des commandes de mise en forme | Généralités sur les commandes de mise en forme


Clause de mise en forme Compute

Une clause de mise en forme COMPUTE génère un Recordset parent composé ainsi : colonnes contenant une référence au Recordset enfant, colonnes facultatives qui peuvent être des colonnes de chapitre, des colonnes nouvelles, des colonnes calculées ou le résultat de l'exécution de fonctions de regroupement sur l'objet fonctions de regroupement enfant ou sur un objet Recordset précédemment mis en forme, toute colonne du Recordset enfant mentionnée dans la clause facultative BY.

Syntaxe

SHAPE child-command [AS] child-alias
   COMPUTE child-alias [[AS] name], [appended-column-list]
   [BY grp-field-list]

Description

Les différents éléments de cette clause sont les suivants :

commande-enfant
Il peut s'agir de l'un des éléments suivants :
  • Commande de requête entre accolades (« {} ») qui renvoie un objet Recordset enfant. La commande est envoyée au fournisseur de données sous-jacent et sa syntaxe dépend des exigences de ce dernier. Dans la plupart des cas, il s'agira du langage SQL, bien que ADO ne nécessite l'utilisation d'aucun langage de requête spécifique.
  • Nom d'un Recordset mis en forme existant.
  • Autre commande de mise en forme.
  • Mot clé TABLE, suivi du nom d'une table du fournisseur de données.
alias-enfant
Alias utilisé pour faire référence au Recordset renvoyé par child-command. child-alias est requis dans la liste de colonnes de la clause COMPUTE et définit la relation entre les objets Recordset parent et enfant.
liste-colonnes-ajoutées
Liste dont chaque élément définit une colonne du Recordset parent généré. Chaque élément de la liste contient une colonne de chapitre, une nouvelle colonne, une colonne calculée ou une valeur produite par une fonction de regroupement exécutée sur le Recordset enfant.
grp-field-list
Liste de colonnes appartenant aux objets Recordset parent et enfant, qui spécifie comment les lignes doivent être regroupées dans l'objet enfant.

Pour chaque colonne de grp-field-list, il existe une colonne correspondante dans les objets Recordset enfant et parent. Pour chaque ligne du Recordset parent, les colonnes de grp-field-list contiennent des valeurs uniques et l'objet Recordset enfant référencé par la ligne parente comprend uniquement les lignes enfants dont les colonnes grp-field-list contiennent les mêmes valeurs que la ligne parent.

Si la clause BY est incluse, les lignes du Recordset enfant sont regroupées en fonction des colonnes de la clause COMPUTE. Le Recordset parent contient une ligne pour chaque groupe de lignes du Recordset enfant.

Si la clause BY est omise, tout le Recordset enfant est considéré comme un groupe unique et le Recordset parent contient exactement une seule ligne. Cette ligne fait référence à l'ensemble du Recordset enfant. L'omission de la clause BY vous permet de calculer des totaux généraux dans l'ensemble d'un Recordset enfant.

Par exemple :

SHAPE {select * from Orders} AS orders
   COMPUTE orders, SUM(orders.OrderAmount) as TotalSales

Quelle que soit la méthode de formation du Recordset parent (via l'utilisation de COMPUTE ou APPEND), ce dernier contient une colonne de chapitre qui sert à le lier à un Recordset enfant. Si vous le souhaitez, le Recordset parent peut également comporter des colonnes contenant des regroupements (SUM, MIN, MAX, etc.) basés sur les lignes enfants. Les objets Recordset parent et enfant peuvent posséder des colonnes qui contiennent une expression dans la ligne du Recordset, ainsi que des colonnes nouvelles et initialement vides.

Fonctionnement

child-command est envoyé au fournisseur et renvoie un Recordset enfant.

La clause COMPUTE spécifie les colonnes du Recordset parent ; il peut s'agir d'une référence au Recordset enfant, d'une ou plusieurs colonnes de regroupement, d'une expression calculée ou de nouvelles colonnes. S'il existe une clause BY, les colonnes qu'elle définit sont également ajoutées au Recordset parent. La clause BY spécifie la manière dont les lignes du Recordset enfant sont regroupées.

Prenons l'exemple d'une table (Demographics) composée des champs State, City et Population (les chiffres sont fournis à titre d'illustration uniquement).

State | City | Population
WA | Seattle | 700 000
OR | Medford | 200 000
OR | Portland | 400 000
CA | Los Angeles | 800 000
CA | San Diego | 600 000
WA | Tacoma | 500 000
OR | Corvallis | 300 000

Lancez à présent la commande de mise en forme suivante :

rst.Open  "SHAPE {select * from demographics} AS rs "  & _
          "COMPUTE rs, SUM(rs.population) BY state", _
           objConnection

Cette commande ouvre un Recordset mis en forme à deux niveaux. Le niveau parent est un Recordset généré qui comprend une colonne de regroupement (SUM(rs.population)), une colonne de référence au Recordset enfant (rs) et une colonne de regroupement du Recordset enfant (state). Le niveau enfant est le Recordset renvoyé par la commande de requête (select * from demographics).

Les lignes de détails du Recordset enfant sont regroupées par état (state), mais sans ordre particulier. En d'autres termes, les groupes ne sont pas classés par ordre alphabétique ou numérique. Si vous souhaitez que le Recordset parent soit classé dans un ordre particulier, vous pouvez utiliser la méthode Sort de Recordset pour trier le Recordset parent.

Vous pouvez à présent naviguer dans le Recordset parent ouvert et accéder aux objets Recordset détaillés enfants. Pour plus d'informations, consultez la rubrique Accès aux lignes d'un objet Recordset hiérarchique.

Objets Recordset parent et enfant détaillés résultants

Parent

SUM (rs.Population) | rs | State
1 300 000 | Référence à enfant1 | CA
1 200 000 | Référence à enfant2 | WA
1 100 000 | Référence à enfant3 | OR

Enfant1

State | City | Population
CA | Los Angeles | 800 000
CA | San Diego | 600 000

Enfant2

State | City | Population
WA | Seattle | 700 000
WA | Tacoma | 500 000

Enfant3

State | City | Population
OR | Medford | 200 000
OR | Portland | 400 000
OR | Corvallis | 300 000

Voir aussi

Accès aux lignes d'un objet Recordset hiérarchique | Résumé sur la mise en forme des données | Field, objet | Grammaire formelle des commandes de mise en forme | Recordset, objet | Fournisseurs requis pour la mise en forme des données | Clause de mise en forme Append | Généralités sur les commandes de mise en forme | Value, propriété | Fonctions Visual Basic pour Applications


Fabrication d'objets Recordset hiérarchiques

L'exemple suivant montre comment fabriquer un objet Recordset hiérarchique sans source de données sous-jacente en utilisant la grammaire de mise en forme des données pour définir les colonnes des jeux d'enregistrements parents, enfants et petits-enfants.

Pour fabriquer un objet Recordset hiérarchique, vous devez spécifier le service Microsoft Data Shaping Service pour OLE DB (MSDataShape) et le fournisseur de données (Data Provider) NONE dans le paramètre de chaîne de connexion de la méthode Open de l'objet Connection. Pour plus d'informations, consultez Fournisseurs requis pour la mise en forme des données.

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

Une fois fabriqué, l'objet Recordset peut être rempli, manipulé ou rendu permanent dans un fichier.

Voir aussi

Accès aux lignes d'un objet Recordset hiérarchique | Grammaire formelle des commandes de mise en forme | Fournisseurs requis pour la mise en forme des données | Clause de mise en forme APPEND | Généralités sur les commandes de mise en forme


Accès aux lignes d'un objet Recordset hiérarchique

L'exemple suivant indique les étapes nécessaires pour accéder aux lignes d'un objet Recordset hiérarchique :

  1. Les objets Recordset des tables authors et titleauthor sont reliés par les ID des auteurs.
  2. La boucle externe affiche le prénom et le nom de chaque auteur, son département et son identification.
  3. L'objet Recordset ajouté pour chaque ligne est extrait de la collection Fields et attribué à rstTitleAuthor.
  4. La boucle interne affiche quatre champs provenant de chaque ligne de l'objet Recordset ajouté.

(La propriété StayInSync a la valeur FALSE pour les besoins de l'illustration ; vous pouvez ainsi voir le chapitre changer explicitement à chaque itération de la boucle externe. Toutefois, cet exemple sera plus efficace si l'affectation effectuée à l'étape 3 est remontée avant la première ligne de l'étape 2, ce qui permet de l'exécuter une fois seulement. Affectez ensuite la valeur TRUE à la propriété StayInSync pour que rstTitleAuthor reflète implicitement et automatiquement le chapitre correspondant lorsque rst change de ligne.)

Exemple

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=MyUserName;Password=MyPassword;Database=Pubs"
' STEP 1
   rst.StayInSync = FALSE
   rst.Open    "SHAPE  {select * from authors} "  & _
               "APPEND ({select * from titleauthor} " & _
               "RELATE au_id TO au_id) AS chapTitleAuthor", _
               cnn
' STEP 2
   While Not rst.EOF
      Debug.Print    rst("au_fname"), rst("au_lname"), _
                     rst("state"), rst("au_id")
' STEP 3
      Set rstTitleAuthor = rst("chapTitleAuthor").Value
' STEP 4
      While Not rstTitleAuthor.EOF
         Debug.Print rstTitleAuthor(0), rstTitleAuthor(1), _
                     rstTitleAuthor(2), rstTitleAuthor(3)
         rstTitleAuthor.MoveNext
      Wend
      rst.MoveNext
   Wend
End Sub

Voir aussi

Résumé sur la mise en forme des données | Field, objet | Fields, collection | Grammaire formelle des commandes de mise en forme | Microsoft Data Shaping Service for OLE DB | Recordset, objet | Fournisseurs requis pour la mise en forme des données | Clause de mise en forme Append | Généralités sur les commandes de mise en forme | Clause de mise en forme Compute | Fonctions Visual Basic pour Applications


Grammaire formelle des commandes de mise en forme

Voici la grammaire formelle utilisée pour créer toutes les commandes de mise en forme :

  • Les termes grammaticaux requis sont des chaînes de texte délimitées par les signes « inférieurs à » et « supérieurs à » (« <> »).
  • Les termes facultatifs sont délimités par des crochets (« [ ] »).
  • Les alternatives sont identifiées par une barre verticale (« | »).
  • Les alternatives répétitives sont identifiées par des points de suspension (« ... »).
  • Alpha indique une chaîne composée de caractères alphabétiques uniquement.
  • Digit indique une chaîne composée de chiffres uniquement.
  • Unicode-digit indique une chaîne composée de chiffres unicodes.

Tous les autres termes utilisent des caractères littéraux.

Terme Définition
<shape-command>

SHAPE [<table-exp> [[AS] <alias>]][<shape-action>]

<table-exp>

{<provider-command-text>} |

(<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(<qualified-alias> | <qualified-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>

<qualified-name>

alias[.alias...]

<name>

alpha [ alpha | digit | _ | # | : | ...]

<number>

digit [digit...]

<new-exp>

NEW <field-type> [(<number> [, <number>])]

<field-type>
 Type de données OLE DB ou ADO.
<string>

unicode-char [unicode-char...]

<expression>
 Expression Visual Basic pour Applications dont les opérandes sont d'autres colonnes non-CALC de la même ligne.

Voir aussi

Accès aux lignes d'un objet Recordset hiérarchique | Résumé sur la mise en forme des données | Fournisseurs requis pour la mise en forme des données | Clause de mise en forme Append | Généralités sur les commandes de mise en forme | Clause de mise en forme Compute | Fonctions Visual Basic pour Applications


Fonctions Visual Basic pour Applications

Les fonctions Visual Basic pour Applications suivantes peuvent être utilisées dans les expressions CALC de mise en forme des données.

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 |

Voir aussi

Accès aux lignes d'un objet Recordset hiérarchique | Résumé sur la mise en forme des données | Grammaire formelle des commandes de mise en forme | Fournisseurs requis pour la mise en forme des données | Clause de mise en forme Append | Généralités sur les commandes de mise en forme | Clause de mise en forme Compute


Chapitre 10 : Objets Record et Stream

ADO fournit l'objet Recordset, qui constitue la principale méthode d'accès aux informations contenues dans les sources de données, par exemple les bases de données relationnelles. Cependant, certains fournisseurs prennent en charge les objets Record et Stream en tant qu'objets de remplacement ou complémentaires permettant la manipulation des données des fournisseurs. Pour plus d'informations sur le comportement de Record, consultez la documentation de votre fournisseur.

Objets Record

Les objets Record fonctionnent essentiellement comme des objets Recordset d'une seule ligne. Cependant, les objets Record disposent de fonctionnalités limitées par rapport aux objets Recordset ; en outre, ils possèdent des propriétés et des méthodes différentes. La source des données dans un objet Record peut être une commande qui renvoie une ligne de données à partir du fournisseur. L'utilisation d'objets Record à la place d'objets Recordset pour recevoir les résultats d'une requête renvoyant une seule ligne de données élimine la charge de traitement liée à l'instanciation de l'objet Recordset, lequel est plus complexe.

Les objets Record peuvent jouer un autre rôle, en particulier avec les fournisseurs de sources de données autres que les bases de données relationnelles traditionnelles, par exemple Microsoft OLE DB Provider for Internet Publishing. Une bonne partie des informations à traiter existe, non pas sous forme de tables de bases de données, mais en tant que messages contenus dans des systèmes de messagerie électronique et en tant que fichiers présents sur des systèmes de fichiers modernes. Les objets Record et Stream facilitent l'accès aux informations stockées dans les sources autres que les bases de données relationnelles.

L'objet Record peut représenter et gérer les données telles que des répertoires et des fichiers dans un système de fichiers ou des dossiers, ou telles que des messages dans un système de messagerie électronique. Pour ces raisons, la source de Record peut être la ligne active d'un objet Recordset ouvert, une URL absolue ou une URL relative associée à un objet Connection ouvert.

En règle générale, un objet Recordset sert à représenter un conteneur ou un parent dans une hiérarchie, par exemple un dossier ou un répertoire. Record permet de renvoyer des informations spécifiques sur un nœud unique du conteneur parent, par exemple un fichier ou un document. La raison principale pour laquelle les objets Record servent à représenter ce type d'informations vient du fait que ces sources de données sont hétérogènes. En d'autres termes, chaque objet Record peut comporter un ensemble et un nombre de champs différents. Les objets Recordset traditionnels contenant les lignes d'une base de données sont homogènes, ce qui signifie que chaque ligne possède le même nombre et le même type de champs.

Pour plus d'informations sur l'utilisation de l'objet Record dans le but de traiter les données hétérogènes émanant des fournisseurs tels que Internet Publishing, consultez Utilisation de ADO pour la publication Internet.

Objets Stream

L'objet Stream fournit le moyen de lire, écrire et gérer un flux d'octets. Ce dernier peut être constitué de texte ou de données binaires. Sa taille n'est limitée que par les ressources système. En règle générale, les objets ADO Stream ont le rôle suivant :

  • contenir le texte ou les octets d'un fichier ou message. Ils sont généralement utilisés avec les fournisseurs tels que Microsoft OLE DB Provider for Internet Publishing. Pour plus d'informations sur l'utilisation des objets Stream, consultez Utilisation de ADO pour la publication Internet.

Un objet Stream peut être ouvert sur :

  • un fichier simple spécifié par une URL ;
  • un champ d'un objet Record ou Recordset contenant un objet Stream ;
  • le flux par défaut d'un objet Record ou Recordset représentant un répertoire ou un fichier composé ;
  • un champ de ressource contenant l'URL d'un fichier simple ;
  • aucune ressource particulière ; dans ce cas, un objet Stream est ouvert en mémoire. Des données peuvent y être écrites, puis enregistrées dans un autre objet Stream ou un fichier ;
  • un champ BLOB dans Recordset.

© 1998-2002 Microsoft Corporation. Tous droits réservés.


Objets Stream et persistance

La méthode Save de l'objet Recordset stocke, ou rend permanent, un Recordset dans un fichier ; la méthode Open restaure le Recordset à partir de ce fichier.

Avec ADO 2.5, les méthodes Save et Open peuvent également rendre permanent un objet Recordset dans un objet Stream. Cette fonctionnalité est particulièrement utile avec RDS (Remote Data Service) et ASP (Active Server Pages).

Pour plus d'informations sur l'utilisation de la persistance dans les pages ASP, consultez la documentation ASP actuelle.

Les quelques scénarios qui suivent montrent comment utiliser les objets Stream et la persistance.

Scénario 1

Ce scénario commence par enregistrer un objet Recordset dans un fichier, puis dans un objet Stream. Il ouvre ensuite le flux rendu permanent dans un autre objet Recordset.

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

Set rs1 = New ADODB.Recordset
Set rs2 = New ADODB.Recordset
Set stm = New ADODB.Stream

rs1.Open   "SELECT * FROM Customers", "Provider=sqloledb;" & _
        "Data Source=MyServer;Initial Catalog=Northwind;" & _
        "Integrated Security=SSPI;""", adopenStatic, adLockReadOnly, adCmdText
rs1.Save "c:\myfolder\mysubfolder\myrs.xml", adPersistXML
rs1.Save stm, adPersistXML
rs2.Open stm

Scénario 2

Ce scénario rend un objet Recordset permanent dans un objet Stream au format XML. Il lit ensuite l'objet Stream sous la forme d'une chaîne que vous pouvez examiner, manipuler ou afficher.

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

Set rs = New ADODB.Recordset
Set stm = New ADODB.Stream

' Open, save, and close the recordset.
rs.Open "SELECT * FROM Customers", "Provider=sqloledb;" & _
        "Data Source=MyServer;Initial Catalog=Northwind;" & _
        "Integrated Security=SSPI;"""
rs.Save stm, adPersistXML
rs.Close
Set rs = nothing

' Put saved Recordset into a string variable.
strRst = stm.ReadText(adReadAll)

' Examine, manipulate, or display the XML data.
...

Scénario 3

Cet exemple de code ASP rend un Recordset permanent au format XML, directement dans l'objet Response.

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

' Create and open a Recordset.
Set rs = Server.CreateObject("ADODB.Recordset")
rs.Open "select * from Customers", "Provider=sqloledb;" & _
        "Data Source=MyServer;Initial Catalog=Northwind;" & _
        "Integrated Security=SSPI;"""

' Save Recordset directly into output stream.
rs.Save Response, adPersistXML

' Close Recordset.
rs.Close
Set rs = nothing
%>
...

Scénario 4

Dans ce scénario, le code ASP écrit le contenu de l'objet Recordset au format ADTG dans l'application cliente. Microsoft Cursor Service for OLE DB peut utiliser ces données pour créer un Recordset déconnecté.

Une nouvelle propriété de l'objet RDS DataControl, URL, pointe vers la page .asp qui génère l'objet Recordset. Autrement dit, il est possible d'obtenir un objet Recordset sans que RDS utilise l'objet DataFactory côté serveur et sans créer d'objet Business. Cette fonctionnalité simplifie considérablement le modèle de programmation RDS.

Code côté serveur, nommé http://server/directory/recordset.asp :

<%
Dim rs
Set rs = Server.CreateObject("ADODB.Recordset")
rs.Open "select au_fname, au_lname, phone from Authors", ""& _
        "Provider=sqloledb;Data Source=MyServer;" & _
        "Initial Catalog=Pubs;Integrated Security=SSPI;"
response.ContentType = "multipart/mixed"
rs.Save response, adPersistADTG
%>

Code côté client :

<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>

Les développeurs ont également la possibilité d'utiliser un objet Recordset sur le client.

...
function GetRs()
    {
    rs = CreateObject("ADODB.Recordset");
    rs.Open "http://server/directory/recordset.asp"
    DC1.SourceRecordset = rs;
    }
...

Voir aussi

Open, méthode (objet ADO Recordset) | Record, objet | Save, méthode


Utilisation d'ADO pour Internet Publishing

ADO 2.5

Utilisation de ADO pour la Internet Publishing

Le fournisseur OLE DB Provider for Internet Publishing illustre un exemple spécifique d'accès à des données hétérogènes avec ADO. Alors que les exemples de cette section sont spécifiques à l'utilisation du fournisseur Internet Publishing, les principes démontrés doivent être similaires lors de l'utilisation de ADO avec d'autres fournisseurs de données hétérogènes, par exemple un fournisseur d'emplacement de stockage de courrier électronique.

URL

Des URL (Uniform Resource Locators) peuvent être utilisées à la place des chaînes de connexion et des textes de commande pour spécifier les sources de données et l'emplacement de fichiers et de répertoires. Vous pouvez utiliser les URL avec les objets Connection et Recordset existants, ainsi qu'avec les objets Record et Stream.

Pour plus d'informations sur l'utilisation des URL, consultez URL absolues et relatives.

Champs d'enregistrements

Il existe une différence essentielle entre les données hétérogènes et les données homogènes. Dans le cas des données hétérogènes, chaque ligne de données ou Record peut posséder un ensemble différent de colonnes ou Fields. Dans le cas des données homogènes, chaque ligne possède le même ensemble de colonnes. Pour plus d'informations sur les champs spécifiques au fournisseur Internet Publishing, consultez Objets Record et champs ajoutés par le fournisseur.

Ajout de nouveaux champs

Plusieurs objets ADO ont été étendus pour fonctionner avec les objets Record et Stream.

  • La méthode Append de la collection Fields, qui crée et ajoute un objet Field à la collection, peut également spécifier la valeur de l'objet Field.
  • La méthode Update finalise l'ajout ou la suppression d'objets Field dans la collection.
  • Au lieu d'utiliser la méthode Append, vous pouvez créer des champs en affectant simplement une valeur à un champ non défini ou précédemment supprimé.

Record, objet | Stream, objet | Nouveautés dans ADO


OLE DB Provider pour Internet Publishing

Les objets ADO Record et Stream peuvent être utilisés avec Microsoft OLE DB Provider for Internet Publishing (fournisseur Internet Publishing) pour accéder à des ressources et les manipuler, notamment des dossiers Web ou des fichiers utilisés par Microsoft FrontPage. Avec ADO, vous avez la possibilité de spécifier une URL comme source d'un objet Record, Stream ou Recordset. Vous pouvez ensuite charger, télécharger, déplacer, copier et supprimer des ressources ou manipuler directement les propriétés de ces ressources.

Pour obtenir des exemples de code utilisant les objets Record et Stream avec le fournisseur Internet Publishing, consultez Scénario Internet Publishing.

Le fournisseur Internet Publishing est installé avec Microsoft Windows 2000. Des versions antérieures de ce fournisseur sont également disponibles via Microsoft Office 2000 et Microsoft Internet Explorer 5.0.

Il existe trois méthodes pour connecter ADO au fournisseur Internet Publishing :

  • Spécifier « URL= » dans la chaîne de connexion. Par exemple :
    objConn.Open "URL=http://servername"
  • Spécifier Msdaipp.dso comme mot clé Provider dans la chaîne de connexion. Par exemple :
    objConn.Open "provider=MSDAIPP.DSO;data source=http://servername"
  • Spécifier Msdaipp.dso comme propriété Provider de l'objet Connection. Par exemple :
    objConn.Provider = "MSDAIPP.DSO"
objConn.Open "http://servername"
Remarque If Msdaipp.dso est explicitement spécifié comme valeur du fournisseur, que ce soit avec le mot clé Provider de la chaîne de connexion ou avec la propriété Provider, vous ne pouvez pas utiliser « URL= » dans la chaîne de connexion ; cela provoquerait une erreur. Spécifiez plutôt l'URL comme indiqué plus haut.

Pour plus d'informations sur le fournisseur Internet Publishing, consultez Microsoft OLE DB Provider for Internet Publishing ou la documentation qui accompagne l'application source avec laquelle OLE DB Provider for Internet Publishing a été installé : Windows 2000, Office 2000 ou Internet Explorer 5.0.


Scénario Internet Publishing

Le code qui suit montre comment utiliser ADO avec le fournisseur Microsoft OLE DB Provider for Internet Publishing. Dans ce scénario, vous allez créer une application Visual Basic qui utilise des objets Recordset, Record et Stream pour afficher le contenu de ressources publiées à l'aide du fournisseur Internet Publishing.

Pour créer ce scénario, procédez comme suit :

  • Étape 1 : configurer le projet Visual Basic
  • Étape 2 : initialiser la zone de liste Main
  • Étape 3 : remplir la zone de liste Fields
  • Étape 4 : remplir la zone de texte Details

Voir aussi

Microsoft OLE DB Provider for Internet Publishing | Le fournisseur OLE DB pour la publication Internet


Étape 1 : configurer le projet Visual Basic

Ce scénario suppose que vous avez installé Microsoft Visual Basic 6.0 ou une version ultérieure, ADO 2.5 ou une version ultérieure, ainsi que le fournisseur Microsoft OLE DB Provider for Internet Publishing sur votre système.

Pour créer un projet ADO

  1. Dans Microsoft Visual Basic, créez un nouveau projet EXE standard.
  2. Dans le menu Projet, cliquez sur Références.
  3. Sélectionnez « Microsoft ActiveX Data Objects 2.5 Library » et cliquez sur OK.

Pour insérer des contrôles dans la feuille principale

  1. Ajoutez un contrôle ListBox à Form1. Affectez à sa propriété Name la valeur lstMain.
  2. Ajoutez un autre contrôle ListBox à Form1. Affectez à sa propriété Name la valeur lstDetails.
  3. Ajoutez un contrôle TextBox à Form1. Affectez à sa propriété Name la valeur txtDetails.

Étape 2 : initialiser la zone de liste Main


Étape 2 : initialiser la zone de liste Main

Pour déclarer des objets Record et Recordset globaux

  • Insérez le code suivant dans les sections (Général) - (Déclarations) de Form1 :
    Option Explicit
Dim grec As Record
Dim grs As Recordset

    Ce code déclare les références des objets globaux Record et Recordset qui seront utilisés dans la suite de ce scénario.

Pour vous connecter à une URL et remplir lstMain

  • Insérez le code suivant dans le gestionnaire d'événements Form Load pour Form1 :
    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

    Ce code instancie les objets globaux Record et Recordset. L'objet Record, grec, est ouvert avec une URL spécifiée comme ActiveConnection. Si cette URL existe, elle est ouverte ; dans le cas contraire, elle est créée. Vous devez remplacer « http://servername/foldername/ » par une URL valide dans votre environnement.

    L'objet Recordset, grs, est ouvert sur les enfants de l'objet Record, grec. lstMain est ensuite rempli avec les noms de fichiers des ressources publiées dans l'URL.

Étape 3 : remplir la zone de liste Fields


Étape 3 : remplir la zone de liste Fields

Pour remplir la zone de liste Fields :

Insérez le code suivant dans le gestionnaire d'événements Click de lstMain :

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

Ce code déclare et instancie des objets Record et Recordset locaux, respectivement rec et rs.

La ligne qui correspond à la ressource sélectionnée dans lstMain devient la ligne actuelle de grs. La zone de liste Details est ensuite vidée et rec est ouvert avec la ligne actuelle de grs comme source.

Si la ressource est un enregistrement de collection (indiqué par RecordType), l'objet Recordset local rs, est ouvert sur les enfants de rec. Ensuite, lstDetails est rempli avec les valeurs des lignes de rs.

Si la ressource est un enregistrement simple, recFields est appelée. Pour plus d'informations sur recFields, consultez l'étape suivante.

Aucun code n'est implémenté si la ressource est un document structuré.

Étape 4 : remplir la zone de texte Details


Étape 4 : remplir la zone de texte Details

Pour remplir la zone de texte Details

Créez une nouvelle sous-routine nommée recFields et insérez le code suivant :

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

Ce code remplit lstDetails avec les champs et les valeurs de l'enregistrement simple passés à recFields. Si la ressource est un fichier texte, un objet Stream de texte est ouvert à partir de l'enregistrement de ressource. Le code détermine si le jeu de caractères est ASCII et copie le contenu de l'objet Stream dans txtDetails.


URL absolues et relatives

Une URL spécifie l'emplacement d'une cible stockée sur un ordinateur local ou en réseau, par exemple un fichier, un répertoire, une page HTML, une image, un programme, etc . Dans cet exemple, une URL absolue est de la forme :

schéma://serveur/chemin/ressource

où :

schéma
Indique le mode d'accès à resource.
serveur
Spécifie le nom de l'ordinateur où se trouve resource.
chemin
Spécifie la séquence de répertoires jusqu'à la cible. Si resource est omis, la cible est le dernier répertoire spécifié dans path.
ressource
S'il est présent, resource est la cible et représente généralement un nom de fichier. Il peut s'agir d'un fichier simple contenant un seul flux binaire d'octets ou d'un document structuré contenant un ou plusieurs stockages et flux binaires d'octets.

Une URL absolue contient toutes les informations nécessaires à la localisation d'une ressource.

Une URL relative localise une ressource par rapport à une URL absolue utilisée comme point de départ. En effet, l'« URL complète » de la cible est obtenue en concaténant ses URL absolue et relative. Une URL relative se compose généralement des éléments path et éventuellement resource ; elle ne comprend ni scheme, ni server.

Inscription du modèle d'URL

Si un fournisseur prend en charge des URL, il est inscrit pour un ou plusieurs modèles d'URL. En d'autres termes, les URL qui utilisent ce modèle appellent automatiquement le fournisseur inscrit. Par exemple, le fournisseur Microsoft OLE DB Provider for Internet Publishing est inscrit pour le modèle http. ADO suppose que les URL précédées de « http » représentent des dossiers ou fichiers Web à utiliser avec le fournisseur Internet Publishing. Pour plus d'informations sur les modèles pour lesquels votre fournisseur est inscrit, consultez la documentation relative à ce dernier.

Définition de contexte à l'aide d'une URL

Une connexion ouverte (représentée par un objet Connection) a notamment pour fonction de restreindre les opérations à la source de données qu'elle représente. Autrement dit, la connexion définit le contexte des opérations à effectuer après son ouverture.

Dans ADO 2.5, une URL absolue peut également définir un contexte. Par exemple, lorsqu'un objet Record est ouvert à l'aide d'une URL absolue, un objet Connection est implicitement créé pour représenter la ressource spécifiée par l'URL.

Une URL absolue qui définit un contexte peut être spécifiée dans le paramètre ActiveConnection de la méthode Open de l'objet Record. Une URL absolue peut aussi être affectée comme valeur au nouveau mot clé « URL= » dans le paramètre ConnectionString de la méthode Open de l'objet Connection et dans le paramètre ActiveConnection de la méthode Open de l'objet Recordset.

Un contexte peut également être défini à l'aide d'un objet Record ou Recordset ouvert qui représente un répertoire ; en effet, ces objets contiennent déjà un objet Connection déclaré implicitement ou explicitement qui spécifie un contexte.

Étendue des opérations

Le contexte définit simultanément une étendue, c'est-à-dire le répertoire qui peut participer, avec ses sous-répertoires, aux opérations effectuées par la suite. L'objet Record possède plusieurs méthodes, notamment CopyRecord, MoveRecord et DeleteRecord, qui agissent sur un répertoire et tous ses sous-répertoires.

URL relatives utilisées comme texte de commande

La chaîne qui spécifie la commande à exécuter sur la source de données peut être spécifiée dans le paramètre CommandText de la méthode Execute de l'objet Connection et dans le paramètre Source de la méthode Open de l'objet Recordset.

Une URL relative peut également être spécifiée dans le paramètre CommandText ou Source. L'URL relative ne spécifie pas vraiment une commande (telle qu'une commande SQL) ; elle est simplement indiquée dans ces paramètres. Par ailleurs, le contexte de la connexion active doit être une URL absolue et le paramètre Option doit avoir la valeur adCmdTableDirect.

Par exemple, le code suivant ouvre un objet Recordset sur le fichier Readme25.txt du répertoire Winnt/system32 :

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

L'URL absolue indiquée dans la chaîne de connexion spécifie le serveur (YourServer) et le chemin d'accès (Winnt). Cette URL définit également le contexte.

L'URL relative indiquée dans le texte de commande utilise l'URL absolue comme point de départ et spécifie la fin du chemin d'accès (system32) et le fichier à ouvrir (Readme25.txt).

Le champ d'options (adCmdTableDirect) indique que le type de la commande est une URL relative.

Cet autre exemple de code ouvre un objet Recordset sur le contenu du répertoire Winnt :

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

Modèles d'URL proposés par les fournisseurs OLE DB

Le premier élément d'une URL complète est le modèle utilisé pour accéder à la ressource identifiée par le reste de l'URL. Les exemples les plus courants sont HTTP (HyperText Transfer Protocol) et FTP (File Transfer Protocol).

ADO prend en charge les fournisseurs OLE DB qui reconnaissent leurs propres modèles d'URL. Par exemple, le fournisseur Microsoft OLE DB Provider for Internet Publishing, qui accède aux fichiers Windows 2000 « publiés », reconnaît le modèle HTTP existant.

Connection, objet | Record, objet | Recordset, objet


Objets Record et champs ajoutés par le fournisseur

Lorsqu'un objet Record est ouvert, sa source peut être la ligne active d'un objet Recordset ouvert, une URL absolue ou une URL relative associée à un objet Connection ouvert.

Si Record est ouvert à partir de Recordset, la collection Fields de l'objet Record contiendra tous les champs de Recordset, ainsi que tous les champs ajoutés par le fournisseur sous-jacent.

Le fournisseur peut insérer d'autres champs en tant que caractéristiques supplémentaires de Record. Par conséquent, Record peut comporter des champs uniques qui sont absents de l'ensemble de Recordset ou d'un Record dérivé d'une autre ligne de Recordset.

Par exemple, toutes les lignes d'un Recordset dérivé d'une source de données représentée par des messages électroniques peuvent comporter des colonnes telles que De, À et Objet. Un Record dérivé de Recordset comportera les mêmes champs. Cependant, Record peut également comporter d'autres champs spécifiques au message particulier représenté par Record, par exemple Pièce jointe et Cc (copie carbone).

Bien que l'objet Record et la ligne active de Recordset possèdent les mêmes champs, ils sont différents car les objets Record et Recordset sont dotés de méthodes et propriétés distinctes.

Un champ commun à Record et Recordset peut être modifié sur chaque objet. Cependant, le champ ne peut pas être supprimé sur l'objet Record, bien que le fournisseur sous-jacent puisse prendre en charge l'affection de la valeur Null au champ en question.

Une fois Record ouvert, vous pouvez ajouter des champs par programme. Vous pouvez également supprimer des champs que vous avez ajoutés ; toutefois, vous ne pouvez pas supprimer les champs du Recordset d'origine.

Vous pouvez également ouvrir l'objet Record directement à partir d'une URL. Dans ce cas, les champs ajoutés à Record dépendent du fournisseur sous-jacent. Actuellement, la plupart des fournisseurs ajoutent un ensemble de champs qui décrivent l'entité représentée par Record. Si l'entité se compose d'un flux d'octets, par exemple un simple fichier, un objet Stream peut généralement être ouvert à partir de Record.

Champs spéciaux pour les fournisseurs de source de document

Une classe spéciale de fournisseurs, appelés fournisseurs de source de document, gère les dossiers et les documents. Lorsqu'un objet Record représente un document ou qu'un objet Recordset représente un dossier de documents, le fournisseur de source de document remplit ces objets à l'aide d'un ensemble unique de champs qui décrivent les caractéristiques du document au lieu du document proprement dit. En règle générale, un seul champ contient une référence au Stream qui représente le document.

Ces champs constituent un objet record ou recordset de ressource et sont répertoriés dans Annexe A : Fournisseurs, en ce qui concerne leur prise en charge par des fournisseurs spécifiques.

Deux constantes indexent la collection Fields d'une ressource Record ou Recordset pour extraire une paire de champs couramment utilisés. La propriété Value de l'objet Field renvoie le contenu désiré.

  • Le champ accessible via la constante adDefaultStream contient un flux par défaut associé à l'objet Record ou Recordset. Le fournisseur affecte un flux par défaut à un objet.
  • Le champ accessible via la constante adRecordURL contient l'URL absolue qui identifie le document.

Un fournisseur de source de document ne prend pas en charge la collection Properties des objets Record et Field. Le contenu de la collection Properties est une valeur Null pour de tels objets.

Un fournisseur de source de document peut ajouter une propriété spécifique au fournisseur, par exemple Datasource Type, afin d'identifier s'il s'agit d'un fournisseur de source de document. Pour plus d'informations sur le mode d'identification de votre type de fournisseur, consultez la documentation relative à ce dernier.

Colonnes d'objets Recordset de ressource

Un Recordset de ressource comprend les colonnes suivantes.

Nom de colonne | Type | Description
RESOURCE_PARSENAME | AdVarWChar | Lecture seule. Indique l'URL de la ressource.
RESOURCE_PARENTNAME | AdVarWChar | Lecture seule. Indique l'URL absolue de l'enregistrement parent.
RESOURCE_ABSOLUTEPARSENAME | AdVarWChar | Lecture seule. Indique l'URL absolue de la ressource, qui représente la concaténation de PARENTNAME et PARSENAME.
RESOURCE_ISHIDDEN | AdBoolean | Prend la valeur True si la ressource est masquée. Aucune ligne n'est renvoyée sauf si la commande qui crée explicitement l'ensemble de lignes sélectionne des lignes où RESOURCE_ISHIDDEN a la valeur True.
RESOURCE_ISREADONLY | AdBoolean | Prend la valeur True si la ressource est en lecture seule. Essaie d'ouvrir cette ressource avec DBBINDFLAG_WRITE et échoue avec DB_E_READONLY. Cette propriété peut être modifiée même lorsque la ressource n'est ouverte qu'en lecture.
RESOURCE_CONTENTTYPE | AdVarWChar | Indique l'utilisation probable du document, par exemple, le dossier d'un avocat. Cela peut correspondre au modèle Office utilisé pour créer le document.""
RESOURCE_CONTENTCLASS | AdVarWChar | Indique le type MIME du document ainsi que le format, par exemple « text/html ».'
RESOURCE_CONTENTLANGUAGE | AdVarWChar | Indique la langue dans laquelle le contenu est stocké.
RESOURCE_CREATIONTIME | adFileTime | Lecture seule. Indique une structure FILETIME qui contient l'heure de création de la ressource. L'heure est au format UTC (temps universel coordonné).
RESOURCE_LASTACCESSTIME | AdFileTime | Lecture seule. Indique une structure FILETIME qui contient l'heure du dernier accès à la ressource. L'heure est au format UTC. Les membres de FILETIME n'existent pas si le fournisseur ne prend pas en charge ce membre time.
RESOURCE_LASTWRITETIME | AdFileTime | Lecture seule. Indique une structure FILETIME qui contient l'heure de la dernière modification de la ressource. L'heure est au format UTC. Les membres de FILETIME n'existent pas si le fournisseur ne prend pas en charge ce membre time.
RESOURCE_STREAMSIZE | asUnsignedBigInt | Lecture seule. Indique la taille, en octets, du flux par défaut de la ressource.
RESOURCE_ISCOLLECTION | AdBoolean | Lecture seule. Prend la valeur True si la ressource est une collection, par exemple un répertoire. Prend la valeur False si la ressource est un simple fichier.
RESOURCE_ISSTRUCTUREDDOCUMENT | AdBoolean | Prend la valeur True si la ressource est un document structuré. Prend la valeur False si la ressource n'est pas un document structuré. Il peut s'agir d'une collection ou d'un simple fichier.
DEFAULT_DOCUMENT | AdVarWChar | Lecture seule. Indique que cette ressource contient une URL vers le document simple par défaut d'un dossier ou vers un document structuré. S'utilise lorsque le flux par défaut est demandé à partir d'une ressource. Cette propriété est vide pour un simple fichier.
CHAPTERED_CHILDREN | AdChapter | Lecture seule. Facultatif. Indique le chapitre de l'ensemble de lignes qui contient les enfants de la ressource. (Le fournisseur OLE DB Provider for Internet Publishing n'utilise pas cette colonne.)
RESOURCE_DISPLAYNAME | AdVarWChar | Lecture seule. Indique le nom complet de la ressource.
RESOURCE_ISROOT | AdBoolean | Lecture seule. Prend la valeur True si la ressource est la racine d'une collection ou d'un document structuré.

Record, objet | Annexe A : Fournisseurs


Section II : RDS (Remote Data Service)

Cette section contient les chapitres suivants :

  • Chapitre 11 : Notions fondamentales relatives à RDS
  • Chapitre 12 : Didacticiel RDS
  • Chapitre 13 : Utilisation et sécurité de RDS


Chapitre 11 : Notions fondamentales relatives à RDS

Cette section contient diverses rubriques que vous pouvez lire dans l'ordre dans lequel elles sont présentées. Les rubriques suivantes sont traitées :

  • Solutions pour l'accès aux données à distance
  • Modèle de base de programmation RDS
  • Modèle détaillé de programmation RDS
  • Modèle de programmation RDS avec objets
  • Résumé du modèle d'objet RDS

Cette section contient également le didacticiel RDS et un scénario RDS qui montrent comment accéder à une source de données et la mettre à jour, ainsi qu'une série de rubriques sur l'utilisation de RDS, qui traitent de sujets plus avancés sur RDS.

Voir aussi

Solutions pour l'accès aux données à distance | Didacticiel RDS | Utilisation de RDS


Solutions pour l'accès aux données à distance

Exposé du problème

ADO permet à votre application d'accéder directement (on parle parfois de système à deux niveaux) à des sources de données et de les modifier. Par exemple, si votre connexion atteint la source de données qui contient vos données, il s'agit d'une connexion directe dans un système à deux niveaux.

Toutefois, il se peut que vous vouliez accéder indirectement à des sources de données, en passant par un intermédiaire comme Microsoft® Internet Information Services (IIS). Ce mécanisme est parfois appelé un système à trois niveaux. IIS est un système client/serveur qui constitue un moyen efficace, pour une application locale (client), d'invoquer un programme distant (serveur) à travers Internet ou un intranet. Le programme serveur obtient l'accès à la source de données et traite éventuellement les données acquises.

Par exemple, la page Web de votre intranet contient une application écrite en Microsoft® Visual Basic Scripting Edition (VBScript) qui se connecte à IIS. À son tour, IIS se connecte à la source de données réelle, extrait les données, les traite éventuellement, puis renvoie les informations traitées à votre application.

Dans ce scénario, votre application ne se connecte jamais directement à la source de données, IIS si. IIS accède aux données grâce à ADO.

Remarque Il n'est pas nécessaire que l'application client/serveur se trouve sur Internet ou sur un intranet (Web) ; elle peut se composer uniquement de programmes installés dans un réseau local. Le cas le plus répandu est toutefois celui d'une application Web.

Dans la mesure où un contrôle visuel (grille, case à cocher, liste, etc.) risque d'utiliser les informations renvoyées, celles-ci doivent être facilement utilisables par un contrôle visuel.

Il vous faut une interface de programmation d'applications (API) simple et efficace qui prend en charge les systèmes à trois niveaux et qui renvoie les informations aussi facilement que dans un système à deux niveaux. Cette interface s'appelle RDS (Remote Data Service).

Solution

RDS définit un modèle de programmation (séquence d'activités nécessaires pour obtenir l'accès à une source de données et la mettre à jour) pour accéder aux données par le biais d'un intermédiaire tel que IIS (Internet Information Services). Le modèle de programmation résume toutes les fonctionnalités fournies par RDS.

Voir aussi

Modèle de base de programmation RDS | Didacticiel RDS | Utilisation de RDS


Modèle de base de programmation RDS

RDS requiert des applications se trouvant dans l'environnement suivant : une application cliente spécifie un programme qui fonctionne sur un serveur et les paramètres requis pour renvoyer les informations recherchées. Le programme appelé sur le serveur accède à la source de données spécifiée, extrait les informations, traite les données (facultatif), puis renvoie les informations recueillies à votre application cliente sous une forme facilement exploitable. RDS vous permet d'effectuer les opérations suivantes :

  • Spécifier le programme à appeler sur le serveur et obtenir un moyen de s'y référer depuis le client. (Cette référence est parfois appelée un proxy. Le proxy représente le programme serveur distant. L'application cliente va « appeler » le proxy comme s'il s'agissait d'un programme local, mais elle appelle en fait le programme serveur distant.)
  • Appeler le programme serveur. Transmettre au programme serveur des paramètres qui identifient la source de données et la commande à émettre. (Le programme serveur utilise ADO pour obtenir l'accès à la source de données. ADO établit une connexion avec un des paramètres donnés, puis lance la commande spécifiée dans l'autre paramètre).
  • Le programme serveur obtient un objet Recordset provenant de la source de données. L'objet Recordset est éventuellement traité sur le serveur.
  • Le programme serveur renvoie l'objet Recordset final à l'application cliente.
  • Sur le client, l'objet Recordset est stocké sous une forme pouvant être facilement utilisée par des contrôles visuels.
  • Toutes les modifications apportées à l'objet Recordset sont renvoyées au programme serveur qui les utilise pour mettre à jour la source de données.

Ce modèle de programmation comporte certaines fonctions pratiques. Si vous n'avez pas besoin d'un programme serveur complexe pour accéder à la source de données et si vous établissez la connexion requise et fournissez les paramètres de commande, RDS extrait les données spécifiées à l'aide d'un programme serveur simple par défaut.

Si vous souhaitez procéder à un traitement plus complexe, vous pouvez désigner votre programme serveur personnalisé. Par exemple, puisqu'un programme serveur personnalisé peut disposer de toutes les fonctions d'ADO, il peut se connecter à diverses sources de données, combiner leurs données selon une méthode complexe, puis renvoyer un résultat de traitement simple à l'application cliente.

Enfin, si vous souhaitez adopter une solution intermédiaire, ADO permet désormais de personnaliser le comportement du programme serveur par défaut.

Voir aussi

Modèle détaillé de programmation RDS | Didacticiel RDS | Recordset, objet | Utilisation de RDS


Modèle détaillé de programmation RDS

Le modèle de programmation RDS intègre les éléments clés suivants :

  • RDS.DataSpace
  • RDSServer.DataFactory
  • RDS.DataControl
  • Événements

RDS.DataSpace

Votre application cliente doit spécifier le serveur et le programme serveur à appeler. En retour, votre application reçoit une référence au programme serveur et peut traiter celle-ci comme s'il s'agissait du programme serveur lui-même.

Le modèle d'objets RDS représente cette fonctionnalité avec l'objet RDS.DataSpace.

Le programme serveur est spécifié avec un identificateur de programme ou ProgID. Le serveur fait appel au ProgID et au registre du serveur pour localiser des informations concernant le programme à lancer.

RDS distingue en interne si le programme serveur se trouve sur un serveur distant sur Internet ou un intranet, sur un serveur de réseau local ou sur une bibliothèque de liaison dynamique (DLL) plutôt que sur un serveur. Cette distinction permet de déterminer la méthode d'échange des données entre le client et le serveur, dont dépend le type de référence renvoyé à votre application cliente. Toutefois, en ce qui vous concerne, cette différence a peu d'importance. Ce qui importe, c'est que vous receviez une référence de programme exploitable.

RDSServer.DataFactory

RDS fournit un programme serveur par défaut qui peut exécuter une requête SQL sur la source de données et renvoyer un objet Recordset, ou utiliser un objet Recordset et mettre à jour la source de données.

Le modèle d'objets RDS représente cette fonctionnalité avec l'objet RDSServer.DataFactory.

De plus, cet objet intègre une méthode permettant de créer un objet Recordset vide que vous pouvez remplir par programmation (CreateRecordset) et une autre méthode permettant de convertir un objet Recordset en chaîne de texte afin de créer une page Web (ConvertToString).

Avec ADO, vous pouvez ignorer le comportement standard des connexions et des commandes et déterminer le comportement de RDSServer.DataFactory avec un gestionnaire DataFactory et un fichier de personnalisation qui contient des paramètres relatifs à la connexion, aux commandes et à la sécurité.

Le programme serveur est parfois appelé objet Business. Vous pouvez écrire votre propre objet Business personnalisé, capable d'assurer un accès compliqué aux données, des contrôles de validité, etc. Même si vous écrivez un objet Business personnalisé, vous pouvez créer une instance d'objet RDSServer.DataFactory et utiliser certaines de ses méthodes pour accomplir vos propres tâches.

RDS.DataControl

RDS permet de combiner la fonctionnalité de RDS.DataSpace et RDSServer.DataFactory et facilite l'utilisation par les contrôles visuels de l'objet Recordset renvoyé depuis une source de données par une requête. RDS s'efforce, la plupart du temps, d'accéder automatiquement aux informations stockées sur un serveur et de les afficher dans un contrôle visuel.

Le modèle d'objets RDS représente cette fonctionnalité avec l'objet RDS.DataControl.

L'objet RDS.DataControl présente deux aspects. Le premier concerne la source de données. Si vous définissez les informations de commande et de connexion via les propriétés Connect et SQL de RDS.DataControl, RDS.DataSpace est automatiquement utilisé pour créer une référence à l'objet RDSServer.DataFactory par défaut. RDSServer.DataFactory utilise ensuite la valeur de la propriété Connect pour se connecter à la source de données, il utilise également la valeur de la propriété SQL pour obtenir un Recordset à partir de la source de données et renvoie l'objet Recordset à RDS.DataControl.

Le second aspect concerne l'affichage dans un contrôle visuel des informations de l'objet Recordset renvoyé. Vous pouvez associer un contrôle visuel à l'objet RDS.DataControl (par un processus appelé liaison) et accéder aux informations de l'objet Recordset associé en affichant les résultats de la requête sur une page Web ou dans Microsoft® Internet Explorer. Chaque objet RDS.DataControl lie un objet Recordset, qui représente les résultats d'une seule requête, à un ou plusieurs contrôles visuels (par exemple, une zone de texte, une zone de liste modifiable, un contrôle Grid, etc.). Il peut y avoir plusieurs objets RDS.DataControl sur chaque page. Chaque objet RDS.DataControl peut être connecté à une source de données différente et contenir les résultats d'une requête distincte.

L'objet RDS.DataControl intègre également ses propres méthodes pour explorer, trier et filtrer les lignes de l'objet Recordset associé. Ces méthodes ressemblent à celles de l'objet ADO Recordset, mais elles sont en réalité différentes.

Événements

RDS prend en charge deux de ses propres événements qui sont indépendants du modèle d'événements ADO. L'événement onReadyStateChange est appelé dès que la propriété ReadyState de l'objet RDS.DataControl change, vous indiquant ainsi qu'une opération asynchrone a abouti, s'est interrompue ou a rencontré une erreur. L'événement onError est appelé dès qu'une erreur se produit, et ceci même au cours d'une opération asynchrone.

Remarque L'environnement Microsoft Internet Explorer fournit deux événements supplémentaires à RDS : onDataSetChanged (Recordset est fonctionnel mais extrait encore des lignes) et onDataSetComplete (Recordset a terminé l'extraction de lignes).

Voir aussi

Modèle de programmation RDS avec objets | DataControl, objet (RDS) | DataFactory, objet (RDSServer) | DataSpace, objet (RDS) | Didacticiel RDS | Utilisation de RDS


Modèle de programmation RDS avec objets

L'objectif de RDS est d'accéder à des sources de données et de les mettre à jour par le biais d'un intermédiaire comme IIS. Le modèle de programmation spécifie la séquence des activités nécessaires à cet effet. Le modèle d'objets spécifie les objets dont les méthodes et les propriétés affectent le modèle de programmation.

RDS permet d'exécuter la séquence d'actions suivante :

  • Spécifier le programme à appeler sur le serveur et obtenir un moyen de s'y référer depuis le client. (RDS.DataSpace)
  • Appeler le programme serveur. Transmettre au programme serveur des paramètres qui identifient la source de données et la commande à émettre. (proxy ou RDS.DataControl)
  • Le programme serveur obtient de la source de données un objet Recordset, généralement via ADO. L'objet Recordset est éventuellement traité sur le serveur (RDSServer.DataFactory).
  • Le programme serveur renvoie l'objet Recordset final à l'application cliente (proxy).
  • Sur le client, l'objet Recordset est converti sous une forme qui peut être facilement utilisée par des contrôles visuels. (contrôle visuel et RDS.DataControl).
  • Les modifications apportées à l'objet Recordset sont renvoyées au serveur et utilisées pour mettre à jour la source de données (RDS.DataControl ou RDSServer.DataFactory).

Voir aussi

Résumé du modèle d'objet RDS | DataControl, objet (RDS) | DataFactory, objet (RDSServer) | DataSpace, objet (RDS) | Didacticiel RDS | Recordset, objet | Utilisation de RDS


Résumé du modèle d'objets RDS

Objet | Description
RDS.DataSpace | Cet objet contient une méthode pour obtenir un serveur proxy. Ce proxy peut être le programme serveur par défaut ou un programme serveur personnalisé (objet Business). Le programme serveur peut être appelé sur Internet, un intranet ou un réseau local, mais il peut également s'agir d'une bibliothèque de liaison dynamique locale.
RDSServer.DataFactory | Cet objet représente le programme serveur par défaut. Il exécute le mécanisme RDS par défaut d'extraction et de mise à jour de données.
RDS.DataControl | Cet objet peut appeler automatiquement les objets RDS.DataSpace et RDSServer.DataFactory. Utilisez-le pour appeler le mécanisme RDS par défaut d'extraction ou de mise à jour des données. Cet objet fournit également le moyen, pour les contrôles visuels, d'accéder à l'objet Recordset renvoyé.

Voir aussi

Notions fondamentales relatives à RDS | Didacticiel RDS | Utilisation de RDS


Configuration système requise pour l'application Carnet d'adresses

L'installation de l'application exemple Carnet d'adresses exige la configuration suivante au niveau logiciel et base de données :

Configuration logicielle requise

Pour exécuter cette application Web, la configuration logicielle requise côté serveur comprend :

  • Microsoft Windows NT® Server 4.0, avec Service Pack 3 ou version ultérieure, ou Microsoft Windows® 2000 Server.
  • Microsoft Internet Information Services (IIS) version 3.0 ou ultérieure, avec les pages ASP (Active Server Pages).

Pour exécuter cette application Web, la configuration logicielle requise côté ordinateur client comprend :

  • Microsoft Internet Explorer version 4.0 ou ultérieure.
  • Microsoft Windows NT 4.0 Workstation ou Server, Windows 2000 ou Microsoft Windows 98.

Configuration requise pour la base de données

L'utilisation de cette application exemple exige :

  • Un serveur de base de données Microsoft® SQL Server version 6.5 ou ultérieure opérationnel.
  • Les droits permettant de créer la base de données et d'y charger les données de l'exemple.
  • Enterprise Manager ou les utilitaires ISQL (appelés Analyseur de requêtes dans SQL Server 7.0) pour vérifier le chargement correct des données.

Si vous ne possédez pas les autorisations requises, votre administrateur de base de données peut configurer le système et vous donner accès à la base de données, ou configurer la base de données à votre place.

Voir aussi

DataControl, objet (RDS) | Exécution de l'application exemple Carnet d'adresses


Exécution de l'application exemple Carnet d'adresses

Pour exécuter l'application Carnet d'adresses, suivez cette procédure.

Pour exécuter cette application

  1. Vérifiez que Microsoft SQL Server est en cours d'exécution. Cliquez sur Démarrer, pointez sur Programmes, sur Microsoft SQL Server 7.0, puis cliquez sur Gestionnaire de services. Si le cercle blanc contient une flèche verte, SQL Server est en cours d'exécution. Sinon (le cercle blanc contient alors un carré rouge), cliquez sur Démarrer/Continuer.
  2. Dans Microsoft Internet Explorer version 4.0 ou ultérieure, tapez l'adresse suivante :

    http://ServeurWeb/RDS/AddressBook/AddrBook.asp

    où ServeurWeb désigne le nom du serveur Web sur lequel les composants du serveur RDS sont installés.

  3. Vous pouvez alors essayer divers scénarios dans l'application exemple Carnet d'adresses, comme rechercher une personne à partir de son adresse de messagerie, obtenir la liste de toutes les personnes occupant la fonction « Program Manager » ou modifier certains enregistrements. Cliquez sur Rechercher pour visualiser le résultat de la recherche dans la grille de données.

Voir aussi

Objet de liaison de données de l'application Carnet d'adresses


Objet de liaison de données de l'application Carnet d'adresses

L'application Carnet d'adresses utilise l'objet RDS.DataControl pour lier les données de la base de données SQL Server à un objet visuel (dans le cas présent, une table DHTML) dans la page HTML du client de l'application. La logique événementielle du programme VBScript utilise RDS.DataControl pour :

  • interroger la base de données, envoyer des mises à jour à la base de données et actualiser la grille des données ;
  • permettre aux utilisateurs de se déplacer d'un enregistrement à un autre (premier, dernier, suivant ou précédent) dans la grille de données.

Le code suivant définit le composant RDS.DataControl :

<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;Integrated Security=SSPI;">
</OBJECT>

La balise OBJECT définit le composant RDS.DataControl dans le programme. Cette balise comprend deux types de paramètres :

  • les paramètres associés à la balise OBJECT générique ;
  • les paramètres spécifiques à l'objet RDS.DataControl.

Paramètres de la balise OBJECT générique

Le tableau suivant décrit les paramètres associés à la balise OBJECT.

Paramètre | Description
CLASSID | Valeur unique de 128 bits identifiant le type d'objet incorporé au système. Cet identificateur est stocké dans le Registre système de l'ordinateur local. (Pour connaître les ID de classe de l'objet RDS.DataControl, consultez RDS.DataControl, objet.)
ID | Identifie l'objet incorporé de manière unique dans tout le document.

Paramètres spécifiques à l'objet RDS.DataControl

Le tableau suivant décrit les paramètres spécifiques à l'objet RDS.DataControl. (Pour obtenir la liste complète des paramètres de l'objet RDS.DataControl et savoir à quel moment les implémenter, consultez RDS.DataControl, objet.)

Paramètre | Description
SERVER | Si vous utilisez HTTP, la valeur correspond au nom du serveur précédé de http://.
CONNECT | Fournit les informations de connexion nécessaires pour permettre à RDS.DataControl de se connecter à SQL Server.
SQL | Définit ou renvoie la chaîne de requête utilisée pour extraire Recordset.

Boutons de commande de l'application Carnet d'adresses


Boutons de commande de l'application Carnet d'adresses

L'application Carnet d'adresses comporte les boutons de commande suivants :

  • un bouton Find pour soumettre une requête à la base de données ;
  • un bouton Clear pour effacer le contenu des zones de texte avant de lancer une nouvelle recherche ;
  • un bouton Update Profile pour enregistrer les modifications apportées à l'enregistrement d'un employé ;
  • un bouton Cancel Changes pour annuler les modifications.

Bouton Find

Un clic sur le bouton Find active la procédure Sub Find_OnClick de VBScript, qui crée et envoie la requête SQL. Lorsque vous cliquez sur ce bouton, la grille de données se remplit.

Création de la requête SQL

La première partie de la procédure Sub Find_OnClick crée la requête SQL, une expression à la fois, par ajout de chaînes de texte à une instruction SQL SELECT globale. La variable myQuery est d'abord affectée à une instruction SQL SELECT qui demande l'extraction de toutes les lignes de données de la table de source de données. La procédure Sub analyse ensuite le contenu des quatre zones de texte de la page.

Comme le programme utilise l'opérateur like dans la construction des instructions SQL, SQL effectue des recherches de sous-chaînes, plutôt que des correspondances exactes.

Par exemple, si la zone Last Name contient l'entrée « Berge » et si la zone Title contient l'entrée « Program Manager », l'instruction SQL (valeur de myQuery) résultante s'affiche comme suit :

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

Si la requête aboutit, toutes les personnes dont le nom inclut la chaîne « Berge » (comme Berge et Berger) et dont la fonction contient les mots « Program Manager » (par exemple, Program Manager, Advanced Technologies) sont affichées dans la grille de données HTML.

Préparation et envoi de la requête

La dernière partie de la procédure Sub Find_OnClick comporte deux instructions. La première instruction affecte à la propriété SQL de l'objet RDS.DataControl l'équivalent de la requête SQL créée de façon dynamique. La seconde instruction oblige l'objet RDS.DataControl (DC1) à interroger la base de données et à afficher les nouveaux résultats de la requête dans la grille.

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

Bouton Update Profile

Un clic sur le bouton Update Profile active la procédure VBScript Update_OnClick Sub, qui exécute les méthodes SubmitChanges et Refresh de l'objet RDS.DataControl (DC1).

Sub Update_OnClick
   DC1.SubmitChanges
   DC1.Refresh
End Sub

Lorsque DC1.SubmitChanges s'exécute, RDS (Remote Data Service) regroupe toutes les informations de mise à jour et les envoie au serveur via HTTP. La mise à jour est annulée dans sa totalité si une des opérations échoue ; ainsi, si une partie de la mise à jour n'aboutit pas, aucune modification n'a lieu et un message d'état est renvoyé. Avec RDS (Remote Data Service), DC1.Refresh n'est pas nécessaire après SubmitChanges, mais cela garantit l'actualisation des données.

Bouton Cancel Changes

Un clic sur le bouton Cancel Changes active la procédure Sub Cancel_OnClick de VBScript, qui exécute la méthode CancelUpdate de l'objet RDS.DataControl (DC1).

Sub Cancel_OnClick
   DC1.CancelUpdate
End Sub

L'exécution de DC1.CancelUpdate annule toute modification apportée par l'utilisateur à l'enregistrement d'un employé dans la grille de données depuis la dernière requête ou mise à jour. Les valeurs d'origine sont restaurées.

Voir aussi

Boutons de navigation de l'application Carnet d'adresses | DataControl, objet (RDS)


Boutons de navigation de l'application Carnet d'adresses

Les boutons de navigation de l'application Carnet d'adresses apparaissent au bas de la page Web. Ces boutons permettent de se déplacer entre la première et dernière ligne de données de la grille HTML aussi bien que sur les lignes adjacentes à la sélection en cours.

Procédures Sub de navigation

L'application Carnet d'adresses contient plusieurs procédures permettant aux utilisateurs de cliquer sur les boutons First, Next, Previous et Last pour se déplacer entre les données.

Par exemple, un clic sur le bouton First active la procédure Sub First_OnClick de VBScript. Cette procédure exécute une méthode MoveFirst, laquelle sélectionne la première ligne de données. Un clic sur le bouton Last active la procédure Sub Last_OnClick, qui appelle la méthode MoveLast, laquelle sélectionne la dernière ligne de données. Le principe de fonctionnement des autres boutons de navigation est le même.

' Move to the first record in the bound Recordset.
Sub First_OnClick
   DC1.Recordset.MoveFirst
End Sub

' Move to the next record from the current position
' in the bound Recordset.
Sub Next_OnClick
   If Not DC1.Recordset.EOF Then    ' Cannot move beyond bottom record.
      DC1.Recordset.MoveNext
      Exit Sub
   End If
End Sub

' Move to the previous record from the current position in the bound
' Recordset.
Sub Prev_OnClick
   If Not DC1.Recordset.BOF Then    ' Cannot move beyond top record.
      DC1.Recordset.MovePrevious
      Exit Sub
   End If
End Sub

' Move to the last record in the bound Recordset.
Sub Last_OnClick
   DC1.Recordset.MoveLast
End Sub

Voir aussi

DataControl, objet (RDS) | MoveFirst, MoveLast, MoveNext et MovePrevious, méthodes (RDS)


Chapitre 12 : Didacticiel RDS

Ce didacticiel explique comment utiliser le modèle de programmation RDS pour exécuter des requêtes et des mises à jour sur une source de données. Il commence par décrire les étapes nécessaires à l'accomplissement de ces tâches. Ensuite, ce didacticiel est repris en Microsoft® Visual Basic Scripting Edition et en Microsoft® Visual J++® doté de ADO pour Windows Foundation Classes (ADO/WFC).

Ce didacticiel est codé en différents langages pour deux raisons :

  • La documentation relative à RDS suppose que le lecteur code en Visual Basic. La documentation est adaptée aux programmeurs Visual Basic, ce qui la rend moins pratique pour ceux qui utilisent d'autres langages.
  • Si vous avez un doute concernant une fonctionnalité spécifique de RDS et si vous avez quelques notions d'un autre langage, vous obtiendrez éventuellement une réponse en recherchant la même fonctionnalité dans l'autre langage.

Structure du didacticiel

Ce didacticiel est basé sur le modèle de programmation RDS. Il présente chaque étape du modèle de programmation. En outre, les étapes sont illustrées par un fragment de code en Visual Basic.

L'exemple de code est repris dans les autres langages et brièvement commenté. Chaque étape d'un didacticiel dédié à un langage de programmation est située par rapport à l'étape qui lui correspond dans le modèle de programmation et le didacticiel descriptif. Utilisez le numéro de l'étape pour vous reporter à la discussion proposée dans le didacticiel descriptif.

Le modèle de programmation RDS est présenté ci-dessous. Utilisez-le comme référence tout au long de ce didacticiel.

Modèle de programmation RDS avec objets

  • Spécifier le programme à appeler sur le serveur et prévoir un moyen (proxy) d'y faire référence depuis le client.
  • Appeler le programme serveur. Transmettre des paramètres au programme serveur qui identifie la source de données et la commande à émettre.
  • Le programme serveur obtient de la source de données un objet Recordset, généralement via ADO. L'objet Recordset est éventuellement traité sur le serveur.
  • Le programme serveur renvoie l'objet Recordset final à l'application cliente.
  • Sur le client, l'objet Recordset est éventuellement stocké sous une forme pouvant être facilement utilisée par des contrôles visuels.
  • Les modifications apportées à l'objet Recordset sont renvoyées au serveur et utilisées pour mettre à jour la source de données.

Voir aussi

Étape 1 : spécifier un programme serveur (didacticiel RDS) | Didacticiel RDS (VBScript) | Didacticiel RDS (Visual J++)


Étape 1 : spécifier un programme serveur (didacticiel RDS)

Dans la majorité des cas, utilisez la méthode CreateObject de l'objet RDS.DataSpace pour indiquer le programme serveur par défaut, RDSServer.DataFactory, ou votre propre programme serveur personnalisé (objet Business). Un programme serveur est instancié sur le serveur et la référence au programme serveur, ou proxy, est renvoyée.

Ce didacticiel utilise le programme serveur par défaut :

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

Voir aussi

Étape 2 : appeler le programme serveur (didacticiel RDS) | Didacticiel RDS (VBScript) | Didacticiel RDS (Visual J++)


Étape 2 : appeler le programme serveur (didacticiel RDS)

Lorsque vous appelez une méthode sur le proxy du client, le programme résidant réellement sur le serveur exécute cette méthode. Cette étape consistera à exécuter une requête sur le serveur.

Partie A Si vous n'avez pas commencé à utiliser l'objet RDSServer.DataFactory dans ce didacticiel, il vous sera plus facile d'effectuer cette étape à l'aide de l'objet RDS.DataControl. RDS.DataControl combine l'étape précédente de création du proxy à celle-ci qui permet d'émettre la requête.

Définissez la propriété Server de l'objet RDS.DataControl de manière à indiquer où le programme serveur doit être initialisé ; définissez la propriété Connect pour préciser la chaîne de connexion permettant d'accéder à la source de données, ainsi que la propriété SQL pour indiquer le texte de commande de la requête. Appelez ensuite la méthode Refresh pour que le programme serveur se connecte à la source de données, récupère les lignes spécifiées dans la requête et renvoie un objet Recordset au client.

Ce didacticiel n'utilise pas l'objet RDS.DataControl, mais le code correspondant se présenterait comme suit :

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

Ce didacticiel n'appelle pas non plus RDS avec des objets ADO, mais pour information, le code correspondant se présenterait comme suit :

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

Partie B La manière la plus courante d'exécuter cette étape consiste à appeler la méthode Query de l'objet RDSServer.DataFactory. Cette méthode prend comme arguments une chaîne de connexion qui permet la connexion à une source de données et un texte de commande qui spécifie les lignes à renvoyer à partir de la source de données.

Ce didacticiel utilise la méthode Query de l'objet DataFactory :

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")
...

Voir aussi

Étape 3 : le serveur obtient un Recordset (didacticiel RDS) | Didacticiel RDS (VBScript) | Didacticiel RDS (Visual J++)


Étape 3 : le serveur obtient un Recordset (didacticiel RDS)

Le programme serveur utilise la chaîne de connexion et le texte de commande pour extraire de la source de données les lignes demandées. ADO sert généralement à récupérer ce Recordset, mais d'autres interfaces Microsoft d'accès aux données, comme OLE DB, peuvent également être utilisées

Un programme serveur personnalisé peut se présenter comme suit :

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

Voir aussi

Étape 4 : le serveur renvoie le Recordset (didacticiel RDS) | Didacticiel RDS (VBScript) | Didacticiel RDS (Visual J++)


Étape 4 : le serveur renvoie le Recordset (didacticiel RDS)

RDS convertit l'objet Recordset extrait de la source de données sous une forme qui puisse être renvoyée au client (c'est-à-dire qu'il procède au marshaling de Recordset). La forme exacte de la conversion et le mode de renvoi varient selon que le serveur est sur Internet, un intranet, un réseau local ou qu'il s'agit d'une bibliothèque de liaison dynamique. Mais ce détail n'a pas une importance capitale ; l'important est que RDS renvoie Recordset au client.

Côté client, un objet Recordset est renvoyé et affecté à une variable locale.

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")
...

Voir aussi

Étape 5 : DataControl est accessible (didacticiel RDS) | Didacticiel RDS (VBScript) | Didacticiel RDS (Visual J++)


Étape 5 : DataControl est accessible (didacticiel RDS)

L'objet Recordset renvoyé peut être utilisé. Vous pouvez le consulter, le parcourir ou le modifier comme tout autre objet Recordset. Les opérations que vous pouvez effectuer avec Recordset dépendent de votre environnement. Microsoft Visual Basic et Visual C++ offrent des contrôles visuels capables d'utiliser Recordset soit directement, soit indirectement en utilisant un contrôle de données d'activation.

Par exemple, si vous affichez une page Web dans Microsoft Internet Explorer, il se peut que vous vouliez afficher les données de l'objet Recordset dans un contrôle visuel. Les contrôles visuels d'une page Web ne peuvent pas accéder directement à un objet Recordset. Ils peuvent cependant accéder à l'objet Recordset via RDS.DataControl. RDS.DataControl devient utilisable par un contrôle visuel lorsque sa propriété SourceRecordset a pour valeur l'objet Recordset.

Le paramètre DATASRC de l'objet de contrôle visuel doit être égal à RDS.DataControl et sa propriété DATAFLD doit avoir pour valeur un champ (colonne) d'un objet Recordset.

Dans ce didacticiel, la valeur de la propriété SourceRecordset est à définir.

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 controls can now bind to DC.
...

Voir aussi

Étape 6 : les modifications sont envoyées au serveur (didacticiel RDS) | Didacticiel RDS (VBScript) | Didacticiel RDS (Visual J++)


Étape 6 : les modifications sont envoyées au serveur (didacticiel RDS)

Si l'objet Recordset est modifié, les changements (c'est-à-dire les lignes ajoutées, modifiées ou supprimées) peuvent être renvoyés au serveur.

Remarque Le comportement par défaut de RDS peut être appelé implicitement à l'aide des objets ADO et du fournisseur Microsoft OLE DB Remoting Provider. Les requêtes peuvent renvoyer des objets Recordset et les objets Recordset modifiés peuvent servir à la mise à jour de la source de données. Ce didacticiel n'appelle pas RDS avec des objets ADO, mais si c'était le cas, le code se présenterait comme suit :
Dim rs as New ADODB.Recordset
rs.Open "SELECT * FROM Authors","Provider=MS Remote;Data Source=Pubs;" & _
        "Remote Server=http://yourServer;Remote Provider=SQLOLEDB;"
...              ' Edit the Recordset.
rs.UpdateBatch   ' The equivalent of SubmitChanges.
...

Partie A Supposons pour cet exemple que vous n'avez utilisé que RDS.DataControl et qu'un objet Recordset est maintenant associé à RDS.DataControl. La méthode SubmitChanges met à jour la source de données à partir des modifications apportées à l'objet Recordset si les propriétés Server et Connect sont toujours définies.

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
   ' Edit the Recordset.
...
DC.SubmitChanges
...

Partie B Vous pouvez également mettre à jour le serveur avec l'objet RDSServer.DataFactory en indiquant une connexion et un objet Recordset.

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 controls can now bind to DC.
    ' Edit the Recordset.
blnStatus = DF.SubmitChanges "DSN=Pubs", RS
End Sub

Fin du didacticiel.

Voir aussi

Microsoft OLE DB Remoting Provider | Didacticiel RDS | Didacticiel RDS (VBScript) | Didacticiel RDS (Visual J++)


Didacticiel RDS (VBScript)

Ceci est le code du didacticiel RDS écrit en Microsoft Visual Basic Scripting Edition. Pour obtenir une description de la finalité de ce didacticiel, consultez Didacticiel RDS.

Dans ce didacticiel, RDS.DataControl et RDS.DataSpace sont créés au moment du design, ce qui signifie qu'ils sont définis avec des balises d'objets de la forme : <OBJECT>...</OBJECT>. Ils pourraient également être créés au moment de l'exécution à l'aide de la méthode Server.CreateObject. Par exemple, l'objet RDS.DataControl pourrait être créé comme suit :

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

Étape 1—Spécifier un programme serveur

VBScript peut déterminer le nom du serveur Web IIS sur lequel il s'exécute grâce à la méthode VBScript Request.ServerVariables accessible aux pages ASP (Active Server Pages) :

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

Cependant, ce didacticiel fait appel au serveur imaginaire, « yourServer ».

Remarque Faites attention au type de données des arguments ByRef. VBScript ne vous permet pas de préciser le type de la variable, de sorte que vous devez toujours passer un Variant. Lorsque vous utilisez le protocole HTTP, RDS vous permet de passer un Variant à une méthode qui attend un non-Variant si vous l'appelez avec la méthode CreateObject de l'objet RDS.DataSpace. Si vous utilisez DCOM ou un serveur in-process, faites correspondre les types des paramètres côté client et côté serveur, faute de quoi vous recevrez une erreur indiquant des types incompatibles.
Set DF1 = DS1.CreateObject("RDSServer.DataFactory", "http://yourServer")

Étape 2a—Appeler le programme serveur avec RDS.DataControl

Cet exemple sert uniquement à montrer que par défaut, l'objet RDS.DataControl exécute la requête spécifiée.

<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
...

Étape 2b—Appeler le programme serveur avec RDSServer.DataFactory

Étape 3—Le serveur obtient un Recordset

Étape 4—Le serveur renvoie le Recordset

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

Étape 5—DataControl peut être utilisé par des contrôles visuels

' Assign the returned recordset to the DataControl.

DC1.SourceRecordset = RS

Étape 6a—Les modifications sont envoyées au serveur avec RDS.DataControl

Cet exemple illustre la mise à jour opérée par RDS.DataControl.

<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
' Edit the Recordset object...
' The SERVER and CONNECT properties are already set from Step 2A.
Set DC1.SourceRecordset = RS
...
DC1.SubmitChanges

Étape 6b—Les modifications sont envoyées au serveur avec RDSServer.DataFactory

DF.SubmitChanges "DSN=Pubs", RS

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

Fin du didacticiel.

Voir aussi

Didacticiel RDS | Didacticiel RDS (Visual J++)


Didacticiel RDS (Visual J++)

ADO/WFC ne suit pas totalement le modèle de l'objet RDS car il n'implémente pas l'objet RDS.DataControl. ADO/WFC implémente uniquement la classe côté client RDS.DataSpace.

La classe DataSpace implémente une méthode, CreateObject, qui renvoie un objet ObjectProxy. La classe DataSpace implémente aussi la propriété InternetTimeout.

La classe ObjectProxy implémente une méthode, call, qui peut appeler n'importe quel objet Business côté serveur.

Début du didacticiel.

import com.ms.wfc.data.*;
public class RDSTutorial
{
   public void tutorial()
   {
// Step 1: Specify a server program.
      ObjectProxy obj =
         DataSpace.createObject(
            "RDSServer.DataFactory",
            "http://YourServer");

// Step 2: Server returns a Recordset.
      Recordset rs = (Recordset) obj.call(
            "Query",
            new Object[] {"DSN=Pubs;", "SELECT * FROM Authors"});

// Step 3: Changes are sent to the server.
      ...                        // Edit Recordset.
      obj.call(
            "SubmitChanges",
            new Object[] {"DSN=Pubs;", rs});
      return;
   }
}

Fin du didacticiel.

Voir aussi

Didacticiel RDS | Didacticiel RDS (VBScript)


Chapitre 13 : Utilisation et sécurité de RDS

Les informations fournies dans ce chapitre vous permettent d'installer votre serveur et d'utiliser RDS rapidement. Ce chapitre comprend des procédures de configuration spécifiques que vous devrez peut-être exécuter lors de l'implémentation de RDS ; il décrit également certaines relations clés entre RDS et d'autres technologies, et vous permet d'identifier les solutions aux problèmes que vous pouvez rencontrer lors de l'installation d'une solution RDS.

Cette section traite des sujets suivants :

  • Configuration de RDS
  • Utilisation de technologies connexes avec RDS
  • Personnalisation de DataFactory
  • Résolution des problèmes liés à RDS

Notions fondamentales relatives à RDS | Didacticiel RDS


Configuration de RDS

Pour implémenter efficacement RDS, familiarisez-vous d'abord avec les différentes configurations disponibles. Cette section contient d'importantes informations relatives à la sécurité et à l'évolutivité dans l'implémentation de RDS. Pour plus d'informations sur la configuration des ordinateurs avant l'utilisation de RDS, consultez les rubriques suivantes :

  • Affectation de privilèges Invité sur un serveur Web
  • Inscription d'un objet Business personnalisé
  • Marquage des objets Business sécurisés pour les scripts
  • Inscription d'objets Business côté client pour une utilisation avec DCOM
  • Définition du format de marshaling de flux DCOM
  • Activation de l'exécution d'une DLL sur DCOM
  • Configuration de serveurs virtuels sur IIS
  • Spécification du nombre de threads par processeur sur IIS
  • Sécurisation des applications RDS
  • Configuration de DataFactory pour les modes sécurisé ou sans restriction

Voir aussi

Utilisation de technologies connexes avec RDS | Personnalisation de DataFactory | Résolution des problèmes liés à RDS


Affectation de privilèges Invité sur un serveur Web ; privilèges d'invité RDS [ADO]

RDS 2.5

Affectation de privilèges Invité sur un serveur Web

Pour utiliser RDS, vous devez ajouter le compte anonyme de serveur Web (IUSR_NomOrdinateur) au groupe local Invités sur le serveur Web.

Pour affecter des privilèges Invité sur un serveur Web

  1. Sur votre ordinateur Microsoft Windows® 2000 Server, cliquez sur Démarrer, pointez sur Programmes, Outils d'administration, puis cliquez sur Gestion de l'ordinateur.
  2. Dans l'arborescence de la console, accédez à Utilisateurs et groupes locaux, puis cliquez sur Groupes.
  3. Sélectionnez le groupe local Invités. Dans le menu Action, choisissez Propriétés.
  4. Dans la boîte de dialogue Propriétés de Invités, cliquez sur Ajouter.
  5. Si le compte anonyme de serveur Web n'apparaît pas dans la liste de la boîte de dialogue Sélectionnez Utilisateurs ou Groupes, tapez son nom (IUSR_NomOrdinateur) dans la zone vide du bas, puis cliquez sur Ajouter.
  6. Cliquez sur OK.


Inscription d'un objet Business personnalisé

Pour exécuter correctement un objet Business (.dll ou .exe) personnalisé via le serveur Web, le ProgID de l'objet Business doit être entré dans le Registre, comme expliqué dans la présente procédure. Cette fonction RDS garantit la sécurité de votre serveur Web en exécutant seulement les exécutables spécifiés.

Remarque Pour MDAC 2.0 et les versions ultérieures, l'objet Business par défaut, RDSServer.DataFactory, n'est pas inscrit par défaut lors de l'installation de MDAC. Cependant, si RDSServer.DataFactory a été inscrit en tant qu'objet pouvant être exécuté en toute sécurité sur l'ordinateur avant l'installation, l'entrée de Registre est conservée pour la nouvelle installation.

Pour inscrire un objet Business personnalisé

  1. Cliquez sur Démarrer, puis sur Exécuter.
  2. Tapez RegEdit, puis cliquez sur OK.
  3. Dans l'Éditeur du Registre, accédez à la clé de Registre HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\W3SVC\Parameters\ADCLaunch.
  4. Sélectionnez la clé ADCLaunch, puis dans le menu Edition, pointez sur Nouveau et cliquez sur Clé.
  5. Tapez le ProgID de votre objet Business personnalisé, puis appuyez sur Entrée. Laissez l'entrée Valeur vide.


Marquage des objets Business sécurisés pour les scripts

Pour contribuer à la sécurisation de l'environnement Internet, vous devez marquer tous les objets Business instanciés à l'aide de la méthode CreateObject de l'objet RDS.DataSpace comme étant « sécurisés pour les scripts ». Vous devez vous assurer qu'ils sont marqués en tant que tels dans la zone de licence du Registre système avant toute utilisation dans DCOM.

Pour désigner manuellement l'objet Business comme étant sécurisé pour l'écriture de scripts, créez un fichier texte doté de l'extension .reg et contenant le texte ci-après. Les deux entrées numériques qui suivent activent la fonctionnalité de traitement sécurisé des scripts :

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

où <MyActiveXGUID> est le nombre GUID hexadécimal de votre objet Business. Enregistrez-le avant de le fusionner dans votre Registre à l'aide de l'Éditeur du Registre ou en double-cliquant sur le fichier .reg dans l'Explorateur Windows.

Les objets Business créés dans Microsoft® Visual Basic peuvent être automatiquement marqués comme étant « sécurisés pour les scripts » à l'aide de l'Assistant Empaquetage et déploiement. Lorsque cet Assistant vous demande de définir les paramètres de sécurité, sélectionnez Sécurisé pour l'initialisation et Sécurisé pour le script.

Pour finir, l'Assistant Installation crée un fichier .htm et un fichier .cab. Copiez ces deux fichiers sur l'ordinateur de destination et double-cliquez sur le fichier .htm pour charger la page et inscrire correctement le serveur.

L'objet Business étant installé par défaut dans le répertoire Windows\System32\Occache, déplacez-le vers le répertoire Windows\System32 et modifiez la clé de Registre HKEY_CLASSES_ROOT\CLSID\<MyActiveXGUID>\InprocServer32 pour correspondre au chemin approprié.

Remarque Les objets Business désignés comme sécurisés pour les scripts ou sécurisés pour l'initialisation peuvent être instanciés et initialisés par n'importe quelle personne sur le réseau. Les objets Business personnalisés ne doivent pas être désignés et implémentés au hasard. Il est impératif que ces objets n'offrent pas de failles de sécurité que des pirates pourraient exploiter pour accéder à la zone critique du serveur hôte et lui infliger des dommages.


Inscription d'objets Business côté client pour une utilisation avec DCOM

Les objets Business personnalisés doivent faire en sorte que le côté client puisse mapper leur nom de programme (ProgId) vers un identificateur (CLSID) utilisable sur DCOM. Le ProgID de l'objet DCOM doit donc figurer dans le Registre côté client et correspondre à l'ID de classe de l'objet Business côté serveur. Pour les autres protocoles pris en charge (HTTP, HTTPS et in-process), cela n'est pas nécessaire.

Si, par exemple, vous exposez un objet Business côté serveur appelé MyBObj avec un ID de classe spécifique, par exemple « {00112233-4455-6677-8899-00AABBCCDDEE} », veillez à ajouter les entrées suivantes dans le Registre côté client :

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


Définition du format de marshaling de flux DCOM

Un ordinateur client utilisant des composants RDS version 1.5 ou antérieure n'est pas compatible avec un serveur utilisant des composants RDS version 2.0 ou ultérieure. Lorsque vous utilisez DCOM comme protocole sous-jacent, la prise en charge de RDS version 2.0 ou ultérieure est plus performante pour le transport d'objets Recordset. Si votre client exécute des composants RDS version 1.5 ou antérieure, vous pouvez configurer votre serveur pour la prise en charge de la version précédente de RDS (RDS 1.0) ou de la dernière version RDS disponible (RDS version 2.0 ou ultérieure). Définissez l'une des deux entrées suivantes dans le Registre :

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

- ou -

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


Activation de l'exécution d'une DLL sur DCOM

Les étapes suivantes expliquent comment permettre à une .dll d'objet Business d'utiliser à la fois DCOM et Microsoft® Internet Information Services (HTTP) via les services de composants.

  1. Créez un package vide dans le composant logiciel enfichable MMC des services de composants.

    Vous allez utiliser le composant logiciel enfichable MMC des services de composants pour créer un package et y ajouter la DLL. Ce fichier .dll devient ainsi accessible via DCOM, mais il ne l'est plus par les services IIS. (Si vous recherchez le fichier .dll dans le Registre, vous constatez que la clé Inproc est désormais vide ; la définition de l'attribut Activation, décrit plus loin dans cette rubrique, ajoute une valeur à la clé Inproc.)

  2. Installez un objet Business dans le package.

    - ou -

    Importez l'objet RDSServer.DataFactory dans ce package.

  3. Affectez à l'attribut Activation du package l'option Dans le processus du créateur (application bibliothèque).

    Pour rendre le fichier .dll accessible via DCOM et les services IIS sur le même ordinateur, vous devez définir l'attribut Activation du composant dans le composant logiciel enfichable MMC des services de composants. Une fois l'option Dans le processus du créateur affectée à l'attribut, vous remarquez qu'une clé de serveur Inproc est ajoutée dans le Registre et qu'elle pointe vers un fichier .dll de remplacement des services de composants.

Pour plus d'informations sur les services de composants (ou Microsoft® Transaction Service, si vous utilisez Windows NT) et sur l'exécution de ces procédures, consultez la documentation relative aux services de composants (en anglais) ou visitez le site Web (en anglais) de Transaction Server à l'adresse suivante : http://www.microsoft.com/com/tech/mts.asp.


Configuration de serveurs virtuels sur IIS

Lors de la création de serveurs virtuels dans Internet Information Services 4.0, l'exécution des deux procédures supplémentaires suivantes est indispensable pour configurer le serveur virtuel afin qu'il fonctionne avec RDS :

  1. Lors de la configuration du serveur, activez l'option Autoriser l'accès Exécuter.
  2. Déplacez msadcs.dll vers vroot\msadc, où vroot représente le répertoire de base de votre serveur virtuel.

Notions fondamentales relatives à RDS


Spécification du nombre de threads par processeur sur IIS

Lorsque vous utilisez RDS avec Internet Information Services version 4.0 ou ultérieure, vous pouvez déterminer le nombre de threads créés par processeur en manipulant le Registre sur le serveur Web. Le nombre de threads par processeur peut influer sur les performances en cas de forte activité, ou en cas de faible activité avec des requêtes volumineuses. L'utilisateur est invité à effectuer divers essais pour rechercher les meilleurs résultats.

La méthode utilisée pour déterminer et modifier la valeur par défaut de ce paramétrage dépend de la configuration du serveur IIS 4.0.

Avec MDAC version 2.1.2.4202.3 (GA) ou ultérieure installée sur le serveur IIS, RDS utilise le même nombre maximal de threads des services de composants (ou de Microsoft Transaction Services, si vous utilisez Windows NT) que les scripts ASP. La valeur par défaut du nombre de threads par processeur est égale à 10. Pour la modifier, ajoutez la clé suivante au Registre du serveur :

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

où MaxPoolThreads est un REG_DWORD. La valeur MaxPoolThreads n'apparaît dans le Registre que si elle est spécifiquement ajoutée. La plage des valeurs admises est comprise entre 5 et 20 (maximum recommandé). Si la valeur définie par la clé du Registre est supérieure à la valeur de la clé PoolThreadLimit (qui figure sur le même chemin), c'est cette dernière qui doit être utilisée.

Autrement, si MDAC version 2.1 2.1.1.3711.11 (GA) ou antérieure est installée sur le serveur IIS, la valeur par défaut du nombre de threads par processeur est de 6. Pour la modifier, ajoutez la clé suivante au Registre sur le serveur IIS :

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

où ADCThreads est un REG_DWORD. La valeur ADCThreads n'apparaît dans le Registre que si elle est spécifiquement ajoutée. La plage des valeurs admises est comprise entre 1 et 50. Si la valeur spécifiée par la clé du Registre est supérieure à 50, la valeur maximale (50) est alors utilisée.

Notions fondamentales relatives à RDS


Sécurisation des applications RDS

Problèmes de sécurité de Microsoft Internet Explorer

Compte tenu des dernières améliorations apportées à Microsoft® Internet Explorer au niveau de la sécurité, certains objets ADO et RDS ne peuvent être exécutés que dans un environnement en mode « sécurisé ». Il est nécessaire que vous soyez averti de ces problèmes, tels que les différentes zones, les niveaux de sécurité, le comportement restrictif, les opérations non sécurisées, ainsi que les paramètres de sécurité personnalisés.

Pour plus d'informations sur ces questions, consultez les informations sur les problèmes de sécurité liés à ADO et RDS dans Microsoft Internet Explorer, dans les articles techniques consacrés à ActiveX Data Objects (ADO) .

Sécurité du serveur Web

Si vous utilisez l'objet RDSServer.DataFactory sur votre serveur Web Internet, souvenez-vous que l'utilisation de celui-ci engendre un risque potentiel pour la sécurité. Les utilisateurs externes qui obtiennent des informations valides concernant la source de données (DSN, Data Source Name), l'ID d'utilisateur et le mot de passe peuvent écrire des pages entières pour envoyer une requête à cette source de données. Si vous souhaitez que l'accès à une source de données soit soumis à des restrictions précises, une des solutions possibles consiste à annuler l'inscription de l'objet RDSServer.DataFactory (msadcf.dll) et à supprimer celui-ci, puis à utiliser à sa place des objets Business personnalisés avec des requêtes codées en dur.

Pour plus d'informations sur les conséquences de l'utilisation de l'objet RDSServer.Datafactory sur la sécurité, consultez le bulletin de sécurité Microsoft MS99-025 sur le site Web Microsoft Security (en anglais) à l'adresse suivante : http://www.microsoft.com/security/default.asp.

Emprunt d'identité du client et sécurité

Si la propriété Authentification du mot de passe de votre serveur Web IIS correspond à la méthode d'authentification par stimulation/réponse de Windows NT (Windows NT 4.0) ou à la méthode d'authentification intégrée de Windows (Windows 2000), les objets Business sont alors appelés dans le cadre du contexte de sécurité du client. Il s'agit d'une nouvelle fonctionnalité de RDS 1.5 qui autorise l'emprunt d'identité du client sur HTTP. Lorsque vous recourez à ce mode, la connexion au serveur Web (IIS) n'est pas anonyme mais utilise l'ID d'utilisateur et le mot de passe indiqués sur l'ordinateur client. Si les sources de données (DSN) ODBC sont configurées pour utiliser une connexion approuvée, l'accès à des bases de données, telles que SQL Server, s'effectue également dans le cadre du contexte de sécurité du client. Néanmoins, ce type de procédure n'est possible que dans le cas où la base de données se trouve sur le même ordinateur que les services IIS ; en effet, il est impossible à l'heure actuelle de transmettre les références du client à un autre ordinateur.

Prenons l'exemple suivant : un client, Bernard Guyot, dont l'ID d'utilisateur est « BernardG » et le mot de passe « secret », a ouvert une session sur un ordinateur client. Il exécute une application utilisant un navigateur qui doit accéder à l'objet RDSServer.DataFactory pour créer un objet Recordset en exécutant une requête SQL sur l'ordinateur « MonServeur », lequel exécute les services IIS. MonServeur, un système exécutant Windows NT Server 4.0, est configuré pour utiliser l'option d'authentification par stimulation/réponse de Windows NT, l'option « Utiliser la connexion approuvée » est sélectionnée pour la source de données ODBC et le serveur comprend également la source de données SQL Server. Lorsque le serveur Web reçoit une demande, il interroge le client pour obtenir son ID d'utilisateur et son mot de passe. Ainsi, la demande est enregistrée sur MonServeur comme émanant de « BernardG »/« Secret » plutôt que de IUSER_MonServeur (utilisé par défaut lorsque le mode d'authentification par mot de passe anonyme est sélectionné). De la même façon, lors d'une connexion à SQL Server, c'est « BernardG »/« Secret » qui est utilisé.

Par conséquent, le mode d'authentification par stimulation/réponse de Windows NT utilisé par les services IIS autorise la création de pages HTML sans que l'utilisateur soit explicitement invité à entrer l'ID d'utilisateur et le mot de passe nécessaires pour une ouverture de session sur la base de données. En revanche, ce serait le cas si vous aviez recours à l'authentification de base IIS.

Authentification par mot de passe

RDS peut communiquer avec un serveur Web IIS utilisant l'un des trois modes d'authentification par mot de passe suivants : Anonyme, de base ou stimulation/réponse de NT (mode d'authentification intégré de Windows dans Windows 2000). Ces paramètres définissent le type de contrôle qu'exerce un serveur Web sur son accès, par exemple en exigeant qu'un ordinateur client dispose de privilèges d'accès explicites sur le serveur Web NT.


Configuration de DataFactory pour les modes sécurisé ou sans restriction

Par défaut, ADO est installé avec une configuration RDSServer.DataFactory « sécurisée ». Le mode sécurisé des composants du serveur RDS Server exige la configuration suivante :

  1. RDSServer.DataFactory exige l'utilisation d'un gestionnaire (ceci est rendu obligatoire par le paramétrage d'une clé du Registre).
  2. Le gestionnaire par défaut, msdfmap.handler, est inscrit, présent dans la liste des gestionnaires sécurisés et désigné comme gestionnaire par défaut.
  3. Le fichier Msdfmap.ini est placé dans le répertoire Windows. Vous devez configurer ce fichier en fonction de vos besoins, avant d'utiliser le service RDS en mode à trois niveaux.

Vous pouvez, le cas échéant, configurer une installation de DataFactory sans limite. DataFactory peut être utilisé directement sans le gestionnaire personnalisé. Les utilisateurs peuvent toujours recourir à un gestionnaire personnalisé en modifiant les chaînes de connexion, mais ce n'est pas une obligation. Pour plus d'informations sur les conséquences de l'utilisation de l'objet RDSServer.DataFactory, consultez Sécurisation des applications RDS.

Le fichier de Registre handsafe.reg est fourni pour la définition des entrées du Registre du gestionnaire en vue d'une configuration sécurisée. Pour une exécution en mode sécurisé, exécutez handsafe.reg. Le fichier de Registre handunsf.reg est fourni pour la définition des entrées du Registre du gestionnaire permettant une configuration sans restriction. Pour une exécution en mode sans restriction, exécutez handunsf.reg.

Après avoir exécuté handsafe.reg ou handunsf.reg, vous devez arrêter puis redémarrer le service de publication World Wide Web sur le serveur Web en tapant les commandes suivantes dans une fenêtre de commande : « NET STOP W3SVC » et « NET START W3SVC ».

Pour plus d'informations sur l'utilisation de la fonctionnalité du gestionnaire de personnalisation de RDS, consultez l'article technique « Using the Customization Handler Feature in RDS 2.1 » (en anglais)

Voir aussi

Personnalisation de DataFactory | Notions fondamentales relatives à RDS


Utilisation de technologies connexes avec RDS

Cette section contient des informations spécifiques sur l'utilisation de RDS avec des aspects des technologies suivantes :

  • Regroupement de connexions ODBC
  • Services de composants Microsoft

De nombreuses autres technologies entrent en interaction avec le service RDS ou interviennent au niveau de son implémentation.

Services IIS (Internet Information Services) Pour plus d'informations sur les services IIS (Microsoft Internet Information Services) ou les pages ASP (Active Server Pages), consultez le site Web des Services IIS (en anglais) à l'adresse suivante : http://www.microsoft.com/ntserver/web/exec/feature/Datasheet.asp

Services de composants Microsoft Pour plus d'informations sur les services de composants (connus sous le nom de Microsoft Transaction Server dans Windows NT), consultez la page Web consacrée à Windows à l'adresse suivante : http://www.microsoft.com/France/windows/default.asp. Pour plus d'informations sur Microsoft Transaction Server, visitez le site Web de MTS (en anglais) à l'adresse suivante : http://www.microsoft.com/com/tech/mts.asp.

Microsoft SQL Server Pour plus d'informations sur Microsoft® SQL Server, consultez le site Web de SQL Server à l'adresse suivante : http://www.microsoft.com/france/sql/.

Microsoft Internet Explorer Pour plus d'informations sur Microsoft Internet Explorer, consultez la page Web consacrée à Internet Explorer à l'adresse suivante : http://www.microsoft.com/france/internet/produits/ie/, ainsi que la page consacrée à MSDN Online Web Workshop (en anglais) à l'adresse suivante : http://msdn.microsoft.com/workshop/default.asp.

Microsoft Windows NT Server/Windows 2000 Server Pour plus d'informations sur la sécurité dans Microsoft Windows NT Server ou Windows 2000 Server, consultez la page Web consacrée à Windows à l'adresse suivante : http://www.microsoft.com/France/windows/default.asp.

Notions fondamentales relatives à RDS


Utilisation de RDS avec la fonction de regroupement de connexions ODBC

Si vous avez recours à une source de données ODBC, vous pouvez utiliser l'option de regroupement de connexions dans Internet Information Services (IIS) qui permet de gérer de façon optimale la charge du client. Il s'agit d'un gestionnaire de ressources pour les connexions, qui maintient à l'état ouvert les connexions fréquemment utilisées.

Pour activer le regroupement de connexions, consultez la documentation relative à IIS (Internet Information Services).

L'activation du regroupement de connexions peut soumettre le serveur Web à certaines restrictions, ainsi qu'il est décrit dans la documentation de Microsoft Internet Information Services.

Pour garantir un regroupement de connexions stable et optimiser les performances, vous devez configurer Microsoft SQL Server de sorte qu'il utilise la bibliothèque réseau des sockets TCP/IP.

Pour ce faire, vous devez :

  • configurer l'ordinateur SQL Server pour l'utilisation des sockets TCP/IP ;
  • configurer le serveur Web pour l'utilisation des sockets TCP/IP.

Configuration de l'ordinateur SQL Server pour l'utilisation des sockets TCP/IP

Sur l'ordinateur SQL Server, exécutez le programme d'installation pour que les interactions avec la source des données utilisent la bibliothèque réseau des sockets TCP/IP.

Pour spécifier la bibliothèque réseau des sockets TCP/IP sur l'ordinateur SQL Server

Dans Microsoft SQL Server 6.5 :

  1. Dans le menu Démarrer, pointez sur Programmes, sur Microsoft SQL Server 6.5, puis cliquez sur Installation de SQL Server.
  2. Cliquez deux fois sur Continuer.
  3. Dans la boîte de dialogue Microsoft SQL Server—Options, sélectionnez Modifier le support réseau, puis cliquez sur Continuer.
  4. Vérifiez que la case à cocher Sockets TCP/IP est activée, puis cliquez sur OK.
  5. Cliquez sur Continuer pour terminer et quitter le programme d'installation.

Dans Microsoft SQL Server 7.0 :

  1. Dans le menu Démarrer, pointez sur Programmes, sur Microsoft SQL Server 7.0, puis cliquez sur Utilitaire Réseau Serveur.
  2. Sous l'onglet Général de la boîte de dialogue, cliquez sur Ajouter.
  3. Dans la boîte de dialogue Ajouter une configuration de bibliothèque réseau, cliquez sur TCP/IP.
  4. Dans les zones Numéro de port et Adresse proxy, entrez les valeurs correspondantes fournies par votre administrateur réseau.
  5. Cliquez sur OK pour terminer et quitter le programme d'installation.

Configuration du serveur Web pour l'utilisation de sockets TCP/IP

Pour configurer le serveur Web avec les sockets TCP/IP, deux procédures sont possibles. Le choix varie selon que le serveur Web doit permettre l'accès à tous les ordinateurs SQL Server ou à un seul ordinateur SQL Server spécifique.

Afin de pouvoir accéder à tous les serveurs SQL Server à partir du serveur Web, vous devez exécuter l'utilitaire de configuration du client SQL Server sur le serveur Web. Les étapes décrites ci-dessous permettent de changer la bibliothèque réseau définie par défaut pour toutes les connexions SQL Server effectuées à partir de ce serveur Web IIS afin que la bibliothèque réseau des sockets TCP/IP soit désormais utilisée.

Pour configurer le serveur Web (tous les serveurs SQL Server)

Dans Microsoft SQL Server 6.5 :

  1. Dans le menu Démarrer, pointez sur Programmes, sur Microsoft SQL Server 6.5, puis cliquez sur Utilitaire de configuration de client SQL Server.
  2. Cliquez sur l'onglet Net-Library.
  3. Dans la zone Réseau par défaut, sélectionnez Sockets TCP/IP.
  4. Cliquez sur Terminé pour enregistrer les modifications et quitter l'utilitaire.

Dans Microsoft SQL Server 7.0 :

  1. Dans le menu Démarrer, pointez sur Programmes, sur Microsoft SQL Server 7.0, puis cliquez sur Utilitaire Réseau Client.
  2. Cliquez sur l'onglet Général.
  3. Dans la zone Bibliothèque réseau par défaut, cliquez sur TCP/IP.
  4. Cliquez sur OK pour enregistrer les modifications et quitter l'utilitaire.

Dans le cas d'un accès à un serveur SQL spécifique à partir du serveur Web, vous devez exécuter l'utilitaire de configuration client de SQL Server sur le serveur Web. Pour modifier la bibliothèque réseau en vue d'une connexion à un serveur SQL spécifique, configurez le logiciel client SQL Server sur le serveur Web comme indiqué ci-dessous.

Pour configurer le serveur Web (un serveur SQL Server spécifique)

Dans Microsoft SQL Server 6.5 :

  1. Dans le menu Démarrer, pointez sur Programmes, sur Microsoft SQL Server 6.5, puis cliquez sur Utilitaire de configuration de client SQL Server.
  2. Cliquez sur l'onglet Avancé.
  3. Dans la zone Serveur, tapez le nom du serveur auquel se connecter à l'aide de Sockets TCP/IP.
  4. Dans la zone Nom de la DLL, sélectionnez Sockets TCP/IP.
  5. Cliquez sur Ajouter/Modifier. Toutes les sources de données pointant vers ce serveur utilisent désormais les sockets TCP/IP.
  6. Cliquez sur Terminé.

Dans Microsoft SQL Server 7.0 :

  1. Dans le menu Démarrer, pointez sur Programmes, sur Microsoft SQL Server 7.0, puis cliquez sur Utilitaire de configuration de client SQL Server.
  2. Cliquez sur l'onglet Général.
  3. Cliquez sur Ajouter.
  4. Entrez l'alias du serveur dans la zone Alias du serveur. Dans la zone Bibliothèques réseau, cliquez sur TCP/IP. Dans la zone Nom de l'ordinateur, entrez le nom de l'ordinateur à l'écoute des clients des sockets TCP/IP. Dans la zone Numéro de port, entrez le numéro de port sur lequel le serveur SQL Server est à l'écoute.
  5. Cliquez une première fois sur OK, puis une deuxième fois pour quitter l'utilitaire.

Notions fondamentales relatives à RDS


Exécution d'objets Business dans les services de composants

Les objets Business peuvent être des fichiers exécutables (.exe) ou des bibliothèques de liaison dynamique (.dll). La configuration utilisée pour l'exécution d'un objet Business varie selon que l'objet est un fichier .dll ou .exe :

  • Les objets Business créés sous forme de fichiers .exe peuvent être appelés via DCOM. Si ces objets Business sont utilisés via les services IIS (Internet Information Services), ils sont soumis à un marshaling supplémentaire des données, ce qui ralentit les performances du client.
  • Les objets Business créés sous forme de fichiers .dll peuvent être utilisés via les services IIS (et par conséquent le protocole HTTP). Ils peuvent également être utilisés sur DCOM mais uniquement via les services de composants (ou Microsoft Transaction Server, si vous utilisez Windows NT). Les DLL d'objet Business doivent être inscrites sur le serveur IIS pour vous permettre d'y accéder via les services IIS. (Pour plus d'informations sur les étapes de configuration d'une DLL sur DCOM, consultez la section, « Activation de l'exécution d'une DLL sur DCOM ».)
Remarque Lorsque les objets Business du niveau intermédiaire sont implémentés en tant qu'éléments des services de composants (via GetObjectContext, SetComplete et SetAbort), ils peuvent utiliser les objets de contexte des services de composants (ou MTS, sur Windows NT) pour conserver leur état au fil des multiples appels clients. Ce scénario est possible avec DCOM, qui est généralement implémenté entre des clients et serveurs de confiance (un intranet). Dans ce cas, l'objet RDS.DataSpace et la méthode CreateObject côté client sont remplacés par l'objet de contexte de transaction et la méthode CreateInstance (fournie par l'interface ITransactionContext), implémentés par les services de composants.

Notions fondamentales relatives à RDS


Personnalisation de DataFactory

Remote Data Service (RDS) permet d'accéder aisément à des données sur un système client/serveur à trois niveaux. Un contrôle de données client spécifie des paramètres de connexion et de chaîne de commande pour exécuter une requête sur une source de données distante ou des paramètres de chaîne de connexion et d'objet Recordset pour effectuer une mise à jour.

Ces paramètres sont transmis à un programme serveur qui se charge de l'accès aux données sur la source de données distante. RDS fournit un programme serveur par défaut appelé objet RDSServer.DataFactory. L'objet RDSServer.DataFactory renvoie au client les objets Recordset produits par une requête.

Toutefois, les fonctions de l'objet RDSServer.DataFactory sont limitées aux requêtes et aux mises à jour. Ce dernier ne peut procéder à aucune validation ou traitement sur les chaînes de connexion ou de commande.

ADO vous permet de spécifier que l'objet DataFactory fonctionne avec un autre type de programme serveur appelé un gestionnaire. Le gestionnaire peut modifier les chaînes de connexion et de commande clientes avant qu'elles n'accèdent à la source de données. De plus, le gestionnaire peut imposer des droits d'accès qui déterminent les droits d'accès en lecture et en écriture du client dans la source de données.

Les paramètres utilisés par le gestionnaire pour modifier les paramètres clients et les droits d'accès sont spécifiés dans des sections d'un fichier de personnalisation.

Pour plus d'informations sur la personnalisation de l'objet DataFactory, reportez-vous aux rubriques suivantes :

  • Description du fichier de personnalisation
  • Section connect du fichier de personnalisation
  • Section sql du fichier de personnalisation
  • Section userlist du fichier de personnalisation
  • Section logs du fichier de personnalisation
  • Paramètres clients requis
  • Création de votre gestionnaire personnalisé


Description du fichier de personnalisation

Chaque en-tête de section du fichier de personnalisation comporte des crochets ([]) contenant un type et un paramètre. Les quatre types de sections sont identifiés par les chaînes littérales connect, sql, userlist ou logs. Le paramètre est la chaîne littérale, la valeur par défaut, un identificateur spécifié par l'utilisateur ou rien.

Ainsi, chaque section est identifiée par un des en-têtes de section suivants :

[ connect   default      ]
[ connect   identifier   ]
[ sql       default      ]
[ sql       identifier   ]
[ userlist  identifier   ]
[ logs                   ]

Les en-têtes de section comportent les éléments ci-dessous.

Élément | Description
connect | Chaîne littérale qui modifie une chaîne de connexion.
sql | Chaîne littérale qui modifie une chaîne de commande.
userlist | Chaîne littérale qui modifie les droits d'accès d'un utilisateur particulier.
logs | Chaîne littérale qui spécifie un fichier journal enregistrant les erreurs de fonctionnement.
default | Chaîne littérale qui est utilisée si aucun identificateur n'est spécifié ou trouvé.
identifier Chaîne qui correspond à une chaîne de la chaîne connect ou command.
  • Utilisez cette section si l'en-tête de section contient connect et que la chaîne d'identification figure dans la chaîne de connexion.
  • Utilisez cette section si l'en-tête de section contient sql et que la chaîne d'identification figure dans la chaîne de commande.
  • Utilisez cette section si l'en-tête de section contient userlist et que la chaîne d'identification correspond à un identificateur de section connect.

L'objet DataFactory appelle le gestionnaire en transmettant les paramètres clients. Le gestionnaire recherche dans les paramètres clients des chaînes entières correspondant aux identificateurs des en-têtes de section appropriés. Si une correspondance est établie, le contenu de cette section est appliqué au paramètre client.

Une section spécifique est utilisée dans les cas suivants :

  • Une section connect est utilisée si la partie de la valeur du mot clé de la chaîne de connexion cliente, « Data Source=valeur », correspond à un identificateur de section connect.
  • Une section sql est utilisée si la chaîne de commande cliente contient une chaîne qui correspond à un identificateur de section sql.
  • Une section connect ou sql avec un paramètre par défaut est utilisée si aucun identificateur correspondant n'est trouvé.
  • Une section userlist est utilisée si l'identificateur de section userlist correspond à un identificateur de section connect. Si une correspondance est établie, le contenu de la section userlist est appliqué à la connexion déterminée par la section connect.
  • Si la chaîne figurant dans une chaîne de connexion ou de commande ne correspond pas à l'identificateur d'un en-tête de section connect ou sql et qu'aucun en-tête de section connect ou sql ne comporte de paramètre par défaut, la chaîne cliente est utilisée sans être modifiée.
  • La section logs est utilisée lorsque l'objet DataFactory est actif.

Voir aussi

Section connect du fichier de personnalisation | Section logs du fichier de personnalisation | Section sql du fichier de personnalisation | Section userlist du fichier de personnalisation | Personnalisation de DataFactory | Paramètres clients requis | Création de votre gestionnaire personnalisé


Section connect du fichier de personnalisation

Par défaut, le gestionnaire refuse toutes les connexions. La section connect spécifie les exceptions à ce comportement. Ainsi, si toutes les sections connect étaient absentes ou vides, par défaut, aucune connexion ne pourrait être établie.

La section connect peut comprendre les éléments suivants :

  • Une entrée d'accès par défaut qui identifie les opérations de lecture et d'écriture par défaut autorisées sur cette connexion. Si cette section ne comporte aucune entrée d'accès par défaut, elle est ignorée.
  • Une nouvelle chaîne de connexion qui remplace la chaîne de connexion cliente.

Syntaxe

Une entrée d'accès par défaut a la syntaxe suivante :

Access=accessRight

Une entrée de chaîne de connexion de substitution est de la forme :

Connect=connectionString
Élément | Description
Connect | Chaîne littérale indiquant qu'il s'agit d'une entrée de chaîne de connexion.
chaîneConnexion | Chaîne qui remplace l'ensemble de la chaîne de connexion cliente.
Access | Chaîne littérale indiquant qu'il s'agit d'une entrée d'accès.
droitAccès Représente un des droits d'accès suivants :
  • NoAccess — L'utilisateur n'a pas accès à la source de données.
  • ReadOnly — L'utilisateur peut accéder en lecture seule à la source de données.
  • ReadWrite — L'utilisateur peut accéder en lecture ou en écriture à la source de données.

Si vous voulez autoriser toutes les connexions (en désactivant le comportement par défaut du gestionnaire), définissez l'entrée d'accès Access=ReadWrite dans la section connect default et supprimez ou placez en commentaire toutes les autres sections connect identifier.

Voir aussi

Section logs du fichier de personnalisation | Section sql du fichier de personnalisation | Section userlist du fichier de personnalisation | Personnalisation de DataFactory | Paramètres clients requis | Description du fichier de personnalisation | Création de votre gestionnaire personnalisé


Section SQL du fichier de personnalisation

La section sql peut comprendre une nouvelle chaîne SQL qui remplace la chaîne de commande cliente. Si la section ne comprend aucune chaîne SQL, elle sera ignorée.

La nouvelle chaîne SQL peut inclure des paramètres. Cela signifie que les paramètres de la chaîne SQL de la section sql (désignés par le caractère « ? ») peuvent être remplacés par les arguments correspondants dans un identificateur de la chaîne de commande cliente (désignés par une liste entre parenthèses délimitée par des virgules). L'identificateur et la liste d'arguments se comportent comme un appel de fonction.

Par exemple, imaginons la chaîne de commande cliente "CustomerByID(4)", l'en-tête de section SQL [SQL CustomerByID] et la nouvelle chaîne de section SQL "SELECT * FROM Customers WHERE CustomerID = ?". . Le gestionnaire va générer "SELECT * FROM Customers WHERE CustomerID = 4" et utiliser cette chaîne pour interroger la source de données.

Si la nouvelle instruction SQL est la chaîne Null (""), la section est ignorée.

Si la nouvelle chaîne d'instructions SQL n'est pas valide, l'exécution de l'instruction échoue. Le paramètre client est en fait ignoré. Vous pouvez provoquer cette situation pour « désactiver » toutes les commandes SQL clientes en spécifiant :

[SQL default]
SQL = " "

Syntaxe

Une chaîne SQL de substitution est de la forme :

SQL=sqlString

Élément | Description
SQL | Chaîne littérale indiquant qu'il s'agit d'une entrée de section SQL.
chaîneSQL | Chaîne SQL qui remplace la chaîne cliente.

Voir aussi

Section connect du fichier de personnalisation | Section logs du fichier de personnalisation | Section userlist du fichier de personnalisation | Personnalisation de DataFactory | Paramètres clients requis | Description du fichier de personnalisation | Création de votre gestionnaire personnalisé


Section userlist du fichier de personnalisation

La section userlist est associée à la section connect qui présente le même paramètre identificateur de section.

Cette section peut contenir une entrée d'accès utilisateur, qui détermine les droits d'accès de l'utilisateur spécifié et remplace l'entrée d'accès par défaut de la section connect correspondante.

Syntaxe

Une entrée d'accès utilisateur a la syntaxe suivante :

userName=accessRights

Élément | Description
userName | Nom d'utilisateur de la personne qui fait appel à cette connexion. Les noms d'utilisateurs valides sont définis dans la boîte de dialogue IIS Gestionnaire des services Internet.
droitAccès Représente un des droits d'accès suivants :
  • NoAccess — L'utilisateur n'a pas accès à la source de données.
  • ReadOnly — L'utilisateur peut accéder en lecture seule à la source de données.
  • ReadWrite — L'utilisateur peut accéder en lecture ou en écriture à la source de données.

Voir aussi

Section connect du fichier de personnalisation | Section logs du fichier de personnalisation | Section sql du fichier de personnalisation | Personnalisation de DataFactory | Paramètres clients requis | Description du fichier de personnalisation | Création de votre gestionnaire personnalisé


Section logs du fichier de personnalisation

La section logs contient une entrée de fichier journal qui spécifie le nom d'un fichier où sont consignées les erreurs qui se produisent pendant le fonctionnement de DataFactory.

Syntaxe

Une entrée de fichier journal a la syntaxe suivante :

err=FileName
Élément | Description
Err | Chaîne littérale indiquant qu'il s'agit d'une entrée dans le fichier journal.
NomFichier | Chemin d'accès complet et nom du fichier. Le fichier s'appelle généralement c:\msdfmap.log.

Le fichier journal peut contenir un nom utilisateur, HRESULT, ainsi que la date et l'heure de chaque erreur.

Voir aussi

Section connect du fichier de personnalisation | Section sql du fichier de personnalisation | Section userlist du fichier de personnalisation | Personnalisation de DataFactory | Paramètres clients requis | Description du fichier de personnalisation | Création de votre gestionnaire personnalisé


Paramètres clients requis

Spécifiez les paramètres suivants pour utiliser un gestionnaire personnalisé DataFactory.

  • Spécifiez « Provider=MS Remote » dans la propriété Provider de l'objet Connection ou dans le mot clé « Provider= » de la chaîne de connexion de l'objet Connection.
  • Affectez la valeur adUseClient à la propriété CursorLocation.
  • Spécifiez le nom du gestionnaire à utiliser dans la propriété Handler de l'objet RDS.DataControl ou le mot clé Handler= de la chaîne de connexion de l'objet Recordset. (Vous ne pouvez pas définir le gestionnaire dans la chaîne de connexion de l'objet Connection.)
RDS fournit un gestionnaire par défaut sur le serveur nommé MSDFMAP.Handler. (Le fichier de personnalisation par défaut se nomme MSDFMAP.INI.)

Exemple

Supposons que les sections suivantes du fichier MSDFMAP.INI et le nom de la source de données, AdvWorks, ont été précédemment définis :

[connect CustomerDataBase]
Access=ReadWrite
Connect="DSN=AdvWorks"

[sql CustomerById]
SQL="SELECT * FROM Customers WHERE CustomerID = ?"

Les extraits de code suivants sont écrits en Visual Basic :

Version RDS.DataControl

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

Version Recordset

Dim rs as New ADODB.Recordset
rs.CursorLocation = adUseClient

Spécifiez la propriété ou le mot clé Handler, la propriété ou le mot clé Provider, ainsi que les identificateurs CustomerById et CustomerDatabase. Ouvrez ensuite l'objet Recordset.

rs.Open "CustomerById(4)", "Handler=MSDFMAP.Handler;" & _
   "Provider=MS Remote;Data Source=CustomerDatabase;" & _
   "Remote Server=http://yourServer"

Voir aussi

Section connect du fichier de personnalisation | Section logs du fichier de personnalisation | Section sql du fichier de personnalisation | Section userlist du fichier de personnalisation | Personnalisation de DataFactory | Microsoft OLE DB Remoting Provider | Description du fichier de personnalisation | Création de votre gestionnaire personnalisé


Création de votre gestionnaire personnalisé

Si vous êtes administrateur d'un serveur IIS et souhaitez bénéficier de la prise en charge RDS par défaut, mais avec un contrôle plus puissant sur les requêtes et les droits d'accès des utilisateurs, vous aurez peut-être besoin de créer votre propre gestionnaire.

Le gestionnaire par défaut MSDFMAP.Handler implémente l'interface IDataFactoryHandler.

Interface IDataFactoryHandler

Cette interface dispose de deux méthodes, GetRecordset et Reconnect. Les deux méthodes exigent que la propriété CursorLocation ait la valeur adUseClient.

Les deux méthodes acceptent des arguments spécifiés après la première virgule dans le mot clé « Handler= ». Par exemple, « Handler=progid,arg1,arg2; » passe une chaîne d'arguments « arg1,arg2 » et « Handler=progid » passe un argument Null.

Méthode GetRecordset

Cette méthode interroge la source de données et crée un objet Recordset en utilisant les arguments fournis. L'objet Recordset doit être ouvert avec adLockBatchOptimistic et ne doit pas être ouvert en mode asynchrone.

Arguments

conn Chaîne de connexion.

args Arguments du gestionnaire.

query Texte de commande pour effectuer une requête.

ppRS Pointeur vers lequel l'objet Recordset doit être renvoyé.

Méthode Reconnect

Cette méthode met à jour la source de données. Elle crée un objet Connection et lui attache l'objet Recordset considéré.

Arguments

conn Chaîne de connexion.

args Arguments du gestionnaire.

pRS Objet Recordset.

msdfhdl.idl

Il s'agit de la définition d'interface pour IDataFactoryHandler qui apparaît dans le fichier 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 Library
    // {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 will use the ActiveConnection property
// on the Recordset after calling Reconnect.
   HRESULT _stdcall Reconnect(
      [in] BSTR conn,
      [in] BSTR args,
      [in] _Recordset *pRS);
    };
};

Voir aussi

Section connect du fichier de personnalisation | Section logs du fichier de personnalisation | Section sql du fichier de personnalisation | Section userlist du fichier de personnalisation | Personnalisation de DataFactory | Paramètres clients requis | Description du fichier de personnalisation


Résolution des problèmes liés à RDS

Les sections suivantes décrivent les solutions à appliquer en cas de problèmes ou d'erreurs spécifiques rencontrés avec le service RDS. Cette section traite des problèmes suivants :

  • Configuration de RDS sur Windows 2000
  • « Erreur du serveur Internet : accès refusé »
  • RDS renvoie l'erreur « Flux non lu »
  • Blocages avec le niveau d'isolation de lecture réitérable
  • Vérification de l'existence d'un espace de base de données TempDB suffisant
  • Réduction de l'utilisation de l'espace du fichier journal

Notions fondamentales relatives à RDS


Configuration de RDS sur Windows 2000

Si vous ne parvenez pas à faire fonctionner correctement RDS après une mise à niveau vers Windows 2000, suivez les étapes ci-dessous pour résoudre le problème.

  1. Vérifiez au préalable l'exécution du service de publication World Wide Web en accédant à http://serveur via Internet Explorer. Si vous ne parvenez pas à accéder au serveur Web de cette façon, ouvrez une invite de commandes et entrez la commande suivante, « NET START W3SVC ».
  2. Dans le menu Démarrer, sélectionnez Exécuter. Tapez msdfmap.ini, puis cliquez sur OK pour ouvrir le fichier msdfmap.ini dans le Bloc-notes. Consultez la section [CONNECT DEFAULT]. Si le paramètre ACCESS a la valeur NOACCESS, remplacez cette dernière par READONLY.
  3. À l'aide de l'utilitaire RegEdit, accédez à « HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\DataFactory\HandlerInfo ». Vérifiez ensuite que HandlerRequired a pour valeur 0 et que DefaultHandler a pour valeur "" (chaîne Null).
    Remarque Si vous apportez des modifications à cette section du Registre, vous devez arrêter puis redémarrer le service de publication World Wide Web en entrant les commandes suivantes au niveau d'une invite de commandes : « NET STOP W3SVC » et « NET START W3SVC ».
  4. À l'aide de l'utilitaire RegEdit, accédez dans le Registre à « HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W3SVC\Parameters\ADCLaunch » et vérifiez s'il existe une clé appelée RDSServer.Datafactory. Dans le cas contraire, créez-la.
  5. À l'aide du Gestionnaire des services Internet, accédez au site Web par défaut et consultez les propriétés de la racine virtuelle MSADC. Contrôlez les restrictions relatives à la sécurité des répertoires/adresses IP et aux noms de domaine. Si la case « Accès refusé » est activée, sélectionnez « Autorisé ».

Veillez à redémarrer le serveur si les modifications apportées ne semblent pas résoudre le problème.

Notions fondamentales relatives à RDS


« Erreur du serveur Internet : accès refusé »

Ce message d'erreur signifie généralement que les services IIS (Microsoft Internet Information Services) ont renvoyé l'état suivant :

HTTP_STATUS_DENIED 401.

Assurez-vous que les répertoires accessibles aux services IIS disposent des autorisations adéquates. Le service RDS peut communiquer avec un serveur Web IIS utilisant l'un des trois modes d'authentification de mot de passe suivants : anonyme, de base ou stimulation/réponse de Windows NT (appelé mode d'authentification intégré de Windows dans Windows 2000). En outre, le serveur Web doit disposer d'autorisations d'accès à l'ordinateur de la source de données s'il s'agit d'un ordinateur Windows NT/Windows 2000.

Notions fondamentales relatives à RDS


RDS renvoie l'erreur « Flux non lu »

« L'objet Stream n'a pas pu être lu car il est vide ou la position actuelle se situe à la fin de l'objet Stream. Pour les objets Stream non vides, définissez la position actuelle à l'aide de la propriété Position. Pour déterminer si un objet Stream est vide, vérifiez la propriété Size ».

Si vous obtenez l'erreur ci-dessus, cette dernière peut résulter d'une tentative d'utilisation d'une requête hiérarchique paramétrée via le protocole HTTP. RDS ne permet pas l'utilisation de requêtes hiérarchiques paramétrées.

Notions fondamentales relatives à RDS


Blocages avec le niveau d'isolation de lecture réitérable

Si un objet Business personnalisé utilise un niveau d'isolation de lecture réitérable pour accéder à un serveur SQL Server et que l'objet Business est appelé simultanément par deux clients qui envoient une requête et une mise à jour dans la même transaction, un blocage est toujours possible. Le service RDS est conçu pour permettre à l'un des deux processus d'expirer et ainsi de supprimer le blocage, mais la mise à jour échouera.

Pour modifier le délai d'attente, utilisez la propriété dynamique Command Time Out de Cursor Service.

Notions fondamentales relatives à RDS


Vérification de l'existence d'un espace de base de données TempDB suffisant

Si, lors de la gestion d'objets Recordset, des erreurs se produisent et nécessitent un espace de traitement sur le serveur Microsoft SQL Server 6.5, il devient parfois nécessaire d'augmenter la taille de la base de données TempDB. (Certaines requêtes exigent un espace de traitement temporaire. C'est le cas d'une requête comprenant la clause ORDER BY, qui exige un tri de Recordset, et par conséquent un espace temporaire.)

Important Lisez attentivement la procédure avant de l'exécuter parce qu'il est difficile de réduire la taille d'un périphérique après l'avoir augmentée.
Remarque Par défaut, dans Microsoft SQL Server 7.0 et les versions ultérieures, l'espace de la base de données TempDB est configuré pour augmenter automatiquement en fonction des besoins. Cette procédure ne s'applique donc qu'aux serveurs exécutant des versions antérieures à la version 7.0.

Pour augmenter l'espace de base de données TempDB sur SQL Server 6.5

  1. Démarrez Microsoft® SQL Server Enterprise Manager, ouvrez l'arborescence du serveur, puis l'arborescence des unités de base de données.
  2. Sélectionnez un périphérique (physique) à développer, tel que Master, et double-cliquez sur celui-ci pour ouvrir la boîte de dialogue Édition des unités de base de données.

    Cette boîte de dialogue affiche l'espace actuellement utilisé par les bases de données.

  3. Dans la zone Taille, augmentez la taille du périphérique (par exemple, 50 mégaoctets (Mo) d'espace disque).
  4. Cliquez sur Modifier maintenant pour modifier la quantité de mégaoctets que peut atteindre la base de données TempDB (logique).
  5. Ouvrez l'arborescence des bases de données sur le serveur et double-cliquez ensuite sur TempDB pour ouvrir la boîte de dialogue Édition de la base de données. L'onglet Base de données affiche l'espace actuellement alloué à la base de données TempDB (Taille des données). Par défaut, il s'agit de 2 Mo.
  6. Sous le groupe Taille, cliquez sur Développer. Les graphiques affichent l'espace alloué et celui encore disponible pour chaque périphérique physique. Les barres marron représentent l'espace disponible.
  7. Sélectionnez une Unité de journal, tel que Master, pour afficher la quantité disponible dans la zone Taille (Mo).
  8. Cliquez sur Développer maintenant pour allouer cet espace à la base de données TempDB.

    La boîte de dialogue Édition de la base de données affiche la nouvelle taille de la base de données TempDB.

Pour plus d'informations sur cette rubrique, effectuez une recherche dans le fichier d'aide de Microsoft SQL Server Enterprise Manager sur « Boîte de dialogue Développement de la base de données ».

Notions fondamentales relatives à RDS


Réduction de l'utilisation de l'espace du fichier journal

S'il existe un gros volume d'activité sur la base de données SQL Server, le fichier journal peut rapidement atteindre sa capacité maximale et par conséquent provoquer l'arrêt du serveur. Il est possible de configurer le fichier journal en activant l'option Tronquer le journal lors de la synchronisation, afin d'augmenter sensiblement la durée de vie du fichier journal d'une base de données.

Pour activer l'option Vider le journal au point de contrôle dans Microsoft SQL Server 6.5

  1. Démarrez Microsoft SQL Server Enterprise Manager, ouvrez l'arborescence du serveur, puis l'arborescence des unités de base de données.
  2. Double-cliquez sur le nom de la base de données pour laquelle vous voulez activer cette fonctionnalité.
  3. Sous l'onglet Base de données, cliquez sur Tronquer.
  4. Sous l'onglet Options, sélectionnez Tronquer le journal lors de la synchronisation, puis cliquez sur OK.

Pour activer l'option Vider le journal au point de contrôle dans Microsoft SQL Server 7.0

  1. Démarrez Microsoft SQL Server Enterprise Manager, ouvrez l'arborescence du serveur, puis l'arborescence des bases de données.
  2. Cliquez avec le bouton droit de la souris sur le nom de la base de données pour laquelle vous voulez activer cette fonctionnalité, puis choisissez Propriétés.
  3. Sous l'onglet Options, sélectionnez Tronquer le journal lors de la synchronisation, puis cliquez sur OK.

Pour plus d'informations sur la fonctionnalité Vider le journal au point de contrôle, consultez la documentation Microsoft SQL Server.

Notions fondamentales relatives à RDS


Section III : ADO (Multidimensional) (ADO MD)

Cette section contient le chapitre suivant :

  • Chapitre 14 : Principes ADO MD


Chapitre 14 : Principes ADO MD

Le modèle ADO MD (Microsoft ActiveX Data Objects (Multidimensional) (ADO MD) simplifie l'accès aux données multidimensionnelles à partir de langages de programmation tels que Microsoft Visual Basic, Microsoft Visual C++ et Microsoft Visual J++. ADO MD enrichit la gamme ADO (ActiveX Data Objects) de Microsoft avec des objets spécifiques aux données multidimensionnelles, tels que les objets CubeDef et Cellset. Le modèle ADO MD vous permet de parcourir un schéma multidimensionnel, d'interroger un cube et d'extraire les résultats obtenus.

À l'instar d'ADO, ADO MD utilise un fournisseur OLE DB sous-jacent pour l'accès aux données. Pour fonctionner en association avec ADO MD, le fournisseur doit être un fournisseur de données multidimensionnelles (MDP) défini par les spécifications OLAP de OLE DB. Les fournisseurs MDP présentent les données sous forme d'affichages multidimensionnels, à la différence des fournisseurs de données tabulaires (TDP) qui les présentent sous forme de tableaux. Consultez la documentation de votre fournisseur OLAP-OLE DB pour des informations complémentaires sur la syntaxe particulière et les comportements pris en charge par votre fournisseur.

Ce document suppose une connaissance pratique du langage de programmation Visual Basic et une connaissance générale d'ADO et d'OLAP. Pour plus d'informations, consultez le Guide de référence du programmeur ADO et le guide OLE DB for OLAP Programmer’s Reference. Pour plus d'informations d'ordre général sur ADO MD, consultez les rubriques suivantes :

  • Vue d'ensemble des schémas et des données multidimensionnels
  • Utilisation des données multidimensionnelles
  • Utilisation d'ADO avec ADO MD
  • Programmation avec ADO MD
  • Modèle d'objet ADO MD

Voir aussi

Modèle d'objet ADO MD | Guide de référence du programmeur Microsoft ADO | Guide de référence du programmeur Microsoft ADOX | Vue d'ensemble des schémas et des données multidimensionnels | Programmation avec ADO MD | Utilisation d'ADO avec ADO MD | Utilisation des données multidimensionnelles


Vue d'ensemble des schémas et des données multidimensionnels

Définition des schémas multidimensionnels

L'objet métadonnées central d'ADO MD est le cube, qui consiste en un ensemble structuré de dimensions, hiérarchies, niveaux et membres liés entre eux.

Une dimension est une catégorie indépendante de données issues de votre base de données multidimensionnelle et dérivées de vos entités professionnelles. Une dimension contient généralement des articles pouvant être exploités comme critères de requête pour les mesures de votre base de données.

Une hiérarchie est un chemin de regroupement d'une dimension. Une dimension peut présenter différents niveaux de granulation liés entre eux par des relations parents-enfants. Une hiérarchie définit les relations entre ces niveaux.

Un niveau est une étape de regroupement dans une hiérarchie. Pour les dimensions comportant plusieurs couches d'informations, chaque couche est un niveau.

Un membre est un article de données dans une dimension. Généralement, la création d'une légende ou la description d'une mesure de la base de données s'effectue à l'aide de membres.

Dans ADO MD, les cubes sont représentés par des objets CubeDef. Les dimensions, les hiérarchies, les niveaux et les membres sont également représentés par leurs objets ADO MD correspondants : Dimension, Hierarchy, Level et Member.

Dimensions

Les dimensions d'un cube dépendent de vos entités professionnelles et des types de données à modéliser dans la base de données. Généralement, chaque dimension est un point d'entrée indépendant ou un mécanisme de sélection des données.

Par exemple, un cube contenant des données de ventes possède les cinq dimensions suivantes : Vendeur, Géographie, Temps, Produits et Mesures. La dimension Mesures contient les valeurs de données des ventes réelles, tandis que les autres dimensions représentent les modes de catégorisation et de groupement des valeurs des données de ventes.

La dimension Géographie possède le jeu de membres suivant :

{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, Berlin,
Hamburg, Munich, Stuttgart}

Hiérarchies

Les hiérarchies définissent les modes d'agencement ou de groupement des niveaux d'une dimension. Une dimension peut posséder plusieurs hiérarchies. Une hiérarchie naturelle existe dans la dimension Géographie :

Niveaux

Dans l'exemple de dimension Géographie illustrée ci-dessus, chaque zone représente un niveau de la hiérarchie.

Chaque niveau possède un jeu de membres :

  • Monde = {Tout}
  • Continents = {Amérique du Nord, Europe}
  • Pays = {Canada, États-Unis, Royaume-Uni, Allemagne}
  • Régions = {Est du Canada, Ouest du Canada, États-Unis N-E, États-Unis N-O, États-Unis S-E, États-Unis S-O, Angleterre, Irlande, Écosse, Pays de Galles, Allemagne du Nord, Allemagne du Sud}
  • Villes = {Ottawa, Toronto, Vancouver, Calgary, Seattle, Boise, Los Angeles, Houston, Shreveport, Miami, Boston, New York, Londres, Douvres, Glasgow, Édimbourg, Cardiff, Pembroke, Belfast, Berlin, Hambourg, Munich, Stuttgart}

Membres

Dans une hiérarchie, les membres de niveau inférieur (feuille) n'ont pas d'enfant, alors que les membres de niveau supérieur (racine) n'ont pas de parent. Tous les autres membres ont au moins un parent et au moins un enfant. Par exemple, une traversée partielle de l'arbre de hiérarchie dans la dimension Géographie produit les relations parents-enfants suivantes :

  • {Tout} (parent de) {Europe, Amérique du Nord}
  • {Amérique du Nord} (parent de) {Canada, États-Unis}
  • {États-Unis} (parent de) {États-Unis N-E, États-Unis N-O, États-Unis S-E, États-Unis S-O}
  • {États-Unis N-O} (parent de) {Boise, Seattle}

Les membres peuvent être consolidés avec d'autres hiérarchies par dimension. Envisageons une dimension Temps qui comporte deux modes de remontée au niveau Année à partir du niveau Jours :

Cet exemple illustre une autre caractéristique : certains membres du niveau Semaine de la hiérarchie Année-Semaine n'apparaissent à aucun niveau de la hiérarchie Année-Trimestre. Par conséquent, une hiérarchie ne doit pas nécessairement inclure tous les membres d'une dimension.

Voir aussi

Modèle d'objet ADO MD | Guide de référence du programmeur de Microsoft ADO MD | Programmation avec ADO MD | Utilisation d'ADO avec ADO MD | Utilisation des données multidimensionnelles


Utilisation des données multidimensionnelles

Un cellset (jeu de cellules) est le résultat d'une requête sur des données multidimensionnelles. Il est constitué par une collection d'axes, en général deux ou trois et rarement plus de quatre. Un axe est une collection de membres provenant d'une ou de plusieurs dimensions, utilisée pour localiser ou filtrer des valeurs spécifiques dans un cube.

Une position est un point sur un axe. Pour un axe constitué d'une seule dimension, ces positions sont un sous-ensemble des membres de la dimension. Si un axe est constitué de plusieurs dimensions, chaque position est une entité composée de n parties, n étant le nombre de dimensions orientées le long de cet axe. Chaque partie de la position est un membre provenant d'une des dimensions constitutives.

Par exemple, si les dimensions Géographie et Produit d'un cube contenant des données de ventes sont orientées le long de l'axe des x d'un jeu de cellules, une position sur cet axe peut contenir les membres « États-Unis » et « Ordinateurs ». Dans cet exemple, la définition d'une position sur l'axe des x requiert que les membres de chaque dimension soient orientés le long de cet axe.

Une cellule est un objet placé à l'intersection des coordonnées d'axes. Chaque cellule est associée à plusieurs fragments d'informations, notamment la donnée proprement dite, une chaîne de caractères formatée (la forme affichable des données de la cellule), et la valeur ordinale de la cellule. (Chaque cellule possède une valeur ordinale unique dans le jeu de cellules. La valeur ordinale de la première cellule dans le jeu de cellules est zéro, tandis que la cellule de gauche de la deuxième ligne d'un jeu de cellules de huit colonnes a une valeur ordinale de huit.)

Par exemple, un cube possède les six dimensions suivantes (remarquez que ce schéma de cube diffère légèrement de l'exemple cité dans Vue d'ensemble des schémas et des données multidimensionnels) :

  • Vendeur
  • Géographie (hiérarchie naturelle) : Continents, Pays, États, etc.
  • Trimestres : Trimestres, Mois, Jours
  • Années
  • Mesures : Ventes, Pct changement, Prévisions ventes
  • Produits

Le jeu de cellules suivant représente les ventes de tous les produits pour 1991 :

Note L'affichage des valeurs des cellules de l'exemple peut être ordonné en fonction des paires de valeurs ordinales des positions axiales. Dans ce cas, le premier chiffre représente la position sur l'axe des x et le second la position sur l'axe des y.

Les caractéristiques de ce jeu de cellules sont les suivantes :

  • Dimensions de l'axe : Trimestres, Vendeur, Géographie
  • Dimensions du filtre : Mesures, Années, Produits
  • Deux axes : COLONNE (x, ou Axe 0) et LIGNE (y, ou Axe 1)
  • Axe des x : deux dimensions imbriquées, Vendeur et Géographie
  • axe des y : Dimension Trimestres

L'axe des x possède deux dimensions imbriquées : Vendeur et Géographie. Dans Géographie, quatre membres sont sélectionnés : Seattle, Boston, USA_South et Japan. Deux membres sont sélectionnés dans Vendeur : Valentine et Nash. Ceci donne un total de huit positions sur cet axe (8 = 4*2).

Chaque coordonnée est représentée comme une position de deux membres : un membre de la dimension Vendeur et un membre de la dimension Géographie :

(Valentine, Seattle), (Valentine, Boston), (Valentine, USA_North),
(Valentine, Japan), (Nash, Seattle), (Nash, Boston), (Nash, USA_North),
(Nash, Japan)

L'axe des y a une seule dimension contenant les huit positions suivantes :

Jan, Feb, Mar, Qtr2, Qtr3, Oct, Nov, Dec

Les jeux de cellules, cellules, axes et positions sont tous représentés dans ADO MD par les objets correspondants : Cellset, Cell, Axis et Position.

Voir aussi

Modèle d'objet ADO MD | Guide de référence du programmeur de Microsoft ADO MD | Vue d'ensemble des schémas et des données multidimensionnels | Programmation avec ADO MD | Utilisation d'ADO avec ADO MD


Utilisation d'ADO avec ADO MD

ADO et ADO MD sont des modèles d'objets liés mais distincts. Le modèle ADO fournit des objets pour la connexion aux sources de données, l'exécution de commandes, l'extraction de données tabulaires et de métadonnées de schémas sous forme tabulaire, ainsi que l'affichage d'informations d'erreurs du fournisseur. Le modèle ADO MD fournit des objets pour l'extraction de données multidimensionnelles et l'affichage de métadonnées de schémas multidimensionnels.

Si vous travaillez avec un fournisseur MDP, vous pouvez utiliser ADO, ADO MD, ou les deux à la fois avec votre application. En faisant référence aux deux bibliothèques dans votre projet, vous aurez accès à toutes les fonctionnalités proposées par votre fournisseur MDP.

Il est souvent utile pour les consommateurs de disposer d'une vue plane et tabulaire, d'un jeu de données multidimensionnel. Vous pouvez l'obtenir par le biais de l'objet Recordset ADO. Indiquez la source de votre Cellset comme le paramètre Source de la méthode Open d'un Recordset, et non pas comme la source d'un objet Cellset ADO MD.

Il peut être également utile d'afficher les métadonnées des schémas dans un affichage tabulaire plutôt que sous la forme d'une hiérarchie d'objets. La méthode ADO OpenSchema sur l'objet Connection permet à l'utilisateur d'ouvrir un Recordset contenant des informations relatives aux schémas. Le paramètre QueryType de la méthode OpenSchema possède plusieurs valeurs SchemaEnum qui se rapportent spécifiquement aux fournisseurs MDP. Ces valeurs sont les suivantes :

  • adSchemaCubes
  • adSchemaDimensions
  • adSchemaHierarchies
  • adSchemaLevels
  • adSchemaMeasures
  • adSchemaMembers

Afin de pouvoir utiliser les valeurs enum ADO avec les propriétés ou les méthodes ADO MD, votre projet doit faire référence à la fois aux bibliothèques ADO et ADO MD. Vous pouvez, par exemple, utiliser les valeurs enum ADO adState avec la propriété ADO MD State. Pour plus d'informations sur la création de références aux bibliothèques, consultez la documentation de votre outil de développement.

Pour plus d'informations sur les objets et les méthodes ADO, consultez la Référence API ADO.

Voir aussi

Modèle d'objet ADO MD | Guide de référence du programmeur de Microsoft ADO MD | Vue d'ensemble des schémas et des données multidimensionnels | Programmation avec ADO MD | Utilisation des données multidimensionnelles


Programmation avec ADO MD

Pour utiliser ADO MD avec votre outil de développement, vous devez établir une référence à la bibliothèque de type ADO MD. La description de la bibliothèque ADO MD est : Microsoft ActiveX Data Objects (Multi-dimensional) Library. Le fichier de la bibliothèque ADO MD porte le nom msadomd.dll, et l'ID du programme (ProgID) est « ADOMD ». Pour plus d'informations sur la création de références aux bibliothèques, consultez la documentation de votre outil de développement.

Voir aussi

Guide de référence du programmeur de Microsoft ADO MD | Vue d'ensemble des schémas et des données multidimensionnels | Utilisation d'ADO avec ADO MD | Utilisation des données multidimensionnelles


Section IV : Extensions pour le langage de définition des données et la sécurité (ADOX)

Cette section contient le chapitre suivant :

  • Chapitre 15 : Principes ADOX


Chapitre 15 : Principes ADOX

Microsoft® ActiveX® Data Objects Extensions pour le langage de définition des données et la sécurité (ADOX) est une extension des objets et du modèle de programmation ADO. ADOX contient des objets pour la création et la modification de schémas, aussi bien que pour la sécurité. Du fait que la manipulation des schémas repose sur une approche à base d'objets, il est possible d'écrire du code qui fonctionnera avec différentes sources de données, quelles que soient les différences dans leur syntaxe d'origine.

ADOX est une bibliothèque auxiliaire du noyau des objets ADO. Elle propose des objets supplémentaires pour créer, modifier et supprimer des objets de schéma tels que les tables et les procédures. Sont aussi inclus des objets de sécurité pour mettre à jour les utilisateurs et les groupes, et pour accorder et refuser des autorisations sur des objets.

Pour utiliser ADOX avec votre outil de développement, vous devrez établir une référence à la bibliothèque de type ADOX. La description de la bibliothèque ADOX est « Microsoft ADO Ext. for DDL and Security ». Le fichier de la bibliothèque ADOX s'appelle Msadox.dll, et l'ID de programme (ProgID) est « ADOX ». Pour plus d'informations sur l'établissement de références aux bibliothèques, consultez la documentation de votre outil de développement.

Microsoft OLE DB Provider pour le moteur de base de données Microsoft Jet prend complètement en charge ADOX. Suivant votre fournisseur de données, certaines caractéristiques d'ADOX peuvent ne pas être prises en charge. Pour plus d'informations sur les caractéristiques prises en charge par Microsoft OLE DB Provider pour ODBC, Microsoft OLE DB Provider pour Oracle ou Microsoft OLE DB pour SQL Server, consultez le fichier Lisezmoi de MDAC.

Ce document suppose une connaissance opérationnelle du langage de programmation Microsoft® Visual Basic® et une connaissance générale du modèle ADO. Pour plus d'informations sur ADO, consultez le Guide de référence du programmeur ADO. Pour une présentation plus détaillée du modèle ADOX, consultez les rubriques suivantes :

  • Modèle d'objet ADOX
  • Objets ADOX
  • Collections ADOX
  • Propriétés ADOX
  • Méthodes ADOX
  • Exemples ADOX

Voir aussi

Référence de l'API ADOX | Exemples de code ADOX | Collections ADOX | Constantes énumérées ADOX | Méthodes ADOX | Modèle d'objet ADOX | Objets ADOX | Propriétés ADOX | Guide de référence du programmeur de Microsoft ADO MD | Guide de référence du programmeur ADO


Prise en charge d'ADOX par le fournisseur d'accès

Selon votre fournisseur de données OLE DB, certaines fonctionnalités d'ADOX ne sont pas prises en charge. ADOX est entièrement pris en charge par le Fournisseur OLE DB Microsoft pour Jet. Les fonctionnalités non prises en charge par le Fournisseur OLE DB Microsoft pour SQL Server, le Fournisseur OLE DB Microsoft pour ODBC ou le Fournisseur OLE DB Microsoft pour Oracle sont répertoriées ci-dessous. ADOX n'est pas pris en charge par les autres fournisseurs OLE DB Microsoft.

Microsoft OLE DB Provider pour SQL Server

Objet ou collection | Restriction d'usage
Objet Catalog | La méthode Create n'est pas prise en charge.
Collection Tables | Les propriétés sont en lecture/écriture avant la création d'objet, et en lecture seule lorsqu'elles font référence à un objet existant.
Collection Views | Views n'est pas pris en charge.
Collection Procedures | Les méthodes Append et Delete ne sont pas prises en charge.
Objet Procedure | La propriété Command n'est pas prise en charge.
Collection Keys | Les méthodes Append et Delete ne sont pas prises en charge.
Collection Users | Users n'est pas pris en charge.
Collection Groups | Groups n'est pas pris en charge.

Fournisseur OLE DB Microsoft pour ODBC

Objet ou collection | Restriction d'usage
Objet Catalog | La méthode Create n'est pas prise en charge.
Collection Tables | Les méthodes Append et Delete ne sont pas prises en charge. Les propriétés sont en lecture/écriture avant la création d'objet, et en lecture seule lorsqu'elles font référence à un objet existant.
Collection Procedures | Les méthodes Append et Delete ne sont pas prises en charge.
Objet Procedure | La propriété Command n'est pas prise en charge.
Collection Indexes | Les méthodes Append et Delete ne sont pas prises en charge.
Collection Keys | Les méthodes Append et Delete ne sont pas prises en charge.
Collection Users | Users n'est pas pris en charge.
Collection Groups | Groups n'est pas pris en charge.

Fournisseur OLE DB Microsoft pour Oracle

Objet ou collection | Restriction d'usage
Objet Catalog | La méthode Create n'est pas prise en charge.
Collection Tables | Les méthodes Append et Delete ne sont pas prises en charge. Les propriétés sont en lecture/écriture avant la création d'objet, et en lecture seule lorsqu'elles font référence à un objet existant.
Collection Views | Les méthodes Append et Delete ne sont pas prises en charge.
Objet View | La propriété Command n'est pas prise en charge.
Objet Procedures | Les méthodes Append et Delete ne sont pas prises en charge.
Objet Procedure | La propriété Command n'est pas prise en charge.
Collection Indexes | Les méthodes Append et Delete ne sont pas prises en charge.
Collection Keys | Les méthodes Append et Delete ne sont pas prises en charge.
Collection Users | Users n'est pas pris en charge.
Collection Groups | Groups n'est pas pris en charge.


Section V : Annexes

Le Guide du programmeur ADO contient les annexes suivantes :

  • Annexe A : Fournisseurs
  • Annexe B : Erreurs ADO
  • Annexe C : Programmation avec ADO
  • Annexe D : Exemples ADO


Annexe A : Fournisseurs

Cette section traite de trois types de fournisseurs : les fournisseurs de données, les fournisseurs de services et les fournisseurs de composants. Il existe deux catégories de fournisseurs : ceux qui fournissent des données et ceux qui fournissent des services. Un fournisseur de données possède ses données propres et les présente dans votre application sous forme de tableau. Un fournisseur de services intègre un service en produisant et en consommant des données, étendant des caractéristiques dans vos applications ADO. Un fournisseur de services peut également recevoir la définition de composant de service, qui doit travailler en liaison avec d'autres fournisseurs de services ou d'autres composants.

Fournisseurs de données

ADO tient sa puissance et sa flexibilité du fait qu'il peut se connecter à différents types de fournisseurs de données en utilisant le même modèle de programmation, quelles que soient les fonctionnalités du fournisseur.

Chaque fournisseur de données est cependant unique et la façon dont votre application dialogue avec ADO peut varier légèrement d'un fournisseur de données à un autre. Les différences constatées appartiennent généralement à trois catégories :

  • Paramètres de connexion dans la propriété ConnectionString.
  • Utilisation de l'objet Command.
  • Comportement de l'objet Recordset propre au fournisseur.

Des détails propres à chacun des fournisseurs de données actuellement disponibles chez Microsoft sont répertoriés ci-dessous.

Application | Rubrique
Bases de données ODBC | Microsoft OLE DB Provider pour ODBC
Service d'indexation Microsoft | Microsoft OLE DB Provider pour le service d'indexation Microsoft
Service Microsoft Active Directory | Microsoft OLE DB Provider pour le service Microsoft Active Directory
Bases de données Microsoft Jet | OLE DB Provider pour Microsoft Jet
Microsoft SQL Server | Microsoft OLE DB Provider pour SQL Server
Bases de données Oracle | Microsoft OLE DB Provider pour Oracle
Internet Publishing | Microsoft OLE DB Provider pour Internet Publishing

Propriétés dynamiques propres au fournisseur

La collection Properties des objets Connection, Command et Recordset contiennent des propriétés dynamiques propres au fournisseur. Ces propriétés fournissent des informations sur des fonctionnalités propres au fournisseur, au-delà des propriétés intégrées prises en charge par ADO.

Une fois que vous avez établi la connexion et créé ces objets, utilisez la méthode Refresh sur la collection Properties des objets pour accéder aux propriétés propres au fournisseur. Pour des informations détaillées sur ces propriétés dynamiques, reportez-vous à la documentation de votre fournisseur et au guide OLE DB Programmer's Reference.

Fournisseurs de services

Pour utiliser un fournisseur de services, vous devez fournir un mot clé. Vous devez aussi connaître les propriétés dynamiques associées à chaque fournisseur de services. Des détails propres aux fournisseurs sont énumérés pour chaque fournisseur de services actuellement disponible chez Microsoft.

  • Microsoft Data Shaping Service pour OLE DB
  • Fournisseur de persistance Microsoft OLE DB
  • Microsoft OLE DB Remoting Provider

Composants des services

Le composant Cursor Service pour OLE DB vient compléter les fonctions de prise en charge des curseurs des fournisseurs de données. Il requiert également un mot clé et possède des propriétés dynamiques.

Pour plus d'informations sur les fournisseurs, consultez la documentation Microsoft OLE DB dans le kit de développement Microsoft Data Access Components (SDK) ou visitez le site Web Microsoft Universal Data Access (en anglais).

Commandes des fournisseurs

Pour chaque fournisseur énuméré ici, si vos applications permettent aux utilisateurs d'entrer des instructions SQL en tant que commandes des fournisseurs, vous devez toujours valider ces entrées et être vigilant à l'égard des attaques potentielles utilisant des instructions SQL, notamment DROP TABLE t1, dans l'entrée utilisateur.

Voir aussi

Command, objet | Connection, objet | Microsoft OLE DB Provider pour Internet Publishing | Microsoft OLE DB Provider pour le service Microsoft Active Directory | Microsoft OLE DB Provider pour le service d'indexation Microsoft | Microsoft OLE DB Provider pour ODBC | Microsoft OLE DB Provider pour Oracle | Microsoft OLE DB Provider pour SQL Server | OLE DB Provider pour Microsoft Jet | Properties, collection | Recordset, objet | Refresh, méthode (RDS)


Microsoft OLE DB Provider pour ODBC

Dans l'environnement idéal d'un programmeur ADO ou RDS, chaque source de données présenterait une interface OLE DB permettant à ADO de s'y connecter directement. Un nombre croissant de développeurs de bases de données font désormais usage de cette interface, mais certaines bases de données sont encore différentes. Il est néanmoins possible d'accéder à la quasi-totalité des systèmes de gestion de base de données (SGBD) actuellement utilisés via ODBC.

Des pilotes ODBC sont disponibles pour tous les principaux systèmes de gestion de bases de données actuellement utilisés, notamment Microsoft SQL Server, Microsoft Access (moteur de base de données Microsoft Jet) et Microsoft FoxPro, mais aussi pour des produits non-Microsoft comme Oracle.

Toutefois, le fournisseur Microsoft ODBC Provider permet à ADO de se connecter à n'importe quelle source de données ODBC. Le fournisseur est libre de thread et compatible avec Unicode.

Le fournisseur prend en charge les transactions, bien que différents moteurs SGBD offrent différents types de prise en charge de ces transactions. Ainsi, Microsoft Access est en mesure de gérer les transactions imbriquées jusqu'à cinq niveaux.

Il s'agit du fournisseur par défaut pour ADO et toutes les propriétés et méthodes ADO liées au fournisseur sont prises en charge.

Paramètres de la chaîne de connexion

Pour vous connecter à ce fournisseur, définissez l'argument Provider= de la propriété ConnectionString de la manière suivante :

MSDASQL

La lecture de la propriété Provider renvoie également cette chaîne.

Chaîne de connexion typique

Voici un exemple de chaîne de connexion pour ce fournisseur :

"Provider=MSDASQL;DSN=dsnName;UID=userName;PWD=userPassword;"

Cette chaîne comprend les mots clés suivants :

Mot clé | Description
Provider | Spécifie le fournisseur OLE DB Provider pour ODBC.
DSN | Spécifie le nom de la source de données.
UID | Spécifie le nom de l'utilisateur.
PWD | Spécifie le mot de passe de l'utilisateur.
URL | Spécifie l'URL d'un fichier ou d'un répertoire publié dans un dossier Web.

Étant donné qu'il s'agit du fournisseur par défaut pour ADO, ce dernier tente d'établir une connexion avec ce fournisseur si vous omettez le paramètre Provider= dans la chaîne de connexion.

Le fournisseur ne prend en charge aucun paramètre de connexion spécifique autre que ceux définis par ADO. Il passera cependant tout paramètre de connexion non-ADO au gestionnaire de pilotes ODBC.

Le paramètre Provider peut être omis et, par conséquent, vous pouvez composer une chaîne de connexion ADO identique à une chaîne de connexion ODBC pour la même source de données. Utilisez les mêmes noms de paramètres (DRIVER=, DATABASE=, DSN=, etc.), les mêmes valeurs et la même syntaxe que pour composer une chaîne de connexion ODBC. Vous pouvez vous connecter en spécifiant ou non une source de données (DSN) ou un FileDSN prédéfini.

Syntaxe avec une source de données ou un FileDSN :

"[Provider=MSDASQL;] { DSN=name | FileDSN=filename } ;
[DATABASE=database;] UID=user; PWD=password"

Syntaxe sans source de données (connexion sans source de données) :

"[Provider=MSDASQL;] DRIVER=driver; SERVER=server;
DATABASE=database; UID=user; PWD=password"

Si vous utilisez un DSN ou un FileDSN, celui-ci doit être défini via l'Administrateur de sources de données ODBC à partir du Panneau de configuration Windows. Dans Microsoft Windows 2000, l'Administrateur ODBC se trouve dans le dossier Outils d'administration. Dans les versions antérieures de Windows, l'icône de l'Administrateur ODBC est intitulée OCBC 32 bits ou tout simplement ODBC.

Au lieu de définir un DSN, vous pouvez spécifier le pilote ODBC (DRIVER=), par exemple « SQLServer », le nom du serveur (SERVER=) et le nom de la base de données (DATABASE=).

Vous pouvez en outre spécifier un nom de compte utilisateur (UID=) et le mot de passe correspondant (PWD=) dans les paramètres spécifiques à ODBC ou les paramètres ADO user et password.

Lorsque vous définissez un DSN, vous spécifiez une base de données, mais vous pouvez également définir le paramètre database pour vous connecter à une base de données différente. Il est recommandé d'inclure le paramètre database chaque fois que vous utilisez un DSN. Vous serez ainsi sûr de pouvoir vous connecter à la base de données appropriée, même si un utilisateur a modifié le paramètre de la base de données par défaut depuis la dernière vérification du DSN.

Propriétés de connexion propres au fournisseur

Le fournisseur OLE DB pour ODBC ajoute plusieurs propriétés à la collection Properties de l'objet Connection. Le tableau suivant répertorie ces propriétés et indique le nom de la propriété OLE DB correspondante entre parenthèses.

Nom de la propriété | Description
Accessible Procedures (KAGPROP_ACCESSIBLEPROCEDURES) | Indique si l'utilisateur a accès aux procédures stockées.
Accessible Tables (KAGPROP_ACCESSIBLETABLES) | Indique si l'utilisateur a l'autorisation d'exécuter des instructions SELECT par rapport aux tables de base de données.
Active Statements (KAGPROP_ACTIVESTATEMENTS) | Indique le nombre de descripteurs que peut gérer un pilote ODBC sur une connexion.
Driver Name (KAGPROP_DRIVERNAME) | Indique le nom de fichier du pilote ODBC.
Driver ODBC Version (KAGPROP_DRIVERODBCVER) | Indique la version de ODBC prise en charge par le pilote.
File Usage (KAGPROP_FILEUSAGE) | Indique comment le pilote traite un fichier dans une source de données : en tant que table ou que catalogue.
Like Escape Clause (KAGPROP_LIKEESCAPECLAUSE) | Indique si le pilote prend en charge la définition et l'utilisation d'un caractère d'échappement à la place du symbole de pourcentage (%) et du trait de soulignement (_) dans le prédicat LIKE d'une clause WHERE.
Max Columns in Group By (KAGPROP_MAXCOLUMNSINGROUPBY) | Indique le nombre maximal de colonnes que peut mentionner la clause GROUP BY d'une instruction SELECT.
Max Columns in Index (KAGPROP_MAXCOLUMNSININDEX) | Indique le nombre maximal de colonnes que peut comprendre un index.
Max Columns in Order By (KAGPROP_MAXCOLUMNSINORDERBY) | Indique le nombre maximal de colonnes que peut mentionner la clause ORDER BY d'une instruction SELECT.
Max Columns in Select (KAGPROP_MAXCOLUMNSINSELECT) | Indique le nombre maximal de colonnes que peut mentionner la section SELECT d'une instruction SELECT.
Max Columns in Table (KAGPROP_MAXCOLUMNSINTABLE) | Indique le nombre maximal de colonnes autorisé dans une table.
Numeric Functions (KAGPROP_NUMERICFUNCTIONS) | Indique les fonctions numériques qui sont prises en charge par le pilote ODBC. Pour obtenir la liste des noms de fonctions et des valeurs associées qu'utilise ce masque binaire, consultez l'annexe E : Fonctions scalaires dans la documentation ODBC.
Outer Join Capabilities (KAGPROP_OJCAPABILITY) | Indique les types de jointures externes (OUTER JOINS) pris en charge par le fournisseur.
Outer Joins (KAGPROP_OUTERJOINS) | Indique si le fournisseur prend en charge les jointures externes.
Special Characters (KAGPROP_SPECIALCHARACTERS) | Indique quels caractères ont une signification spéciale pour le pilote ODBC.
Stored Procedures (KAGPROP_PROCEDURES) | Indique s'il existe des procédures stockées qui peuvent être utilisées avec ce pilote ODBC.
String Functions (KAGPROP_STRINGFUNCTIONS) | Indique les fonctions de chaîne qui sont prises en charge par le pilote ODBC. Pour obtenir la liste des noms de fonctions et des valeurs associées qu'utilise ce masque binaire, consultez l'annexe E : Fonctions scalaires dans la documentation ODBC.
System Functions (KAGPROP_SYSTEMFUNCTIONS) | Indique les fonctions système qui sont prises en charge par le pilote ODBC. Pour obtenir la liste des noms de fonctions et des valeurs associées qu'utilise ce masque binaire, consultez l'annexe E : Fonctions scalaires dans la documentation ODBC.
Time/Date Functions (KAGPROP_TIMEDATEFUNCTIONS) | Indique les fonctions d'heure et de date qui sont prises en charge par le pilote ODBC. Pour obtenir la liste des noms de fonctions et des valeurs associées qu'utilise ce masque binaire, consultez l'Annexe E : Fonctions scalaires dans la documentation ODBC.
SQL Grammar Support (KAGPROP_ODBCSQLCONFORMANCE) | Indique la grammaire SQL prise en charge par le pilote ODBC.

Propriétés des objets Recordset et Command propres au fournisseur

Le fournisseur OLE DB pour ODBC ajoute plusieurs propriétés à la collection Properties des objets Recordset et Command. Le tableau suivant répertorie ces propriétés et indique le nom de la propriété OLE DB correspondante entre parenthèses.

Nom de la propriété | Description
Query Based Updates/Deletes/Inserts (KAGPROP_QUERYBASEDUPDATES) | Indique s'il est possible d'effectuer des mises à jour, des suppressions et des insertions à l'aide de requêtes SQL.
ODBC Concurrency Type (KAGPROP_CONCURRENCY) | Indique la méthode utilisée pour réduire les problèmes potentiels causés par deux tentatives simultanées d'accès aux mêmes données de la source de données.
BLOB accessibility on Forward-Only cursor (KAGPROP_BLOBSONFOCURSOR) | Indique si les champs BLOB sont accessibles lorsqu'un curseur à défilement en avant seulement est utilisé.
Include SQL_FLOAT, SQL_DOUBLE, and SQL_REAL in QBU WHERE clauses (KAGPROP_INCLUDENONEXACT) | Indique s'il est possible d'inclure des valeurs SQL_FLOAT, SQL_DOUBLE et SQL_REAL dans une clause QBU WHERE.
Se positionner sur la dernière ligne après une insertion (KAGPROP_POSITIONONNEWROW) | Indique qu'après l'insertion d'un nouvel enregistrement dans une table, la dernière ligne de la table devient la ligne en cours.
IRowsetChangeExtInfo (KAGPROP_IROWSETCHANGEEXTINFO) | Indique si l'interface IRowsetChange assure une prise en charge étendue des informations.
ODBC Cursor Type (KAGPROP_CURSOR) | Indique le type de curseur utilisé par un objet Recordset.
Générer un ensemble de lignes qui se prête au marshaling (KAGPROP_MARSHALLABLE) | Indique que le pilote ODBC génère un jeu d'enregistrements qui se prête au marshaling.

Texte de la commande

La façon dont vous utilisez l'objet Command dépend en grande partie de la source de données et du type de requête ou d'instruction de commande que celle-ci est en mesure d'accepter.

ODBC fournit une syntaxe spécifique pour l'appel de procédures stockées. Ainsi, pour la propriété CommandText d'un objet Command, l'argument CommandText de la méthode Execute sur un objet Connection ou l'argument Source de la méthode Open sur un objet Recordset, vous devez passer une chaîne comportant la syntaxe suivante :

"{ [ ? = ] call procedure [ ( ? [, ? [ ,  ]] ) ] }"

Chaque symbole ? fait référence à un objet de la collection Parameters. Le premier ? fait référence à l'objet Parameters(0), le suivant fait référence à l'objet Parameters(1), et ainsi de suite.

Les références aux paramètres sont facultatives et sont fonction de la structure de la procédure stockée. Si vous voulez appeler une procédure stockée ne définissant aucun paramètre, la chaîne de commande se présentera comme suit :

"{ call procedure }"

ou, si vous avez deux paramètres de requête :

"{ call procedure ( ?, ? ) }"

Si la procédure stockée renvoie une valeur, cette valeur renvoyée est considérée comme un autre paramètre. S'il y a une valeur de renvoi mais aucun paramètre de requête, la chaîne de commande se présentera comme suit :

"{ ? = call procedure }"

Enfin, s'il y a une valeur de renvoi et deux paramètres de requête, elle doit être formulée comme suit :

"{ ? = call procedure ( ?, ? ) }"

Comportement d'un objet Recordset

Les tableaux suivants répertorient les méthodes et propriétés ADO standard disponibles sur un objet Recordset ouvert à l'aide de ce fournisseur.

Pour plus d'informations sur le comportement d'un objet Recordset dans la configuration de votre fournisseur, exécutez la méthode Supports et énumérez la collection Properties de l'objet Recordset pour déterminer les propriétés dynamiques propres au fournisseur disponibles.

Disponibilité des propriétés standard de l'objet Recordset ADO :

Propriété | Défilement vers l'avant seulement | Dynamique | Jeu de clés | Statique
AbsolutePage | non disponible | non disponible | lecture/écriture | lecture/écriture
AbsolutePosition | non disponible | non disponible | lecture/écriture | lecture/écriture
ActiveConnection | lecture/écriture | lecture/écriture | lecture/écriture | lecture/écriture
BOF | lecture seule | lecture seule | lecture seule | lecture seule
Bookmark | non disponible | non disponible | lecture/écriture | lecture/écriture
CacheSize | lecture/écriture | lecture/écriture | lecture/écriture | lecture/écriture
CursorLocation | lecture/écriture | lecture/écriture | lecture/écriture | lecture/écriture
CursorType | lecture/écriture | lecture/écriture | lecture/écriture | lecture/écriture
EditMode | lecture seule | lecture seule | lecture seule | lecture seule
Filter | lecture/écriture | lecture/écriture | lecture/écriture | lecture/écriture
LockType | lecture/écriture | lecture/écriture | lecture/écriture | lecture/écriture
MarshalOptions | lecture/écriture | lecture/écriture | lecture/écriture | lecture/écriture
MaxRecords | lecture/écriture | lecture/écriture | lecture/écriture | lecture/écriture
PageCount | lecture/écriture | non disponible | lecture seule | lecture seule
PageSize | lecture/écriture | lecture/écriture | lecture/écriture | lecture/écriture
RecordCount | lecture/écriture | non disponible | lecture seule | lecture seule
Source | lecture/écriture | lecture/écriture | lecture/écriture | lecture/écriture
State | lecture seule | lecture seule | lecture seule | lecture seule
Status | lecture seule | lecture seule | lecture seule | lecture seule

Les propriétés AbsolutePosition et AbsolutePage sont accessibles en écriture seule lorsque ADO est utilisé avec la version 1.0 du fournisseur Microsoft OLE DB pour ODBC.

Disponibilité des méthodes standard de l'objet Recordset ADO :

Méthode | Défilement vers l'avant seulement | Dynamique | Jeu de clés | Statique
AddNew | Oui | Oui | Oui | Oui
Cancel | Oui | Oui | Oui | Oui
CancelBatch | Oui | Oui | Oui | Oui
CancelUpdate | Oui | Oui | Oui | Oui
Clone | Non | Non | Oui | Oui
Close | Oui | Oui | Oui | Oui
Delete | Oui | Oui | Oui | Oui
GetRows | Oui | Oui | Oui | Oui
Move | Oui | Oui | Oui | Oui
MoveFirst | Oui | Oui | Oui | Oui
MoveLast | Non | Oui | Oui | Oui
MoveNext | Oui | Oui | Oui | Oui
MovePrevious | Non | Oui | Oui | Oui
NextRecordset* | Oui | Oui | Oui | Oui
Open | Oui | Oui | Oui | Oui
Requery | Oui | Oui | Oui | Oui
Resync | Non | Non | Oui | Oui
Supports | Oui | Oui | Oui | Oui
Update | Oui | Oui | Oui | Oui
UpdateBatch | Oui | Oui | Oui | Oui

*Non prise en charge pour les bases de données Microsoft Access.

Propriétés dynamiques

Le fournisseur Microsoft OLE DB Provider pour ODBC insère plusieurs propriétés dynamiques dans la collection Properties des objets non ouverts Connection, Recordset et Command.

Les tableaux ci-dessous constituent un index croisé des noms ADO et OLE DB de chaque propriété dynamique. Le guide OLE DB Programmer's Reference fait référence à un nom de propriété ADO par le terme « Description ». Vous trouverez davantage d'informations sur ces propriétés dans le guide OLE DB Programmer's Reference. Recherchez le nom de la propriété OLE DB dans l'Index ou consultez l'Annexe C : Propriétés OLE DB.

Propriétés dynamiques de l'objet Connection

Les propriétés suivantes sont ajoutées à la collection Properties de l'objet Connection.

Nom de propriété ADO | Nom de propriété OLE DB
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

Propriétés dynamiques des objets Recordset

Les propriétés suivantes sont ajoutées à la collection Properties de l'objet Recordset.

Nom de propriété ADO | Nom de propriété OLE DB
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_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

Propriétés dynamiques des objets Command

Les propriétés suivantes sont ajoutées à la collection Properties de l'objet Command.

Nom de propriété ADO | Nom de propriété OLE DB
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

Voir aussi Pour obtenir des précisions sur l'implémentation et des informations fonctionnelles sur le fournisseur Microsoft OLE DB Provider pour ODBC, consultez la documentation de Microsoft OLE DB Provider for ODBC et le guide Microsoft OLE DB Programmer's Reference dans le kit de développement MDAC ou visitez le site Web Universal Data Access.

Voir aussi

Command, objet | CommandText, propriété | Connection, objet | ConnectionString, propriété | Execute, méthode (Command ADO) | Open, méthode (Recordset ADO) | Parameters, collection | Properties, collection | Provider, propriété | Recordset, objet | Supports, méthode


Microsoft OLE DB Provider pour le service d'indexation Microsoft

Microsoft OLE DB Provider pour le service d'indexation Microsoft permet d'accéder par programmation et en lecture seule au système de fichiers et aux données Web indexées par le service d'indexation Microsoft. Les applications ADO peuvent émettre des requêtes SQL pour extraire des informations sur les propriétés et le contenu des fichiers.

Le fournisseur est libre de thread et compatible avec Unicode.

Paramètres de la chaîne de connexion

Pour vous connecter à ce fournisseur, définissez l'argument Provider= de la propriété ConnectionString de la manière suivante :

MSIDXS

La lecture de la propriété Provider renvoie également cette chaîne.

Chaîne de connexion typique

Voici un exemple de chaîne de connexion pour ce fournisseur :

"Provider=MSIDXS;Data Source=myCatalog;Locale Identifier=nnnn;"

Cette chaîne comprend les mots clés suivants :

Mot clé | Description
Provider | Spécifie le fournisseur OLE DB Provider pour le service d'indexation Microsoft. Généralement, il s'agit du seul mot clé spécifié dans la chaîne de connexion.
Data Source | Spécifie le nom de catalogue du service d'indexation. Si ce mot clé n'est pas spécifié, le catalogue système par défaut est utilisé.
Locale Identifier | Indique un nombre de 32 bits unique (par exemple, 1033) qui spécifie des préférences concernant la langue de l'utilisateur. Ces préférences indiquent le format des dates et des heures, le mode de tri alphabétique, le mode de comparaison des chaînes, etc. Si ce mot clé n'est pas spécifié, l'identificateur local du système est utilisé.

Texte de la commande

La syntaxe des requêtes SQL du service d'indexation comprend les extensions de l'instruction SQL-92 SELECT et ses clauses FROM et WHERE. Les résultats des requêtes sont renvoyés via des ensembles de lignes OLE DB, qui peuvent être consommés par ADO et manipulés comme des objets Recordset.

Vous pouvez rechercher des termes ou des phrases, ou utiliser des caractères génériques pour rechercher des modèles ou racines de mot. La logique de recherche peut être basée sur des décisions de type Boolean, le poids des mots ou la proximité d'autres mots. Vous pouvez également rechercher du texte libre pour trouver des correspondances en fonction de la signification des mots (et non pas d'un mot précis).

Le dialecte propre aux commandes est documenté dans le guide Microsoft Indexing Service Reference.

Le fournisseur ne gère ni les appels à des procédures stockées, ni les noms de tables simples (par exemple, la propriété CommandType est toujours adCmdText).

Comportement d'un objet Recordset

Les tableaux suivants répertorient les fonctionnalités disponibles sur un objet Recordset ouvert à l'aide de ce fournisseur. Seul le type de curseur Statique (adOpenStatic) peut être utilisé.

Pour plus d'informations sur le comportement d'un objet Recordset dans la configuration de votre fournisseur, exécutez la méthode Supports et énumérez la collection Properties de l'objet Recordset pour déterminer les propriétés dynamiques propres au fournisseur disponibles.

Disponibilité des propriétés standard de l'objet Recordset ADO :

Propriété | Disponibilité
AbsolutePage | lecture/écriture
AbsolutePosition | lecture/écriture
ActiveConnection | lecture seule
BOF | lecture seule
Bookmark* | lecture/écriture
CacheSize | lecture/écriture
CursorLocation | toujours adUseServer
CursorType | toujours adOpenStatic
EditMode | toujours adEditNone
EOF | lecture seule
Filter | lecture/écriture
LockType | lecture/écriture
MarshalOptions | non disponible
MaxRecords | lecture/écriture
PageCount | lecture seule
PageSize | lecture/écriture
RecordCount | lecture seule
Source | lecture/écriture
State | lecture seule
Status | lecture seule

*Les signets doivent être activés sur le fournisseur pour permettre cette fonctionnalité sur l'objet Recordset.

Disponibilité des méthodes standard de l'objet Recordset ADO :

Méthode | Disponible ?
AddNew | Non
Cancel | Oui
CancelBatch | Non
CancelUpdate | Non
Clone | Oui
Close | Oui
Delete | Non
GetRows | Oui
Move | Oui
MoveFirst | Oui
NextRecordset | Oui
Open | Oui
Requery | Oui
Resync | Oui
Supports | Oui
Update | Non
UpdateBatch | Non

Voir aussi Pour obtenir des précisions sur l'implémentation et des informations fonctionnelles sur le fournisseur Microsoft OLE DB Provider pour le service d'indexation Microsoft, consultez le guide Microsoft OLE DB Programmer's Reference et la documentation sur le service d'indexation Microsoft, ou visitez la page Web Microsoft Internet Information Services.

Voir aussi

CommandType, propriété | ConnectionString, propriété | Properties, collection | Provider, propriété | Recordset, objet | Supports, méthode


Microsoft OLE DB Provider pour le service Microsoft Active Directory

Le fournisseur Microsoft Active Directory Service Interfaces (ADSI) permet à ADO de se connecter à des répertoires hétérogènes via ADSI. Cela permet aux applications ADO d'accéder en lecture seule aux services Annuaire de Microsoft Windows NT 4.0 et Microsoft Windows 2000 en plus des services d'annuaire compatibles LDAP et des services Annuaire de Novell. ADSI est basé sur un modèle de fournisseur et, si un nouveau fournisseur permet l'accès à un autre répertoire, l'application ADO est en mesure d'y accéder d'une manière homogène. Le fournisseur ADSI est libre de thread et compatible avec Unicode.

Paramètres de la chaîne de connexion

Pour vous connecter à ce fournisseur, définissez l'argument Provider de la propriété ConnectionString de la manière suivante :

ADSDSOObject

La lecture de la propriété Provider renvoie également cette chaîne.

Chaîne de connexion typique

Voici un exemple de chaîne de connexion pour ce fournisseur :

"Provider=ADSDSOObject;User ID=userName;Password=userPassword;"

Cette chaîne comprend les mots clés suivants :

Mot-clé | Description
Provider | Spécifie le fournisseur Microsoft OLE DB Provider pour le service Microsoft Active Directory
User ID | Spécifie le nom de l'utilisateur. Si ce mot clé est omis, les informations de connexion en cours sont utilisées.
Password | Spécifie le mot de passe de l'utilisateur. Si ce mot clé est omis, les informations de connexion en cours sont utilisées.

Texte de la commande

Le fournisseur reconnaît une chaîne de commande composée de quatre éléments conformément à la syntaxe suivante :

"Root; Filter; Attributes[; Scope]"
Valeur | Description
Root | Indique l'objet ADsPath à partir duquel commence la recherche (c'est-à-dire, la racine de la recherche).
Filter | Indique le filtre de recherche au format RFC 1960.
Attributes | Indique une liste d'attributs à renvoyer, séparés par des virgules.
Scope Facultatif. Donnée de type String qui spécifie l'étendue de la recherche. Il peut s'agir de :
  • Base — recherche dans l'objet de base uniquement (racine de la recherche).
  • OneLevel — recherche sur un niveau uniquement.
  • Subtree — recherche dans l'ensemble du sous-arbre.

Par exemple :

"<LDAP://DC=ArcadiaBay,DC=COM>;(objectClass=*);sn, givenName; subtree"

Le fournisseur prend également en charge le texte de commande SQL SELECT. Par exemple :

"SELECT title, telephoneNumber From 'LDAP://DC=Microsoft, DC=COM' WHERE
objectClass='user' AND objectCategory='Person'"

Le fournisseur ne gère ni les appels à des procédures stockées, ni les noms de tables simples (par exemple, la propriété CommandType est toujours adCmdText). Reportez-vous à la documentation d'Active Directory Service Interfaces pour une description détaillée des divers éléments du texte de la commande.

Comportement d'un objet Recordset

Les tableaux suivants répertorient les fonctionnalités disponibles sur un objet Recordset ouvert à l'aide de ce fournisseur. Seul le type de curseur Statique (adOpenStatic) peut être utilisé.

Pour plus d'informations sur le comportement d'un objet Recordset dans la configuration de votre fournisseur, exécutez la méthode Supports et énumérez la collection Properties de l'objet Recordset pour déterminer les propriétés dynamiques propres au fournisseur disponibles.

Disponibilité des propriétés standard de l'objet Recordset ADO :

Propriété | Disponibilité
AbsolutePage | lecture/écriture
AbsolutePosition | lecture/écriture
ActiveConnection | lecture seule
BOF | lecture seule
Bookmark | lecture/écriture
CacheSize | lecture/écriture
CursorLocation | toujours adUseServer
CursorType | toujours adOpenStatic
EditMode | toujours adEditNone
EOF | lecture seule
Filter | lecture/écriture
LockType | lecture/écriture
MarshalOptions | non disponible
MaxRecords | lecture/écriture
PageCount | lecture seule
PageSize | lecture/écriture
RecordCount | lecture seule
Source | lecture/écriture
State | lecture seule
Status | lecture seule

Disponibilité des méthodes standard de l'objet Recordset ADO :

Méthode | Disponible ?
AddNew | Non
Cancel | Non
CancelBatch | Non
CancelUpdate | Non
Clone | Oui
Close | Oui
Delete | Non
GetRows | Oui
Move | Oui
MoveFirst | Oui
MoveLast | Oui
MoveNext | Oui
MovePrevious | Oui
NextRecordset | Oui
Open | Oui
Requery | Oui
Resync | Oui
Supports | Oui
Update | Non
UpdateBatch | Non

Voir aussi Pour plus d'informations générales sur ADSI ou des informations spécifiques se rapportant au fournisseur, consultez la documentation de Active Directory Service Interfaces ou visitez la page Web ADSI.

Voir aussi

CommandType, propriété | ConnectionString, propriété | Properties, collection | Provider, propriété | Recordset, objet | Supports, méthode


Microsoft OLE DB Provider pour Microsoft Jet

Le fournisseur OLE DB pour Microsoft Jet permet à ADO d'accéder aux bases de données Microsoft Jet.

Paramètres de la chaîne de connexion

Pour vous connecter à ce fournisseur, définissez l'argument Provider de la propriété ConnectionString de la manière suivante :

Microsoft.Jet.OLEDB.4.0

La lecture de la propriété Provider renvoie également cette chaîne.

Chaîne de connexion typique

Voici un exemple de chaîne de connexion pour ce fournisseur :

"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=databaseName;User ID=userName;Password=userPassword;"

Cette chaîne comprend les mots clés suivants :

Mot clé | Description
Provider | Spécifie le fournisseur OLE DB Provider pour Microsoft Jet.
Data Source | Spécifie le chemin et le nom de la base de données (par exemple, c:\Northwind.mdb).
User ID | Spécifie le nom de l'utilisateur. Si ce mot clé n'est pas spécifié, la chaîne « admin » est utilisée par défaut.
Password | Spécifie le mot de passe de l'utilisateur. Si ce mot clé n'est pas spécifié, la chaîne vide (« ») est utilisée par défaut.

Paramètres de connexion propres au fournisseur

Outre les paramètres de connexion définis par ADO, le fournisseur OLE DB pour Microsoft Jet prend en charge plusieurs propriétés dynamiques propres au fournisseur. Comme les autres paramètres de connexion, ceux-ci peuvent être définis via la collection Properties de l'objet Connection ou dans la chaîne de connexion.

Le tableau suivant répertorie ces propriétés et indique le nom de la propriété OLE DB correspondante entre parenthèses.

Parameter | Description
Jet OLEDB:Compact Reclaimed Space Amount (DBPROP_JETOLEDB_COMPACTFREESPACESIZE) | Indique en octets la quantité estimée d'espace pouvant être libérée en compactant la base de données. Cette valeur n'est valide qu'après l'établissement d'une connexion à la base de données.
Jet OLEDB:Connection Control (DBPROP_JETOLEDB_CONNECTIONCONTROL) | Indique si les utilisateurs peuvent se connecter à la base de données.
Jet OLEDB:Create System Database (DBPROP_JETOLEDB_CREATESYSTEMDATABASE) | Indique si une base de données système doit être créée lors de la création d'une nouvelle source de données.
Jet OLEDB:Database Locking Mode (DBPROP_JETOLEDB_DATABASELOCKMODE) | Indique le mode de verrouillage de la base de données. Le premier utilisateur qui ouvre la base de données détermine le mode de verrouillage à utiliser tant que la base reste ouverte.
Jet OLEDB:Database Password (DBPROP_JETOLEDB_DATABASEPASSWORD) | Indique le mot de passe de la base de données.
Jet OLEDB:Don't Copy Locale on Compact (DBPROP_JETOLEDB_COMPACT_DONTCOPYLOCALE) | Indique si Microsoft Jet doit copier les informations relatives aux paramètres régionaux lors du compactage d'une base de données.
Jet OLEDB:Encrypt Database (DBPROP_JETOLEDB_ENCRYPTDATABASE) | Indique si une base de données compactée doit être cryptée. Si cette propriété n'est pas définie, la base de données compactée est cryptée si la base d'origine l'était.
Jet OLEDB:Engine Type (DBPROP_JETOLEDB_ENGINE) | Indique le moteur de stockage utilisé pour accéder au magasin de données en cours.
Jet OLEDB:Exclusive Async Delay (DBPROP_JETOLEDB_EXCLUSIVEASYNCDELAY) | Indique la durée maximale, en millisecondes, pendant laquelle Jet peut retarder les opérations d'écriture asynchrone sur le disque lorsque la base de données est ouverte en mode exclusif. Cette propriété est ignorée si Jet OLEDB:Flush Transaction Timeout n'a pas la valeur 0.
Jet OLEDB:Flush Transaction Timeout (DBPROP_JETOLEDB_FLUSHTRANSACTIONTIMEOUT) | Indique le délai au bout duquel les données stockées en mémoire cache en vue de leur écriture asynchrone sont effectivement écrites sur le disque. Ce paramètre prévaut sur Jet OLEDB:Shared Async Delay et Jet OLEDB:Exclusive Async Delay.
Jet OLEDB:Global Bulk Transactions (DBPROP_JETOLEDB_GLOBALBULKNOTRANSACTIONS) | Indique si les transactions SQL en bloc sont exécutées.
Jet OLEDB:Global Partial Bulk Ops (DBPROP_JETOLEDB_GLOBALBULKPARTIAL) | Indique le mot de passe utilisé pour ouvrir la base de données.
Jet OLEDB:Implicit Commit Sync (DBPROP_JETOLEDB_IMPLICITCOMMITSYNC) | Indique si les modifications effectuées dans des transactions implicites internes sont écrites en mode synchrone ou asynchrone.
Jet OLEDB:Lock Delay (DBPROP_JETOLEDB_LOCKDELAY) | Indique en millisecondes le temps d'attente avant d'essayer d'acquérir un verrou après l'échec de la tentative précédente.
Jet OLEDB:Lock Retry (DBPROP_JETOLEDB_LOCKRETRY) | Indique combien de fois une tentative d'accès à une page verrouillée peut être renouvelée.
Jet OLEDB:Max Buffer Size (DBPROP_JETOLEDB_MAXBUFFERSIZE) | Indique la quantité maximale de mémoire, en kilo-octets, que peut utiliser Jet avant de commencer à écrire les modifications sur le disque.
Jet OLEDB:Max Locks Per File (DBPROP_JETOLEDB_MAXLOCKSPERFILE) | Indique le nombre maximal de verrous que Jet peut placer dans une base de données. La valeur par défaut est 9500.
Jet OLEDB:New Database Password (DBPROP_JETOLEDB_NEWDATABASEPASSWORD) | Indique le nouveau mot de passe à définir pour la base de données. L'ancien mot de passe est stocké dans Jet OLEDB:Database Password.
Jet OLEDB:ODBC Command Time Out (DBPROP_JETOLEDB_ODBCCOMMANDTIMEOUT) | Indique le délai en millisecondes au bout duquel une requête ODBC à distance en provenance de Jet est abandonnée.
Jet OLEDB:Page Locks to Table Lock (DBPROP_JETOLEDB_PAGELOCKSTOTABLELOCK) | Indique combien de pages doivent être verrouillées dans une transaction avant que Jet n'essaie de promouvoir le verrou au rang de verrou de table. Si cette valeur est 0, le verrou n'est jamais promu.
Jet OLEDB:Page Timeout (DBPROP_JETOLEDB_PAGETIMEOUT) | Indique en millisecondes le délai au bout duquel Jet vérifie si son cache est périmé par rapport au fichier de base de données.
Jet OLEDB:Recycle Long-Valued Pages (DBPROP_JETOLEDB_RECYCLELONGVALUEPAGES) | Indique si Jet doit insister pour récupérer l'espace des pages BLOB lorsque celles-ci sont libérées.
Jet OLEDB:Registry Path (DBPROP_JETOLEDB_REGPATH) | Indique la clé du Registre Windows qui contient les valeurs relatives au moteur de base de données Microsoft Jet.
Jet OLEDB:Reset ISAM Stats (DBPROP_JETOLEDB_RESETISAMSTATS) | Indique si le schéma Recordset DBSCHEMA_JETOLEDB_ISAMSTATS doit réinitialiser ses compteurs de performances après avoir renvoyé les informations relatives aux performances.
Jet OLEDB:Shared Async Delay (DBPROP_JETOLEDB_SHAREDASYNCDELAY) | Indique la durée maximale, en millisecondes, pendant laquelle Jet peut retarder les opérations d'écriture asynchrone sur le disque lorsque la base de données est ouverte en mode multi-utilisateurs.
Jet OLEDB:System Database (DBPROP_JETOLEDB_SYSDBPATH) | Indique le chemin d'accès et le nom du fichier d'informations du groupe de travail (base de données système).
Jet OLEDB:Transaction Commit Mode (DBPROP_JETOLEDB_TXNCOMMITMODE) | Indique si Jet écrit les données sur le disque en mode synchrone ou asynchrone lorsqu'une transaction est exécutée.
Jet OLEDB:User Commit Sync (DBPROP_JETOLEDB_USERCOMMITSYNC) | Indique si les modifications effectuées dans les transactions sont écrites en mode synchrone ou asynchrone.

Propriétés des objets Recordset et Command propres au fournisseur

Le fournisseur Jet prend également en charge plusieurs propriétés propres au fournisseur pour les objets Recordset et Command properties. L'accès à ces propriétés et leur définition s'effectuent via la collection Properties de l'objet Recordset ou Command. Le tableau ci-dessous répertorie le nom des propriétés ADO et indique entre parenthèses le nom des propriétés OLE DB correspondantes.

Nom de la propriété | Description
Jet OLEDB:Bulk Transactions (DBPROP_JETOLEDB_BULKNOTRANSACTIONS) | Indique si des opérations SQL en bloc sont exécutées. Les opérations en bloc volumineuses peuvent échouer en raison des délais d'accès aux ressources.
Jet OLEDB:Enable Fat Cursors (DBPROP_JETOLEDB_ENABLEFATCURSOR) | Indique si Jet doit placer plusieurs lignes en mémoire cache lors du remplissage d'un jeu d'enregistrements pour des sources de lignes distantes.
Jet OLEDB:Fat Cursor Cache Size (DBPROP_JETOLEDB_FATCURSORMAXROWS) | Indique le nombre de lignes à placer en mémoire cache lorsque la mise en cache des lignes de magasins de données distants est activée. Cette valeur est ignorée si Jet OLEDB:Enable Fat Cursors n'a pas la valeur True.
Jet OLEDB:Inconsistent (DBPROP_JETOLEDB_INCONSISTENT) | Indique si les résultats de requête permettent des mises à jour incohérentes.
Jet OLEDB:Locking Granularity (DBPROP_JETOLEDB_LOCKGRANULARITY) | Indique si une table est ouverte avec un verrouillage au niveau de la ligne.
Jet OLEDB:ODBC Pass-Through Statement (DBPROP_JETOLEDB_ODBCPASSTHROUGH) | Indique que Jet doit passer tel quel le texte SQL d'un objet Command à la base de données principale.
Jet OLEDB:Partial Bulk Ops (DBPROP_JETOLEDB_BULKPARTIAL) | Indique le comportement de Jet lorsque des opérations SQL DML échouent.
Jet OLEDB:Pass Through Query Bulk-Op (DBPROP_JETOLEDB_PASSTHROUGHBULKOP) | Indique si les requêtes qui ne renvoient pas un objet Recordset sont passées telles quelles à la source de données.
Jet OLEDB:Pass Through Query Connect String (DBPROP_JETOLEDB_ODBCPASSTHROUGHCONNECTSTRING) | Indique la chaîne de connexion Jet utilisée pour la connexion à un magasin de données distant. Cette valeur est ignorée si Jet OLEDB:ODBC Pass-Through Statement n'a pas la valeur True.
Jet OLEDB:Stored Query (DBPROP_JETOLEDB_STOREDQUERY) | Indique si le texte de la commande doit être interprété comme une requête stockée et non comme une commande SQL.
Jet OLEDB:Validate Rules On Set (DBPROP_JETOLEDB_VALIDATEONSET) | Indique si les règles de validation Jet sont évaluées lorsque les données de la colonne sont définies ou lorsque les modifications sont exécutées dans la base de données.

Par défaut, le fournisseur OLE DB pour Microsoft Jet ouvre les bases de données Microsoft Jet en mode lecture/écriture. Pour ouvrir une base de données en mode lecture seule, affectez à la propriété Mode de l'objet Connection ADO la valeur adModeRead.

Utilisation de l'objet Command

Le texte de commande de l'objet Command utilise le langage SQL de Microsoft Jet. Dans le texte de commande, vous pouvez spécifier des requêtes renvoyant des lignes, des requêtes d'action et des noms de tables. Toutefois, les procédures stockées ne sont pas prises en charge et ne peuvent donc pas être spécifiées.

Comportement d'un objet Recordset

Le moteur de base de données Microsoft Jet ne prend pas en charge les curseurs dynamiques. Par conséquent, OLE DB Provider pour Microsoft Jet n'est pas à même de gérer le type de curseur adLockDynamic. Lorsqu'un curseur dynamique est requis, le fournisseur renvoie un curseur à jeu de clés et redéfinit la propriété CursorType pour indiquer le type d'objet Recordset renvoyé. Par ailleurs, si un objet Recordset pouvant être mis à jour est requis (LockType a la valeur adLockOptimistic, adLockBatchOptimistic ou adLockPessimistic), le fournisseur renvoie également un curseur à jeu de clés et redéfinit la propriété CursorType.

Propriétés dynamiques

Le fournisseur Microsoft OLE DB Provider pour Microsoft Jet insère plusieurs propriétés dynamiques dans la collection Properties des objets non ouverts Connection, Recordset et Command.

Les tableaux ci-dessous constituent un index croisé des noms ADO et OLE DB de chaque propriété dynamique. Le guide OLE DB Programmer's Reference fait référence à un nom de propriété ADO par le terme « Description ». Vous trouverez davantage d'informations sur ces propriétés dans le guide OLE DB Programmer's Reference. Recherchez le nom de la propriété OLE DB dans l'Index ou consultez l'Annexe C : Propriétés OLE DB.

Propriétés dynamiques de l'objet Connection

Les propriétés suivantes sont ajoutées à la collection Properties de l'objet Connection.

Nom de propriété ADO | Nom de propriété OLE DB
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

Propriétés dynamiques des objets Recordset

Les propriétés suivantes sont ajoutées à la collection Properties de l'objet Recordset.

Nom de propriété ADO | Nom de propriété OLE DB
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

Propriétés dynamiques des objets Command

Les propriétés suivantes sont ajoutées à la collection Properties de l'objet Command.

Nom de propriété ADO | Nom de propriété OLE DB
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

Voir aussi Pour des informations spécifiques sur l'implémentation et les fonctionnalités du fournisseur OLE DB pour Microsoft Jet, consultez la documentation OLE DB Provider for Microsoft Jet dans le Kit de développement MDAC.

Voir aussi

ConnectionString, propriété | Provider, propriété | Recordset, objet

OLE DB Provider pour Microsoft Jet dans la documentation OLE DB


Microsoft OLE DB Provider pour SQL Server

Le fournisseur Microsoft OLE DB Provider pour SQL Server, SQLOLEDB, permet à ADO d'accéder à Microsoft SQL Server.

Paramètres de la chaîne de connexion

Pour vous connecter à ce fournisseur, définissez l'argument Provider de la propriété ConnectionString de la manière suivante :

SQLOLEDB

Cette valeur peut également être définie ou lue à l'aide de la propriété Provider.

Chaîne de connexion typique

Voici un exemple de chaîne de connexion pour ce fournisseur :

"Provider=SQLOLEDB;Data Source=serverName;"
Initial Catalog=databaseName;
User ID=userName;Password=userPassword;"

Cette chaîne comprend les mots clés suivants :

Mot clé | Description
Provider | Spécifie le fournisseur OLE DB Provider pour SQL Server.
Data Source ou Server | Spécifie le nom d'un serveur.
Initial Catalog ou Database | Spécifie le nom d'une base de données sur le serveur.
User ID ou uid | Spécifie le nom de l'utilisateur (pour l'authentification SQL Server).
Password ou pwd | Spécifie le mot de passe de l'utilisateur (pour l'authentification SQL Server).

Paramètres de connexion propres au fournisseur

Outre les paramètres de connexion définis par ADO, le fournisseur prend en charge plusieurs paramètres de connexion propres au fournisseur. Comme les propriétés de connexion ADO, ces propriétés propres au fournisseur peuvent être définies via la collection Properties d'un objet Connection ou dans la chaîne de connexion ConnectionString.

Paramètre | Description
Trusted_Connection | Indique le mode d'authentification de l'utilisateur. La valeur de cette propriété peut être Yes ou No. La valeur par défaut est No. Si la valeur de cette propriété est Yes, SQLOLEDB utilise le mode d'authentification de Microsoft Windows NT pour autoriser l'accès de l'utilisateur à la base de données SQL Server définie par les valeurs des propriétés Location et Datasource. Si la valeur de cette propriété est No, SQLOLEDB utilise le mode mixte pour autoriser l'accès de l'utilisateur à la base de données SQL Server. Le nom et le mot de passe de connexion à SQL Server sont spécifiés dans les propriétés User Id et Password.
Current Language | Indique un nom de langue du serveur SQL. Identifie la langue utilisée pour la sélection et le formatage de messages système. Si la langue n'est pas installée sur le serveur SQL, l'ouverture de la connexion échoue.
Network Address | Indique l'adresse réseau du serveur SQL spécifié dans la propriété Location.
Network Library | Indique le nom de la bibliothèque réseau (DLL) utilisée pour communiquer avec le serveur SQL. Il ne doit inclure ni le chemin ni l'extension du fichier .dll. La bibliothèque par défaut est fournie par la configuration du client SQL Server.
Use Procedure for Prepare | Détermine si SQL Server crée des procédures stockées temporaires lorsque des commandes sont préparées (par la propriété Prepared).
Auto Translate | Indique si les caractères OEM/ANSI sont convertis. Cette propriété peut prendre la valeur True ou False. La valeur par défaut est True. Si cette propriété a la valeur True, SQLOLEDB effectue la conversion des caractères OEM/ANSI lorsque des chaînes de caractères sur plusieurs octets sont extraites du serveur SQL ou envoyées à celui-ci. Si elle a la valeur False, SQLOLEDB n'effectue pas la conversion des caractères OEM/ANSI dans les chaînes de caractères sur plusieurs octets.
Packet Size | Indique la taille d'un paquet réseau en octets. La valeur de la propriété doit être comprise entre 512 et 32767. La taille de paquet réseau SQLOLEDB par défaut est de 4096.
Application Name | Indique le nom de l'application cliente.
Workstation ID | Chaîne identifiant la station de travail.

Utilisation de l'objet Command

SQLOLEDB accepte un amalgame de syntaxe ODBC, ANSI et de syntaxe Transact-SQL spécifique à SQL Server. Par exemple, l'instruction SQL suivante utilise une séquence d'échappement SQL ODBC pour spécifier la fonction de chaîne LCASE :

SELECT customerid={fn LCASE(CustomerID)} FROM Customers

LCASE renvoie une chaîne de caractères, remplaçant tous les caractères majuscules par les caractères minuscules correspondants. La fonction de chaîne SQL ANSI LOWER effectue la même opération, et l'instruction SQL suivante est par conséquent l'équivalent ANSI de l'instruction ODBC précédente :

SELECT customerid=LOWER(CustomerID) FROM Customers

SQLOLEDB traite l'une ou l'autre instruction lorsque spécifiée comme texte d'une commande.

Procédures stockées

Lorsque vous exécutez une procédure stockée de SQL Server à l'aide d'une commande SQLOLEDB, vous devez utiliser la séquence d'échappement d'appel de procédure dans le texte de la commande. SQLOLEDB utilise alors le mécanisme d'appel de procédure distant de SQL Server pour optimiser le traitement de la commande. Par exemple, il est préférable d'utiliser l'instruction SQL ODBC suivante comme texte de commande plutôt que l'équivalent Transact-SQL :

SQL ODBC

{call SalesByCategory('Produce', '1995')}

Transact-SQL

EXECUTE SalesByCategory 'Produce', '1995'

Comportement d'un objet Recordset

SQLOLEDB ne peut pas utiliser les curseurs SQL Server pour gérer les résultats multiples générés par de nombreuses commandes. Si un utilisateur sollicite un jeu d'enregistrements nécessitant un curseur SQL Server, une erreur se produit si le texte de la commande utilisée génère un résultat comportant plusieurs jeux d'enregistrements.

Les curseurs SQL Server prennent en charge les jeux d'enregistrements SQLOLEDB pouvant défiler. SQL Server impose des restrictions pour les curseurs affectés par les modifications effectuées par d'autres utilisateurs dans la base de données. Ainsi, les lignes de certains curseurs ne peuvent pas être triées et la création d'un jeu d'enregistrements à l'aide d'une commande contenant une clause SQL ORDER BY peut échouer.

Propriétés dynamiques

Le fournisseur Microsoft OLE DB Provider pour SQL Server insère plusieurs propriétés dynamiques dans la collection Properties des objets non ouverts Connection, Recordset et Command.

Les tableaux suivants constituent un index croisé des noms ADO et OLE DB de chaque propriété dynamique. Le guide OLE DB Programmer's Reference fait référence à un nom de propriété ADO par le terme « Description ». Vous trouverez davantage d'informations sur ces propriétés dans le guide OLE DB Programmer's Reference. Recherchez le nom de la propriété OLE DB dans l'Index ou consultez l'Annexe C : Propriétés OLE DB.

Propriétés dynamiques de l'objet Connection

Les propriétés suivantes sont ajoutées à la collection Properties de l'objet Connection.

Nom de propriété ADO | Nom de propriété OLE DB
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

Propriétés dynamiques des objets Recordset

Les propriétés suivantes sont ajoutées à la collection Properties de l'objet Recordset.

Nom de propriété ADO | Nom de propriété OLE DB
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

Propriétés dynamiques des objets Command

Les propriétés suivantes sont ajoutées à la collection Properties de l'objet Command.

Nom de propriété ADO | Nom de propriété OLE DB
Access Order | DBPROP_ACCESSORDER
Base Path | SSPROP_STREAM_BASEPATH
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
Content Type | SSPROP_STREAM_CONTENTTYPE
Cursor Auto Fetch | SSPROP_CURSORAUTOFETCH
Defer Column | DBPROP_DEFERRED
Defer Prepare | SSPROP_DEFERPREPARE
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 | DBPROP_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
Output Encoding Property | DBPROP_OUTPUTENCODING
Output Stream Property | DBPROP_OUTPUTSTREAM
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 Cursor | DBPROP_SERVERCURSOR
Server Data on Insert | DBPROP_SERVERDATAONINSERT
Skip Deleted Bookmarks | DBPROP_BOOKMARKSKIP
Strong Row Identity | DBPROP_STRONGIDENTITY
Updatability | DBPROP_UPDATABILITY
Use Bookmarks | DBPROP_BOOKMARKS
XML Root | SSPROP_STREAM_XMLROOT
XSL | SSPROP_STREAM_XSL

Pour des informations spécifiques sur l'implémentation et les fonctionnalités du fournisseur OLE DB de Microsoft SQL Server, consultez la documentation OLE DB Provider for SQL Server dans la section OLE DB du Kit de développement MDAC.

Voir aussi

ConnectionString, propriété | Provider, propriété | Recordset, objet

© 1998-2002 Microsoft Corporation. Tous droits réservés.


Microsoft OLE DB Provider pour Oracle

Le fournisseur Microsoft OLE DB Provider pour Oracle permet l'accès aux bases de données Oracle à ADO.

Paramètres de la chaîne de connexion

Pour vous connecter à ce fournisseur, définissez l'argument Provider de la propriété ConnectionString de la manière suivante :

MSDAORA

La lecture de la propriété Provider renvoie également cette chaîne.

Une erreur survient si une requête joindre est exécutée dans une base de données Oracle avec un curseur à jeu de clés ou dynamique. Oracle ne prend en charge que le curseur statique en lecture seule.

Chaîne de connexion typique

Voici un exemple de chaîne de connexion pour ce fournisseur :

"Provider=MSDAORA;Data Source=serverName;User ID=userName; Password=userPassword;"

Cette chaîne comprend les mots clés suivants :

Mot clé | Description
Provider | Spécifie le fournisseur OLE DB Provider pour Oracle.
Data Source | Spécifie le nom d'un serveur.
User ID | Spécifie le nom de l'utilisateur.
Password | Spécifie le mot de passe de l'utilisateur.

Paramètres de connexion propres au fournisseur

Outre les paramètres de connexion définis par ADO, le fournisseur prend en charge plusieurs paramètres de connexion propres au fournisseur. Comme les propriétés de connexion ADO, ces propriétés propres au fournisseur peuvent être définies via la collection Properties d'un objet Connection ou dans la chaîne de connexion ConnectionString.

Vous trouverez une description complète de ces paramètres dans le guide OLE DB Programmer's Reference. (L'index des propriétés dynamiques ADO établit la correspondance entre les noms de ces paramètres et les propriétés OLE DB correspondantes.)

Paramètre | Description
Window Handle | Indique le pointeur de fenêtre à utiliser pour demander la fourniture d'informations supplémentaires.
Locale Identifier | Indique un nombre de 32 bits unique (par exemple, 1033) qui spécifie des préférences concernant la langue de l'utilisateur. Ces préférences indiquent le format des dates et des heures, le mode de tri alphabétique, le mode de comparaison des chaînes, etc.
OLE DB Services | Indique un masque binaire qui spécifie les services OLE DB à activer ou désactiver.
Prompt | Indique si l'utilisateur est invité à entrer des données pendant l'établissement d'une connexion.
Extended Properties | Chaîne contenant des informations de connexion étendues propres au fournisseur. Utilisez cette propriété pour les seules informations de connexion propres au fournisseur qui ne peuvent pas être décrites au moyen du mécanisme des propriétés.

Voir aussi

ConnectionString, propriété | Provider, propriété | Recordset, objet

OLE DB Provider pour Oracle dans la section OLE DB du kit de développement MDAC


Microsoft OLE DB Provider pour Internet Publishing

Le fournisseur Microsoft OLE DB Provider pour Internet Publishing permet à ADO d'accéder à des ressources desservies par Microsoft FrontPage ou Microsoft Internet Information Server. Ces ressources comprennent des fichiers source Web tels que des fichiers HTML et des dossiers Web Windows 2000.

Paramètres de la chaîne de connexion

Pour vous connecter à ce fournisseur, définissez l'argument Provider de la propriété ConnectionString de la manière suivante :

MSDAIPP.DSO

Cette valeur peut également être définie ou lue à l'aide de la propriété Provider.

Chaîne de connexion typique

Voici un exemple de chaîne de connexion pour ce fournisseur :

"Provider=MSDAIPP.DSO;Data Source=ResourceURL;User ID=userName;Password=userPassword;"

ou

"URL=ResourceURL;User ID=userName;Password=userPassword;"

Cette chaîne comprend les mots clés suivants :

Mot clé | Description
Provider | Spécifie le fournisseur OLE DB Provider pour Internet Publishing.
Data Source ou URL | Spécifie l'URL d'un fichier ou d'un répertoire publié dans un dossier Web.
User ID | Spécifie le nom de l'utilisateur.
Password | Spécifie le mot de passe de l'utilisateur.

Si vous affectez une valeur non valide à ResourceURL dans le membre « URL= » de la chaîne de connexion, le fournisseur Internet Publishing fait automatiquement apparaître une boîte de dialogue pour vous demander de fournir une valeur correcte. Ce comportement n'est pas souhaitable pour un composant du niveau intermédiaire d'une application car il interrompt l'exécution du programme jusqu'à la disparition de la boîte de dialogue et le client semble gelé parce qu'il n'a pas reçu de réponse du composant.

Remarque Si MSDAIPP.DSO est explicitement spécifié comme valeur du fournisseur, que ce soit avec le mot clé Provider de la chaîne de connexion ou avec la propriété Provider, vous ne pouvez pas utiliser « URL= » dans la chaîne de connexion. Cela provoquerait une erreur. Spécifiez simplement l'URL comme indiqué dans la rubrique Utilisation de ADO avec OLE DB Provider pour Internet Publishing.

Voir aussi

Scénario Internet Publishing | Utilisation de ADO avec OLE DB Provider pour Internet Publishing


Microsoft Data Shaping Service pour OLE DB (ADO Service Provider)

Annexes ADO 2.5

Microsoft Data Shaping Service pour OLE DB

Le fournisseur de service Microsoft Data Shaping Service pour OLE DB prend en charge la construction d'objets Recordset hiérarchiques (mis en forme) à partir d'un fournisseur de données.

Mot clé Provider

Pour invoquer le service Microsoft Data Shaping Service pour OLE DB, spécifiez, dans la chaîne de connexion, le mot clé et la valeur ci-dessous.

"Provider=MSDataShape"

Propriétés dynamiques

Lorsque ce fournisseur de services est invoqué, les propriétés dynamiques suivantes sont ajoutées à la collection Properties de l'objet Connection.

Nom de la propriété dynamique | Description
Unique Reshape Names | Indique si les objets Recordset dont la propriété Reshape Name a la même valeur sont autorisés. Si cette propriété dynamique a la valeur True et qu'un nouvel objet Recordset est créé sous le nom d'un objet Recordset, le nom du nouvel objet Recordset est modifié pour devenir unique. En revanche, si cette propriété a la valeur False et qu'un nouvel objet Recordset est créé sous le nom d'un Recordset existant, les deux objets Recordset gardent le même nom. Par conséquent, tant que les deux objets Recordset aucun d'entre eux ne peut être remis en forme. La valeur par défaut de cette propriété est False.
Data Provider | Indique le nom du fournisseur des lignes à mettre en forme. Cette valeur peut être NONE si aucun fournisseur n'est utilisé pour fournir les lignes.

Vous pouvez également définir des propriétés dynamiques accessibles en écriture en spécifiant leur nom comme mots clés dans la chaîne de connexion,. Par exemple, en Visual Basic, définissez la propriété dynamique Data Provider avec la valeur « MSDASQL » en spécifiant :

Dim cn as New ADODB.Connection
cn.Open "Provider=MSDataShape;Data Provider=MSDASQL"

Vous pouvez également définir ou extraire une propriété dynamique en spécifiant son nom comme index de la propriété Properties. Par exemple, obtenez et imprimez la valeur courante de la propriété dynamique Data Provider, puis définissez une nouvelle valeur comme suit :

Debug.Print cn.Properties("Data Provider")
cn.Properties("Data Provider") = "MSDASQL"

Pour plus d'informations sur la mise en forme des données, consultez Mise en forme des données.

Voir aussi

Data Shaping Service pour OLE DB (dans la section OLE DB de la documentation du kit de développement MDAC)


Fournisseur de persistance Microsoft OLE DB (ADO Service Provider)

Annexes ADO 2.5

Fournisseur de persistance Microsoft OLE DB

Le Fournisseur de persistance Microsoft OLE DB permet d'enregistrer un objet Recordset dans un fichier et de restaurer ensuite cet objet à partir de ce fichier. Les informations sur le schéma, les données et les modifications en attente sont préservées.

Vous pouvez enregistrer le Recordset au format propriétaire ADTG (Advanced Data Table Gram) ou au format XML (Extensible Markup Language).

Mot clé Provider

Pour invoquer ce fournisseur, spécifiez, dans la chaîne de connexion, le mot clé et la valeur ci-dessous.

"Provider=MSPersist"

Erreurs

Les erreurs suivantes émises par ce fournisseur peuvent être détectées dans votre application.

Constante | Description
E_BADSTREAM | Le fichier à ouvrir ne présente pas un format correct (le format n'est pas ADTG ou XML).
E_CANTPERSISTROWSET | L'objet Recordset à enregistrer possède des caractéristiques qui l'empêchent d'être stocké.

Remarques

Le Fournisseur de persistance Microsoft OLE DB ne présente pas de propriétés dynamiques.

Actuellement, seuls les objets Recordset hiérarchiques et paramétrés ne peuvent pas être enregistrés.

Pour plus d'informations sur le stockage d'objets Recordset de façon permanente, consultez Persistance d'un Recordset.

Lorsqu'un objet Stream est utilisé pour ouvrir un objet Recordset, aucun paramètre autre que le paramètre Source de la méthode Open ne doit être spécifié.

Voir aussi

Fournisseur de persistance OLE DB dans la section OLE DB du kit de développement MDAC


Microsoft OLE DB Remoting Provider (ADO Service Provider)

Annexes ADO 2.5

Microsoft OLE DB Remoting Provider

Le fournisseur Microsoft OLE DB Remoting Provider permet à un utilisateur local sur un ordinateur client d'invoquer des fournisseurs de données sur un ordinateur distant. Spécifiez les paramètres du fournisseur de données pour la machine distante à la manière d'un utilisateur local sur une machine distante. Puis, spécifiez les paramètres utilisés par le fournisseur Remoting Provider pour accéder à la machine distante. Vous accéderez alors à la machine distante comme si vous étiez un utilisateur local.

Mot clé Provider

Pour invoquer le fournisseur OLE DB Remoting Provider, spécifiez, dans la chaîne de connexion, le mot clé et la valeur suivants. (Notez l'espace dans le nom du fournisseur.)

"Provider=MS Remote"

Mots clés supplémentaires

Lorsque ce fournisseur de services est invoqué, les mots clés suivants s'appliquent.

Mot clé | Description
Data Source | Spécifie le nom de la source de données distante. Il est transmis au fournisseur OLE DB Remoting Provider pour traitement. Ce mot clé équivaut à la propriété Connect de l'objet RDS.DataControl.

Propriétés dynamiques

Lorsque ce fournisseur de services est invoqué, les propriétés dynamiques suivantes sont ajoutées à la collection Properties de l'objet Connection.

Nom de la propriété dynamique | Description
DFMode Indique le mode DataFactory. Chaîne qui spécifie la version de l'objet DataFactory souhaitée sur le serveur. Définissez cette propriété avant d'établir une connexion pour demander une version spécifique de DataFactory. Si la version demandée n'est pas disponible, l'utilisation de la version précédente sera tentée. S'il n'y a pas de version précédente, une erreur surviendra. Si DFMode est antérieure à la version disponible, une erreur surviendra. Cette propriété est en lecture seule après l'établissement d'une connexion.

Peut être l'une des chaînes de valeurs suivantes :

  • "25"—Version 2.5 (par défaut)
  • "21"—Version 2.1
  • "20"—Version 2.0
  • "15"—Version 1.5
Command Properties | Indique les valeurs qui seront ajoutées à la chaîne de propriétés de la commande (ensemble de lignes) envoyées au serveur par le fournisseur MS Remote. La valeur par défaut de cette chaîne est vt_empty.
Current DFMode Indique le numéro de version réel de DataFactory sur le serveur. Vérifiez cette propriété pour voir si la version demandée dans la propriété DFMode a été acceptée.

Peut être l'une des valeurs d'entiers longues suivantes :

  • 25—Version 2.5 (par défaut)
  • 21—Version 2.1
  • 20—Version 2.0
  • 15—Version 1.5

En ajoutant « DFMode=20 » à votre chaîne de connexion lorsque vous utilisez le fournisseur MSRemote, vous pouvez améliorer considérablement les performances de votre serveur lors de la mise à jour des données. Grâce à ce paramètre, l'objet RDSServer.DataFactory résidant sur le serveur utilise un mode qui exige moins de ressources. Toutefois, les fonctionnalités suivantes ne sont pas disponibles dans cette configuration :

  • Utilisation de requêtes paramétrées.
  • Obtention d'informations sur les paramètres ou les colonnes avant l'appel de la méthode Execute.
  • Affectation de la valeur True à Transact Updates.
  • Obtention de l'état des lignes.
  • Appel de la méthode Resync.
  • Actualisation (explicite ou automatique) à l'aide de la propriété Update Resync.
  • Définition des propriétés d'un objet Command ou Recordset.
  • Utilisation de adCmdTableDirect.
Handler | Indique le nom d'un programme (ou gestionnaire) de personnalisation côté serveur qui étend la fonctionnalité de RDSServer.DataFactory et tous les paramètres utilisés par le gestionnaire, séparés par une virgule (« , »). Valeur de type String.
Internet Timeout | Indique le délai d'attente (en millisecondes) maximum d'une requête pour faire un aller-retour à partir du serveur. (Par défaut 5 minutes.)
Remote Provider | Indique le nom du fournisseur de données à utiliser sur le serveur distant.
Remote Server | Indique le nom du serveur et le protocole de communication à utiliser pour cette connexion. Cette propriété équivaut à la propriété Server de l'objet RDS.DataControl.
Transact Updates | Lorsqu'elle a la valeur True, cette valeur indique le moment auquel la méthode UpdateBatch est exécutée sur le serveur, cette opération s'effectue dans une transaction. La valeur par défaut de cette propriété dynamique de type Boolean est False.

Vous pouvez également définir des propriétés dynamiques accessibles en écriture en spécifiant leur nom comme mot clé dans la chaîne de connexion. Définissez, par exemple, la propriété dynamique Internet Timeout à cinq secondes en spécifiant :

Dim cn as New ADODB.Connection
cn.Open "Provider=MS Remote;Internet Timeout=5000"

Vous pouvez également définir ou extraire une propriété dynamique en spécifiant son nom comme index de la propriété Properties. Par exemple, obtenez et imprimez la valeur courante de la propriété dynamique Internet Timeout, puis définissez une nouvelle valeur comme suit :

Debug.Print cn.Properties("Internet Timeout")
cn.Properties("Internet Timeout") = 5000

Remarques

Dans ADO 2.0, le fournisseur OLE DB Remoting Provider ne pouvait être spécifié que dans le paramètre ActiveConnection de la méthode Open de l'objet Recordset. À partir de la version ADO 2.1, le fournisseur peut également être spécifié dans le paramètre ConnectionString de la méthode Open de l'objet Connection.

L'équivalent de la propriété SQL de l'objet RDS.DataControl n'est pas disponible. À sa place, c'est l'argument Source de la méthode Open de l'objet Recordset qui est utilisé.

Si vous spécifiez « Remote Provider=MS Remote;... », vous créez un scénario à quatre niveaux. Les scénarios de plus de trois niveaux n'ont pas été testés et ne devraient pas être indispensables.

Exemple

Cet exemple exécute une requête sur la table authors de la base de données pubs située sur un serveur appelé YourServer. Le nom de la source de données distante et du serveur distant sont fournis dans la méthode Open de l'objet Connection et la requête SQL est spécifiée dans la méthode Open de l'objet Recordset. Un objet Recordset est renvoyé, édité et utilisé pour mettre à jour la source de données.

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
...                'Edit the recordset
rs.UpdateBatch     'Equivalent of RDS SubmitChanges
...

Voir aussi

OLE DB Remoting Provider dans la section OLE DB du kit de développement MDAC


Microsoft Cursor Service pour OLE DB (composant de service ADO)

Annexes ADO 2.5

Microsoft Cursor Service pour OLE DB

Le composant Microsoft Cursor Service pour OLE DB vient s'ajouter aux fonctions de prise en charge des curseurs des fournisseurs de données. Ainsi, l'utilisateur perçoit une fonctionnalité relativement homogène de la part de tous les fournisseurs de données.

Le service Cursor Service met à disposition des propriétés dynamiques et améliore le comportement de certaines méthodes. La propriété dynamique Optimize, par exemple, permet de créer des index temporaires pour faciliter certaines opérations telles que la méthode Find.

Le service Cursor Service permet la prise en charge, dans tous les cas, de mises à jour par lot. Il simule également d'autres types de curseurs plus performants, tels que les curseurs dynamiques, lorsqu'un fournisseur de données ne peut fournir que des curseurs moins performants comme des curseurs statiques.

Mot clé

Pour invoquer ce composant, affectez à la propriété CursorLocation des objets Recordset ou Connection la valeur adUseClient.

connection.CursorLocation=adUseClient
recordset.CursorLocation=adUseClient

Propriétés dynamiques

Lorsque le service Cursor Service pour OLE DB est invoqué, les propriétés dynamiques suivantes sont ajoutées à la collection Properties de l'objet Recordset. Vous trouverez une liste complète des propriétés dynamiques des objets Connection et Recordset dans l'index des propriétés dynamiques ADO. Le cas échéant, les noms des propriétés OLE DB correspondantes sont inclus entre parenthèses après le nom de la propriété ADO.

Les modifications de certaines propriétés dynamiques ne sont pas visibles par la source de données sous-jacente une fois que le Cursor Service a été invoqué. Par exemple, la valeur affectée à la propriété Command Time out pour un objet Recordset n'est pas visible pour le fournisseur de données sous-jacent.

...
Recordset1.CursorLocation = adUseClient     'invokes cursor service
Recordset1.Open "authors", _
    "Provider=SQLOLEDB;Data Source=DBServer;User Id=usr;" & _
    "Password=pwd;Initial Catalog=pubs;",,adCmdTable
Recordset1.Properties.Item("Command Time out") = 50
' 'Command Time out' property on DBServer is still default (30).
...

Si votre application a besoin du Cursor Service, mais que vous deviez définir des propriétés dynamiques sur le fournisseur sous-jacent, définissez ces propriétés avant d'invoquer le Cursor Service. Les valeurs des propriétés des objets de commande sont toujours passées au fournisseur de données sous-jacent, quel que soit l'emplacement du curseur. Par conséquent, vous pouvez également utiliser un objet de commande pour définir ces propriétés à tout moment.

Remarque La propriété dynamique DBPROP_SERVERDATAONINSERT n'est pas prise en charge par le composant Cursor Service, même si elle est prise en charge par le fournisseur de données sous-jacent.
Nom de la propriété | Description
Auto Recalc (DBPROP_ADC_AUTORECALC) | Pour les jeux d'enregistrements créés avec le service Data Shaping Service, cette valeur indique la fréquence de calcul des colonnes calculées et de regroupement. La valeur par défaut (1) indique que ces colonnes sont recalculées chaque fois que le service Data Shaping Service détermine une modification des valeurs. Si cette propriété a pour valeur 0, les colonnes calculées ou de regroupement sont calculées uniquement lors de la génération initiale de la hiérarchie.
Batch Size (DBPROP_ADC_BATCHSIZE) | Indique le nombre d'instructions de mise à jour qui peuvent être placées en attente avant d'être envoyées en un lot au magasin de données. Plus le nombre d'instructions dans un lot est élevé, moins les boucles avec le magasin de données sont nombreuses.
Cache Child Rows (DBPROP_ADC_CACHECHILDROWS) | Pour les jeux d'enregistrements créés avec le service Data Shaping Service, cette valeur indique si les jeux d'enregistrements enfants sont stockés en mémoire cache pour une utilisation ultérieure.
Cursor Engine Version (DBPROP_ADC_CEVER) | Indique la version du Cursor Service utilisée.
Maintain Change Status (DBPROP_ADC_MAINTAINCHANGESTATUS) | Indique le texte de la commande utilisée pour resynchroniser une ou plusieurs lignes dans une jointure entre plusieurs tables.
Optimize | Indique si un index doit être créé. Si cette propriété a pour valeur True, elle autorise la création temporaire d'index afin d'améliorer l'exécution de certaines opérations.
Reshape Name | Indique le nom du Recordset. Peut être référencé dans les commandes de mise en forme en cours ou ultérieure.
Resync Command | Indique une chaîne de commande personnalisée qui est utilisée par la méthode Resync lorsque la propriété Unique Table est active.
Unique Catalog | Indique le nom de la base de données contenant la table référencée dans la propriété Unique Table.
Unique Schema | Indique le nom du propriétaire de la table référencée dans la propriété Unique Table.
Unique Table | Indique le nom de la table d'un Recordset créée à partir de plusieurs tables qui peut être modifiée par des insertions, des mises à jour ou des suppressions.
Update Criteria (DBPROP_ADC_UPDATECRITERIA) | Indique quels champs de la clause WHERE sont utilisés pour gérer les collisions qui se produisent pendant une mise à jour.
Update Resync (DBPROP_ADC_UPDATERESYNC) | Indique si la méthode Resync est implicitement invoquée après la méthode UpdateBatch (et son comportement), lorsque la propriété Unique Table est active.

Vous pouvez également définir ou extraire une propriété dynamique en spécifiant son nom comme index de la collection Properties. Par exemple, obtenez et imprimez la valeur courante de la propriété dynamique Optimize, puis définissez une nouvelle valeur comme suit :

Debug.Print rs.Properties("Optimize")
rs.Properties("Optimize") = True

Comportement des propriétés intégrées

Le service Cursor Service pour OLE DB affecte également le comportement de certaines propriétés intégrées.

Nom de la propriété | Description
CursorType | Augmente le nombre de types de curseurs disponibles pour un Recordset.
LockType | Augmente le nombre de types de verrous disponibles pour un Recordset. Permet les mises à jour par lots.
Sort | Spécifie un ou plusieurs noms de champs de tri du Recordset et indique si chaque champ est trié par ordre croissant ou décroissant.

Comportement des méthodes

Le service Cursor Service pour OLE DB active ou affecte le comportement de la méthode Append de l'objet Field et des méthodes Open, Resync, UpdateBatch et Save de l'objet Recordset.

Voir aussi

Cursor Service pour OLE DB dans la section OLE DB du kit de développement MDAC


Annexe B : Erreurs ADO

Consultez les rubriques suivantes pour plus d'informations concernant des messages d'erreur particuliers :

  • Codes d'erreur ADO
  • Codes d'erreur DataControl
  • Codes d'erreur Internet Explorer
  • Codes d'erreur Internet Information Services

Voir aussi

Référence de l'API ADO | Collections ADO | Propriétés dynamiques ADO | Constantes énumérées ADO | Événements ADO | Méthodes ADO | Modèle objet ADO | Objets ADO | Propriétés ADO


Codes d'erreur ADO

Outre les erreurs du fournisseur renvoyées dans les objets Error de la collection Errors, ADO lui-même peut renvoyer des erreurs au mécanisme de gestion des erreurs de votre environnement d'exécution. Utilisez le mécanisme d'interception des erreurs de langage de programmation, notamment l'instruction On Error de Microsoft Visual Basic ou le bloc try-catch de Microsoft Visual C++ ou Microsoft Visual J++, pour capturer les erreurs ADO.

Pour la liste des codes d'erreur ADO, consultez ErrorValueEnum.

Error, objet | Errors, collection


Codes d'erreur DataControl

Le tableau suivant répertorie les codes d'erreur de l'objet RDS.DataControl. La conversion décimale positive des deux octets de poids faible, la conversion décimale négative du code d'erreur complet et les valeurs hexadécimales sont indiquées.

Codes d'erreur RDS.DataControl | Numéro | Description
IDS_AsyncPending | 4107 -2146824175 0x800A1011 | Impossible d'exécuter l'opération avec une opération asynchrone en attente.
IDS_BadInlineTablegram | 4105 -2146824183 0x800A1009 | Tablegram incorrect.
IDS_CantConnect | 4099 -2146824189 0x800A1003 | Impossible de se connecter au serveur.
IDS_CantCreateObject | 4100 -2146824188 0x800A1004 | Impossible de créer un objet Business.
IDS_CantFindDataspace | 4102 -2146824186 0x800A1006 | La propriété Dataspace n'est pas valide.
IDS_CantInvokeMethod | 4101 -2146824187 0x800A1005 | Impossible d'invoquer une méthode sur l'objet Business.
IDS_CrossDomainWarning | 4112 -2146824170 0x800A1016 | Cette page utilise des données situées dans un autre domaine. Voulez-vous continuer ? Pour éviter de recevoir ce message dans Internet Explorer, vous pouvez ajouter un site Web sécurisé dans la zone Sites de confiance sous l'onglet Sécurité de la boîte de dialogue Options Internet.
IDS_InvalidADCClientVersion | 4106 -2146824176 0x800A1010 | Version du client RDS non valide — le client est plus récent que le serveur.
IDS_INVALIDARG | 5376 -2147019520 0x80071500 | Un ou plusieurs arguments ne sont pas valides.
IDS_InvalidBindings | 4097 -2146824191 0x800A1001 | Erreur dans la propriété bindings.
IDS_InvalidParam | 4110 -2146824172 0x800A1014 | Un ou plusieurs arguments ne sont pas valides.
IDS_NOINTERFACE | 5377 -2147019519 0x80071501 | Ce type d'interface n'est pas pris en charge.
IDS_NotReentrant | 4111 -2146824171 0x800A1015 | La requête ne peut pas être exécutée pendant que le gestionnaire d'événements est en cours de traitement.
IDS_ObjectNotSafe | 4103 -2146824185 0x800A1007 | Les paramètres de sécurité définis sur cet ordinateur interdisent la création d'un objet Business.
IDS_RecordsetNotOpen | 4109 -2146824173 0x800A1013 | Recordset n'est pas ouvert.
IDS_ResetInvalidField | 4108 -2146824174 0x800A1012 | La colonne spécifiée dans SortColumn ou FilterColumn n'existe pas.
IDS_RowsetNotUpdateable | 4104 -2146824184 0x800A1008 | Impossible de mettre à jour l'ensemble de lignes.
IDS_UnexpectedError | 4351 -2146823937 0x800A10FF | Erreur inattendue.
IDS_UpdatesFailed | 4098 -2146824190 0x800A1002 | Impossible de mettre à jour la base de données.
IDS_URLMONNotFound | 4119 -2146824169 0x800A1017 | La propriété URL de l'objet DataControl requiert le fichier système Urlmon.dll, qui est introuvable.

Voir aussi

DataControl, objet (RDS)


Codes d'erreur Internet Explorer

Le tableau suivant répertorie les codes d'erreur du client Microsoft Internet Explorer liés à l'utilisation de RDS. La conversion décimale positive des deux octets de poids faible, la conversion décimale négative du code d'erreur complet et les valeurs hexadécimales sont indiquées.

Erreurs Internet Explorer (Wininet) | Numéro | Description
IDS_WinInet_CantConnect | 8195 -2146820093 0x800A2003 | Erreur du client Internet : impossible de se connecter au serveur.
IDS_WinInet_ ConnectionReset | 12031 -2146816257 0x800A2EFF | Erreur du client Internet : réinitialisation de la connexion.
IDS_WinInet_Error | 8193 -2146820095 0x800A2001 | Erreur du client Internet.
IDS_WinInet_ InvalidServerResponse | 8430 -2146819858 0x800A20EE | Erreur du client Internet : réponse du serveur non valide.
IDS_WinInet_ SSLPostLimitation | 8196 -2146820092 0x800A2004 | Erreur interne du client : erreur SSL (pouvant être due à la limitation du téléchargement des données à 32 Ko).
IDS_WinInet_Timeout | 8194 -2146820094 0x800A2002 | Erreur du client Internet : délai d'attente dépassé pour la requête.


Codes d'erreur Internet Information Services

Le tableau suivant affiche la liste des codes d'erreur IIS (Internet Information Services) liés à l'utilisation de RDS. La conversion décimale positive des deux octets de poids faible, la conversion décimale négative du code d'erreur complet et les valeurs hexadécimales sont indiquées.

Erreurs IIS | Numéro | Description
IDS_IIS_AccessDenied | 8208 -2146820080 0x800A2010 | Erreur du serveur Internet : accès refusé.
IDS_IIS_ObjectNotFound | 8209 -2146820079 0x800A2011 | Erreur du serveur Internet : objet/module introuvable.
IDS_IIS_RequestForbidden | 8210 -2146820078 0x800A2012 | Erreur du serveur Internet : requête interdite.
IDS_IIS_UnexpectedError | 8447 -2146819841 0x800A20FF | Erreur du serveur Internet.


Annexe C : Programmation avec ADO

ADO est un composant de l'interface d'automation COM qui peut être utilisé avec de nombreux langages de programmation, notamment Microsoft Visual Basic, VBScript, JScript, Visual C++ et Visual J++. Une version du composant ADO est installée avec chacun de ces outils, mais aussi avec d'autres applications telles que Microsoft Office et Microsoft SQL Server. La plus récente version du composant ADO est disponible séparément avec Microsoft Data Access Components. Pour plus d'informations, consultez le site Web de Microsoft Data Access.

La bibliothèque ADO se nomme msado15.dll et le préfixe de l'identificateur de programme (ProgID) est « ADODB ». Par exemple, pour faire explicitement référence à un objet ADO Recordset, utilisez ADODB.Recordset.

Pour plus d'informations sur la programmation ADO dans différents environnements de développement, consultez les rubriques suivantes :

  • Utilisation de ADO avec Microsoft Visual Basic
  • Utilisation de ADO avec les langages de script
  • Utilisation de ADO avec Microsoft Visual C++
  • Utilisation de ADO avec Microsoft Visual J++

Voir aussi

Guide de référence de l'API ADO | Exemples ADO | Configuration de RDS | Page de démarrage des objets de données ActiveX | Annexe A : Fournisseurs | Nouveautés dans ADO


Utilisation de ADO avec Microsoft Visual Basic

Que vous utilisiez Visual Basic ou Visual Basic pour Applications, la procédure est identique pour configurer un projet ADO et écrire le code ADO. Cette rubrique décrit l'utilisation de ADO avec Visual Basic et Visual Basic pour Applications et souligne les différences éventuelles.

Référence à la bibliothèque ADO

Le projet doit faire référence à la bibliothèque ADO.

Pour faire référence à ADO dans Microsoft Visual Basic

  1. Dans le menu Projet de Visual Basic, sélectionnez Références.
  2. Sélectionnez Microsoft ActiveX Data Objects x.x Library dans la zone de liste. Vérifiez que les bibliothèques suivantes au moins sont également sélectionnées :
    • Visual Basic pour Applications
    • Objets et procédures d'exécution Visual Basic
    • Objets et procédures Visual Basic
    • Automation OLE
  3. Cliquez sur OK.

Vous pouvez utiliser ADO tout aussi facilement avec Visual Basic pour Applications, par exemple via Microsoft Access.

Pour faire référence à ADO à partir de Microsoft Access

  1. Dans Microsoft Access, sélectionnez ou créez un module à partir de l'onglet Modules de la fenêtre Base de données.
  2. Dans le menu Outils, sélectionnez Références.
  3. Sélectionnez Microsoft ActiveX Data Objects x.x Library dans la zone de liste. Vérifiez que les bibliothèques suivantes au moins sont également sélectionnées :
    • Visual Basic pour Applications
    • Bibliothèque d'objets Microsoft Access 11.0 (ou version ultérieure)
  4. Cliquez sur OK.

Création d'objets ADO dans Visual Basic

Pour créer une variable Automation et une instance d'objet pour cette variable, vous avez le choix entre deux méthodes : Dim ou CreateObject.

Dim

Vous pouvez utiliser le mot clé New avec Dim pour déclarer et instancier des objets ADO en une seule étape :

Dim conn As New ADODB.Connection

Il est également possible de dissocier l'instruction de déclaration Dim et l'instanciation de l'objet en deux étapes :

Dim conn As ADODB.Connection
Set conn = New ADODB.Connection
Remarque Il n'est pas indispensable d'utiliser de manière explicite le ProgID ADODB avec l'instruction Dim si la bibliothèque ADO est correctement référencée dans le projet. En l'utilisant, vous éliminez toutefois tout risque de conflit de nom avec d'autres bibliothèques.
Par exemple, si vous insérez dans le même projet des références à ADO et à DAO, vous devez inclure un qualificateur pour spécifier le modèle d'objet à utiliser lorsque vous instanciez des objets Recordset, comme dans le code suivant :
Dim adoRS As ADODB.Recordset
Dim daoRS As DAO.Recordset

CreateObject

Avec la méthode CreateObject, il convient de distinguer les étapes de déclaration et d'instanciation de l'objet :

Dim conn1
Set conn1 = CreateObject("ADODB.Connection") As Object

Les objets instanciés avec CreateObject sont instanciés tardivement, ce qui veut dire qu'ils ne sont pas fortement typés et que l'exécution de la ligne de commande est désactivée. Vous n'êtes pas pour autant dispensé de faire référence à la bibliothèque ADO dans votre projet et pouvez même instancier des versions particulières de ces objets. Par exemple :

Set conn1 = CreateObject("ADODB.Connection.2.0") As Object

Vous pouvez accomplir la même opération en créant une référence précise à la bibliothèque de type ADO version 2.0 et en créant l'objet.

Il est généralement plus lent d'instancier des d'objets avec la méthode CreateObject que d'utiliser l'instruction Dim.

Gestion des événements

Pour gérer des événements ADO dans Microsoft Visual Basic, vous devez déclarer une variable au niveau du module à l'aide du mot clé WithEvents. La variable ne peut être déclarée que dans le cadre d'un module de classe et doit l'être au niveau du module. Pour plus d'informations sur la gestion des événements ADO, consultez Chapitre 7 : Gestion d'événements ADO.

Exemples pour Visual Basic

La documentation ADO comprend un grand nombre d'exemples utilisant Visual Basic. Pour plus d'informations, consultez Exemples de code ADO en Microsoft Visual Basic.

Voir aussi

Page de démarrage des objets de données ActiveX | Utilisation de ADO avec Microsoft Visual C++ | Utilisation de ADO avec Microsoft Visual J++ | Utilisation de ADO avec les langages de script

© 1998-2002 Microsoft Corporation. Tous droits réservés.


Utilisation de ADO avec les langages de script

Dans un environnement de script, ADO permet d'exposer des données par le biais d'un code de script côté serveur. Selon ce scénario, ADO, le fournisseur OLE DB utilisé et tous les autres composants nécessaires pour faire référence à une banque de données particulière sont installés sur un serveur qui exécute Internet Information Services (IIS). Avec Active Server Pages (ASP), ADO est un composant référencé dans un script qui peut générer, par exemple, du code HTML. Il est possible de passer ce contenu HTML via HTTP à un navigateur Web client. Grâce au code de script, la page Web peut renvoyer des actions au script côté serveur, ce qui vous permet de mettre à jour, de naviguer à travers le jeu de résultats ou d'afficher des données particulières.

Sources de données ODBC

L'une des différences les plus significatives entre les codes ADO de script et non-script est la source de données ODBC (si elle est utilisée). Dans le cas des applications sans script, vous pouvez créer une source de données utilisateur dans l'Administrateur de source de données ODBC. Pour les scripts qui s'exécutent sous IIS, vous devez créer une source de données système, faute de quoi vos scripts ne reconnaîtront pas la source de données que vous avez créée. Cette remarque concerne toutes les applications de script ADO qui utilisent Microsoft OLE DB Provider pour ODBC via Microsoft IIS.

Référence à la bibliothèque ADO

Non applicable aux langages de script.

Gestion des événements

Non applicable aux langages de script.

Les rubriques suivantes contiennent des informations plus détaillées sur l'utilisation de ADO avec les langages de script :

  • ADO dans VBScript
  • ADO dans JScript

Voir aussi

Page de démarrage des objets de données ActiveX | Utilisation de ADO avec Microsoft Visual Basic | Utilisation de ADO avec Microsoft Visual C++ | Utilisation de ADO avec Microsoft Visual J++


Programmation ADO en VBScript

Création d'un projet ADO

Microsoft Visual Basic Scripting Edition ne prend pas en charge les bibliothèques de types, de sorte que vous n'avez pas besoin de faire référence à ADO dans votre projet. Il s'ensuit qu'aucune autre fonctionnalité associée n'est prise en charge (notamment l'exécution à partir de la ligne de commande). Par défaut, les constantes énumérées ADO ne sont d'ailleurs pas définies dans VBScript.

Toutefois, ADO fournit deux fichiers include qui contiennent les définitions suivantes à utiliser avec VBScript :

  • Pour le code de script côté serveur : utilisez Adovbs.inc qui est installé par défaut dans le dossier c:\Program Files\Common Files\System\ado\.
  • Pour le code de script côté client : utilisez Adcvbs.inc qui est installé par défaut dans le dossier c:\Program Files\Common Files\System\msdac\.

Vous pouvez copier et coller les définitions de constantes depuis ces fichiers dans vos pages ASP ; si vous codez un script côté serveur, copiez le fichier Adovbs.inc dans un dossier de votre site Web et faites-y référence dans votre page ASP de la manière suivante :

<!--#include File="adovbs.inc"-->

Création d'objets ADO dans VBScript

Vous ne pouvez pas utiliser l'instruction Dim pour affecter des objets à un type particulier dans VBScript. Par ailleurs, VBScript ne prend pas en charge la syntaxe New utilisée avec l'instruction Dim dans Visual Basic pour Applications. Vous devez utiliser à la place l'appel de la fonction CreateObject :

Dim Rs1
Set Rs1 = Server.CreateObject( "ADODB.Recordset" )

Exemples de code VBScript

Le code suivant est un exemple générique de programmation côté serveur en VBScript dans un fichier ASP :

<%  @LANGUAGE="VBSCRIPT" %>
<%  Option Explicit %>
<!--#include File="adovbs.inc"-->
<HTML>
    <BODY BGCOLOR="White" topmargin="10" leftmargin="10">

    <!-- Your ASP Code goes here -->
<%
Dim Source
Dim Connect
Dim Rs1

Source = "SELECT * FROM Authors"
Connect = "Provider=sqloledb;Data Source=srv;" & _
    "Initial Catalog=Pubs;Integrated Security=SSPI;"

Set Rs1 = Server.CreateObject( "ADODB.Recordset" )
Rs1.Open Source, Connect, adOpenForwardOnly
Response.Write("Success!")
%>
    </BODY>
</HTML>

La documentation ADO comprend des exemples plus détaillés utilisant VBScript. Pour plus d'informations, consultez Exemples de code ADO en Microsoft Visual Basic Scripting Edition.

Différences entre VBScript et Visual Basic

L'utilisation de ADO avec VBScript est globalement similaire à celle de ADO avec Visual Basic, y compris au niveau de la syntaxe. Quelques différences importantes doivent toutefois être soulignées :

  • VBScript ne prend en charge que le type de données Variant qui peut contenir différents types de données. Vous pouvez stocker les données dont vous avez besoin dans un type de données Variant ; elles fonctionneront correctement grâce au cast effectué par VBScript. VBScript reconnaît le type de données requis par ADO et convertit la valeur en type Variant en conséquence.
  • Dans VBScript, vous ne pouvez pas utiliser on error goto <label>.
  • VBScript prend en charge certaines fonctions intégrées de Visual Basic telles que Msgbox, Date et IsNumeric. Toutefois, comme VBScript est un sous-ensemble de Visual Basic, toutes les fonctions intégrées ne sont pas prises en charge. Par exemple, VBScript ne prend pas en charge la fonction Format ni les fonctions d'E/S de fichier.


Programmation ADO en JScript

Création d'un projet ADO

Microsoft JScript ne prend pas en charge les bibliothèques de types, de sorte que vous n'avez pas besoin de faire référence à ADO dans votre projet. Il s'ensuit qu'aucune autre fonctionnalité associée n'est prise en charge (notamment l'exécution à partir de la ligne de commande). Par défaut, les constantes énumérées ADO ne sont d'ailleurs pas définies dans JScript.

Toutefois, ADO fournit deux fichiers include qui contiennent les définitions suivantes à utiliser avec JScript :

  • Pour le code de script côté serveur : utilisez Adojavas.inc qui est installé par défaut dans le dossier c:\Program Files\Common Files\System\ado\.
  • Pour le code de script côté client : utilisez Adcjavas.inc qui est installé par défaut dans le dossier c:\Program Files\Common Files\System\msdac\.

Vous pouvez copier et coller les définitions de constantes depuis ces fichiers dans vos pages ASP ; si vous codez un script côté serveur, copiez le fichier Adojavas.inc dans un dossier de votre site Web et faites-y référence dans votre page ASP de la manière suivante :

<!--#include File="adojavas.inc"-->

Création d'objets ADO dans JScript

Vous devez utiliser à la place l'appel de la fonction CreateObject :

var Rs1;
Rs1 = Server.CreateObject("ADODB.Recordset");

Exemple de code JScript

Le code suivant est un exemple générique de programmation côté serveur en JScript dans un fichier ASP qui ouvre un objet Recordset :

<%  @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;Integrated Security=SSPI;"
var Rs1 = Server.CreateObject( "ADODB.Recordset.2.5" );
Rs1.Open(Source,Connect,adOpenForwardOnly);
Response.Write("Success!");
%>
</BODY>
</HTML>


Utilisation de ADO avec Microsoft Visual C++

Pour plus d'informations sur l'utilisation de ADO avec Visual C++, consultez les rubriques suivantes :

  • Programmation ADO en Visual C++
  • Extensions Visual C++ pour ADO
  • Index de la syntaxe ADO pour Visual C++ pour COM
  • Index de la syntaxe ADO pour Visual C++ avec #import

Voir aussi

Page de démarrage des objets de données ActiveX | Index de la syntaxe ADO pour Visual C++ pour COM | Index de la syntaxe ADO pour Visual C++ avec #import | Utilisation de ADO avec Microsoft Visual Basic | Utilisation de ADO avec Microsoft Visual J++ | Utilisation de ADO avec les langages de script | Extensions Visual C++ pour ADO


Programmation ADO en Visual C++

Le Guide de référence de l'API ADO décrit les fonctionnalités de l'interface de programmation d'applications (API, Application Programming Interface) ADO en utilisant une syntaxe similaire à Microsoft Visual Basic. Il s'adresse en fait à tous les utilisateurs, mais les programmeurs ADO utilisent des langages différents tels que Visual Basic, Visual C++ (avec et sans la directive #import) et Visual J++ (avec le package de classe ADO/WFC).

Pour tenir compte de cette diversité, les index de la syntaxe ADO pour Visual C++ fournissent la syntaxe propre au langage Visual C++ avec des liens vers les descriptions courantes des fonctionnalités, paramètres, comportements exceptionnels, etc. dans le Guide de référence de l'API.

ADO est implémenté avec des interfaces COM (Component Object Model). Toutefois, l'utilisation de COM est plus facile dans certains langages de programmation que dans d'autres. Par exemple, presque tous les détails d'utilisation de COM sont gérés implicitement pour les programmeurs en Visual Basic, tandis que les programmeurs en Visual C++ doivent traiter eux-mêmes ces détails.

Les sections qui suivent résument les détails concernés pour les programmeurs en C et C++ qui utilisent ADO et la directive #import. L'accent est mis sur les types de données spécifiques à COM (Variant, BSTR et SafeArray) ainsi que sur la gestion des erreurs (_com_error).

Utilisation de la directive du compilateur #import

La directive du compilateur Visual C++ #import simplifie l'utilisation des méthodes et propriétés ADO. Elle prend le nom d'un fichier contenant une bibliothèque de types, par exemple la DLL ADO (Msado15.dll), et génère des fichiers d'en-tête qui contiennent des déclarations typedef, des pointeurs intelligents pour les interfaces et des constantes énumérées. Chaque interface est encapsulée (ou enveloppée) dans une classe.

Pour chaque opération effectuée au sein d'une classe (appel de méthode ou de propriété), il y a une déclaration pour appeler directement l'opération (c'est-à-dire la forme « brute » de l'opération) et une déclaration pour appeler l'opération brute et déclencher une erreur COM si l'opération échoue. Si l'opération en question est une propriété, il y a normalement une directive du compilateur qui crée une autre syntaxe pour l'opération présentant une syntaxe semblable à Visual Basic.

Les opérations qui extraient la valeur d'une propriété portent des noms de la forme Get Property. Les opérations qui définissent la valeur d'une propriété portent des noms de la forme Put Property. Les opérations qui définissent la valeur d'une propriété avec un pointeur vers un objet ADO portent des noms de la forme PutRef Property.

Vous pouvez extraire ou définir une propriété à l'aide des appels suivants :

variable = objectPtr->GetProperty(); // get property value
objectPtr->PutProperty(value);       // set property value
objectPtr->PutRefProperty(&value);   // set property with object pointer

Utilisation de directives de propriété

La directive du compilateur __declspec(property...) est une extension du langage C propre à Microsoft qui déclare une fonction utilisée comme propriété pour avoir une autre syntaxe. Par conséquent, vous pouvez définir ou obtenir les valeurs d'une propriété comme en Visual Basic. Par exemple, pour définir et obtenir une propriété :

objectPtr->property = value;        // set property value
variable = objectPtr->property;     // get property value

Vous remarquez qu'il n'est pas nécessaire de coder :

objectPtr->PutProperty(value);      // set property value
variable = objectPtr->GetProperty;  // get property value

Le compilateur génère l'appel Get-, Put- ou PutRef Property approprié en fonction de l'autre syntaxe déclarée et selon que la propriété est lue ou écrite.

La directive du compilateur __declspec(property...) peut uniquement déclarer une autre syntaxe get, put ou get et put pour une fonction. Les opérations en lecture seule n'ont qu'une déclaration get ; les opérations en écriture seule n'ont qu'une déclaration put ; les opérations en lecture et en écriture ont des déclarations get et put.

Deux déclarations seulement sont possibles avec cette directive, mais chaque propriété peut avoir trois fonctions de propriété : Get Property, Put Property et PutRef Property. Dans ce cas, seules deux formes de la propriété ont l'autre syntaxe.

Par exemple, la propriété ActiveConnection de l'objet Command est déclarée avec une autre syntaxe pour Get ActiveConnection et PutRef ActiveConnection. La syntaxe de PutRef- est un choix judicieux dans la mesure où, en pratique, vous souhaitez généralement placer un objet Connection ouvert (c'est-à-dire un pointeur vers un objet Connection) dans cette propriété. En revanche, l'objet Recordset a les opérations Get-, Put- et PutRef ActiveConnection, mais pas d'autre syntaxe.

Collections, méthode GetItem et propriété Item

ADO définit plusieurs collections dont Fields, Parameters, Properties et Errors. En Visual C++, la méthode GetItem(index) renvoie un membre de la collection. Index est un Variant dont la valeur est soit un index numérique du membre de la collection, soit une chaîne contenant le nom du membre.

La directive du compilateur __declspec(property...) déclare la propriété Item comme autre syntaxe pour la méthode GetItem() fondamentale de chaque collection. L'autre syntaxe utilise des crochets droits et ressemble à une référence de tableau. En règle générale, les deux formes présentent l'aspect suivant :

collectionPtr->GetItem(index);
collectionPtr->Item[index];

Par exemple, supposons que vous vouliez affecter à un champ d'un objet Recordset nommé rs une valeur issue de la table authors de la base de données pubs. Vous utilisez la propriété Item() pour accéder au troisième objet Field de la collection Fields de l'objet Recordset (les collections sont indexées à partir de zéro ; supposons que le troisième champ est nommé au_fname). Vous appelez ensuite la méthode Value() sur l'objet Field pour affecter une valeur de chaîne.

Pour ce faire, vous disposez de quatre formes de code dans Visual Basic (les deux dernières sont uniques à Visual Basic et ne trouvent pas d'équivalents dans d'autres langages) :

rs.Fields.Item(2).Value = "value"
rs.Fields.Item("au_fname").Value = "value"
rs(2) = "value"
rs!au_fname = "value"

Voici le code Visual C++ équivalent aux deux premières lignes ci-dessus :

rs->Fields->GetItem(long(2))->PutValue("value");
rs->Fields->GetItem("au_fname")->PutValue("value");

- ou - (pour tenir compte de l'autre syntaxe pour la propriété Value)

rs->Fields->Item[long(2)]->Value = "value";
rs->Fields->Item["au_fname"]->Value = "value";

Types de données spécifiques à COM

En règle générale, tous les types de données Visual Basic qui figurent dans le Guide de référence de l'API ADO ont un équivalent en Visual C++. Il s'agit notamment des types de données standard tels que unsigned char pour le type Visual Basic Byte, short pour Integer et long pour Long. Consultez les index de syntaxe pour savoir exactement quels sont les types requis pour les opérandes d'une méthode ou d'une propriété donnée.

Les exceptions à cette règle sont les types de données spécifiques au modèle COM : Variant, BSTR et SafeArray.

Variant

Variant est un type de données structuré qui contient un membre « valeur » et un membre « type de données ». Variant peut contenir toutes sortes d'autres types de données : un autre type Variant, BSTR ou Boolean, un pointeur IDispatch ou IUnknown, un type monétaire, une date, etc. COM fournit également des méthodes qui facilitent la conversion d'un type de données dans un autre.

La classe _variant_t encapsule et gère le type de données Variant.

Lorsque le Guide de référence de l'API ADO indique qu'un opérande d'une méthode ou d'une propriété prend une valeur, cela signifie généralement que cette valeur est passée dans une classe _variant_t.

Cette règle est vérifiée explicitement lorsque la section Parameters dans les rubriques du Guide de référence de l'API ADO indique qu'un opérande est un Variant. Une première exception est le cas où la documentation indique de manière explicite que l'opérande admet un type de données standard tel que Long ou Byte ou une énumération. Une autre exception est le cas où l'opérande prend une valeur de type String.

BSTR

BSTR (Basic STRing) est un type de données structuré qui contient une chaîne de caractères et la longueur de la chaîne. COM fournit des méthodes pour allouer, manipuler et libérer un type BSTR.

La classe _bstr_t encapsule et gère le type de données BSTR.

Lorsque le Guide de référence de l'API ADO indique qu'une méthode ou propriété prend une valeur String, cela signifie que cette valeur est sous la forme d'une classe _bstr_t.

Cast des classes _variant_t et _bstr_t

En règle générale, il n'est pas nécessaire de coder explicitement un type _variant_t ou _bstr_t d'un argument à une opération. Si la classe _variant_t ou _bstr_t possède un constructeur qui correspond au type de données de l'argument, le compilateur génère la classe _variant_t ou _bstr_t appropriée.

En revanche, si l'argument est ambigu, autrement dit si son type de données correspond à plusieurs constructeurs, vous devez effectuer un cast de l'argument dans le type de données approprié pour invoquer le constructeur approprié.

Par exemple, la déclaration de la méthode Recordset::Open se présente comme suit :

    HRESULT Open (
        const _variant_t & Source,
        const _variant_t & ActiveConnection,
        enum CursorTypeEnum CursorType,
        enum LockTypeEnum LockType,
        long Options );

L'argument ActiveConnection admet comme valeur une référence à une classe _variant_t que vous pouvez coder comme une chaîne de connexion ou un pointeur vers un objet Connection ouvert.

La classe _variant_t appropriée est construite implicitement si vous passez une chaîne telle que « DSN=pubs;uid=sa;pwd=; » ou un pointeur tel que « (IDispatch *) pConn ».

Vous pouvez également coder explicitement une classe _variant_t contenant un pointeur « _variant_t((IDispatch *) pConn, true) ». Le cast (IDispatch *) résout l'ambiguïté avec un autre constructeur qui admet un pointeur vers une interface IUnknown.

Bien que rarement mentionné, le fait que ADO soit une interface IDispatch est extrêmement important. Chaque fois qu'un pointeur vers un objet ADO doit être passé en tant que Variant, il doit faire l'objet d'un cast en tant que pointeur vers une interface IDispatch.

Le dernier cas code de manière explicite le second argument booléen du constructeur avec sa valeur par défaut facultative true. Cet argument oblige le constructeur de Variant à appeler sa méthode AddRef(), ce qui compense l'appel automatique par ADO de la méthode _variant_t::Release() lors de l'appel de la méthode ou propriété ADO.

SafeArray

SafeArray est un type de données structuré qui contient un tableau constitué d'autres types de données. Un type de données SafeArray est considéré comme sécurisé (« safe ») parce qu'il contient des informations sur les limites de chaque dimension du tableau et restreint l'accès aux éléments du tableau situés dans ces limites.

Lorsque le Guide de référence de l'API ADO indique qu'une méthode ou propriété admet ou renvoie un tableau, cela signifie qu'elle prend pour valeur ou renvoie un type de données SafeArray et non un tableau C/C++ natif.

Par exemple, le deuxième paramètre de la méthode OpenSchema de l'objet Connection nécessite un tableau de valeurs Variant. Ces valeurs Variant doivent être passées en tant qu'éléments d'un tableau SafeArray, lequel doit être défini comme valeur d'un autre Variant. Cet autre Variant est passé comme deuxième argument de la méthode OpenSchema.

Pour citer d'autres exemples : le premier argument de la méthode Find est un Variant dont la valeur est un tableau SafeArray à une dimension ; chacun des deux premiers arguments facultatifs de la méthode AddNew est un tableau SafeArray à une dimension ; par ailleurs, la valeur renvoyée par la méthode GetRows est un Variant dont la valeur est un tableau SafeArray à deux dimensions.

Paramètres manquants et paramètres par défaut

Visual Basic autorise les paramètres manquants dans les méthodes. Par exemple, la méthode Open de l'objet Recordset admet cinq paramètres, mais vous pouvez faire abstraction des paramètres intermédiaires et ignorer les paramètres de fin. Un paramètre par défaut de type BSTR ou Variant sera substitué en fonction du type de données de l'opérande manquant.

En C/C++, tous les opérandes doivent être spécifiés. Si vous voulez spécifier un paramètre manquant de type chaîne, spécifiez une classe _bstr_t contenant une chaîne Null. Si vous voulez spécifier un paramètre manquant de type Variant, spécifiez une classe _variant_t contenant la valeur DISP_E_PARAMNOTFOUND et le type VT_ERROR. Vous avez également la possibilité de spécifier la constante équivalente à _variant_t, vtMissing, qui est fournie par la directive #import.

Trois méthodes font exception à l'utilisation classique de vtMissing. Il s'agit des méthodes Execute des objets Connection et Command, ainsi que de la méthode NextRecordset de l'objet Recordset. Voici leurs signatures :

_RecordsetPtr Execute( _bstr_t CommandText, VARIANT * RecordsAffected,
        long Options );  // Connection
_RecordsetPtr Execute( VARIANT * RecordsAffected, VARIANT * Parameters,
        long Options );  // Command
_RecordsetPtr NextRecordset( VARIANT * RecordsAffected );  // Recordset

Les paramètres RecordsAffected et Parameters sont des pointeurs vers un Variant. Parameters est un paramètre d'entrée qui spécifie l'adresse d'un Variant contenant un seul paramètre ou un tableau de paramètres qui va modifier la commande exécutée. RecordsAffected est un paramètre de sortie qui spécifie l'adresse d'un Variant dont le nombre de lignes affectées par la méthode est renvoyé.

Dans la méthode Execute de l'objet Command, indiquez qu'aucun paramètre n'est spécifié en affectant à Parameters la valeur &vtMissing (solution recommandée) ou le pointeur Null (c'est-à-dire NULL ou zéro (0)). Si Parameters a pour valeur le pointeur Null, la méthode remplace de manière interne l'équivalent de vtMissing, puis termine l'opération.

Dans toutes les méthodes, indiquez que le nombre d'enregistrements affectés ne doit pas être renvoyé en affectant le pointeur Null au paramètre RecordsAffected . Dans ce cas, le pointeur Null n'est pas vraiment un paramètre manquant, mais plutôt un paramètre qui indique à la méthode d'ignorer le nombre d'enregistrements affectés.

Pour ces trois méthodes, le code suivant est donc correct :

pConnection->Execute("commandText", NULL, adCmdText);
pCommand->Execute(NULL, NULL, adCmdText);
pRecordset->NextRecordset(NULL);

Gestion des erreurs

Dans le modèle COM, la plupart des opérations renvoient un code HRESULT qui indique si une fonction s'est déroulée avec succès. La directive #import génère un code wrapper autour de chaque méthode ou propriété « brute » et vérifie le code HRESULT renvoyé. Si le code HRESULT indique un échec, le code wrapper déclenche une erreur COM en appelant _com_issue_errorex() avec le code HRESULT renvoyé comme argument. Les objets erreur COM peuvent être interceptés dans un bloc try-catch. (Pour des raisons d'efficacité, interceptez une référence à un objet _com_error.)

N'oubliez pas qu'il s'agit d'erreurs ADO : elles découlent de l'échec d'une opération ADO. Les erreurs renvoyées par le fournisseur de données sous-jacent apparaissent en tant qu'objets Error dans la collection Errors de l'objet Connection.

La directive #import ne crée des routines de gestion d'erreurs que pour les méthodes et propriétés déclarées dans la DLL ADO. Toutefois, vous pouvez tirer parti de ce mécanisme de gestion des erreurs en écrivant votre propre macro ou fonction inline de vérification d'erreurs. Pour obtenir des exemples, consultez la rubrique Extensions Visual C++ ou le code fourni dans les sections suivantes.

Équivalents Visual C++ des conventions Visual Basic

Cette section récapitule les conventions codées en Visual Basic dans la documentation ADO et donne leurs équivalents en Visual C++.

Déclaration d'un objet ADO

En Visual Basic, une variable objet ADO (en l'occurrence, il s'agit d'un objet Recordset) est déclarée comme suit :

Dim rst As ADODB.Recordset

La clause « ADODB.Recordset » est le ProgID de l'objet Recordset tel que cela est défini dans le Registre. Une nouvelle instance d'un objet Record est déclarée comme suit :

Dim rst As New ADODB.Recordset

- ou -

Dim rst As ADODB.Recordset
Set rst = New ADODB.Recordset

En Visual C++, la directive #import génère des déclarations de type pointeur intelligent pour tous les objets ADO. Par exemple, une variable qui pointe vers un objet _Recordset est du type _RecordsetPtr et elle est déclarée comme suit :

_RecordsetPtr  rs;

Une variable qui pointe vers une nouvelle instance d'un objet _Recordset est déclarée comme suit :

_RecordsetPtr  rs("ADODB.Recordset");

- ou -

_RecordsetPtr  rs;
rs.CreateInstance("ADODB.Recordset");

- ou -

_RecordsetPtr  rs;
rs.CreateInstance(__uuidof(_Recordset));

Après l'appel de la méthode CreateInstance, la variable peut être utilisée de la manière suivante :

rs->Open(...);

Remarquez que dans un cas, l'opérateur « . » est utilisé comme si la variable était une instance de classe (rs.CreateInstance), alors que dans l'autre cas, l'opérateur « -> » est utilisé comme si la variable était un pointeur vers une interface (rs->Open).

Une même variable peut être utilisée de deux manières parce que l'opérateur « -> » est trop chargé pour permettre à une instance d'une classe de se comporter comme un pointeur vers une interface. Un membre de classe privé de la variable d'instance contient un pointeur vers l'interface _Recordset ; l'opérateur « -> » renvoie ce pointeur, lequel accède aux membres de l'objet _Recordset.

Codage d'un paramètre manquant — String

Lorsque vous devez coder en Visual Basic un opérande manquant de type String, il suffit d'omettre cet opérande. Dans Visual C++, il faut spécifier l'opérande. Codez une classe _bstr_t dont la valeur est une chaîne vide.

_bstr_t strMissing(L"");

Codage d'un paramètre manquant — Variant

Lorsque vous devez coder dans Visual Basic un opérande manquant de type Variant, il suffit d'omettre cet opérande. En Visual C++, vous devez spécifier tous les opérandes. Codez un paramètre manquant de type Variant à l'aide d'une classe _variant_t de valeur spéciale DISP_E_PARAMNOTFOUND et de type VT_ERROR. Vous avez également la possibilité de spécifier la constante prédéfinie équivalente vtMissing qui est fournie par la directive #import.

_variant_t  vtMissingYours(DISP_E_PARAMNOTFOUND, VT_ERROR);

- ou bien -

...vtMissing...;

Déclaration d'un Variant

En Visual Basic, un type Variant est déclaré comme suit à l'aide de l'instruction Dim :

Dim VariableName As Variant

En Visual C++, vous déclarez une variable de type _variant_t. Voici quelques exemples simples de déclarations de types _variant_t.

Remarque Ces déclarations ne donnent qu'une idée grossière du code que vous pouvez inclure dans votre programme. Pour plus d'informations, consultez les exemples ci-dessous et la documentation Visual C++.
_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);

Utilisation des tableaux de types Variant

En Visual Basic, les tableaux de types Variant peuvent être codés à l'aide de l'instruction Dim, mais vous pouvez également utiliser la fonction Array comme dans l'exemple de code suivant :

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

L'exemple de code Visual C++ suivant illustre l'utilisation d'un tableau SafeArray avec un type _variant_t.

Remarques Les remarques suivantes correspondent aux sections commentées de l'exemple de code.
1. Une fois de plus, la fonction inline TESTHR() est définie pour tirer profit du mécanisme de gestion d'erreurs existant.
2. Vous n'avez besoin que d'un tableau à une dimension, de sorte que vous pouvez utiliser SafeArrayCreateVector à la place de la déclaration générique SAFEARRAYBOUND et de la fonction SafeArrayCreate. Voici à quoi ressemblerait le code s'il utilisait SafeArrayCreate :
   SAFEARRAYBOUND   sabound[1];
      sabound[0].lLbound = 0;
      sabound[0].cElements = 4;
      pSa = SafeArrayCreate(VT_VARIANT, 1, sabound);
3. Le schéma identifié par la constante énumérée adSchemaColumns est associé à quatre colonnes de contraintes : TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME et COLUMN_NAME. Par conséquent, un tableau de valeurs Variant à quatre éléments est créé. Ensuite, une valeur de contrainte qui correspond à la troisième colonne, TABLE_NAME, est spécifiée.
L'objet Recordset qui est renvoyé se compose de plusieurs colonnes, dont les colonnes de contraintes. Pour chaque ligne renvoyée, les valeurs des colonnes de contraintes doivent être identiques aux valeurs des contraintes correspondantes.
4. Si vous avez l'habitude d'utiliser des tableaux SafeArrays , vous vous étonnez peut-être de constater que SafeArrayDestroy() n'est pas appelé avant la sortie du code. En réalité, l'appel de SafeArrayDestroy() provoquerait dans ce cas une exception d'exécution. En effet, le destructeur de vtCriteria doit appeler VariantClear() lorsque _variant_t devient hors de portée, ce qui libère SafeArray. Appeler SafeArrayDestroy, sans effacer manuellement _variant_t, oblige le destructeur à essayer de supprimer un pointeur SafeArray non valide.
Si SafeArrayDestroy était appelé, le code deviendrait :
      TESTHR(SafeArrayDestroy(pSa));
   vtCriteria.vt = VT_EMPTY;
      vtCriteria.parray = NULL;
Il est beaucoup plus simple de laisser la gestion de SafeArray à la classe _variant_t.
#import "c:\Program Files\Common Files\System\ADO\msado15.dll" \
   no_namespace rename("EOF", "EndOfFile")
#include <stdio.h>

// Note 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=MyUserId;pwd=MyPassword;Provider=MSDASQL;", "", "",
               adConnectUnspecified);
// Note 2, Note 3
   pSa = SafeArrayCreateVector(VT_VARIANT, 1, 4);
   if (!pSa) _com_issue_error(E_OUTOFMEMORY);

// Specify TABLE_NAME in the third array element (index of 2).

   ix[0] = 2;
   TESTHR(SafeArrayPutElement(pSa, ix, &vtTableName));

//   There is no Variant constructor for a SafeArray, so manually set the
//   type (SafeArray of Variant) and value (pointer to a SafeArray).

   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));
// Note 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();
}

Utilisation de la propriété Get/Put/PutRef

Dans Visual Basic, le nom d'une propriété n'est pas qualifié selon que l'opération extrait la propriété, la définit ou lui affecte une référence.

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;Integrated Security=SSPI;"
rs.PageSize = 10
sz = rs.PageSize
rs.ActiveConnection = cn
rs.Open "authors",,adOpenStatic
' ...
rs.Close
cn.Close
End Sub

Cet exemple de code Visual C++ montre l'utilisation de Get/Put/PutRef Property.

Remarques Les remarques suivantes correspondent aux sections commentées de l'exemple de code.
1. Cet exemple utilise deux formes d'un argument de type chaîne manquant : une constante explicite strMissing et une chaîne que le compilateur va utiliser pour créer un type _bstr_t temporaire pour l'étendue de la méthode Open.
2. Il n'est pas nécessaire d'effectuer un cast de l'opérande de rs->PutRefActiveConnection(cn) vers (IDispatch *) car ce type est déjà (IDispatch *).
#import "c:\Program Files\Common Files\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;

// Note 1
      cn->Open("Provider=sqloledb;Data Source=MyServer;"
         "Initial Catalog=pubs;Integrated Security=SSPI;",
         strMissing, "",
         adConnectUnspecified);

      oldPgSz = rs->GetPageSize();
   // -or-
      oldPgSz = rs->PageSize;

      rs->PutPageSize(newPgSz);
   // -or-
      rs->PageSize = newPgSz;

// Note 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();
}

Utilisation de GetItem(x) et Item[x]

Cet exemple de code Visual Basic montre la syntaxe standard et la syntaxe de remplacement pour 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)
' -or-
name = rs.Fields.Item(0)
rs(0) = "Test"
rs.UpdateBatch
' Restore name
rs(0) = name
rs.UpdateBatch
rs.Close
End Sub

Le code Visual C++ suivant illustre l'utilisation de la propriété Item.

Remarque La remarque suivante correspond aux sections commentées de l'exemple de code.
1. Lorsque l'accès à la collection est effectué à l'aide de la propriété Item, l'index, 2, doit faire l'objet d'un cast vers long pour que le constructeur approprié soit invoqué.
#import "c:\Program Files\Common Files\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=MyServer;"
               "Initial Catalog=pubs;Integrated Security=SSPI;",
               adOpenStatic, adLockOptimistic, adCmdTable);
      rs->MoveFirst();

// Note 1. Get a field.
      vtFirstName = rs->Fields->GetItem((long)2)->GetValue();
   // -or-
      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);

   // Restore name
      rs->Fields->GetItem((long)2)->PutValue(vtFirstName);
      // -or-
      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();
}

Cast des pointeurs d'objets ADO à l'aide de (IDispatch *)

L'exemple de code Visual C++ suivant illustre l'utilisation de (IDispatch *) pour effectuer un cast des pointeurs d'objets ADO.

Remarques Les remarques suivantes correspondent aux sections commentées de l'exemple de code.
1. Spécifiez un objet Connection ouvert dans un type Variant codé explicitement. Effectuez un cast de cet objet avec (IDispatch *) de sorte que le constructeur approprié soit invoqué. En outre, affectez explicitement la valeur par défaut true au second paramètre _variant_t pour que le nombre de références d'objet soit correct à la fin de l'opération Recordset::Open.
2. L'expression, (_bstr_t), n'est pas un cast, mais un opérateur _variant_t qui extrait une chaîne _bstr_t du Variant renvoyé par Value.
L'expression, (char*), n'est pas un cast, mais un opérateur _bstr_t qui extrait un pointeur vers la chaîne encapsulée d'un objet _bstr_t.
Cette section de code illustre certains comportements utiles des opérateurs _variant_t et _bstr_t.
#import "c:\Program Files\Common Files\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=MyServer;"
         "Initial Catalog=pubs;Integrated Security=SSPI;",
         "", "", adConnectUnspecified);
// Note 1.
      pRst->Open(
         "authors",
         _variant_t((IDispatch *) pConn, true),
         adOpenStatic,
         adLockReadOnly,
         adCmdTable);
      pRst->MoveLast();
// Note 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();
}


Extensions Visual C++ pour ADO

La méthode recommandée de programmation de ADO avec Visual C++ consiste à utiliser la directive #import, comme indiqué dans Programmation ADO en Visual C++. Cependant, les versions antérieures de ADO ont été commercialisées avec une autre méthode de programmation Visual C++ : les extensions Visual C++. Cette section décrit cette fonctionnalité pour ceux qui doivent conserver le code des extensions Visual C++. Toutefois, il est recommandé d'écrire un nouveau code ADO à l'aide de #import.

Une des opérations les plus fastidieuses auxquelles les programmeurs Visual C++ sont confrontés lorsqu'ils extraient des données au moyen d'ADO est la conversion des données renvoyées comme type VARIANT dans un type de données C++, puis le stockage des données converties dans une classe ou structure. Le processus d'extraction des données C++ par un type de données VARIANT est non seulement fastidieux mais aussi peu performant.

ADO propose une interface qui prend en charge l'extraction de données dans des types de données C/C++ natifs sans passer par un type VARIANT et fournit aussi des macros qui facilitent l'utilisation de l'interface. Il en résulte un outil souple, plus facile à utiliser et très performant.

Le scénario client C/C++ le plus courant consiste à lier un enregistrement d'un Recordset à un struct ou une classe C/C++ contenant des types de données C/C++ natifs. L'utilisation des types de données VARIANT implique la rédaction d'un code de conversion du type de données VARIANT au type de données C/C++ natif. Les extensions Visual C++ pour ADO visent à simplifier ce scénario pour les programmeurs en Visual C++.

Pour plus d'informations sur les extensions Visual C++ pour ADO, consultez les rubriques suivantes :

  • Utilisation des extensions Visual C++ pour ADO
  • En-tête des extensions Visual C++
  • Exemple de code ADO avec extensions Visual C++

Voir aussi

Index de la syntaxe ADO pour Visual C++ pour COM | Exemple de code ADO avec extensions Visual C++ | Utilisation des extensions Visual C++ pour ADO | En-tête des extensions Visual C++


Utilisation des extensions Visual C++

Interface IADORecordBinding

Les extensions Microsoft Visual C++ pour ADO associent ou lient des champs d'un objet Recordset à des variables C/C++. Lorsque la ligne actuelle de l'objet Recordset lié subit des modifications, tous les champs liés de Recordset sont copiés dans les variables C/C++. Si nécessaire, les données copiées sont converties dans le type de données déclaré de la variable C/C++.

La méthode BindToRecordset de l'interface IADORecordBinding lie des champs à des variables C/C++. La méthode AddNew ajoute une nouvelle ligne à l'objet Recordset lié. La méthode Update remplit les champs des nouvelles lignes de l'objet Recordset ou met à jour les champs des lignes existantes en utilisant les valeurs des variables C/C++.

L'interface IADORecordBinding est implémentée par l'objet Recordset. Vous ne codez pas vous-même cette implémentation.

Entrées de liaison

Les extensions Microsoft Visual C++ pour ADO lient des champs d'un objet Recordset à des variables C/C++. La définition d'une association entre un champ et une variable est appelée une entrée de liaison. Des macros fournissent des entrées de liaison pour les données numériques, de longueur fixe et de longueur variable. Les entrées de liaison et les variables C/C++ sont déclarées dans une classe dérivée de la classe des extensions Visual C++, CADORecordBinding. La classe CADORecordBinding est définie en interne par les macros d'entrée de liaison.

ADO associe en interne les paramètres de ces macros à une structure OLE DB DBBINDING et crée un objet OLE DB Accessor pour gérer le déplacement et la conversion des données entre les champs et les variables. OLE DB définit les données en trois composantes : le tampon où les données sont stockées, l'état qui indique si un champ a été correctement stocké dans le tampon ou comment la variable doit être restaurée vers le champ et la longueur des données. (Pour plus d'informations, consultez le Guide de référence du programmeur OLE DB, au chapitre 6 : Obtention et définition des données.)

Fichier d'en-tête

Pour utiliser les extensions Visual C++ pour ADO, vous devez inclure le fichier suivant dans votre application :

#include <icrsint.h>

Liaison des champs d'un jeu d'enregistrements

Pour lier les champs d'un jeu d'enregistrements à des variables C/C++

  1. Créez une classe dérivée de la classe CADORecordBinding.
  2. Spécifiez les entrées de liaison et les variables C/C++ correspondantes dans la classe dérivée. Placez les entrées de liaison entre les macros BEGIN_ADO_BINDING et END_ADO_BINDING. N'insérez pas de virgule ni de point-virgule à la fin des macros. Les délimiteurs appropriés sont spécifiés automatiquement par chaque macro.

    Spécifiez une entrée de liaison pour chaque champ à lier à une variable C/C++. Utilisez le membre approprié de la famille de macros ADO_FIXED_LENGTH_ENTRY, ADO_NUMERIC_ENTRY ou ADO_VARIABLE_LENGTH_ENTRY.

  3. Dans votre application, créez une instance de la classe dérivée de CADORecordBinding. Obtenez l'interface IADORecordBinding à partir de l'objet Recordset. Appelez alors la méthode BindToRecordset pour lier les champs de l'objet Recordset aux variables C/C++.

Pour plus d'informations, consultez Exemple d'extensions Visual C++.

Méthodes de l'interface

L'interface IADORecordBinding propose trois méthodes : BindToRecordset, AddNew et Update. Le seul et unique argument de chaque méthode est un pointeur vers une instance de la classe dérivée de CADORecordBinding. Par conséquent, les méthodes AddNew et Update ne peuvent spécifier aucun des paramètres de leurs homologues ADO.

Syntaxe

La méthode BindToRecordset associe les champs de l'objet Recordset à des variables C/C++.

BindToRecordset(CADORecordBinding *binding)

La méthode AddNew invoque son homologue, la méthode ADO AddNew, pour ajouter une nouvelle ligne à l'objet Recordset.

AddNew(CADORecordBinding *binding)

La méthode Update invoque son homologue, la méthode ADO Update, pour mettre à jour l'objet Recordset.

Update(CADORecordBinding *binding)

Macros d'entrées de liaison

Les macros d'entrées de liaison définissent l'association entre un champ de Recordset et une variable. Une macro de début et une macro de fin délimitent l'ensemble des entrées de liaison.

Des familles de macros sont fournies pour les données de longueur fixe comme adDate ou adBoolean, pour les données numériques comme adTinyInt, adInteger ou adDouble et pour les données de longueur variable comme adChar, adVarChar ou adVarBinary. Tous les types numériques, à l'exception de adVarNumeric, sont également des types de données de longueur fixe. Chaque famille comprend un jeu de paramètres distinct qui vous permet d'exclure les informations de liaison sans intérêt.

Pour plus d'informations, consultez le Guide de référence du programmeur OLE DB, à l'annexe A : Types de données.

Début des entrées de liaison

BEGIN_ADO_BINDING(Class)

Données de longueur fixe

ADO_FIXED_LENGTH_ENTRY(Ordinal, DataType, Buffer, Status, Modify)
ADO_FIXED_LENGTH_ENTRY2(Ordinal, DataType, Buffer, Modify)

Données numériques

ADO_NUMERIC_ENTRY(Ordinal, DataType, Buffer, Precision, Scale, Status,
Modify)
ADO_NUMERIC_ENTRY2(Ordinal, DataType, Buffer, Precision, Scale, Modify)

Données de longueur variable

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)

Fin des entrées de liaison

END_ADO_BINDING()

Paramètre | Description
Class | Classe dans laquelle les entrées de liaison et les variables C/C++ sont définies.
Ordinal | Nombre ordinal (à partir de 1) qui identifie le champ du Recordset correspondant à votre variable C/C++.
DataType | Type de données ADO équivalent à la variable C/C++ (voir la liste des types de données valides dans DataTypeEnum). La valeur du champ du Recordset est convertie dans ce type de données si nécessaire.
Buffer | Nom de la variable C/C++ où sera stocké le champ de l'objet Recordset.
Size | Taille maximale en octets de la variable Buffer. Si Buffer doit contenir une chaîne de longueur variable, prévoyez une longueur suffisante pour un zéro de fin.
Status Nom d'une variable qui indique si le contenu de Buffer est valide et si la conversion du champ dans le type DataType a réussi.

Les deux principales valeurs de cette variable sont adFldOK qui indique la réussite de la conversion et adFldNull qui indique que la valeur du champ est un VARIANT de type VT_NULL et qu'elle n'est pas simplement vide.

Les valeurs possibles de Status sont répertoriées dans le tableau suivant, « Valeurs du paramètre Status ».
Modify Indicateur booléen ; la valeur TRUE indique que ADO est autorisé à mettre à jour le champ correspondant de Recordset avec la valeur contenue dans Buffer.

Affectez au paramètre modify la valeur TRUE pour permettre à ADO de mettre à jour le champ lié ou la valeur FALSE pour examiner le champ mais sans le modifier.
Precision | Nombre maximum de chiffres représentés dans une variable numérique.
Scale | Nombre de positions décimales dans une variable numérique.
Longueur | Nom d'une variable sur quatre octets qui contiendra la longueur réelle des données stockées dans Buffer.

Valeurs de Status

La valeur de la variable Status indique si un champ a correctement été copié dans une variable.

Lorsque vous définissez des données, Status peut avoir la valeur adFldNull pour indiquer que le champ de Recordset doit avoir la valeur zéro.

Constante | Valeur | Description
adFldOK | 0 | Une valeur non Null a été renvoyée pour le champ.
adFldBadAccessor | 1 | La liaison n'est pas valide.
adFldCantConvertValue | 2 | La valeur n'a pas pu être convertie pour des raisons autres que la non-compatibilité du signe ou le dépassement de capacité.
adFldNull | 3 | Lors de l'extraction d'un champ, indique qu'une valeur Null a été renvoyée. Lors de la définition d'un champ, indique que le champ doit avoir la valeur NULL lorsqu'il ne peut pas coder lui-même cette valeur (par exemple, un tableau de caractères ou un entier).
adFldTruncated | 4 | Des données de longueur variable ou des positions numériques ont été tronquées.
adFldSignMismatch | 5 | La valeur est signée et le type de données de la variable n'est pas signé.
adFldDataOverFlow | 6 | La valeur est trop longue pour être stockée dans le type de données de la variable.
adFldCantCreate | 7 | Type de colonne inconnu et champ déjà ouvert.
adFldUnavailable | 8 | Impossible de déterminer la valeur du champ, notamment pour un nouveau champ non affecté qui n'a pas de valeur par défaut.
adFldPermissionDenied | 9 | Lors d'une mise à jour, l'écriture de données n'est pas autorisée.
adFldIntegrityViolation | 10 | Lors d'une mise à jour, la valeur du champ violerait l'intégrité de la colonne.
adFldSchemaViolation | 11 | Lors d'une mise à jour, la valeur du champ violerait le schéma de la colonne.
adFldBadStatus | 12 | Lors d'une mise à jour, le paramètre Status n'est pas valide.
adFldDefault | 13 | Lors d'une mise à jour, une valeur par défaut a été utilisée.

Voir aussi

Exemple de code ADO avec extensions Visual C++ | En-tête des extensions Visual C++


En-tête des extensions Visual C++

L'en-tête icrsint.h décrit en détail l'interface qui permet aux clients d'extraire des champs d'un objet Recordset vers des variables définies dans une classe dérivée de CADORecordBinding. Pour chaque champ auquel vous avez l'intention d'accéder, vous devez définir une macro de liaison ADO.

#ifndef _ICRSINT_H_
#define _ICRSINT_H_

#include <olectl.h>
#include <stddef.h>

// forwards
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[] = {

//
// Fixed length non-numeric data
//
#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},

//
// Numeric data
//
#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},

//
// Variable length data
//
#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;}

//
// Interface that the client 'record' class needs to support. The ADO Binding entries
// provide the implementation for this interface.
//
class CADORecordBinding
{
public:
   STDMETHOD_(const ADO_BINDING_ENTRY*, GetADOBindingEntries) (VOID) PURE;
};

//
// Interface that allows a client to fetch a record of data into class data members.
//
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_

Voir aussi

Exemple de code ADO avec extensions Visual C++ | Utilisation des extensions Visual C++ pour ADO


Exemple d'extensions Visual C++

Ce programme montre comment les valeurs sont extraites des champs et converties en variables C/C++.

Il tire également parti des « pointeurs intelligents » qui gèrent automatiquement les détails spécifiques à COM en ce qui concerne l'appel de QueryInterface et le comptage des références pour l'interface IADORecordBinding.

Sans ces pointeurs intelligents, le code se présenterait ainsi :

IADORecordBinding   *picRs = NULL;
...
TESTHR(pRs->QueryInterface(
          __uuidof(IADORecordBinding), (LPVOID*)&picRs));
...
if (picRs) picRs->Release();

Avec des pointeurs intelligents, vous dérivez le type IADORecordBindingPtr de l'interface IADORecordBinding à l'aide de l'instruction suivante :

_COM_SMARTPTR_TYPEDEF(IADORecordBinding, __uuidof(IADORecordBinding));

Vous instanciez ensuite le pointeur comme suit :

IADORecordBindingPtr picRs(pRs);

Dans la mesure où les extensions Visual C++ sont implémentées par l'objet Recordset, le constructeur du pointeur intelligent picRs prend la valeur du pointeur _RecordsetPtr, pRs. Le constructeur appelle QueryInterface à l'aide de pRs pour trouver l'interface IADORecordBinding.

// Visual C++ Extensions Example
#import "c:\Program Files\Common Files\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)
         {
      // Process data in the CCustomRs C++ instance variables.
         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>"));

      // Move to the next row of the Recordset.
      // Fields in the new row will automatically be
      // placed in the CCustomRs C++ instance variables.

         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();
}

Voir aussi

Utilisation des extensions Visual C++ pour ADO | En-tête des extensions Visual C++


Utilisation de ADO avec Microsoft Visual J++

Vous pouvez implémenter ADO à l'aide de Visual J++ en procédant comme suit :

  • Avec Visual J++ 6.0 (ou une version ultérieure), utilisez ADO pour Windows Foundation Classes..
  • Avec Visual J++ 1.x, utilisez l'Assistant Bibliothèque de types Java.
  • Utilisez les utilitaires du Kit de développement Microsoft SDK for Java.

Pour plus d'informations sur l'utilisation de ADO avec Visual J++, consultez les rubriques suivantes :

  • Wrappers de classes ADO Java
  • Index de la syntaxe ADO/WFC

Voir aussi

ADO pour Windows Foundation Classes | Wrappers de classes ADO Java | Index de la syntaxe ADO/WFC | Utilisation de ADO avec Microsoft Visual Basic | Utilisation de ADO avec Microsoft Visual Visual C++ | Utilisation de ADO avec les langages de script | Utilisation de ADO avec l'Assistant Bibliothèque de types Java | Utilisation de ADO avec le Kit de développement Microsoft SDK for Java


Programmation ADO/WFC

Pour Microsoft Visual J++ 6.0, ADO a été étendu pour fonctionner avec Windows Foundation Classes (WFC) de différentes manières. Tout d'abord, un ensemble de classes Java a été implémenté pour étendre les interfaces ADO et créer des notifications intéressantes pour le programmeur Java ; ces classes Java exposent également des fonctions qui renvoient des types Java à l'utilisateur. Pour améliorer les performances, la classe Java accède directement aux types de données natifs dans l'objet de l'ensemble de lignes OLE DB et les renvoie au programmeur Java sous forme de types Java sans passer par une conversion en type Variant. ADO a également été étendu pour fonctionner avec des notifications d'événements dans le cadre de WFC.

ADO pour Windows Foundation Classes (ADO/WFC) gère toutes les méthodes, propriétés, objets et événements ADO standard. Toutefois, les opérations qui nécessitent un paramètre de type Variant et qui présentent d'excellentes performances dans un langage tel que Microsoft Visual Basic affichent des performances inférieures dans Visual J++. C'est pourquoi ADO/WFC offre également des fonctions d'accès sur l'objet Field, qui acceptent les types de données Java natifs à la place du type de données Variant.

Pour plus d'informations sur les packages ADO/WFC dans la documentation ADO, consultez l'index de la syntaxe ADO/WFC.

Pour obtenir les informations connexes de la documentation Visual J++, consultez Conversion des exemples ADO Visual Basic en Visual J++.

Référence à la bibliothèque

Pour importer les classes de données ADO/WFC dans votre projet, ajoutez la ligne suivante dans votre code :

import com.ms.wfc.data.*;

Voir aussi

Instanciation d'événements ADO par langage | Index de la syntaxe ADO/WFC | Utilisation de ADO avec l'Assistant Bibliothèque de types Java | Utilisation de ADO avec le Kit de développement Microsoft SDK for Java


Utilisation de l'Assistant Bibliothèque de types Java

L'Assistant Bibliothèque de types Java est une fonctionnalité de Visual J++ 1.x intégrée au menu Outils de l'environnement de développement. Sa fonction consiste à effectuer des recherches dans une bibliothèque de types et à créer une interface Java qui permet d'accéder à des objets COM. Pour Visual J++ 6.0, l'Assistant Bibliothèque de types Java a été remplacé par ADO pour Windows Foundation Classes.

L'Assistant Bibliothèque de types Java produit des résultats semblables à ceux des outils de la ligne de commande compris dans le Kit de développement Microsoft SDK for Java. Toutefois, les wrappers de classe générés par l'Assistant ne peuvent pas faire l'objet d'un pas à pas détaillé, à la différence de ceux générés par le Kit de développement Microsoft SDK for Java.

L'Assistant Bibliothèque de types Java génère les classes à l'emplacement suivant : \<répertoire windows>\Java\trustlib\msado15. Le fichier Summary.txt qui se trouve dans le répertoire où les classes ont été générées indique les définitions de classes qu'il a générées.

L'Assistant Bibliothèque de types Java convertit les types énumérés présents dans n'importe quelle bibliothèque de types en type INT (entier). Il définit également une interface qui correspond à chaque type énuméré dans la bibliothèque de types. Vous pouvez faire référence aux valeurs d'un type énuméré ADO à l'aide de la syntaxe suivante :

msado15.<Enum Name>.<constant Name>

Le fragment de code suivant illustre cette syntaxe pour définir la propriété CommandType d'un objet Command :

Cmd1.putCommandType( msado15.CommandTypeEnum.adCmdStoredProc );

Vous avez également la solution d'utiliser l'héritage du wrapper de type énuméré généré par l'Assistant Bibliothèque de types Java. Dans ce cas, vous pouvez retirer « msado15. » de la syntaxe. Toutefois, votre classe devrait hériter de tous les objets Java et interfaces de types énumérés auxquels elle fait référence pour éliminer complètement la nécessité de mentionner msado15.* devant tous les objets et valeurs énumérées ADO.

Vous trouverez des exemples de code supplémentaires dans la rubrique Wrappers de classes ADO Java.

Pour exécuter l'Assistant Bibliothèque de types Java à partir de Visual J++ version 1.x

  1. Dans le menu Outils, sélectionnez Assistant Bibliothèque de types Java.
  2. Sélectionnez Microsoft ActiveX Data Objects Library et cliquez sur OK. Les fichiers du répertoire \trustlib sont alors (re)générés pour ADO (par défaut, à l'emplacement c:\winnt\java\trustlib\msado15). Si vous avez déjà utilisé le Kit de développement Microsoft SDK for Java pour générer des classes pour ADO, ces dernières seront remplacées par celles de l'Assistant Bibliothèque de types Java.
  3. Pour utiliser ces fichiers, ouvrez votre projet dans Visual J++. Dans le menu Projet, choisissez Ajouter au projet. Sélectionnez Fichiers, puis ajoutez à votre projet tous les fichiers .JAVA générés dans le répertoire \trustlib (par défaut à l'emplacement c:\winnt\java\trustlib\msado15).

Voir aussi

ADO pour Windows Foundation Classes | Wrappers de classes ADO Java | Utilisation de ADO avec le Kit de développement Microsoft SDK for Java


Utilisation du Kit de développement Microsoft SDK for Java

Le Kit de développement Microsoft SDK for Java est le Kit de développement destiné à l'environnement Microsoft Internet Explorer. Il fournit des outils, des informations et des exemples de code pour vous aider à développer des programmes et applets Java sur la base de JDK 1.1 et de la machine virtuelle Win32 Microsoft (Microsoft VM). Le Kit de développement Microsoft SDK for Java n'est pas lié à Microsoft Visual J++ et peut être téléchargé à partir du site http://www.microsoft.com/Java

L'utilitaire Jactivex.exe génère des classes à partir d'une bibliothèque de types, mais il ne peut être invoqué que sur la ligne de commande. Cette fonctionnalité n'est pas intégrée à l'environnement de développement Visual J++. À la différence des classes générées par l'Assistant Bibliothèque de types Java, les wrappers de classe créés par le SDK se prêtent au pas à pas détaillé. Cette caractéristique est utile pour déboguer le code qui utilise les classes wrapper ADO.

Le mécanisme consiste à lire la bibliothèque de types ADO et à générer des classes que vous pouvez instancier dans votre application. Ces classes sont générées à l'emplacement suivant : \<répertoire windows>\Java\trustlib\msado15.

La création d'une application ADO dans Java à l'aide du Kit de développement Microsoft SDK for Java est fondamentalement identique, du point de vue du code source, à l'utilisation de l'Assistant Bibliothèque de types Java. Vous trouverez des exemples de code dans la rubrique Wrappers de classes ADO Java. La seule réelle différence concerne le mode de génération des classes wrapper, comme le montrent les étapes décrites ci-dessous.

Pour créer un projet ADO avec le Kit de développement Microsoft SDK for Java

  1. Exécutez la procédure suivante après une invite de commande. Vous devez inclure le chemin du répertoire Bin du Kit de développement Microsoft SDK for Java ou exécuter la commande à partir de cet emplacement. En général, le Kit de développement Microsoft SDK for Java est installé au même endroit que Visual Studio. L'instruction suivante constitue une seule commande.
    \<path to DevStudio>\<path to Java SDK>\bin\JactiveX.exe /javatlb "C:\program files\common files\system\ado\msado15.dll"
  2. Exécutez la commande suivante pour compiler les classes générées. Le paramètre /g:t active la génération des symboles de débogage qui vous permet de parcourir les symboles .Java. Supprimez-le pour les compilations finales.
    jvc /g:t c:\<windows>\Java\trustlib\msado15\*.Java
  3. Pour utiliser ces fichiers, ouvrez votre projet dans Visual J++. Dans le menu Projet, choisissez Ajouter au projet. Sélectionnez Fichiers, puis ajoutez l'ensemble des fichiers .JAVA générés dans le répertoire trustlib\msado15 à votre projet.

Voir aussi

ADO pour Windows Foundation Classes | Wrappers de classes ADO Java | Utilisation de ADO avec l'Assistant Bibliothèque de types Java


Wrappers de classes ADO Java

Ce code déclare une instance du wrapper de classe ADO Recordset et l'initialise, le tout sur la même ligne de code. Ensuite, il déclare des variables pour chacun des arguments de la méthode Open, notamment pour LockType et CursorType (car Java ne prend pas en charge les types énumérés). Il ouvre et ferme l'objet Recordset. L'affectation de la valeur NULL à Rs1 programme simplement la libération de cette variable au moment où Java effectue la libération systématique et intermittente des objets inutilisés.

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" );
}

Voir aussi

Utilisation de ADO avec l'Assistant Bibliothèque de types Java | Utilisation de ADO avec le Kit de développement Microsoft SDK for Java


Annexe D : Exemples ADO

Le Kit de développement MDAC contient plusieurs exemples d'applications qui illustrent l'utilisation du code ADO et RDS.

La documentation ADO contient également des exemples de code dans plusieurs langages, qui sont inclus sous forme de rubriques dans la présente aide en ligne. Pour plus d'informations sur ces exemples, consultez Exemples de code ADO.

Il existe bien d'autres ressources fournissant des exemples de code. La documentation de Visual Studio et MSDN Library contiennent toutes sortes d'exemples d'applications et d'informations susceptibles de vous aider à mieux connaître ADO et RDS.

Exemples Visual Studio

  • Site Web Visual Studio Solutions Center (en anglais)
  • Exemple d'application Island Hopper News (en anglais)
  • Exemples Visual Basic (en anglais)
  • Exemples Visual C++ (en anglais)
  • Exemples Visual InterDev (en anglais)
  • Exemples Visual J++ (en anglais)

Documentation Visual Studio

  • Visual Studio : Accès aux données et stratégies de sécurité (en anglais)
  • Visual Basic : Guide de l'accès aux données (en anglais)
  • Visual InterDev : Intégration de bases de données (en anglais)
  • Visual J++ : Accès aux données (en anglais)

Voir aussi

Guide de référence de l'API ADO | Configuration de RDS | Page de démarrage des objets de données ActiveX | Programmation avec ADO | Annexe A : Fournisseurs | Nouveautés dans ADO


Glossaire ADO

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

URL absolue

contrôle ActiveX

ADISAPI

Advanced Data Internet Server Application Programming Interface

fonction de regroupement

alias

thread cloisonné

opération asynchrone

B

entrée de liaison

masque de bits

signet

objet Business

règle d'entreprise

C

expression calculée

chapitre

alias-chapitre

jeu de caractères

enfant

alias-enfant

identificateur de classe

CLSID

niveau client

COM

composant COM

opérateur de comparaison

composant

modèle d'objet composant

fichier composé

constante

curseur

D

liaison de données

langage de définition de données

langage de manipulation de données

fournisseur de données

mise en forme des données

nom de source de données

niveau source de données

DCOM

DDL

flux par défaut

jeu d'enregistrements déconnecté

application distribuée

DCOM (Distributed Component Object Model)

DLL

DML

fournisseur de source de document

DSN

bibliothèque de liaison dynamique

propriété dynamique

E

énumération

événement

gestionnaire d'événements

F

G

H

gestionnaire

jeu d'enregistrements hiérarchique

hiérarchie

I

interface ISAPI

ISAPI

J

K

clé

L

M

marshaling

niveau intermédiaire

MIME

extension MIME

N

nœud

O

variable objet

ODBC

OLE DB

ODBC (Open Database Connectivity)

verrouillage optimiste

valeur ordinale

P

commande paramétrée

parent

alias-parent

relation parent-enfant

rendre permanent

verrouillage pessimiste

regroupement

ProgID

identificateur programmatique

proxy

Q

R

URL relative

source de données distante

enregistrement de ressource

racine

ensemble de lignes

S

schéma

portée

fournisseur de services

Recordset mis en forme

frère

procédure stockée

stub

sous-nœud

opération synchrone

T

arbre

U

URL (Uniform Resource Locator)

URL

V

W

serveur Web

X

Y

Z

Termes et définitions

URL absolue

URL complète qui spécifie l'emplacement d'une ressource résidant sur Internet ou sur un intranet. Voir aussi URL et URL relative.

Début

contrôle ActiveX

Composant COM in-process à inscription automatique qui comprend souvent un élément visuel au moment de la création ou de l'exécution. Les contrôles ActiveX présentent également la capacité de communiquer avec un conteneur « Active Document » tel que Microsoft Internet Explorer.

Début

ADISAPI (Advanced Data Internet Server Application Programming Interface)

DLL ISAPI qui assure l'analyse, le contrôle Automation, le marshaling des objets Recordset et l'empaquetage MIME. Le composant ADISAPI fonctionne via l'interface de programmation d'applications (API, Application Programming Interface) fournie par les services IIS. Voir aussi ISAPI.

Début

fonction de regroupement

Dans une requête, fonction telle que COUNT, AVG ou STDEV qui calcule une valeur en utilisant toutes les lignes d'une colonne dans une table. Dans l'écriture des expressions et dans la programmation, vous pouvez utiliser des fonctions de regroupement SQL (y compris les trois mentionnées ci-dessus) et des fonctions de regroupement de domaines pour calculer diverses statistiques.

Début

alias

Autre nom que vous pouvez donner à une colonne ou à une expression dans une instruction SQL SELECT, souvent plus court ou plus expressif. Par exemple, BobSales est l'alias dans l'instruction SELECT suivante : « Select wr-Sales as BobSales from SalesDB ». On peut utiliser un alias pour affecter dynamiquement des colonnes à des liaisons de contrôle dans l'objet DataControl.

Début

thread cloisonné

Modèle de thread cloisonné COM où tous les appels à un objet s'effectuent sur un seul thread. Dans un thread cloisonné, COM synchronise les appels et effectue un marshaling de ces derniers. Voir aussi COM.

Début

opération asynchrone

Opération qui renvoie le contrôle au programme appelant sans attendre la fin de son exécution. L'exécution du code se poursuit avant la fin de l'opération. Voir aussi opération synchrone.

Début

entrée de liaison

Association entre un champ situé dans une table et une variable. Dans les extensions Visual C++ de ADO, les champs Recordset sont associés à des variables C/C++.

Début

masque de bits

Valeur numérique destinée à une comparaison bit par bit avec d'autres valeurs numériques, généralement des options d'indicateur dans les valeurs de paramètres ou les valeurs renvoyées. Cette comparaison est habituellement effectuée avec des opérateurs logiques sur les bits tels que And et Or dans Visual Basic, & et | en C++.
Par exemple, les valeurs ADO FieldAttributeEnum peuvent être utilisées comme masques de bits pour déterminer les attributs d'un champ. Supposons que vous vouliez déterminer si un champ peut être mis à jour. Vous pouvez effectuer un test à l'aide de l'expression suivante dans Visual Basic :

Field.Attributes AND adFldUpdatable
Si le résultat de ce test est TRUE, cela signifie que le champ peut être mis à jour.

Début

signet

Marqueur qui identifie de manière unique une ligne dans un ensemble de lignes pour permettre à l'utilisateur de l'atteindre rapidement.

Début

objet Business

Objet qui effectue un ensemble défini d'opérations comme la validation de données ou la logique d'entreprise. Les objets Business résident généralement au niveau intermédiaire.

Début

règle d'entreprise

Combinaison de modifications de validations, de vérifications d'ouvertures de session, de consultations de bases de données, de stratégies et de transformations algorithmiques qui contribuent au bon fonctionnement d'une entreprise. On parle également de logique professionnelle.

Début

expression calculée

Expression qui n'est pas constante et dont la valeur dépend d'autres valeurs. Pour prendre une valeur, une expression calculée doit obtenir et calculer des valeurs provenant d'autres sources, généralement situées dans d'autres champs ou lignes.

Début

chapitre

Référence à une plage de lignes issue d'une source de données. Dans ADO, un chapitre est généralement une référence à un autre objet Recordset.
Les colonnes du chapitre permettent de définir une relation parent-enfant où le parent est l'objet Recordset qui contient la colonne du chapitre, l'enfant étant l'objet Recordset représenté par le chapitre.

Début

alias-chapitre

Alias qui fait référence à la colonne ajoutée au parent.

Début

jeu de caractères

Association entre un ensemble de caractères et leurs valeurs numériques. Par exemple, Unicode est un jeu de caractères 16 bits capable de coder tous les caractères connus ; il est utilisé comme norme de codage de caractères dans le monde entier.

Début

enfant

Élément subordonné d'une relation hiérarchique. Dans une structure hiérarchique, un enfant est un nœud au-dessus duquel se trouve un autre nœud (plus près de la racine). Voir aussi alias-enfant, relation parent-enfant, parent.

Début

alias-enfant

Alias qui fait référence à l'enfant. Voir aussi alias, enfant.

Début

identificateur de classe (CLSID)

Identificateur unique universel (UUID, Universally Unique Identifier) qui identifie un composant COM. Chaque composant COM a son identificateur de classe dans le Registre Windows, ce qui permet à d'autres applications de le charger. Voir aussi ProgID, COM.

Début

niveau client

Couche logique d'un système distribué qui présente les données à l'utilisateur et traite les données entrées par ce dernier ; on parle parfois de niveau frontal. Le niveau client demande généralement des données à un serveur en fonction des entrées, puis met en forme et affiche les résultats. Voir aussi niveau intermédiaire, niveau source de données, application distribuée.

Début

modèle d'objet composant (COM)

Norme binaire qui permet aux objets de fonctionner en interaction dans un environnement réseau, quel que soit le langage dans lequel ils ont été développés ou les ordinateurs sur lesquels ils résident. Les technologies basées sur le modèle COM comprennent les contrôles ActiveX, l'automation, ainsi que la liaison et l'incorporation d'objets (OLE, Object Linking and Embedding). Le modèle COM permet à un objet de mettre ses fonctionnalités à la disposition d'autres composants et d'héberger des applications. Il définit à la fois la manière dont l'objet expose ses propriétés, ses méthodes et ses événements mais aussi la manière dont cette exposition fonctionne à travers différents processus et différents réseaux. COM définit également le cycle de vie de l'objet.

Début

composant COM

Fichier binaire (comme les fichiers .dll, .ocx et certains fichiers .exe) qui prend en charge la norme COM pour fournir des objets. Un tel fichier contient le code d'un ou plusieurs créateurs de classes, des classes COM, des mécanismes d'entrée de Registre, du code de chargement, etc.

Début

opérateur de comparaison

Opérateur qui compare deux expressions et renvoie une valeur booléenne.
Paramètre des critères qui peut être exprimé par « > » (supérieur à), « < » (inférieur à), « = » (égal à), « >= » (supérieur ou égal à), « <= » (inférieur ou égal à), « <> » (différent de) ou « like » (condition).

Début

composant

Objet qui encapsule à la fois des données et du code et qui fournit un ensemble bien défini de services disponibles publiquement.

Début

fichier composé

Implémentation du stockage structuré par COM pour les fichiers. Un fichier composé stocke des objets distincts dans un fichier unique structuré qui consiste en deux éléments principaux : des objets de stockage et des objets de flux. Ensemble, ces éléments fonctionnent comme un système de fichiers au sein d'un fichier. Pour plus d'informations, consultez Fichiers composés dans le Kit de développement Microsoft® Platform SDK.
Un certain nombre de fichiers individuels reliés en un seul fichier physique. Chaque fichier individuel d'un fichier composé est accessible comme un fichier physique à part entière.

Début

constante

Valeur numérique ou chaîne qui ne change pas. Vous pouvez utiliser des énumérations ADO nommées (constantes énumérées) à la place de valeurs réelles dans le code ; par exemple, adUseClient est une constante dont la valeur est 3 (Const adUseClient = 3). Voir aussi énumération.

Début

curseur

Élément de base de données qui contrôle la navigation entre les enregistrements, la possibilité de mettre à jour les données et la visibilité des modifications apportées à la base de données par d'autres utilisateurs.

Début

liaison de données

Processus qui consiste à associer les objets ou contrôles d'une application à une source de données. Un contrôle associé à une source de données est appelé contrôle dépendant.
Le contenu d'un contrôle dépendant est associé à des valeurs situées dans une base de données. Par exemple, un contrôle Grid lié à un objet Recordset peut être mis à jour lorsque les lignes de Recordset sont mises à jour. Lorsque Recordset extrait de nouvelles valeurs, ces dernières s'affichent dans le contrôle Grid.

Début

fournisseur de données

Logiciel qui expose des données à une application ADO, soit directement, soit via un fournisseur de services. Voir aussi fournisseur de services.

Début

mise en forme des données

Technique qui utilise une syntaxe formalisée (appelée langage de modélisation) pour définir un objet Recordset spécialisé (appelé Recordset mis en forme) qui contient non seulement des données, mais aussi des références à d'autres objets Recordset et/ou des valeurs calculées sur la base de ces autres objets Recordset.

Début

niveau source de données

Couche logique d'un système distribué qui représente un ordinateur exécutant un système de gestion de base de données (SGBD), par exemple une base de données SQL Server. Voir aussi niveau client, niveau intermédiaire, application distribuée.

Début

DCOM

Protocole câblé qui permet à des composants COM de communiquer directement entre eux par l'intermédiaire d'un réseau. Voir aussi COM, composant.

Début

langage de définition des données (DDL)

Instructions SQL qui définissent les données, par opposition aux instructions qui les manipulent. Le schéma d'une base de données est créé ou modifié à l'aide d'instructions DDL (Data Definition Language). Par exemple, CREATE TABLE, CREATE INDEX, GRANT et REVOKE sont des instructions SQL DDL.

Début

flux par défaut

Flux de texte ou binaire (représenté par un objet Stream) qui est associé à des objets Record ou Recordset lorsque certains fournisseurs OLE DB sont utilisés, notamment Microsoft OLE DB Provider for Internet Publishing. Le flux par défaut comprend généralement le contenu d'un fichier tel que le code HTML de la racine d'un site Web.

Début

application distribuée

Programme écrit de telle sorte que le traitement puisse être divisé entre plusieurs ordinateurs d'un réseau. En général, une application distribuée se compose des couches suivantes, également appelées niveaux : présentation, logique d'entreprise et stockage des données. Voir aussi niveau client, niveau intermédiaire, niveau source de données.

Début

Recordset déconnecté

Objet Recordset situé dans le cache d'un client et qui n'a plus de connexion active avec le serveur. S'il est nécessaire d'accéder de nouveau aux données d'origine pour une raison précise, par exemple pour une mise à jour, vous devez rétablir la connexion. En revanche, les collections, propriétés et méthodes d'un objet Recordset déconnecté restent accessibles.

Début

bibliothèque de liaison dynamique (DLL)

Fichier contenant une ou plusieurs fonctions qui sont compilées, liées et stockées séparément des processus qui les utilisent. Le système d'exploitation mappe les bibliothèques de liaison dynamique dans l'espace d'adresse du processus appelant, au démarrage ou pendant l'exécution de ce dernier.

Début

langage de manipulation de données (DML)

Instructions SQL qui manipulent les données, par opposition aux instructions qui les définissent. Les valeurs d'une base de données sont sélectionnées et modifiées via le langage DML. Par exemple, INSERT, UPDATE, DELETE et SELECT sont des instructions SQL DML.

Début

fournisseur de source de document

Classe spéciale de fournisseurs qui gèrent des dossiers et des documents. Lorsqu'un document est représenté par un objet Record ou lorsqu'un dossier de documents est représenté par un objet Recordset, le fournisseur de source de document remplit ces objets à l'aide d'un ensemble unique de champs qui décrivent les caractéristiques du document, et non le document lui-même. Voir aussi enregistrement de ressource.

Début

DSN (nom de source de données)

Ensemble d'informations utilisées pour connecter votre application à une base de données ODBC particulière. Le gestionnaire de pilotes ODBC utilise ces informations pour créer une connexion à la base de données. Un nom DSN peut être stocké dans un fichier (DSN de fichier) ou dans le Registre Windows (DSN d'ordinateur).

Début

propriété dynamique

Propriété spécifique à un fournisseur de données ou au service de curseur. La collection Properties d'un objet est remplie automatiquement (« dynamiquement ») à l'aide de ces propriétés. Un objet n'a pas de propriétés dynamiques tant qu'il n'est pas connecté à une source de données via un fournisseur de données particulier. Voir aussi fournisseur de données, curseur.

Début

énumération

Liste de constantes nommées. Les valeurs énumérées ne sont pas forcément uniques. En revanche, le nom de chaque valeur doit être unique dans l'étendue dans laquelle l'énumération est définie. Dans le modèle ADO, les énumérations sont utilisées pour les valeurs des paramètres numériques et les valeurs renvoyées en vue de rendre le code ADO plus « parlant » et de soustraire le développeur à la contrainte des valeurs numériques (qui peuvent changer d'une version à l'autre). Par exemple, pour ouvrir un objet Recordset statique, utilisez la valeur énumérée adOpenStatic :

Recordset.Open ,,adOpenStatic
Appelée également constante énumérée. Voir aussi constante.

Début

événement

Action reconnue par un objet et pour laquelle vous pouvez écrire du code de réponse. Entre autres actions, les événements peuvent être générés par l'exécution d'une commande, l'achèvement d'une transaction, la navigation dans un jeu d'enregistrements ou les mises à jour de données. Voir aussi gestionnaire d'événements.

Début

gestionnaire d'événements

On appelle gestionnaire d'événements le code qui est exécuté lorsqu'un événement se produit. Voir aussi événement.

Début

gestionnaire

Routine qui gère une opération ou une condition commune et relativement simple, par exemple la récupération d'erreurs ou la gestion de données.

Début

Recordset hiérarchique

Recordset qui contient un autre Recordset. Voir aussi mise en forme des données, chapitre.
Pour plus d'informations, consultez Accès aux lignes d'un objet Recordset hiérarchique

Début

hiérarchie

De façon générale, une hiérarchie est une structure ordonnée comprenant un niveau supérieur et des niveaux subordonnés. Dans ADO, les objets Recordset hiérarchiques sont utilisés pour représenter la relation parent-enfant entre un enregistrement et un chapitre. De même, dans ADO, les objets Record et Stream peuvent être utilisés pour accéder à des arborescences hiérarchiques comme un dossier et des documents. Enfin, ADO MD comprend également des objets Hierarchy pour représenter une relation entre les niveaux d'une dimension dans un cube OLAP. Voir aussi Recordset hiérarchique, relation parent-enfant, chapitre, arbre.

Début

ISAPI (Internet Server Application Programming Interface)

Ensemble de fonctions destinées aux serveurs Internet comme les serveurs Windows NT Server/Windows 2000 Server qui exécutent Microsoft Internet Information Services (IIS).

Début

clé

Dans une table, colonnes qui identifient de manière unique une ligne ; elles sont souvent utilisées pour indexer une table.

Début

marshaling

Processus impliquant l'empaquetage, l'envoi et le dépaquetage des paramètres de méthode d'interface à travers les limites de thread ou de processus.

Début

niveau intermédiaire

Couche logique d'un système distribué située entre une interface utilisateur ou un client Web et la base de données. Il s'agit généralement du niveau où les objets Business sont instanciés. Le niveau intermédiaire est une collection de règles et de fonctions d'entreprise qui sont générées et fonctionnent à la réception de certaines informations. Ce fonctionnement est possible grâce à des règles d'entreprise, qui peuvent changer fréquemment et sont donc encapsulées dans des composants physiquement séparés de la logique de l'application elle-même. On parle également de niveau serveur d'applications. Voir aussi application distribuée, niveau client, niveau source de données.

Début

MIME (Multi-purpose Internet Mail Extension)

Protocole Internet initialement développé pour permettre l'échange de messages électroniques au contenu enrichi à travers des environnements hétérogènes sur le plan des réseaux, des machines et des messageries électroniques. En pratique, le protocole MIME a également été adopté et étendu par des applications autres que des messageries.
MIME est une norme qui permet de publier et de lire des données binaires sur Internet. L'en-tête d'un fichier de données binaires contient le type MIME de ces données ; il indique aux programmes clients (navigateurs Web et packages de courrier électronique, par exemple) que ces derniers devront traiter les données d'une autre façon que les données de texte. Par exemple, l'en-tête d'un document Web contenant un graphique JPEG contient également le type MIME spécifique au format de fichier JPEG. Ainsi, un navigateur peut afficher le fichier à l'aide de sa visionneuse JPEG, si elle est installée.

Début

nœud

Élément d'une arborescence hiérarchique. Un nœud peut être la racine ou l'enfant d'un autre nœud. Un nœud peut également être le parent de plusieurs enfants. Voir aussi hiérarchie, arbre, racine, enfant, parent.

Début

variable objet

Variable qui contient une référence à un objet. Par exemple, objCustomObject est une variable qui pointe vers un objet de type CustomObject :

Set objCustomObject = CreateObject(adodb.Recordset)

Début

ODBC (Open Database Connectivity)

Interface de langage de programmation standard permettant une connexion à diverses sources de données. Elle est généralement accessible via le Panneau de configuration, où des noms de sources de données (DSN) peuvent être définis pour utiliser des pilotes ODBC spécifiques.

Début

OLE DB

Ensemble d'interfaces qui exposent des données provenant de diverses sources utilisant le modèle COM. Les interfaces OLE DB fournissent aux applications un mode d'accès uniforme aux données stockées dans des sources d'informations disparates. Ces interfaces prennent en charge les fonctionnalités du système de gestion de base de données appropriées en fonction de la source des données, pour permettre à cette dernière de partager ses données. Voir aussi COM.

Début

verrouillage optimiste

Type de verrouillage dans lequel la page de données contenant un ou plusieurs enregistrements (y compris l'enregistrement en cours de modification) n'est plus disponible pour les autres utilisateurs pendant la mise à jour de l'enregistrement par la méthode Update, mais reste disponible avant et après l'appel de cette méthode.
Un verrouillage optimiste est utilisé lorsque l'objet Recordset est ouvert avec le paramètre ou la propriété LockType ayant pour valeur adLockOptimistic ou adLockBatchOptimistic. Voir aussi verrouillage pessimiste.

Début

valeur ordinale

Position numérique d'un élément dans une séquence ordonnée. Dans une collection ADO, la valeur ordinale du premier élément est zéro (0). La valeur ordinale de l'élément suivant est un (1), et ainsi de suite.

Début

commande paramétrée

Requête ou commande qui permet de définir les valeurs des paramètres avant l'exécution de la commande. Par exemple, il est possible de paramétrer une chaîne SQL en y incorporant des marqueurs de paramètres (désignés par le caractère « ? »). L'application spécifie ensuite des valeurs pour chaque paramètre et exécute la commande.

Début

parent

Élément dominant dans une relation hiérarchique. Dans une structure hiérarchique, un ou plusieurs nœuds enfants sont directement subordonnés à un même parent. Voir aussi alias-parent, relation parent-enfant, enfant.

Début

alias-parent

Alias qui fait référence au parent. Voir aussi alias, parent.

Début

relation parent-enfant

Dans une structure hiérarchique, relation dans laquelle le parent se trouve au niveau immédiatement supérieur par rapport à un ou plusieurs enfants. Un enfant se trouve au niveau immédiatement inférieur et doit avoir un parent unique. Voir aussi parent, enfant.

Début

rendre permanent

Enregistrer des données de façon définitive, par exemple enregistrer un objet Recordset dans un fichier.

Début

verrouillage pessimiste

Type de verrouillage dans lequel la page contenant un ou plusieurs enregistrements, y compris l'enregistrement en cours de modification, n'est plus accessible aux autres utilisateurs pour permettre une mise à jour. Le comportement du verrouillage pessimiste est défini par le fournisseur OLE DB. En règle générale, les enregistrements sont verrouillés lors de leur modification et restent indisponibles jusqu'à la fin de la méthode Update.
Le verrouillage pessimiste est activé lorsque l'objet Recordset est ouvert avec le paramètre ou la propriété LockType ayant pour valeur adLockPessimistic. Voir aussi verrouillage optimiste.

Début

regroupement

Technique d'optimisation des performances qui consiste à utiliser des collections de ressources préalablement allouées telles que des objets ou des connexions à des bases de données. Il est plus efficace de puiser des ressources dans le pool que de créer de nouvelles ressources.

Début

ProgID (identificateur programmatique)

Nom unique mappé vers le Registre Windows par une application COM. Le ProgID d'une connexion ADO est « ADODB.Connection ». Voir aussi CLSID, COM.

Début

proxy

Objet spécifique à une interface qui permet le marshaling des paramètres et la communication nécessaires à un client pour appeler un objet d'application s'exécutant dans un environnement d'exécution différent, par exemple sur un autre thread ou dans un autre processus. Le proxy se trouve au même endroit que le client et communique avec un stub se trouvant au même endroit que l'objet d'application appelé. Voir aussi stub.

Début

URL relative

URL partielle qui spécifie une ressource sur Internet ou un intranet, dont l'emplacement est défini par rapport à un point de départ spécifié par une URL absolue ou un objet ADO Connection équivalent. En effet, la concaténation des URL absolue et relative constitue une URL complète. Voir aussi URL et URL absolue.

Début

source de données distante

Source de données qui existe sur un autre ordinateur, et non sur le système local (où s'exécute l'application client).

Début

enregistrement de ressource

Enregistrement en provenance d'un fournisseur de source de document qui contient des champs pour la définition et la description d'un dossier ou d'un document. Le document lui-même n'est pas contenu dans l'enregistrement de ressource, mais il est généralement accessible au flux par défaut ou à un champ de l'enregistrement de ressource contenant une URL. Voir aussi fournisseur de source de document, flux par défaut, URL.

Début

racine

Niveau le plus haut d'une arborescence hiérarchique. Le nœud racine n'a pas de parent, mais il peut avoir des enfants. Voir aussi hiérarchie, arborescence, parent, enfant.

Début

ensemble de lignes

Ensemble de lignes issues d'une source de données et présentant toutes le même schéma de champ. Un ensemble de lignes peut représenter la totalité ou certains champs d'une table. Un ensemble de lignes peut également représenter une table virtuelle créée par une requête ou par la jointure de deux ou plusieurs tables. Dans ADO, les ensembles de lignes sont représentés par des objets Recordset.

Début

schéma

Description d'une base de données destinée au système de gestion de base de données (SGBD) et habituellement générée à l'aide du langage de définition des données fourni par le SGBD. Un schéma définit les attributs de la base de données, notamment les tables, les colonnes et les propriétés.

Début

portée

Plage de référence pour un objet ou une variable, ou plage d'enregistrements dans une vue ou une table. Par exemple, les variables locales ne peuvent être référencées qu'au sein de la procédure dans laquelle elles ont été définies. Les variables publiques sont accessibles à partir de n'importe quel partie de l'application. Les objets, tels que la base de données active, figurent dans l'étendue s'ils se trouvent dans le chemin de recherche défini. Les plages d'enregistrements peuvent être spécifiées avec une clause Scope dans de nombreuses commandes.

Début

fournisseur de services

Logiciel qui encapsule un service en produisant et en utilisant des données, ce qui augmente les fonctionnalités de vos applications ADO. Il s'agit d'un fournisseur qui n'expose pas directement les données, mais qui fournit plutôt un service tel que le traitement de requêtes. Le fournisseur de services peut traiter des données fournies par un fournisseur de données. Voir aussi fournisseur de données.

Début

Recordset mis en forme

Objet Recordset dont les colonnes ont été définies spécialement pour contenir non seulement des données, mais également des références (appelées chapitres) à d'autres objets Recordset et/ou des valeurs calculées basées sur d'autres objets Recordset.

Début

frère

Dans une structure hiérarchique, deux ou plusieurs nœuds qui se trouvent au même niveau. Le nœud racine d'une hiérarchie n'a pas de frère.

Début

procédure stockée

Ensemble précompilé de codes (par exemple les instructions SQL et instructions de contrôle de flux facultatives) stocké sous un nom unique et traité comme une seule entité. Les procédures stockées sont enregistrées dans une base de données ; elles peuvent être exécutées via un seul appel à partir d'une application et autorisent les variables déclarées par l'utilisateur, l'exécution conditionnelle et d'autres fonctionnalités de programmation puissantes.

Début

stub

Objet spécifique à une interface qui permet le marshaling et la communication des paramètres nécessaires à un objet d'application pour recevoir des appels d'un client situé dans un environnement d'exécution différent, par exemple sur un autre thread ou dans un autre processus. Le stub se trouve avec l'objet d'application et communique avec un proxy correspondant se trouvant avec le client qui l'appelle. Voir aussi proxy.

Début

sous-nœud

Voir enfant.

Début

opération synchrone

Opération déclenchée par le code et qui doit s'exécuter complètement pour que l'opération suivante puisse commencer. Voir aussi opération asynchrone.

Début

arbre

Structure qui représente une relation hiérarchique entre des éléments (nœuds). Il existe un seul nœud au plus haut niveau d'un arbre (la racine). Au-dessous de la racine, il peut y avoir plusieurs enfants. Chaque enfant peut à son tour être le parent d'autres enfants, d'où la comparaison avec les branches d'un arbre. Un dossier qui contient des documents et d'autres dossiers constitue un exemple typique d'arborescence. Voir aussi hiérarchie, nœud, racine, enfant, parent.

Début

URL (Uniform Resource Locator)

Spécifie l'emplacement d'une ressource qui réside sur Internet ou un intranet. Une URL complète se compose d'un schéma (par exemple FTP, HTTP, mailto, file etc.), suivi du signe deux-points, d'un nom de serveur et du chemin d'accès complet d'une ressource (document, graphique ou autre fichier). Voici quelques exemples d'URL :

http://www.domain.com/default.html
ftp://ftp.server.somewhere/ftp.file
file://Server/Share/File.doc
Voir aussi URL absolue et URL relative.

Début

serveur Web

Ordinateur qui fournit des services et des pages Web aux utilisateurs d'Internet et d'intranets.

Début


Guide de référence du programmeur ADO

Cette section de la documentation ADO contient des rubriques de référence pour ADO, RDS, ADO MD et ADOX.

  • Guide de référence de l'API ADO
  • Guide de référence de l'API RDS
  • Guide de référence de l'API ADO MD
  • Guide de référence de l'API ADOX


Guide de référence de l'API ADO

Cette section de la documentation ADO contient des rubriques sur chaque objet, collection, propriété, propriété dynamique, méthode, événement et énumération ADO. En outre, elle contient une liste d'index de syntaxe ADO à utiliser avec Microsoft Visual C++ et Windows Foundation Classes (WFC).

Pour plus d'informations, recherchez une rubrique particulière dans l'index ou consultez les rubriques suivantes :

  • Modèle d'objet ADO
  • Objets ADO
  • Collections ADO
  • Propriétés ADO
  • Propriétés dynamiques ADO
  • Méthodes ADO
  • Événements ADO
  • Constantes énumérées ADO
  • Index de syntaxe ADO

Voir aussi

Annexe D : Exemples ADO | Configuration de RDS | Page de démarrage des objets de données ActiveX | Annexe C : Programmation avec ADO | Annexe A : Fournisseurs | Nouveautés dans ADO


Modèle d'objet ADO

Les figures suivantes illustrent les objets et collections ADO. Cliquez sur un objet ou sur une collection pour plus d'informations.

Voir aussi

Collections ADO | Propriétés dynamiques ADO | Constantes énumérées ADO | Annexe B : Erreurs ADO | Événements ADO | Méthodes ADO | Objets ADO | Propriétés ADO


Objets et interfaces ADO

Les relations entre ces objets sont représentées dans le modèle d'objet ADO.

Chaque objet peut être contenu dans la collection correspondante. Par exemple, un objet Error peut être contenu dans une collection Errors. Pour plus d'informations, consultez Collections ADO ou une rubrique sur une collection spécifique.

ADORecordConstruction | Construit un objet ADO Record à partir d'un objet OLE DB Row dans une application C/C++.
ADORecordsetConstruction | Construit un objet ADO Recordset à partir d'un objet OLE DB Rowset dans une application C/C++.
Error | Contient des détails sur les erreurs d'accès aux données propres à une seule opération concernant le fournisseur.
Field | Représente une colonne de données avec un type de données commun.
Parameter | Représente un paramètre ou un argument relatif à un objet Command basé sur une requête paramétrée ou une procédure stockée.
Property | Représente une caractéristique dynamique d'un objet ADO défini par le fournisseur.
Record | Représente une ligne d'un objet Recordset ou encore un répertoire ou fichier dans un système de fichiers.
Recordset | Représente la totalité des jeux d'enregistrements d'une table de base ou les résultats d'une commande exécutée. L'objet Recordset fait toujours référence à un seul enregistrement du jeu comme étant l'enregistrement actuel.
Stream | Représente un flux binaire de données.

Voir aussi

Guide de référence de l'API ADO | Collections ADO | Propriétés dynamiques ADO | Constantes énumérées ADO | Annexe B : Erreurs ADO | Événements ADO | Méthodes ADO | Modèle d'objet ADO | Propriétés ADO


Interface ADORecordConstruction (ADO)

Référence de l'API ADO 2.5

Interface ADORecordConstruction

L'interface ADORecordConstruction s'utilise pour créer un objet Record ADO à partir d'un objet OLE DB Row dans une application C/C++.

Cette interface prend en charge les propriétés suivantes :

Propriétés

ParentRow | Lecture seule. Définit le conteneur d'un objet OLE DB Row sur cet objet Record ADO.
Row | Lecture/Écriture. Obtient/définit un objet OLE DB Row à partir de/sur cet objet Record ADO.

Méthodes

Aucune.

Événements

Aucun.

Remarques

Étant donné un objet OLE DB Row (pRow), la construction d'un objet Record ADO (adoR) résulte des trois opérations de base suivantes :

  1. Créer un objet RecordADO :
    _RecordPtr adoR;
adoRs.CreateInstance(__uuidof(_Record));
  2. Exécuter une requête dans l'interface IADORecordConstruction sur l'objet Record :
    adoRecordConstructionPtr adoRConstruct=NULL;
adoR->QueryInterface(__uuidof(ADORecordConstruction),
                    (void**)&adoRConstruct);
  3. Appeler la méthode de propriété IADORecordConstruction::put_Row pour définir l'objet OLE DB Row sur l'objet RecordADO :
    IUnknown *pUnk=NULL;
pRow->QueryInterface(IID_IUnknown, (void**)&pUnk);
adoRConstruct->put_Row(pUnk);

L'objet adoR qui en résulte représente l'objet Record ADO créé à partir de l'objet OLE DB Row.

Un objet Record ADO peut également être créé à partir du conteneur d'un objet OLE DB Row.

Configuration requise

Version : ADO 2.0 et version ultérieure

Bibliothèque : msado15.dll

UUID: 00000567-0000-0010-8000-00AA006D2EA4


Interface ADORecordsetConstruction (ADO)

Référence de l'API ADO 2.5

Interface ADORecordsetConstruction

L'interface ADORecordsetConstruction s'utilise pour créer un objet RecordsetADO à partir d'un objet OLE DB Rowset dans une application C/C++.

Cette interface prend en charge les propriétés suivantes :

Propriétés

Chapter | Lecture/Écriture. Obtient/définit un objet OLE DB Chapter à partir de/sur cet objet Recordset ADO.
RowPosition | Lecture/Écriture. Obtient/définit un objet OLE DB RowPosition à partir de/sur cet objet Recordset ADO.
Rowset | Lecture/Écriture. Obtient/définit un objet OLE DB Rowset à partir de/sur cet objet Recordset ADO.

Méthodes

Aucune.

Événements

Aucun.

Remarques

Étant donné un objet OLE DB Rowset (pRowset), la construction d'un objet RecordsetADO (adoRs) résulte des trois opérations de base suivantes :

  1. Créer un objet RecordsetADO :
    Recordset20Ptr adoRs;
adoRs.CreateInstance(__uuidof(Recordset));
  2. Exécuter une requête dans l'interface IADORecordsetConstruction sur l'objet Recordset :
    adoRecordsetConstructionPtr adoRsConstruct=NULL;
adoRs->QueryInterface(__uuidof(ADORecordsetConstruction),
                     (void**)&adoRsConstruct);
  3. Appeler la méthode de propriété IADORecordsetConstruction::put_Rowset pour définir l'objet OLE DB Rowset sur l'objet Recordset ADO :
    IUnknown *pUnk=NULL;
pRowset->QueryInterface(IID_IUnknown, (void**)&pUnk);
adoRsConstruct->put_Rowset(pUnk);

L'objet adoRs qui en résulte représente l'objet Recordset ADO créé à partir de l'objet OLE DB Rowset.

Vous pouvez également créer un objet Recordset ADO à partir d'un objet OLE DB Chapter ou d'un objet RowPosition.

Configuration requise

Version : ADO 2.0 et version ultérieure

Bibliothèque : msado15.dll

UUID: 00000283-0000-0010-8000-00AA006D2EA4

Recordset, objet | Rowset, propriété


Command, objet (ADO)

Référence de l'API ADO 2.5

Command, objet

Définit une commande spécifique que vous voulez exécuter sur une source de données.

Remarques

Un objet Command permet de consulter une base de données et de renvoyer des enregistrements dans un objet Recordset, d'exécuter une opération globale ou de manipuler la structure d'une base de données. Selon les fonctionnalités prises en charge par le fournisseur, certaines collections, méthodes ou propriétés des objets Command peuvent générer une erreur lorsqu'elles sont référencées.

Les collections, méthodes et propriétés d'un objet Command permettent d'effectuer les tâches suivantes :

  • Définir le texte exécutable de la commande (par exemple, une instruction SQL) à l'aide de la propriété CommandText.
  • Définir des requêtes paramétrées ou des arguments de procédures stockées à l'aide d'objets Parameter et de la collection Parameters.
  • Exécuter une commande et renvoyer un objet Recordset le cas échéant, à l'aide de la méthode Execute.
  • Spécifier le type de commande avant son exécution, à l'aide de la propriété CommandType, afin d'optimiser les performances.
  • Vérifier si le fournisseur sauvegarde ou non une version préparée (c'est-à-dire compilée) de la commande avant son exécution, à l'aide de la propriété Prepared.
  • Définir le délai d'attente (en secondes) observé par le fournisseur pour l'exécution d'une commande à l'aide de la propriété CommandTimeout.
  • Associer une connexion ouverte à un objet Command en définissant sa propriété ActiveConnection.
  • Définir la propriété Name afin d'identifier l'objet Command en tant que méthode sur l'objet Connection associé.
  • Passer un objet Command à la propriété Source d'un Recordset pour obtenir des données.
  • Accéder aux attributs spécifiques au fournisseur grâce à la collection Properties.
Remarque Vous pouvez exécuter une requête sans utiliser d'objet Command, en passant une chaîne de requête à la méthode Execute d'un objet Connection ou à la méthode Open d'un objet Recordset. Un objet Command est cependant nécessaire si vous voulez rendre permanent le texte de la commande et le réexécuter, ou utiliser des paramètres de requête.

Pour créer un objet Command indépendamment d'un objet Connection défini au préalable, affectez à sa propriété ActiveConnection une chaîne de connexion valide. ADO crée tout de même un objet Connection, mais il ne l'affecte pas à une variable objet. Si vous associez plusieurs objets Command à une même connexion, vous devez cependant créer et ouvrir explicitement un objet Connection. Ceci affecte l'objet Connection à une variable objet. Si vous ne définissez pas cette variable objet comme valeur de la propriété ActiveConnection de l'objet Command, ADO crée un nouvel objet Connection pour chaque objet Command, même si vous utilisez la même chaîne de connexion.

Pour exécuter un objet Command, il suffit de l'appeler à l'aide de sa propriété Name sur l'objet Connection associé. La propriété ActiveConnection de l'objet Command doit avoir pour valeur l'objet Connection. Si l'objet Command comporte des paramètres, passez leurs valeurs en tant qu'arguments de la méthode.

Une erreur se produit si deux objets Command ou plus sont exécutés sur la même connexion et que l'un ou l'autre de ces objets Command est une procédure stockée avec des paramètres de sortie. Pour exécuter chaque objet Command, utilisez des connexions distinctes ou détachez tous les autres objets Command de cette connexion.

La collection Parameters est le membre par défaut de l'objet Command. Par conséquent, les deux instructions suivantes sont équivalentes :

objCmd.Parameters.Item(0)
objCmd(0)

Voir aussi

Propriétés, méthodes et événements de l'objet Command | Connection, objet | Parameters, collection | Properties, collection | Annexe A : Fournisseurs

© 1998-2002 Microsoft Corporation. Tous droits réservés.


Propriétés, méthodes et événements

Référence de l'API ADO 2.5

Propriétés, méthodes et événements de l'objet Command

Propriétés/Collections

ActiveConnection, propriété

CommandText, propriété

CommandTimeout, propriété

CommandType, propriété

Name, propriété

Parameters, collection

Prepared, propriété

Properties, collection

State, propriété

Méthodes

Cancel, méthode

CreateParameter, méthode

Execute, méthode (objet Command ADO)

Événements

Aucun.

Voir aussi

Command, objet

© 1998-2002 Microsoft Corporation. Tous droits réservés.


Connection, objet (ADO)

Référence de l'API ADO 2.5

Connection, objet

Représente une connexion ouverte à une source de données.

Remarques

Un objet Connection représente une session unique avec une source de données. Dans le cas d'un système de base de données client/serveur, il peut correspondre à une connexion réseau au serveur. Selon les fonctionnalités prises en charge par le fournisseur, certaines collections, méthodes ou propriétés d'un objet Connection peuvent ne pas être disponibles.

Les collections, les méthodes et les propriétés d'un objet Connection permettent d'effectuer les tâches suivantes :

  • Configurer la connexion avant de l'ouvrir, à l'aide des propriétés ConnectionString, ConnectionTimeout, et Mode. ConnectionString est la propriété par défaut de l'objet Connection.
  • Définir la propriété CursorLocation sur le client pour appeler le Microsoft Cursor Service pour OLE DB qui prend en charge les mises à jour par lots.
  • Définir la base de données par défaut de la connexion à l'aide de la propriété DefaultDatabase.
  • Définir le niveau d'isolation pour les transactions ouvertes sur la connexion à l'aide de la propriété IsolationLevel.
  • Spécifier un fournisseur OLE DB à l'aide de la propriété Provider.
  • Établir, et par la suite interrompre, la connexion physique à la source de données à l'aide des méthodes Open et Close.
  • Exécuter une commande sur la connexion à l'aide de la méthode Execute et configurer l'exécution à l'aide de la propriété CommandTimeout.
    Remarque Vous pouvez exécuter une requête sans utiliser d'objet Command, en passant une chaîne de requête à la méthode Execute d'un objet Connection. Un objet Command est cependant nécessaire si vous voulez rendre permanent le texte de la commande et le réexécuter, ou utiliser des paramètres de requête.
  • Gérer les transactions sur la connexion ouverte, notamment les transactions imbriquées, si celles-ci sont prises en charge par le fournisseur, à l'aide des méthodes BeginTrans, CommitTrans et RollbackTrans et de la propriété Attributes.
  • Examiner les erreurs renvoyées par la source de données à l'aide de la collection Errors.
  • Vérifier le numéro de version ADO utilisée à l'aide de la propriété Version.
  • Obtenir des informations sur le schéma de votre base de données à l'aide de la méthode OpenSchema.

Vous pouvez créer des objets Connection indépendamment de tout autre objet déjà défini.

Vous pouvez exécuter des commandes ou des procédures stockées comme s'il s'agissait de méthodes natives sur l'objet Connection, comme illustré ci-après.

Exécuter une commande comme méthode native sur un objet Connection

Pour exécuter une commande, donnez un nom à la commande en utilisant la propriété Name de l'objet Command. Définissez la connexion comme valeur de la propriété ActiveConnection de l'objet Command. Ensuite, émettez une instruction dans laquelle vous utilisez le nom de la commande comme s'il s'agissait d'une méthode sur l'objet Connection, suivi des paramètres de votre choix, puis suivi d'un objet Recordset si une ou plusieurs lignes sont renvoyées. Spécifiez les propriétés de l'objet Recordset pour personnaliser le jeu d'enregistrements donné comme résultat. Par exemple :

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
...
'Your command name, any parameters, and an optional Recordset.
cnn.yourCommandName "parameter", rst

Exécuter une procédure stockée comme méthode native d'un objet Connection

Pour exécuter une procédure stockée, créez une instruction dans laquelle la procédure stockée est utilisée comme s'il s'agissait d'une méthode sur l'objet Connection suivie des paramètres de votre choix. ADO effectuera l'approximation la meilleure des types de paramètres. Par exemple :

Dim cnn As New ADODB.Connection
...
'Your stored procedure name and any parameters.
cnn.sp_yourStoredProcedureName "parameter"

Voir aussi

Propriétés, méthodes et événements de l'objet Connection | Command, objet | Errors, collection | Properties, collection | Recordset, objet | Annexe A : Fournisseurs

© 1998-2002 Microsoft Corporation. Tous droits réservés.


Propriétés, méthodes et événements

Référence de l'API ADO 2.5

Propriétés, méthodes et événements de l'objet Connection

Propriétés/Collections

Attributes, propriété

CommandTimeout, propriété

ConnectionString, propriété

ConnectionTimeout, propriété

CursorLocation, propriété

DefaultDatabase, propriété

Errors, collection

IsolationLevel, propriété

Mode, propriété

Properties, collection

Provider, propriété

State, propriété

Version, propriété

Méthodes

BeginTrans, CommitTrans et RollbackTrans, méthodes

Cancel, méthode

Close, méthode

Execute, méthode (objet Connection ADO)

Open, méthode (objet Connection ADO)

OpenSchema, méthode

Événements

BeginTransComplete, CommitTransComplete et RollbackTransComplete, événements (ADO)

ConnectComplete et Disconnect, événements

ExecuteComplete, événement

InfoMessage, événement

WillConnect, événement

WillExecute, événement

Connection, objet


Error, objet (ADO)

Référence de l'API ADO 2.5

Error, objet

Contient des détails sur les erreurs d'accès aux données propres à une seule opération concernant le fournisseur.

Remarques

Toute opération liée aux objets ADO peut générer une ou plusieurs erreurs du fournisseur. Lorsqu'une erreur se produit, un ou plusieurs objets Error peuvent être placés dans la collection Errors de l'objet Connection. Lorsqu'une autre opération ADO génère une erreur, la collection Errors est effacée et le nouveau jeu d'objets Error peut y être placé.

Remarque Chaque objet Error représente une erreur spécifique du fournisseur et non une erreur ADO. Les erreurs ADO sont soumises au mécanisme de gestion des exceptions à l'exécution. Par exemple, dans Microsoft Visual Basic, l'occurrence d'une erreur ADO déclenche un événement On Error et apparaît dans l'objet Error. Pour une liste complète des erreurs ADO, consultez la rubrique ErrorValueEnum.

La lecture des propriétés d'un objet Error permet d'obtenir des informations spécifiques sur chaque erreur, notamment :

  • La propriété Description contient le texte de l'erreur. Il s'agit de la propriété par défaut.
  • La propriété Number contient la valeur entière Long de la constante d'erreur.
  • La propriété Source identifie l'objet qui a provoqué l'erreur. Cette propriété est particulièrement utile lorsque plusieurs objets Error figurent dans la collection Errors à la suite d'une demande vers une source de données.
  • Les propriétés SQLState et NativeError fournissent des informations provenant de sources de données SQL.

Lorsqu'une erreur se rapportant au fournisseur se produit, elle est placée dans la collection Errors de l'objet Connection. ADO prend en charge le renvoi de plusieurs erreurs durant une seule opération ADO, ce qui permet d'obtenir des informations spécifiques sur le fournisseur. Pour obtenir la totalité de ces informations dans un module d'erreur, utilisez les fonctionnalités de détection d'erreur du langage ou de l'environnement dans lequel vous travaillez, puis utilisez des boucles imbriquées pour énumérer les propriétés de chaque objet Error dans la collection Errors.

Utilisateurs de Microsoft Visual Basic et VBScript S'il n'y a aucun objet Connection valide, vous devez extraire les informations sur l'erreur à partir de l'objet Error.

Tout comme les fournisseurs, ADO efface l'objet OLE Error Info avant d'effectuer un appel susceptible de provoquer une nouvelle erreur fournisseur. Toutefois, la collection Errors de l'objet Connection n'est effacée et complétée que lorsque le fournisseur génère une nouvelle erreur ou lorsque la méthode Clear est appelée.

Certaines propriétés et méthodes renvoient des avertissements qui apparaissent comme des objets Error dans la collection Errors mais qui n'interrompent pas l'exécution d'un programme. Avant d'appeler l'une des méthodes Resync, UpdateBatch ou CancelBatch sur un objet Recordset ou la méthode Open sur un objet Connection ou encore de définir la propriété Filtrer sur un objet Recordset, appelez la méthode Clear sur la collection Errors. De cette manière, vous pouvez lire la propriété Count de la collection Errors pour rechercher les avertissements éventuellement renvoyés.

Voir aussi

Exemple Visual Basic | Exemple Visual C++ | Exemple Visual J++

Propriétés, méthodes et événements de l'objet Error | Connection, objet | Errors, collection | Annexe A : Fournisseurs


Propriétés, méthodes et événements

Référence de l'API ADO 2.5

Propriétés, méthodes et événements de l'objet Error

Propriétés

Description, propriété

HelpContext, HelpFile, propriétés

NativeError, propriété

Number, propriété

Source, propriété (Error ADO)

SQLState, propriété

Méthodes

Aucune.

Événements

Aucun.

Error, objet


Field, objet (ADO)

Référence de l'API ADO 2.5

Field, objet

Représente une colonne de données avec un type de données commun.

Remarques

Chaque objet Field correspond à une colonne du Recordset. La propriété Value des objets Field permet de définir ou de renvoyer les données de l'enregistrement actuel. Selon la fonctionnalité du fournisseur, certaines collections, méthodes ou propriétés d'un objet Field peuvent ne pas être disponibles.

Les collections, méthodes et propriétés d'un objet Field permettent d'effectuer les tâches suivantes :

  • Renvoyer le nom d'un champ à l'aide de la propriété Name.
  • Afficher ou modifier les données d'un champ à l'aide de la propriété Value. Value est la propriété par défaut de l'objet Field.
  • Renvoyer les caractéristiques de base d'un champ à l'aide des propriétés Type, Precision et NumericScale.
  • Renvoyer la taille déclarée d'un champ à l'aide de la propriété DefinedSize.
  • Renvoyer la taille réelle des données d'un champ particulier à l'aide de la propriété ActualSize.
  • Déterminer les types de fonctionnalités pris en charge pour un champ donné à l'aide de la propriété Attributes et de la collection Properties.
  • Manipuler les valeurs binaires de type Long ou les caractères de type Long contenus dans les champs avec les méthodes AppendChunk et GetChunk.
  • Résoudre les différences entre les valeurs des champs pendant la mise à jour par lots à l'aide des propriétés OriginalValue et UnderlyingValue, si le fournisseur prend en charge ce type de mise à jour.

Toutes les propriétés de métadonnées (Name, Type, DefinedSize, Precision et NumericScale) sont disponibles avant l'ouverture du Recordset de l'objet Field. Il est utile de les définir à ce stade pour l'élaboration dynamique de feuilles.

Voir aussi

Propriétés, méthodes et événements de l'objet Field | Fields, collection | Properties, collection | Recordset, objet


Propriétés, méthodes et événements

Référence de l'API ADO 2.5

Propriétés, méthodes et événements de l'objet Field

Propriétés/Collections

ActualSize, propriété

Attributes, propriété

DefinedSize, propriété

Name, propriété

NumericScale, propriété

OriginalValue, propriété

Precision, propriété

Properties, collection

Status, propriété (Field ADO)

Type, propriété

UnderlyingValue, propriété

Value, propriété

Méthodes

AppendChunk, méthode

GetChunk, méthode

Événements

Aucun.

Field, objet


Parameter, objet (ADO)

Référence de l'API ADO 2.5

Parameter, objet

Représente un paramètre ou un argument relatif à un objet Command basé sur une requête paramétrée ou une procédure stockée.

Remarques

De nombreux fournisseurs prennent en charge les commandes paramétrées. Il s'agit de commandes dans lesquelles l'action requise est définie une fois pour toutes mais dont certains détails peuvent être modifiés à l'aide de variables (ou paramètres). Par exemple, une instruction SQL SELECT peut comporter un paramètre définissant le critère correspondant dans une clause WHERE et un autre définissant le nom de colonne d'une clause SORT BY.

Les objets Parameter représentent les paramètres associés à des requêtes paramétrées ou les arguments in/out et les valeurs renvoyées de procédures stockées. Selon la fonctionnalité du fournisseur, certaines collections, méthodes ou propriétés d'un objet Parameter peuvent ne pas être disponibles.

Les collections, méthodes et propriétés d'un objet Parameter permettent d'effectuer les tâches suivantes :

  • Définir ou renvoyer le nom d'un paramètre à l'aide de la propriété Name.
  • Définir ou renvoyer la valeur d'un paramètre à l'aide de la propriété Value. Value est la propriété par défaut de l'objet Parameter.
  • Définir ou renvoyer les caractéristiques d'un paramètre à l'aide des propriétés Attributes, Direction, Precision, NumericScale, Size et Type.
  • Passer des données longues binaires ou de texte à un paramètre à l'aide de la méthode AppendChunk.
  • Accéder aux attributs spécifiques au fournisseur grâce à la collection Properties.

Si vous connaissez les noms et les propriétés des paramètres associés à la procédure stockée ou à la requête paramétrée que vous voulez appeler, vous pouvez utiliser la méthode CreateParameter pour créer des objets Parameter ayant les valeurs de propriétés appropriées et la méthode Append pour les ajouter à la collection Parameters. Il est ainsi possible de définir et renvoyer les valeurs de paramètres sans appeler la méthode Refresh sur la collection Parameters pour obtenir les informations sur les paramètres auprès du fournisseur, ce qui évite une opération nécessitant une quantité importante de ressources.

Voir aussi

Propriétés, méthodes et événements de l'objet Parameter | Command, objet | CreateParameter, méthode | Parameters, collection | Properties, collection


Propriétés, méthodes et événements

Référence de l'API ADO 2.5

Propriétés, méthodes et événements de l'objet Parameter

Propriétés/Collections

Attributes, propriété

Direction, propriété

Name, propriété

NumericScale, propriété

Precision, propriété

Properties, collection

Size, propriété

Type, propriété

Value, propriété

Méthodes

AppendChunk, méthode

Événements

Aucun.

Parameter, objet


Property, objet (ADO)

Référence de l'API ADO 2.5

Property, objet

Représente une caractéristique dynamique d'un objet ADO défini par le fournisseur.

Remarques

Les objets ADO ont deux types de propriétés : intégrées et dynamiques.

Les propriétés intégrées sont celles qui sont implémentées dans ADO et immédiatement disponibles pour tout nouvel objet à l'aide de la syntaxe MyObject.Property. Elles n'apparaissent pas en tant qu'objets Property dans la collection Properties d'un objet, de sorte que vous pouvez changer leurs valeurs, mais pas modifier leurs caractéristiques.

Les propriétés dynamiques sont définies par le fournisseur de données sous-jacentes et apparaissent dans la collection Properties de l'objet ADO approprié. Par exemple, une propriété spécifique au fournisseur peut indiquer si un objet Recordset prend en charge les transactions ou les mises à jour. Ces propriétés supplémentaires apparaissent en tant qu'objets Property dans la collection Properties de cet objet Recordset. Les propriétés dynamiques peuvent uniquement être référencées via la collection, en utilisant la syntaxe MyObject.Properties(0) ou MyObject.Properties("Name").

Aucun de ces deux types de propriétés ne peut être supprimé.

Un objet Property dynamique comporte quatre propriétés intégrées qui lui sont propres :

  • La propriété Name est une chaîne qui identifie la propriété.
  • La propriété Type est un entier qui spécifie le type de données de la propriété.
  • La propriété Value est un variant qui contient la valeur de la propriété. Value est la propriété par défaut de l'objet Property.
  • La propriété Attributes est une valeur de type Long qui indique les caractéristiques de la propriété spécifiques au fournisseur.

Voir aussi

Propriétés, méthodes et événements de l'objet Property | Command, objet | Connection, objet | Field, objet | Properties, collection | Recordset, objet


Propriétés, méthodes et événements

Référence de l'API ADO 2.5

Propriétés, méthodes et événements de l'objet Property

Propriétés

Attributes, propriété

Name, propriété

Type, propriété

Value, propriété

Méthodes

Aucune.

Événements

Aucun.

Property, objet


Record, objet (ADO)

Référence de l'API ADO 2.5

Record, objet

Représente une ligne dans un objet Recordset ou encore le fournisseur de données ou un objet renvoyé par un fournisseur de données semi-structuré, notamment un fichier ou un répertoire.

Remarques

Un objet Record représente une ligne de données et présente des similitudes conceptuelles avec un Recordset à une ligne. Les objets Record peuvent être renvoyés directement par le fournisseur à la place du Recordset à une ligne, par exemple lorsqu'une requête SQL qui sélectionne une seule ligne est exécutée, si votre fournisseur prend en charge ces fonctionnalités. Ou bien, un objet Record peut être obtenu directement à partir d'un objet Recordset. Ou encore, un objet Record peut être renvoyé directement par un fournisseur à une données semi-structurée, par exemple le fournisseur OLE DB Microsoft Exchange.

Il est possible d'afficher les champs associés à un objet Record au moyen de la collection Fields de cet objet Record. ADO accepte des colonnes à valeur d'objet, y compris Recordset, SafeArray et les valeurs scalaires dans la collection Fields des objets Record.

Si l'objet Record représente une ligne dans un Recordset, il est possible de revenir à l'objet Recordset d'origine à l'aide de la propriété Source.

L'objet Record peut également être utilisé par des fournisseurs de données semi-structurés, notamment le fournisseur Microsoft OLE DB pour Internet Publishing, pour modéliser des espaces de noms structurés en arborescence. Chaque nœud de l'arborescence est un objet Record auquel sont associées des colonnes. Ces colonnes peuvent représenter les attributs du nœud et d'autres informations pertinentes. L'objet Record peut représenter un nœud de type feuille comme un nœud non-feuille dans l'arborescence. Un nœud non-feuille contient d'autres nœuds, ce qui n'est pas le cas d'un nœud feuille. Les feuilles contiennent généralement des flux de données binaires tandis que les nœuds non-feuille peuvent également être associés à un flux binaire par défaut. Les propriétés définies sur l'objet Record identifient le type de nœud.

L'objet Record constitue enfin un autre moyen de naviguer parmi des données organisées hiérarchiquement. Il est possible de créer un objet Record pour représenter la racine d'une sous-arborescence particulière dans une arborescence étendue et d'ouvrir de nouveaux objets Record pour représenter les nœuds enfants.

Une ressource (par exemple, un fichier ou un répertoire) est identifiée de manière unique par une URL absolue. Un objet Connection est implicitement créé et prend la valeur de l'objet Record lorsque ce dernier est ouvert avec une URL absolue. Un objet Connection peut être explicitement associé à l'objet Record à l'aide de la propriété ActiveConnection. Les fichiers et répertoires accessibles via l'objet Connection définissent le contexte dans lequel les opérations Record peuvent se produire.

Les méthodes de modifications et de navigation définies sur l'objet Record acceptent également une URL relative qui localise une ressource en utilisant comme point de départ une URL absolue ou le contexte de l'objet Connection.

Remarque Les URL utilisant le schéma HTTP invoquent automatiquement le fournisseur Microsoft OLE DB pour Internet Publishing. Pour plus d'informations, voir URL absolues et relatives.

Un objet Connection est associé à chaque objet Record. Par conséquent, les opérations sur l'objet Record peuvent être incluses dans une transaction par le biais des méthodes de transaction de l'objet Connection.

L'objet Record ne prend pas en charge les événements ADO et ne répond donc pas aux notifications.

Les méthodes et propriétés d'un objet Record permettent d'effectuer les tâches suivantes :

  • Définir ou renvoyer l'objet Connection associé à l'aide de la propriété ActiveConnection.
  • Indiquer des autorisations d'accès à l'aide de la propriété Mode.
  • Renvoyer l'URL du répertoire (le cas échéant) qui contient la ressource représentée par l'objet Record à l'aide de la propriété ParentURL.
  • Indiquer l'URL absolue, l'URL relative ou le Recordset d'origine de l'objet Record à l'aide de la propriété Source.
  • Indiquer l'état actuel de l'objet Record à l'aide de la propriété State.
  • Indiquer le type d'objet Record—simple, collection ou document structuré—à l'aide de la propriété RecordType .
  • Arrêter l'exécution d'une opération asynchrone à l'aide de la méthode Cancel.
  • Dissocier l'objet Record d'une source de données à l'aide de la méthode Close.
  • Copier le fichier ou répertoire représenté par un objet Record à un autre emplacement à l'aide de la méthode CopyRecord.
  • Supprimer le fichier ou le répertoire (et ses sous-répertoires) représenté par un objet Record à l'aide de la méthode DeleteRecord.
  • Ouvrir un objet Recordset contenant des lignes qui représentent les sous-répertoires et fichiers de l'entité représentée par l'objet Record à l'aide de la méthode GetChildren.
  • Déplacer (renommer) le fichier ou le répertoire (avec ses sous-répertoires) représenté par un objet Record à un autre emplacement à l'aide de la méthode MoveRecord.
  • Associer l'objet Record à une source de données existante ou encore créer un nouveau fichier ou répertoire, à l'aide de la méthode Open.

Voir aussi

Exemple Visual Basic | Exemple Visual Basic

Propriétés, méthodes et événements de l'objet Record | Fields, collection | Properties, collection | Chapitre 10 : Objets Record et Stream | Recordset, objet


Propriétés, méthodes et événements

Référence de l'API ADO 2.5

Propriétés, méthodes et événements de l'objet Record

Propriétés/Collections

ActiveConnection, propriété

Fields, collection

Mode, propriété

ParentURL, propriété

Properties, collection

RecordType, propriété

Source, propriété (Record ADO)

State, propriété

Méthodes

Cancel, méthode

Close, méthode

CopyRecord, méthode

DeleteRecord, méthode

GetChildren, méthode

MoveRecord, méthode

Open, méthode (Record ADO)

Événements

Aucun.

Record, objet


Recordset, objet (ADO)

Référence de l'API ADO 2.5

Recordset, objet

Représente la totalité des jeux d'enregistrements d'une table de base ou les résultats d'une commande exécutée. L'objet Recordset fait toujours référence à un seul enregistrement du jeu comme étant l'enregistrement actuel.

Remarques

Les objets Recordset sont utilisés pour manipuler les données d'un fournisseur. Lors de l'utilisation d'ADO, les données sont manipulées principalement à l'aide d'objets Recordset. Tous les objets Recordset sont constitués d'enregistrements (lignes) et de champs (colonnes). Selon la fonctionnalité prise en charge par le fournisseur, certaines méthodes ou propriétés des objets Recordset peuvent ne pas être disponibles.

L'identification ProgID à utiliser pour créer un objet Recordset est ADODB.Recordset. Les applications qui font référence à l'ancien ProgID ADOR.Recordset continuent de fonctionner sans recompilation, mais les nouveaux codes doivent utiliser ADODB.Recordset.

Il existe quatre types de curseurs définis dans ADO :

  • Curseur dynamique — permet de visualiser les ajouts, les modifications et les suppressions effectués par d'autres utilisateurs. Il permet également tout type de déplacement dans le Recordset ne nécessitant pas l'utilisation de signets. Ce type de curseur permet l'utilisation de signets si le fournisseur les prend en charge.
  • Curseur à jeu de clés — son fonctionnement est identique à celui d'un curseur dynamique, sauf qu'il ne permet pas de visualiser les enregistrements ajoutés par d'autres utilisateurs ni d'accéder aux enregistrements supprimés par d'autres utilisateurs. Les modifications effectuées sur les données par les autres utilisateurs sont néanmoins visibles. Ce type de curseur prend toujours en charge les signets et permet donc tout type de déplacement dans l'objet Recordset.
  • Curseur statique — fournit une copie statique d'un jeu d'enregistrements que vous pouvez utiliser pour rechercher des données ou créer des rapports. Il permet l'utilisation de signets et autorise donc tout type de déplacement dans l'objet Recordset. Les ajouts, modifications et suppressions effectués par d'autres utilisateurs ne sont pas visibles. Ce type de curseur est le seul autorisé lorsque vous ouvrez un objet Recordset côté client.
  • Curseur de défilement avant seulement — permet de faire défiler l'objet Recordset en avant seulement. Les ajouts, modifications et suppressions effectués par d'autres utilisateurs ne sont pas visibles. Ce type de curseur permet d'obtenir de meilleures performances lorsque vous devez parcourir une seule fois un objet Recordset.

Définissez la propriété CursorType avant d'ouvrir l'objet Recordset pour choisir le type de curseur ou bien passez un argument CursorType avec la méthode Open. Certains fournisseurs ne prennent pas en charge tous les types de curseurs. Vérifiez la documentation livrée avec votre fournisseur. Si vous ne spécifiez aucun type de curseur, ADO ouvre par défaut un curseur à défilement en avant.

Si la valeur de la propriété CursorLocation est adUseClient lors de l'ouverture d'un objet Recordset, la propriété UnderlyingValue sur les objets Field n'est pas disponible dans l'objet Recordset renvoyé. Avec certains fournisseurs de données (par exemple, Microsoft ODBC Provider pour OLE DB en conjonction avec Microsoft SQL Server), vous pouvez créer des objets Recordset indépendamment de tout objet Connection défini au préalable en passant une chaîne de connexion avec la méthode Open. ADO crée tout de même un objet Connection, mais il ne l'affecte pas à une variable objet. Si vous ouvrez plusieurs objets Recordset sur la même connexion, vous devez cependant créer et ouvrir explicitement un objet Connection ; cette opération affecte l'objet Connection à une variable objet. Si vous n'utilisez pas cette variable objet lors de l'ouverture de vos objets Recordset, ADO crée un nouvel objet Connection pour chaque nouvel objet Recordset, même si vous passez la même chaîne de connexion.

Vous pouvez créer autant d'objets Recordset que nécessaire.

Lorsque vous ouvrez un objet Recordset, l'enregistrement actuel est positionné sur le premier enregistrement (s'il existe) et les propriétés BOF et EOF ont la valeur False. S'il n'y a aucun enregistrement dans le Recordset, les propriétés BOF et EOF ont la valeur True.

Si le fournisseur prend en charge cette fonctionnalité, vous pouvez repositionner l'enregistrement actuel à l'aide des méthodes MoveFirst, MoveLast, MoveNext, MovePrevious et Move ou des propriétés AbsolutePosition, AbsolutePage et Filter. Les objets Recordset à défilement en avant seulement ne gèrent que la méthode MoveNext. Lorsque vous parcourez chaque enregistrement (ou énumérez l'objet Recordset) à l'aide des méthodes Move, les propriétés BOF et EOF vous permettent de vérifier si vous avez dépassé le début ou la fin de l'objet Recordset.

Les objets Recordset peuvent gérer deux types de mises à jour : immédiate et par lots. Lors d'une mise à jour immédiate, toutes les modifications apportées aux données sont écrites immédiatement dans la source de données sous-jacente lorsque vous appelez la méthode Update. Vous pouvez également passer des tableaux de valeurs en tant que paramètres avec les méthodes AddNew et Update et mettre à jour simultanément plusieurs champs d'un même enregistrement.

Si un fournisseur prend en charge la mise à jour par lots, il peut mettre les modifications effectuées sur plusieurs enregistrements en mémoire cache, puis les transmettre dans un appel unique à la base de données avec la méthode UpdateBatch. Ceci est valable pour les modifications effectuées à l'aide des méthodes AddNew, Update et Delete. Une fois la méthode UpdateBatch appelée, vous pouvez utiliser la propriété Status pour rechercher les conflits de données éventuels afin de les résoudre.

Remarque Vous pouvez exécuter une requête sans utiliser d'objet Command, en passant une chaîne de requête à la méthode Open d'un objet Recordset. Un objet Command est cependant nécessaire si vous voulez rendre permanent le texte de la commande et le réexécuter, ou utiliser des paramètres de requête.

La propriété Mode gouverne les autorisations d'accès.

La collection Fields est le membre par défaut de l'objet Recordset. Par conséquent, les deux instructions suivantes sont équivalentes :

Debug.Print objRs.Fields.Item(0)  ' Both statements print
Debug.Print objRs(0)              '  the Value of Item(0).

Voir aussi

Propriétés, méthodes et événements de l'objet Recordset | Connection, objet | Fields, collection | Properties, collection | Annexe A : Fournisseurs


Propriétés, méthodes et événements

Référence de l'API ADO 2.5

Propriétés, méthodes et événements de l'objet Recordset

Propriétés/Collections

AbsolutePage, propriété

AbsolutePosition, propriété

ActiveCommand, propriété

ActiveConnection, propriété

BOF, EOF, propriétés

Bookmark, propriété

CacheSize, propriété

CursorLocation, propriété

CursorType, propriété

DataMember, propriété

DataSource, propriété

EditMode, propriété

Fields, collection

Filter, propriété

Index, propriété

LockType, propriété

MarshalOptions, propriété

MaxRecords, propriété

PageCount, propriété

PageSize, propriété

Properties, collection

RecordCount, propriété

Sort, propriété

Source, propriété (Recordset ADO)

State, propriété

Status, propriété (Recordset ADO)

StayInSync, propriété

Méthodes

AddNew, méthode

Cancel, méthode

CancelBatch, méthode

CancelUpdate, méthode

Clone, méthode

Close, méthode

CompareBookmarks, méthode

Delete, méthode (Recordset ADO)

Find, méthode

GetRows, méthode

GetString, méthode

Move, méthode

MoveFirst, MoveLast, MoveNext et MovePrevious, méthodes

NextRecordset, méthode

Open, méthode (Recordset ADO)

Requery, méthode

Resync, méthode

Save, méthode

Seek, méthode

Supports, méthode

Update, méthode

UpdateBatch, méthode

Événements

EndOfRecordset, événement

FetchComplete, événement

FetchProgress, événement

WillChangeField et FieldChangeComplete, événements

WillChangeRecord et RecordChangeComplete, événements

WillChangeRecordset et RecordsetChangeComplete, événements

WillMove et MoveComplete, événements

Recordset, objet


Stream, objet (ADO)

Référence de l'API ADO 2.5

Stream, objet

Représente un flux de données binaires ou de texte.

Remarques

Dans les arborescences telles qu'un système de fichiers ou un système de messagerie électronique, un objet Record peut être associé à un flux binaire par défaut qui comprend le contenu du fichier ou du message électronique. Vous pouvez utiliser un objet Stream pour manipuler les champs ou les enregistrements contenant ces flux de données. Un objet Stream peut être obtenu de plusieurs manières :

  • À partir d'une URL pointant vers un objet (généralement un fichier) qui contient des données binaires ou du texte. Cet objet peut être un document simple, un objet Record (représentant un document structuré) ou un dossier.
  • En ouvrant l'objet Stream par défaut associé à un objet Record. Vous pouvez obtenir le flux par défaut associé à un objet Record lorsque ce dernier est ouvert afin d'éviter un aller-retour pour simplement ouvrir le flux.
  • En instanciant un objet Stream. Ces objets Stream peuvent être utilisés pour stocker des données à l'usage de votre application. Contrairement à un objet Stream associé à une URL et à l'objet Stream par défaut d'un objet Record, un objet Stream instancié n'est, par défaut, associé à aucune source sous-jacente.

Les méthodes et propriétés d'un objet Stream permettent d'effectuer les tâches suivantes :

  • Ouvrir un objet Stream à partir d'un objet Record ou d'une URL à l'aide de la méthode Open.
  • Fermer un objet Stream à l'aide de la méthode Close.
  • Entrer des octets ou du texte dans un objet Stream l'aide des méthodes Write et WriteText.
  • Lire le contenu d'un objet Stream à l'aide des méthodes Read et ReadText.
  • Écrire des données de l'objet Stream encore dans le tampon ADO vers l'objet sous-jacent à l'aide de la méthode Flush.
  • Copier le contenu d'un objet Stream dans un autre objet Stream à l'aide de la méthode CopyTo.
  • Contrôler le mode de lecture des lignes dans le fichier source à l'aide de la méthode SkipLine et de la propriété LineSeparator.
  • Déterminer l'emplacement de la fin du flux à l'aide de la propriété EOS et de la méthode SetEOS.
  • Enregistrer et restaurer des données dans des fichiers à l'aide des méthodes SaveToFile et LoadFromFile.
  • Spécifier le jeu de caractères utilisé pour stocker l'objet Stream à l'aide de la propriété Charset.
  • Arrêter l'exécution d'une opération Stream asynchrone à l'aide de la méthode Cancel.
  • Déterminer le nombre d'octets d'un objet Stream à l'aide de la propriété Size.
  • Contrôler la position en cours dans un objet Stream à l'aide de la propriété Position.
  • Déterminer le type des données d'un objet Stream à l'aide de la propriété Type.
  • Déterminer l'état actuel d'un objet Stream (fermé, ouvert ou en cours d'exécution) à l'aide de la propriété State.
  • Spécifier le mode d'accès associé à l'objet Stream à l'aide de la propriété Mode.
Remarque Les URL utilisant le schéma HTTP invoquent automatiquement le fournisseur Microsoft OLE DB pour Internet Publishing. Pour plus d'informations, voir URL absolues et relatives.

Voir aussi

Exemple Visual Basic

Propriétés, méthodes et événements de l'objet Stream | Chapitre 10 : Objets Record et Stream


Propriétés, méthodes et événements

Référence de l'API ADO 2.5

Propriétés, méthodes et événements de l'objet Stream

Propriétés

Charset, propriété

EOS, propriété

LineSeparator, propriété

Mode, propriété

Position, propriété

Size, propriété (Stream ADO)

State, propriété

Type, propriété (Stream ADO)

Méthodes

Cancel, méthode

Close, méthode

CopyTo, méthode

Flush, méthode

LoadFromFile, méthode

Open, méthode (Stream ADO)

Read, méthode

ReadText, méthode

SaveToFile, méthode

SetEOS, méthode

SkipLine, méthode

Stat, méthode

Write, méthode

WriteText, méthode

Événements

Aucun.

Stream, objet


Collections ADO

Les relations entre ces collections et les objets ADO sont représentées dans le modèle d'objets ADO.

Chaque collection peut contenir l'objet correspondant. Par exemple, un objet Error peut être contenu dans une collection Errors. Pour plus d'informations sur les objets, consultez Objets ADO ou une rubrique sur un objet spécifique.

Errors | Contient tous les objets Error créés en réponse à un échec unique lié au fournisseur.
Fields | Contient tous les objets Field d'un objet Recordset.
Paramètres | Contient tous les objets Parameter d'un objet Command.
Propriétés | Contient tous les objets Property d'une instance spécifique d'un objet.

Voir aussi

Guide de référence de l'API ADO | Propriétés dynamiques ADO | Constantes énumérées ADO | Annexe B : Erreurs ADO | Événements ADO | Méthodes ADO | Modèle d'objet ADO | Objets ADO | Propriétés ADO


Errors, collection (ADO)

Référence API ADO 2.5

Errors, collection

Contient tous les objets Error créés en réponse à un échec unique lié au fournisseur de données.

Remarques

Toute opération liée aux objets ADO peut générer une ou plusieurs erreurs du fournisseur. Lorsqu'une erreur se produit, un ou plusieurs objets Error peuvent être placés dans la collection Errors de l'objet Connection. Lorsqu'une autre opération ADO génère une erreur, la collection Errors est effacée et le nouveau jeu d'objets Error peut être placé dans la collection Errors.

Chaque objet Error représente une erreur spécifique du fournisseur et non une erreur ADO. Les erreurs ADO sont soumises au mécanisme de gestion des exceptions lors de l'exécution. Par exemple, dans Microsoft Visual Basic, l'occurrence d'une erreur ADO déclenche un événement onError et apparaît dans l'objet Err.

Les opérations ADO qui ne génèrent pas d'erreur n'ont aucun effet sur la collection Errors. Utilisez la méthode Clear pour effacer ou vider manuellement la collection Errors.

L'ensemble des objets Error de la collection Errors décrit toutes les erreurs qui se sont produites en réponse à une instruction unique. L'énumération des erreurs spécifiques dans la collection Errors permet à vos routines de gestion des erreurs d'identifier de façon plus précise la cause et l'origine d'une erreur et de prendre les mesures appropriées pour les résoudre.

Certaines propriétés et méthodes renvoient des avertissements qui apparaissent comme des objets Error dans la collection Errors, mais qui n'interrompent pas l'exécution d'un programme. Avant d'appeler l'une des méthodes Resync, UpdateBatch ou CancelBatch sur un objet Recordset ou la méthode Open sur un objet Connection, ou encore de définir la propriété Filter sur un objet Recordset, appelez la méthode Clear sur la collection Errors. De cette manière, vous pouvez lire la propriété Count de la collection Errors pour rechercher les avertissements éventuellement renvoyés.

Note Consultez la rubrique relative à l'objet Error pour plus d'informations sur la manière dont une seule opération ADO peut générer plusieurs erreurs.

Voir aussi

Propriétés, méthodes et événements de la collection Errors | Error, objet | Annexe A : Fournisseurs


Propriétés, méthodes et événements de la collection Errors

Propriétés

Count, propriété

Item, propriété

Méthodes

Clear, méthode

Refresh, méthode

Événements

Aucun.

Errors, collection


Fields, collection (ADO)

Référence API ADO 2.5

Fields, collection

Contient tous les objets Field d'un objet Recordset ou Record.

Remarques

Un objet Recordset dispose d'une collection Fields composée d'objets Field. Chaque objet Field correspond à une colonne du Recordset. Vous pouvez remplir la collection Fields avant d'ouvrir le Recordset en appelant la méthode Refresh sur la collection.

Note Consultez la rubrique relative à l'objet Field pour plus d'informations sur l'utilisation des objets Field.

La collection Fields comprend une méthode Append qui crée provisoirement et ajoute un objet Field à la collection et une méthode Update qui valide tout ajout ou suppression.

Un objet Record comprend deux champs spéciaux qui peuvent être indexés à l'aide de constantes FieldEnum. Une constante accède à un champ qui contient le flux par défaut associé à l'objet Record et l'autre constante accède à un champ qui contient l'URL absolue de l'objet Record.

Certains fournisseurs (notamment Microsoft OLE DB Provider pour Internet Publishing) peuvent remplir la collection Fields avec un sous-ensemble des champs disponibles pour l'objet Record ou Recordset. Pour que d'autres champs s'ajoutent à la collection, il faut qu'ils soient référencés par leur nom ou indexés par le code.

Si vous essayez de faire référence par son nom à un champ inexistant, un nouvel objet Field est ajouté à la collection Fields et la propriété Status de cet objet Field a la valeur adFieldPendingInsert. Lorsque vous appelez la méthode Update, ADO crée un nouveau champ dans la source de données si votre fournisseur l'autorise.

Voir aussi

Propriétés, méthodes et événements de la collection Fields | Field, objet


Propriétés, méthodes et événements de la collection Fields

Propriétés

Count, propriété

Item, propriété

Méthodes

Append, méthode

CancelUpdate, méthode

Delete, méthode (collection ADO Fields)

Refresh, méthode

Resync, méthode

Update, méthode

Événements

Aucun.

Fields, collection


Parameters, collection (ADO)

Référence API ADO 2.5

Parameters, collection

Comprend tous les objets Parameter d'un objet Command.

Remarques

Un objet Command possède une collection Parameters composée d'objets Parameter.

L'utilisation de la méthode Refresh sur la collection Parameters d'un objet Command extrait des informations sur des paramètres du fournisseur pour la procédure stockée ou la requête paramétrée spécifiée dans l'objet Command. Certains fournisseurs ne prennent pas en charge les appels de procédure stockée ou les requêtes paramétrées. Dans ce cas, l'appel de la méthode Refresh sur la collection Parameters renvoie une erreur.

Si vous n'avez pas défini vos propres objets Parameter et que vous accédez à la collection Parameters avant d'appeler la méthode Refresh, ADO appelle automatiquement la méthode et remplit la collection.

Il est possible de réduire les appels au fournisseur afin d'améliorer les performances si vous connaissez les propriétés des paramètres associés à la procédure stockée ou à la requête paramétrée que vous souhaitez appeler. Utilisez la méthode CreateParameter pour créer des objets Parameter aux propriétés correctement définies et utilisez la méthode Append pour les ajouter à la collection Parameters. Cela vous permet de définir et de renvoyer des valeurs de paramètres sans avoir à appeler le fournisseur pour obtenir les informations relatives aux paramètres. Si vous écrivez à un fournisseur qui ne fournit pas d'informations sur les paramètres, vous devez renseigner manuellement la collection Parameters à l'aide de cette méthode pour pouvoir utiliser des paramètres. Utilisez la méthode Delete pour supprimer, au besoin, les objets Parameter de la collection Parameters.

Les objets de la collection Parameters d'un Recordset se mettent hors de portée (devant de fait, indisponibles) lorsque le Recordset est fermé.

Voir aussi

Propriétés, méthodes et événements de la collection Parameters | Append, méthode | CreateParameter, méthode | Parameter, objet


Propriétés, méthodes et événements de la collection Parameters

Propriétés

Count, propriété

Item, propriété

Méthodes

Append, méthode

Delete, méthode (collection ADO Parameters)

Refresh, méthode

Événements

Aucun.

Parameters, collection


Properties, collection (ADO)

Référence API ADO 2.5

Properties, collection

Comprend tous les objets Property pour une occurrence spécifique d'un objet.

Remarques

Certains objets ADO possèdent une collection Properties composée d'objets Property. Chaque objet Property correspond à une caractéristique de l'objet ADO spécifique au fournisseur de données.

Note Consultez la rubrique relative à l'objet Property pour plus d'informations sur l'utilisation des objets Property.

Les Propriétés dynamiques de l'objet Recordset se mettent hors de portée (devant indisponibles) lors de la fermeture du Recordset.

Voir aussi

Propriétés, méthodes et événements de la collection Properties | Property, objet | Annexe A : Fournisseurs


Propriétés, méthodes et événements de la collection Properties

Propriétés

Count, propriété

Item, propriété

Méthodes

Refresh, méthode

Événements

Aucun.

Properties, collection


Propriétés ADO

AbsolutePage | Indique la page où réside l'enregistrement actuel.
AbsolutePosition | Indique le numéro d'ordre de l'enregistrement actuel d'un objet Recordset.
ActiveCommand | Indique l'objet Command qui a créé l'objet Recordset correspondant.
ActiveConnection | Indique l'objet Connection auquel appartient l'objet Command, Recordset ou Record spécifié.
ActualSize | Indique la longueur de la valeur d'un champ.
Attributes | Indique une ou plusieurs caractéristiques d'un objet.
BOF et EOF | BOF : indique que l'enregistrement actuel est positionné avant le premier enregistrement dans un objet Recordset. EOF : indique que l'enregistrement actuel est positionné après le dernier enregistrement dans un objet Recordset.
Bookmark | Indique un signet qui identifie l'enregistrement actuel de façon unique dans un objet Recordset ou définit comme enregistrement actuel dans un objet Recordset l'enregistrement identifié par un signet valide.
CacheSize | Indique le nombre d'enregistrements d'un objet Recordset qui se trouvent dans la mémoire cache locale.
Chapter | Obtient ou définit un objet OLE DB Chapter à partir de/sur l'objet ADORecordsetConstruction.
CharSet | Indique le jeu de caractères dans lequel le contenu d'un objet Stream texte doit être traduit.
CommandText | Indique le texte d'une commande à envoyer à un fournisseur.
CommandTimeout | Indique le délai à respecter, lors de l'exécution d'une commande, avant d'interrompre la tentative et de générer un message d'erreur.
CommandType | Indique le type d'un objet Command.
ConnectionString | Indique les informations utilisées pour établir une connexion avec une source de données.
ConnectionTimeout | Indique le délai à respecter, lors de l'établissement d'une connexion, avant d'interrompre la tentative et de générer un message d'erreur.
Count | Indique le nombre d'objets dans une collection.
CursorLocation | Indique l'emplacement du service cursor.
CursorType | Indique le type de curseur utilisé dans un objet Recordset.
DataMember | Indique le nom du membre de données à extraire de l'objet défini par la propriété DataSource.
DataSource | Indique un objet qui contient des données à représenter comme objet Recordset.
DefaultDatabase | Indique la base de données par défaut d'un objet Connection.
DefinedSize | Indique la capacité d'un objet Field.
Description | Décrit un objet Error.
Direction | Indique si l'objet Parameter correspond à un paramètre d'entrée, un paramètre de sortie ou les deux, ou si le paramètre est la valeur de renvoi d'une procédure stockée.
EditMode | Indique l'état de modification de l'enregistrement actuel.
EOS | Indique si la position actuelle est située à la fin du flux.
Filter | Indique un filtre de données dans un objet Recordset.
HelpContext et HelpFile | Indique le fichier et la rubrique d'aide associés à un objet Error. HelpContextID : renvoie, sous la forme d'une valeur de type Long, un ID de contexte qui correspond à une rubrique dans un fichier d'aide. HelpFile : renvoie une valeur de type String qui correspond au chemin complet d'un fichier d'aide.
Index | Indique le nom de l'index actuel appliqué à un objet Recordset.
IsolationLevel | Indique le niveau d'isolation d'un objet Connection.
Item | Indique un membre particulier d'une collection, par son nom ou par son numéro d'ordre.
LineSeparator | Indique le caractère binaire à utiliser comme séparateur de ligne dans les objets Stream texte.
LockType | Indique le type de verrouillage des enregistrements lors des modifications.
MarshalOptions | Indique les enregistrements qui doivent être à nouveau l'objet d'un marshaling vers le serveur.
MaxRecords | Indique le nombre maximal d'enregistrements à renvoyer à Recordset à partir d'une requête.
Mode | Indique les autorisations de modification de données associées à un objet Connection, Record ou Stream.
Nom | Indique le nom d'un objet.
NativeError | Indique le code d'erreur spécifique du fournisseur pour un objet Error donné.
Numéro | Indique le numéro qui identifie de manière unique un objet Error.
NumericScale | Indique l'échelle des valeurs numériques d'un objet Parameter ou Field.
OriginalValue | Indique la valeur d'un objet Field qui existait dans l'enregistrement avant toute modification.
PageCount | Indique le nombre de pages de données contenues dans l'objet Recordset.
PageSize | Indique le nombre d'enregistrements dans une page de l'objet Recordset.
ParentRow | Définit le conteneur d'un objet OLE DB Row sur un objet ADORecordConstruction, de sorte que le parent de la ligne soit converti en objet ADO Record.
ParentURL | Indique une chaîne d'URL absolue qui pointe vers l'objet Record parent de l'objet Record actuel.
Position | Indique la position actuelle dans un objet Stream.
Precision | Indique le degré de précision des valeurs numériques dans un objet Parameter ou pour des objets Field numériques.
Prepared | Indique si la version compilée d'une commande doit être enregistrée avant exécution.
Provider | Indique le nom du fournisseur d'un objet Connection.
RecordCount | Indique le nombre d'enregistrements dans un objet Recordset.
RecordType | Indique le type d'objet Record.
Row | Obtient ou définit un objet OLE DB Row à partir de/sur l'objet ADORecordConstruction.
RowPosition | Obtient ou définit un objet OLE DB RowPosition à partir de/sur l'objet ADORecordsetConstruction.
Rowset | Obtient ou définit un objet OLE DB Rowset à partir de/sur l'objet ADORecordsetConstruction.
Size | Indique la taille maximale, en octets ou en caractères, d'un objet Parameter.
Size (objet ADO Stream) | Indique la taille totale du flux en octets.
Sort | Spécifie un ou plusieurs noms de champ de tri pour l'objet Recordset et détermine si chaque champ est trié en ordre croissant ou décroissant.
Source (objet ADO Error) | Indique le nom de l'objet ou de l'application qui est à l'origine d'une erreur.
Source (objet ADO Record) | Indique l'entité représentée par l'objet Record.
Source (objet ADO Recordset) | Indique la source des données dans un objet Recordset.
SQLState | Indique l'état SQL pour un objet Error donné.
State | Indique, pour tout objet applicable, si l'objet est dans un état ouvert ou fermé. Pour tous les objets applicables qui exécutent une méthode asynchrone, indique si l'objet est en cours de connexion, d'exécution ou d'extraction.
Status (objet ADO Field) | Indique l'état d'un objet Field.
Status (objet ADO Recordset) | Indique l'état de l'enregistrement actuel par rapport à des mises à jour par lots ou d'autres opérations globales.
StayInSync | Indique, dans un objet Recordset hiérarchique, si la référence aux enregistrements enfants sous-jacents (c'est-à-dire, le chapitre) change lorsque la position de la ligne parent change.
Type | Indique le type opérationnel ou le type de données d'un objet Parameter, Field ou Property.
Type (objet ADO Stream) | Indique le type des données (binaires ou texte) contenues dans l'objet Stream.
UnderlyingValue | Indique la valeur actuelle d'un objet Field dans la base de données.
Value | Indique la valeur affectée à un objet Field, Parameter ou Property.
Version | Indique le numéro de version de ADO.

Voir aussi

Guide de référence de l'API ADO | Collections ADO | Propriétés dynamiques ADO | Constantes énumérées ADO | Annexe B : Erreurs ADO | Événements ADO | Méthodes ADO | Modèle d'objet ADO | Objets ADO

© 1998-2002 Microsoft Corporation. Tous droits réservés.


AbsolutePage, propriété (ADO)

Référence de l'API ADO 2.5

AbsolutePage, propriété

Indique la page où réside l'enregistrement actuel.

Paramètres et valeurs renvoyées

Définit ou renvoie une valeur de type Long comprise entre 1 et le nombre de pages total de l'objet Recordset (PageCount), ou renvoie une des valeurs PositionEnum.

Remarques

Cette propriété permet d'identifier le numéro de page de l'enregistrement actuel. Elle utilise la propriété PageSize pour découper logiquement le nombre total de lignes de l'objet Recordset en une série de pages, contenant chacune un nombre d'enregistrements égal à PageSize (à l'exception de la dernière page qui peut comporter moins d'enregistrements). Pour que cette propriété soit disponible, la fonctionnalité appropriée doit être prise en charge par le fournisseur de données.

Lors de l'obtention ou de la définition de la propriété AbsolutePage, ADO utilise la propriété AbsolutePosition et la propriété PageSize ensemble comme suit :

  • Pour obtenir la propriété AbsolutePage, ADO extrait d'abord la propriété AbsolutePosition, puis la divise par la propriété PageSize.
  • Pour définir la propriété AbsolutePage, ADO déplace la propriété AbsolutePosition comme suit : la propriété PageSize est multipliée par la nouvelle valeur AbsolutePage, puis 1 est ajouté à cette valeur. Ainsi, la position en cours dans le Recordset après la définition de la propriété AbsolutePage correspond au premier enregistrement de cette page.

Comme la propriété AbsolutePosition, AbsolutePage a une valeur unique qui est égale à 1 lorsque l'enregistrement actuel est le premier du Recordset. Vous pouvez la définir pour qu'elle atteigne le premier enregistrement d'une page donnée. Le nombre total de pages peut être obtenu avec la propriété PageCount.

Voir aussi

Exemple Visual Basic | Exemple Visual C++ | Exemple Visual J++

AbsolutePosition, propriété | PageCount, propriété | PageSize, propriété

S'applique à : Recordset, objet

© 1998-2002 Microsoft Corporation. Tous droits réservés.


AbsolutePosition, propriété (ADO)

Référence de l'API ADO 2.5

AbsolutePosition, propriété

Indique le numéro d'ordre de l'enregistrement actuel d'un objet Recordset.

Paramètres et valeurs renvoyées

Définit ou renvoie une valeur de type Long comprise entre 1 et le nombre d'enregistrements total de l'objet Recordset (RecordCount), ou renvoie une des valeurs PositionEnum.

Remarques

Pour définir la propriété AbsolutePosition, ADO requiert que le fournisseur OLE DB que vous utilisez implémente l'interface IRowsetLocate.

L'accès à la propriété AbsolutePosition d'un objet Recordset qui a été ouvert à l'aide d'un curseur à défilement avant ou d'un curseur statique génère l'erreur adErrFeatureNotAvailable. Avec les autres types de curseurs, la position correcte est renvoyée si le fournisseur prend en charge l'interface IRowsetScroll. Dans le cas contraire, la propriété a la valeur adPosUnknown. Consultez la documentation pour votre fournisseur afin de déterminer s'il prend en charge l'interface IRowsetScroll.

Utilisez la propriété AbsolutePosition pour atteindre un enregistrement en fonction de son numéro d'ordre dans l'objet Recordset ou pour déterminer le numéro d'ordre de l'enregistrement actuel. Pour que cette propriété soit disponible, la fonctionnalité appropriée doit être prise en charge par le fournisseur de données.

Comme la propriété AbsolutePage, la propriété AbsolutePosition a une valeur unique qui est égale à 1 lorsque l'enregistrement actuel est le premier du Recordset. La propriété RecordCount permet d'obtenir le nombre total d'enregistrements d'un objet Recordset.

Lorsque vous définissez la propriété AbsolutePosition, même s'il s'agit d'un enregistrement se trouvant en mémoire cache, ADO recharge en mémoire cache un nouveau groupe d'enregistrements à partir de celui que vous avez spécifié. La propriété CacheSize définit la taille de ce groupe d'enregistrements.

Remarque Vous ne devez pas utiliser la propriété AbsolutePosition à la place du numéro d'enregistrement. En effet, la position d'un enregistrement change si vous supprimez des enregistrements en amont. Par ailleurs, la valeur AbsolutePosition d'un enregistrement donné n'est pas obligatoirement la même à chaque fois que l'objet Recordset est interrogé ou ouvert. Les signets restent la méthode la plus commode pour enregistrer une position et la retrouver ; ils constituent également la seule méthode de positionnement parmi tous les types d'objets Recordset.

Voir aussi

Exemple Visual Basic | Exemple Visual C++ | Exemple Visual J++

AbsolutePage, propriété | RecordCount, propriété

S'applique à : Recordset, objet

© 1998-2002 Microsoft Corporation. Tous droits réservés.


ActiveCommand, propriété (ADO)

Référence de l'API ADO 2.5

ActiveCommand, propriété

Indique l'objet Command qui a créé l'objet Recordset correspondant.

Valeur renvoyée

Renvoie une donnée de type Variant qui contient un objet Command. La valeur par défaut est une référence d'objet nulle.

Remarques

La propriété ActiveCommand est accessible en lecture seule.

Si aucun objet Command n'a été utilisé pour créer le Recordset en cours, la valeur Null est renvoyée.

Utilisez cette propriété lorsque vous n'avez que l'objet Recordset résultant pour trouver l'objet Command associé.

Voir aussi

Exemple Visual Basic |Exemple JScript | Exemple VC++ | Exemple VJ++

Command, objet

S'applique à : Recordset, objet


ActiveConnection, propriété (ADO)

Référence de l'API ADO 2.5

ActiveConnection, propriété

Indique l'objet Connection auquel appartient l'objet Command, Recordset ou Record spécifié.

Paramètres et valeurs renvoyées

Définit ou renvoie soit une valeur de type String contenant la définition d'une connexion si la connexion est fermée, soit une valeur de type Variant contenant l'objet Connection en cours si la connexion est ouverte. La valeur par défaut est une référence d'objet nulle. Voir la propriété ConnectionString.

Remarques

Utilisez la propriété ActiveConnection pour déterminer l'objet Connection utilisé pour exécuter l'objet Command spécifié ou ouvrir l'objet Recordset spécifié.

Command

Pour les objets Command la propriété ActiveConnection est accessible en lecture/écriture.

Si vous essayez d'appeler la méthode Execute sur un objet Command avant d'affecter comme valeur à cette propriété un objet Connection ouvert ou une chaîne de connexion valide, une erreur se produit.

Microsoft Visual Basic Si vous affectez la valeur Nothing à la propriété ActiveConnection, l'objet Command est dissocié de l'objet Connection en cours et le fournisseur libère toutes les ressources associées dans la source de données. Vous pouvez alors associer l'objet Command au même objet Connection ou à un autre. Certains fournisseurs vous permettent de changer la valeur de cette propriété sans lui affecter dans un premier temps la valeur Nothing.
Si la collection Parameters de l'objet Command contient des paramètres fournis par le fournisseur, cette collection est effacée si vous affectez la valeur Nothing ou un autre objet Connection à la propriété ActiveConnection. Si vous créez manuellement des objets Parameter et les utilisez pour remplir la collection Parameters de l'objet Command, la collection Parameters reste intacte si vous affectez la valeur Nothing ou un autre objet Connection à la propriété ActiveConnection.
Lorsque vous fermez un objet Connection auquel un objet Command est associé, la propriété ActiveConnection prend la valeur Nothing. Si vous affectez un objet Connection fermé à cette propriété, une erreur se produit.

Recordset

Avec les objets Recordset ouverts ou les objets Recordset dont la propriété Source a pour valeur un objet Command valide, la propriété ActiveConnection est accessible en lecture seule. Dans les autres cas, elle est accessible en lecture/écriture.

Vous pouvez lui affecter un objet Connection ou une chaîne de connexion valide. Dans ce cas, le fournisseur crée un nouvel objet Connection à partir de cette valeur et ouvre la connexion. En outre, le fournisseur peut attribuer à cette propriété le nouvel objet Connection pour que vous puissiez y accéder en vue d'obtenir des informations sur les erreurs ou d'exécuter d'autres commandes.

Si vous utilisez l'argument ActiveConnection de la méthode Open pour ouvrir un objet Recordset, la propriété ActiveConnection prend la valeur de cet argument.

Si vous affectez à la propriété Source de l'objet Recordset une variable d'objet Command valide, la propriété ActiveConnection du Recordset prend la valeur de la propriété ActiveConnection de l'objet Command.

Utilisation de Remote Data Service Lorsqu'elle est utilisée avec un objet Recordset côté client, cette propriété n'accepte comme valeur qu'une chaîne de connexion ou (dans Microsoft Visual Basic ou Visual Basic, Scripting Edition) Nothing.

Record

Cette propriété est accessible en lecture/écriture lorsque l'objet Record est fermé, et peut contenir une chaîne de connexion ou la référence à un objet Connection ouvert. Cette propriété est accessible en lecture seule lorsque l'objet Record est ouvert, et contient une référence à un objet Connection ouvert.

Un objet Connection est créé implicitement lorsque l'objet Record est ouvert à partir d'une adresse URL. Ouvrez l'objet Record avec un objet Connection ouvert existant en affectant cet objet Connection à la propriété ActiveConnection ou en utilisant l'objet Connection comme paramètre dans l'appel de la méthode Open. Si l'objet Record est ouvert à partir d'un objet Record ou Recordset existant, il est automatiquement associé à l'objet Connection de cet objet Record ou Recordset.

Remarque Les URL utilisant le schéma HTTP invoquent automatiquement le fournisseur Microsoft OLE DB pour Internet Publishing. Pour plus d'informations, voir URL absolues et relatives.

Voir aussi

Exemple Visual Basic | Exemple Visual C++ | Exemple Visual J++ | Exemple JScript

Connection, objet | ConnectionString, propriété

S'applique à : Command, objet | Record, objet | Recordset, objet


ActualSize, propriété (ADO)

Référence de l'API ADO 2.5

ActualSize, propriété

Indique la longueur de la valeur d'un champ.

Paramètres et valeurs renvoyées

Renvoie une valeur de type Long. Avec certains fournisseurs, cette propriété peut être définie de manière à garder un espace suffisant pour les données BLOB, auquel cas la valeur par défaut est égale à 0.

Remarques

Utilisez la propriété ActualSize pour renvoyer la longueur réelle de la valeur d'un objet Field. Pour tous les champs, la propriété ActualSize t accessible en lecture seule. Si ADO ne peut pas déterminer la longueur de la valeur de l'objet Field, la propriété ActualSize renvoie adUnknown.

Les propriétés ActualSize et DefinedSize sont différentes, comme le montre l'exemple suivant. Un objet Field avec un type adVarChar déclaré et une longueur maximale de 50 caractères revoie la valeur 50 pour la propriété DefinedSize mais pour la propriété ActualSize il renvoie une valeur correspondant à la longueur des données stockées dans le champ de l'enregistrement actuel. Les objets Fields dont la propriété DefinedSize a une valeur supérieure à 255 octets sont traités comme des colonnes de longueur variable.

Voir aussi

Exemple Visual Basic | Exemple Visual C++ | Exemple Visual J++

DefinedSize, propriété

S'applique à : Field, objet


Attributes, propriété (ADO)

Référence de l'API ADO 2.5

Attributes, propriété

Indique une ou plusieurs caractéristiques d'un objet.

Paramètres et valeurs renvoyées

Définit ou renvoie une valeur de type Long.

Avec un objet Connection, la propriété Attributes est accessible en lecture/écriture et sa valeur peut être la somme de valeurs XactAttributeEnum. La valeur par défaut est zéro (0).

Avec un objet Parameter, la propriété Attributes est accessible en lecture/écriture et sa valeur peut être la somme de valeurs ParameterAttributesEnum. La valeur par défaut est adParamSigned.

Avec un objet Field, la propriété Attributes peut être la somme de valeurs FieldAttributeEnum. Elle est normalement accessible en lecture seule. Toutefois, dans le cas de nouveaux objets Field ajoutés à la collection Fields d'un objet Record, la propriété Attributes est accessible en lecture/écriture une fois seulement que la propriété Value de l'objet Field a été spécifiée et que le nouvel objet Field a été ajouté par le fournisseur de données à l'aide de la méthode Update de la collection Fields.

Avec un objet Property, la propriété Attributes est accessible en lecture seule et sa valeur peut être la somme de valeurs PropertyAttributesEnum.

Remarques

Utilisez la propriété Attributes pour définir ou renvoyer les caractéristiques des objets Connection, Parameter, Field ou Property.

Lorsque vous définissez des attributs multiples, vous pouvez faire la somme des constantes correspondantes. Si cette somme comporte des constantes incompatibles, une erreur se produit.

Utilisation de Remote Data Service Cette propriété n'est pas disponible sur un objet Connection côté client.

Voir aussi

Exemple Visual Basic | Exemple Visual C++ | Exemple Visual J++

AppendChunk, méthode | BeginTrans, CommitTrans et RollbackTrans, méthodes | GetChunk, méthode

S'applique à : Connection, objet | Field, objet | Parameter, objet | Property, objet


BOF, EOF, propriétés (ADO)

Référence de l'API ADO 2.5

BOF, EOF, propriétés

  • BOF — indique que l'enregistrement actuel est positionné avant le premier enregistrement dans un objet Recordset.
  • EOF — indique que l'enregistrement actuel est positionné avant le premier enregistrement dans un objet Recordset.

Valeur renvoyée

Les propriétés BOF et EOF envoient des valeurs de type Boolean.

Remarques

Les propriétés BOF et EOF permettent de savoir si un objet Recordset contient des enregistrements ou si vous avez dépassé les limites d'un objet Recordset lorsque vous passez d'un enregistrement à l'autre.

La propriété BOF renvoie la valeur True (-1) si l'enregistrement actuel est positionné avant le premier enregistrement ; elle renvoie la valeur False (0) si l'enregistrement actuel est positionné sur ou après le premier enregistrement.

La propriété EOF renvoie la valeur True si l'enregistrement actuel est positionné après le dernier enregistrement ; elle renvoie la valeur False si l'enregistrement actuel est positionné sur ou avant le dernier enregistrement.

Si une des propriétés BOF ou EOF a la valeur True, il n'y a pas d'enregistrement actuel.

Si vous ouvrez un objet Recordset qui ne contient aucun enregistrement, les propriétés BOF et EOF ont la valeur True (voir la propriété RecordCount pour plus d'informations sur cet état d'un Recordset). Lorsque vous ouvrez un objet Recordset qui contient au moins un enregistrement, le premier est l'enregistrement actuel et les propriétés BOF et EOF ont la valeur False.

Si vous supprimez le seul enregistrement qui reste dans l'objet Recordset, les propriétés BOF et EOF peuvent conserver la valeur False jusqu'à ce que vous essayiez de repositionner l'enregistrement actuel.

Le tableau ci-dessous indique les méthodes Move autorisées avec différentes combinaisons des propriétés BOF et EOF.

 | MoveFirst, MoveLast | MovePrevious, Move < 0 | Move 0 | MoveNext, Move > 0
BOF=True, EOF=False | Autorisée | Erreur | Erreur | Autorisée
BOF=False, EOF=True | Autorisée | Autorisée | Erreur | Erreur
Toutes les deux True | Erreur | Erreur | Erreur | Erreur
Toutes les deux False | Autorisée | Autorisée | Autorisée | Autorisée

Le fait qu'une méthode Move soit autorisée ne garantit pas qu'elle va réussir à localiser un enregistrement, mais seulement que vous pouvez appeler cette méthode sans générer d'erreur.

Le tableau suivant montre ce qu'il advient des propriétés BOF et EOF lorsque vous appelez diverses méthodes Move, mais sans parvenir à localiser un enregistrement.

 | BOF | EOF
MoveFirst, MoveLast | Prend la valeur True | Prend la valeur True
Move 0 | Inchangée | Inchangée
MovePrevious, Move < 0 | Prend la valeur True | Inchangée
MoveNext, Move > 0 | Inchangée | Prend la valeur True

Voir aussi

Exemple Visual Basic | Exemple Visual C++ | Exemple Visual J++

S'applique à : Recordset, objet


Bookmark, propriété (ADO)

Référence de l'API ADO 2.5

Bookmark, propriété

Indique un signet qui identifie l'enregistrement actuel de façon unique dans un objet Recordset ou définit comme enregistrement actuel dans un objet Recordset l'enregistrement identifié par un signet valide.

Paramètres et valeurs renvoyées

Définit ou renvoie une expression de type Variant qui correspond à un signet valide.

Remarques

Utilisez la propriété Bookmark pour enregistrer la position de l'enregistrement actuel et y retourner à tout moment. Les signets sont disponibles uniquement pour les objets Recordset qui acceptent la fonctionnalité signet.

Lorsque vous ouvrez un objet Recordset chacun de ses enregistrements possède un signet unique. Pour enregistrer le signet de l'enregistrement actuel, affectez la valeur de la propriété Bookmark à une variable. Pour retrouver rapidement cet enregistrement après avoir navigué, affectez la valeur de cette variable à la propriété Bookmark de l'objet Recordset.

La valeur du signet n'est pas toujours visible par l'utilisateur. En outre, les signets ne sont pas directement comparables : deux signets faisant référence au même enregistrement peuvent avoir des valeurs différentes.

Si vous utilisez la méthode Clone pour créer une copie d'un objet Recordset, les valeurs de la propriété Bookmark sont identiques pour l'original et pour la copie et vous pouvez les utiliser indifféremment. En revanche, les signets d'objets Recordset ne sont pas interchangeables, même s'ils ont été créés à partir de la même source ou par la même commande.

Utilisation de Remote Data Service Avec un objet Recordset côté client, la propriété Bookmark est toujours disponible.

Voir aussi

Exemple Visual Basic | Exemple Visual C++ | Exemple Visual J++

Supports, méthode

S'applique à : Recordset, objet


CacheSize, propriété (ADO)

Référence de l'API ADO 2.5

CacheSize, propriété

Indique le nombre d'enregistrements d'un objet Recordset qui se trouvent dans la mémoire cache locale.

Paramètres et valeurs renvoyées

Définit ou renvoie une valeur de type Long qui doit être supérieure à 0. La valeur par défaut est 1.

Remarques

Utilisez la propriété CacheSize pour vérifier le nombre d'enregistrements à récupérer en une seule fois en mémoire locale par le fournisseur. Par exemple, si la valeur de CacheSize est égale à 10, cela signifie qu'après avoir ouvert l'objet Recordset, le fournisseur récupère les 10 premiers enregistrements en mémoire locale. Au fur et à mesure que vous vous déplacez dans l'objet Recordset, le fournisseur renvoie les données stockées en mémoire tampon locale. Dès que vous dépassez le dernier enregistrement stocké en mémoire cache, le fournisseur transfère les 10 enregistrements suivants de la source de données vers la mémoire cache.

Remarque La propriété CacheSize est basée sur la propriété Maximum Open Rows spécifique au fournisseur (dans la collection Properties de l'objet Recordset). Vous ne pouvez pas affecter à la propriété CacheSize une valeur supérieure à celle de la propriété Maximum Open Rows. Pour modifier le nombre de lignes pouvant être ouvertes par le fournisseur, définissez la propriété Maximum Open Rows.

La valeur de la propriété CacheSize peut être modifiée pour un même objet Recordset mais le changement n'est effectif que pour les enregistrements récupérés ultérieurement en mémoire cache à partir de la source de données. La modification de la valeur de la propriété n'affecte pas le contenu en cours de la mémoire cache.

S'il y a moins d'enregistrements à récupérer que ne le spécifie la valeur CacheSize, le fournisseur renvoie les enregistrements restants et aucun message d'erreur n'est généré.

Vous ne pouvez pas affecter la valeur zéro à la propriété CacheSize (vous obtenez un message d'erreur).

Les enregistrements extraits de la mémoire cache ne reflètent pas les modifications de la source de données effectuées simultanément par d'autres utilisateurs. Pour forcer une mise à jour de toutes les données stockées en mémoire cache, utilisez la méthode Resync.

Si la valeur de CacheSize est supérieure à 1, les méthodes de navigation (Move, MoveFirst, MoveLast, MoveNext et MovePrevious) peuvent atteindre un enregistrement supprimé si la suppression intervient après la récupération des enregistrements dans le cache. Les suppressions qui interviennent après la récupération initiale des enregistrements ne sont répercutées dans le cache de données qu'après une tentative d'accès à une valeur issue d'une ligne supprimée. En affectant la valeur 1 à la propriété CacheSize, vous éliminez ce problème puisque les lignes supprimées ne sont pas récupérables en mémoire cache.

Voir aussi

Exemple Visual Basic | Exemple Visual C++ | Exemple Visual J++ | Exemple Jscript

S'applique à : Recordset, objet


Chapter, propriété (ADO)

Référence de l'API ADO 2.5

Chapter, propriété

Obtient ou définit un objet OLE DB Chapter à partir de/sur un objet ADORecordsetConstruction. Lorsque vous utilisez put_Chapter pour définir l'objet Chapter, un sous-ensemble de lignes est transformé en objet ADO Recordset. Cette opération définit le chapitre en cours de l'objet Rowset.

Lecture/Écriture. Syntaxe

HRESULT get_Chapter([out, retval] long* plChapter);
HRESULT put_Chapter([in] long lChapter);

Paramètres

plChapter
Pointeur vers la poignée d'un chapitre.
LChapter
Poignée d'un chapitre.

Valeurs renvoyées

Cette méthode de propriété renvoie les valeurs HRESULT standard, notamment S_OK et E_FAIL.

S'applique à

ADORecordsetConstruction


Charset, propriété (ADO)

Référence de l'API ADO 2.5

Charset, propriété

Indique le jeu de caractères dans lequel le contenu d'un objet Stream de texte doit être traduit en vue de son stockage dans la mémoire tampon interne des objets Stream.

Paramètres et valeurs renvoyées

Définit ou renvoie une valeur de type String qui spécifie le jeu de caractères dans lequel le contenu de l'objet Stream sera traduit. La valeur par défaut est "Unicode". Les valeurs autorisées sont des chaînes typiques passées sur l'interface comme chaînes de jeu de caractères Internet (par exemple : "iso-8859-1", "Windows-1252", etc.). Vous trouverez la liste des chaînes de jeu de caractères reconnues par un système dans les sous-clés de HKEY_CLASSES_ROOT\MIME\Database\Charset dans le Registre Windows.

Remarques

Dans un objet Stream de texte, les données de texte sont stockées dans le jeu de caractères spécifié par la propriété Charset. La valeur par défaut est le format Unicode. La propriété Charset traduit les données envoyées dans l'objet Stream ou extraites de ce dernier. Par exemple, si l'objet Stream contient des données ISO-8859-1 et si ces données sont copiées dans une chaîne BSTR, l'objet Stream convertit les données au format Unicode et inversement.

Pour pouvoir définir la propriété Charset sur un objet Stream ouvert, il faut que la Position en cours soit au début de l'objet Stream (0).

La propriété Charset s'applique uniquement aux objets Stream (dont la propriété Type a la valeur adTypeText). Cette propriété est ignorée si la propriété Type a la valeur adTypeBinary.

Voir aussi

Exemple Visual Basic

S'applique à : Stream, objet


CommandText, propriété (ADO)

Référence de l'API ADO 2.5

CommandText, propriété

Indique le texte d'une commande à envoyer à un fournisseur.

Paramètres et valeurs renvoyées

Définit ou renvoie une valeur de type String qui contient une commande du fournisseur, par exemple une instruction SQL, un nom de table, une URL relative ou un appel à une procédure stockée. La valeur par défaut est "" (chaîne de longueur nulle).

Remarques

Utilisez la propriété CommandText pour définir ou renvoyer le texte d'une commande représentée par un objet Command. Il s'agit le plus souvent d'une instruction SQL ou de tout autre type de commande reconnu par le fournisseur, par exemple un appel à une procédure stockée. L'instruction SQL doit être formulée dans le dialecte ou la version accepté(e) par le processeur de requête du fournisseur.

Si la propriété Prepared de l'objet Command a la valeur True et que l'objet Command est lié à une connexion ouverte lorsque vous définissez la propriété CommandText, ADO prépare la requête (une compilation de la requête qui est stockée par le fournisseur) lorsque vous appelez la méthode Execute ou la méthode Open.

Selon la valeur de la propriété CommandType, ADO modifie éventuellement la propriété CommandText. Vous pouvez lire la propriété CommandText à tout moment pour connaître le texte de commande qui sera effectivement utilisé par ADO.

Utilisez la propriété CommandText pour définir ou renvoyer une adresse URL relative qui spécifie une ressource telle qu'un fichier ou un répertoire. Cette ressource est définie par rapport à un emplacement qui est spécifié explicitement par une adresse URL absolue ou implicitement par un objet Connection ouvert.

Remarque Les URL utilisant le schéma HTTP invoquent automatiquement le fournisseur Microsoft OLE DB pour Internet Publishing. Pour plus d'informations, voir URL absolues et relatives.

Voir aussi

Exemple Visual Basic | Exemple Visual C++ | Exemple Visual J++

Requery, méthode | Exemple JScript

S'applique à : Command, objet


CommandTimeout, propriété (ADO)

Référence de l'API ADO 2.5

CommandTimeout, propriété

Indique le délai à respecter, lors de l'exécution d'une commande, avant d'interrompre la tentative et de générer un message d'erreur.

Paramètres et valeurs renvoyées

Définit ou renvoie une valeur de type Long qui indique en secondes le temps d'attente pour l'exécution d'une commande. La valeur par défaut est 30.

Remarques

Utilisez la propriété CommandTimeout avec un objet Connection ou Command pour permettre l'annulation d'un appel à la méthode Execute lorsque les délais d'attente sont trop importants en raison du trafic sur le réseau ou de la surcharge du serveur. Si le délai indiqué par la propriété CommandTimeout expire avant que la commande ne soit totalement exécutée, un message d'erreur apparaît et ADO annule cette commande. Si vous attribuez à cette propriété la valeur zéro, ADO attend indéfiniment l'exécution complète de la commande. Veillez à ce que le fournisseur et la source de données où vous écrivez le code prennent en charge la fonctionnalité CommandTimeout.

La valeur CommandTimeout d'un objet Connection n'a aucune incidence sur la valeur CommandTimeout d'un objet Command utilisant cette connexion ; autrement dit, la propriété CommandTimeout de l'objet Command n'hérite pas de la valeur de la propriété CommandTimeout de l'objet Connection.

Avec un objet Connection, la propriété CommandTimeout reste accessible en lecture/écriture lorsque la connexion est ouverte.

Voir aussi

Exemple Visual Basic | Exemple Visual C++ | Exemple Visual J++ | Exemple JScript

ConnectionTimeout, propriété

S'applique à : Command, objet | Connection, objet


CommandType, propriété (ADO)

Référence de l'API ADO 2.5

CommandType, propriété

Indique le type d'un objet Command.

Paramètres et valeurs renvoyées

Définit ou renvoie une ou plusieurs valeurs CommandTypeEnum.

Remarque N'utilisez pas les valeurs CommandTypeEnum de adCmdFile ou adCmdTableDirect avec la propriété CommandType. Ces valeurs peuvent uniquement être utilisées avec les méthodes Open et Requery d'un objet Recordset.

Remarques

La propriété CommandType permet d'optimiser l'évaluation de la propriété CommandText.

Si la valeur de la propriété CommandType est adCmdUnknown (valeur par défaut), les performances risquent de diminuer car ADO doit appeler le fournisseur pour savoir si la propriété CommandText est une instruction SQL, une procédure stockée ou un nom de table. Si vous savez quel type de commande vous utilisez, définissez la propriété CommandType pour prescrire à ADO d'atteindre directement le code pertinent. Si la propriété CommandType ne correspond pas au type de commande de la propriété CommandText, une erreur se produit lorsque vous appelez la méthode Execute.

Voir aussi

Exemple Visual Basic | Exemple Visual C++ | Exemple Visual J++ | Exemple JScript

S'applique à : Command, objet


ConnectionString, propriété (ADO)

Référence de l'API ADO 2.5

ConnectionString, propriété

Indique les informations utilisées pour établir une connexion avec une source de données.

Paramètres et valeurs renvoyées

Définit ou renvoie une valeur de type String.

Remarques

Utilisez la propriété ConnectionString pour spécifier une source de données en passant une chaîne de connexion détaillée contenant une série d'instructions argument = valeur séparées par un point-virgule.

ADO prend en charge cinq arguments pour la propriété ConnectionString ; tout autre argument passe directement au fournisseur sans être traité par ADO. Les arguments pris en charge par ADO sont les suivants.

Argument | Description
Provider= | Nom du fournisseur utilisé pour la connexion.
File Name= | Nom d'un fichier spécifique du fournisseur (par exemple, un objet de source de données rendu permanent) qui contient des informations de connexion prédéfinies.
Remote Provider= | Nom du fournisseur à utiliser pour ouvrir une connexion côté client. (Remote Data Service uniquement.)
Remote Server= | Nom du chemin du serveur à utiliser pour ouvrir une connexion côté client. (Remote Data Service uniquement.)
URL= | Spécifie la chaîne de connexion sous la forme d'une URL absolue identifiant une ressource telle qu'un fichier ou un répertoire.

Lorsque vous avez défini la propriété ConnectionString et ouvert l'objet Connection, le fournisseur peut éventuellement modifier le contenu de la propriété, par exemple en remplaçant par leurs équivalents fournisseur les noms d'arguments définis par ADO.

La propriété ConnectionString prend automatiquement la valeur de l'argument ConnectionString dans la méthode Open ; vous pouvez donc ignorer la propriété ConnectionString dans l'appel de la méthode Open.

Dans la mesure où l'argument File Name indique à ADO de charger le fournisseur correspondant, vous ne pouvez pas passer à la fois les arguments Provider et File Name.

La propriété ConnectionString est accessible en lecture/écriture lorsque la connexion est fermée et en lecture seule lorsque la connexion est ouverte.

Les doubles d'un argument dans la propriété ConnectionString sont ignorés. Seule la dernière occurrence des arguments est prise en compte.

Utilisation de Remote Data Service Avec un objet Connection côté client, la propriété ConnectionString ne peut contenir que les paramètres Remote Provider et Remote Server.

Voir aussi

Exemple Visual Basic | Exemple Visual C++ | Exemple Visual J++

Annexe A : Fournisseurs

S'applique à : Connection, objet


ConnectionTimeout, propriété (ADO)

Référence de l'API ADO 2.5

ConnectionTimeout, propriété

Indique le délai à respecter, lors de l'établissement d'une connexion, avant d'interrompre la tentative et de générer un message d'erreur.

Paramètres et valeurs renvoyées

Définit ou renvoie une valeur de type Long qui indique en secondes le délai à respecter lors d'une ouverture de connexion. La valeur par défaut est 15.

Remarques

Utilisez la propriété ConnectionTimeout avec un objet Connection si les délais imposés par le trafic sur le réseau ou la surcharge du serveur nécessitent l'abandon d'une tentative de connexion. Si le délai indiqué par la valeur de la propriété ConnectionTimeout expire avant l'ouverture de la connexion, une erreur se produit et ADO annule la tentative. Si vous affectez à cette propriété la valeur zéro, ADO attend indéfiniment l'ouverture de la connexion. Vérifiez que le fournisseur où vous écrivez le code prend en charge la fonctionnalité ConnectionTimeout.

La propriété ConnectionTimeout est accessible en lecture/écriture lorsque la connexion est fermée et en lecture seule lorsque la connexion est ouverte.

Voir aussi

Exemple Visual Basic | Exemple Visual C++ | Exemple Visual J++

CommandTimeout, propriété

S'applique à : Connection, objet


Count, propriété (ADO)

Référence de l'API ADO 2.5

Count, propriété

Indique le nombre d'objets dans une collection.

Valeur renvoyée

Renvoie une valeur de type Long.

Remarques

Utilisez la propriété Count pour déterminer combien d'objets contient une collection donnée.

Du fait que la numérotation des membres d'une collection commence à zéro, il faut toujours coder les boucles en partant de zéro jusqu'à la valeur de la propriété Count moins 1. Si vous utilisez Microsoft Visual Basic pour programmer une boucle parcourant les membres d'une collection sans vérifier la propriété Count, faites appel à la commande For Each...Next.

Si la valeur de la propriété Count est zéro, cela signifie qu'il n'y a aucun objet dans la collection.

Voir aussi

Exemple Visual Basic | Exemple Visual C++ | Exemple Visual J++

Refresh, méthode

S'applique à : Axes, collection | Columns, collection | CubeDefs, collection | Dimensions, collection | Errors, collection | Fields, collection | Groups, collection | Hierarchies, collection | Indexes, collection | Keys, collection | Levels, collection | Members, collection | Parameters, collection | Positions, collection | Procedures, collection | Properties, collection | Tables, collection | Users, collection | Views, collection


CursorLocation, propriété (ADO)

Référence de l'API ADO 2.5

CursorLocation, propriété

Indique l'emplacement du service cursor.

Paramètres et valeurs renvoyées

Définit ou renvoie une valeur de type Long qui peut être l'une des valeurs CursorLocationEnum.

Remarques

Cette propriété vous donne le choix entre plusieurs bibliothèques de curseurs accessibles au fournisseur. Vous avez normalement le choix entre une bibliothèque de curseurs côté client et une bibliothèque stockée sur le serveur.

La valeur de cette propriété affecte les connexions établies après que la propriété a été définie. La modification de la propriété CursorLocation n'a aucun effet sur les connexions existantes.

Les curseurs renvoyés par la méthode Execute héritent de cette valeur. Les objets Recordset héritent automatiquement de cette valeur depuis les connexions associées.

Cette propriété est accessible en lecture/écriture avec un objet Connection ou un objet Recordset fermé ; elle est en lecture seule avec un objet Recordset ouvert.

Utilisation de Remote Data Service Avec un objet Recordset ou Connection côté client, la propriété CursorLocation peut uniquement avoir la valeur adUseClient.

Voir aussi

Annexe A : Fournisseurs

S'applique à : Connection, objet | Recordset, objet


CursorType, propriété (ADO)

Référence de l'API ADO 2.5

CursorType, propriété

Indique le type de curseur utilisé dans un objet Recordset.

Paramètres et valeurs renvoyées

Définit ou renvoie une valeur CursorTypeEnum. La valeur par défaut est adOpenForwardOnly.

Remarques

Utilisez la propriété CursorType pour spécifier le type de curseur qui doit être utilisé à l'ouverture de l'objet Recordset.

Seule la valeur adOpenStatic est prise en charge si la propriété CursorLocation a pour valeur adUseClient. Une valeur non prise en charge ne génère pas d'erreur car elle est remplacée par la valeur la plus proche de CursorType.

Si un fournisseur ne prend pas en charge le type de curseur demandé, il renvoie éventuellement un autre type de curseur. La propriété CursorType change alors de valeur pour correspondre au type de curseur effectivement utilisé lorsque l'objet Recordset est ouvert. Pour vérifier les fonctionnalités spécifiques du curseur renvoyé, utilisez la méthode Supports. Lorsque vous fermez l'objet Recordset, la propriété CursorType reprend sa valeur d'origine.

Le tableau suivant indique la fonctionnalité du fournisseur (identifiée par les constantes de la méthode Supports) nécessaire pour chaque type de curseur.

Type de curseur du Recordset | Constantes pour lesquelles la méthode Supports doit renvoyer la valeur True
adOpenForwardOnly | Aucune
adOpenKeyset | adBookmark, adHoldRecords, adMovePrevious, adResync
adOpenDynamic | adMovePrevious
adOpenStatic | adBookmark, adHoldRecords, adMovePrevious, adResync
Remarque Bien que la valeur Supports(adUpdateBatch) puisse être True avec les curseurs dynamiques et les curseurs à défilement en avant seulement, il est préférable d'utiliser un curseur à jeu de clés ou un curseur statique pour les mises à jour par lots. Affectez à la propriété LockType la valeur adLockBatchOptimistic et à la propriété CursorLocation la valeur adUseClient pour activer le Cursor Service pour OLE DB nécessaire aux mises à jour par lots.

La propriété CursorType est accessible en lecture/écriture lorsque l'objet Recordset est fermé et en lecture seule lorsqu'il est ouvert.

Utilisation de Remote Data Service Avec un objet Recordset côté client, la propriété CursorType peut uniquement avoir la valeur adOpenStatic.

Voir aussi

Exemple Visual Basic | Exemple Visual C++ | Exemple Visual J++

Supports, méthode

S'applique à : Recordset, objet


DataMember, propriété (ADO)

Référence de l'API ADO 2.5

DataMember, propriété

Indique le nom du membre de données qui sera extrait de l'objet référencé par la propriété DataSource.

Paramètres et valeurs renvoyées

Définit ou renvoie une valeur de type String. Le nom ne fait pas de distinction entre minuscules et majuscules.

Remarques

Cette propriété permet de créer des contrôles liés aux données dans l'environnement de données. L'environnement de données gère des collections de données (sources de données) contenant des objets nommés (membres de données) qui seront représentés sous la forme d'un objet Recordset .

Les propriétés DataMember et DataSource doivent être utilisées conjointement.

La propriété DataMember détermine quel objet spécifié par la propriété DataSource sera représenté sous forme d'objet Recordset. Vous devez fermer l'objet Recordset pour définir cette propriété. Une erreur est générée si la propriété DataMember n'est pas définie avant la propriété DataSource ou si le nom DataMember n'est pas reconnu par l'objet spécifié dans la propriété DataSource.

Utilisation

Dim rs as New ADODB.Recordset
rs.DataMember = "Command"     'Name of the rowset to bind to
Set rs.DataSource = myDE      'Name of the object containing an IRowset

Voir aussi

DataSource, propriété

S'applique à : Recordset, objet


DataSource, propriété (ADO)

Référence de l'API ADO 2.5

DataSource, propriété

Indique un objet qui contient les données à représenter en tant qu'objet Recordset.

Remarques

Cette propriété permet de créer des contrôles liés aux données dans l'environnement de données. L'environnement de données gère des collections de données (sources de données) contenant des objets nommés (membres de données) qui seront représentés sous la forme d'un objet Recordset.

Les propriétés DataMember et DataSource doivent être utilisées conjointement.

L'objet référencé doit implémenter l'interface IDataSource et contenir une interface IRowset.

Utilisation

Dim rs as New ADODB.Recordset
rs.DataMember = "Command"     'Name of the rowset to bind to
Set rs.DataSource = myDE      'Name of the object containing an IRowset

Voir aussi

DataMember, propriété

S'applique à : Recordset, objet


DefaultDatabase, propriété (ADO)

Référence de l'API ADO 2.5

DefaultDatabase, propriété

Indique la base de données par défaut d'un objet Connection.

Paramètres et valeurs renvoyées

Définit ou renvoie une valeur de type String qui correspond au nom d'une base de données accessible depuis le fournisseur.

Remarques

Utilisez la propriété DefaultDatabase pour définir ou renvoyer le nom de la base de données par défaut pour un objet Connection spécifique.

S'il existe une base de données par défaut, les chaînes SQL peuvent utiliser une syntaxe générale permettant d'accéder aux objets de cette base de données. Pour accéder aux objets d'une base de données différente de celle indiquée dans la propriété DefaultDatabase, vous devez qualifier les noms d'objets avec le nom de la base de données désirée. Lors de la connexion, le fournisseur écrit des informations sur la base de données par défaut dans la propriété DefaultDatabase. Certains fournisseurs n'autorisent qu'une seule base de données par connexion, auquel cas vous ne pouvez pas modifier la propriété DefaultDatabase.

Cette fonctionnalité n'est pas prise en charge par toutes les sources de données et tous les fournisseurs, et un message d'erreur ou une chaîne vide peut être renvoyé(e).

Utilisation de Remote Data Service Cette propriété n'est pas disponible sur un objet Connection côté client.

Voir aussi

Exemple Visual Basic | Exemple Visual C++ | Exemple Visual J++

S'applique à : Connection, objet


DefinedSize, propriété (ADO)

Référence de l'API ADO 2.5

DefinedSize, propriété

Indique la capacité d'un objet Field.

Valeur renvoyée

Renvoie une valeur de type Long qui représente la taille définie pour un champ en octets.

Remarques

Utilisez la propriété DefinedSize pour déterminer la capacité d'un objet Field.

Les propriétés DefinedSize et ActualSize sont différentes. Considérez par exemple un objet Field dont le type déclaré est adVarChar et dont la propriété DefinedSize a pour valeur 50, qui contient un caractère unique. La valeur renvoyée par la propriété ActualSize correspond à la longueur en octets de ce caractère.

Voir aussi

Exemple Visual Basic | Exemple Visual C++ | Exemple Visual J++

ActualSize, propriété

S'applique à : Field, objet


Description, propriété (ADO)

Référence de l'API ADO 2.5

Description, propriété

Décrit un objet Error.

Valeur renvoyée

Renvoie une valeur de type String contenant la description de l'erreur.

Remarques

Utilisez la propriété Description pour obtenir une brève description de l'erreur. Affichez la propriété pour informer l'utilisateur d'une erreur que vous ne pouvez pas ou ne désirez pas gérer. La chaîne sera émise par ADO ou par un fournisseur.

Les fournisseurs doivent passer le texte de leurs erreurs à ADO. ADO ajoute un objet Error à la collection Errors à chaque erreur ou avertissement reçu(e) d'un fournisseur. Énumérez la collection Errors pour connaître les erreurs passées par le fournisseur.

Voir aussi

Exemple Visual Basic | Exemple Visual C++ | Exemple Visual J++

HelpContext, HelpFile, propriétés | Number, propriété | Source, propriété (Error ADO)

S'applique à : Error, objet


Direction, propriété (ADO)

Référence de l'API ADO 2.5

Direction, propriété

Indique si l'objet Parameter correspond à un paramètre d'entrée, un paramètre de sortie, un paramètre d'entrée et de sortie ou s'il s'agit de la valeur renvoyée par une procédure stockée.

Paramètres et valeurs renvoyées

Définit ou renvoie une valeur ParameterDirectionEnum.

Remarques

Utilisez la propriété Direction pour déterminer si un paramètre est passé depuis ou vers une procédure. La propriété Direction est accessible en lecture/écriture ; vous pouvez donc travailler avec des fournisseurs qui ne renvoient pas cette information ou définir l'information si vous ne voulez pas que ADO fasse un appel supplémentaire au fournisseur pour récupérer les informations sur le paramètre.

Certains fournisseurs ne peuvent pas déterminer la direction des paramètres dans leurs procédures stockées. Vous devez alors définir la propriété Direction avant d'exécuter la requête.

Voir aussi

Exemple Visual Basic | Exemple Visual C++ | Exemple Visual J++ | Exemple JScript

S'applique à : Parameter, objet


EditMode, propriété (ADO)

Référence de l'API ADO 2.5

EditMode, propriété

Indique l'état de modification de l'enregistrement actuel.

Valeur renvoyée

Renvoie une valeur EditModeEnum.

Remarques

ADO gère un tampon de modification associé à l'enregistrement actuel. Cette propriété indique si des modifications ont été effectuées dans cette mémoire tampon ou si un nouvel enregistrement a été créé. Utilisez la propriété EditMode pour déterminer l'état de modification de l'enregistrement actuel. Vous pouvez voir si des changements sont en attente, dans le cas où une procédure de modification a été interrompue, et déterminer si vous devez utiliser la méthode Update ou CancelUpdate.

Reportez-vous à la méthode AddNew pour une description détaillée de la propriété EditMode dans différents contextes de modification.

Lorsqu'un appel de la méthode Delete ne supprime pas les enregistrements d'une source de données (en raison de violations de l'intégrité du référentiel, par exemple), l'objet Recordset reste en mode de modification (EditMode = adEditInProgress). Cela signifie que la méthode CancelUpdate doit être appelée avant de supprimer l'enregistrement actuel (à l'aide de Move, NextRecordset ou Close, par exemple).

Remarque EditMode ne peut renvoyer une valeur valide que s'il existe un enregistrement actuel. EditMode renvoie une erreur si l'une des propriétés BOF et EOF a pour valeur True ou si l'enregistrement actuel a été supprimé.

Voir aussi

Exemple Visual Basic | Exemple Visual C++ | Exemple Visual J++

AddNew, méthode | CancelUpdate, méthode | Update, méthode

S'applique à : Recordset, objet


EOS, propriété (ADO)

Référence de l'API ADO 2.5

EOS, propriété

Indique si la position en cours est située à la fin du flux.

Valeurs renvoyées

Renvoie une valeur de type Boolean qui indique si la position en cours est située à la fin du flux. La propriété EOS renvoie la valeur True s'il n'y a plus d'octets dans le flux ; elle renvoie False s'il reste des octets après la position en cours.

Pour définir la position à la fin du flux, utilisez la méthode SetEOS. Pour déterminer la position en cours, utilisez la propriété Position.

Voir aussi

Exemple Visual Basic

S'applique à : Stream, objet


Filter, propriété (ADO)

Référence de l'API ADO 2.5

Filtrer, propriété

Indique un filtre pour les données d'un objet Recordset.

Paramètres et valeurs renvoyées

Définit ou renvoie une valeur de type Variant qui peut contenir une des valeurs suivantes :

  • Chaîne de critère — chaîne composée d'une ou de plusieurs clauses individuelles concaténées avec les opérateurs AND ou OR.
  • Tableau de signets — tableau de valeurs de signet uniques qui désignent des enregistrements de l'objet Recordset.
  • Valeur FilterGroupEnum.

Remarques

Utilisez la propriété Filtrer pour afficher de manière sélective les enregistrements d'un objet Recordset. L'objet Recordset ainsi filtré devient le curseur en cours. D'autres propriétés qui renvoient des valeurs en fonction du curseur en cours sont affectées, notamment AbsolutePosition, AbsolutePage, RecordCount et PageCount. En effet, lorsque vous affectez une valeur à la propriété Filtrer, l'enregistrement actuel est déplacé pour correspondre au premier enregistrement qui satisfait à la valeur du filtre.

Cette chaîne de critère est composée de clauses de la forme FieldName-Operator-Value (par exemple, "LastName = 'Smith'"). Vous pouvez créer des clauses composées en concaténant des clauses individuelles avec AND (par exemple, "LastName = 'Smith' AND FirstName = 'John'") ou OR (par exemple, "LastName = 'Smith' OR LastName = 'Jones'"). Utilisez les consignes ci-dessous pour les chaînes de critère :

  • FieldName doit être un nom de champ valide de l'objet Recordset. Si le nom de champ comporte des espaces, il doit être encadré par des crochets droits.
  • Operator doit être l'un des opérateurs suivants : <, >, <=, >=, <>, =, or LIKE.
  • Value est la valeur à laquelle vous allez comparer les valeurs du champ (par exemple, 'Smith', #8/24/95#, 12.345, or $50.00). Utilisez les guillemets simples pour les chaînes et le symbole dièse (#) pour les dates. Avec les nombres, vous pouvez utiliser la virgule décimale, le symbole dollar et les notations scientifiques. Si l'opérateur est LIKE, Value admet des caractères génériques. Seuls l'astérisque (*) et le signe pourcentage (%) sont autorisés et ils doivent être le dernier caractère de la chaîne. Value ne peut pas être nulle.
    Remarque Pour insérer des guillemets simples (') dans la valeur du filtre, doublez chaque guillemet. Par exemple, pour effectuer un filtrage sur la valeur O'Malley, tapez la chaîne de critère "col1 = 'O''Malley'". Pour insérer des guillemets simples au début et à la fin de la valeur du filtre, entourez la chaîne de signes dièse (#). Par exemple, pour effectuer un filtrage sur la valeur '1', tapez la chaîne de critère "col1 = #'1'#".
  • Il n'y a pas de priorité entre les opérateurs AND et OR. Les clauses peuvent être regroupées entre parenthèses. Toutefois, vous ne pouvez pas regrouper des clauses reliées par l'opérateur OR, puis adjoindre ce groupe à une autre clause avec l'opérateur AND, de la manière suivante :
    (LastName = 'Smith' OR LastName = 'Jones') AND FirstName = 'John'
  • Ce filtre doit être construit ainsi :
    (LastName = 'Smith' AND FirstName = 'John') OR (LastName = 'Jones' AND FirstName = 'John')
  • Dans une clause LIKE, vous pouvez utiliser un caractère générique au début et à la fin de la chaîne (par exemple, LastName Like '*mit*') ou uniquement à la fin de la chaîne (par exemple, LastName Like 'Smit*').

Les constantes de filtre facilitent la résolution de conflits individuels d'enregistrements en mode de mise à jour par lots en vous permettant par exemple d'afficher seulement les enregistrements affectés par le dernier appel de la méthode UpdateBatch.

La définition de la propriété Filter peut échouer à cause d'un conflit avec les données sous-jacentes (par exemple, un enregistrement a déjà été supprimé par un autre utilisateur). Dans ce cas, le fournisseur renvoie des avertissements à la collection Errors mais n'interrompt pas l'exécution du programme. Une erreur d'exécution intervient uniquement en cas de conflit sur tous les enregistrements demandés. Utilisez la propriété Status pour localiser les enregistrements conflictuels.

Lorsque la valeur de la propriété Filter est une chaîne de longueur nulle (""), elle joue le même rôle que la constante adFilterNone.

Lorsque la propriété Filter est définie, l'enregistrement actuel se déplace jusqu'au premier enregistrement du sous-ensemble filtré dans l'objet Recordset. De même, lorsque la propriété Filter est annulée, l'enregistrement actuel se positionne sur le premier enregistrement de l'objet Recordset.

Reportez-vous à la propriété Bookmark pour plus d'informations sur les valeurs de signets à partir desquelles vous pouvez constituer un tableau à utiliser avec la propriété Filter.

Seuls les filtres sous la forme de chaînes de critère (p.ex. DateCommande > '31/12/1999') affectent le contenu d'un objet Recordset enregistré de façon permanente. Les filtres créés avec un tableau de signets ou en utilisant une valeur de FilterGroupEnum n'ont aucun impact sur le contenu d'un objet Recordset enregistré de façon permanente. Ces règles s'appliquent aux objets Recordsets créés avec des curseurs côté client ou serveur.

Remarque Lorsque vous appliquez une balise adFilterPendingRecords à un objet Recordset filtré et modifié en mode de mise à jour par lots, le Recordset résultant est vide si le filtrage était basé sur une table à clé unique et si la modification a été effectuée sur des valeurs de champs clés. Le Recordset résultant n'est pas vide si une des conditions suivantes est vraie :
  • Le filtrage était basé sur des champs non clés dans une table à clé unique.
  • Le filtrage était basé sur n'importe quel champ dans une table à plusieurs clés.
  • Les modifications ont été effectuées dans des champs non clés d'une table à clé unique.
  • Les modifications ont été effectuées dans n'importe quel champ d'une table à plusieurs clés.
Le tableau suivant présente les effets de adFilterPendingRecords dans différentes combinaisons de filtrage et de modifications. La colonne de gauche indique les modifications possibles ; les modifications peuvent être effectuées dans n'importe quel champ non clé, dans le champ clé d'une table à clé unique ou dans n'importe quel champ clé d'une table à plusieurs clés. La ligne supérieure indique le critère de filtre ; le filtrage peut être basé sur n'importe quel champ non clé, sur le champ clé d'une table à clé unique ou sur n'importe quel champ clé d'une table à plusieurs clés. Les cellules d'intersection indiquent les résultats : + signifie que l'application de adFilterPendingRecords génère un Recordset non vide et - un Recordset vide.
 | Non clés | Clé unique | Plusieurs clés
Non clés | + | + | +
Clé unique | + | - | N/D
Plusieurs clés | + | N/D | +

Voir aussi

Exemple Visual Basic | Exemple Visual C++ | Exemple Visual J++

Clear, méthode | Optimize, propriété dynamique (ADO)

S'applique à : Recordset, objet


HelpContext, HelpFile, propriétés (ADO)

Référence de l'API ADO 2.5

HelpContext, HelpFile, propriétés

Indique le fichier d'aide et les rubrique associés à un objet Error.

Valeurs renvoyées

  • HelpContextID — renvoie, sous la forme d'une valeur de type Long, un ID de contexte qui correspond à une rubrique dans un fichier d'aide.
  • HelpFile — renvoie une valeur de type String qui correspond au chemin complet d'un fichier d'aide.

Remarques

Si un fichier d'aide est spécifié dans la propriété HelpFile, la propriété HelpContext est utilisée pour afficher automatiquement la rubrique d'aide identifiée. Si aucune rubrique d'aide pertinente n'est disponible, la propriété HelpContext renvoie la valeur zéro et la propriété HelpFile renvoie une chaîne de longueur nulle ("").

Voir aussi

Exemple Visual Basic | Exemple Visual C++ | Exemple Visual J++

Description, propriété | Number, propriété | Source, propriété (Error ADO)

S'applique à : Error, objet


Index, propriété (ADO)

Référence de l'API ADO 2.5

Index, propriété

Indique le nom de l'index en cours appliqué à un objet Recordset.

Paramètres et valeurs renvoyées

Définit ou renvoie une valeur de type String qui correspond au nom de l'index.

Remarques

L'index nommé par la propriété Index doit avoir été déclaré au préalable dans la table de base sur laquelle repose l'objet Recordset. Autrement dit, l'index doit avoir été déclaré par programmation comme objet ADOX Index ou lors de la création de la table de base.

Si l'index ne peut pas être défini, une erreur d'exécution se produit. Il n'est pas possible de définir la propriété Index :

  • Au sein d'un gestionnaire d'événement WillChangeRecordset ou RecordsetChangeComplete.
  • Si l'objet Recordset est encore en train d'exécuter une opération (ce que permet de déterminer la propriété State).
  • Si un filtre a été défini sur l'objet Recordset avec la propriété Filter.

La propriété Index peut toujours être définie si l'objet Recordset est fermé ; toutefois, si le fournisseur ne prend pas en charge les index, l'objet Recordset ne s'ouvrira pas normalement ou l'index ne sera pas utilisable.

Si l'index peut être défini, la position de la ligne en cours risque de changer. Ce changement provoque la mise à jour de la propriété AbsolutePosition et la génération d'événements WillChangeRecordset, RecordsetChangeComplete, WillMove et MoveComplete.

Si l'index peut être défini et que la propriété LockType a la valeur adLockPessimistic ou adLockOptimistic, une opération UpdateBatch est effectuée. Elle libère le groupe en cours et les groupes affectés. Tout filtre existant est libéré et la ligne en cours prend la position de la première ligne du Recordset réordonné.

La propriété Index est utilisée en conjonction avec la méthode Seek. Si le fournisseur sous-jacent ne prend pas en charge la propriété Index (ni, par conséquent, la méthode Seek), vous avez la possibilité d'utiliser la méthode Find à la place. Déterminez si l'objet Recordset prend en charge les index à l'aide de la méthode Supports (adIndex).

La propriété Index intégrée n'a aucun rapport avec la propriété dynamique Optimize, même si ces deux propriétés traitent des index.

Voir aussi

Exemple Visual Basic

Index, objet | Seek, méthode

S'applique à : Recordset, objet


IsolationLevel, propriété (ADO)

Référence de l'API ADO 2.5

IsolationLevel, propriété

Indique le niveau d'isolation d'un objet Connection.

Paramètres et valeurs renvoyées

Définit ou renvoie une valeur IsolationLevelEnum. La valeur par défaut est adXactChaos.

Remarques

Utilisez la propriété IsolationLevel pour définir le niveau d'isolation d'un objet Connection. La valeur de cette propriété ne prend effet que lorsque vous rappelez la méthode BeginTrans. Si le niveau d'isolation que vous demandez n'est pas disponible, le fournisseur renvoie éventuellement le niveau d'isolation immédiatement supérieur.

La propriété IsolationLevel est accessible en lecture/écriture.

Utilisation de Remote Data Service Avec un objet côté client, la propriété IsolationLevel de l'objet Connection peut uniquement avoir la valeur adXactUnspecified.
Les utilisateurs travaillent sur des objets Recordset déconnectés dans un cache de niveau client ; des problèmes multi-utilisateurs peuvent donc se produire. Par exemple, lorsque deux utilisateurs essaient de mettre à jour le même enregistrement, Remote Data Service enregistre simplement la demande de mise à jour reçue en premier. L'autre demande échoue et génère un message d'erreur.

Voir aussi

Exemple Visual Basic | Exemple Visual C++ | Exemple Visual J++

S'applique à : Connection, objet


Item, propriété (ADO)

Référence de l'API ADO 2.5

Item, propriété

Indique un membre particulier d'une collection, par son nom ou par son numéro d'ordre.

Syntaxe

Set object = collection.Item ( Index )

Valeur renvoyée

Renvoie une référence d'objet.

Paramètres

Index
Expression de type Variant qui prend la valeur du nom ou du numéro d'ordre d'un objet dans une collection.

Remarques

Utilisez la propriété Item pour renvoyer un objet particulier d'une collection. Une erreur se produit si la propriété Item ne parvient pas à trouver dans la collection un objet correspondant à l'argument Index. De plus, certaines collections ne gèrent pas les objets par leur nom ; dans ce cas, il faut utiliser le numéro d'ordre.

La propriété Item est la propriété par défaut pour toutes les collections ; de ce fait, les deux formes de syntaxe suivantes peuvent être employées indifféremment :

collection.Item (Index)
collection (Index)

Voir aussi

Exemple Visual Basic | Exemple Visual C++ | Exemple Visual J++

S'applique à : Axes, collection | Columns, collection | CubeDefs, collection | Dimensions, collection | Errors, collection | Fields, collection | Groups, collection | Hierarchies, collection | Indexes, collection | Keys, collection | Levels, collection | Members, collection | Parameters, collection | Positions, collection | Procedures, collection | Properties, collection | Tables, collection | Users, collection | Views, collection


LineSeparator, propriété (ADO)

Référence de l'API ADO 2.5

LineSeparator, propriété

Indique le caractère binaire à utiliser comme séparateur de ligne dans les objets Stream de texte.

Paramètres et valeurs renvoyées

Définit ou renvoie une valeur LineSeparatorsEnum qui indique le caractère utilisé comme séparateur de ligne dans l'objet Stream. La valeur par défaut est adCRLF.

Remarques

La propriété LineSeparator permet d'interpréter les lignes lors de la lecture du contenu d'un objet Stream de texte. Il est possible d'ignorer des lignes à l'aide de la méthode SkipLine.

La propriété LineSeparator n'est utilisée qu'avec les objets Stream de texte (dont la propriété Type a la valeur adTypeText). Cette propriété est ignorée si la propriété Type a la valeur adTypeBinary.

S'applique à : Stream, objet


LockType, propriété (ADO)

Référence de l'API ADO 2.5

LockType, propriété

Indique le type de verrouillage des enregistrements lors des modifications.

Paramètres et valeurs renvoyées

Définit ou renvoie une valeur LockTypeEnum. La valeur par défaut est adLockReadOnly.

Remarques

Définissez la propriété LockType avant d'ouvrir un objet Recordset pour spécifier le type de verrouillage que le fournisseur doit appliquer lorsqu'il ouvre l'objet. Lisez cette propriété pour renvoyer le type de verrouillage utilisé sur un objet Recordset ouvert.

Certains fournisseurs ne prennent pas en charge tous les types de verrouillage. Lorsqu'un fournisseur n'accepte pas la valeur demandée de la propriété LockType, il lui substitue un autre type de verrouillage. Pour connaître la fonctionnalité de verrouillage effectivement disponible dans un objet Recordset, utilisez la méthode Supports avec adUpdate et adUpdateBatch.

La valeur adLockPessimistic n'est pas prise en charge si la propriété CursorLocation a pour valeur adUseClient. Une valeur non prise en charge ne génère pas d'erreur car elle est remplacée par la valeur la plus proche de la propriété LockType.

La propriété LockType est accessible en lecture/écriture lorsque l'objet Recordset est fermé et en lecture seule lorsqu'il est ouvert.

Remote Data Service Utilisation Avec un objet Recordset côté client, la propriété LockType peut uniquement avoir la valeur adLockBatchOptimistic.

Voir aussi

Exemple Visual Basic | Exemple Visual C++ | Exemple Visual J++

CancelBatch, méthode | UpdateBatch, méthode

S'applique à : Recordset, objet


MarshalOptions, propriété (ADO)

Référence de l'API ADO 2.5

MarshalOptions, propriété

Indique les enregistrements devant être renvoyés au serveur.

Paramètres et valeurs renvoyées

Définit ou renvoie une valeur MarshalOptionsEnum. La valeur par défaut est adMarshalAll.

Remarques

Dans le cas d'un objet Recordset côté client, les enregistrements modifiés sur le client sont renvoyés vers le niveau intermédiaire ou sur serveur Web via une technique appelée marshaling qui consiste à empaqueter des paramètres de méthode d'interface et à les envoyer sur un autre thread ou dans un autre processus. En définissant la propriété MarshalOptions vous pouvez accroître les performances lorsque les données à distance modifiées sont assemblées pour être renvoyées et mises à jour sur le serveur Web ou de niveau intermédiaire.

Utilisation de Remote Data Service Cette propriété n'est utilisée qu'avec les objets Recordset côté client.

Voir aussi

Exemple Visual Basic | Exemple Visual C++ | Exemple Visual J++

S'applique à : Recordset, objet


MaxRecords, propriété (ADO)

Référence de l'API ADO 2.5

MaxRecords, propriété

Indique le nombre maximum d'enregistrements à renvoyer à l'objet Recordset d'une requête.

Paramètres et valeurs renvoyées

Définit ou renvoie une valeur de type Long qui indique le nombre maximum d'enregistrements à renvoyer. La valeur par défaut est zéro (aucune limite).

Remarques

Utilisez la propriété MaxRecords pour limiter le nombre d'enregistrements que le fournisseur renvoie de la source de données. La valeur par défaut de cette propriété est zéro : le fournisseur renvoie tous les enregistrements demandés.

La propriété MaxRecords est accessible en lecture/écriture lorsque l'objet Recordset est fermé et en lecture seule lorsqu'il est ouvert.

Voir aussi

Exemple Visual Basic | Exemple Visual C++ | Exemple Visual J++

S'applique à : Recordset, objet


Mode, propriété (ADO)

Référence de l'API ADO 2.5

Mode, propriété

Indique les autorisations disponibles pour modifier les données d'un objet Connection, Record ou Stream.

Paramètres et valeurs renvoyées

Définit ou renvoie une valeur ConnectModeEnum. La valeur par défaut d'un objet Connection est adModeUnknown. La valeur par défaut d'un objet Record est adModeRead. La valeur par défaut d'un objet Stream associé à une source sous-jacente (ouvert par le biais d'une URL comme source ou en tant qu'objet Stream par défaut d'un objet Record) est adModeRead. La valeur par défaut d'un objet Stream qui n'est pas associé à une source sous-jacente (instancié dans la mémoire) est adModeUnknown.

Remarques

Utilisez la propriété Mode pour définir ou renvoyer les autorisations d'accès utilisées par le fournisseur sur la connexion en cours. Vous ne pouvez définir la propriété Mode que lorsque l'objet Connection est fermé.

Dans le cas d'un objet Stream, si le mode d'accès n'est pas spécifié, il est hérité de la source utilisée pour ouvrir cet objet Stream. Par exemple, si un objet Stream est ouvert à partir d'un objet Record, il est par défaut ouvert dans le même mode que cet objet Record.

Cette propriété est accessible en lecture/écriture lorsque l'objet est fermé et en lecture seule lorsque l'objet est ouvert.

Utilisation de Remote Data Service Avec un objet Connection côté client, la propriété Mode peut uniquement avoir la valeur adModeUnknown.

Voir aussi

Exemple Visual Basic | Exemple Visual C++ | Exemple Visual J++

S'applique à : Connection, objet | Record, objet | Stream, objet


Name, propriété (ADO)

Référence de l'API ADO 2.5

Name, propriété

Indique le nom d'un objet.

Paramètres et valeurs renvoyées

Définit ou renvoie une valeur de type String qui indique le nom d'un objet.

Remarques

Utilisez la propriété Name pour affecter ou extraire le nom d'un objet Command, Property, Field ou Parameter.

Sa valeur est accessible en lecture/écriture dans le cas d'un objet Command et en lecture seule dans le cas d'un objet Property.

Pour les objets Field, la propriété Name est normalement accessible en lecture seule. Toutefois, dans le cas de nouveaux objets Fieldajoutés à la collection Fields d'un objet Record, la propriété Name est accessible en lecture/écriture une fois seulement que la propriété Value de l'objet Field a été spécifiée et que le nouvel objet Field a été ajouté par le fournisseur de données à l'aide de la méthode Update de la collection Fields.

Dans le cas des objets Parameter qui ne sont pas encore ajoutés à la collection Parameters, la propriété Name est accessible en lecture/écriture. Avec les objets Parameter ajoutés à la collection et tous les autres objets, la propriété Name est accessible en lecture seule. Les noms ne sont pas nécessairement uniques dans une même collection.

Vous pouvez extraire la propriété Name d'un objet au moyen d'un numéro d'ordre, après quoi vous pouvez faire directement référence à l'objet par son nom. Par exemple, si rstMain.Properties(20).Name indique Updatability, vous pouvez ensuite faire référence à cette propriété par rstMain.Properties("Updatability").

Voir aussi

Exemple Visual Basic | Exemple Visual C++ | Exemple Visual J++

S'applique à : Command, objet | Field, objet | Parameter, objet | Property, objet


NativeError, propriété (ADO)

Référence de l'API ADO 2.5

NativeError, propriété

Indique le code d'erreur spécifique au fournisseur pour un objet Error donné.

Valeur renvoyée

Renvoie une valeur de type Long qui indique le code de l'erreur.

Remarques

Utilisez la propriété NativeError pour extraire les informations concernant une erreur spécifique à la base de données pour un objet Error particulier. Par exemple, lorsque vous utilisez Microsoft ODBC Provider pour OLE DB avec une base de données Microsoft SQL Server, les codes d'erreurs natifs générés par SQL Server passent via ODBC et le fournisseur ODBC à la propriété ADO NativeError.

Voir aussi

Exemple Visual Basic | Exemple Visual C++ | Exemple Visual J++

S'applique à : Error, objet


Number, propriété (ADO)

Référence de l'API ADO 2.5

Number, propriété

Indique le nombre qui identifie de façon unique un objet Error.

Valeur renvoyée

Renvoie une valeur de type Long qui peut correspondre à l'une des constantes ErrorValueEnum.

Remarques

Utilisez la propriété Number pour savoir quelle erreur s'est produite. La valeur de la propriété est un nombre unique qui correspond à la condition de l'erreur.

La collection Errors renvoie un HRESULT au format hexadécimal (par exemple : 0x80004005) ou sous la forme d'une valeur longue (par exemple : 2147467259). Ces résultats HRESULT peuvent être relevés par des composants sous-jacents comme OLE DB ou même OLE. Pour plus d'informations sur ces numéros, consultez le chapitre 16 du guide OLE DB Programmer's Reference.

Voir aussi

Exemple Visual Basic | Exemple Visual C++ | Exemple Visual J++

Description, propriété | HelpContext, HelpFile, propriétés | Source, propriété (Error ADO)

S'applique à : Error, objet


NumericScale, propriété (ADO)

Référence de l'API ADO 2.5

NumericScale, propriété

Indique l'échelle numérique d'un objet Parameter ou Field

Paramètres et valeurs renvoyées

Définit ou renvoie une valeur de type Byte qui indique le nombre de décimales de la valeur numérique.

Remarques

Utilisez la propriété NumericScale pour déterminer le nombre de chiffres à droite de la virgule qui seront utilisés pour représenter les valeurs d'un objet numérique Parameter ou Field.

Dans le cas des objets Parameter, la propriété NumericScale est accessible en lecture/écriture.

Pour les objets Field, la propriété NumericScale est normalement accessible en lecture seule. Toutefois, dans le cas de nouveaux objets Fieldajoutés à la collection Fields d'un objet Record, la propriété NumericScale est accessible en lecture/écriture une fois seulement que la propriété Value de l'objet Field a été spécifiée et que le nouvel objet Field a été ajouté par le fournisseur de données à l'aide de la méthode Update de la collection Fields.

Voir aussi

Exemple Visual Basic | Exemple Visual C++ | Exemple Visual J++

Precision, propriété

S'applique à : Field, objet | Parameter, objet


OriginalValue, propriété (ADO)

Référence de l'API ADO 2.5

OriginalValue, propriété

Indique la valeur d'un objet Field qui existait dans l'enregistrement avant toute modification.

Valeur renvoyée

Renvoie une valeur de type Variant qui représente la valeur d'un champ avant toute modification.

Remarques

Utilisez la propriété OriginalValue pour renvoyer la valeur d'origine d'un champ de l'enregistrement actuel.

En mode de mise à jour immédiate (où le fournisseur écrit les modifications dans la source de données sous-jacente lorsque vous appelez la méthode Update), la propriété OriginalValue renvoie la valeur du champ telle qu'elle était avant modification (c'est-à-dire, depuis le dernier appel de la méthode Update). La méthode CancelUpdate utilise la même valeur pour remplacer la propriété Value.

En mode de mise à jour par lots (où le fournisseur stocke plusieurs modifications en mémoire cache et les écrit dans la source de données sous-jacente lorsque vous appelez la méthode UpdateBatch), la propriété OriginalValue renvoie la valeur du champ telle qu'elle était avant modification (c'est-à-dire depuis le dernier appel de la méthode UpdateBatch). La méthode CancelBatch utilise la même valeur pour remplacer la propriété Value. Si vous utilisez cette propriété avec la propriété UnderlyingValue, vous pouvez résoudre les conflits causés par les mises à jour par lots.

Record

Dans le cas des objets Record, la propriété OriginalValue est vide pour les champs ajoutés avant l'appel de la méthode Update.

Voir aussi

Exemple Visual Basic | Exemple Visual C++ | Exemple Visual J++

UnderlyingValue, propriété

S'applique à : Field, objet


PageCount, propriété (ADO)

Référence de l'API ADO 2.5

PageCount, propriété

Indique le nombre de pages de données contenues dans l'objet Recordset.

Valeur renvoyée

Renvoie une valeur de type Long qui indique le nombre de pages contenues dans l'objet Recordset.

Remarques

Utilisez la propriété PageCount pour déterminer le nombre de pages de données contenues dans l'objet Recordset. Les pages sont des groupes d'enregistrements dont la taille est égale à la valeur de la propriété PageSize. Même si la dernière page est incomplète car le nombre d'enregistrements est inférieur à la valeur PageSize, elle compte pour une page dans la valeur de PageCount. Si l'objet Recordset ne prend pas en charge cette propriété, elle prend la valeur -1 qui indique que le nombre de pages n'est pas déterminé.

Consultez les rubriques relatives aux propriétés PageSize et AbsolutePage pour plus d'informations sur les fonctionnalités des pages.

Voir aussi

Exemple Visual Basic | Exemple Visual C++ | Exemple Visual J++

AbsolutePage, propriété | PageSize, propriété | RecordCount, propriété

S'applique à : Recordset, objet


PageSize, propriété (ADO)

Référence de l'API ADO 2.5

PageSize, propriété

Indique le nombre d'enregistrements dans une page de l'objet Recordset.

Paramètres et valeurs renvoyées

Définit ou renvoie une valeur de type Long qui indique combien d'enregistrements contient une page. La valeur par défaut est 10.

Remarques

Utilisez la propriété PageSize pour déterminer combien d'enregistrements constituent une page logique de données. Le fait de définir la taille d'une page vous permet d'utiliser la propriété AbsolutePage pour atteindre le premier enregistrement d'une page particulière. Cette méthode est particulièrement utile avec les scénarios de serveur Web lorsque vous voulez permettre à l'utilisateur de regrouper les données par page et de consulter ainsi plusieurs enregistrements à la fois.

Cette propriété peut être définie à tout moment et sa valeur est utilisée pour calculer la position du premier enregistrement d'une page.

Voir aussi

Exemple Visual Basic | Exemple Visual C++ | Exemple Visual J++

AbsolutePage, propriété | PageCount, propriété

S'applique à : Recordset, objet


ParentRow, propriété (ADO)

Référence de l'API ADO 2.5

ParentRow, propriété

Définit le conteneur d'un objet OLE DB Row sur un objet ADORecordConstruction, de façon à ce que l'objet Row parent soit transformé en objet ADO Record.

Lecture seule.

Syntaxe

HRESULT put_ParentRow([in] IUnknown* pParent);

Paramètres

pParent
Conteneur d'une ligne.

Valeurs renvoyées

Cette méthode de propriété renvoie les valeurs HRESULT standard, notamment S_OK et E_FAIL.

S'applique à

ADORecordConstruction


ParentURL, propriété (ADO)

Référence de l'API ADO 2.5

ParentURL, propriété

Indique une chaîne d'URL absolue qui pointe vers l'objet Record (enregistrement) parent de l'objet Record actif.

Valeur renvoyée

Renvoie une valeur de type String qui indique l'URL de l'objet Record parent.

Remarques

La propriété ParentURL dépend de la source utilisée pour ouvrir l'objet Record. Par exemple, l'objet Record peut être ouvert avec une source qui contient un nom de chemin relatif vers un répertoire référencé par la propriété ActiveConnection.

Supposons qu'un dossier "first" contient le dossier "second". Ouvrez l'objet Record à l'aide du code suivant :

record.ActiveConnection = "http://first"
record.Open "second"

La valeur de la propriété ParentURL est donc "http://first", la valeur de ActiveConnection.

La source peut également être une adresse URL absolue, par exemple "http://first/second". La propriété ParentURL "http://first" correspond au niveau immédiatement supérieur à "second".

Cette propriété peut avoir une valeur nulle dans les cas suivants :

  • Il n'existe pas de parent pour l'objet actif ; c'est le cas d'un objet Record qui représente la racine d'un répertoire.
  • L'objet Record représente une entité qui ne peut pas être spécifiée par une URL.

Cette propriété est en lecture seule.

Remarque Cette propriété n'est prise en charge que par les fournisseurs de source de document tels que Microsoft OLE DB Provider pour Internet Publishing. Pour plus d'informations, consultez Objets Record et champs ajoutés par le fournisseur.
Remarque Les URL utilisant le schéma HTTP invoquent automatiquement le fournisseur Microsoft OLE DB pour Internet Publishing. Pour plus d'informations, voir URL absolues et relatives.
Remarque Si l'enregistrement actuel contient un enregistrement de données d'un objet ADO Recordset, l'utilisation de la propriété ParentURL entraîne une erreur d'exécution indiquant que l'URL ne peut pas être spécifiée.

S'applique à : Record, objet


Position, propriété (ADO)

Référence de l'API ADO 2.5

Position, propriété

Indique la position en cours dans un objet Stream.

Paramètres et valeurs renvoyées

Définit ou renvoie une valeur de type Long qui spécifie le décalage en octets entre la position en cours et le début du flux. La valeur par défaut est 0, ce qui correspond au premier octet du flux.

Remarques

Il est possible de définir la position en cours à un point situé après la fin du flux. Si vous spécifiez une position en cours située au-delà de la fin du flux, la valeur de la propriété Size de l'objet Stream (flux) augmente en conséquence. Tout nouvel octet ajouté de cette manière sera nul.

Remarques La propriété Position mesure toujours des octets. Dans le cas des flux de texte utilisant des jeux de caractères sur plusieurs octets, multipliez la position par la taille des caractères pour déterminer le numéro de caractère. Par exemple, pour un jeu de caractères codés sur deux octets, le premier caractère est à la position 0, le deuxième à la position 2, le troisième à la position 4, et ainsi de suite.
Il n'est pas possible d'utiliser des valeurs négatives pour modifier la position en cours dans un objet Stream. La propriété Position accepte uniquement des nombres positifs.
Dans le cas d'objets Stream en lecture seule, ADO ne renvoie pas d'erreur si la propriété Position a une valeur supérieure à celle de la propriété Size de l'objet Stream. Cela ne modifie pas la taille ni le contenu de l'objet Stream. Il est toutefois préférable d'éviter cette situation car elle peut aboutir à une valeur aberrante de la propriété Position.

Voir aussi

Exemple

Charset, propriété

S'applique à : Stream, objet


Precision, propriété (ADO)

Référence de l'API ADO 2.5

Precision, propriété

Indique le degré de précision des valeurs numériques dans un objet Parameter ou des objets Field numériques.

Paramètres et valeurs renvoyées

Définit ou renvoie une valeur de type Byte qui indique le nombre maximum de chiffres utilisés pour représenter les valeurs numériques.

Remarques

Utilisez la propriété Precision pour déterminer le nombre maximal de chiffres utilisés pour représenter les valeurs d'un objet Parameter ou Field numérique.

Cette propriété est accessible en lecture/écriture sur un objet Parameter.

Pour les objets Field, la propriété Precision est normalement accessible en lecture seule. Toutefois, dans le cas de nouveaux objets Fieldajoutés à la collection Fields d'un objet Record, la propriété Precision est accessible en lecture/écriture une fois seulement que la propriété Value de l'objet Field a été spécifiée et que le nouvel objet Field a été ajouté par le fournisseur de données à l'aide de la méthode Update de la collection Fields.

Voir aussi

Exemple Visual Basic | Exemple Visual C++ | Exemple Visual J++

NumericScale, propriété

S'applique à : Field, objet | Parameter, objet


Prepared, propriété (ADO)

Référence de l'API ADO 2.5

Prepared, propriété

Indique si la version compilée d'une commande doit être enregistrée avant exécution.

Paramètres et valeurs renvoyées

Définit ou renvoie une valeur de type Boolean qui, si elle est égale à True, indique que la commande doit être préparée (compilée).

Remarques

Utilisez la propriété Prepared pour que le fournisseur enregistre une version compilée de la requête spécifiée dans la propriété CommandText avant la première exécution d'un objet Command. Ceci peut ralentir la première exécution de la commande mais lorsque le fournisseur opère une compilation, il utilise ensuite systématiquement la version compilée de la commande, ce qui accroît les performances.

Si la propriété a la valeur False, le fournisseur exécute directement l'objet Command sans créer de version compilée.

Si le fournisseur ne prend pas en charge la préparation des commandes, il peut renvoyer une erreur dès lors que cette propriété a la valeur True. S'il ne renvoie pas d'erreur, le fournisseur ignore tout simplement la requête et affecte à la propriété Prepared la valeur False.

Voir aussi

Exemple Visual Basic | Exemple Visual C++ | Exemple Visual J++

S'applique à : Command, objet


Provider, propriété (ADO)

Référence de l'API ADO 2.5

Provider, propriété

Indique le nom du fournisseur d'un objet Connection.

Paramètres et valeurs renvoyées

Définit ou renvoie une valeur de type String qui indique le nom du fournisseur.

Remarques

Utilisez la propriété Provider pour définir ou renvoyer le nom du fournisseur d'une connexion. Cette propriété peut également être définie par le contenu de la propriété ConnectionString ou l'argument ConnectionString de la méthode Open ; notez cependant que si vous indiquez le nom d'un fournisseur à plusieurs endroits différents lorsque vous appelez la méthode Open, les résultats peuvent être imprévisibles. Si aucun fournisseur n'est spécifié, la propriété prend par défaut la valeur MSDASQL (Microsoft OLE DB Provider pour ODBC).

La propriété Provider est accessible en lecture/écriture lorsque la connexion est fermée et en lecture seule lorsque la connexion est ouverte. La valeur ne prend effet que lorsque vous ouvrez l'objet Connection ou que vous accédez à la collection Properties de l'objet Connection. Si la valeur n'est pas valide, une erreur se produit.

Voir aussi

Exemple Visual Basic | Exemple Visual C++ | Exemple Visual J++

Microsoft OLE DB Provider pour ODBC | Annexe A : Fournisseurs

S'applique à : Connection, objet


RecordCount, propriété (ADO)

Référence de l'API ADO 2.5

RecordCount, propriété

Indique le nombre d'enregistrements contenus dans un objet Recordset.

Valeur renvoyée

Renvoie une valeur de type Long qui indique le nombre d'enregistrements contenus dans l'objet Recordset.

Remarques

Utilisez la propriété RecordCount pour déterminer le nombre d'enregistrements dans un objet Recordset. Cette propriété renvoie -1 lorsque ADO ne peut pas déterminer le nombre d'enregistrements ou si le type de curseur ne prend pas en charge la propriété RecordCount. Si vous lisez la propriété RecordCount sur un objet Recordset, une erreur se produit.

Si l'objet Recordset accepte le positionnement approximatif ou les signets (c'est-à-dire que Supports (adApproxPosition) ou Supports (adBookmark) renvoie la valeur True), la valeur de RecordCount correspond au nombre exact d'enregistrements dans l'objet Recordset, que ce dernier soit complet ou non. Si l'objet Recordset ne prend pas en charge le positionnement approximatif, cette propriété peut peser lourdement sur les ressources dans la mesure où tous les enregistrements doivent être extraits et comptés pour qu'une valeur RecordCount exacte puisse être renvoyée.

Le type de curseur de l'objet Recordset détermine si le nombre d'enregistrements peut ou non être établi. La propriété RecordCount renvoie les valeurs suivantes : -1 pour un curseur de défilement vers l'avant seulement, le compte effectif pour un curseur statique ou à jeu de clés, -1 ou le compte effectif (selon la source de données) pour un curseur dynamique.

Voir aussi

Exemple Visual Basic | Exemple Visual C++ | Exemple Visual J++

AbsolutePosition, propriété | PageCount, propriété

S'applique à : Recordset, objet


RecordType, propriété (ADO)

Référence de l'API ADO 2.5

RecordType, propriété

Indique le type d'objet Record.

Valeur renvoyée

Renvoie une valeur RecordTypeEnum.

Remarques

La propriété RecordType est accessible en lecture seule.

Voir aussi

Exemple

Type, propriété | Type, propriété (Stream ADO)

S'applique à : Record, objet


Row, propriété (ADO)

Référence de l'API ADO 2.5

Row, propriété

Obtient ou définit un objet OLE DB Row dans/sur un objet ADORecordConstruction. Lorsque vous utilisez put_Row pour définir un objet Row, une ligne est transformée en objet ADO Record.

Lecture/Écriture. Syntaxe

HRESULT get_Row([out, retval] IUnknown** ppRow);
HRESULT put_Row([in] IUnknown* pRow);

Paramètres

ppRow
Pointeur vers un objet OLE DB Row.
PRow
Objet OLE DB Row.

Valeurs renvoyées

Cette méthode de propriété renvoie les valeurs HRESULT standard, notamment S_OK et E_FAIL.

S'applique à

ADORecordConstruction


RowPosition, propriété (ADO)

Référence de l'API ADO 2.5

RowPosition, propriété

Obtient ou définit un objet OLE DB RowPosition dans/sur un objet ADORecordsetConstruction. Lorsque vous put_RowPosition pour définir un objet RowPosition, l'objet Recordset résultant utilise l'objet RowPosition pour déterminer la ligne en cours.

Lecture/Écriture.

Syntaxe

HRESULT get_RowPosition([out, retval] IUnknown** ppRowPos);
HRESULT put_RowPosition([in] IUnknown* pRowPos);

Paramètres

ppRowPos
Pointeur vers un objet OLE DB RowPosition.
PRowPos
Objet OLE DB RowPosition.

Valeurs renvoyées

Cette méthode de propriété renvoie les valeurs HRESULT standard, notamment S_OK et E_FAIL.

Remarques

Lorsque cette propriété est définie, si l'objet Rowset sur l'objet RowPosition est différent de l'objet Rowset sur l'objet Recordset, ce dernier est remplacé par le premier objet. Le même comportement s'applique également à l'objet Chapter sur l'objet RowPosition.

S'applique à

ADORecordsetConstruction


Rowset, propriété (ADO)

Référence de l'API ADO 2.5

Rowset, propriété

Obtient ou définit un objet OLE DB Rowset dans/sur un objet ADORecordsetConstruction. Lorsque vous utilisez put_Rowset, l'ensemble de lignes est transformé en objet ADO Recordset.

Lecture/Écriture.

Syntaxe

HRESULT get_Rowset([out, retval] IUnknown** ppRowset);
HRESULT put_Rowset([in] IUnknown* pRowset);

Paramètres

ppRowset
Pointeur vers un objet OLE DB Rowset.
PRowset
Objet OLE DB Rowset.

Valeurs renvoyées

Cette méthode de propriété renvoie les valeurs HRESULT standard, notamment S_OK et E_FAIL.

S'applique à

ADORecordsetConstruction


Size, propriété (ADO)

Référence de l'API ADO 2.5

Size, propriété

Indique la taille maximale, en nombre d'octets ou de caractères, d'une valeur stockée dans un objet Parameter.

Paramètres et valeurs renvoyées

Définit ou renvoie une valeur de type Long qui détermine la taille maximale, en nombre d'octets ou de caractères, d'une valeur stockée dans un objet Parameter.

Remarques

Utilisez la propriété Size pour déterminer la taille maximale des valeurs écrites ou lues dans la propriété Value d'un objet Parameter.

Si vous spécifiez un type de données de longueur variable pour un objet Parameter (par exemple, tout type String comme adVarChar), vous devez définir la propriété Size de cet objet avant de l'ajouter à la collection Parameters faute de quoi une erreur se produit.

Si vous avez déjà ajouté l'objet Parameter à la collection Parameters d'un objet Command et si vous changez son type en type de données de longueur variable, vous devez définir la propriété Size de l'objet Parameter avant d'exécuter l'objet Command, faute de quoi, une erreur se produit.

Si vous utilisez la méthode Refresh pour obtenir des informations sur le paramètre du fournisseur et que cette méthode renvoie un ou plusieurs objets Parameter, ADO peut allouer de la mémoire en fonction de la taille potentielle des paramètres, ce qui risque de provoquer une erreur à l'exécution. Pour éviter les erreurs, il est recommandé de définir explicitement la valeur de la propriété Size de ces paramètres avant d'exécuter la commande.

La propriété Size est accessible en lecture/écriture.

Voir aussi

Exemple Visual Basic | Exemple Visual C++ | Exemple Visual J++ | Exemple JScript

Size, propriété (Stream ADO)

S'applique à : Parameter, objet


Size, propriété (Stream ADO)

Indique la taille du flux en octets.

Valeurs renvoyées

Renvoie une valeur de type Long qui spécifie la taille du flux en octets. La valeur par défaut est la taille du flux ou -1 (si la taille du flux est inconnue).

Remarques

La propriété Size ne peut être utilisée qu'avec des objets Stream ouverts.

Remarque Vous pouvez mémoriser un nombre de bits quelconque dans un objet Stream ; les seules limites sont liées aux ressources système. Si l'objet Stream contient plus de bits que ne peut en représenter une valeur Long, la valeur de la propriété Size est tronquée et ne représente donc plus précisément la longueur de l'objet Stream (flux).

Voir aussi

Size, propriété

S'applique à : Stream, objet


Sort, propriété (ADO)

Référence de l'API ADO 2.5

Sort, propriété

Spécifie un ou plusieurs noms de champ de tri pour l'objet Recordset et détermine si chaque champ est trié en ordre croissant ou décroissant.

Paramètres et valeurs renvoyées

Définit ou renvoie une valeur de type String qui indique le nom des champs de tri dans l'objet Recordset. Les noms de champs sont séparés par une virgule et éventuellement suivis par un espace et le mot clé ASC (pour trier le champ en ordre croissant) ou DESC (pour trier le champ en ordre décroissant). Par défaut, si aucun mot clé n'est spécifié, l'ordre de tri est croissant.

Remarques

Cette propriété exige que la propriété CursorLocation ait la valeur adUseClient. Un index temporaire est créé pour chaque champ spécifié dans la propriété Sort s'il n'existe pas déjà un index.

L'opération de tri est efficace dans la mesure où elle ne réorganise pas physiquement les données, mais vous permet seulement d'y accéder dans l'ordre spécifié par l'index.

Si vous définissez une chaîne vide pour la propriété Sort, les lignes reprennent leur position d'origine et les index temporaires sont supprimés. Les index existants ne sont pas supprimés.

Prenons un objet Recordset qui contient trois champs nommés respectivement firstName (prénom), middleInitial (initiale) et lastName (nom de famille). Affectez à la propriété Sort la chaîne "lastName DESC, firstName ASC", qui ordonne l'objet Recordset dans l'ordre décroissant des noms de famille, puis dans l'ordre croissant des prénoms. L'initiale est ignorée.

Aucun champ ne peut être intitulé « ASC » ou « DESC » car ces noms sont en conflit avec les mots clés ASC et DESC. Si un champ a un nom qui provoque un conflit, attribuez-lui un alias à l'aide du mot clé AS dans la requête qui renvoie l'objet Recordset.

Voir aussi

Exemple Visual Basic | Exemple Visual C++ | Exemple Visual J++

Optimize, propriété dynamique (ADO) | SortColumn, propriété (RDS) | SortDirection, propriété (RDS)

S'applique à : Recordset, objet


Source, propriété (ADO Error)

Référence de l'API ADO 2.5

Source, propriété (Error ADO)

Indique le nom de l'objet ou de l'application qui est à l'origine d'une erreur.

Valeur renvoyée

Renvoie une valeur de type String qui indique le nom d'un objet ou d'une application.

Remarques

Utilisez la propriété Source sur un objet Error pour déterminer le nom de l'objet ou de l'application qui est à l'origine d'une erreur. Il peut s'agir du nom de la classe de l'objet ou de l'ID de programmation. Pour les erreurs survenant dans ADO, la valeur de la propriété sera ADODB.ObjectName où ObjectName est le nom de l'objet qui a provoqué l'erreur. Pour ADOX et ADO MD, cette valeur est respectivement ADOX.ObjectName et ADOMD.ObjectName.

Grâce aux informations obtenues des propriétés Source, Number et Descriptiondes objets Error, vous pouvez écrire des lignes de code qui permettent de traiter l'erreur de façon adéquate.

La propriété Source est accessible en lecture seule pour les objets Error.

Voir aussi

Exemple Visual Basic | Exemple Visual C++ | Exemple Visual J++

Description, propriété | HelpContext, HelpFile, propriétés | Number, propriété | Source, propriété (Record ADO) | Source, propriété (Recordset ADO)

S'applique à : Error, objet


Source, propriété (ADO Record)

Indique la source de données ou l'objet représenté par l'objet Record.

Paramètres et valeurs renvoyées

Définit ou renvoie une valeur de type Variant qui indique l'entité représentée par l'objet Record.

Remarques

La propriété Source renvoie l'argument Source pour la méthode Open de l'objet Record. Elle peut contenir une chaîne d'URL absolue ou d'URL relative. Une URL absolue peut être utilisée sans définir la propriété ActiveConnection pour ouvrir directement l'objet Record. Dans ce cas, un objet Connection implicite est créé.

La propriété Source peut également contenir la référence d'un objet Recordset déjà ouvert qui ouvre un objet Record représentant la ligne en cours dans le Recordset.

La propriété Source peut également contenir la référence d'un objet Command qui renvoie une seule ligne de données du fournisseur.

Si la propriété ActiveConnection est également définie, la propriété Source doit pointer vers un objet qui existe dans l'étendue de cette connexion. Par exemple, dans les espaces de noms structurés en arborescence, si la propriété Source contient une URL absolue, elle doit pointer vers un nœud qui existe dans l'étendue du nœud identifié par l'URL dans la chaîne de connexion. Si la propriété Source contient une URL relative, elle est validée au sein du contexte défini par la propriété ActiveConnection.

La propriété Source est accessible en lecture/écriture lorsque l'objet Record est fermé et en lecture seule lorsque l'objet Record est ouvert.

Remarque Les URL utilisant le schéma HTTP invoquent automatiquement le fournisseur Microsoft OLE DB pour Internet Publishing. Pour plus d'informations, voir URL absolues et relatives.

Voir aussi

Source, propriété (Error ADO) | Source, propriété (Recordset ADO)

S'applique à : Record, objet


Source, propriété (ADO Recordset)

Indique la source de données d'un objet Recordset.

Paramètres et valeurs renvoyées

Définit une valeur de type String ou une référence d'objet Command ; renvoie uniquement une valeur de type String qui indique la source d'un objet Recordset.

Remarques

Utilisez la propriété Source pour spécifier la source de données associée à un objet Recordset en utilisant, au choix : une variable objet Command, une instruction SQL, une procédure stockée ou un nom de table.

Si vous définissez la propriété Source sur un objet Command, la propriété ActiveConnection de l'objet Recordset hérite de la valeur de la propriété ActiveConnection de l'objet Command spécifié. Toutefois, la propriété Source ne renvoie aucun objet Command ; elle renvoie la propriété CommandText de l'objet Command pour lequel vous avez défini la propriété Source.

Si la propriété Source est une instruction SQL, une procédure stockée ou un nom de table, vous pouvez optimiser les performances en passant l'argument Options approprié avec l'appel à la méthode Open.

La propriété Source est en lecture/écriture pour des objets Recordset fermés et en lecture seule pour des objets Recordset ouverts.

Voir aussi

Exemple Visual Basic

Source, propriété (Error ADO) | Source, propriété (Record ADO)

S'applique à : Recordset, objet


SQLState, propriété (ADO)

Référence de l'API ADO 2.5

SQLState, propriété

Indique l'état SQL pour un objet Error donné.

Valeur renvoyée

Renvoie une valeur de type String de cinq caractères, conforme à la norme ANSI SQL, qui indique le code de l'erreur.

Remarques

Utilisez la propriété SQLState pour lire le code d'erreur de cinq caractères que le fournisseur de données renvoie lorsqu'une erreur se produit pendant le traitement d'une instruction SQL. Par exemple, lorsque vous utilisez le fournisseur Microsoft OLE DB Provider pour ODBC avec une base de données Microsoft SQL Server, ODBC renvoie des codes d'erreur concernant l'état SQL qui sont basés sur des erreurs qui sont spécifiques à ODBC ou sur des erreurs qui proviennent de Microsoft SQL Server et qui sont ensuite mappées en erreurs ODBC. Ces codes d'erreur sont décrits dans la norme ANSI SQL mais ils peuvent être implémentés de façon différente par des sources de données différentes.

Voir aussi

Exemple Visual Basic | Exemple Visual C++ | Exemple Visual J++

S'applique à : Error, objet


State, propriété (ADO)

Référence de l'API ADO 2.5

State, propriété

Indique, pour tout objet applicable, si l'objet est en état ouvert ou fermé.

Pour tous les objets applicables qui exécutent une méthode asynchrone, indique si l'objet est encours de connexion, d'exécution ou d'extraction.

Valeur renvoyée

Renvoie une valeur de type Long qui peut être une valeur ObjectStateEnum. La valeur par défaut est adStateClosed.

Remarques

Vous pouvez utiliser la propriété State pour déterminer l'état actuel d'un objet donné à n'importe quel moment.

La propriété State de l'objet peut être une combinaison de valeurs. Par exemple, si une instruction est en cours d'exécution, cette propriété combinera les valeurs adStateOpen et adStateExecuting.

La propriété State est accessible en lecture seule.

Voir aussi

Exemple Visual Basic | Exemple Visual C++ | Exemple Visual J++

S'applique à : Command, objet | Connection, objet | Record, objet | Recordset, objet | Stream, objet


Status, propriété (ADO Field)

Indique l'état d'un objet Field.

Valeur renvoyée

Renvoie une valeur FieldStatusEnum. La valeur par défaut est adFieldOK.

Remarques

Cette propriété renvoie toujours adFieldOK pour les champs d'un objet Recordset.

Les ajouts et suppressions à la collection Fields de l'objet Record sont mis en mémoire cache jusqu'à l'appel de la méthode Update. La propriété Status permet de déterminer quels champs ont été ajoutés ou supprimés.

Pour améliorer les performances, les modifications du schéma sont mises en mémoire cache jusqu'à l'appel de la méthode Update puis elles sont effectuées dans le cadre d'une mise à jour optimiste par lots. Si la méthode Update n'est pas appelée, le serveur n'est pas mis à jour. Si une mise à jour échoue, une erreur est renvoyée et la propriété Status indique les valeurs combinées de l'opération et du code d'erreur. Par exemple : adFieldPendingInsert OR adFieldPermissionDenied. La propriété Status de chaque objet Field peut être utilisée pour déterminer pourquoi le champ Field n'a pas été ajouté, modifié ou supprimé. Status n'a de sens que sur la collection Record.Fields, pas sur la collection Recordset.Fields.

Lorsque vous ajoutez, modifiez ou supprimez un objet Field, deux problèmes peuvent survenir. Si l'utilisateur supprime un objet Field (champ), ce dernier est marqué pour suppression dans la collection Fields. Si la méthode Update qui suit renvoie une erreur parce que l'utilisateur a essayé de supprimer un champ pour lequel il n'a pas les autorisations appropriées, l'objet Field prend l'état adFieldPermissionDenied OR adFieldPendingDelete. En appelant la méthode CancelUpdate vous restaurez les valeurs d'origine et affectez à la propriété Status la valeur adFieldOK. De même, la méthode Update peut renvoyer une erreur parce qu'un nouvel objet Field a été ajouté avec une valeur incorrecte. Dans ce cas, le nouvel objet Field est enregistré dans la collection Fields avec l'état adFieldPendingInsert voire adFieldCantCreate. Vous pouvez fournir une valeur correcte pour le nouvel objet Field et appeler à nouveau la méthode Update. Notez que si vous appelez la méthodeResync, vous relancez l'interrogation du fournisseur de données.

Voir aussi

Exemple Visual Basic | Exemple Visual C++ | Exemple Visual J++

S'applique à : Field, objet

© 1998-2002 Microsoft Corporation. Tous droits réservés.


Status, propriété (ADO Recordset)

Indique l'état de l'enregistrement actuel par rapport à des mises à jour par lots ou autres opérations globales.

Valeur renvoyée

Renvoie la somme de valeurs RecordStatusEnum.

Remarques

Utilisez la propriété Status pour voir quelles modifications sont en attente pour des enregistrements modifiés pendant la mise à jour par lots. Vous pouvez aussi utiliser la propriété Status pour afficher l'état des enregistrements qui échouent pendant les opérations globales, notamment lorsque vous appelez la méthode Resync, UpdateBatch ou CancelBatch sur un objet Recordset ou lorsque vous affectez un groupe de signets à la propriété Filter d'un objet Recordset. Cette propriété vous permet de savoir comment un enregistrement a échoué et d'y apporter la solution adéquate.

Voir aussi

Exemple Visual Basic | Exemple Visual C++ | Exemple Visual J++

S'applique à : Recordset, objet


StayInSync, propriété (ADO)

Référence de l'API ADO 2.5

StayInSync, propriété

Indique dans un objet Recordset hiérarchique, si la référence aux enregistrements enfants sous-jacents (c'est-à-dire, le chapitre) change lorsque la position de la ligne parent change.

Paramètres et valeurs renvoyées

Définit ou renvoie une valeur de type Boolean. La valeur par défaut est True. Si cette propriété a pour valeur True, le chapitre sera mis à jour si la position des lignes a changé dans l'objet Recordset parent ; si la valeur est False, le chapitre continue de faire référence aux données du chapitre précédent, même si l'objet Recordset parent a modifié la position des lignes.

Remarques

Cette propriété s'applique aux jeux d'enregistrements hiérarchiques, comme ceux qui sont reconnus par Microsoft Data Shaping Service pour OLE DB et doit être définie sur l'objet Recordset parent avant l'extraction de l'objet Recordset enfant. Cette propriété facilite la navigation entre des jeux d'enregistrements hiérarchiques.

Voir aussi

Exemple Visual Basic

Microsoft Data Shaping Service pour OLE DB

S'applique à : Recordset, objet


Type, propriété (ADO)

Référence de l'API ADO 2.5

Type, propriété

Indique le type opérationnel ou le type de données d'un objet Parameter, Field ou Property.

Paramètres et valeurs renvoyées

Définit ou renvoie une valeur DataTypeEnum.

Remarques

Dans le cas de nouveaux objets Parameter, la propriété Type est accessible en lecture/écriture. Dans le cas de nouveaux objets Fieldajoutés à la collection Fields d'un objet Record, la propriété Type est accessible en lecture/écriture une fois seulement que la propriété Value de l'objet Field a été spécifiée et que le nouvel objet Field a été ajouté par le fournisseur de données à l'aide de la méthode Update de la collection Fields.

Pour tous les autres objets, la propriété Type est en lecture seule.

Voir aussi

Exemple Visual Basic | Exemple Visual C++ | Exemple Visual J++

RecordType, propriété | Type, propriété (Stream ADO)

S'applique à : Field, objet | Parameter, objet | Property, objet


Type, propriété (ADO Stream)

Référence de l'API ADO 2.5

Type, propriété (Stream ADO)

Indique le type de données contenues dans un objet Stream (binaires ou texte).

Paramètres et valeurs renvoyées

Définit ou renvoie une valeur StreamTypeEnum qui spécifie le type de données contenues dans l'objet Stream. La valeur par défaut est adTypeText. Toutefois, si des données binaires sont écrites dans un nouvel objet Stream, la propriété Type prend la valeur adTypeBinary.

Remarques

La propriété Type n'est accessible en lecture/écriture que si la position en cours est au début de l'objet Stream (Position égale à 0) ; elle est en lecture seule pour toutes les autres positions.

La propriété Type détermine les méthodes à utiliser pour lire et écrire dans l'objet Stream. Pour les objets Stream de texte, utilisez les méthodes ReadText et WriteText. Pour les objets Stream binaires, utilisez les méthodes Read et Write.

Voir aussi

Exemple

RecordType, propriété | Type, propriété

S'applique à : Stream, objet


UnderlyingValue, propriété (ADO)

Référence de l'API 2.5 ADO

UnderlyingValue, propriété

Indique la valeur en cours d'un objet Field dans la base de données.

Valeur renvoyée

Renvoie une valeur de type Variant qui indique la valeur de l'objet Field.

Remarques

Utilisez la propriété UnderlyingValue pour renvoyer la valeur du champ en cours à partir de la base de données. La valeur du champ fournie par la propriété UnderlyingValue est la valeur qui est rendue visible par votre transaction ; elle peut résulter d'une mise à jour récente effectuée par une autre transaction. Cette valeur peut être différente de la propriété OriginalValue qui reflète la valeur d'origine renvoyée à l'objet Recordset.

Cela revient à utiliser la méthode Resync, sauf que la propriété UnderlyingValue renvoie uniquement la valeur d'un champ précis de l'enregistrement actuel. La méthode Resync utilise la même valeur pour remplacer la propriété Value.

Si vous utilisez cette propriété avec la propriété OriginalValue, vous pouvez résoudre les conflits causés par les mises à jour par lots.

Record

Dans le cas des objets Record, la propriété UnderlyingValue est vide pour les champs ajoutés avant l'appel de la méthode Update.

Voir aussi

Exemple Visual Basic | Exemple Visual C++ | Exemple Visual J++

OriginalValue, propriété | Resync, méthode

S'applique à : Field, objet


Value, propriété (ADO)

Référence de l'API ADO 2.5

Value, propriété

Indique la valeur affectée à un objet Field, Parameter ou Property.

Paramètres et valeurs renvoyées

Définit ou renvoie une valeur de type Variant qui indique la valeur de l'objet. La valeur par défaut dépend de la propriété Type.

Remarques

Utilisez la propriété Value pour définir ou renvoyer des données à partir d'objets Field, pour définir ou renvoyer des valeurs de paramètres avec des objets Parameter, ou encore pour définir ou renvoyer des valeurs de propriétés avec des objets Property. Plusieurs facteurs déterminent si la propriété Value est accessible en lecture/écriture ou en lecture seule ; pour plus d'informations, consultez les rubriques relatives aux objets concernés.

ADO permet de définir et de renvoyer des données binaires avec la propriété Value.

Remarques Dans le cas des objets Parameter, ADO ne lit qu'une seule fois la propriété Value dans le fournisseur de données. Si une commande contient un objet Parameter dont la propriété Value est vide et que vous créez un objet Recordset à partir de la commande, veillez à fermer le Recordset avant d'extraire la propriété Value. Sinon, la propriété Value pourrait être vide pour certains fournisseurs et ne contiendrait pas la valeur correcte.
Dans le cas des nouveaux objets Field ajoutés à la collection Fields d'un objet Record, vous devez définir la propriété Value avant de spécifier toute autre propriété de l'objet Field. Pour commencer, vous devez affecter une valeur précise à la propriété Value et appeler la méthode Update sur la collection Fields. Après quoi, vous pouvez accéder à d'autres propriétés telles que Type ou Attributes.

Voir aussi

Exemple Visual Basic | Exemple Visual C++ | Exemple Visual J++

S'applique à : Field, objet | Parameter, objet | Property, objet


Version, propriété (ADO)

Référence de l'API ADO 2.5

Version, propriété

Indique le numéro de version d'ADO.

Valeur renvoyée

Renvoie une valeur de type String qui indique le numéro de version.

Remarques

Utilisez la propriété Version pour renvoyer le numéro de version de l'implémentation ADO.

La version du fournisseur sera disponible en tant que propriété dynamique dans la collection Properties.

Voir aussi

Exemple Visual Basic | Exemple Visual C++ | Exemple Visual J++

S'applique à : Connection, objet


Propriétés dynamiques ADO

Il est possible d'ajouter des propriétés dynamiques aux collections Properties des objets Connection, Command ou Recordset. La source de ces propriétés est soit un fournisseur de données, tel que OLE DB Provider for SQL Server, soit un fournisseur de services, tel que Microsoft Cursor Service for OLE DB. Consultez la documentation du fournisseur de données ou du fournisseur de services approprié pour plus d'informations sur une propriété dynamique spécifique.

L'index des propriétés dynamiques ADO fournit une référence croisée entre les noms ADO et OLE DB pour chaque propriété dynamique du fournisseur OLE DB standard.

Les propriétés dynamiques standard suivantes présentent un intérêt particulier ; elles sont également documentées dans les sources mentionnées ci-dessus. Les fonctions spéciales associées à ADO sont documentées dans les rubriques d'aide ADO indiquées ci-dessous.

Optimize | Indique si un index doit être créé pour le champ concerné.
Prompt | Indique si le fournisseur OLE DB doit demander à l'utilisateur des informations d'initialisation.
Reshape Name | Indique un nom pour l'objet Recordset.
Resync Command | Spécifie une chaîne de commande fournie par l'utilisateur et émise par la méthode Resync pour actualiser les données de la table désignée dans la propriété dynamique Unique Table.
Unique Table, Unique Schema, Unique Catalog | Unique Table — spécifie le nom de la table de base sur laquelle des mises à jour, des insertions et des suppressions sont autorisées. Unique Schema — spécifie le schéma ou le nom du propriétaire de la table. Unique Catalog — spécifie le catalogue ou le nom de la base de données contenant la table.
Update Resync | Spécifie si la méthode UpdateBatch est suivie d'une opération de méthode Resync implicite, et si tel est le cas, la portée de cette opération.

Voir aussi

Guide de référence de l'API ADO | Collections ADO | Constantes énumérées ADO | Erreurs ADO | Événements ADO | Méthodes ADO | Modèle d'objet ADO | Objets ADO | Propriétés ADO


Index des propriétés dynamiques ADO

Les fournisseurs de données, les fournisseurs de services et les composants de services peuvent ajouter des propriétés dynamiques aux collections Properties des objets Connection et Recordset non-ouverts. Un fournisseur particulier peut également insérer des propriétés supplémentaires quand ces objets sont ouverts. Certaines de ces propriétés sont répertoriées dans la section Propriétés dynamiques ADO. D'autres sont énumérées sous les fournisseurs spécifiques dans la section Annexe A : Fournisseurs.

Le tableau ci-après est un index croisé des noms ADO et OLE DB pour chaque propriété dynamique de fournisseur OLE DB standard. Vos fournisseurs peuvent ajouter d'autres propriétés ne figurant pas dans cette liste. Pour des informations spécifiques sur les propriétés dynamiques propres à chaque fournisseur, consultez la documentation appropriée.

Le guide OLE DB Programmer's Reference fait référence au nom d'une propriété ADO par le terme « Description ». Vous trouverez des informations supplémentaires sur ces propriétés standard dans le guide OLE DB Programmer's Reference. Recherchez le nom de la propriété OLE DB dans l'index ou consultez les rubriques suivantes :

  • Annexe C : Propriétés OLE DB
  • Propriétés prises en charge du Cursor Service
  • Propriétés prises en charge du fournisseur de persistance
  • Propriétés prises en charge du Remoting Provider

Remarques

Notez les numéros utilisés dans l'index croisé :

(1) Cette propriété est un indicateur de type Boolean précisant si l'interface nommée doit être utilisée. Le nom de la propriété OLE DB équivalente est indiqué, le cas échéant.

(2) La propriété ADO Bookmarkable est générée en interne à des fins de compatibilité amont, et est mappée à la propriété OLE DB DBPROP_IROWSETLOCATE. Il s'agit de la propriété correspondant à la propriété ADO IRowsetLocate.

(3) Le nom de la propriété ADO, « Hidden Columns », porte un nom différent de la description du nom de la propriété OLE DB « Hidden Columns Count ».

(4) Avec les objets Recordset hiérarchiques, la propriété « Maximum Rows » ADO est appliquée à tous les objets enfants. Selon l'ordre dans lequel les lignes sont renvoyées, vous obtiendrez tous les enfants, certains d'entre eux ou aucun enfant pour chaque parent ou des enfants orphelins dans le jeu de résultats. Par conséquent, lorsque vous mettez en forme les jeux d'enregistrements hiérarchiques, l'identificateur de chaque enfant doit être unique. En général, le fournisseur Microsoft Data Shaping Service pour OLE DB (MSDATASHAPE) ne différencie pas les propriétés pouvant être héritées des parents de celles pour lesquelles cela n'est pas possible.

(5) Sans effet.

Propriétés dynamiques de l'objet Connection

Nom de propriété ADO | Nom de propriété OLE DB
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

Propriétés dynamiques de l'objet Recordset

Notez que les propriétés dynamiques de l'objet Recordset sont hors de portée (indisponibles) lorsque l'objet Recordset est fermé.

Nom de propriété ADO | Nom de propriété OLE DB
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 (4)
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 | (5)
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, propriété dynamique (ADO)

Indique si un index doit être créé pour le champ concerné.

Paramètres et valeurs renvoyées

Définit ou renvoie une valeur de type Boolean qui indique si un index doit être créé.

Remarques

Un index peut accroître les performances des opérations de recherche ou de tri des valeurs dans un objet Recordset. L'index est interne à ADO ; vous ne pouvez ni y accéder ni l'utiliser dans votre application.

Pour créer l'index d'un champ, attribuez à la propriété Optimize la valeur True. Pour supprimer l'index, choisissez la valeur False.

Optimize est une propriété dynamique ajoutée à la collection Properties de l'objet Field lorsque la propriété CursorLocation est définie sur adUseClient.

Utilisation

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

Voir aussi

Exemple Visual Basic | Exemple Visual C++ | Exemple Visual J++

Filter, propriété | Find, méthode | Sort, propriété

S'applique à : Field, objet


Prompt, propriété dynamique (ADO)

Référence de l'API ADO 2.5

Prompt, propriété dynamique

Indique si le fournisseur OLE DB doit demander à l'utilisateur des informations d'initialisation.

Paramètres et valeurs renvoyées

Définit et renvoie une valeur ConnectPromptEnum.

Remarques

Prompt est une propriété dynamique, qui peut être ajoutée à la collection Properties de l'objet Connection par le fournisseur OLE DB. Pour une demande d'informations d'initialisation, les fournisseurs OLE DB affichent généralement une boîte de dialogue à l'intention de l'utilisateur.

Les propriétés dynamiques d'un objet Connection sont perdues à la fermeture de cet objet. La propriété Prompt doit être redéfinie avant la réouverture de l'objet Connection pour utiliser une valeur autre que la valeur par défaut.

Remarque ;Il est déconseillé d'indiquer que le fournisseur doit solliciter l'utilisateur dans les scénarios où l'utilisateur ne peut pas répondre à la boîte de dialogue. Par exemple, l'utilisateur ne peut pas répondre si l'application s'exécute sur un système serveur et non pas sur le client, ou si l'application s'exécute sur un système auquel aucun utilisateur n'est connecté. Dans ces cas, l'application attendra indéfiniment une réponse et semblera bloquée.

Utilisation

Set cn = New Connection
cn.Provider = "SQLOLEDB"
cn.Properties("Prompt") = adPromptNever    ' do not prompt the user

S'applique à : Connection, objet


Reshape Name, propriété dynamique (ADO)

Spécifie le nom de l'objet Recordset.

Valeurs renvoyées

Renvoie une valeur de type String qui correspond au nom du Recordset.

Remarques

Les noms sont valables le temps de la connexion ou jusqu'à la fermeture du Recordset.

La propriété Reshape Name est surtout destinée à être utilisée avec la fonction de remise en forme du fournisseur de services Microsoft Data Shaping Service pour OLE DB. Les noms doivent être uniques pour pouvoir participer à une remise en forme.

Cette propriété est en lecture seule, mais peut indirectement être définie lors de la création d'un Recordset. Par exemple, si une clause d'une commande SHAPE crée un Recordset et lui donne un nom d'alias avec le mot-clé "AS", l'alias est affecté à la propriété Reshape Name. Si aucun alias n'est déclaré ou s'il est en conflit avec un nom existant, la propriété Reshape Name reçoit un nom généré par le service Data Shaping Service. Si le nom de l'alias est identique au nom d'un Recordset existant, les Recordset ne sont pas mis en forme tant que l'un d'eux n'est pas libéré. Vous pouvez modifier le comportement par défaut en affectant la valeur TRUE à la propriété "Unique Reshape Names" (voir "Microsoft Data shaping service pour OLE DB") sur la connexion ADO. Cela permet au service de mise en forme des données de modifier les noms affectés aux utilisateurs, le cas échéant, de façon à ce qu'ils soient uniques.

Utilisez la propriété Reshape Name lorsque vous souhaitez vous référer à un Recordset dans une commande SHAPE, et que vous ne connaissez pas son nom car il a été généré par le service Data Shaping Service. Dans ce cas, vous pouvez générer une commande SHAPE en enchaînant la commande à la chaîne renvoyée par la propriété Reshape Name.

Reshape Name est une propriété dynamique ajoutée à la collection Properties de l'objet Recordset lorsque la propriété CursorLocation est définie sur adUseClient.

Voir aussi

Microsoft Data Shaping Service pour OLE DB (Unique Reshape Names)

S'applique à : Recordset, objet


Resync Command, propriété dynamique (ADO)

Spécifie une chaîne de commande fournie par l'utilisateur et émise par la méthode Resync pour actualiser les données de la table désignée dans la propriété dynamique Unique Table.

Paramètres et valeurs renvoyées

Définit ou renvoie une valeur de type String correspondant à une chaîne de commande.

Remarques

L'objet Recordset est le résultat d'une opération de jointure exécutée sur plusieurs tables de base. Les lignes affectées dépendent du paramètre AffectRecords de la méthode Resync. La méthode Resync standard est exécutée si les propriétés Unique Table et Resync Command ne sont pas définies.

La chaîne de commande de la propriété Resync Command est une commande paramétrée ou une procédure stockée qui identifie de façon unique la ligne à actualiser et renvoie une seule ligne contenant le même nombre et le même ordre de colonnes que la ligne actualisée. La chaîne de commande contient un paramètre pour chaque colonne à clé primaire dans Unique Table, sinon une erreur d'exécution est renvoyée. Les paramètres sont automatiquement remplis avec les valeurs de clé primaire de la ligne à actualiser.

Voici deux exemples basés sur SQL :

1) Le Recordset est défini par une commande :

SELECT * FROM Customers JOIN Orders ON
   Customers.CustomerID = Orders.CustomerID
   WHERE city = Seattle
   ORDER BY CustomerID

La propriété Resync Command est définie sur :

"SELECT * FROM
   (SELECT * FROM Customers JOIN Orders
   ON Customers.CustomerID = Orders.CustomerID
   city = Seattle ORDER BY CustomerID)
WHERE Orders.OrderID = ?"

La propriété Unique Table est définie sur Orders et sa clé primaire, OrderID, est paramétrée. La sous-sélection offre un moyen simple de garantir, par programmation, que le nombre et l'ordre de colonnes renvoyés sont identiques à la commande d'origine.

2) Le Recordset est défini par une procédure stockée :

CREATE PROC Custorders @CustomerID char(5) AS
SELECT * FROM Customers JOIN Orders ON
Customers.CustomerID = Orders.CustomerID
WHERE Customers.CustomerID = @CustomerID

La méthode Resync doit exécuter la procédure stockée suivante :

CREATE PROC CustordersResync @ordid int AS
SELECT * FROM Customers JOIN Orders ON
Customers.CustomerID = Orders.CustomerID
WHERE Orders.ordid  = @ordid

La propriété Resync Command est définie sur :

"{call CustordersResync (?)}"

De nouveau, la propriété Unique Table est définie sur Orders et sa clé primaire, OrderID, est paramétrée.

Resync Command est une propriété dynamique ajoutée à la collection Properties de l'objet Recordset lorsque la propriété CursorLocation est définie sur adUseClient.

S'applique à : Recordset, objet


Unique Table, Unique Schema, Unique Catalog, propriétés dynamiques (ADO)

Permet de contrôler de près les modifications effectuées dans une table de base d'un objet Recordset formé par une jointure sur plusieurs tables de base.

  • Unique Table spécifie le nom de la table de base sur laquelle des mises à jour, des insertions et des suppressions sont autorisées.
  • Unique Schema spécifie le schéma ou le nom du propriétaire de la table.
  • Unique Catalog spécifie le catalogue ou le nom de la base de données contenant la table.

Paramètres et valeurs renvoyées

Définit ou renvoie une valeur de type String correspondant au nom d'une table, d'un schéma ou d'un catalogue.

Remarques

La table de base est identifiée de façon unique par son nom de catalogue, de schéma et de table. Lorsque la propriété Unique Table est définie, les valeurs des propriétés Unique Schema ou Unique Catalog sont utilisées pour trouver la table de base. Il est conseillé, mais pas obligatoire, de définir l'une des propriétés Unique Schema ou Unique Catalog, ou les deux, avant de définir la propriété Unique Table.

La clé primaire de la propriété Unique Table est traitée comme la clé primaire du Recordset entier. C'est la clé utilisée pour toute méthode qui requiert une clé primaire.

Lorsque la propriété Unique Table est définie, la méthode Delete affecte seulement la table nommée. Les méthodes AddNew, Resync, Update et UpdateBatch affectent toutes les tables de base sous-jacentes appropriées de l'objet Recordset.

Il faut spécifier la propriété Unique Table avant de procéder à toute resynchronisation personnalisée. Si cette propriété n'est pas spécifiée, la propriété Resync Command reste sans effet.

Une erreur d'exécution se produit si une table de base unique ne peut être trouvée.

Ces propriétés dynamiques sont ajoutées à la collection Properties de l'objet Recordset lorsque la propriété CursorLocation est définie sur adUseClient.

S'applique à : Recordset, objet


Update Resync, propriété dynamique (ADO)

Spécifie si la méthode UpdateBatch est suivie d'une opération de méthode Resync implicite, et dans ce cas, la portée de cette opération.

Paramètres et valeurs renvoyées

Définit ou renvoie une ou plusieurs des valeurs ADCPROP_UPDATERESYNC_ENUM.

Remarques

Les valeurs de ADCPROP_UPDATERESYNC_ENUM peuvent être combinées, à l'exception de la valeur adResyncAll qui constitue déjà la combinaison des autres valeurs.

La constante adResyncConflicts stocke les valeurs resync en tant que valeurs sous-jacentes mais ne remplace pas les modifications en attente.

Update Resync est une propriété dynamique ajoutée à la collection Properties de l'objet Recordset lorsque la propriété CursorLocation est définie sur adUseClient.

S'applique à : Recordset, objet


Méthodes ADO

AddNew | Crée un enregistrement pour un objet Recordset pouvant être mis à jour.
Append | Ajoute un objet à une collection. Si la collection est Fields, vous pouvez créer un objet Field avant de l'ajouter à la collection.
AppendChunk | Ajoute des données dans un objet Field texte volumineux ou binaire, ou dans un objet Parameter.
BeginTrans, CommitTrans et RollbackTrans | Gèrent le traitement des transactions dans un objet Connection, de la manière suivante : BeginTrans : lance une nouvelle transaction. CommitTrans : enregistre les modifications effectuées et met fin à la transaction en cours. Elle peut aussi lancer une nouvelle transaction. RollbackTrans : annule toutes les modifications effectuées et met fin à la transaction en cours. Elle peut aussi lancer une nouvelle transaction.
Cancel | Annule l'exécution d'un appel de méthode asynchrone en attente.
CancelBatch | Annule une mise à jour par lots en attente.
CancelUpdate | Annule les modifications apportées à la ligne actuelle ou nouvelle d'un objet Recordset, ou à la collection Fields d'un objet Record, avant l'appel de la méthode Update.
Clear | Supprime tous les objets Error de la collection Errors.
Clone | Crée un objet Recordset en double à partir d'un objet Recordset existant. (Facultatif) Indique que le clone doit être en lecture seule.
Close | Ferme un objet ouvert et tous les objets qui en dépendent.
CompareBookmarks | Compare deux signets et renvoie leurs valeurs relatives.
CopyRecord | Copie un fichier ou un répertoire et son contenu à un autre emplacement.
CopyTo | Copie le nombre spécifié de caractères ou d'octets (en fonction de Type) de l'objet Stream vers un autre objet Stream.
CreateParameter | Crée un objet Parameter avec les propriétés spécifiées.
Delete (collection ADO Parameters) | Supprime un objet dans la collection Parameters.
Delete (collection ADO Fields) | Supprime un objet dans la collection Fields.
Delete (Recordset ADO) | Supprime l'enregistrement actuel ou un groupe d'enregistrements.
DeleteRecord | Supprime un fichier ou un répertoire et tous ses sous-répertoires.
Execute (objet ADO Command) | Exécute la requête, l'instruction SQL ou la procédure stockée spécifiée dans la propriété CommandText.
Execute (objet ADO Connection) | Exécute le texte de commande spécifié : requête, instruction SQL, procédure stockée ou texte propre au fournisseur.
Find | Recherche un Recordset pour la ligne correspondant aux critères définis.
Flush | Vide le contenu de l'objet Stream restant dans le tampon ADO vers l'objet sous-jacent auquel Stream est associé.
GetChildren | Renvoie un objet Recordset dont les lignes représentent les fichiers et sous-répertoires du répertoire représenté par cet objet Record.
GetChunk | Renvoie tout ou partie d'un objet Field texte volumineux ou binaire.
GetRows | Extrait plusieurs enregistrements d'un objet Recordset et les place dans un tableau.
GetString | Renvoie l'objet Recordset sous forme de chaîne.
LoadFromFile | Charge le contenu d'un fichier existant dans un objet Stream.
Move | Déplace la position de l'enregistrement actuel dans un objet Recordset.
MoveFirst, MoveLast, MoveNext et MovePrevious | Opèrent un déplacement jusqu'au premier, dernier, prochain ou précédent enregistrement dans un objet Recordset spécifié et définissent l'emplacement de destination comme enregistrement actuel.
MoveRecord | Déplace un fichier ou un répertoire et son contenu vers un autre emplacement.
NextRecordset | Efface l'objet Recordset en cours et renvoie le suivant en exécutant successivement toute une série de commandes.
Open (objet ADO Connection) | Établit une connexion à une source de données.
Open (objet ADO Record) | Ouvre un objet Record existant ou crée un fichier ou répertoire.
Open (objet ADO Recordset) | Ouvre un curseur.
Open (objet ADO Stream) | Ouvre un objet Stream pour manipuler des flux de données binaires ou de texte.
OpenSchema | Obtient du fournisseur les informations concernant le schéma de base de données.
Read | Lit un nombre d'octets spécifié à partir d'un objet Stream.
ReadText | Lit un nombre de caractères spécifié à partir d'un objet Stream textuel.
Refresh | Met à jour les objets d’une collection pour refléter les objets spécifiques au fournisseur qui sont disponibles.
Requery | Met à jour les données d'un objet Recordset en réexécutant la requête à l'origine de l'objet.
Resync | Actualise les données de l'objet Recordset en cours ou la collection Fields d'un objet Record à partir de la base de données sous-jacente.
Save | Enregistre l'objet Recordset dans un fichier ou dans un objet Stream.
SaveToFile | Enregistre le contenu binaire d'un objet Stream dans un fichier.
Seek | Recherche l'index d'un objet Recordset pour une localisation rapide de la ligne qui correspond aux valeurs spécifiées et définit cette ligne comme ligne actuelle.
SetEOS | Définit la position correspondant à la fin du flux.
SkipLine | Ignore une ligne entière lors de la lecture d'un flux de texte.
Stat | Obtient des informations statistiques sur un flux ouvert.
Supports | Détermine si un objet Recordset spécifié prend en charge un type de fonctionnalité particulier.
Update | Enregistre les modifications que vous avez effectuées dans la ligne actuelle d'un objet Recordset ou dans la collection Fields d'un objet Record.
UpdateBatch | Enregistre sur le disque toutes les mises à jour par lots en attente.
Write | Écrit des données binaires dans un objet Stream.
WriteText | Écrit une chaîne de texte spécifiée dans un objet Stream.

Voir aussi

Guide de référence de l'API ADO | Collections ADO | Propriétés dynamiques ADO | Constantes énumérées ADO | Erreurs ADO | Événements ADO | Modèle d'objet ADO | Objets ADO | Propriétés ADO


AddNew, méthode (ADO)

Guide de référence de l'API ADO 2.5

AddNew, méthode

Crée un enregistrement pour un objet Recordset pouvant être mis à jour.

Syntaxe

recordset.AddNew FieldList, Values

Paramètres

recordset
Objet Recordset.
FieldList
Facultatif. Nom, tableau de noms ou positions ordinales des champs dans le nouvel enregistrement.
Values
Facultatif. Valeur ou tableau de valeurs des champs du nouvel enregistrement. Si Fieldlist est un tableau, Values doit également être un tableau comportant le même nombre d'éléments ; sinon, vous obtenez une erreur. L'ordre des noms de champs doit correspondre à l'ordre des valeurs de champs dans chaque tableau.

Remarques

Utilisez la méthode AddNew pour créer et initialiser un nouvel enregistrement. Associez la méthode Supports à adAddNew (valeur CursorOptionEnum) pour vérifier si vous pouvez ajouter des enregistrements à l'objet Recordset en cours.

Une fois que vous avez appelé la méthode AddNew, le nouvel enregistrement devient l'enregistrement actif et le reste après l'appel de la méthode Update. Dans la mesure où le nouvel enregistrement est ajouté à Recordset, un appel à MoveNext à la suite de la mise à jour entraîne un positionnement à la fin de Recordset, ce qui affecte la valeur True à EOF. Si l'objet Recordset ne prend pas en charge les signets, vous risquez de ne pas pouvoir accéder au nouvel enregistrement une fois que vous aurez atteint un autre enregistrement. En fonction du type du curseur, vous pouvez être amené à appeler la méthode Requery afin de rendre le nouvel enregistrement accessible.

Si vous appelez AddNew alors que vous apportez des modifications à l'enregistrement actuel ou pendant que vous ajoutez un nouvel enregistrement, ADO appelle la méthode Update pour enregistrer les modifications effectuées puis crée l'enregistrement.

Le comportement de la méthode AddNew dépend du mode de mise à jour de l'objet Recordset et de la transmission ou non des arguments Fieldlist et Values.

En mode de mise à jour immédiate (où le fournisseur écrit les modifications dans la source de données sous-jacente lorsque vous appelez la méthode Update), l'appel de la méthode AddNew sans arguments affecte adEditAdd (valeur EditModeEnum) à la propriété EditMode. Le fournisseur met en mémoire cache localement les modifications des valeurs de champ. L'appel de la méthode Update permet de publier le nouvel enregistrement vers la base de données et de réinitialiser la valeur de la propriété EditMode en lui affectant adEditNone (valeur EditModeEnum). Si vous passez les arguments Fieldlist et Values, ADO publie immédiatement le nouvel enregistrement vers la base de données (aucun appel de Update n'est nécessaire) ; la valeur de la propriété EditMode ne change pas (adEditNone).

En mode de mise à jour par lots (où le fournisseur met en cache les multiples modifications et les écrit dans la source de données sous-jacente uniquement lorsque vous appelez la méthode UpdateBatch), l'appel de la méthode AddNew sans arguments affecte adEditAdd à la propriété EditMode. Le fournisseur met en mémoire cache localement les modifications des valeurs de champ. L'appel de la méthode Update permet d'ajouter le nouvel enregistrement au Recordset actif et de réinitialiser la propriété EditMode en lui affectant la valeur adEditNone ; toutefois, le fournisseur ne publie pas les modifications vers la base de données sous-jacente tant que vous n'avez pas appelé la méthode UpdateBatch. Si vous passez les arguments Fieldlist et Values, ADO envoie le nouvel enregistrement au fournisseur pour qu'il le stocke en mémoire cache ; vous devez appeler la méthode UpdateBatch pour publier le nouvel enregistrement vers la base de données sous-jacente.

Voir aussi

Exemple Visual Basic | Exemple VBScript | Exemple Visual C++ | Exemple Visual J++

SafeArray | CancelUpdate, méthode | EditMode, propriété | Requery, méthode | Supports, méthode | Update, méthode | UpdateBatch, méthode

S'applique à : Recordset, objet


Append, méthode (ADO)

Guide de référence de l'API ADO 2.5

Append, méthode

Ajoute un objet à une collection. Si la collection est Fields, vous pouvez créer un objet Field avant de l'ajouter à la collection.

Syntaxe

collection.Append object
fields.Append Name, Type, DefinedSize, Attrib, FieldValue

Paramètres

collection
Objet collection.
champs
Collection Fields.
object
Variable objet représentant l'objet à ajouter.
Nom
Valeur de type String contenant le nom du nouvel objet Field ; ce nom doit être différent des autres objets dans fields.
Type
Valeur DataTypeEnum, dont la valeur par défaut est adEmpty, qui indique le type de données du nouveau champ. Les types de données suivants ne sont pas pris en charge par ADO et ne doivent donc pas être utilisés lors de l'ajout de nouveaux champs à Recordset : adIDispatch, adIUnknown, adVariant.
DefinedSize
Facultatif. Valeur de type Long représentant la taille définie, en caractères ou en octets, du nouveau champ. La valeur par défaut de ce paramètre est issue de Type. Champs dont la valeur DefinedSize est supérieure à 255 octets et qui sont traités comme des colonnes de longueur variable. (La valeur par défaut de DefinedSize n'est pas spécifiée.)
Attrib
Facultatif. Valeur FieldAttributeEnum, dont la valeur par défaut est adFldDefault, qui indique les attributs du nouveau champ. Si cette valeur n'est pas spécifiée, le champ contient les attributs issus de Type.
FieldValue
Facultatif. Valeur de type Variant représentant la valeur du nouveau champ. Si cette valeur n'est pas spécifiée, le champ est ajouté avec une valeur Null.

Remarques

Parameters, collection

Vous devez définir la propriété Type d'un objet Parameter avant de l'ajouter à la collection Parameters. Si vous sélectionnez un type de données de longueur variable, vous devez également affecter à la propriété Size une valeur supérieure à zéro.

En décrivant les paramètres vous-même, vous diminuez les appels au fournisseur tout en améliorant les performances lorsque vous utilisez des procédures stockées ou des requêtes paramétrées. Vous devez, cependant, connaître les propriétés des paramètres associés à la procédure stockée ou à la requête paramétrée que vous voulez appeler.

Utilisez la méthode CreateParameter pour créer des objets Parameter avec une configuration correcte des propriétés et utilisez la méthode Append pour les ajouter à la collection Parameters. Vous avez ainsi la possibilité de définir et renvoyer des valeurs de paramètres sans avoir à appeler le fournisseur pour obtenir les informations relatives aux paramètres. Si vous vous adressez à un fournisseur qui ne fournit pas ces informations, remplissez manuellement la collection Parameters à l'aide de cette méthode afin d'être en mesure d'utiliser des paramètres.

Fields, collection

Le paramètre FieldValue est valide seulement lorsque vous ajoutez un objet Field à un objet Record, et non à un objet Recordset. Avec un objet Record, vous pouvez ajouter des champs et fournir des valeurs en même temps. Avec un objet Recordset, vous devez créer des champs pendant que Recordset est fermé, puis ouvrir Recordset et affecter des valeurs aux champs.

Remarques Pour les nouveaux objets Field ajoutés à la collection Fields d'un objet Record, la propriété Value doit être définie avant toutes les autres propriétés Field. En premier lieu, une valeur spécifique de la propriété Value doit être affectée et Update doit être appelé sur la collection Fields. Dès lors, les autres propriétés telles que Type ou Attributes sont accessibles.
Les objets Field ayant les types de données ci-après (DataTypeEnum) ne peuvent pas être ajoutés à la collection Fields et déclenchent une erreur : adArray, adChapter, adEmpty, adPropVariant et adUserDefined. De même, les types de données suivants ne sont pas pris en charge par ADO : adIDispatch, adIUnknown et adIVariant. Pour ces types, aucune erreur ne se produit lorsqu'ils sont ajoutés, mais leur utilisation peut entraîner des résultats imprévisibles, notamment des pertes de mémoire.

Recordset

Si vous ne définissez pas la propriété CursorLocation avant d'appeler la méthode Append, CursorLocation prend automatiquement la valeur adUseClient (valeur CursorLocationEnum) lorsque la méthode Open de l'objet Recordset est appelée.

Vous obtenez une erreur d'exécution si vous appelez la méthode Append pour la collection Fields d'un Recordset ouvert, ou pour un Recordset pour lequel la propriété ActiveConnection est définie. Vous pouvez seulement ajouter des champs à un Recordset qui n'est pas ouvert et qui n'est pas encore connecté à une source de données. C'est généralement le cas lorsque l'objet Recordset est créé à l'aide de la méthode CreateRecordset ou affecté à une variable d'objet.

Record

Vous n'obtenez pas d'erreur d'exécution si vous appelez la méthode Append sur la collection Fields d'un Record ouvert. Le nouveau champ est ajouté à la collection Fields de l'objet Record. Si Record est issu de Recordset, le nouveau champ n'apparaît pas dans la collection Fields de l'objet Recordset.

Il est possible de créer un champ qui n'existe pas et de l'ajouter à la collection Fields en affectant une valeur à l'objet champ comme s'il existait déjà dans la collection. L'affectation déclenche la création et l'ajout automatiques de l'objet Field, puis s'exécute.

Après l'ajout de Field à la collection Fields de l'objet Record, appelez la méthode Update de la collection Fields pour enregistrer la modification.

Voir aussi

Exemple Visual Basic | Exemple Visual C++ | Exemple Visual J++

CreateParameter, méthode | Delete, méthode (collection ADO Fields) | Delete, méthode (collection ADO Parameters) | Delete, méthode (objet ADO Recordset) | Update, méthode

S'applique à : Fields, collection | Parameters, collection | Record, objet


AppendChunk, méthode (ADO)

Guide de référence de l'API ADO 2.5

AppendChunk, méthode

Ajoute des données dans un objet Field texte volumineux ou binaire, ou dans un objet Parameter.

Syntaxe

object.AppendChunk Data

Paramètres

object
Objet Field ou Parameter.
Data
Valeur de type Variant contenant les données à ajouter à l'objet.

Remarques

Utilisez la méthode AppendChunk sur un objet Field ou Parameter pour y ajouter des données de type caractère ou de type Long binaire. Dans les situations où la mémoire système est limitée, la méthode AppendChunk permet de manipuler des valeurs de type Long par portions plutôt qu'en intégralité.

Field

Si adFldLong de la propriété Attributes d'un objet Field a la valeur True, vous pouvez appliquer la méthode AppendChunk à ce champ.

Le premier appel de la méthode AppendChunk sur un objet Field écrit les données dans le champ, en remplaçant le contenu existant. Les appels suivants de AppendChunk ajoutent les données au contenu. Si vous ajoutez des données à un champ et si vous définissez ou lisez ensuite la valeur d'un autre champ dans l'enregistrement actif, ADO suppose que vous avez fini d'ajouter des données au premier champ. Si vous appelez à nouveau la méthode AppendChunk sur le premier champ, ADO interprète cet appel comme une nouvelle opération AppendChunk et remplace les données existantes. L'accès aux champs dans d'autres objets Recordset qui ne sont pas des clones du premier objet Recordset n'interrompt pas les opérations AppendChunk.

En l'absence d'un enregistrement actif lorsque vous appelez AppendChunk sur un objet Field, une erreur se produit.

Remarque La méthode AppendChunk n'opère pas sur les objets Field d'un objet Record. Elle n'exécute aucune opération et génère une erreur d'exécution.

Parameter

Si adParamLong de la propriété Attributes d'un objet Parameter a la valeur True, vous pouvez appliquer la méthode AppendChunk à ce paramètre.

Le premier appel de la méthode AppendChunk sur un objet Parameter écrit les données dans le paramètre, en remplaçant le contenu existant. Les appels suivants de AppendChunk sur un objet Parameter ajoutent les données au contenu existant du paramètre. Un appel de AppendChunk qui transmet une valeur Null supprime toutes les données du paramètre.

Voir aussi

Exemple Visual Basic | Exemple Visual C++ | Exemple Visual J++

Attributes, propriété | GetChunk, méthode

S'applique à : Field, objet | Parameter, objet


BeginTrans, CommitTrans et RollbackTrans, méthodes (ADO)

Guide de référence de l'API ADO 2.5

BeginTrans, CommitTrans et RollbackTrans, méthodes

Ces méthodes gèrent le traitement des transactions dans un objet Connection, de la manière suivante :

  • BeginTrans : lance une nouvelle transaction.
  • CommitTrans : enregistre les modifications effectuées et met fin à la transaction en cours. Elle peut aussi commencer une nouvelle transaction.
  • RollbackTrans : annule les modifications effectuées lors de la transaction en cours et met fin à cette dernière. Elle peut aussi commencer une nouvelle transaction.

Syntaxe

level = object.BeginTrans()
object.BeginTrans
object.CommitTrans
object.RollbackTrans

Valeur renvoyée

Il est possible d'appeler BeginTrans en tant que fonction qui renvoie une variable de type Long indiquant le niveau d'imbrication de la transaction.

Paramètres

object
Objet Connection.

Connection

Utilisez ces méthodes avec un objet Connection lorsque vous voulez enregistrer ou annuler une série de modifications apportées à la source de données en tant qu'unité simple. Par exemple, pour transférer une somme d'argent entre deux comptes, vous débitez le montant voulu du premier compte et créditez le deuxième compte du même montant. Si l'une de deux opérations de mise à jour échoue, les deux comptes ne sont plus équilibrés. En effectuant ces modifications dans le cadre d'une transaction ouverte, vous êtes certain que toutes les modifications (ou aucune) s'appliqueront.

Remarque Certains fournisseurs ne prennent pas en charge les transactions. Vérifiez que la propriété définie par le fournisseur « Transaction DDL » apparaît dans la collection Properties de l'objet Connection, ce qui indique que le fournisseur prend en charge les transactions. Si le fournisseur ne prend pas en charge les transactions, l'appel de l'une de ces méthodes renvoie une erreur.

Une fois que vous appelez la méthode BeginTrans, le fournisseur ne valide plus les modifications immédiatement tant que vous n'avez pas appelé CommitTrans ou RollbackTrans pour mettre fin à la transaction.

Pour les fournisseurs qui prennent en charge les transactions imbriquées, l'appel de la méthode BeginTrans dans le cadre d'une transaction en cours lance une nouvelle transaction, imbriquée. La valeur de retour indique le niveau de l'imbrication : une valeur de retour « 1 » correspond à une transaction de niveau supérieur (la transaction n'est pas imbriquée dans une autre transaction), « 2 » indique vous avez ouvert une transaction de deuxième niveau (une transaction imbriquée dans une transaction de niveau supérieur), et ainsi de suite. L'appel de CommitTrans ou de RollbackTrans affecte seulement la dernière transaction ouverte ; vous devez fermer ou annuler la transaction en cours avant de résoudre des transactions de niveau supérieur.

L'appel de la méthode CommitTrans enregistre les modifications effectuées dans le cadre d'une transaction ouverte sur la connexion et met fin à la transaction. L'appel de la méthode RollbackTrans annule les modifications effectuées dans le cadre d'une transaction ouverte et met fin à la transaction. L'appel de l'une de ces méthodes alors qu'aucune transaction n'est ouverte génère une erreur.

En fonction de la propriété Attributes de l'objet Connection, l'appel de la méthode CommitTrans ou RollbackTrans peut lancer automatiquement une nouvelle transaction. Si la propriété Attributes a comme valeur adXactCommitRetaining, le fournisseur commence automatiquement une nouvelle transaction après l'appel de CommitTrans. Si la propriété Attributes a pour valeur adXactAbortRetaining, le fournisseur commence automatiquement une nouvelle transaction après l'appel de RollbackTrans.

RDS (Remote Data Service)

Les méthodes BeginTrans, CommitTrans et RollbackTrans ne sont pas disponibles sur un objet Connection côté client.

Voir aussi

Exemple Visual Basic | Exemple Visual C++ | Exemple Visual J++

Attributes, propriété

S'applique à : Connection, objet


Cancel, méthode (ADO)

Guide de référence de l'API ADO 2.5

Cancel, méthode

Annule l'exécution d'un appel de méthode asynchrone en attente.

Syntaxe

object.Cancel

Remarques

Utilisez la méthode Cancel pour interrompre l'exécution d'un appel de méthode asynchrone (une méthode appelée à l'aide de l'option adAsyncConnect, adAsyncExecute ou adAsyncFetch).

Le tableau suivant indique la tâche qui est interrompue lorsque vous utilisez la méthode Cancel sur un objet de type particulier.

Si object a pour valeur | Le dernier appel asynchrone de cette méthode est interrompu
Command | Execute
Connection | Execute ou Open
Record | CopyRecord, DeleteRecord, MoveRecord ou Open
Recordset | Open
Stream | Open

Voir aussi

Exemple Visual Basic | Exemple VBScript | Exemple Visual C++ | Exemple Visual J++

Cancel, méthode (RDS) | CancelBatch, méthode | CancelUpdate, méthode | CancelUpdate, méthode (RDS) | Execute, méthode (objet ADO Command) | Execute, méthode (objet ADO Connection) | Open, méthode (objet ADO Connection) | Open, méthode (objet ADO Recordset)

S'applique à : Command, objet | Connection, objet | Record, objet | Recordset, objet | Stream, objet


CancelBatch, méthode (ADO)

Guide de référence de l'API ADO 2.5

CancelBatch, méthode

Annule une mise à jour par lots en attente.

Syntaxe

recordset.CancelBatch AffectRecords

Paramètres

AffectRecords
Facultatif. Valeur AffectEnum qui détermine le nombre d'enregistrements que la méthode CancelBatch affectera.

Remarques

Utilisez la méthode CancelBatch pour annuler l'exécution d'une mise à jour par lots placée en attente dans un Recordset. Si Recordset se trouve en mode de mise à jour immédiate, l'appel de CancelBatch sans adAffectCurrent génère une erreur.

Si vous modifiez l'enregistrement actuel ou ajoutez un nouvel enregistrement lorsque vous appelez CancelBatch, ADO appelle d'abord la méthode CancelUpdate pour annuler les modifications mises en mémoire cache. Ensuite, toutes les modifications en attente dans Recordset sont annulées.

Il est possible que l'enregistrement actuel ne puisse pas être déterminé après un appel de CancelBatch, notamment si vous êtes en train d'ajouter un nouvel enregistrement. Pour cette raison, il est prudent de définir la position de l'enregistrement actuel selon un emplacement connu dans Recordset après l'appel de CancelBatch. Par exemple, appelez la méthode MoveFirst.

Si la tentative d'annulation de mises à jour en attente échoue à cause d'un conflit avec les données sous-jacentes (par exemple, un enregistrement ayant déjà été supprimé par un autre utilisateur), le fournisseur renvoie des avertissements à la collection Errors mais n'arrête pas l'exécution du programme. Une erreur d'exécution intervient uniquement en cas de conflit sur tous les enregistrements demandés. Utilisez la propriété Filter (adFilterAffectedRecords) et la propriété Status pour localiser les enregistrements concernés par des conflits.

Voir aussi

Exemple Visual Basic | Exemple Visual C++

Cancel, méthode | Cancel, méthode (RDS) | CancelUpdate, méthode | CancelUpdate, méthode (RDS) | Clear, méthode | LockType, propriété | UpdateBatch, méthode

S'applique à : Recordset, objet


CancelUpdate, méthode (ADO)

Guide de référence de l'API ADO 2.5

CancelUpdate, méthode

Annule les modifications apportées à la ligne actuelle ou nouvelle d'un objet Recordset, ou à la collection Fields d'un objet Record, avant l'appel de la méthode Update.

Syntaxe

recordset.CancelUpdate
record.Fields.CancelUpdate

Remarques

Recordset

Utilisez la méthode CancelUpdate pour toute modification apportée à la ligne actuelle ou pour abandonner une nouvelle ligne ajoutée. Il est impossible d'annuler les modifications apportées à la ligne actuelle ou à une nouvelle ligne après l'appel de la méthode Update, sauf si les modifications font partie d'une transaction que vous pouvez annuler à l'aide de la méthode RollbackTrans, ou entrent dans le cadre d'une mise à jour par lots. En cas de mise à jour par lots, vous pouvez annuler Update à l'aide de la méthode CancelUpdate ou CancelBatch.

Si vous ajoutez une nouvelle ligne lorsque vous appelez la méthode CancelUpdate, la ligne actuelle devient la ligne qui était active avant l'appel de AddNew.

Si vous êtes en mode d'édition et que vous souhaitez quitter l'enregistrement actuel (par exemple avec Move, NextRecordset ou Close), vous pouvez utiliser CancelUpdate afin d'annuler les modifications en cours. Vous pouvez être amené à procéder ainsi si la mise à jour ne peut pas être correctement publiée vers la source de données (par exemple, une tentative de suppression qui échoue à la suite de violations des règles d'intégrité référentielle entraîne l'abandon de Recordset en mode d'édition après un appel à Delete).

Record

La méthode CancelUpdate annule toutes les insertions ou suppressions en attente des objets Field, et annule les mises à jour en attente de champs existants et rétablit leurs valeurs initiales. La propriété Status de tous les champs de la collection Fields a pour valeur adFieldOK.

Voir aussi

Exemple Visual Basic | Exemple Visual C++ | Exemple Visual J++

AddNew, méthode | Cancel, méthode | Cancel, méthode (RDS) | CancelBatch, méthode | CancelUpdate, méthode (RDS) | EditMode, propriété | Update, méthode

S'applique à : Fields, collection | Recordset, objet


Clear, méthode (ADO)

Guide de référence de l'API ADO 2.5

Clear, méthode

Supprime tous les objets Error de la collection Errors.

Syntaxe

Errors.Clear

Remarques

Utilisez la méthode Clear sur la collection Errors afin de supprimer tous les objets Error existants de la collection. Dès qu'une erreur se produit, ADO effectue cette suppression dans la collection Errors et y entre des objets Error tenant compte de la nouvelle erreur.

Certaines propriétés et méthodes renvoient des avertissements qui s'affichent sous forme d'objets Error dans la collection Errors mais sans arrêter pour autant l'exécution d'un programme. Avant d'appeler les méthodes Resync, UpdateBatch ou CancelBatch sur un objet Recordset, d'appeler la méthode Open sur un objet Connection, ou de définir la propriété Filter sur un objet Recordset, appelez la méthode Clear sur la collection Errors. Ainsi, vous pouvez lire la propriété Count de la collection Errors afin de tester les avertissements renvoyés.

Voir aussi

Exemple Visual Basic | Exemple VBScript | Exemple Visual C++ | Exemple Visual J++

CancelBatch, méthode | Delete, méthode (collection ADO Fields) | Delete, méthode (collection ADO Parameters) | Delete, méthode (objet ADO Recordset) | Filter, propriété | Resync, méthode | UpdateBatch, méthode

S'applique à : Errors, collection


Clone, méthode (ADO)

Guide de référence de l'API ADO 2.5

Clone, méthode

Crée un objet Recordset en double à partir d'un objet Recordset existant. (Facultatif) Indique que le clone doit être en lecture seule.

Syntaxe

Set rstDuplicate = rstOriginal.Clone (LockType)

Valeur renvoyée

Renvoie la référence d'un objet Recordset.

Paramètres

rstDuplicate
Variable objet identifiant le doublon de l'objet Recordset à créer.
rstOriginal
Variable objet identifiant l'objet Recordset à dupliquer.
LockType
Facultatif. Valeur LockTypeEnum qui spécifie le type de verrou du Recordset d'origine ou un Recordset en lecture seule. Les valeurs valides sont adLockUnspecified ou adLockReadOnly.

Remarques

Utilisez la méthode Clone pour créer plusieurs objets Recordset dupliqués, notamment si vous voulez conserver plusieurs enregistrements dans un jeu d'enregistrements particulier. La duplication par la méthode Clone est plus rationnelle que la création et l'ouverture d'un nouvel objet Recordset avec la même définition que l'enregistrement initial.

La propriété Filter du Recordset d'origine, s'il existe, n'est pas appliquée au clone. Définissez la propriété Filter du nouveau Recordset afin de filtrer les résultats. Le moyen le plus simple de copier une valeur Filter existante consiste à l'affecter directement, en procédant comme suit : rsNew.Filter = rsOriginal.Filter

L'enregistrement actuel d'un clone créé est défini sur le premier enregistrement.

Les modifications apportées à un objet Recordset apparaissent dans tous ses clones, indépendamment du type de curseur. Cependant, une fois que vous exécutez Requery sur le Recordset d'origine, les clones ne sont plus synchronisés par rapport au jeu d'enregistrements d'origine.

En fermant l'objet Recordset d'origine, vous ne fermez pas ses copies ; par ailleurs, en fermant une copie, vous ne fermez pas le jeu d'enregistrements initial ni l'une des autres copies.

Vous pouvez seulement dupliquer un objet Recordset qui prend en charge les signets. Les valeurs des signets sont interchangeables ; autrement dit, une référence signet d'un objet Recordset désigne le même enregistrement dans l'un de ses clones.

Le déclenchement de certains événements de Recordset s'applique également aux clones de Recordset. Cependant, dans la mesure où l'enregistrement actif peut différer des objets Recordset clonés, les événements risquent de ne pas être valides pour le clone.

Par exemple, si vous modifiez une valeur d'un champ, un événement WillChangeField se déclenche dans le Recordset modifié ainsi que dans tous les clones. Le paramètre Fields de l'événement WillChangeField d'un Recordset cloné (où la modification n'a pas été effectuée) fait simplement référence aux champs de l'enregistrement actuel du clone, lequel peut être un autre enregistrement que celui du Recordset d'origine où a eu lieu la modification.

Le tableau suivant dresse une liste complète de tous les événements de Recordset. Il indique si ces événements sont valides et s'ils se déclenchent pour tous les clones de jeux d'enregistrements générés via la méthode Clone.

Événement | Déclenchés dans les clones ?
EndOfRecordset | Non
FetchComplete | Non
FetchProgress | Non
FieldChangeComplete | Oui
MoveComplete | Non
RecordChangeComplete | Oui
RecordsetChangeComplete | Non
WillChangeField | Oui
WillChangeRecord | Oui
WillChangeRecordset | Non
WillMove | Non

Voir aussi

Exemple Visual Basic | Exemple VBScript | Exemple Visual C++ | Exemple Visual J++

S'applique à : Recordset, objet


Close, méthode (ADO)

Guide de référence de l'API ADO 2.5

Close, méthode

Ferme un objet ouvert et tous les objets qui en dépendent.

Syntaxe

object.Close

Remarques

Utilisez la méthode Close pour fermer un objet Connection, Record, Recordset ou Stream, afin de libérer toutes ses ressources système. La fermeture d'un objet ne retire pas celui-ci de la mémoire ; vous pouvez modifier ses paramètres de propriété et l'ouvrir à nouveau ultérieurement. Pour éliminer définitivement un objet de la mémoire, affectez à la variable objet la valeur Nothing (en Visual Basic) après avoir fermé l'objet.

Connection

En utilisant la méthode Close pour fermer un objet Connection, vous fermez également tous les objets Recordset actifs associés à la connexion. Un objet Command associé à l'objet Connection que vous fermez persistera, mais ne sera plus associé à un objet Connection ; autrement dit, sa propriété ActiveConnection aura pour valeur Nothing. De même, tous les paramètres définis par le fournisseur seront supprimés dans la collection Parameters de l'objet Command.

Vous pouvez ultérieurement appeler la méthode Open pour rétablir la connexion à l'aide de la même ou d'une autre source de données. Pendant la fermeture de l'objet Connection, l'appel d'une méthode qui exige une connexion ouverte à la source de données génère une erreur.

La fermeture d'un objet Connection alors que des objets Recordset sont ouverts sur la connexion annule toutes les modifications en attente dans tous les objets Recordset. La fermeture explicite d'un objet Connection (appel de la méthode Close) alors qu'une transaction est en cours génère une erreur. Si un objet Connection se situe hors de portée d'une transaction en cours d'exécution, ADO annule automatiquement la transaction.

Recordset, Record, Stream

L'utilisation de la méthode Close pour fermer un objet Recordset, Record ou Stream libère les données associées et tout accès exclusif que vous auriez pu avoir sur les données par l'intermédiaire de cet objet particulier. Vous pouvez ultérieurement appeler la méthode Open pour rouvrir l'objet à l'aide d'attributs identiques ou modifiés.

Pendant qu'un objet Recordset est fermé, l'appel d'une méthode qui exige un curseur actif génère une erreur.

Si des modifications sont en cours en mode de mise à jour immédiate, l'appel d'une méthode Close génère une erreur ; appelez plutôt d'abord la méthode Update ou CancelUpdate. Si vous fermez l'objet Recordset alors que vous êtes en mode de mise à jour par lots, toutes les modifications effectuées depuis le dernier appel de UpdateBatch sont perdues.

Si vous utilisez la méthode Clone pour créer des copies d'un objet Recordset ouvert, la fermeture du jeu d'enregistrement initial ou de son clone n'affecte aucune des autres copies.

Voir aussi

Exemple Visual Basic | Exemple VBScript | Exemple Visual C++ | Exemple Visual J++

Open, méthode (objet ADO Connection) | Open, méthode (objet ADO Recordset) | Save, méthode

S'applique à : Connection, objet | Record, objet | Recordset, objet | Stream, objet


CompareBookmarks, méthode (ADO)

Guide de référence de l'API ADO 2.5

CompareBookmarks, méthode

Compare deux signets et renvoie leurs valeurs relatives.

Syntaxe

result = recordset.CompareBookmarks(Bookmark1, Bookmark2)

Valeur renvoyée

Renvoie une valeur CompareEnum qui indique la position relative d'une ligne de deux enregistrements représentés par leurs signets.

Paramètres

Bookmark1
Signet de la première ligne.
Bookmark2
Signet de la seconde ligne.

Remarques

Les signets doivent s'appliquer au même objet Recordset, ou à un objet Recordset et son clone. Il n'est pas possible de comparer de façon fiable les signets d'objets Recordset différents, même s'ils ont été créés à partir de la même source ou par la même commande. Il n'est pas non plus possible de comparer des signets d'un objet Recordset dont le fournisseur sous-jacent ne prend pas en charge les comparaisons.

Un signet identifie de façon unique une ligne dans un objet Recordset. Utilisez la propriété Bookmark de la ligne active pour obtenir son signet.

Dans la mesure où le type de données d'un signet est spécifique au fournisseur, ADO l'expose en tant que Variant. Par exemple, les signets SQL Server sont de type DBTYPE_R8 (Double). ADO expose ce type en tant que Variant avec le sous-type Double.

Lors de la comparaison des signets, ADO ne tente aucune forme de contrainte. Les valeurs sont simplement transmises au fournisseur où a lieu la comparaison. Si les signets transmis à la méthode CompareBookmarks sont stockés dans des variables qui ne sont pas du même type, une erreur de correspondance entre les types peut être générée : « Les arguments sont de type incorrect, ne se trouvent pas dans la plage acceptable ou sont en conflit ».

Un signet qui n'est pas valide ou qui est incorrectement formé génère une erreur.

Voir aussi

Exemple Visual Basic | Exemple Visual C++ | Exemple Visual J++

Bookmark, propriété

S'applique à : Recordset, objet


CopyRecord, méthode (ADO)

Guide de référence de l'API ADO 2.5

CopyRecord, méthode

Copie une entité représentée par un objet Record vers un autre emplacement.

Syntaxe

Record.CopyRecord (Source, Destination, UserName, Password, Options, Async)

Paramètres

Source
Facultatif. Valeur de type String contenant une URL qui spécifie l'entité à copier (par exemple un fichier ou un répertoire). Si Source est omis ou spécifie une chaîne vide, le fichier ou répertoire représenté par l'objet Record actuel est copié.
Destination
Facultatif. Valeur de type String qui contient une URL spécifiant l'emplacement où Source doit être copié.
UserName
Facultatif. Valeur de type String contenant l'ID d'utilisateur qui, si nécessaire, autorise l'accès à Destination.
Password
Facultatif. Valeur de type String contenant le mot de passe qui, si nécessaire, permet de vérifier UserName.
Options
Facultatif. Valeur CopyRecordOptionsEnum qui comporte la valeur par défaut adCopyUnspecified. Spécifie le comportement de cette méthode.
Async
Facultatif. Valeur de type Boolean qui, lorsqu'elle équivaut à True, spécifie que cette opération doit être asynchrone.

Valeur renvoyée

Valeur de type String qui renvoie généralement la valeur de Destination. Cependant, la valeur exacte renvoyée dépend du fournisseur.

Remarques

Les valeurs de Source et Destination ne doivent pas être identiques ; dans le cas contraire, une erreur d'exécution est générée. Au moins l'un des noms du serveur, du chemin ou de la ressource doit être différent.

Tous les enfants (par exemple les sous-répertoires) de Source sont copiés de façon récursive, sauf si adCopyNonRecursive est spécifié. Dans une opération récursive, Destination ne doit pas être un sous-répertoire de Source ; dans le cas contraire, l'opération ne s'exécute pas.

Cette méthode échoue si Destination identifie une entité existante (par exemple un fichier ou un répertoire), sauf si adCopyOverWrite est spécifié.

Important Utilisez adCopyOverWrite de façon judicieuse. Par exemple, lorsque vous spécifiez cette option lors de la copie d'un fichier dans un répertoire, vous supprimez le répertoire et le remplacez par le fichier.
Remarque Les URL utilisant le modèle http appellent automatiquement le fournisseur Microsoft OLE DB Provider for Internet Publishing. Pour plus d'informations, consultez URL absolues et relatives.

S'applique à : Record, objet


CopyTo, méthode (ADO)

Guide de référence de l'API ADO 2.5

CopyTo, méthode

Copie le nombre spécifié de caractères ou d'octets (en fonction de Type) de l'objet Stream vers un autre objet Stream.

Syntaxe

Stream.CopyTo DestStream, NumChars

Paramètres

DestStream
Valeur de variable objet contenant une référence à un objet Stream ouvert. L'objet Stream actuel est copié vers l'objet Stream de destination spécifié par DestStream. L'objet Stream de destination doit être déjà ouvert. Dans le cas contraire, une erreur d'exécution se produit.
Remarque Le paramètre DestStream ne peut pas être un proxy de l'objet Stream car il exige l'accès à une interface privée sur l'objet Stream, laquelle ne peut pas être transmise à distance au client.
NumChars
Facultatif. Valeur de type Integer qui spécifie le nombre d'octets ou de caractères à copier à partir de la position actuelle dans le Stream source vers le Stream de destination. La valeur par défaut est 1, ce qui indique que tous les caractères ou octets sont copiés à partir de la position actuelle jusqu'à EOS.

Remarques

Cette méthode copie le nombre de caractères ou d'octets spécifié, en commençant par la position actuelle indiquée par la propriété Position. Si le nombre spécifié est supérieur au nombre d'octets disponible jusqu'à EOS, seuls les caractères ou les octets à partir de la position actuelle jusqu'à EOS sont copiés. Si la valeur de NumChars est 1, ou si elle est omise, tous les caractères ou les octets commençant à partir de la position actuelle sont copiés.

Si le flux de destination contient des caractères ou des octets, tout le contenu situé au-delà du point où la copie se termine est conservé, et n'est pas tronqué. Position correspond alors à l'octet qui suit immédiatement le dernier octet copié. Si vous voulez tronquer ces octets, appelez SetEOS.

CopyTo doit permettre de copier des données vers un Stream de destination du même type que le Stream source (leurs paramètres de propriété Type sont tous les deux adTypeText ou adTypeBinary). Pour les objets Stream texte, vous pouvez modifier le paramètre de propriété Charset du Stream de destination pour convertir un jeu de caractères vers un autre. De même, les objets Stream texte peuvent être copiés dans les objets Stream binaires, mais les objets Stream binaires ne peuvent pas être copiés dans les objets Stream texte.

S'applique à : Stream, objet


CreateParameter, méthode (ADO)

Guide de référence de l'API ADO 2.5

CreateParameter, méthode

Crée un objet Parameter avec les propriétés spécifiées.

Syntaxe

Set parameter = command.CreateParameter (Name, Type, Direction, Size, Value)

Valeur renvoyée

Renvoie un objet Parameter.

Paramètres

Nom
Facultatif. Valeur de type String contenant le nom de l'objet Parameter.
Type
Facultatif. Valeur DataTypeEnum précisant le type de données de l'objet Parameter.
Direction
Facultatif. Valeur ParameterDirectionEnum précisant le type de l'objet Parameter.
Size
Facultatif. Valeur de type Long indiquant la longueur maximale de la valeur du paramètre en caractères ou octets.
Value
Facultatif. Variant indiquant la valeur de l'objet Parameter.

Remarques

Utilisez la méthode CreateParameter pour créer un objet Parameter avec un nom, un type, une direction, une taille et une valeur spécifiés. Les valeurs que vous transmettez dans les arguments sont écrites dans les propriétés Parameter correspondantes.

Cette méthode n'ajoute pas automatiquement l'objet Parameter à la collection Parameters d'un objet Command. Vous pouvez ainsi définir des propriétés supplémentaires dont les valeurs ADO seront validées lorsque vous ajouterez l'objet Parameter à la collection.

Si vous spécifiez un type de données de longueur variable dans l'argument Type, vous devez soit transmettre un argument Size, soit définir la propriété Size de l'objet Parameter avant de l'ajouter à la collection Parameters ; sinon, une erreur se produit.

Si vous spécifiez un type de données numérique (adNumeric ou adDecimal) dans l'argument Type, vous devez alors aussi définir les propriétés NumericScale et Precision.

Voir aussi

Exemple Visual Basic | Exemple Visual C++ | Exemple Visual J++

Append, méthode | Parameter, objet | Parameters, collection

S'applique à : Command, objet


Delete, méthode (collection ADO Parameters)

Supprime un objet dans la collection Parameters.

Syntaxe

Parameters.Delete Index

Paramètres

Index
Valeur de type String qui contient le nom de l'objet à supprimer ou sa position ordinale (index) dans la collection.

Remarques

En appliquant la méthode Delete à une collection, vous pouvez supprimer l'un des objets de cette collection. Cette méthode n'est disponible que sur la collection Parameters d'un objet Command. Vous devez utiliser la propriété Name de l'objet Parameter ou son index dans la collection lorsque vous appelez la méthode Delete ; une variable objet n'est pas un argument valide.

Voir aussi

Delete, méthode (collection ADO Fields) | Delete, méthode (objet ADO Recordset) | DeleteRecord, méthode

S'applique à : Parameters, collection


Delete, méthode (collection ADO Fields)

Supprime un objet dans la collection Fields.

Syntaxe

Fields.Delete Field

Paramètres

Field
Variant qui désigne l'objet Field à supprimer. Ce paramètre peut être le nom de l'objet Field ou sa position ordinale.

Remarques

Si vous appelez la méthode Fields.Delete sur un objet Recordset ouvert, une erreur d'exécution se produit.

Voir aussi

Delete, méthode (collection ADO Parameters) | Delete, méthode (objet ADO Recordset) | DeleteRecord, méthode

S'applique à : Fields, collection


Delete, méthode (objet Recordset ADO)

Supprime l'enregistrement actuel ou un groupe d'enregistrements.

Syntaxe

recordset.Delete AffectRecords

Paramètres

AffectRecords
Valeur AffectEnum qui détermine le nombre d'enregistrements auxquels la méthode Delete sera appliquée. La valeur par défaut est adAffectCurrent.
Remarque adAffectAll et adAffectAllChapters ne sont pas des arguments valides pour la méthode Delete.

Remarques

En utilisant la méthode Delete, vous marquez l'enregistrement actuel ou un groupe d'enregistrements d'un objet Recordset en vue de sa suppression. Si l'objet Recordset n'autorise pas la suppression d'enregistrements, une erreur se produit. Si vous êtes en mode de mise à jour immédiate, la suppression s'effectue immédiatement dans la base de données. Si vous ne pouvez pas supprimer un enregistrement (en raison d'une violation de l'intégrité de la base de données par exemple), l'enregistrement reste en mode d'édition après l'appel de la méthode Update. Cela signifie que vous devez annuler la mise à jour à l'aide de la méthode CancelUpdate avant de quitter l'enregistrement actuel (par exemple, avec la méthode Close, Move ou NextRecordset).

En mode de mise à jour par lots, les enregistrements sont marqués en vue de leur suppression du cache et la suppression s'effectue lorsque vous appelez la méthode UpdateBatch. (Utilisez la propriété Filtrer pour afficher les enregistrements supprimés.)

L'extraction des valeurs des champs de l'enregistrement supprimé génère une erreur. Suite à sa suppression, l'enregistrement demeure en cours jusqu'à ce que vous sélectionniez un autre enregistrement. Par conséquent, dès lors que vous quittez un enregistrement supprimé, celui-ci n'est plus accessible.

Si vous imbriquez des suppressions dans une transaction, vous pouvez restaurer les enregistrements supprimés à l'aide de la méthode RollbackTrans. Si vous êtes en mode de mise à jour par lots, vous pouvez annuler une suppression ou un groupe de suppressions en attente à l'aide de la méthode CancelBatch.

En cas d'échec de la tentative de suppression d'enregistrements, provoquée par un conflit avec les données sous-jacentes (par exemple, un enregistrement ayant déjà été supprimé par un autre utilisateur), le fournisseur renvoie des avertissements à la collection Errors mais n'arrête pas l'exécution du programme. Une erreur d'exécution intervient uniquement en cas de conflit sur tous les enregistrements demandés.

Si la propriété dynamique Unique Table est définie et si le Recordset résulte d'une opération JOINDRE sur plusieurs tables, la méthode Delete n'annule que les lignes de la table mentionnée dans la propriété Unique Table.

Voir aussi

Exemple Visual Basic | Exemple VBScript | Exemple Visual C++ | Exemple Visual J++

Delete, méthode (Fields, collection ADO) | Delete, méthode (Parameters, collection ADO) | DeleteRecord, méthode

S'applique à : Recordset, objet


DeleteRecord, méthode (ADO)

Guide de référence de l'API ADO 2.5

DeleteRecord, méthode

Supprime une entité représentée par un objet Record.

Syntaxe

Record.DeleteRecord Source, Async

Paramètres

Source
Facultatif. Valeur de type String contenant une URL qui identifie l'entité (par exemple le fichier ou répertoire) à supprimer. Si Source est omis ou spécifie une chaîne vide, l'entité représentée par l'objet Record actuel est supprimée. Si l'objet Record est un enregistrement de collection (RecordType de adCollectionRecord, par exemple un répertoire) tous les enfants (par exemple les sous-répertoires) sont également supprimés.
Async
Facultatif. Valeur de type Boolean qui, lorsqu'elle équivaut à True, spécifie que l'opération de suppression doit être asynchrone.

Remarques

Les opérations appliquées à l'objet représenté par cet objet Record peuvent échouer après l'exécution de cette méthode. Après l'appel à la méthode DeleteRecord, l'objet Record doit être fermé car son comportement risque de devenir imprévisible en fonction du moment où le fournisseur effectue la mise à jour de Record avec la source de données.

Si l'objet Record provient d'un objet Recordset, ce dernier ne reflète pas immédiatement les résultats de l'opération de suppression. Vous devez actualiser l'objet Recordset, soit en le fermant et en l'ouvrant à nouveau, soit en lui appliquant la méthode Requery ou les méthodes Update et Resync.

Remarque Les URL utilisant le modèle http appellent automatiquement le fournisseur Microsoft OLE DB Provider for Internet Publishing. Pour plus d'informations, consultez URL absolues et relatives.

Voir aussi

Delete, méthode (collection ADO Fields) | Delete, méthode (collection ADO Parameters) | Delete, méthode (objet ADO Recordset)

S'applique à : Record, objet


Execute, méthode (objet ADO Command)

Exécute la requête, l'instruction SQL ou la procédure stockée spécifiée dans la propriété CommandText.

Syntaxe

Pour un objet Command qui renvoie Recordset :

Set recordset = command.Execute( RecordsAffected, Parameters, Options )

Pour un objet Command qui ne renvoie pas de jeu d'enregistrements :

command.Execute RecordsAffected, Parameters, Options

Valeur renvoyée

Renvoie la référence d'un objet Recordset ou Nothing.

Paramètres

RecordsAffected
Facultatif. Variable de type Long à laquelle le fournisseur renvoie le nombre d'enregistrements affectés par l'opération. Le paramètre RecordsAffected ne s'applique qu'aux requêtes Action ou aux procédures stockées. RecordsAffected ne renvoie pas le nombre d'enregistrements renvoyés par une requête basée sur un résultat ou une procédure stockée. Pour obtenir ces informations, utilisez la propriété RecordCount. La méthode Execute ne renvoie pas les informations appropriées lorsqu'elle est utilisée avec adAsyncExecute car lorsqu'une commande est exécutée de manière asynchrone, le nombre d'enregistrements affectés n'est peut-être pas encore connu au moment où la méthode renvoie les informations.
Paramètres
Facultatif. Tableau de type Variant comportant des valeurs de paramètres passées avec une instruction SQL. (Les paramètres de sortie ne renvoient pas de valeurs correctes s'ils sont transmis dans cet argument.)
Options
Facultatif. Valeur de type Long qui indique de quelle manière le fournisseur doit évaluer la propriété CommandText de l'objet Command. Il peut s'agir d'une valeur de masque de bits créée à l'aide des valeurs CommandTypeEnum et/ou ExecuteOptionEnum. Par exemple, vous pouvez combiner l'utilisation simultanée de adCmdText et adExecuteNoRecords pour que ADO évalue la valeur de la propriété CommandText sous forme textuelle, ainsi que pour indiquer que la commande doit ignorer tous les enregistrements susceptibles d'être générés lorsque le texte de commande s'exécute.

Remarques

Lorsque vous utilisez la méthode Execute sur un objet Command, vous exécutez la requête spécifiée dans la propriété CommandText de cet objet. Si la propriété CommandText spécifie une requête qui renvoie des lignes, tous les résultats générés par l'exécution sont stockés dans un nouvel objet Recordset. Si la commande ne renvoie pas de lignes, le fournisseur renvoie un objet Recordset fermé. Certains langages d'application vous permettent d'ignorer cette valeur si vous ne désirez aucun Recordset.

Si la requête contient des paramètres, les valeurs en cours des paramètres de l'objet Command sont utilisées, sauf si vous envoyez d'autres valeurs avec l'appel de la méthode Execute. Vous pouvez remplacer un sous-ensemble seulement de ces paramètres lorsque vous appelez la méthode Execute : il suffit de ne pas spécifier de nouvelle valeur pour certains paramètres. La méthode transmet les paramètres dans l'ordre où vous les spécifiez. Ainsi, si les paramètres sont plus de quatre et si vous voulez passer de nouvelles valeurs pour le premier et le quatrième, votre argument Parameters sera de la forme Array(var1,,,var4).

Remarque Les paramètres de sortie ne renvoient pas des valeurs correctes s'ils sont transmis dans l'argument Parameters.

Un événement ExecuteComplete est émis lorsque l'opération est terminée.

Voir aussi

Exemple Visual Basic | Exemple VBScript | Exemple Visual C++ | Exemple Visual J++ | CommandText, propriété | CommandTypeEnum | Execute, méthode (objet ADO Connection) | ExecuteComplete, événement

S'applique à : Command, objet

© 1998-2002 Microsoft Corporation. Tous droits réservés.


Execute, méthode (objet ADO Connection)

Exécute le texte de commande spécifié : requête, instruction SQL, procédure stockée ou texte propre au fournisseur.

Syntaxe

Pour une chaîne de commande qui ne renvoie pas de lignes :

connection.Execute CommandText, RecordsAffected, Options

Pour une chaîne de commande qui renvoie des lignes :

Set recordset = connection.Execute (CommandText, RecordsAffected, Options)

Valeur renvoyée

Renvoie la référence d'un objet Recordset.

Paramètres

CommandText
Valeur de type String qui contient l'instruction SQL, la procédure stockée, une URL ou un texte propre au fournisseur à exécuter. Il est éventuellement possible d'utiliser des noms de table, mais uniquement si le fournisseur gère le langage SQL. Par exemple, si le nom de table « Customers » est utilisé, ADO ajoute automatiquement la syntaxe SQL Select standard pour former l'instruction T-SQL « SELECT * FROM Customers » et la transmettre au fournisseur.
RecordsAffected
Facultatif. Variable de type Long vers laquelle le fournisseur renvoie le nombre d'enregistrements affectés par l'opération.
Options
Facultatif. Valeur de type Long qui indique comment le fournisseur doit évaluer l'argument CommandText. Il peut s'agir d'un masque de bits ou d'une voire plusieurs valeurs CommandTypeEnum ou ExecuteOptionEnum.
Remarque Utilisez la valeur ExecuteOptionEnum adExecuteNoRecords pour améliorer les performances en réduisant le traitement interne.
N'utilisez pas les valeurs CommandTypeEnum de adCmdFile ou adCmdTableDirect avec Execute. Ces valeurs ne peuvent être utilisées que sous forme d'options avec les méthodes Open et Requery de Recordset.

Remarques

L'utilisation de la méthode Execute sur un objet Connection permet d'exécuter n'importe quelle requête transmise à la méthode dans l'argument CommandText sur la connexion spécifiée. Si l'argument CommandText spécifie une requête renvoyant des lignes, les résultats générés par l'exécution sont stockés dans un nouvel objet Recordset. Si la commande n'est pas censée renvoyer de résultats (par exemple, une requête SQL UPDATE) le fournisseur renvoie Nothing du moment que l'option adExecuteNoRecords est spécifiée ; dans le cas contraire, Execute renvoie un objet Recordset fermé.

L'objet Recordset renvoyé est toujours un curseur à défilement en avant seulement et en lecture seule. Si vous avez besoin d'un objet Recordset présentant davantage de fonctionnalités, commencez par créer un objet Recordset avec les propriétés voulues, puis utilisez la méthode Open de cet objet pour exécuter la requête et renvoyer le type de curseur désiré.

Le contenu de l'argument CommandText est spécifique au fournisseur ; il peut s'agir d'une syntaxe SQL standard ou de tout format de commande spécial pris en charge par le fournisseur.

Un événement ExecuteComplete est émis lorsque l'opération est terminée.

Remarque Les URL utilisant le modèle http appellent automatiquement le fournisseur Microsoft OLE DB Provider for Internet Publishing. Pour plus d'informations, consultez URL absolues et relatives.

Voir aussi

Exemple Visual Basic | Exemple Visual C++ | Exemple Visual J++

Execute, méthode (objet ADO Command) | ExecuteComplete, événement

S'applique à : Connection, objet

© 1998-2002 Microsoft Corporation. Tous droits réservés.


Find, méthode (ADO)

Guide de référence de l'API ADO 2.5

Find, méthode

Recherche dans un objet Recordset la ligne qui remplit les critères spécifiés. Vous pouvez éventuellement préciser le sens de la recherche, la ligne de départ ou un décalage par rapport à la ligne de départ. Si le critère est rempli, la position de la ligne actuelle devient l'enregistrement trouvé ; dans le cas contraire, la ligne actuelle est positionnée à la fin (ou au début) de l'objet Recordset.

Syntaxe

Find (Criteria, SkipRows, SearchDirection, Start)

Paramètres

Criteria
Valeur de type String contenant une instruction qui spécifie le nom de la colonne, l'opérateur de comparaison et la valeur à utiliser dans la recherche.
SkipRows
Facultatif. Valeur de type Long dont la valeur par défaut est zéro et qui spécifie le point de départ de la recherche sous la forme d'un décalage en lignes par rapport à la ligne actuelle ou d'un signet Start. Par défaut, la recherche commence sur la ligne actuelle.
SearchDirection
Facultatif. Valeur SearchDirectionEnum qui spécifie si la recherche doit commencer sur la ligne actuelle ou sur la ligne disponible suivante dans le sens de la recherche. Si ce paramètre a pour valeur adSearchForward, une recherche qui n'aboutit pas s'arrête à la fin de l'objet Recordset. Si ce paramètre a pour valeur adSearchBackward, une recherche qui n'aboutit pas s'arrête au début de l'objet Recordset.
Start
Facultatif. Signet de type Variant qui indique le point de départ de la recherche.

Remarques

Le paramètre Criteria ne peut mentionner qu'un seul nom de colonne. Cette méthode ne prend pas en charge les recherches dans plusieurs colonnes.

L'opérateur de comparaison dans Criteria peut être « > » (supérieur à), « < » (inférieur à), « = » (égal à), « >= » (supérieur ou égal à), « <= » (inférieur ou égal à), « <> » (différent de) ou « like » (critères spéciaux).

La valeur spécifiée dans Criteria peut être une chaîne, un nombre à virgule flottante ou une date. Les valeurs de type chaîne sont délimitées par des guillemets simples ou le symbole « # » (dièse), par exemple : « state = 'WA' » ou « state = #WA# ». Les dates sont délimitées par le symbole « # », par exemple : « start_date > #22/7/97# ». En outre, elles peuvent contenir des heures, des minutes et des secondes pour indiquer des informations de date, mais pas de millisecondes ; dans le cas contraire, des erreurs se produisent.

Si l'opérateur de comparaison est « like », la chaîne indiquant la valeur de comparaison peut contenir un astérisque (*) pour rechercher une ou plusieurs occurrences d'un caractère ou d'une sous-chaîne. Par exemple, le critère « state like 'M*' » est rempli par les États du Maine et du Massachusetts. Vous pouvez également utiliser des astérisques en début et en fin de chaîne pour rechercher des valeurs qui contiennent une sous-chaîne. Par exemple, le critère « state like '*as*' » est rempli par les états de l'Alaska, de l'Arkansas et du Massachusetts.

Vous pouvez placer un astérisque à la fin seulement ou au début et à la fin d'une chaîne de critère, comme dans les exemples précédents. Vous ne pouvez pas placer un seul astérisque au début ('*str') ou à l'intérieur ('s*r') de la chaîne. Cela provoquerait une erreur.

Remarque Une erreur se produit si la position de la ligne actuelle n'est pas définie avant l'appel de la méthode Find. Vous devez appeler une méthode qui définit une position de ligne, par exemple MoveFirst, avant d'appeler la méthode Find.
Remarque Si vous appelez la méthode Find sur un jeu d'enregistrements, et si la position actuelle dans le jeu d'enregistrements correspond au dernier enregistrement ou à la fin du fichier (EOF), vous ne trouverez rien. Vous devez appeler la méthode MoveFirst pour définir la position actuelle ou le curseur actif au début du jeu d'enregistrements.

Voir aussi

Exemple Visual Basic

Index, propriété | Optimize, propriété dynamique (ADO) | Seek, méthode

S'applique à : Recordset, objet


Flush, méthode (ADO)

Guide de référence de l'API ADO 2.5

Flush, méthode

Vide le contenu de l'objet Stream restant dans le tampon ADO vers l'objet sous-jacent auquel Stream est associé.

Syntaxe

Stream.Flush

Remarques

Vous pouvez utiliser cette méthode pour envoyer le contenu du tampon de flux vers l'objet sous-jacent (par exemple, le nœud ou fichier représenté par l'URL qui est la source de l'objet Stream). Vous devez appeler cette méthode pour vous assurer que toutes les modifications apportées au contenu d'un objet Stream ont été écrites dans l'objet associé. Toutefois, il n'est généralement pas nécessaire d'appeler la méthode Flush avec ADO dans la mesure où ADO vide continuellement et le plus possible son tampon en arrière-plan. Les modifications apportées au contenu d'un objet Stream sont appliquées automatiquement et non pas mises en mémoire cache jusqu'à l'appel de la méthode Flush.

Lorsqu'un objet Stream est fermé à l'aide de la méthode Close, son contenu est vidé automatiquement ; il n'est pas nécessaire d'appeler explicitement Flush juste avant la méthode Close.

S'applique à : Stream, objet


GetChildren, méthode (ADO)

Guide de référence de l'API ADO 2.5

GetChildren, méthode

Renvoie un objet Recordset dont les lignes représentent les enfants de l'objet Record d'une collection.

Syntaxe

Set recordset = record.GetChildren

Valeur renvoyée

Objet Recordset pour lequel chaque ligne représente un enfant de l'objet Record actuel. Par exemple, les enfants d'un objet Record représentant un répertoire sont les fichiers et sous-répertoires contenus dans le répertoire parent.

Remarques

Le fournisseur détermine les colonnes présentes dans l'objet Recordset renvoyé. Par exemple, un fournisseur de source de document renvoie toujours un Recordset de ressource.

Voir aussi

Exemple | Exemple

S'applique à : Record, objet | Recordset, objet


GetChunk, méthode (ADO)

Guide de référence de l'API ADO 2.5

GetChunk, méthode

Renvoie tout ou partie d'un objet Field texte volumineux ou binaire.

Syntaxe

variable = field.GetChunk( Size )

Valeur renvoyée

Renvoie un Variant.

Paramètres

Size
Expression de type Long qui est égale au nombre d'octets ou de caractères que vous souhaitez extraire.

Remarques

Utilisez la méthode GetChunk sur un objet Field pour extraire une partie ou la totalité des caractères ou des données binaires qu'il contient. Si votre mémoire système est limitée, la méthode GetChunk vous permet de manipuler des valeurs de type Long par morceaux et non en totalité.

Les données renvoyées par un appel de GetChunk sont affectées à variable. Si Size est supérieur aux données restantes, la méthode GetChunk renvoie uniquement ces données, sans compléter variable par des espaces vides. Si le champ est vide, la méthode GetChunk renvoie une valeur Null.

Chaque appel de la méthode GetChunk extrait les données à partir de l'endroit où la méthode GetChunk précédente s'est arrêtée. Toutefois, si vous êtes en train d'extraire les données d'un champ et que vous vous mettez à définir ou lire la valeur d'un autre champ de l'enregistrement actuel, ADO suppose que vous avez terminé l'extraction du premier champ. Si vous appelez à nouveau la méthode GetChunk sur le premier champ, ADO interprète cet appel comme une nouvelle opération GetChunk et recommence à lire les données depuis le début. Les opérations GetChunk ne sont pas interrompues par l'accès aux champs d'autres objets Recordset qui ne sont pas des clones du premier objet Recordset.

Si adFldLong de la propriété Attributes d'un objet Field a la valeur True, vous pouvez appliquer la méthode GetChunk à ce champ.

S'il n'y a pas d'enregistrement actif lorsque vous utilisez la méthode GetChunk sur un objet Field, l'erreur 3021 (aucun enregistrement actif) se produit.

Remarque La méthode GetChunk n'opère pas sur les objets Field d'un objet Record. Elle n'exécute aucune opération et génère une erreur d'exécution.

Voir aussi

Exemple Visual Basic | Exemple Visual C++ | Exemple Visual J++

AppendChunk, méthode | Attributes, propriété

S'applique à : Field, objet


GetRows, méthode (ADO)

Guide de référence de l'API ADO 2.5

GetRows, méthode

Extrait plusieurs enregistrements d'un objet Recordset et les place dans un tableau.

Syntaxe

array = recordset.GetRows( Rows, Start, Fields )

Valeur renvoyée

Renvoie un Variant dont la valeur est un tableau à deux dimensions.

Paramètres

Rows
Facultatif. Valeur GetRowsOptionEnum qui indique le nombre d'enregistrements à extraire. La valeur par défaut est adGetRowsRest.
Start
Facultatif. Valeur de type String ou Variant qui représente le signet de l'enregistrement à partir duquel l'opération GetRows doit commencer. Vous pouvez également utiliser une valeur BookmarkEnum.
Fields
Facultatif. Variant qui représente un nom ou un numéro d'ordre de champ unique, ou encore un tableau de noms ou de numéros d'ordre de champs. ADO renvoie uniquement les données contenues dans ces champs.

Remarques

Utilisez la méthode GetRows pour copier des enregistrements depuis un objet Recordset dans un tableau à deux dimensions. Le premier indice identifie le champ et le second, le numéro d'enregistrement. La variable array est dimensionnée automatiquement lorsque la méthode GetRows renvoie les données.

Si vous ne spécifiez pas l'argument Rows, la méthode GetRows extrait automatiquement tous les enregistrements de l'objet Recordset. Si vous demandez plus d'enregistrements qu'il n'en existe dans le jeu d'enregistrements, GetRows renvoie uniquement les enregistrements disponibles.

Si l'objet Recordset prend en charge les signets, vous pouvez spécifier l'enregistrement à partir duquel la méthode GetRows doit commencer à extraire les données en passant dans l'argument Start la valeur de la propriété Bookmark de cet enregistrement.

Si vous souhaitez restreindre le nombre de champs renvoyés par la méthode GetRows, vous pouvez passer dans l'argument Fields un nom/numéro de champ unique ou un tableau de noms/numéros de champs.

Une fois que vous avez appelé la méthode GetRows, l'enregistrement non lu suivant devient l'enregistrement actuel ; s'il ne reste aucun enregistrement, la propriété EOF prend la valeur True.

Voir aussi

Exemple Visual Basic | Exemple Visual C++ | Exemple Visual J++

S'applique à : Recordset, objet


GetString, méthode (ADO)

Guide de référence de l'API ADO 2.5

GetString, méthode

Renvoie l'objet Recordset sous forme de chaîne.

Syntaxe

Variant = recordset.GetString(StringFormat, NumRows, ColumnDelimiter, RowDelimiter, NullExpr)

Valeur renvoyée

Renvoie Recordset sous la forme d'un Variant à valeur de chaîne (BSTR).

Paramètres

StringFormat
Valeur StringFormatEnum qui spécifie de quelle manière l'objet Recordset doit être converti en chaîne. Les paramètres RowDelimiter, ColumnDelimiter et NullExpr ne sont utilisés que si StringFormat est égal à adClipString.
NumRows
Facultatif. Nombre de lignes à convertir dans l'objet Recordset. Si NumRows n'est pas spécifié ou s'il est supérieur au nombre total de lignes de l'objet Recordset, toutes les lignes de ce dernier sont converties.
ColumnDelimiter
Facultatif. Délimiteur utilisé entre les colonnes ; si ce paramètre est omis, le délimiteur est le caractère TAB.
RowDelimiter
Facultatif. Délimiteur utilisé entre les lignes ; si ce paramètre est omis, le délimiteur est le caractère RETOUR CHARIOT.
NullExpr
Facultatif. Expression utilisée à la place d'une valeur Null ; si ce paramètre est omis, la valeur Null est représentée par une chaîne vide.

Remarques

La chaîne renvoyée contient uniquement les données contenues dans les lignes, pas les données du schéma. Par conséquent, elle ne permet pas d'ouvrir à nouveau l'objet Recordset.

Cette méthode est équivalente à la méthode RDO GetClipString.

Voir aussi

Exemple Visual Basic

S'applique à : Recordset, objet


LoadFromFile, méthode (ADO)

Guide de référence de l'API ADO 2.5

LoadFromFile, méthode

Charge le contenu d'un fichier existant dans un objet Stream.

Syntaxe

Stream.LoadFromFile FileName

Paramètre

NomFichier
Valeur de type String qui contient le nom d'un fichier à charger dans Stream. FileName peut contenir tous les chemins d'accès et noms de fichiers valides au format UNC. Si le fichier spécifié n'existe pas, une erreur d'exécution se produit.

Remarques

Cette méthode peut être utilisée pour charger le contenu d'un fichier local dans un objet Stream. Elle permet ainsi de transférer le contenu d'un fichier local sur un serveur.

L'objet Stream doit être déjà ouvert avant l'appel de LoadFromFile. Cette méthode ne modifie pas la liaison de l'objet Stream ; ce dernier est toujours lié à l'objet spécifié par l'URL ou à l'objet Record avec lequel l'objet Stream a été ouvert à l'origine.

LoadFromFile remplace le contenu actif de l'objet Stream par les données lues à partir du fichier. Les octets existants de l'objet Stream sont remplacés par le contenu du fichier. Tous les octets qui restent après la nouvelle position EOS créée par LoadFromFile sont tronqués.

Après un appel à LoadFromFile, la position actuelle correspond au début de l'objet Stream (Position a la valeur 0).

Dans la mesure où 2 octets peuvent être ajoutés au début du flux pour le codage, la taille du flux risque de ne pas correspondre exactement à la taille du fichier à partir duquel il a été chargé.

S'applique à : Stream, objet


Move, méthode (ADO)

Guide de référence de l'API ADO 2.5

Move, méthode

Déplace la position de l'enregistrement actuel dans un objet Recordset.

Syntaxe

recordset.Move NumRecords, Start

Paramètres

NumRecords
Expression de type Long signée qui spécifie, en nombre d'enregistrements, la longueur du déplacement de l'enregistrement actuel.
Start
Facultatif. Valeur de type String ou Variant qui prend la valeur d'un signet. Vous pouvez également utiliser une valeur BookmarkEnum.

Remarques

La méthode Move est prise en charge sur tous les objets Recordset.

Si l'argument NumRecords est supérieur à zéro, la position de l'enregistrement actuel se déplace vers l'avant (vers la fin de l'objet Recordset). Si NumRecords est inférieur à zéro, la position de l'enregistrement actuel se déplace vers l'arrière (vers le début de l'objet Recordset).

Si l'appel de Move envoie l'enregistrement actuel à un emplacement antérieur au premier enregistrement, ADO définit la position de l'enregistrement actuel juste avant le premier enregistrement du jeu d'enregistrements (BOF a pour valeur True). Toute tentative de déplacement en arrière lorsque la propriété BOF a déjà la valeur True génère une erreur.

Si l'appel de Move envoie l'enregistrement actuel à un emplacement postérieur au dernier enregistrement, ADO définit la position de l'enregistrement actuel après le dernier enregistrement du jeu d'enregistrements (EOF a pour valeur True). Toute tentative de déplacement en avant lorsque la propriété EOF a déjà la valeur True génère une erreur.

Une erreur est également générée si vous appelez Move à partir d'un objet Recordset vide.

Si vous spécifiez l'argument Start, le déplacement est effectué à partir de l'enregistrement associé à ce signet, en supposant que l'objet Recordset prend en charge les signets. Si vous ne spécifiez pas cet argument, le déplacement est effectué à partir de l'enregistrement actuel.

Si vous utilisez la propriété CacheSize pour placer dans la mémoire cache locale des enregistrements provenant du fournisseur, le fait de passer un argument NumRecords qui place la position de l'enregistrement actif en dehors du groupe d'enregistrements actuellement en mémoire cache oblige ADO à extraire un nouveau groupe d'enregistrements à partir de l'enregistrement de destination. La propriété CacheSize détermine la taille du nouveau groupe à extraire : par ailleurs, l'enregistrement de destination est le premier extrait.

Si l'objet Recordset est à défilement en avant seulement, un utilisateur peut néanmoins passer un argument NumRecords inférieur à zéro, pourvu que l'enregistrement de destination fasse partie de ceux actuellement en mémoire cache. Si la méthode Move définit la position de l'enregistrement actuel à un enregistrement situé avant le premier enregistrement en mémoire cache, une erreur se produit. Vous pouvez donc utiliser un cache d'enregistrements qui prend en charge le défilement intégral sur un fournisseur qui ne gère que le défilement vers l'avant. Dans la mesure où les enregistrements en cache sont chargés en mémoire, il vaut mieux éviter de mettre en mémoire cache un nombre excessif d'enregistrements. Même si un objet Recordset à défilement en avant seulement prend en charge les déplacements en arrière avec cette méthode, un appel à la méthode MovePrevious sur un objet Recordset à défilement en avant seulement génère une erreur.

Remarque La prise en charge du déplacement vers l'arrière dans un Recordset à défilement en avant seulement est imprévisible ; le résultat dépend de votre fournisseur. Si l'enregistrement actif est placé après le dernier enregistrement de Recordset, l'exécution de Move vers l'arrière risque de ne pas correspondre au positionnement actuel approprié.

Voir aussi

Exemple Visual Basic | Exemple VBScript | Exemple Visual C++ | Exemple Visual J++

MoveFirst, MoveLast, MoveNext et MovePrevious, méthodes | MoveFirst, MoveLast, MoveNext et MovePrevious, méthodes (RDS) | MoveRecord, méthode

S'applique à : Recordset, objet


MoveFirst, MoveLast, MoveNext et MovePrevious, méthodes (ADO)

Guide de référence de l'API ADO 2.5

MoveFirst, MoveLast, MoveNext et MovePrevious, méthodes

Opèrent un déplacement jusqu'au premier, dernier, prochain ou précédent enregistrement dans un objet Recordset spécifié et définissent l'emplacement de destination comme enregistrement actuel.

Syntaxe

recordset.{MoveFirst | MoveLast | MoveNext | MovePrevious}

Remarques

La méthode MoveFirst permet de repositionner l'enregistrement actuel sur le premier enregistrement de Recordset.

La méthode MoveLast permet de repositionner l'enregistrement actuel sur le dernier enregistrement de l'objet Recordset. L'objet Recordset doit prendre en charge les signets ou les mouvements en arrière du curseur, faute de quoi l'appel de cette méthode génère une erreur.

L'appel de MoveFirst ou MoveLast lorsque l'objet Recordset est vide (BOF et EOF ont la valeur True) génère une erreur.

La méthode MoveNext permet d'avancer la position de l'enregistrement actuel d'un enregistrement (vers la fin de l'objet Recordset). Si l'enregistrement actuel est le dernier de l'objet Recordset lorsque vous appelez la méthode MoveNext, ADO définit la position de l'enregistrement actuel juste après ce dernier enregistrement (la propriété EOF a la valeur True). Toute tentative de déplacement en avant lorsque la propriété EOF a déjà la valeur True génère une erreur.

Si l'objet Recordset a été filtré ou trié et que les données de l'enregistrement actuel ont changé, la position de ce dernier peut également changer. Dans ce cas, la méthode MoveNext fonctionne normalement, mais elle avance la position de l'enregistrement actuel d'un enregistrement par rapport à la nouvelle position (et non l'ancienne). Par exemple, si vous modifiez les données de l'enregistrement actuel de telle sorte que ce dernier est envoyé à la fin de l'objet Recordset trié, l'appel de la méthode MoveNext positionne l'enregistrement actuel après le dernier enregistrement de l'objet Recordset (EOF = True).

La méthode MovePrevious permet de reculer la position de l'enregistrement actuel d'un enregistrement (vers le début de l'objet Recordset). L'objet Recordset doit prendre en charge les signets ou les mouvements en arrière du curseur, faute de quoi l'appel de cette méthode génère une erreur. Si l'enregistrement actuel est le premier de l'objet Recordset lorsque vous appelez la méthode MovePrevious, ADO définit la position de l'enregistrement actuel juste avant ce premier enregistrement (la propriété BOF a la valeur True). Toute tentative de déplacement en arrière lorsque la propriété BOF a déjà la valeur True génère une erreur. Si l'objet Recordset ne prend en charge ni les signets, ni les mouvements en arrière du curseur, la méthode MovePrevious génère une erreur.

Si l'objet Recordset est à défilement en avant seulement et que vous vouliez prendre en charge le défilement en avant et en arrière, vous pouvez utiliser la propriété CacheSize pour créer un cache d'enregistrements où les déplacements du curseur vers l'arrière seront possibles via la méthode Move. Dans la mesure où les enregistrements en cache sont chargés en mémoire, il vaut mieux éviter de mettre en mémoire cache un nombre excessif d'enregistrements. Vous pouvez appeler la méthode MoveFirst dans un objet Recordset à défilement en avant seulement, mais cela risque d'obliger le fournisseur à réexécuter la commande qui a généré l'objet Recordset.

Voir aussi

Exemple Visual Basic | Exemple VBScript | Exemple Visual C++ | Exemple Visual J++

Move, méthode | MoveFirst, MoveLast, MoveNext et MovePrevious, méthodes (RDS) | MoveRecord, méthode

S'applique à : Recordset, objet


MoveRecord, méthode (ADO)

Guide de référence de l'API ADO 2.5

MoveRecord, méthode

Déplace l'entité représentée par un objet Record vers un autre emplacement.

Syntaxe

Record.MoveRecord (Source, Destination, UserName, Password, Options, Async)

Paramètres

Source
Facultatif. Valeur de type String qui contient une URL identifiant l'objet Record à déplacer. Si Source est omis ou spécifie une chaîne vide, l'objet représenté par Record est déplacé. Par exemple, si l'objet Record représente un fichier, le contenu de ce dernier est déplacé vers l'emplacement spécifié par Destination.
Destination
Facultatif. Valeur de type String qui contient une URL spécifiant l'emplacement vers lequel Source doit être déplacé.
UserName
Facultatif. Valeur de type String contenant l'ID d'utilisateur qui, si nécessaire, autorise l'accès à Destination.
Password
Facultatif. Valeur de type String contenant le mot de passe qui, si nécessaire, permet de vérifier UserName.
Options
Facultatif. Valeur MoveRecordOptionsEnum qui équivaut par défaut à adMoveUnspecified. Spécifie le comportement de la méthode.
Async
Facultatif. Valeur de type Boolean qui, lorsqu'elle équivaut à True, spécifie que cette opération doit être asynchrone.

Valeur renvoyée

Valeur de type String. En règle générale, il s'agit de la valeur de Destination. Toutefois, la valeur exacte renvoyée dépend du fournisseur.

Remarques

Les valeurs de Source et Destination ne doivent pas être identiques ; dans le cas contraire, une erreur d'exécution est générée. Au minimum, les noms du serveur, du chemin ou de la ressource doivent être différents.

Pour les fichiers déplacés à l'aide du fournisseur Internet Publishing, cette méthode met à jour tous les liens hypertexte dans les fichiers déplacés, sauf indication contraire du paramètre Options. Elle échoue si Destination identifie un objet existant (par exemple un fichier ou répertoire), sauf si adMoveOverWrite est spécifié.

Remarque Utilisez adMoveOverWrite de façon judicieuse. Par exemple, lorsque vous spécifiez cette option lors du déplacement d'un fichier dans un répertoire, vous supprimez le répertoire et le remplacez par le fichier.

Certains attributs de l'objet Record, notamment la propriété ParentURL, ne sont pas mis à jour après l'exécution de cette opération. Actualisez les propriétés de l'objet Record en fermant cet objet et en l'ouvrant à nouveau avec l'URL de l'emplacement où le fichier ou le répertoire a été déplacé.

Si l'objet Record en question est extrait d'un objet Recordset, le nouvel emplacement du fichier ou du répertoire n'est pas immédiatement répercuté dans Recordset. Fermez, puis ouvrez à nouveau l'objet Recordset pour l'actualiser.

Remarque Les URL utilisant le modèle http appellent automatiquement le fournisseur Microsoft OLE DB Provider for Internet Publishing. Pour plus d'informations, consultez URL absolues et relatives.

Voir aussi

Move, méthode | MoveFirst, MoveLast, MoveNext et MovePrevious, méthodes | MoveFirst, MoveLast, MoveNext et MovePrevious, méthodes (RDS)

S'applique à : Record, objet


NextRecordset, méthode (ADO)

Guide de référence de l'API ADO 2.5

NextRecordset, méthode

Efface l'objet Recordset en cours et renvoie le suivant en exécutant successivement toute une série de commandes.

Syntaxe

Set recordset2 = recordset1.NextRecordset( RecordsAffected )

Valeur renvoyée

Renvoie un objet Recordset. Dans le modèle de syntaxe, recordset1 et recordset2 peuvent être un seul et même objet Recordset ou deux objets distincts. Lorsque vous utilisez des objets Recordset distincts, le fait de redéfinir la propriété ActiveConnection sur le Recordset d'origine (recordset1) après l'appel de la méthode NextRecordset génère une erreur.

Paramètres

RecordsAffected
Facultatif. Variable de type Long vers laquelle le fournisseur renvoie le nombre d'enregistrements affectés par l'opération en cours.
Remarque Ce paramètre renvoie uniquement le nombre d'enregistrements affectés par une opération ; il ne renvoie pas le nombre d'enregistrements issus d'une instruction select utilisée pour générer l'objet Recordset.

Remarques

Utilisez la méthode NextRecordset pour renvoyer les résultats de la commande suivante dans une instruction de commande composée ou les résultats d'une procédure stockée qui renvoie plusieurs résultats. Si vous ouvrez un objet Recordset basé sur une instruction de commande composée (par exemple, « SELECT * FROM table1;SELECT * FROM table2 ») à l'aide de la méthode Execute appliquée à un objet Command ou à l'aide de la méthode Open appliquée à un objet Recordset, ADO exécute uniquement la première commande et renvoie les résultats vers recordset. Pour accéder aux résultats des commandes suivantes de l'instruction, appelez la méthode NextRecordset.

Tant qu'il reste des résultats à renvoyer et que le Recordset contenant les instructions composées n'est pas déconnecté ou ne fait pas l'objet d'un marshaling à travers les limites de processus, la méthode NextRecordset continue de renvoyer des objets Recordset. Si une commande qui renvoie des lignes s'exécute correctement mais ne renvoie aucun enregistrement, l'objet Recordset renvoyé est ouvert tout en étant vide. Pour vous en assurer, vérifiez que les propriétés BOF et EOF ont pour valeur True. Si une commande qui ne renvoie pas de lignes aboutit, l'objet Recordset renvoyé est fermé, ce que vous pouvez vérifier en interrogeant la propriétéState de Recordset. Lorsqu'il ne reste plus de résultats à renvoyer, recordset prend la valeur Nothing.

La méthode NextRecordset n'est pas disponible sur un objet Recordset déconnecté, où ActiveConnection a la valeur Nothing (en Microsoft Visual Basic) ou NULL (dans d'autres langages).

Si des modifications sont en cours en mode de mise à jour immédiate, l'appel d'une méthode NextRecordset génère une erreur ; appelez d'abord la méthode Update ou CancelUpdate.

Pour que vous puissiez passer dans l'instruction composée des paramètres destinés à plusieurs commandes, en remplissant la collection Parameters ou en transmettant un tableau avec l'appel Open ou Execute d'origine, il faut que les paramètres soient dans le même ordre dans la collection ou le tableau que les commandes correspondantes de la série de commandes de l'instruction. Vous devez terminer la lecture de tous les résultats avant de lire les valeurs des paramètres de sortie.

Votre fournisseur OLE DB détermine le moment où s'exécute chaque commande d'une instruction composée. Par exemple, le fournisseur Microsoft OLE DB Provider for SQL Server exécute toutes les commandes d'un lot lors de la réception d'une instruction composée. Les objets Recordset résultants sont simplement renvoyés lorsque vous appelez NextRecordset.

Cependant, les autres fournisseurs peuvent exécuter la prochaine commande d'une instruction uniquement après l'appel de NextRecordset. Pour ces fournisseurs, si vous fermez explicitement l'objet Recordset avant d'avoir exécuté pas à pas la totalité de l'instruction de commande, ADO n'exécute jamais les commandes restantes.

Voir aussi

Exemple Visual Basic | Exemple Visual C++ | Exemple Visual J++

S'applique à : Recordset, objet


Open, méthode (objet ADO Connection)

Établit une connexion à une source de données.

Syntaxe

connection.Open ConnectionString, UserID, Password, Options

Paramètres

ConnectionString
Facultatif. Valeur de type String qui contient des informations de connexion. Pour plus d'informations sur les paramètres valides, consultez la rubrique relative à la propriété ConnectionString.
UserID
Facultatif. Valeur de type String qui contient le nom d'utilisateur à utiliser pour établir la connexion.
Password
Facultatif. Valeur de type String qui contient le mot de passe à utiliser pour établir la connexion.
Options
Facultatif. Valeur ConnectOptionEnum qui détermine si la méthode doit renvoyer son résultat après l'établissement de la connexion (de manière synchrone) ou avant (de manière asynchrone).

Remarques

Lorsque vous utilisez la méthode Open sur un objet Connection, vous établissez la connexion physique à une source de données. Une fois que cette méthode a abouti, la connexion est active ; vous pouvez émettre des commandes sur cette connexion et traiter les résultats de ces commandes.

Utilisez l'argument facultatif ConnectionString pour spécifier une chaîne de connexion contenant soit une série d'instructions argument = value séparées par des points-virgules, soit une ressource de fichier ou de répertoire identifiée par une URL. La propriété ConnectionString hérite automatiquement de la valeur utilisée pour l'argument ConnectionString. Par conséquent, vous pouvez soit définir la propriété ConnectionString de l'objet Connection avant d'ouvrir ce dernier, soit utiliser l'argument ConnectionString pour définir ou remplacer les paramètres de connexion actuels pendant l'appel de la méthode Open.

Si vous spécifiez l'identification et le mot de passe de l'utilisateur à la fois dans l'argument ConnectionString et dans les arguments facultatifs UserID et Password, les valeurs de UserID et Password prévalent sur celles spécifiées dans ConnectionString.

Lorsque vous avez terminé vos opérations sur un objet Connection ouvert, utilisez la méthode Close pour libérer toutes les ressources système associées à cet objet. La fermeture d'un objet ne le supprime pas en mémoire ; vous pouvez modifier ses propriétés et utiliser la méthode Open pour le rouvrir ultérieurement. Pour éliminer définitivement un objet de la mémoire, affectez à la variable objet la valeur Nothing.

Utilisation de Remote Data Service Lorsqu'elle est utilisée sur un objet Connection côté client, la méthode Open n'établit réellement la connexion au serveur qu'après l'ouverture d'un objet Recordset sur l'objet Connection.
Remarque Les URL utilisant le modèle http appellent automatiquement le fournisseur Microsoft OLE DB Provider for Internet Publishing. Pour plus d'informations, consultez URL absolues et relatives.

Voir aussi

Exemple Visual Basic | Exemple VBScript | Exemple Visual C++ | Exemple Visual J++

Open, méthode (objet ADO Record) | Open, méthode (objet ADO Recordset) | Open, méthode (objet ADO Stream) | OpenSchema, méthode

S'applique à : Connection, objet


Open, méthode (objet ADO Record)

Ouvre un objet Record existant ou crée un élément représenté par l'objet Record ( par exemple un fichier ou un répertoire).

Syntaxe

Open Source, ActiveConnection, Mode, CreateOptions, Options, UserName, Password

Paramètres

Source
Facultatif. Valeur de type Variant qui peut désigner l'URL de l'entité à représenter par cet objet Record, un objet Command, un objet Recordset ouvert ou un autre objet Record, une chaîne contenant une instruction SQL SELECT ou un nom de table.
ActiveConnection
Facultatif. Valeur de type Variant qui représente la chaîne de connexion ou l'objet Connection ouvert.
Mode
Facultatif. Valeur ConnectModeEnum, dont la valeur par défaut est adModeUnknown, qui spécifie le mode d'accès pour l'objet Record résultant.
CreateOptions
Facultatif. Valeur RecordCreateOptionsEnum qui équivaut par défaut à adFailIfNotExists et qui spécifie si un fichier ou répertoire existant doit être ouvert, ou si un nouveau fichier ou répertoire doit être créé. Si la valeur par défaut est utilisée, le mode d'accès est issu de la propriété Mode. Ce paramètre est ignoré lorsque Source ne contient pas d'URL..
Options
Facultatif. Valeur RecordOpenOptionsEnum, qui équivaut par défaut à adOpenRecordUnspecified et qui spécifie des options pour l'ouverture de l'objet Record. Ces valeurs peuvent être combinées.
UserName
Facultatif. Valeur de type String contenant l'ID d'utilisateur qui, si nécessaire, autorise l'accès à Source.
Password
Facultatif. Valeur de type String contenant le mot de passe qui, si nécessaire, permet de vérifier UserName.

Remarques

Source peut contenir l'un des éléments suivants :

  • URL. Si le protocole de l'URL est HTTP, le fournisseur Internet est appelé par défaut. Si l'URL pointe vers un nœud contenant un script exécutable (par exemple une page .ASP), un objet Record qui contient la source à la place du contenu exécuté, est ouvert par défaut. L'argument Options permet de modifier ce comportement.
  • Objet Record. Un objet Record ouvert à partir d'un autre objet Record clone l'objet Record d'origine.
  • Objet Command. L'objet Record ouvert représente la ligne unique renvoyée par l'exécution de l'objet Command. Si les résultats contiennent plusieurs lignes, le contenu de la première ligne est placé dans l'enregistrement et une erreur peut être ajoutée à la collection Errors.
  • Instruction SQL SELECT. L'objet Record ouvert représente la ligne unique renvoyée par l'exécution du contenu de la chaîne. Si les résultats contiennent plusieurs lignes, le contenu de la première ligne est placé dans l'enregistrement et une erreur peut être ajoutée à la collection Errors.
  • Nom de table.

Si l'objet Record représente une entité à laquelle il n'est pas possible d'accéder via une URL (par exemple une ligne d'un objet Recordset dérivé d'une base de données), les valeurs de la propriété ParentURL et du champ accessible via la constante adRecordURL sont Null.

Remarque Les URL utilisant le modèle http appellent automatiquement le fournisseur Microsoft OLE DB Provider for Internet Publishing. Pour plus d'informations, consultez URL absolues et relatives.

Voir aussi

Exemple | Exemple

Open, méthode (objet ADO Connection) | Open, méthode (objet ADO Recordset) | Open, méthode (objet ADO Stream) | OpenSchema, méthode

S'applique à : Record, objet


Open, méthode (objet Recordset ADO)

Ouvre un curseur.

Syntaxe

recordset.Open Source, ActiveConnection, CursorType, LockType, Options

Paramètres

Source
Facultatif. Valeur de type Variant qui représente un objet Command valide, une instruction SQL, un nom de table, une procédure stockée, une URL, le nom d'un fichier ou un objet Stream contenant un objet Recordset stocké de façon permanente.
ActiveConnection
Facultatif. Valeur de type Variant qui représente le nom d'une variable objet Connection ou valeur de type String qui contient des paramètres ConnectionString.
CursorType
Facultatif. Valeur CursorTypeEnum déterminant le type de curseur que le fournisseur doit utiliser lors de l'ouverture de l'objet Recordset. La valeur par défaut est adOpenForwardOnly.
LockType
Facultatif. Valeur LockTypeEnum déterminant le type de verrouillage (accès concurrents) que le fournisseur doit utiliser lors de l'ouverture de l'objet Recordset. La valeur par défaut est adLockReadOnly.
Options
Facultatif. Valeur de type Long qui indique comment le fournisseur doit évaluer l'argument Source s'il représente un élément autre qu'un objet Command ou qui spécifie que l'objet Recordset doit être restauré à partir du fichier où il a été enregistré au préalable. Il peut s'agir d'une ou plusieurs valeurs CommandTypeEnum ou ExecuteOptionEnum qui peuvent être associées à l'opérateur sur les bits AND.
Remarque Si vous ouvrez un objet Recordset à partir d'un objet Stream contenant un Recordset enregistré de façon permanente, une valeur ExecuteOptionEnum de adAsyncFetchNonBlocking n'a aucun effet ; la récupération sera synchrone et générera un blocage.
Les valeurs ExecuteOpenEnum de adExecuteNoRecords ou adExecuteStream ne doivent pas être utilisées avec la méthode Open.

Remarques

Le curseur par défaut d'un objet Recordset ADO est un curseur à défilement vers l'avant uniquement et en lecture seule sur le serveur.

L'utilisation de la méthode Open sur un objet Recordset ouvre un curseur qui représente des enregistrements d'une table de base de données, les résultats d'une requête ou un objet Recordset préalablement enregistré.

Utilisez l'argument facultatif Source pour spécifier une source de données à l'aide de l'un des éléments suivants : une variable objet Command, une instruction SQL, une procédure stockée, un nom de table, une URL ou un chemin d'accès complet. Si Source est le nom d'un chemin d'accès, il peut s'agir d'un chemin complet ("c:\dir\file.rst"), d'un chemin relatif ("..\file.rst") ou d'une URL ("http://files/file.rst").

Il n'est pas judicieux d'utiliser l'argument Source de la méthode Open pour exécuter une requête qui ne renvoie aucun enregistrement car il n'existe aucun moyen de savoir si l'appel a réussi. Le Recordset renvoyé par ce type de requête sera fermé. Appelez la méthode Execute d'un objet Command ou la méthode Execute d'un objet Connection à la place pour exécuter une requête, notamment une instruction SQL, qui ne renvoie aucun enregistrement.

L'argument ActiveConnection correspond à la propriété ActiveConnection et spécifie sur quelle connexion doit être ouvert l'objet Recordset. Si vous passez une définition de connexion à cet argument, ADO ouvre une nouvelle connexion à l'aide des paramètres spécifiés. Vous pouvez modifier la valeur de cette propriété après avoir ouvert l'objet Recordset à l'aide d'un curseur côté client (CursorLocation = adUseClient) pour envoyer des mises à jour à un autre fournisseur. Vous pouvez également affecter à cette propriété la valeur Nothing (dans Microsoft Visual Basic) ou NULL pour déconnecter l'objet Recordset de tout fournisseur. La modification de l'argument ActiveConnection pour un curseur côté client entraîne une erreur.

Pour les autres arguments qui correspondent directement aux propriétés d'un objet Recordset (Source, CursorType et LockType), la relation entre les arguments et les propriétés se présente comme suit :

  • La propriété est accessible en lecture/écriture avant l'ouverture de l'objet Recordset.
  • Les valeurs de la propriété sont utilisées, sauf si vous passez les arguments correspondants lors de l'exécution de la méthode Open. Si vous passez un argument, il ignore la valeur de la propriété correspondante et la propriété est mise à jour avec la valeur de l'argument.
  • Dès lors que l'objet Recordset est ouvert, ces propriétés deviennent accessibles en lecture seule.
Remarque La propriété ActiveConnection est accessible en lecture seule pour les objets Recordset dont la propriété Source a la valeur d'un objet Command valide, même si l'objet Recordset n'est pas ouvert.

Si vous passez un objet Command dans l'argument Source et que vous passez également un argument ActiveConnection, une erreur se produit. La propriété ActiveConnection de l'objet Command doit déjà avoir la valeur d'un objet Connection valide ou d'une chaîne de connexion.

Si vous passez un élément autre qu'un objet Command dans l'argument Source, vous pouvez utiliser l'argument Options pour optimiser la valeur affectée à l'argument Source. Si l'argument Options n'est pas défini, vous risquez de constater une diminution des performances car ADO doit émettre des appels vers le fournisseur pour déterminer si l'argument est une instruction SQL, une procédure stockée, une URL ou un nom de table. Si vous connaissez le type de source que vous utilisez, vous pouvez attribuer une valeur à l'argument Options pour indiquer à ADO de passer directement au code concerné. Si l'argument Options ne correspond pas au type de l'argument Source, une erreur se produit.

Si vous passez un objet Stream dans l'argument Source, vous ne devez pas renseigner les autres arguments. Vous provoqueriez une erreur. L'information ActiveConnection n'est pas prise en compte lorsque l'objet Recordset est ouvert à partir d'un objet Stream.

La valeur par défaut de l'argument Options est adCmdFile si aucune connexion n'est associée à l'objet Recordset. Cela est généralement le cas pour les objets Recordset stockés de façon permanente.

Si la source de données ne renvoie pas d'enregistrements, le fournisseur affecte aux deux propriétés BOF et EOF la valeur True et la position en cours n'est pas définie. Vous pouvez encore ajouter de nouvelles données à cet objet Recordset vide si le type de curseur le permet.

Lorsque vous avez terminé vos opérations sur un objet Recordset ouvert, utilisez la méthode Close pour libérer toutes les ressources système associées à cet objet. La fermeture d'un objet ne le supprime pas en mémoire ; vous pouvez modifier ses propriétés et utiliser la méthode Open pour le rouvrir ultérieurement. Pour éliminer définitivement un objet de la mémoire, affectez à la variable objet la valeur Nothing.

Avant de définir la propriété ActiveConnection, appelez la méthode Open sans opérandes pour créer une occurrence d'un objet Recordset en ajoutant des champs à la collection Fields de l'objet Recordset.

Si vous avez défini la propriété CursorLocation avec la valeur adUseClient, vous pouvez extraire les lignes en mode asynchrone de deux manières différentes. La méthode conseillée consiste à affecter au paramètre Options la valeur adAsyncFetch. Vous avez également la possibilité d'utiliser la propriété dynamique « Asynchronous Rowset Processing » dans la collection Properties, mais les événements extraits peuvent être perdus si vous ne définissez pas le paramètre Options avec la valeur adAsyncFetch.

Remarque Dans le fournisseur MS Remote, la récupération en arrière-plan n'est prise en charge que par le biais du paramètre Options de la méthode Open.
Remarque Les URL utilisant le schéma HTTP invoquent automatiquement le fournisseur Microsoft OLE DB pour Internet Publishing. Pour plus d'informations, voir URL absolues et relatives.

Voir aussi

Exemple Visual Basic | Exemple VBScript | Exemple Visual C++ | Exemple Visual J++ | Exemple Visual Basic

Open, méthode (objet Connection ADO) | Open, méthode (objet Record ADO) | Open, méthode (objet ADO) | OpenSchema, méthode | Save, méthode

S'applique à : Recordset, objet


Open, méthode (objet ADO Stream)

Référence de l'API ADO 2.5

Open, méthode (objet Stream ADO)

Ouvre un objet Stream pour manipuler des flux de données binaires ou de texte.

Syntaxe

Stream.Open Source, Mode, OpenOptions, UserName, Password

Paramètres

Source
Facultatif. Valeur de type Variant qui spécifie la source de données de l'objet Stream. Le paramètre Source peut contenir une URL absolue qui pointe vers un nœud existant dans une arborescence bien connue telle qu'un système de messagerie ou un système de fichiers. Une URL doit être spécifiée à l'aide du mot clé ("URL=schéma://serveur/dossier"). Le paramètre Source peut également contenir une référence à un objet Record déjà ouvert, qui ouvre le flux par défaut associé à l'objet Record. Si le paramètre Source n'est pas spécifié, un objet Stream est instancié et ouvert, associé par défaut à aucune source sous-jacente. Pour plus d'informations sur les schémas d'URL et leurs fournisseurs associés, consultez URL absolues et relatives.
Mode
Facultatif. Valeur ConnectModeEnum qui spécifie le mode d'accès pour l'objet Stream résultant (par exemple, lecture/écriture ou lecture seule). La valeur par défaut est adModeUnknown. Pour plus d'informations sur les modes d'accès, consultez la propriété Mode. Si le paramètre Mode n'est pas spécifié, sa valeur est héritée de l'objet source. Par exemple, si l'objet Record source est ouvert en lecture seule, l'objet Stream sera également ouvert en lecture seule par défaut.
OpenOptions
Facultatif. Valeur StreamOpenOptionsEnum. La valeur par défaut est adOpenStreamUnspecified.
UserName
Facultatif. Valeur de type String contenant l'ID utilisateur qui, si nécessaire, accède à l'objet Stream.
Password
Facultatif. Valeur de type String contenant le mot de passe qui, si nécessaire, accède à l'objet Stream.

Remarques

Lorsqu'un objet Record est transmis comme paramètre source, les paramètres UserID et Password ne sont pas utilisés car l'accès à l'objet Record est déjà disponible. La propriété Mode de l'objet Record est également transférée à l'objet Stream. Lorsque le paramètre Source n'est pas spécifié, l'objet Stream ouvert ne contient pas de données et sa propriété Size est égale à zéro (0). Pour éviter de perdre les données éventuellement écrites dans cet objet Stream à sa fermeture, enregistrez l'objet Stream avec la méthode CopyTo ou SaveToFile ou enregistrez-le à un autre emplacement mémoire.

La valeur OpenOptions de adOpenStreamFromRecord identifie le contenu du paramètre Source comme étant un objet Record déjà ouvert. Le comportement par défaut est de considérer la Source comme une URL qui pointe directement vers un nœud dans une structure arborescente, notamment un fichier. Le flux par défaut associé à ce nœud est ouvert.

Tant que l'objet Stream n'est pas ouvert, il est possible de lire toutes ses propriétés en lecture seule. Si un objet Stream est ouvert en mode asynchrone, toutes les opérations qui suivent (autres que la vérification des propriétés en lecture seule comme State) sont bloquées jusqu'à l'exécution de la méthode Open.

Outre les options présentées ci-avant, si vous ne spécifiez pas le paramètre Source, vous pouvez simplement instancier un objet Stream en mémoire sans l'associer à une source sous-jacente. Vous pouvez ajouter dynamiquement des données au flux en écrivant simplement des données binaires ou du texte dans l'objet Stream à l'aide de la méthode Write ou WriteText ou en chargeant des données à partir d'un fichier à l'aide de la méthode LoadFromFile.

Voir aussi

Exemple

Open, méthode (objet Connection ADO) | Open, méthode (objet Record ADO) | Open, méthode (objet Recordset ADO) | OpenSchema, méthode | SaveToFile, méthode

S'applique à : objet Stream


OpenSchema, méthode (ADO)

Guide de référence de l'API ADO 2.5

OpenSchema, méthode

Obtient du fournisseur les informations concernant le schéma de base de données.

Syntaxe

Set recordset = connection.OpenSchema (QueryType, Criteria, SchemaID)

Valeurs renvoyées

Renvoie un objet Recordset qui contient les informations de schéma. Cet objet Recordset sera ouvert en tant que curseur statique en lecture seule. Les colonnes qui apparaissent dans l'objet Recordset sont déterminées par le paramètre QueryType.

Paramètres

QueryType
Valeur SchemaEnum qui représente le type de requête de schéma à exécuter.
Criteria
Facultatif. Tableau des contraintes de requête pour chaque option QueryType, comme indiqué dans la liste SchemaEnum.
SchemaID
GUID correspondant à une requête de schéma propre au fournisseur, non définie par la spécification OLE DB. Ce paramètre est requis si QueryType a la valeur adSchemaProviderSpecific ; dans le cas contraire, il n'est pas utilisé.

Remarques

La méthode OpenSchema renvoie des informations descriptives sur la source de données, notamment les tables qu'elle contient, les colonnes de ces tables et les types de données pris en charge.

L'argument QueryType est un identificateur global unique (GUID) qui indique les colonnes (schémas) renvoyées. La spécification OLE DB comprend une liste complète de schémas.

L'argument Criteria limite les résultats d'une requête de schéma. Il spécifie un tableau de valeurs qui doivent figurer dans un sous-ensemble correspondant de colonnes, appelées colonnes de contraintes, dans l'objet Recordset résultant.

La constante adSchemaProviderSpecific est utilisée comme argument QueryType si le fournisseur définit ses propres requêtes de schéma non standard en dehors de celles répertoriées ci-dessus. Lorsque cette constante est utilisée, l'argument SchemaID doit transmettre le GUID de la requête de schéma à exécuter. Si QueryType a la valeur adSchemaProviderSpecific mais que SchemaID n'est pas fourni, une erreur se produit.

Les fournisseurs ne prennent pas nécessairement en charge toutes les requêtes de schéma OLE DB standard. Plus précisément, la spécification OLE DB impose seulement adSchemaTables, adSchemaColumns et adSchemaProviderTypes. Toutefois, le fournisseur n'est pas tenu de prendre en charge les contraintes Criteria mentionnées ci-dessus pour ces requêtes de schéma.

Utilisation de Remote Data Service La méthode OpenSchema n'est pas disponible pour un objet Connection côté client.
Remarque Dans Visual Basic, les colonnes contenant un entier non signé sur quatre octets (DBTYPE UI4) dans l'objet Recordset renvoyé par la méthode OpenSchema sur l'objet Connection ne peuvent pas être comparées à d'autres variables. Pour plus d'informations sur les types de données OLE DB, consultez le chapitre 13 et l'annexe A du Guide de référence du programmeur Microsoft OLE DB.

Voir aussi

Exemple Visual Basic | Exemple Visual C++ | Exemple Visual J++

Open, méthode (objet ADO Connection) | Open, méthode (objet ADO Record) | Open, méthode (objet ADO Recordset) | Open, méthode (objet ADO Stream) | Annexe A : Fournisseurs

S'applique à : Connection, objet


Read, méthode (ADO)

Référence de l'API ADO 2.5

Read, méthode

Lit un nombre spécifié d'octets dans un objet Stream binaire.

Syntaxe

Variant = Stream.Read ( NumBytes )

Paramètres

NumBytes
Facultatif. Valeur de type Long qui spécifie le nombre d'octets à lire dans le fichier ou la valeur StreamReadEnum par défaut adReadAll.

Valeur renvoyée

La méthode Read lit un nombre spécifié d'octets ou l'ensemble du flux dans un objet Stream et renvoie le résultat sous la forme d'une valeur de type Variant.

Remarques

Si le paramètre NumBytes est supérieur au nombre d'octets qui restent dans l'objet Stream, seuls les octets restants sont renvoyés. Les données lues ne sont pas complétées pour atteindre la longueur spécifiée par NumBytes. S'il n'y a pas d'octet à lire, la méthode renvoie un type Variant de valeur nulle. La méthode Read ne peut pas être utilisée pour lire vers l'arrière.

Remarque NumBytes mesure toujours des octets. Pour les objets Stream de texte (dont la propriété Type a la valeur adTypeText), utilisez la méthode ReadText.

Voir aussi

Exemple

ReadText, méthode

S'applique à : Stream, objet


ReadText, méthode (ADO)

Référence de l'API ADO 2.5

ReadText, méthode

Lit un nombre spécifié de caractères dans un objet Stream de texte.

Syntaxe

String = Stream.ReadText ( NumChars )

Paramètres

NumChars
Facultatif. Valeur de type Long qui spécifie le nombre de caractères à lire dans le fichier ou la valeur StreamReadEnum. La valeur par défaut est adReadAll.

Valeur renvoyée

La méthode ReadText lit un nombre spécifié de caractères, une ligne entière ou l'ensemble du flux dans un objet Stream et renvoie le résultat sous la forme d'une chaîne.

Remarques

Si le paramètre NumChar est supérieur au nombre de caractères qui restent dans l'objet Stream, seuls les caractères restants sont renvoyés. Les données lues ne sont pas complétées pour atteindre la longueur spécifiée par NumChar. S'il n'y a pas de caractère à lire, la méthode renvoie un type Variant de valeur nulle. La méthode ReadText ne peut pas être utilisée pour lire vers l'arrière.

Remarque La méthode ReadText est utilisée avec les objets Stream de texte (dont la propriété Type a la valeur adTypeText). Pour les objet Stream binaires (dont la propriété Type a la valeur adTypeBinary), utilisez la méthode Read.

Voir aussi

Exemple

Read, méthode

S'applique à : Stream, objet


Refresh, méthode (ADO)

Guide de référence de l'API ADO 2.5

Refresh, méthode

Met à jour les objets d'une collection pour refléter les objets spécifiques au fournisseur qui sont disponibles.

Syntaxe

collection.Refresh

Remarques

La méthode Refresh effectue des tâches différentes en fonction de la collection à partir de laquelle vous l'appelez.

Parameters

L'utilisation de la méthode Refresh sur la collection Parameters d'un objet Command extrait des informations sur des paramètres de fournisseur pour la procédure stockée ou la requête paramétrée spécifiée dans l'objet Command. La collection est vide si le fournisseur ne prend pas en charge les appels de procédure stockée ni les requêtes paramétrées.

Vous devez définir la propriété ActiveConnection de l'objet Command en lui affectant un objet Connection valide, la propriété CommandText en lui affectant une commande valide, ainsi que la propriété CommandType en lui affectant adCmdStoredProc avant d'appeler la méthode Refresh.

Si vous accédez à la collection Parameters avant d'appeler la méthode Refresh, ADO appelle automatiquement la méthode et remplit la collection.

Remarque Si vous utilisez la méthode Refresh pour obtenir du fournisseur des informations sur les paramètres et si la méthode renvoie un ou plusieurs objets Parameter d'un type de données de longueur variable, ADO peut allouer de la mémoire aux paramètres en fonction de leur taille maximale potentielle, ce qui provoque une erreur à l'exécution. Pour éviter des erreurs, vous devez définir explicitement la propriété Size de ces paramètres avant d'appeler la méthode Execute.

Fields

L'utilisation de la méthode Refresh sur la collection Fields n'a aucun effet visible. Pour extraire des modifications à partir de la structure de base de données sous-jacente, vous devez utiliser la méthode Requery ou, si l'objet Recordset ne prend pas en charge les signets, la méthode MoveFirst.

Properties

L'utilisation de la méthode Refresh sur la collection Properties de certains objets permet de remplir la collection avec les propriétés dynamiques exposées par le fournisseur. Ces propriétés fournissent des informations sur des fonctionnalités spécifiques au fournisseur, au-delà des propriétés intégrées prises en charge par ADO.

Voir aussi

Exemple Visual Basic | Exemple Visual C++ | Exemple Visual J++

Count, propriété | Refresh, méthode (RDS)

S'applique à : Axes, collection | Columns, collection | CubeDefs, collection | Dimensions, collection | Errors, collection | Fields, collection | Groups, collection | Hierarchies, collection | Indexes, collection | Keys, collection | Levels, collection | Members, collection | Parameters, collection | Positions, collection | Procedures, collection | Properties, collection | Tables, collection | Users, collection | Views, collection


Requery, méthode (ADO)

Guide de référence de l'API ADO 2.5

Requery, méthode

Met à jour les données d'un objet Recordset en réexécutant la requête à l'origine de l'objet.

Syntaxe

recordset.Requery Options

Paramètre

Options
Facultatif. Masque de bits qui contient les valeurs ExecuteOptionEnum et CommandTypeEnum affectant cette opération.
Remarque Si Options a la valeur adAsyncExecute, cette opération s'exécute en mode asynchrone et un événement RecordsetChangeComplete se déclenche lorsqu'elle se termine.
Les valeurs ExecuteOpenEnum de adExecuteNoRecords ou adExecuteStream ne doivent pas être utilisées avec Requery.

Remarques

Utilisez la méthode Requery pour actualiser tout le contenu d'un objet Recordset à partir de la source de données en émettant à nouveau la commande d'origine et en procédant une seconde fois à l'extraction des données. Appeler la méthode Requery revient à appeler successivement les méthodes Close et Open. Si vous êtes en train de modifier l'enregistrement actuel ou d'ajouter un nouvel enregistrement, une erreur se produit.

Tant que l'objet Recordset est ouvert, les propriétés qui définissent la nature du cursor (CursorType, LockType, MaxRecords, etc.) sont accessibles en lecture seule. Par conséquent, la méthode Requery ne peut actualiser que le curseur en cours. Si vous voulez modifier l'une des propriétés du curseur et afficher les résultats, vous devez utiliser la méthode Close pour que ces propriétés soient à nouveau accessibles en lecture/écriture. Vous pouvez alors modifier les valeurs des propriétés, puis appeler la méthode Open pour rouvrir le curseur.

Voir aussi

Exemple Visual Basic | Exemple VBScript | Exemple Visual C++ | Exemple Visual J++

CommandText, propriété

S'applique à : Recordset, objet


Resync, méthode (ADO)

Guide de référence de l'API ADO 2.5

Resync, méthode

Actualise les données de l'objet Recordset en cours ou la collection Fields d'un objet Record à partir de la base de données sous-jacente.

Syntaxe

Recordset.Resync AffectRecords, ResyncValues
Record.Fields.Resync ResyncValues

Paramètres

AffectRecords
Facultatif. Valeur AffectEnum qui détermine le nombre d'enregistrements affectés par la méthode Resync. La valeur par défaut est adAffectAll. Cette valeur n'est pas disponible avec la méthode Resync de la collection Fields d'un objet Record.
ResyncValues
Facultatif. Valeur ResyncEnum qui spécifie si les valeurs sous-jacentes sont remplacées. La valeur par défaut est adResyncAllValues.

Remarques

Recordset

Utilisez la méthode Resync pour resynchroniser les enregistrements de l'objet Recordset en cours par rapport à la base de données sous-jacente. Cette méthode est utile si vous utilisez un curseur statique ou à défilement en avant seulement mais que vous voulez voir toutes les modifications apportées à la base de données sous-jacente.

Si vous affectez à la propriété CursorLocation la valeur adUseClient, Resync n'est disponible que pour les objets Recordset qui ne sont pas en lecture seule.

Contrairement à la méthode Requery, la méthode Resync ne réexécute pas la commande sous-jacente de l'objet Recordset. Les nouveaux enregistrements de la base de données sous-jacente ne sont pas visibles.

Si la tentative de resynchronisation échoue en raison d'un conflit avec les données sous-jacentes (par exemple, si un enregistrement a été supprimé par un autre utilisateur), le fournisseur renvoie des avertissements à la collection Errors et une erreur d'exécution se produit. Utilisez la propriété Filter (adFilterConflictingRecords) et la propriété Status pour localiser les enregistrements concernés par des conflits.

Si les propriétés dynamiques Unique Table et Resync Command sont définies, et si Recordset est le résultat de l'exécution d'une opération de jointure sur plusieurs tables, la méthode Resync exécute la commande donnée dans la propriété Resync Command uniquement sur la table nommée dans la propriété Unique Table.

Fields

Utilisez la méthode Resync pour resynchroniser les valeurs de la collection Fields d'un objet Record avec la source de données sous-jacente. La propriété Count n'est pas affectée par cette méthode.

Si ResyncValues a la valeur adResyncAllValues (valeur par défaut), les propriétés UnderlyingValue, Value et OriginalValue des objets Field de la collection sont synchronisées. Si ResyncValues a la valeur adResyncUnderlyingValues, seule la propriété UnderlyingValue est synchronisée.

La valeur de la propriété Status de chaque objet Field lors de l'appel affecte également le comportement de Resync. Pour les objets Field dont les valeurs Status sont adFieldPendingUnknown ou adFieldPendingInsert, Resync n'a aucun effet. Pour les valeurs Status adFieldPendingChange ou adFieldPendingDelete, Resync synchronise les valeurs de données des champs qui existent toujours dans la source de données.

La méthode Resync ne modifie pas les valeurs Status des objets Fields, sauf si une erreur se produit lorsque Resync est appelé. Par exemple, si le champ n'existe plus, le fournisseur renvoie pour l'objet Field une valeur Status appropriée telle que adFieldDoesNotExist. Les valeurs Status renvoyées peuvent être combinées logiquement avec la valeur de la propriété Status.

Voir aussi

Exemple Visual Basic | Exemple Visual C++ | Exemple Visual J++

Clear, méthode | UnderlyingValue, propriété

S'applique à : Fields, collection | Recordset, objet


Save, méthode (ADO)

Référence de l'API ADO 2.5

Save, méthode

Enregistre l'objet Recordset dans un fichier ou dans un objet Stream.

Syntaxe

recordset.Save Destination, PersistFormat

Paramètres

Destination
Facultatif. Valeur de type Variant qui représente le chemin d'accès complet du fichier où l'objet Recordset doit être enregistré ou référence à un objet Stream.
PersistFormat
Facultatif. Valeur PersistFormatEnum qui précise le format dans lequel l'objet Recordset doit être enregistré (XML ou ADTG). La valeur par défaut est adPersistADTG.

Remarques

Vous ne pouvez appeler la méthode Save que sur un objet Recordset ouvert. Utilisez la méthode Open pour restaurer ultérieurement l'objet Recordset à partir de Destination.

Si la propriété Filter est utilisée pour l'objet Recordset, seules les lignes accessibles sous le filtre sont enregistrées. Si l'objet Recordset est hiérarchique, l'objet Recordset enfant en cours et ses enfants sont enregistrés, ainsi que l'objet Recordset parent. Si la méthode Save d'un objet Recordset enfant est appelée, le Recordset enfant et tous ses enfants sont enregistrés, contrairement au Recordset parent.

La première fois que vous enregistrez l'objet Recordset, le paramètre Destination est facultatif. Si vous omettez Destination, un nouveau fichier est créé dont le nom est défini par la valeur de la propriété Source de l'objet Recordset.

Omettez le paramètre Destination lorsque vous appelez la méthode Save après avoir effectué un premier enregistrement de l'objet, faute de quoi une erreur d'exécution se produit. Si vous appelez la méthode Save ultérieurement en spécifiant un nouveau paramètre Destination, l'objet Recordset est enregistré au nouvel emplacement de destination. Toutefois, le nouveau fichier de destination et le fichier de destination d'origine sont tous les deux ouverts simultanément.

La méthode Save n'entraîne pas la fermeture de l'objet Recordset ni de Destination ; vous pouvez donc continuer à travailler avec le Recordset enregistrer vos dernières modifications. Destination reste ouvert tant que l'objet Recordset n'est pas fermé.

Pour des raisons de sécurité, la méthode Save permet uniquement l'utilisation de paramètres de sécurité faibles et personnalisés à partir d'un script exécuté par Microsoft Internet Explorer. Pour une présentation plus détaillée des problèmes de sécurité, consultez « ADO and RDS Security Issues in Microsoft Internet Explorer » sous ActiveX Data Objects (ADO) Technical Articles dans Microsoft Data Access Technical Articles.

Si la méthode Save est appelée au moment où une opération asynchrone de récupération, d'exécution ou de mise à jour d'un objet Recordset est en cours, la méthode attend que cette opération asynchrone soit terminée avant de s'exécuter.

Les enregistrements sont enregistrés à partir de la première ligne de l'objet Recordset. Lorsque l'exécution de la méthode Save est terminée, la première ligne de l'objet Recordset devient la ligne en cours.

Pour obtenir de meilleurs résultats, affectez à la propriété CursorLocation la valeur adUseClient avec la méthode Save. Si votre fournisseur ne prend pas en charge toutes les fonctionnalités nécessaires pour enregistrer des objets Recordset, le Cursor Service fournira ces fonctionnalités.

Lorsqu'un objet Recordset est enregistré de façon permanente avec la propriété CursorLocation égale à adUseServer, les possibilités de mise à jour du Recordset sont limitées. En général, seules les mises à jour, insertions et suppressions qui ne concernent qu'une table sont autorisées (selon les fonctionnalités du fournisseur). La méthode Resync n'est pas disponible non plus dans cette configuration.

Remarque L'enregistrement d'un objet Recordset dont la collection Fields contient des champs de type adVariant, adIDispatch ou adIUnknown n'est pas pris en charge par ADO et risque de provoquer des résultats imprévisibles.

Seuls les filtres sous la forme de chaînes de critère (p.ex. DateCommande > '31/12/1999') affectent le contenu d'un objet Recordset enregistré de façon permanente. Les filtres créés avec un tableau de signets ou en utilisant une valeur de FilterGroupEnum n'ont aucun impact sur le contenu d'un objet Recordset enregistré de façon permanente. Ces règles s'appliquent aux objets Recordset créés avec des curseurs côté client ou serveur.

Comme le paramètre Destination peut accepter n'importe quel objet prenant en charge l'interface OLE DB IStream, , vous pouvez enregistrer un objet Recordset directement dans l'objet ASP Response. Pour plus d'informations, consultez Scénario de persistance d'un Recordset XML.

Vous pouvez également enregistrer un objet Recordset au format XML dans une instance d'un objet MSXML DOM, comme l'illustre le code Visual Basic suivant :

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:\Program Files" & _
        "\Common Files\System\msadc\samples\NWind.mdb"
rsXML.Open sSQL, sConn
rsXML.Save xDOM, adPersistXML   'Save Recordset directly into a DOM tree.
...
Remarque L'enregistrement d'objets Recordsets hiérarchiques (mise en forme des données) au format XML est soumis à deux limites. Vous ne pouvez pas enregistrer au format XML un objet Recordset hiérarchique qui contient des mises à jour en attente ni un objet Recordset hiérarchique paramétré.
Un objet Recordset est enregistré au format XML en utilisant le format UTF-8. Lorsqu'un fichier de ce type est chargé dans un objet ADO Stream, l'objet Stream ne tente pas d'ouvrir un Recordset du flux sauf si la propriété Charset du flux est définie sur la valeur appropriée pour le format UTF-8.

Voir aussi

Exemple Visual Basic | Exemple Visual C++ | Exemple Visual J++

Open, méthode (objet Recordset ADO) | Open, méthode (objet ADO) | SaveToFile, méthode

S'applique à : Recordset, objet | Stream, objet


SaveToFile, méthode (ADO)

Référence de l'API ADO 2.5

SaveToFile, méthode

Enregistre le contenu binaire d'un objet Stream dans un fichier.

Syntaxe

Stream.SaveToFile FileName, SaveOptions

Paramètres

NomFichier
Valeur de type String qui contient le nom complet du fichier dans lequel le contenu de l'objet Stream doit être enregistré. Vous pouvez effectuer l'enregistrement vers n'importe quel emplacement valide ou tout emplacement auquel vous avez accès à l'aide d'une valeur UNC.
SaveOptions
Valeur SaveOptionsEnum qui spécifie si un nouveau fichier doit être créé par la méthode SaveToFile dans le cas où il n'existe pas déjà. La valeur par défaut est adSaveCreateNotExists. Ces options vous permettent d'indiquer si une erreur se produit lorsque le fichier spécifié n'existe pas. Vous pouvez également spécifier que la méthode SaveToFile remplace le contenu en cours du fichier existant.
Remarque Si vous remplacez un fichier existant (adSaveCreateOverwrite), la méthode SaveToFile tronque tous les octets du fichier d'origine qui suivent le nouvel emplacement EOS.

Remarques

La méthode SaveToFile peut être utilisée pour copier le contenu d'un objet Stream dans un fichier local. Le contenu et les propriétés de l'objet Stream ne changent pas. L'objet Stream doit être ouvert avant l'appel de la méthode SaveToFile.

Cette méthode ne modifie pas l'association entre l'objet Stream et sa source de données sous-jacente. L'objet Stream reste associé à l'URL d'origine ou à l'enregistrement qui était sa source lors de son ouverture.

Après une opération SaveToFile, la position en cours (Position) dans l'objet Stream est le début du flux (0).

Voir aussi

Open, méthode (objet Stream ADO) | Save, méthode

S'applique à : Stream, objet


Seek, méthode (ADO)

Référence de l'API ADO 2.5

Seek, méthode

Recherche l'index d'un objet Recordset pour une localisation rapide de la ligne qui correspond aux valeurs spécifiées et définit cette ligne comme ligne en cours.

Syntaxe

recordset.Seek KeyValues, SeekOption

Paramètres

KeyValues
Tableau de valeurs de type Variant. Un index consiste en une ou plusieurs colonnes et le tableau contient une valeur permettant la comparaison avec chaque colonne correspondante.
SeekOption
Valeur SeekEnum qui spécifie le type de comparaison à effectuer entre les colonnes de l'index et les KeyValues correspondantes.

Remarques

Utilisez la méthode Seek en association avec la propriété Index si le fournisseur sous-jacent prend en charge les index sur l'objet Recordset. Utilisez la méthode Supports (adSeek) pour déterminer si le fournisseur sous-jacent prend en charge la méthode Seek et la méthode Supports(adIndex) pour déterminer s'il prend en charge les index. (Par exemple, le fournisseur OLE DB pour Microsoft Jet prend en charge la méthode Seek et la propriété Index.)

Si la méthode Seek ne trouve pas la ligne désirée, il ne se produit aucune erreur, et la ligne est positionnée à la fin de l'objet Recordset. Avant d'utiliser cette méthode, affectez l'index désiré à la propriété Index.

Cette méthode n'est prise en charge que par les curseurs côté serveur. Elle n'est pas prise en charge lorsque la propriété CursorLocation de l'objet Recordset a pour valeur adUseClient.

Cette méthode ne peut être utilisée que lorsque l'objet Recordset a été ouvert avec une valeur CommandTypeEnum égale à adCmdTableDirect.

Voir aussi

Exemple Visual Basic | Exemple Visual C++

Find, méthode | Index, propriété

S'applique à : Recordset, objet


SetEOS, méthode (ADO)

Référence de l'API ADO 2.5

SetEOS, méthode

Définit la position correspondant à la fin du flux.

Syntaxe

Stream.SetEOS

Remarques

La méthode SetEOS met à jour la valeur de la propriété EOS en définissant la Position en cours à la fin du flux. Tous les octets ou caractères situés après la position en cours sont tronqués.

Dans la mesure où les méthodes Write, WriteText et CopyTo ne tronquent aucune valeur dans les objets Stream existants, vous pouvez tronquer ces octets ou caractères en définissant la nouvelle position de fin de flux à l'aide de la méthode SetEOS.

Attention Si vous définissez la position de fin de flux (EOS) à un emplacement antérieur à la fin réelle du flux, vous perdez les données situées après la nouvelle position EOS.

S'applique à : Stream, objet


SkipLine, méthode (ADO)

Référence de l'API ADO 2.5

SkipLine, méthode

Ignore une ligne entière lors de la lecture d'un flux de texte.

Syntaxe

Stream.SkipLine

Remarques

Tous les caractères qui précèdent le séparateur de ligne suivant, y compris le séparateur lui-même, sont ignorés. Par défaut, la propriété LineSeparator a la valeur adCRLF. Si vous essayez d'ignorer une ligne au-delà de la position de fin de flux (EOS), la position en cours reste simplement à la fin du flux (EOS).

La méthode SkipLine est utilisée avec les objets Stream de texte (dont la propriété Type a la valeur adTypeText).

S'applique à : Stream, objet


Stat, méthode (ADO)

Référence de l'API ADO 2.5

Stat, méthode

Extrait des informations relatives à un objet Stream.

Syntaxe

Long stream.Stat(StatStg, StatFlag)

Valeur renvoyée

Valeur de type Long indiquant l'état d'une opération.

Paramètres

StatStg
Structure STATSTG qui sera remplie d'informations concernant le flux. L'implémentation de la méthode Stat utilisée par l'objet ADO Stream ne remplit pas tous les champs de la structure.
StatFlag
Spécifie que cette méthode ne renvoie aucun membre dans la structure STATSTG, ni par conséquent l'enregistrement d'une opération d'allocation mémoire. Les valeurs proviennent de l'énumération STATFLAG.

L'énumération STATFLAG peut prendre deux valeurs
Constante | Valeur
STATFLAG_DEFAULT | 0
STATFLAG_NONAME | 1

Remarques

La version de la méthode Stat implémentée pour l'objet ADO Stream renseigne les champs suivants de la structure STATSTG :

pwcsName
Chaîne contenant le nom du flux, s'il est disponible et si la valeur StatFlag STATFLAG_NONAME n'est pas spécifiée.
cbSize
Indique la taille du flux en octets ou le tableau d'octets.
mtime
Indique l'heure de la dernière modification pour ce stockage, flux ou tableau d'octets.
ctime
Indique l'heure de création de ce stockage, flux ou tableau d'octets.
atime
Indique l'heure du dernier accès pour ce stockage, flux ou tableau d'octets.

Si la valeur STATFLAG_NONAME est spécifiée dans le paramètre StatFlag, le nom du flux n'est pas renvoyé.

Si la valeur STATFLAG_NONAME n'est pas spécifiée dans le paramètre StatFlag et si aucun nom n'est disponible pour le flux en cours, cette valeur est E_NOTIMPL.

S'applique à : Stream, objet


Supports, méthode (ADO)

Référence de l'API ADO 2.5

Supports, méthode

Détermine si un objet Recordset spécifié prend en charge un type de fonctionnalité particulier.

Syntaxe

boolean = recordset.Supports( CursorOptions )

Valeur renvoyée

Renvoie une valeur de type Boolean qui indique si toutes les fonctionnalités identifiées par l'argument CursorOptions sont prises en charge par le fournisseur de données.

Paramètres

CursorOptions
Expression de type Long qui se compose d'une ou plusieurs valeurs CursorOptionEnum.

Remarques

Utilisez la méthode Supports pour déterminer les types de fonctionnalités pris en charge par un objet Recordset. Si l'objet Recordset prend en charge les fonctionnalités dont les constantes correspondantes se trouvent dans CursorOptions, la méthode Supports renvoie la valeur True. Dans le cas contraire, elle renvoie la valeur False.

Remarque Bien que la méthode Supports puisse renvoyer une valeur True pour une fonctionnalité donnée, elle ne garantit pas que le fournisseur permet d'utiliser cette fonctionnalité en toutes circonstances. La méthode Supports renvoie uniquement une indication stipulant si le fournisseur peut prendre en charge la fonctionnalité spécifiée, en supposant que certaines conditions soient réunies. Par exemple, la méthode Supports peut indiquer qu'un objet Recordset prend en charge les mises à jour même si le curseur est basé sur une jointure entre plusieurs tables dont certaines colonnes ne peuvent pas être mises à jour.

Voir aussi

Exemple Visual Basic | Exemple Visual C++ | Exemple Visual J++

CursorType, propriété

S'applique à : Recordset, objet


Update, méthode (ADO)

Référence de l'API ADO 2.5

Update, méthode

Enregistre les modifications que vous avez effectuées dans la ligne en cours d'un objet Recordset ou dans la collection Fields d'un objet Record.

Syntaxe

recordset.Update Fields, Values
record.Fields.Update

Paramètres

Fields
Facultatif. Valeur de type Variant qui représente un nom unique ou tableau de type Variant qui représente les noms ou les positions ordinales du ou des champs que vous souhaitez modifier.
Values
Facultatif. Valeur de type Variant qui représente une valeur unique ou tableau de type Variant qui représente les valeurs du ou des champs du nouvel enregistrement.

Remarques

Recordset

Utilisez la méthode Update pour enregistrer les modifications que vous avez apportées à l'enregistrement actuel d'un objet Recordset depuis l'appel de la méthode AddNew ou depuis la modification des valeurs des champs dans un enregistrement existant. L'objet Recordset doit prendre en charge les mises à jour.

Pour définir les valeurs des champs, procédez de l'une des manières suivantes :

  • Affectez des valeurs à la propriété Value d'un objet Field et appelez la méthode Update.
  • Passez un nom de champ et une valeur comme arguments lorsque vous appelez la méthode Update.
  • Passez un tableau de noms de champs et un tableau de valeurs lorsque vous appelez la méthode Update.

Lorsque vous utilisez des noms de champs et des valeurs, il doit y avoir un nombre égal d'éléments dans les deux tableaux. De même, l'ordre des noms de champs doit correspondre à l'ordre des valeurs de champ. En cas de non-concordance entre le nombre et l'ordre des champs et des valeurs, une erreur se produit.

Si l'objet Recordset prend en charge la mise à jour par lots, vous pouvez mettre en mémoire cache locale plusieurs modifications apportées à un ou plusieurs enregistrements jusqu'à ce que vous appeliez la méthode UpdateBatch. Si vous modifiez l'enregistrement actuel ou ajoutez un nouvel enregistrement lorsque vous appelez la méthode UpdateBatch, ADO appelle automatiquement la méthode Update pour enregistrer les modifications en attente dans l'enregistrement actuel avant de transmettre les modifications par lots au fournisseur.

Si vous quittez l'enregistrement que vous ajoutez ou modifiez avant d'appeler la méthode Update, ADO appelle automatiquement cette dernière pour enregistrer les modifications. Vous devez appeler la méthode CancelUpdate si vous voulez annuler les modifications apportées à l'enregistrement actuel ou supprimer un enregistrement que vous venez d'ajouter.

L'enregistrement actuel reste le même après l'appel de la méthode Update.

Record

La méthode Update finalise les ajouts, suppressions et mises à jour de champs effectués dans la collection Fields d'un objet Record.

Par exemple, les champs supprimés à l'aide de la méthode Delete sont immédiatement marqués en vue de la suppression mais ils restent dans la collection. Vous devez appeler la méthode Update pour supprimer réellement ces champs de la collection du fournisseur.

Voir aussi

Exemple Visual Basic | Exemple Visual C++

AddNew, méthode | CancelUpdate, méthode | EditMode, propriété | UpdateBatch, méthode

S'applique à : Fields, collection | l'Recordset, objet


UpdateBatch, méthode (ADO)

Référence de l'API ADO 2.5

UpdateBatch, méthode

Enregistre sur le disque toutes les mises à jour par lots en attente.

Syntaxe

recordset.UpdateBatch AffectRecords

Paramètres

AffectRecords
Facultatif. Valeur AffectEnum qui indique le nombre d'enregistrements affectés par la méthode UpdateBatch.

Remarques

Utilisez la méthode UpdateBatch lorsque vous modifiez un objet Recordset en mode de mise à jour par lots afin de transmettre toutes les modifications effectuées dans l'objet Recordset à la base de données sous-jacente.

Si l'objet Recordset prend en charge la mise à jour par lots, vous pouvez mettre en mémoire cache locale plusieurs modifications apportées à un ou plusieurs enregistrements jusqu'à ce que vous appeliez la méthode UpdateBatch. Si vous modifiez l'enregistrement actuel ou ajoutez un nouvel enregistrement lorsque vous appelez la méthode UpdateBatch, ADO appelle automatiquement la méthode Update pour enregistrer les modifications en attente dans l'enregistrement actuel avant de transmettre les modifications par lots au fournisseur. Vous devez utiliser la mise à jour par lots avec un curseur à jeu de clés ou statique uniquement.

Remarque Si vous spécifiez ce paramètre avec la valeur adAffectGroup, une erreur se produit lorsqu'il n'y a aucun enregistrement visible dans l'objet Recordset en cours (cas d'un filtre qui ne trouve aucun enregistrement conforme).

Si la tentative de transmission des modifications échoue pour tous les enregistrements ou certains d'entre eux en raison d'un conflit avec les données sous-jacentes (par exemple, un enregistrement a été supprimé par un autre utilisateur), le fournisseur renvoie des avertissements dans la collection Errors et une erreur d'exécution se produit. Utilisez la propriété Filter (adFilterAffectedRecords) et la propriété Status pour localiser les enregistrements concernés par des conflits.

Pour annuler toutes les mises à jour par lots en attente, utilisez la méthode CancelBatch.

Si les propriétés dynamiques Unique Table et Update Resync sont définies et si l'objet Recordset résulte d'une opération de jointure entre plusieurs tables, la méthode UpdateBatch est implicitement suivie de la méthode Resync en fonction des valeurs de la propriété Update Resync.

L'ordre dans lequel les différentes mises à jour d'un lot sont effectuées dans la source de données n'est pas nécessairement identique à l'ordre d'exécution des modifications dans l'objet Recordset local. L'ordre des mises à jour dépend du fournisseur. Vous devez tenir compte de ce détail lorsque vous codez des mises à jour liées entre elles, par exemple des contraintes de clés étrangères sur une insertion ou une mise à jour.

Voir aussi

Exemple Visual Basic | Exemple Visual C++ | Exemple Visual J++

CancelBatch, méthode | Clear, méthode | LockType, propriété | Update, méthode

S'applique à : Recordset, objet


Write, méthode (ADO)

Référence de l'API ADO 2.5

Write, méthode

Écrit des données binaires dans un objet Stream.

Syntaxe

Stream.Write Buffer

Paramètres

Buffer
Valeur de type Variant qui contient un tableau d'octets à écrire.

Remarques

Les octets spécifiés sont écrits dans l'objet Stream sans espace de séparation.

La Position en cours est placée sur l'octet qui suit les données écrites. La méthode Write ne tronque pas les autres données du flux. Si vous souhaitez supprimer ces octets, appelez la méthode SetEOS.

Si les données écrites dépassent la position de fin de flux EOS, la propriété Size de l'objet Stream est augmentée pour contenir tous les nouveaux octets, puis EOS est placé sur le dernier octet de l'objet Stream.

Remarque La méthode Write est utilisée avec les objets Stream binaires (dont la propriété Type a la valeur adTypeBinary). Pour les objets Stream binaires (dont la propriété Type a la valeur adTypeText), utilisez la méthode WriteText.

Voir aussi

WriteText, méthode

S'applique à : Stream, objet


WriteText, méthode (ADO)

Référence de l'API ADO 2.5

WriteText, méthode

Écrit une chaîne de texte spécifiée dans un objet Stream.

Syntaxe

Stream.WriteText Data, Options

Paramètres

Data
Valeur de type String qui contient le texte (caractères) à écrire.
Options
Facultatif. Valeur StreamWriteEnum qui spécifie si un caractère de séparation de ligne doit être écrit à la fin de la chaîne spécifiée.

Remarques

Les chaînes spécifiées sont écrites dans l'objet Stream sans espace ou caractère de séparation.

La Position en cours est placée sur le caractère qui suit les données écrites. La méthode WriteText ne tronque pas les autres données du flux. Si vous souhaitez supprimer ces caractères, appelez la méthode SetEOS.

Si les données écrites dépassent la position de fin de flux EOS, la propriété Size de l'objet Stream est augmentée pour contenir tous les nouveaux caractères, puis EOS est placé sur le dernier octet de l'objet Stream.

Remarque La méthode WriteText est utilisée avec les objets Stream de texte (dont la propriété Type a la valeur adTypeText). Pour les objets Stream binaires (dont la propriété Type a la valeur adTypeBinary), utilisez la méthode Write.

Voir aussi

Write, méthode

S'applique à : Stream, objet


Événements ADO

BeginTransComplete | Appelé à la fin d'une opération BeginTrans.
CommitTransComplete | Appelé à la fin d'une opération CommitTrans.
ConnectComplete | Appelé après l'établissement d'une connexion.
Disconnect | Appelé à l'issue de la fermeture d'une connexion.
EndOfRecordset | Appelé lors d'une tentative de déplacement vers une ligne située au-delà de Recordset.
ExecuteComplete | Appelé à l'issue de l'exécution d'une commande.
FetchComplete | Appelé une fois que tous les enregistrements dans une opération asynchrone de longue durée ont été intégrés dans Recordset.
FetchProgress | Appelé périodiquement au cours d'une opération asynchrone de longue durée pour indiquer le nombre de lignes actuellement intégrées dans Recordset.
FieldChangeComplete | Appelé après la modification de la valeur d'un ou plusieurs objets Field.
InfoMessage | Appelé chaque fois qu'un message d'avertissement apparaît pendant une opération ConnectionEvent.
MoveComplete | Appelé après la modification de la position actuelle dans Recordset.
RecordChangeComplete | Appelé après la modification d'un ou plusieurs enregistrements.
RecordsetChangeComplete | Appelé après la modification de Recordset.
RollbackTransComplete | Appelé à la fin d'une opération RollbackTrans.
WillChangeField | Appelé avant qu'une opération en attente modifie la valeur d'un ou plusieurs objets Field dans Recordset.
WillChangeRecord | Appelé avant la modification d'un ou plusieurs enregistrements (lignes) dans Recordset.
WillChangeRecordset | Appelé avant qu'une opération en attente modifie Recordset.
WillConnect | Appelé juste avant l'établissement d'une connexion.
WillExecute | Appelé juste avant qu'une commande en attente soit exécutée sur cette connexion et offre à l'utilisateur la possibilité d'en examiner et d'en modifier les paramètres.
WillMove | L'événement WillMove est appelé avant qu'une opération en attente change la position actuelle dans Recordset.

Voir aussi

Guide de référence de l'API ADO | Collections ADO | Propriétés dynamiques ADO | Constantes énumérées ADO | Erreurs ADO | Modèle d'événement ADO, opérations synchrones et asynchrones | Méthodes ADO | Modèle d'objet ADO | Objets ADO | Propriétés ADO


BeginTransComplete, CommitTransComplete et RollbackTransComplete, événements (ADO)

Guide de référence de l'API ADO 2.5

BeginTransComplete, CommitTransComplete et RollbackTransComplete, événements

Ces événements sont appelés à l'issue de l'exécution de l'opération associée sur l'objet Connection.

  • BeginTransComplete est appelé après l'opération BeginTrans.
  • CommitTransComplete est appelé après l'opération CommitTrans.
  • RollbackTransComplete est appelé après l'opération RollbackTrans.

Syntaxe

BeginTransComplete TransactionLevel, pError, adStatus, pConnection
CommitTransComplete pError, adStatus, pConnection
RollbackTransComplete pError, adStatus, pConnection

Paramètres

TransactionLevel
Valeur de type Long qui contient le nouveau niveau de transaction de BeginTrans ayant causé l'événement.
pError
Objet Error. Il décrit l'erreur survenue si la valeur de EventStatusEnum est adStatusErrorsOccurred ; sinon, il n'est pas défini.
adStatus
Valeur d'état EventStatusEnum. Lorsque l'un de ces événements est appelé, ce paramètre prend la valeur adStatusOK si l'opération qui a déclenché l'événement a réussi, ou la valeur adStatusErrorsOccurred si l'opération a échoué.

Ces événements peuvent empêcher l'apparition de notifications ultérieures si ce paramètre a la valeur adStatusUnwantedEvent avant le renvoi de l'événement.

pConnection
Objet Connection pour lequel cet événement s'est produit.

Remarques

Dans Visual C++, plusieurs objets Connection peuvent partager la même méthode de gestion d'événements. La méthode utilise l'objet Connection renvoyé pour identifier l'objet qui a déclenché l'événement.

Si la propriété Attributes a pour valeur adXactCommitRetaining ou adXactAbortRetaining, une nouvelle transaction est exécutée après la validation ou l'annulation d'une transaction. Utilisez l'événement BeginTransComplete pour ignorer tous les événements sauf l'événement de démarrage de la première transaction.

Voir aussi

Exemple Visual C++ | Exemple Visual J++ | Exemple Visual Basic

Résumé du gestionnaire d'événements ADO | BeginTrans, CommitTrans et RollbackTrans, méthodes

S'applique à : Connection, objet


ConnectComplete et Disconnect, événements (ADO)

Guide de référence de l'API ADO 2.5

ConnectComplete et Disconnect, événements

L'événement ConnectComplete est appelé après l'établissement d'une connexion. L'événement Disconnect est appelé après la fermeture d'une connexion.

Syntaxe

ConnectComplete pError, adStatus, pConnection
Disconnect adStatus, pConnection

Paramètres

pError
Objet Error. Il décrit l'erreur survenue si la valeur de adStatus est adStatusErrorsOccurred ; sinon, il n'est pas défini.
adStatus
Valeur EventStatusEnum qui renvoie toujours adStatusOK.

Lors de l'appel de ConnectComplete, ce paramètre prend la valeur adStatusCancel si un événement WillConnect a demandé l'annulation de la connexion en attente.

Avant le renvoi de l'un de ces deux événements, affectez à ce paramètre la valeur adStatusUnwantedEvent pour empêcher des notifications ultérieures. Cependant, la fermeture et la réouverture de Connection déclenchent à nouveau ces événements.

pConnection
Objet Connection pour lequel cet événement s'applique.

Voir aussi

Exemple Visual C++

Résumé du gestionnaire d'événements ADO

S'applique à : Connection, objet


EndOfRecordset, événement (ADO)

Guide de référence de l'API ADO 2.5

EndOfRecordset, événement

L'événement EndOfRecordset est appelé lors d'une tentative de déplacement vers une ligne située au-delà de la fin de Recordset.

Syntaxe

EndOfRecordset fMoreData, adStatus, pRecordset

Paramètres

fMoreData
Valeur VARIANT_BOOL qui, si elle correspond à VARIANT_TRUE, indique que des lignes supplémentaires ont été ajoutées à Recordset.
adStatus
Valeur d'état EventStatusEnum.

Lors de l'appel de EndOfRecordset, ce paramètre prend la valeur adStatusOK si l'opération qui a déclenché l'événement a réussi. Il prend la valeur adStatusCantDeny si cet événement ne peut pas demander l'annulation de l'opération qui a déclenché cet événement.

Avant le renvoi de EndOfRecordset, affectez adStatusUnwantedEvent à ce paramètre pour empêcher des notifications ultérieures.

pRecordset
Objet Recordset. Recordset pour lequel cet événement s'est produit.

Remarques

Un événement EndOfRecordset peut survenir si l'opération MoveNext échoue.

Ce gestionnaire d'événements est appelé lorsque l'utilisateur tente de se positionner au-delà de la fin de l'objet Recordset, notamment lors d'un appel à MoveNext. Cependant, lorsque cet événement est en cours de traitement, vous avez la possibilité d'extraire davantage d'enregistrements de la base de données pour les ajouter à la fin de Recordset. Dans ce cas, affectez VARIANT_TRUE à fMoreData et renvoyez EndOfRecordset. Appelez ensuite MoveNext à nouveau pour accéder aux enregistrements récemment récupérés.

Voir aussi

Exemple Visual C++

Résumé du gestionnaire d'événements ADO

S'applique à : Recordset, objet


ExecuteComplete, événement (ADO)

Guide de référence de l'API ADO 2.5

ExecuteComplete, événement

L'événement ExecuteComplete est appelé à l'issue de l'exécution d'une commande.

Syntaxe

ExecuteComplete RecordsAffected, pError, adStatus, pCommand, pRecordset, pConnection

Paramètres

RecordsAffected
Valeur de type Long indiquant le nombre d'enregistrements affectés par la commande.
pError
Objet Error. Il décrit l'erreur survenue si la valeur de adStatus est adStatusErrorsOccurred ; sinon, il n'est pas défini.
adStatus
Valeur d'état EventStatusEnum. Lorsque cet événement est appelé, ce paramètre prend la valeur adStatusOK si l'opération qui a déclenché l'événement a réussi, ou la valeur adStatusErrorsOccurred si l'opération a échoué.

Avant le renvoi de cet événement, affectez adStatusUnwantedEvent à ce paramètre pour empêcher des notifications ultérieures.

pCommand
Objet Command exécuté. Contient un objet Command même en cas d'appel de Connection.Execute ou de Recordset.Open sans créer explicitement d'objet Command, ce qui entraîne la création d'un objet Command de manière interne par ADO.
pRecordset
Objet Recordset résultant de la commande exécutée. Cet objet Recordset peut être vide. Vous ne devez jamais détruire l'objet Recordset à partir de ce gestionnaire d'événements. Dans le cas contraire, une violation d'accès se produit lorsque ADO tente d'accéder à un objet qui n'existe plus.
pConnection
Objet Connection. Connexion sur laquelle l'opération a été exécutée.

Remarques

Un événement ExecuteComplete peut se produire en raison des méthodes Connection. Execute, Command. Execute, Recordset. Open, Recordset. Requery ou Recordset. NextRecordset.

Voir aussi

Exemple Visual C++

Résumé du gestionnaire d'événements ADO

S'applique à : Connection, objet


FetchComplete, événement (ADO)

Guide de référence de l'API ADO 2.5

FetchComplete, événement

L'événement FetchComplete est appelé une fois que tous les enregistrements dans une opération asynchrone de longue durée ont été récupérés dans Recordset.

Syntaxe

FetchComplete pError, adStatus, pRecordset

Paramètres

pError
Objet Error. Il décrit l'erreur survenue si la valeur de adStatus est adStatusErrorsOccurred ; sinon, il n'est pas défini.
adStatus
Valeur d'état EventStatusEnum. Lorsque cet événement est appelé, ce paramètre prend la valeur adStatusOK si l'opération qui a déclenché l'événement a réussi, ou la valeur adStatusErrorsOccurred si l'opération a échoué.

Avant le renvoi de cet événement, affectez adStatusUnwantedEvent à ce paramètre pour empêcher des notifications ultérieures.

pRecordset
Objet Recordset. Il s'agit de l'objet pour lequel les enregistrements ont été récupérés.

Remarques

Pour utiliser FetchComplete avec Microsoft Visual Basic, Visual Basic 6.0 ou une version ultérieure est nécessaire.

Voir aussi

Exemple Visual C++

Résumé du gestionnaire d'événements ADO

S'applique à : Recordset, objet


FetchProgress, événement (ADO)

Guide de référence de l'API ADO 2.5

FetchProgress, événement

L'événement FetchProgress est appelé périodiquement au cours d'une opération asynchrone de longue durée pour indiquer le nombre de lignes supplémentaires actuellement récupérées dans Recordset.

Syntaxe

FetchProgress Progress, MaxProgress, adStatus, pRecordset

Paramètres

Progress
Valeur de type Long indiquant le nombre d'enregistrements actuellement récupérés.
MaxProgress
Valeur de type Long indiquant le nombre maximal d'enregistrements qui devraient être récupérés.
adStatus
Valeur d'état EventStatusEnum.
pRecordset
Objet Recordset pour lequel les enregistrements sont récupérés.

Remarques

Lorsque vous utilisez FetchProgress avec un Recordset enfant, sachez que les valeurs des paramètres Progress et MaxProgress proviennent de l'ensemble de lignes sous-jacent de Cursor Service. Les valeurs renvoyées représentent le nombre total d'enregistrements figurant dans l'ensemble de lignes sous-jacent, et pas seulement le nombre d'enregistrements dans le chapitre en cours.

Remarque Pour utiliser FetchProgress avec Microsoft Visual Basic, Visual Basic 6.0 ou une version ultérieure est nécessaire.

Voir aussi

Exemple Visual C++

Résumé du gestionnaire d'événements ADO

S'applique à : Recordset, objet


InfoMessage, événement (ADO)

Guide de référence de l'API ADO 2.5

InfoMessage, événement

L'événement InfoMessage est appelé chaque fois qu'un avertissement survient pendant une opération ConnectionEvent.

Syntaxe

InfoMessage pError, adStatus, pConnection

Paramètres

pError
Objet Error. Ce paramètre contient toutes les erreurs renvoyées. Si plusieurs erreurs sont renvoyées, énumérez la collection Errors pour les retrouver.
adStatus
Valeur d'état EventStatusEnum. Si un avertissement se produit, adStatus prend la valeur adStatusOK et pError contient l'avertissement.

Avant le renvoi de cet événement, affectez adStatusUnwantedEvent à ce paramètre pour empêcher des notifications ultérieures.

pConnection
Objet Connection. Il s'agit de la connexion pour laquelle l'avertissement est survenu. Par exemple, des avertissements peuvent se produire à l'ouverture d'un objet Connection ou lors de l'exécution de Command sur un objet Connection.

Voir aussi

Exemple Visual C++

Résumé du gestionnaire d'événements ADO

S'applique à : Connection, objet


WillChangeField et FieldChangeComplete, événements (ADO)

Guide de référence de l'API ADO 2.5

WillChangeField et FieldChangeComplete, événements

L'événement WillChangeField est appelé avant qu'une opération en attente modifie la valeur d'un ou plusieurs objets Field dans Recordset. L'événement FieldChangeComplete est appelé après modification de la valeur d'un ou plusieurs objets Field.

Syntaxe

WillChangeField cFields, Fields, adStatus, pRecordset
FieldChangeComplete cFields, Fields, pError, adStatus, pRecordset

Paramètres

cFields
Paramètre de type Long qui indique le nombre d'objets Field dans Fields.
Fields
Pour WillChangeField, le paramètre Fields est un tableau de Variants qui contient des objets Field avec les valeurs d'origine.

Pour FieldChangeComplete, le paramètre Fields est un tableau de Variants qui contient des objets Field avec les valeurs modifiées.
pError
Objet Error. Il décrit l'erreur survenue si la valeur de adStatus est adStatusErrorsOccurred ; sinon, il n'est pas défini.
adStatus
Valeur d'état EventStatusEnum.

Lors de l'appel de WillChangeField, ce paramètre prend la valeur adStatusOK si l'opération qui a déclenché l'événement a réussi. Il prend la valeur adStatusCantDeny si cet événement ne peut pas demander l'annulation de l'opération en attente.

Lors de l'appel de FieldChangeComplete, ce paramètre prend la valeur adStatusOK si l'opération qui a déclenché l'événement a réussi ; il prend la valeur adStatusErrorsOccurred si l'opération a échoué.

Avant le renvoi de WillChangeField, affectez adStatusCancel à ce paramètre pour demander l'annulation de l'opération en attente.

Avant le renvoi de FieldChangeComplete, affectez adStatusUnwantedEvent à ce paramètre pour empêcher des notifications ultérieures.

pRecordset
Objet Recordset. Recordset pour lequel cet événement s'est produit.

Remarques

Un événement WillChangeField ou FieldChangeComplete peut se produire lors de la définition de la propriété Value et de l'appel de la méthode Update à l'aide des paramètres du tableau de valeurs et de champs.

Voir aussi

Exemple Visual C++

Résumé du gestionnaire d'événements ADO

S'applique à : Recordset, objet


WillChangeRecord et RecordChangeComplete, événements (ADO)

Guide de référence de l'API ADO 2.5

WillChangeRecord et RecordChangeComplete, événements

L'événement WillChangeRecord est appelé avant qu'un ou plusieurs enregistrements (lignes) soient modifiés dans Recordset. L'événement RecordChangeComplete est appelé après qu'un ou plusieurs enregistrements sont modifiés.

Syntaxe

WillChangeRecord adReason, cRecords, adStatus, pRecordset
RecordChangeComplete adReason, cRecords, pError, adStatus, pRecordset

Paramètres

adReason
Valeur EventReasonEnum qui indique le motif de cet événement. Ce paramètre peut prendre pour valeur adRsnAddNew, adRsnDelete, adRsnUpdate, adRsnUndoUpdate, adRsnUndoAddNew, adRsnUndoDelete ou adRsnFirstChange.
cRecords
Valeur de type Long indiquant le nombre d'enregistrements modifiés (affectés).
pError
Objet Error. Il décrit l'erreur survenue si la valeur de adStatus est adStatusErrorsOccurred ; sinon, il n'est pas défini.
adStatus
Valeur d'état EventStatusEnum.

Lors de l'appel de WillChangeRecord, ce paramètre prend la valeur adStatusOK si l'opération qui a déclenché l'événement a réussi. Il prend la valeur adStatusCantDeny si cet événement ne peut pas demander l'annulation de l'opération en attente.

Lors de l'appel de RecordChangeComplete, ce paramètre prend la valeur adStatusOK si l'opération qui a déclenché l'événement a réussi ; il prend la valeur adStatusErrorsOccurred si l'opération a échoué.

Avant le renvoi de WillChangeRecord, affectez adStatusCancel à ce paramètre pour demander l'annulation de l'opération ayant déclenché l'événement. Sinon, affectez adStatusUnwantedEvent à ce paramètre pour empêcher des notifications ultérieures.

Avant le renvoi de RecordChangeComplete, affectez adStatusUnwantedEvent à ce paramètre pour empêcher des notifications ultérieures.

pRecordset
Objet Recordset. Recordset pour lequel cet événement s'est produit.

Remarques

Un événement WillChangeRecord ou RecordChangeComplete peut se produire pour le premier champ modifié dans une ligne, à la suite des opérations Recordset suivantes : Update, Delete, CancelUpdate, AddNew, UpdateBatch et CancelBatch. La valeur CursorType de Recordset détermine les opérations qui déclenchent les événements.

Au cours de l'événement WillChangeRecord, la propriété Filter de Recordset prend la valeur adFilterAffectedRecords. Vous ne pouvez pas modifier cette propriété pendant le traitement de l'événement.

Vous devez affecter au paramètre adStatus la valeur adStatusUnwantedEvent pour chaque valeur adReason possible, afin d'arrêter complètement les notifications d'événements incluant un paramètre adReason.

Voir aussi

Exemple Visual C++

Résumé du gestionnaire d'événements ADO

S'applique à : Recordset, objet


WillChangeRecordset et RecordsetChangeComplete, événements (ADO)

Guide de référence de l'API ADO 2.5

WillChangeRecordset et RecordsetChangeComplete, événements

L'événement WillChangeRecordset est appelé avant qu'une opération en attente modifie Recordset. L'événement RecordsetChangeComplete est appelé après que Recordset a été modifié.

Syntaxe

WillChangeRecordset   adReason, adStatus, pRecordset
RecordsetChangeComplete   adReason, pError, adStatus, pRecordset

Paramètres

adReason
Valeur EventReasonEnum qui indique le motif de cet événement. Ce paramètre peut prendre pour valeur adRsnRequery, adRsnResynch, adRsnClose ou adRsnOpen.
adStatus
Valeur d'état EventStatusEnum.

Lors de l'appel de WillChangeRecord, ce paramètre prend la valeur adStatusOK si l'opération qui a déclenché l'événement a réussi. Il prend la valeur adStatusCantDeny si cet événement ne peut pas demander l'annulation de l'opération en attente.

Lors de l'appel de RecordsetChangeComplete, ce paramètre prend la valeur adStatusOK si l'opération qui a déclenché l'événement a réussi ; il prend la valeur adStatusErrorsOccurred si l'opération a échoué ou la valeur adStatusCancel si l'opération associée à l'événement WillChangeRecordset précédemment accepté est annulée.

Avant le renvoi de WillChangeRecordset, affectez adStatusCancel à ce paramètre pour demander l'annulation de l'opération en attente. Sinon, affectez adStatusUnwantedEvent à ce paramètre pour empêcher des notifications ultérieures.

Avant le renvoi de WillChangeRecordset ou RecordsetChangeComplete, affectez adStatusUnwantedEvent à ce paramètre pour empêcher des notifications ultérieures.

pError
Objet Error. Il décrit l'erreur survenue si la valeur de adStatus est adStatusErrorsOccurred ; sinon, il n'est pas défini.
pRecordset
Objet Recordset. Recordset pour lequel cet événement s'est produit.

Remarques

Un événement WillChangeRecordset ou RecordsetChangeComplete peut survenir à la suite des méthodes Requery ou Open de Recordset.

Si le fournisseur ne prend pas en charge les signets, une notification d'événement RecordsetChange se produit chaque fois que de nouvelles lignes sont récupérées auprès du fournisseur. La fréquence de cet événement dépend de la propriété RecordsetCacheSize.

Vous devez affecter au paramètre adStatus la valeur adStatusUnwantedEvent pour chaque valeur adReason possible, afin d'arrêter complètement les notifications d'événements incluant un paramètre adReason.

Voir aussi

Exemple Visual C++

Résumé du gestionnaire d'événements ADO

S'applique à : Recordset, objet


WillConnect, événement (ADO)

Guide de référence de l'API ADO 2.5

WillConnect, événement

L'événement WillConnect est appelé avant l'établissement d'une connexion.

Syntaxe

WillConnect ConnectionString, UserID, Password, Options, adStatus, pConnection

Paramètres

ConnectionString
Valeur de type String qui contient des informations relatives à la connexion en attente.
UserID
Valeur de type String qui contient un nom d'utilisateur pour la connexion en attente.
Password
Valeur de type String qui contient un mot de passe pour la connexion en attente.
Options
Valeur de type Long qui indique de quelle manière le fournisseur doit évaluer ConnectionString. Votre seule option est adAsyncOpen.
adStatus
Valeur d'état EventStatusEnum.

Lors de l'appel de cet événement, adStatusOK est affecté à ce paramètre par défaut. Ce dernier prend la valeur adStatusCantDeny si l'événement ne peut demander l'annulation de l'opération en attente.

Avant le renvoi de cet événement, affectez adStatusUnwantedEvent à ce paramètre pour empêcher des notifications ultérieures. Affectez adStatusCancel à ce paramètre pour demander l'opération de connexion qui a déclenché l'annulation de cette notification.

pConnection
Objet Connection pour lequel cette notification d'événement s'applique. Les modifications apportées aux paramètres de Connection par le gestionnaire d'événements WillConnect n'ont aucun effet sur Connection.

Remarques

Lorsque WillConnect est appelé, les paramètres ConnectionString, UserID, Password et Options prennent les valeurs établies par l'opération ayant déclenché l'événement (la connexion en attente), et peuvent être modifiés avant le renvoi de l'événement. WillConnect peut renvoyer une demande d'annulation de la connexion en attente.

Lorsque cet événement est annulé, ConnectComplete est appelé avec son paramètre adStatus dont la valeur est adStatusErrorsOccurred.

Voir aussi

Exemple Visual C++

Résumé du gestionnaire d'événements ADO

S'applique à : Connection, objet


WillExecute, événement (ADO)

Guide de référence de l'API ADO 2.5

WillExecute, événement

L'événement WillExecute est appelé juste avant l'exécution d'une commande en attente sur une connexion.

Syntaxe

WillExecute Source, CursorType, LockType, Options, adStatus, pCommand, pRecordset, pConnection

Paramètres

Source
Valeur de type String qui contient une commande SQL ou un nom de procédure stockée.
CursorType
Valeur CursorTypeEnum qui contient le type de curseur de l'objet Recordset à ouvrir. Grâce à ce paramètre, vous pouvez remplacer le type de curseur par un autre durant une opération Open de Recordset. CursorType est ignoré pour toutes les autres opérations.
LockType
Valeur LockTypeEnum qui contient le type de verrou de l'objet Recordset à ouvrir. Grâce à ce paramètre, vous pouvez remplacer le type de verrou par un autre durant une opération Open de Recordset. LockType est ignoré pour toutes les autres opérations.
Options
Valeur de type Long qui indique les options permettant d'exécuter la commande ou d'ouvrir Recordset.
adStatus
Valeur EventStatusEnum qui peut correspondre à adStatusCantDeny ou adStatusOK lorsque cet événement est appelé. S'il s'agit de la valeur adStatusCantDeny, cet événement ne peut demander l'annulation de l'opération en attente.

Avant le renvoi de cet événement, affectez adStatusUnwantedEvent à ce paramètre pour empêcher des notifications ultérieures. Sinon, affectez adStatusCancel pour demander l'annulation de l'opération ayant déclenché cet événement.

pCommand
Objet Command pour lequel cette notification d'événement s'applique.
pRecordset
Objet Recordset pour lequel cette notification d'événement s'applique.
pConnection
Objet Connection pour lequel cette notification d'événement s'applique.

Remarques

Un événement WillExecute peut se produire à la suite d'une méthode Connection. Execute, Command. Execute ou Recordset. Open. Le paramètre pConnection doit toujours contenir une référence valide à un objet Connection. Si le déclenchement de l'événement est lié à Connection.Execute, les paramètres pRecordset et pCommand prennent la valeur Nothing. Si le déclenchement de l'événement est lié à Recordset.Open, le paramètre pRecordset fait référence à l'objet Recordset et le paramètre pCommand prend la valeur Nothing. Si le déclenchement de l'événement est lié à Command.Execute, le paramètre pCommand fait référence à l'objet Command et le paramètre pRecordset prend la valeur Nothing.

WillExecute permet d'examiner et de modifier les paramètres d'exécution en attente. Cet événement peut renvoyer une demande d'annulation de la commande en attente.

Voir aussi

Exemple Visual C++

Résumé du gestionnaire d'événements ADO

S'applique à : Connection, objet

© 1998-2002 Microsoft Corporation. Tous droits réservés.


WillMove et MoveComplete, événements (ADO)

Guide de référence de l'API ADO 2.5

WillMove et MoveComplete, événements

L'événement WillMove est appelé avant qu'une opération en attente change la position actuelle dans Recordset. L'événement MoveComplete est appelé après modification de la position actuelle dans Recordset.

Syntaxe

WillMove adReason, adStatus, pRecordset
MoveComplete adReason, pError, adStatus, pRecordset

Paramètres

adReason
Valeur EventReasonEnum qui indique le motif de cet événement. Ce paramètre peut prendre pour valeur adRsnMoveFirst, adRsnMoveLast, adRsnMoveNext, adRsnMovePrevious, adRsnMove ou adRsnRequery.
pError
Objet Error. Il décrit l'erreur survenue si la valeur de adStatus est adStatusErrorsOccurred ; sinon, il n'est pas défini.
adStatus
Valeur d'état EventStatusEnum.

Lors de l'appel de WillMove, ce paramètre prend la valeur adStatusOK si l'opération qui a déclenché l'événement a réussi. Il prend la valeur adStatusCantDeny si cet événement ne peut pas demander l'annulation de l'opération en attente.

Lors de l'appel de MoveComplete, ce paramètre prend la valeur adStatusOK si l'opération qui a déclenché l'événement a réussi ; il prend la valeur adStatusErrorsOccurred si l'opération a échoué.

Avant le renvoi de WillMove, affectez adStatusCancel à ce paramètre pour demander l'annulation de l'opération en attente. Sinon, affectez adStatusUnwantedEvent à ce paramètre pour empêcher des notifications ultérieures.

Avant le renvoi de MoveComplete, affectez adStatusUnwantedEvent à ce paramètre pour empêcher des notifications ultérieures.

pRecordset
Objet Recordset. Recordset pour lequel cet événement s'est produit.

Remarques

Un événement WillMove ou MoveComplete peut se produire à la suite des opérations Recordset suivantes : Open, Move, MoveFirst, MoveLast, MoveNext, MovePrevious, AddNew et Requery. Le déclenchement de ces événements peut être lié aux propriétés suivantes : Filter, Index, Bookmark, AbsolutePage et AbsolutePosition. Ces événements se déclenchent également si un Recordset enfant est connecté à des événements Recordset et si le Recordset parent est déplacé.

Vous devez affecter au paramètre adStatus la valeur adStatusUnwantedEvent pour chaque valeur adReason possible, afin d'arrêter complètement les notifications d'événements incluant un paramètre adReason.

Voir aussi

Exemple Visual C++

Résumé du gestionnaire d'événements ADO

S'applique à : Recordset, objet


Constantes énumérées ADO

Pour faciliter le débogage, les énumérations ADO indiquent une valeur pour chaque constante. Cependant, cette valeur est purement indicative, et peut varier d'une version ADO à une autre. Votre code doit dépendre seulement du nom des constantes énumérées et non de leur valeur réelle.

ADCPROP_ASYNCTHREADPRIORITY_ENUM | Pour un objet Recordset RDS, spécifie la priorité d'exécution du thread asynchrone qui extrait les données.
ADCPROP_AUTORECALC_ENUM | Indique le moment où le fournisseur MSDataShape recalcule les colonnes groupées et calculées dans un Recordset hiérarchique.
ADCPROP_UPDATECRITERIA_ENUM | Spécifie les champs pouvant être utilisés pour détecter des conflits au cours de la mise à jour optimiste d'une ligne de la source de données avec un objet Recordset.
ADCPROP_UPDATERESYNC_ENUM | Spécifie si la méthode UpdateBatch est suivie d'une opération de méthode Resync implicite, et si tel est le cas, la portée de cette opération.
AffectEnum | Désigne les enregistrements affectés par une opération.
BookmarkEnum | Spécifie un signet indiquant où l'opération doit commencer.
CommandTypeEnum | Indique comment il faut interpréter un argument de commande.
CompareEnum | Indique la position relative de deux enregistrements représentés par leur signet.
ConnectModeEnum | Indique les autorisations disponibles pour la modification des données dans Connection, l'ouverture de Record ou la spécification des valeurs pour la propriété Mode des objets Record et Stream.
ConnectOptionEnum | Indique si la méthode Open d'un objet Connection doit renvoyer un résultat après (de manière synchrone) ou avant (de manière asynchrone) l'établissement de la connexion.
ConnectPromptEnum | Indique si une boîte de dialogue doit être affichée pour inviter l'utilisateur à entrer des paramètres manquants lors de l'ouverture d'une connexion à une source de données ODBC.
CopyRecordOptionsEnum | Spécifie le comportement de la méthode CopyRecord.
CursorLocationEnum | Indique l'emplacement du moteur du curseur.
CursorOptionEnum | Indique quelle fonctionnalité la méthode Supports doit tester.
CursorTypeEnum | Indique le type de curseur utilisé dans un objet Recordset.
DataTypeEnum | Indique le type de données d'un objet Field, Parameter ou Property.
EditModeEnum | Indique l'état de modification d'un enregistrement.
ErrorValueEnum | Indique le type d'erreur d'exécution ADO.
EventReasonEnum | Indique le motif de l'erreur qui s'est produite.
EventStatusEnum | Indique l'état d'un événement en cours d'exécution.
ExecuteOptionEnum | Indique comment un fournisseur doit exécuter une commande.
FieldEnum | Indique les champs spéciaux référencés dans la collection Fields d'un objet Record.
FieldAttributeEnum | Indique un ou plusieurs attributs d'un objet Field.
FieldStatusEnum | Indique l'état d'un objet Field.
FilterGroupEnum | Indique le groupe d'enregistrements à filtrer à partir de Recordset.
GetRowsOptionEnum | Indique le nombre d'enregistrements à extraire de Recordset.
IsolationLevelEnum | Indique le niveau d'isolation de transaction d'un objet Connection.
LineSeparatorsEnum | Indique le caractère utilisé comme séparateur de ligne dans les objets Stream de type texte.
LockTypeEnum | Indique le type de verrouillage des enregistrements lors des modifications.
MarshalOptionsEnum | Indique les enregistrements qui doivent être renvoyés au serveur.
MoveRecordOptionsEnum | Spécifie le comportement de la méthode MoveRecord de l'objet Record.
ObjectStateEnum | Indique si un objet est ouvert ou fermé, ou s'il est en cours de connexion à une source de données, d'exécution d'une commande ou de récupération de données.
ParameterAttributesEnum | Indique les attributs d'un objet Parameter.
ParameterDirectionEnum | Indique si l'objet Parameter correspond à un paramètre d'entrée, un paramètre de sortie ou les deux, ou si le paramètre est la valeur de renvoi d'une procédure stockée.
PersistFormatEnum | Indique le format dans lequel Recordset doit être enregistré.
PositionEnum | Indique la position actuelle du pointeur de l'enregistrement dans Recordset.
PropertyAttributesEnum | Indique les attributs d'un objet Property.
RecordCreateOptionsEnum | Indique pour la méthode Open de l'objet Record si un Record existant doit être ouvert ou si un Record doit être créé.
RecordOpenOptionsEnum | Indique les options d'ouverture de Record. Il est possible de combiner ces valeurs à l'aide d'un opérateur OR.
RecordStatusEnum | Indique l'état de l'enregistrement actuel par rapport à des mises à jour par lots ou à d'autres opérations par groupes.
RecordTypeEnum | Indique le type de l'objet Record.
ResyncEnum | Indique si les valeurs sous-jacentes sont remplacées par un appel de Resync.
SaveOptionsEnum | Indique si un fichier doit être créé ou remplacé lors de l'enregistrement à partir d'un objet Stream. Il est possible de combiner ces valeurs à l'aide d'un opérateur AND.
SchemaEnum | Indique le type de schéma Recordset que récupère la méthode OpenSchema. Indique le sens de recherche d'un enregistrement dans Recordset
SearchDirectionEnum | Indique le sens de recherche d'un enregistrement dans Recordset. Indique le type de méthode Seek à exécuter.
SeekEnum | Indique le type de méthode Seek à exécuter. Indique les options d'ouverture d'un objet Stream. Il est possible de combiner ces valeurs à l'aide d'un opérateur AND.
StreamOpenOptionsEnum | Indique les options d'ouverture d'un objet Stream. Il est possible de combiner ces valeurs à l'aide d'un opérateur AND. Indique s'il faut lire le flux entier ou seulement la ligne suivante dans un objet Stream.
StreamReadEnum | Indique s'il faut lire le flux entier ou seulement la ligne suivante dans un objet Stream. Indique le type de données stockées dans un objet Stream.
StreamTypeEnum | Indique le type de données stockées dans un objet Stream. Indique si un séparateur de lignes est ajouté à la chaîne écrite dans un objet Stream.
StreamWriteEnum | Indique si un séparateur de lignes est ajouté à la chaîne écrite dans un objet Stream. Indique le format dans lequel Recordset doit être extrait comme une chaîne.
StringFormatEnum | Indique le format dans lequel Recordset doit être extrait comme une chaîne. Indique les attributs de la transaction d'un objet Connection.
XactAttributeEnum | Indique les attributs de la transaction d'un objet Connection.

Voir aussi

Guide de référence de l'API ADO | Collections ADO | Propriétés dynamiques ADO | Erreurs ADO | Événements ADO | Méthodes ADO | Modèle d'objet ADO | Objets ADO | Propriétés ADO


ADCPROP_ASYNCTHREADPRIORITY_ENUM

Pour un objet Recordset RDS, spécifie la priorité d'exécution du thread asynchrone qui extrait les données.

Utilisez ces constantes avec la propriété dynamique Recordset « Background Thread Priority », qui est référencée dans l'index des propriétés dynamiques ADO OLE DB et documentée dans Microsoft Cursor Service for OLE DB.

Constante | Valeur | Description
adPriorityAboveNormal | 4 | Définit la priorité entre un degré normal et le degré le plus élevé.
adPriorityBelowNormal | 2 | Définit la priorité entre le degré le plus bas et un degré normal.
adPriorityHighest | 5 | Définit la priorité au degré le plus élevé possible.
AdPriorityLowest | 1 | Définit la priorité au degré le plus bas possible.
adPriorityNormal | 3 | Définit la priorité au degré normal.

Équivalent ADO/WFC

Package : com.ms.wfc.data

Constante
AdoEnums.AdcPropAsyncThreadPriority.ABOVENORMAL
AdoEnums.AdcPropAsyncThreadPriority.BELOWNORMAL
AdoEnums.AdcPropAsyncThreadPriority.HIGHEST
AdoEnums.AdcPropAsyncThreadPriority.LOWEST
AdoEnums.AdcPropAsyncThreadPriority.NORMAL


ADCPROP_AUTORECALC_ENUM

Indique le moment où le fournisseur MSDataShape recalcule les colonnes groupées et calculées dans un Recordset hiérarchique.

Ces constantes sont utilisées exclusivement avec le fournisseur MSDataShape et la propriété dynamique Recordset « Auto Recalc », qui est référencée dans l'index des propriétés dynamiques ADO et documentée dans Microsoft Cursor Service for OLE DB ou Microsoft Data Shaping Service for OLE DB.

Constante | Valeur | Description
adRecalcAlways | 1 | Valeur par défaut. Recalcule chaque fois que le fournisseur MSDataShape détermine que les valeurs dont dépendent les colonnes calculées ont changé.
adRecalcUpFront | 0 | Calcule seulement lors de la construction initiale du Recordset hiérarchique.

Équivalent ADO/WFC

Ces constantes n'ont pas d'équivalent ADO/WFC.


ADCPROP_UPDATECRITERIA_ENUM

Spécifie les champs pouvant être utilisés pour détecter des conflits au cours de la mise à jour optimiste d'une ligne de la source de données avec un objet Recordset.

Utilisez ces constantes avec la propriété dynamique Recordset « Update Criteria », qui est référencée dans l'index des propriétés dynamiques ADO et documentée dans Microsoft Cursor Service for OLE DB.

Constante | Valeur | Description
adCriteriaAllCols | 1 | Détecte des conflits en cas de modification d'une colonne de la ligne de la source de données.
adCriteriaKey | 0 | Détecte des conflits en cas de modification d'une colonne clé de la ligne de la source de données, ce qui signifie que la ligne a été supprimée.
adCriteriaTimeStamp | 3 | Détecte des conflits en cas de modification de l'horodatage de la ligne de la source de données, ce qui signifie qu'un accès à la ligne a eu lieu après l'obtention de Recordset.
adCriteriaUpdCols | 2 | Détecte des conflits en cas de modification des colonnes de ligne de source de données correspondant aux champs mis à jour de Recordset.

Équivalent ADO/WFC

Package : com.ms.wfc.data

Constante
AdoEnums.AdcPropUpdateCriteria.ALLCOLS
AdoEnums.AdcPropUpdateCriteria.KEY
AdoEnums.AdcPropUpdateCriteria.TIMESTAMP
AdoEnums.AdcPropUpdateCriteria.UPDCOLS


ADCPROP_UPDATERESYNC_ENUM

Spécifie si la méthode UpdateBatch est suivie d'une opération de méthode Resync implicite, et si tel est le cas, la portée de cette opération.

Constante | Valeur | Description
adResyncAll | 15 | Invoque Resync avec la valeur combinée de tous les autres membres ADCPROP_UPDATERESYNC_ENUM.
adResyncAutoIncrement | 1 | Valeur par défaut. Tente d'extraire la nouvelle valeur d'identité des colonnes qui sont automatiquement incrémentées ou générées par la source de données, par exemple les champs AutoNumber de Microsoft Jet ou les colonnes Identity de Microsoft SQL Server.
adResyncConflicts | 2 | Invoque Resync pour toutes les lignes dans lesquelles la mise à jour ou la suppression a échoué du fait d'un conflit de simultanéité.
adResyncInserts | 8 | Invoque Resync pour toutes les lignes insérées avec succès. Cependant, les valeurs de la colonne AutoIncrement ne sont pas resynchronisées. Le contenu des lignes nouvellement insérées est plutôt resynchronisé en fonction de la valeur de la clé primaire existante. Si la clé primaire est une valeur de AutoIncrement, Resync n'extrait pas le contenu de la ligne envisagée. Pour incrémenter automatiquement les valeurs de la clé primaire AutoIncrement, appelez UpdateBatch avec la valeur combinée de adResyncAutoIncrement + adResyncInserts.
adResyncNone | 0 | N'invoque pas Resync.
adResyncUpdates | 4 | Invoque Resync pour toutes les lignes mises à jour avec succès.

Voir aussi

S'applique à : Update Resync, propriété—dynamique (ADO)


AffectEnum

Désigne les enregistrements affectés par une opération.

Constante | Valeur | Description
adAffectAll 3 Si aucun filtre n'est appliqué à Recordset, affecte tous les enregistrements.

Si un critère de chaîne (tel que « Author='Smith' ») est attribué à la propriété Filter, l'opération affecte alors les enregistrements visibles dans le chapitre actuel.

Si un membre de FilterGroupEnum ou un tableau de signets est attribué à la propriété Filter, l'opération affecte alors toutes les lignes de Recordset.

Remarque adAffectAll est masqué dans l'Explorateur d'objets de Visual Basic.
adAffectAllChapters | 4 | Affecte tous les enregistrements dans l'ensemble des chapitres frères de Recordset, notamment ceux qui ne sont pas visibles en raison de l'application d'un filtre.
adAffectCurrent | 1 | Affecte uniquement l'enregistrement actuel.
adAffectGroup | 2 | Affecte uniquement les enregistrements qui correspondent aux paramètres actuels de la propriété Filter. Vous devez attribuer à la propriété Filter une valeur FilterGroupEnum ou un tableau de signets pour pouvoir utiliser cette option.

Équivalent ADO/WFC

Package : com.ms.wfc.data

Constante
AdoEnums.Affect.ALL
AdoEnums.Affect.ALLCHAPTERS
AdoEnums.Affect.CURRENT
AdoEnums.Affect.GROUP

Voir aussi

S'applique à : CancelBatch, méthode | Delete, méthode (objet ADO Recordset) | Resync, méthode | UpdateBatch, méthode


BookmarkEnum

Spécifie un signet indiquant où l'opération doit commencer.

Constante | Valeur | Description
adBookmarkCurrent | 0 | Commence à l'enregistrement actuel.
adBookmarkFirst | 1 | Commence au premier enregistrement.
adBookmarkLast | 2 | Commence au dernier enregistrement.

Équivalent ADO/WFC

Package : com.ms.wfc.data

Constante
AdoEnums.Bookmark.CURRENT
AdoEnums.Bookmark.FIRST
AdoEnums.Bookmark.LAST

S'applique à : GetRows, méthode | Move, méthode


CommandTypeEnum

Indique comment il faut interpréter un argument de commande.

Constante | Valeur | Description
adCmdUnspecified | -1 | Ne spécifie pas l'argument de type de commande.
adCmdText | 1 | CommandText correspond à la définition textuelle d'une commande ou d'un appel de procédure stockée.
adCmdTable | 2 | CommandText correspond au nom d'une table dont les colonnes sont toutes renvoyées par une requête SQL générée en interne.
adCmdStoredProc | 4 | CommandText correspond au nom d'une procédure stockée.
adCmdUnknown | 8 | Valeur par défaut. Indique que le type de commande spécifié dans la propriété CommandText n'est pas connu.
adCmdFile | 256 | CommandText correspond au nom de fichier d'un Recordset stocké de façon permanente. S'utilise uniquement avec Recordset. Open ou Requery.
adCmdTableDirect | 512 | CommandText correspond au nom d'une table dont les colonnes sont toutes renvoyées. S'utilise uniquement avec Recordset.Open ou Requery. Pour permettre l'utilisation de la méthode Seek, Recordset doit être ouvert via adCmdTableDirect. Cette valeur ne peut pas être combinée avec la valeur ExecuteOptionEnum adAsyncExecute.

Équivalent ADO/WFC

Package : com.ms.wfc.data

Constante
AdoEnums.CommandType.UNSPECIFIED
AdoEnums.CommandType.TEXT
AdoEnums.CommandType.TABLE
AdoEnums.CommandType.STOREDPROC
AdoEnums.CommandType.UNKNOWN
AdoEnums.CommandType.FILE
AdoEnums.CommandType.TABLEDIRECT

Voir aussi

S'applique à : CommandType, propriété | Execute, méthode (objet ADO Command) | Execute, méthode (objet ADO Connection) | Open, méthode (objet ADO Recordset) | Requery, méthode


CompareEnum

Indique la position relative de deux enregistrements représentés par leur signet.

Constante | Valeur | Description
adCompareEqual | 1 | Indique une égalité des signets.
adCompareGreaterThan | 2 | Indique que le premier signet se situe après le deuxième.
adCompareLessThan | 0 | Indique que le premier signet se situe avant le deuxième.
adCompareNotComparable | 4 | Indique que les signets ne peuvent pas être comparés.
adCompareNotEqual | 3 | Indique que les signets ne sont pas égaux et ne sont pas triés.

Équivalent ADO/WFC

Package : com.ms.wfc.data

Constante
AdoEnums.Compare.EQUAL
AdoEnums.Compare.GREATERTHAN
AdoEnums.Compare.LESSTHAN
AdoEnums.Compare.NOTCOMPARABLE
AdoEnums.Compare.NOTEQUAL

S'applique à : CompareBookmarks, méthode


ConnectModeEnum

Indique les autorisations disponibles pour la modification des données dans Connection, l'ouverture de Record ou la spécification des valeurs pour la propriété Mode des objets Record et Stream.

Constante | Valeur | Description
adModeRead | 1 | Lecture seule.
adModeReadWrite | 3 | Lecture et écriture.
adModeRecursive | 0x400000 | Utilisée conjointement avec les autres valeurs *ShareDeny* (adModeShareDenyNone, adModeShareDenyWrite ou adModeShareDenyRead) pour propager les restrictions de partage à tous les sous-enregistrements du Record actuel. Elle n'a aucun effet si Record n'a pas d'enfant. Une erreur d'exécution est générée si elle est utilisée avec adModeShareDenyNone uniquement. Cependant, elle peut être utilisée avec adModeShareDenyNone lorsqu'elle est combinée à d'autres valeurs. Par exemple, vous pouvez utiliser « adModeRead, adModeShareDenyNone ou adModeRecursive ».
adModeShareDenyNone | 16 | Ouverture de connexion accordée aux autres utilisateurs ayant une autorisation. L'accès ne peut être refusé à ces utilisateurs, ni en lecture ni en écriture.
adModeShareDenyRead | 4 | Ouverture de connexion interdite pour les utilisateurs disposant d'une autorisation d'accès en lecture.
adModeShareDenyWrite | 8 | Ouverture de connexion interdite pour les utilisateurs disposant d'une autorisation d'accès en écriture.
adModeShareExclusive | 12 | Ouverture de connexion interdite aux autres utilisateurs.
adModeUnknown | 0 | Valeur par défaut. Indique que les autorisations n'ont pas encore été définies ou ne peuvent pas être déterminées.
adModeWrite | 2 | Écriture seule.

Équivalent ADO/WFC

Package : com.ms.wfc.data

Constante
AdoEnums.ConnectMode.READ
AdoEnums.ConnectMode.READWRITE
(AdoEnums.ConnectMode.RECURSIVE n'a pas d'équivalent)
AdoEnums.ConnectMode.SHAREDENYNONE
AdoEnums.ConnectMode.SHAREDENYREAD
AdoEnums.ConnectMode.SHAREDENYWRITE
AdoEnums.ConnectMode.SHAREEXCLUSIVE
AdoEnums.ConnectMode.UNKNOWN
AdoEnums.ConnectMode.WRITE

Voir aussi

S'applique à : Mode, propriété | Open, méthode (objet ADO Record) | Open, méthode (objet ADO Stream) | Stream, objet


ConnectOptionEnum

Indique si la méthode Open d'un objet Connection doit renvoyer un résultat après (de manière synchrone) ou avant (de manière asynchrone) l'établissement de la connexion.

Constante | Valeur | Description
adAsyncConnect | 16 | Ouvre la connexion en mode asynchrone. L'événement ConnectComplete peut être utilisé pour déterminer le moment où la connexion est disponible.
adConnectUnspecified | -1 | Valeur par défaut. Ouvre la connexion en mode synchrone.

Équivalent ADO/WFC

Package : com.ms.wfc.data

Constante
AdoEnums.ConnectOption.ASYNCCONNECT
AdoEnums.ConnectOption.CONNECTUNSPECIFIED

Voir aussi

S'applique à : Open, méthode (objet ADO Connection)


ConnectPromptEnum

Indique si une boîte de dialogue doit être affichée pour inviter l'utilisateur à entrer les paramètres manquants lors de l'ouverture d'une connexion à une source de données.

Constante | Valeur | Description
adPromptAlways | 1 | Invite toujours.
adPromptComplete | 2 | Invite si des informations supplémentaires sont requises.
adPromptCompleteRequired | 3 | Invite si des informations supplémentaires sont requises, mais que les paramètres facultatifs ne sont pas permis.
adPromptNever | 4 | N'invite jamais

Équivalent ADO/WFC

Package : com.ms.wfc.data

Constante
AdoEnums.ConnectPrompt.ALWAYS
AdoEnums.ConnectPrompt.COMPLETE
AdoEnums.ConnectPrompt.COMPLETEREQUIRED
AdoEnums.ConnectPrompt.NEVER

Voir aussi

S'applique à : Prompt, propriété—dynamique (ADO)


CopyRecordOptionsEnum

Spécifie le comportement de la méthode CopyRecord.

Constante | Valeur | Description
adCopyAllowEmulation | 4 | Indique que le fournisseur de Source tente de simuler la copie par des opérations de téléchargement si cette méthode échoue du fait que Destination se trouve sur un serveur différent ou est pris en charge par un fournisseur autre que celui de Source. Notez que les différences de capacités entre les fournisseurs peuvent réduire les performances ou provoquer une perte de données.
adCopyNonRecursive | 2 | Copie le répertoire actuel, mais aucun de ses sous-répertoires, vers la destination. L'opération de copie n'est pas récursive.
adCopyOverWrite | 1 | Écrase le fichier ou le répertoire si Destination pointe vers un fichier ou un répertoire existant.
adCopyUnspecified | -1 | Valeur par défaut. Effectue l'opération de copie par défaut : l'opération échoue si le fichier ou répertoire de destination existe déjà, et que la copie s'exécute de façon récursive.

Équivalent ADO/WFC

Ces constantes n'ont pas d'équivalent ADO/WFC.

S'applique à : CopyRecord, méthode


CursorLocationEnum

Indique l'emplacement du service cursor.

Constante | Valeur | Description
adUseClient | 3 | Utilise des curseurs côté client fournis par une bibliothèque de curseurs locaux. En règle générale, les services de curseurs locaux autorisent l'exécution d'un bon nombre de fonctions interdites par les curseurs externes ; par conséquent, ce paramètre peut présenter un avantage compte tenu des fonctions offertes. Pour des raisons de compatibilité ascendante, le synonyme adUseClientBatch est également pris en charge.
adUseNone | 1 | N'utilise pas les services de curseurs. (Cette constante est obsolète et n'est proposée que pour des raisons de compatibilité ascendante.)
adUseServer | 2 | Valeur par défaut. Utilise les curseurs fournis par les fournisseurs de données ou les pilotes. Ces curseurs sont parfois très souples d'emploi et plus sensibles aux modifications apportées par d'autres utilisateurs à la source de données. Certaines fonctions de Microsoft Cursor Service for OLE DB (comme les objets Recordset dissociés) ne peuvent cependant pas être simulées avec des curseurs côté serveur et ces fonctionnalités ne seront pas disponibles si ce paramètre est choisi.

Équivalent ADO/WFC

Package : com.ms.wfc.data

Constante
AdoEnums.CursorLocation.CLIENT
AdoEnums.CursorLocation.NONE
AdoEnums.CursorLocation.SERVER

S'applique à : CursorLocation, propriété


CursorOptionEnum

Indique quelle fonctionnalité la méthode Supports doit tester.

Constante | Valeur | Description
adAddNew | 0x1000400 | Vous pouvez utiliser la méthode AddNew pour ajouter de nouveaux enregistrements.
adApproxPosition | 0x4000 | Vous pouvez utiliser les propriétés AbsolutePosition et AbsolutePage.
adBookmark | 0x2000 | Vous pouvez utiliser la propriété Bookmark pour accéder à des enregistrements spécifiques.
adDelete | 0x1000800 | Vous pouvez utiliser la méthode Delete pour supprimer des enregistrements.
adFind | 0x80000 | Vous pouvez utiliser la méthode Find pour localiser une ligne dans Recordset.
adHoldRecords | 0x100 | Extrait davantage d'enregistrements ou modifie la position d'extraction qui suit, sans valider toutes les modifications en attente.
adIndex | 0x100000 | Vous pouvez utiliser la propriété Index pour nommer un index.
adMovePrevious | 0x200 | Vous pouvez utiliser les méthodes MoveFirst et MovePrevious, ainsi que les méthodes Move ou GetRows pour faire reculer la position de l'enregistrement actuel sans recourir à des signets.
adNotify | 0x40000 | Indique que le fournisseur de données sous-jacent prend en charge les notifications (ce qui permet de déterminer si les événements Recordset sont pris en charge).
adResync | 0x20000 | Vous pouvez utiliser la méthode Resync pour mettre à jour le curseur à l'aide des données visibles dans la base de données sous-jacente.
adSeek | 0x200000 | Vous pouvez utiliser la méthode Seek pour localiser une ligne dans Recordset.
adUpdate | 0x1008000 | Vous pouvez utiliser la méthode Update pour modifier des données existantes.
adUpdateBatch | 0x10000 | Vous pouvez utiliser les méthodes de mise à jour par lots (UpdateBatch et CancelBatch) pour transmettre des groupes de modifications au fournisseur.

Équivalent ADO/WFC

Package : com.ms.wfc.data

Constante
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

S'applique à : Supports, méthode


CursorTypeEnum

Indique le type de curseur utilisé dans un objet Recordset.

Constante | Valeur | Description
adOpenDynamic | 2 | Utilise un curseur dynamique. Les ajouts, modifications et suppressions effectués par d'autres utilisateurs sont visibles et tous les déplacements sont possibles dans Recordset, sauf pour les signets, si ces derniers ne sont pas pris en charge par le fournisseur.
adOpenForwardOnly | 0 | Valeur par défaut. Utilise un curseur à défilement en avant. Identique à un curseur statique mais ne permettant que de faire défiler les enregistrements vers l'avant. Ceci accroît les performances lorsque vous ne devez effectuer qu'un seul passage dans Recordset.
adOpenKeyset | 1 | Utilise un curseur à jeu de clés. Identique à un curseur dynamique mais ne permettant pas de voir les enregistrements ajoutés par d'autres utilisateurs (les enregistrements supprimés par d'autres utilisateurs ne sont pas accessibles à partir de votre Recordset). Les modifications de données effectuées par d'autres utilisateurs demeurent visibles.
adOpenStatic | 3 | Utilise un curseur statique. Copie statique d'un jeu d'enregistrements qui permet de trouver des données ou de générer des états. Les ajouts, modifications ou suppressions effectuées par d'autres utilisateurs ne sont pas visibles.
adOpenUnspecified | -1 | N'indique pas le type de curseur.

Équivalent ADO/WFC

Package : com.ms.wfc.data

Constante
AdoEnums.CursorType.DYNAMIC
AdoEnums.CursorType.FORWARDONLY
AdoEnums.CursorType.KEYSET
AdoEnums.CursorType.STATIC
AdoEnums.CursorType.UNSPECIFIED

S'applique à : CursorType, propriété


DataTypeEnum

Indique le type de données d'un objet Field, Parameter ou Property. L'indicateur de type OLE DB correspondant figure entre parenthèses dans la colonne Description du tableau ci-dessous. Pour plus d'informations sur les types de données OLE DB, consultez le chapitre 13 et l'Annexe A du Guide de référence du programmeur OLE DB.

Constante | Valeur | Description
AdArray (Ne s'applique pas à ADOX.) | 0x2000 | Valeur indicateur, toujours combinée avec une constante d'un autre type de données, qui indique un tableau de cet autre type de données.
adBigInt | 20 | Entier signé de 8 octets (DBTYPE_I8).
adBinary | 128 | Valeur binaire (DBTYPE_BYTES).
adBoolean | 11 | Valeur booléenne (DBTYPE_BOOL).
adBSTR | 8 | Chaîne de caractères terminée par une valeur Null (Unicode) (DBTYPE_BSTR).
adChapter | 136 | Valeur de chapitre de 4 octets identifiant les lignes dans un ensemble de lignes enfant (DBTYPE_HCHAPTER).
adChar | 129 | Valeur de chaîne (DBTYPE_STR).
adCurrency | 6 | Valeur monétaire de type devise (DBTYPE_CY). Une devise est un nombre à décimales fixes avec 4 chiffres placés après la virgule. Elle est stockée dans un entier signé de 8 octets, ajusté à 1/10 000.
adDate | 7 | Valeur de type date (DBTYPE_DATE). Une date est stockée en tant que double dont la partie entière correspond au nombre de jours écoulés depuis le 30 décembre 1899, et la partie fractionnaire à une fraction d'un jour.
adDBDate | 133 | Date (aaaammjj) (DBTYPE_DBDATE.
adDBTime | 134 | Heure (hhmmss) (DBTYPE_DBTIME).
adDBTimeStamp | 135 | Valeur d'horodatage (aaaammjjhhmmss plus une fraction en milliardièmes) (DBTYPE_DBTIMESTAMP).
adDecimal | 14 | Valeur numérique exacte possédant une précision et une échelle fixes (DBTYPE_DECIMAL).
adDouble | 5 | Valeur à virgule flottante et double précision (DBTYPE_R8).
adEmpty | 0 | Aucune valeur n'est spécifiée (DBTYPE_EMPTY).
adError | 10 | Code d'erreur 32 bits (DBTYPE_ERROR).
adFileTime | 64 | Valeur 64 bits représentant le nombre d'intervalles de 100 nanosecondes écoulées depuis le 1er janvier 1601 (DBTYPE_FILETIME).
adGUID | 72 | Identificateur universel unique (GUID) (DBTYPE_GUID).
adIDispatch | 9 | Pointeur désignant l'interface IDispatch d'un objet COM (DBTYPE_IDISPATCH). Remarque Ce type de données n'est pas pris en charge pour l'instant par ADO. Son utilisation peut produire des résultats imprévisibles.
adInteger | 3 | Entier signé de 4 octets (DBTYPE_I4).
adIUnknown | 13 | Pointeur désignant l'interface IUnknown d'un objet COM (DBTYPE_IUNKNOWN). Remarque Ce type de données n'est pas pris en charge pour l'instant par ADO. Son utilisation peut produire des résultats imprévisibles.
adLongVarBinary | 205 | Valeur binaire de type Long.
adLongVarChar | 201 | Valeur de chaîne de type Long.
adLongVarWChar | 203 | Chaîne Unicode de type Long se terminant par une valeur Null.
adNumeric | 131 | Valeur numérique exacte avec une précision et une échelle fixes (DBTYPE_NUMERIC).
adPropVariant | 138 | PROPVARIANT Automation (DBTYPE_PROP_VARIANT).
adSingle | 4 | Valeur à virgule flottante et simple précision (DBTYPE_R4).
adSmallInt | 2 | Entier signé de 2 octets (DBTYPE_I2).
adTinyInt | 16 | Entier signé de 1 octet (DBTYPE_I1).
adUnsignedBigInt | 21 | Entier non signé de 8 octets (DBTYPE_UI8).
adUnsignedInt | 19 | Entier non signé de 4 octets (DBTYPE_UI4).
adUnsignedSmallInt | 18 | Entier non signé de 2 octets (DBTYPE_UI2).
adUnsignedTinyInt | 17 | Entier non signé de 1 octet (DBTYPE_UI1).
adUserDefined | 132 | Variable définie par l'utilisateur (DBTYPE_UDT).
adVarBinary | 204 | Valeur binaire (objet Parameter uniquement).
adVarChar | 200 | Valeur de chaîne.
adVariant | 12 | Variant Automation (DBTYPE_VARIANT). Remarque Ce type de données n'est pas pris en charge pour l'instant par ADO. Son utilisation peut produire des résultats imprévisibles.
adVarNumeric | 139 | Valeur numérique (objet Parameter uniquement).
adVarWChar | 202 | Chaîne de caractères Unicode se terminant par une valeur Null.
adWChar | 130 | Chaîne de caractères Unicode se terminant par une valeur Null (DBTYPE_WSTR).

Équivalent ADO/WFC

Package : com.ms.wfc.data

Constante
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

Voir aussi

S'applique à : Append, méthode | CreateParameter, méthode | CreateRecordset, méthode (RDS) | Type, propriété


EditModeEnum

Indique l'état de modification d'un enregistrement.

Constante | Valeur | Description
adEditNone | 0 | Aucune modification en cours.
adEditInProgress | 1 | Les données de l'enregistrement actuel ont été modifiées mais pas enregistrées.
adEditAdd | 2 | La méthode AddNew a été appelée. Par ailleurs, l'enregistrement actuel situé en mémoire tampon est nouveau mais n'a pas encore été enregistré dans la base de données.
adEditDelete | 4 | L'enregistrement actuel a été supprimé.

Équivalent ADO/WFC

Package : com.ms.wfc.data

Constante
AdoEnums.EditMode.NONE
AdoEnums.EditMode.INPROGRESS
AdoEnums.EditMode.ADD
AdoEnums.EditMode.DELETE

S'applique à : EditMode, propriété


ErrorValueEnum

Indique le type d'erreur d'exécution ADO.

Trois formes de code d'erreur sont répertoriées :

  • Décimale positive : les deux octets de poids faible du nombre complet sont au format décimal. Ce nombre est affiché dans la boîte de dialogue des messages d'erreur par défaut de Visual Basic. Par exemple, Erreur d'exécution « 3707 ».
  • Décimale négative : version décimale du code d'erreur complet.
  • Hexadécimale : représentation hexadécimale du code d'erreur complet. Le code produit Windows figure dans le quatrième chiffre. Le code produit des codes d'erreur ADO est A. Par exemple : 0x800A0E7B.
Remarque Les erreurs OLE DB sont susceptibles d'être transmises à votre application ADO. En règle générale, elles peuvent être identifiées par le code de service Windows 4. Par exemple, 0x8004... Pour plus d'informations sur ces codes, consultez le chapitre 16 du Guide de référence du programmeur OLE DB.
Constante | Valeur | Description
adErrBoundToCommand | 3707 -2146824581 0x800A0E7B | Impossible de modifier la propriété ActiveConnection d'un objet Recordset dont la source est un objet Command.
adErrCannotComplete | 3732 -2146824556 0x800A0E94 | Le serveur ne peut pas terminer l'opération.
adErrCantChangeConnection | 3748 -2146824540 0x800A0EA4 | Connexion refusée. La nouvelle connexion demandée a des caractéristiques différentes de celle qui est en cours d'utilisation.
adErrCantChangeProvider | 3220 -2146825068 0X800A0C94 | Le fournisseur indiqué est différent de celui déjà utilisé.
adErrCantConvertvalue | 3724 -2146824564 0x800A0E8C | Impossible de convertir la valeur des données pour d'autres raisons qu'une non-concordance des signatures ou un débordement de données. Par exemple, la conversion a entraîné une troncation des données.
adErrCantCreate | 3725 -2146824563 0x800A0E8D | Impossible de définir ou d'extraire la valeur des données car le type de données de champ est inconnu ou le fournisseur ne dispose pas des ressources suffisantes pour exécuter l'opération.
adErrCatalogNotSet | 3747 -2146824541 0x800A0EA3 | Cette opération nécessite un ParentCatalog valide.
adErrColumnNotOnThisRow | 3726 -2146824562 0x800A0E8E | L'enregistrement ne contient pas ce champ.
adErrDataConversion | 3421 -2146824867 0x800A0D5D | L'application utilise une valeur d'un type incorrect pour l'opération en cours.
adErrDataOverflow | 3721 -2146824567 0x800A0E89 | La valeur des données est trop grande pour être représentée par le type de données du champ.
adErrDelResOutOfScope | 3738 -2146824550 0x800A0E9A | L'URL de l'objet à supprimer se trouve hors de portée de l'enregistrement actuel.
adErrDenyNotSupported | 3750 -2146824538 0x800A0EA6 | Le fournisseur ne prend pas en charge les restrictions de partage.
adErrDenyTypeNotSupported | 3751 -2146824537 0x800A0EA7 | Le fournisseur ne prend pas en charge le type de restriction de partage demandé.
adErrFeatureNotAvailable | 3251 -2146825037 0x800A0CB3 | Le fournisseur ou l'objet ne prend pas en charge l'opération demandée.
adErrFieldsUpdateFailed | 3749 -2146824539 0x800A0EA5 | Échec de la mise à jour des champs. Pour plus d'informations, examinez la propriété Status d'objets champs individuels.
adErrIllegalOperation | 3219 -2146825069 0x800A0C93 | L'opération demandée n'est pas autorisée dans ce contexte.
adErrIntegrityViolation | 3719 -2146824569 0x800A0E87 | La valeur des données est en conflit avec les contraintes d'intégrité du champ.
adErrInTransaction | 3246 -2146825042 0x800A0CAE | Un objet connexion ne peut pas être explicitement fermé pendant une transaction.
adErrInvalidArgument | 3001 -2146825287 0x800A0BB9 | Les arguments sont de type incorrect, en dehors des limites autorisées ou en conflit les uns avec les autres.
adErrInvalidConnection | 3709 -2146824579 0x800A0E7D | Impossible d'utiliser la connexion pour effectuer cette opération. Soit la connexion est fermée, soit elle n'est pas valide dans ce contexte.
adErrInvalidParamInfo | 3708 -2146824580 0x800A0E7C | Objet Parameter défini de manière incorrecte. Des informations incohérentes ou incomplètes ont été fournies.
adErrInvalidTransaction | 3714 -2146824574 0x800A0E82 | La transaction de coordination n'est pas valide ou n'a pas démarré.
adErrInvalidURL | 3729 -2146824559 0x800A0E91 | L'URL contient des caractères non valides. Assurez-vous que l'URL a été saisie correctement.
adErrItemNotFound | 3265 -2146825023 0x800A0CC1 | Impossible de trouver l'élément dans la collection correspondant au nom ou à la valeur ordinale demandée.
adErrNoCurrentRecord | 3021 -2146825267 0x800A0BCD | Soit BOF ou EOF a la valeur True, soit l'enregistrement actuel a été supprimé. L'opération demandée exige un enregistrement actif.
adErrNotExecuting | 3715 -2146824573 0x800A0E83 | Impossible d'effectuer cette opération hors exécution.
adErrNotReentrant | 3710 -2146824578 0x800A0E7E | Impossible d'effectuer cette opération lors du traitement d'un événement.
adErrObjectClosed | 3704 -2146824584 0x800A0E78 | Cette opération n'est pas autorisée si l'objet est fermé.
adErrObjectInCollection | 3367 -2146824921 0x800A0D27 | Objet déjà présent dans la collection. Ajout impossible.
adErrObjectNotSet | 3420 -2146824868 0x800A0D5C | L'objet n'est plus valide.
adErrObjectOpen | 3705 -2146824583 0x800A0E79 | Cette opération n'est pas autorisée si l'objet est ouvert.
adErrOpeningFile | 3002 -2146825286 0x800A0BBA | Impossible d'ouvrir le fichier.
adErrOperationCancelled | 3712 -2146824576 0x800A0E80 | L'opération a été annulée par l'utilisateur.
adErrOutOfSpace | 3734 -2146824554 0x800A0E96 | Impossible d'effectuer cette opération. Le fournisseur ne peut pas obtenir un espace de stockage suffisant.
adErrPermissionDenied | 3720 -2146824568 0x800A0E88 | Des droits insuffisants empêchent l'écriture dans ce champ.
adErrProviderFailed | 3000 -2146825288 0x800A0BB8 | Le fournisseur n'a pas pu effectuer l'opération demandée.
adErrProviderNotFound | 3706 -2146824582 0x800A0E7A | Impossible de trouver le fournisseur. Il est peut-être mal installé.
adErrReadFile | 3003 -2146825285 0x800A0BBB | Impossible de lire le fichier.
adErrResourceExists | 3731 -2146824557 0x800A0E93 | Impossible d'effectuer l'opération de copie. L'objet spécifié par l'URL de destination existe déjà. Spécifiez adCopyOverwrite pour remplacer l'objet.
adErrResourceLocked | 3730 -2146824558 0x800A0E92 | L'objet représenté par l'URL spécifiée est verrouillé par un ou plusieurs autres processus. Attendez la fin de ces processus et réessayez.
adErrResourceOutOfScope | 3735 -2146824553 0x800A0E97 | L'URL source ou de destination est hors de portée de l'enregistrement actuel.
adErrSchemaViolation | 3722 -2146824566 0x800A0E8A | La valeur des données est en conflit avec le type de données ou les contraintes d'intégrité du champ.
adErrSignMismatch | 3723 -2146824565 0x800A0E8B | Échec de la conversion car la valeur des données est signée alors que le type de données de champ utilisé par le fournisseur est non signé.
adErrStillConnecting | 3713 -2146824575 0x800A0E81 | Impossible d'effectuer cette opération lors d'une connexion asynchrone.
adErrStillExecuting | 3711 -2146824577 0x800A0E7F | Impossible d'effectuer cette opération lors d'une exécution asynchrone.
adErrTreePermissionDenied | 3728 -2146824560 0x800A0E90 | Autorisations insuffisantes pour accéder à l'arbre ou au sous-arbre.
adErrUnavailable | 3736 -2146824552 0x800A0E98 | L'opération a échoué et l'état n'est pas disponible. Peut-être que le champ n'est pas disponible ou que l'opération n'a pas été tentée.
adErrUnsafeOperation | 3716 -2146824572 0x800A0E84 | Les paramètres de sécurité définis sur cet ordinateur interdisent l'accès à une source de données située sur un autre domaine.
adErrURLDoesNotExist | 3727 -2146824561 0x800A0E8F | L'URL source ou le parent de l'URL de destination n'existe pas.
adErrURLNamedRowDoesNotExist | 3737 -2146824551 0x800A0E99 | L'enregistrement spécifié par cette URL n'existe pas.
adErrVolumeNotFound | 3733 -2146824555 0x800A0E95 | Le fournisseur ne peut pas localiser le périphérique de stockage indiqué par l'URL. Assurez-vous que l'URL a été saisie correctement.
adErrWriteFile | 3004 -2146825284 0x800A0BBC | Impossible d'écrire dans le fichier.
adWrnSecurityDialog | 3717 -2146824571 0x800A0E85 | À usage interne seulement. Ne pas utiliser.
adWrnSecurityDialogHeader | 3718 -2146824570 0x800A0E86 | À usage interne seulement. Ne pas utiliser.

Équivalent ADO/WFC

Package : com.ms.wfc.data

Seuls les sous-ensembles d'équivalents ADO/WFC suivants sont définis.

Constante
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

Voir aussi

Codes d'erreur ADO

S'applique à : Number, propriété


EventReasonEnum

Indique le motif de l'erreur qui s'est produite.

Constante | Valeur | Description
adRsnAddNew | 1 | Une opération a ajouté un nouvel enregistrement.
adRsnClose | 9 | Une opération a fermé Recordset.
adRsnDelete | 2 | Une opération a supprimé un enregistrement.
adRsnFirstChange | 11 | Une opération a effectué la première modification dans un enregistrement.
adRsnMove | 10 | Une opération a déplacé le pointeur de l'enregistrement dans Recordset.
adRsnMoveFirst | 12 | Une opération a déplacé le pointeur de l'enregistrement jusqu'au premier enregistrement dans Recordset.
adRsnMoveLast | 15 | Une opération a déplacé le pointeur de l'enregistrement jusqu'au dernier enregistrement dans Recordset.
adRsnMoveNext | 13 | Une opération a déplacé le pointeur de l'enregistrement jusqu'à l'enregistrement suivant dans Recordset.
adRsnMovePrevious | 14 | Une opération a déplacé le pointeur de l'enregistrement jusqu'à l'enregistrement précédent dans Recordset.
adRsnRequery | 7 | Une opération a réinterrogé Recordset.
adRsnResynch | 8 | Une opération a resynchronisé Recordset avec la base de données.
adRsnUndoAddNew | 5 | Une opération a annulé l'ajout d'un nouvel enregistrement.
adRsnUndoDelete | 6 | Une opération a annulé la suppression d'un enregistrement.
adRsnUndoUpdate | 4 | Une opération a annulé la mise à jour d'un enregistrement.
adRsnUpdate | 3 | Une opération a mis à jour un enregistrement.

Équivalent ADO/WFC

Package : com.ms.wfc.data

Constante
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

Voir aussi

S'applique à : WillChangeRecord et RecordChangeComplete, événements | WillChangeRecordset et RecordsetChangeComplete, événements | WillMove et MoveComplete, événements


EventStatusEnum

Indique l'état d'un événement en cours d'exécution.

Constante | Valeur | Description
adStatusCancel | 4 | Demande l'annulation de l'opération ayant déclenché l'événement.
adStatusCantDeny | 3 | L'opération ne peut pas demander l'annulation de l'opération en attente.
adStatusErrorsOccurred | 2 | L'opération ayant déclenché l'événement n'a pas abouti à la suite d'erreurs.
adStatusOK | 1 | L'opération ayant déclenché l'événement a abouti.
adStatusUnwantedEvent | 5 | Empêche l'apparition de notifications ultérieures avant la fin d'exécution de la méthode de l'événement.

Équivalent ADO/WFC

Package : com.ms.wfc.data

Constante
AdoEnums.EventStatus.CANCEL
AdoEnums.EventStatus.CANTDENY
AdoEnums.EventStatus.ERRORSOCCURRED
AdoEnums.EventStatus.OK
AdoEnums.EventStatus.UNWANTEDEVENT

Voir aussi

S'applique à : BeginTransComplete, CommitTransComplete et RollbackTransComplete, événements | ConnectComplete et Disconnect, événements | EndOfRecordset, événement | ExecuteComplete, événement | FetchComplete, événement | InfoMessage, événement | WillChangeField et FieldChangeComplete, événements | WillChangeRecord et RecordChangeComplete, événements | WillChangeRecordset et RecordsetChangeComplete, événements | WillConnect, événement | WillExecute, événement | WillMove et MoveComplete, événements


ExecuteOptionEnum

Indique comment un fournisseur doit exécuter une commande.

Constante | Valeur | Description
adAsyncExecute 0x10 La commande doit être exécutée en mode asynchrone.

Cette valeur ne peut pas être combinée avec la valeur CommandTypeEnum adCmdTableDirect.
adAsyncFetch | 0x20 | Les lignes restant après la quantité initiale spécifiée dans la propriété CacheSize doivent être recherchées en mode asynchrone.
adAsyncFetchNonBlocking 0x40 Le thread principal n'est jamais bloqué pendant la recherche. Si la ligne demandée n'est pas extraite, la ligne actuelle se place automatiquement en fin de fichier.

Si vous ouvrez Recordset à partir d'un Stream qui contient un Recordset stocké de façon permanente, adAsyncFetchNonBlocking n'aura aucun effet ; l'opération sera de type synchrone et produira un blocage.

adAsynchFetchNonBlocking est sans effet quand l'option adCmdTableDirect est utilisée pour ouvrir Recordset.
adExecuteNoRecords 0x80 Le texte de commande correspond à une commande ou à une procédure stockée qui ne renvoie aucune ligne (par exemple, une commande qui insère uniquement des données). Si des lignes sont extraites, elles ne sont pas prises en compte et ne sont pas renvoyées.

adExecuteNoRecords peut uniquement être transmis en tant que paramètre facultatif à la méthode Command ou Connection Execute.
adExecuteStream 0x400 Les résultats de l'exécution d'une commande doivent être renvoyés sous forme de flux.

adExecuteStream peut uniquement être transmis en tant que paramètre facultatif à la méthode Command Execute.
adExecuteRecord | CommandText est une commande ou une procédure stockée qui renvoie une ligne unique, laquelle doit être renvoyée en tant qu'objet Record.
adOptionUnspecified | -1 | La commande n'est pas spécifiée.

Équivalent ADO/WFC

Package : com.ms.wfc.data

Constante
AdoEnums.ExecuteOption.ASYNCEXECUTE
AdoEnums.ExecuteOption.ASYNCFETCH
AdoEnums.ExecuteOption.ASYNCFETCHNONBLOCKING
AdoEnums.ExecuteOption.NORECORDS
AdoEnums.ExecuteOption.UNSPECIFIED

Voir aussi

S'applique à : Execute, méthode (objet ADO Command) | Execute, méthode (objet ADO Connection) | Open, méthode (objet ADO Recordset) | Requery, méthode


FieldEnum

Indique les champs spéciaux référencés dans la collection Fields d'un objet Record.

Remarques

Ces constantes fournissent un « raccourci » pour l'accès aux champs spéciaux associés à Record. Extrait l'objet Field de la collection Fields, puis obtient son contenu à l'aide de la propriété Value de l'objet Field.

Constante | Valeur | Description
adDefaultStream | -1 | Référence le champ contenant l'objet Stream par défaut associé à Record.
adRecordURL | -2 | Référence le champ contenant la chaîne de l'URL absolue pour l'objet Record actuel.


FieldAttributeEnum

Indique un ou plusieurs attributs d'un objet Field.

Constante | Valeur | Description
adFldCacheDeferred | 0x1000 | Le fournisseur met les valeurs des champs en mémoire cache ; ces valeurs sont lues ultérieurement à partir de la mémoire cache.
adFldFixed | 0x10 | Le champ contient des données de longueur fixe.
adFldIsChapter | 0x2000 | Le champ contient une valeur de chapitre qui spécifie un jeu d'enregistrements enfant lié à ce champ parent. En règle générale, les champs chapitre sont utilisés avec des filtres ou des mises en forme de données.
adFldIsCollection | 0x40000 | Le champ indique que la ressource représentée par l'enregistrement est une collection d'autres ressources, par exemple un dossier, et non pas une ressource simple, par exemple un fichier texte.
adFldIsDefaultStream | 0x20000 | Le champ contient le flux par défaut pour la ressource représentée par l'enregistrement. Par exemple, le flux par défaut peut être le contenu HTML d'un dossier racine sur un site Web, qui est automatiquement pris en charge lorsque l'URL racine est spécifiée.
adFldIsNullable | 0x20 | Le champ accepte les valeurs Null.
adFldIsRowURL | 0x10000 | Le champ contient l'URL désignant la ressource issue de la banque de données représentée par l'enregistrement.
adFldLong | 0x80 | Champ binaire de type Long. Vous pouvez utiliser les méthodes AppendChunk et GetChunk.
adFldMayBeNull | 0x40 | Vous pouvez lire les valeurs Null du champ.
adFldMayDefer | 0x2 | Le champ est différé : ses valeurs ne sont pas extraites de la source de données avec le reste de l'enregistrement mais seulement lorsque vous y accédez.
adFldNegativeScale | 0x4000 | Le champ représente une valeur numérique d'une colonne qui gère les valeurs d'échelle négative. L'échelle est spécifiée par la propriété NumericScale.
adFldRowID | 0x100 | Le champ contient un identificateur de ligne persistant non accessible en écriture et qui n'a aucune signification en dehors de l'identification de la ligne (numéro de ligne, identificateur unique, etc.).
adFldRowVersion | 0x200 | Le champ contient un horodatage permettant d'effectuer le suivi des mises à jour.
adFldUnknownUpdatable | 0x8 | Le fournisseur ne peut pas déterminer si vous pouvez écrire dans le champ.
adFldUnspecified | -1 0xFFFFFFFF | Le fournisseur ne prend pas en charge les attributs de ce champ.
adFldUpdatable | 0x4 | Vous pouvez écrire dans le champ.

Équivalent ADO/WFC

Package : com.ms.wfc.data

Constante
AdoEnums.FieldAttribute.CACHEDEFERRED
AdoEnums.FieldAttribute.FIXED
AdoEnums.FieldAttribute.ISNULLABLE
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

S'applique à : Append, méthode | Attributes, propriété


FieldStatusEnum

Indique l'état d'un objet Field.

Les valeurs adFieldPending* indiquent l'opération ayant déclenché la définition de l'état ; elles peuvent être combinées avec d'autres valeurs d'état.

Constante | Valeur | Description
adFieldAlreadyExists | 26 | Le champ spécifié existe déjà.
adFieldBadStatus | 12 | Une valeur d'état non valable a été envoyée par ADO au fournisseur OLE DB. Les causes possibles incluent un fournisseur OLE DB 1.0 ou 1.1, ou une combinaison incorrecte de Value et de Status.
adFieldCannotComplete | 20 | Le serveur de l'URL spécifiée par Source n'a pas pu exécuter l'opération.
adFieldCannotDeleteSource | 23 | Pendant une opération de déplacement, un arbre ou un sous-arbre a été déplacé vers un nouvel emplacement, mais la source n'a pas pu être supprimée.
adFieldCantConvertValue | 2 | Le champ ne peut être ni extrait ni stocké sans perte de données.
adFieldCantCreate | 7 | Le champ n'a pas pu être ajouté car le fournisseur a dépassé une limite (le nombre de champ permis, par exemple).
adFieldDataOverflow | 6 | Les données renvoyées par le fournisseur ont dépassé la capacité correspondant au type de données du champ.
adFieldDefault | 13 | La valeur par défaut du champ a été utilisée lors de la définition des données.
adFieldDoesNotExist | 16 | Le champ spécifié n'existe pas.
adFieldIgnore | 15 | Ce champ a été ignoré lors de la définition des valeurs des données dans la source. Le fournisseur n'a défini aucune valeur.
adFieldIntegrityViolation | 10 | Le champ ne peut pas être modifié car il s'agit d'une entité calculée ou dérivée.
adFieldInvalidURL | 17 | L'URL de la source de données contient des caractères non valides.
adFieldIsNull | 3 | Le fournisseur a renvoyé une valeur VARIANT de type VT_NULL ; par ailleurs, le champ n'est pas vide.
adFieldOK | 0 | Valeur par défaut. Le champ a été correctement ajouté ou supprimé.
adFieldOutOfSpace | 22 | Le fournisseur n'est pas en mesure d'obtenir un espace de stockage suffisant pour exécuter une opération de déplacement ou de copie.
adFieldPendingChange | 0x40000 | Le champ a été supprimé puis rajouté, peut-être avec un type de données différent, ou la valeur du champ dont l'état précédent était adFieldOK a été modifiée. La forme finale du champ modifiera la collection Fields après l'appel de la méthode Update.
adFieldPendingDelete | 0x20000 | L'opération Delete a déclenché la définition de l'état. Le champ a été marqué pour être supprimé de la collection Fields après l'appel de la méthode Update.
adFieldPendingInsert | 0x10000 | L'opération Append a déclenché la définition de l'état. Le champ a été marqué pour être ajouté à la collection Fields après l'appel de la méthode Update.
adFieldPendingUnknown | 0x80000 | Le fournisseur ne peut pas déterminer l'opération ayant déclenché la définition de l'état du champ.
adFieldPendingUnknownDelete | 0x100000 | Le fournisseur ne peut pas déterminer l'opération ayant déclenché la définition de l'état du champ, et le champ sera supprimé de la collection Fields après l'appel de la méthode Update.
adFieldPermissionDenied | 9 | Le champ ne peut pas être modifié car il est défini en lecture seule.
adFieldReadOnly | 24 | Le champ de la source de données est défini en lecture seule.
adFieldResourceExists | 19 | Le fournisseur n'a pas pu exécuter l'opération car un objet existe déjà à l'URL de destination, et il ne peut pas le remplacer.
adFieldResourceLocked | 18 | Le fournisseur n'a pas pu exécuter l'opération car la source de données est verrouillée par un ou plusieurs processus ou applications.
adFieldResourceOutOfScope | 25 | Une URL source ou destination se situe hors de portée de l'enregistrement actuel.
adFieldSchemaViolation | 11 | La valeur a enfreint les contraintes de schéma de la source de données pour le champ.
adFieldSignMismatch | 5 | La valeur des données renvoyée par le fournisseur est signée, mais le type de données de la valeur du champ ADO n'est pas signé.
adFieldTruncated | 4 | Les données de longueur variable ont été tronquées lors de la lecture dans la source de données.
adFieldUnavailable | 8 | Le fournisseur n'a pas pu déterminer la valeur lors de la lecture dans la source de données. Par exemple, la ligne venait juste d'être créée, la valeur par défaut de la colonne n'était pas disponible et une nouvelle valeur n'avait pas encore été spécifiée.
adFieldVolumeNotFound | 21 | Le fournisseur ne peut pas localiser le volume de stockage indiqué par l'URL.

Équivalent ADO/WFC

Ces constantes n'ont pas d'équivalent ADO/WFC.

Voir aussi

S'applique à : Status, propriété (objet ADO Field)


FilterGroupEnum

Indique le groupe d'enregistrements à filtrer à partir de Recordset.

Constante | Valeur | Description
adFilterAffectedRecords | 2 | Affiche uniquement les enregistrements affectés par le dernier appel de Delete, Resync, UpdateBatch ou CancelBatch.
adFilterConflictingRecords | 5 | Affiche les enregistrements qui n'ont pas pu être actualisés lors de la dernière tentative de mise à jour par lots.
adFilterFetchedRecords | 3 | Affiche les enregistrements placés dans la mémoire cache actuelle, c'est-à-dire les résultats du dernier appel pour l'extraction d'enregistrements de la base de données.
adFilterNone | 0 | Supprime le filtre actif et rétablit l'affichage de tous les enregistrements.
adFilterPendingRecords | 1 | Affiche uniquement les enregistrements modifiés qui n'ont pas été encore envoyés au serveur. S'applique seulement au mode de mise à jour par lots.

Équivalent ADO/WFC

Package : com.ms.wfc.data

Constante
AdoEnums.FilterGroup.AFFECTEDRECORDS
AdoEnums.FilterGroup.CONFLICTINGRECORDS
AdoEnums.FilterGroup.FETCHEDRECORDS
AdoEnums.FilterGroup.NONE
AdoEnums.FilterGroup.PENDINGRECORDS

S'applique à : Filter, propriété


GetRowsOptionEnum

Indique le nombre d'enregistrements à extraire de Recordset.

Constante | Valeur | Description
adGetRowsRest | -1 | Extrait tous les autres enregistrements de Recordset, à partir de la position actuelle ou d'un signet spécifié par le paramètre Start de la méthode GetRows.

Équivalent ADO/WFC

Package : com.ms.wfc.data

Constante
AdoEnums.GetRowsOption.REST

S'applique à : GetRows, méthode


IsolationLevelEnum

Indique le niveau d'isolation de transaction d'un objet Connection.

Constante | Valeur | Description
adXactUnspecified | -1 | Le fournisseur utilise un autre niveau d'isolation que celui qui est spécifié, mais ce niveau ne peut pas être déterminé.
adXactChaos | 16 | Vous ne pouvez pas remplacer les modifications en attente gérées par des transactions plus isolées.
adXactBrowse | 256 | Vous pouvez voir, à partir d'une transaction, les modifications non encore validées des autres transactions.
adXactReadUncommitted | 256 | Identique à adXactBrowse.
adXactCursorStability | 4096 | Vous pouvez voir, à partir d'une transaction, les modifications des autres transactions seulement après leur validation.
adXactReadCommitted | 4096 | Identique à adXactCursorStability.
adXactRepeatableRead | 65536 | Vous ne pouvez pas voir, à partir d'une transaction, les modifications des autres transactions, mais une nouvelle requête peut extraire de nouveaux objets Recordset.
adXactIsolated | 1048576 | Les transactions sont totalement isolées les unes des autres.
adXactSerializable | 1048576 | Identique à adXactIsolated.

Équivalent ADO/WFC

Package : com.ms.wfc.data

Constante
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

S'applique à : IsolationLevel, propriété


LineSeparatorsEnum

Indique le caractère utilisé comme séparateur de ligne dans les objets Stream de type texte.

Constante | Valeur | Description
adCR | 13 | Retour chariot.
adCRLF | -1 | Valeur par défaut. Saut de ligne par retour chariot.
adLF | 10 | Saut de ligne.

Équivalent ADO/WFC

Ces constantes n'ont pas d'équivalent ADO/WFC.

S'applique à : LineSeparator, propriété


LockTypeEnum

Indique le type de verrouillage des enregistrements lors des modifications.

Constante | Valeur | Description
adLockBatchOptimistic | 4 | Mise à jour par lot optimiste. Obligatoire en mode de mise à jour par lots.
adLockOptimistic | 3 | Verrouillage optimiste, un enregistrement à la fois. Le fournisseur utilise le verrouillage optimiste et ne verrouille les enregistrements qu'à l'appel de la méthode Update.
adLockPessimistic | 2 | Verrouillage pessimiste, un enregistrement à la fois. Le fournisseur assure une modification correcte des enregistrements, et les verrouille généralement dans la source de données dès l'édition.
adLockReadOnly | 1 | Enregistrements en lecture seule. Vous ne pouvez pas modifier les données.
adLockUnspecified | -1 | Aucun type de verrou n'est spécifié. Le clone adopte le type de verrouillage de l'original.

Équivalent ADO/WFC

Package : com.ms.wfc.data

Constante
AdoEnums.LockType.BATCHOPTIMISTIC
AdoEnums.LockType.OPTIMISTIC
AdoEnums.LockType.PESSIMISTIC
AdoEnums.LockType.READONLY
AdoEnums.LockType.UNSPECIFIED

Voir aussi

S'applique à : Clone, méthode | LockType, propriété | Open, méthode (objet ADO Recordset) | WillExecute, événement


MarshalOptionsEnum

Indique les enregistrements qui doivent être renvoyés au serveur.

Constante | Valeur | Description
adMarshalAll | 0 | Valeur par défaut. Toutes les lignes sont renvoyées au serveur.
adMarshalModifiedOnly | 1 | Seules les lignes modifiées sont renvoyées au serveur.

Équivalent ADO/WFC

Package : com.ms.wfc.data

Constante
AdoEnums.MarshalOptions.ALL
AdoEnums.MarshalOptions.MODIFIEDONLY

S'applique à : MarshalOptions, propriété


MoveRecordOptionsEnum

Spécifie le comportement de la méthode MoveRecord de l'objet Record.

Constante | Valeur | Description
adMoveUnspecified | -1 | Valeur par défaut. Effectue l'opération de déplacement par défaut : l'opération échoue si le fichier ou répertoire de destination existe déjà, et si l'opération met à jour des liens hypertextes.
adMoveOverWrite | 1 | Remplace le fichier ou répertoire de destination, même s'il existe déjà.
adMoveDontUpdateLinks | 2 | Modifie le comportement par défaut de la méthode MoveRecord en ne mettant pas à jour les liens hypertextes du Record source. Le comportement par défaut dépend des fonctionnalités du fournisseur. L'opération de déplacement met à jour les liens si le fournisseur le permet. Si le fournisseur ne peut pas réparer les liens ou si cette valeur n'est pas spécifiée, le déplacement réussit même lorsque les liens n'ont pas été réparés.
adMoveAllowEmulation | 4 | Demande que le fournisseur tente de simuler le déplacement (à l'aide d'opérations de téléchargement et de suppression). Si la tentative de déplacement de Record échoue parce que l'URL de destination se trouve sur un autre serveur ou parce qu'elle est prise en charge par un fournisseur autre que la source, cela peut augmenter le temps d'attente ou entraîner une perte de données en raison des différences de fonctionnalités entre fournisseurs lors du déplacement des ressources.

Équivalent ADO/WFC

Ces constantes n'ont pas d'équivalent ADO/WFC.

S'applique à : MoveRecord, méthode


ObjectStateEnum

Indique si l'objet est ouvert ou fermé, ou s'il se connecte à une source de données, exécute une commande ou extrait des données.

Constante | Valeur | Description
adStateClosed | 0 | Indique que l'objet est fermé.
adStateOpen | 1 | Indique que l'objet est ouvert.
adStateConnecting | 2 | Indique que l'objet est en cours de connexion.
adStateExecuting | 4 | Indique que l'objet exécute une commande.
adStateFetching | 8 | Indique une extraction en cours des lignes de l'objet.

Équivalent ADO/WFC

Package : com.ms.wfc.data

Constante
AdoEnums.ObjectState.CLOSED
AdoEnums.ObjectState.OPEN
AdoEnums.ObjectState.CONNECTING
AdoEnums.ObjectState.EXECUTING
AdoEnums.ObjectState.FETCHING

S'applique à : State, propriété | State, propriété


ParameterAttributesEnum

Indique les attributs d'un objet Parameter.

Constante | Valeur | Description
adParamSigned | 16 | Le paramètre accepte des valeurs signées.
adParamNullable | 64 | Le paramètre accepte des valeurs Null.
adParamLong | 128 | Le paramètre accepte les données binaires de type Long.

Équivalent ADO/WFC

Package : com.ms.wfc.data

Constante
AdoEnums.ParameterAttributes.SIGNED
AdoEnums.ParameterAttributes.NULLABLE
AdoEnums.ParameterAttributes.LONG

S'applique à : Attributes, propriété


ParameterDirectionEnum

Indique si l'objet Parameter correspond à un paramètre d'entrée, un paramètre de sortie ou les deux, ou s'il s'agit d'une valeur renvoyée par une procédure stockée.

Constante | Valeur | Description
adParamInput | 1 | Valeur par défaut. Indique qu'il s'agit d'un paramètre d'entrée.
adParamInputOutput | 3 | Indique qu'il s'agit à la fois d'un paramètre d'entrée et de sortie.
adParamOutput | 2 | Indique qu'il s'agit d'un paramètre de sortie.
adParamReturnValue | 4 | Indique que le paramètre est une valeur renvoyée.
adParamUnknown | 0 | La direction du paramètre est inconnue.

Équivalent ADO/WFC

Package : com.ms.wfc.data

Constante
AdoEnums.ParameterDirection.INPUT
AdoEnums.ParameterDirection.INPUTOUTPUT
AdoEnums.ParameterDirection.OUTPUT
AdoEnums.ParameterDirection.RETURNVALUE
AdoEnums.ParameterDirection.UNKNOWN

Voir aussi

S'applique à : CreateParameter, méthode | Direction, propriété


PersistFormatEnum

Indique le format dans lequel Recordset doit être enregistré.

Constante | Valeur | Description
adPersistADTG | 0 | Indique le format ADTG (Advanced Data TableGram) de Microsoft.
adPersistADO | 1 | Indique le propre format XML (Extensible Markup Language) d'ADO. Cette valeur est identique à adPersistXML et est incluse pour des raisons de compatibilité ascendante.
adPersistXML | 1 | Indique le format XML (Extensible Markup Language).
adPersistProviderSpecific | 2 | Indique que le fournisseur rend Recordset permanent à l'aide de son propre format.

Équivalent ADO/WFC

Package : com.ms.wfc.data

Constante
AdoEnums.PersistFormat.ADTG
AdoEnums.PersistFormat.XML

S'applique à : Save, méthode


PositionEnum

Indique la position actuelle du pointeur de l'enregistrement dans Recordset.

Constante | Valeur | Description
adPosBOF | -2 | Le pointeur de l'enregistrement actuel se trouve au début du fichier (la propriété BOF a pour valeur True).
adPosEOF | -3 | Le pointeur de l'enregistrement actuel se trouve à la fin du fichier (la propriété EOF a pour valeur True).
adPosUnknown | -1 | Recordset est vide, la position actuelle de l'enregistrement est inconnue ou alors le fournisseur ne prend pas en charge la propriété AbsolutePage ou AbsolutePosition.

Équivalent ADO/WFC

Package : com.ms.wfc.data

Constante
AdoEnums.Position.BOF
AdoEnums.Position.EOF
AdoEnums.Position.UNKNOWN

Voir aussi

S'applique à : AbsolutePage, propriété | AbsolutePosition, propriété


PropertyAttributesEnum

Indique les attributs d'un objet Property.

Constante | Valeur | Description
adPropNotSupported | 0 | Le fournisseur ne prend pas en charge cette propriété.
adPropRequired | 1 | L'utilisateur doit affecter une valeur à cette propriété avant l'initialisation de la source de données.
adPropOptional | 2 | L'utilisateur n'a pas besoin d'affecter une valeur à cette propriété avant l'initialisation de la source de données.
adPropRead | 512 | L'utilisateur peut lire la propriété.
adPropWrite | 1024 | L'utilisateur peut définir la propriété.

Équivalent ADO/WFC

Package : com.ms.wfc.data

Constante
AdoEnums.PropertyAttributes.NOTSUPPORTED
AdoEnums.PropertyAttributes.REQUIRED
AdoEnums.PropertyAttributes.OPTIONAL
AdoEnums.PropertyAttributes.READ
AdoEnums.PropertyAttributes.WRITE

S'applique à : Attributes, propriété


RecordCreateOptionsEnum

Indique s'il faut ouvrir un Record existant ou le créer pour la méthode Open de l'objet Record. Il est possible de combiner ces valeurs à l'aide d'un opérateur AND.

Constante | Valeur | Description
adCreateCollection | 0x2000 | Crée Record au nœud indiqué par le paramètre Source, au lieu d'ouvrir un Record existant. Si la source pointe vers un nœud existant, une erreur d'exécution se produit, sauf si adCreateCollection est combiné à adOpenIfExists ou adCreateOverwrite.
adCreateNonCollection | 0 | Crée un Record de type adSimpleRecord.
adCreateOverwrite | 0x4000000 | Modifie les indicateurs de création adCreateCollection, adCreateNonCollection et adCreateStructDoc. Lorsque l'opérateur OR est associé à cette valeur et à l'une des valeurs des indicateurs de création, alors que l'URL source pointe vers un nœud ou Record, le Record existant est remplacé par un autre nouvellement créé. Cette valeur ne peut pas être associée à adOpenIfExists.
adCreateStructDoc | 0x80000000 | Crée un Record de type adStructDoc, au lieu d'ouvrir un Record existant.
adFailIfNotExists | -1 | Valeur par défaut. Génère une erreur d'exécution si Source pointe vers un nœud inexistant.
adOpenIfExists | 0x2000000 | Modifie les indicateurs de création adCreateCollection, adCreateNonCollection et adCreateStructDoc. Lorsque l'opérateur OR est associé à cette valeur et à l'une des valeurs des indicateurs de création, si l'URL source pointe vers un nœud existant ou un objet Record, le fournisseur doit alors ouvrir le Record existant au lieu d'en créer un. Cette valeur ne peut pas être associée à adCreateOverwrite.

Équivalent ADO/WFC

Ces constantes n'ont pas d'équivalent ADO/WFC.

Voir aussi

S'applique à : Open, méthode (objet ADO Record)


RecordOpenOptionsEnum

Indique les options d'ouverture de Record. Il est possible de combiner ces valeurs à l'aide de l'opérateur OR.

Constante | Valeur | Description
adDelayFetchFields | 0x8000 | Indique au fournisseur que pour extraire les champs associés à Record, il peut attendre la première tentative d'accès au champ. En l'absence de cet indicateur, le comportement par défaut est d'extraire tous les champs de l'objet Record.
adDelayFetchStream | 0x4000 | Indique au fournisseur qu'il n'a pas besoin d'extraire initialement le flux par défaut associé à l'objet Record. En l'absence de cet indicateur, le comportement par défaut est d'extraire le flux par défaut associé à l'objet Record.
adOpenAsync | 0x1000 | L'objet Record est ouvert en mode asynchrone.
adOpenExecuteCommand | 0x10000 | La chaîne de Source contient un texte de commande à exécuter. Cette valeur est équivalente à l'option adCmdText sur Recordset.Open.
adOpenRecordUnspecified | -1 | Valeur par défaut. Aucune option n'est définie.
adOpenOutput | 0x800000 | Si la source pointe vers un nœud contenant un script exécutable (par exemple une page .ASP), le Record ouvert contient les résultats du script exécuté. Cette valeur n'est valide que pour les enregistrements hors collection.

Équivalent ADO/WFC

Ces constantes n'ont pas d'équivalent ADO/WFC.

Voir aussi

S'applique à : Open, méthode (objet ADO Record)


RecordStatusEnum

Indique l'état de l'enregistrement actuel par rapport à des mises à jour par lots ou à d'autres opérations par groupes.

Constante | Valeur | Description
adRecCanceled | 0x100 | L'enregistrement n'a pas été enregistré parce que l'opération a été annulée.
adRecCantRelease | 0x400 | Le nouvel enregistrement n'a pas été enregistré parce que l'enregistrement existant a été verrouillé.
adRecConcurrencyViolation | 0x800 | L'enregistrement n'a pas été enregistré à cause d'un accès concurrentiel optimiste.
adRecDBDeleted | 0x40000 | L'enregistrement a déjà été supprimé de la source de données.
adRecDeleted | 0x4 | L'enregistrement a été supprimé.
adRecIntegrityViolation | 0x1000 | L'enregistrement n'a pas été enregistré car l'utilisateur a enfreint des contraintes d'intégrité.
adRecInvalid | 0x10 | L'enregistrement n'a pas été enregistré car son signet n'est pas valide.
adRecMaxChangesExceeded | 0x2000 | L'enregistrement n'a pas été enregistré car il y avait trop de modifications en attente.
adRecModified | 0x2 | L'enregistrement a été modifié.
adRecMultipleChanges | 0x40 | L'enregistrement n'a pas été enregistré car cela aurait affecté plusieurs enregistrements.
adRecNew | 0x1 | L'enregistrement est nouveau.
adRecObjectOpen | 0x4000 | L'enregistrement n'a pas été enregistré en raison d'un conflit avec un objet de stockage ouvert.
adRecOK | 0 | L'enregistrement a été mis à jour correctement.
adRecOutOfMemory | 0x8000 | L'enregistrement n'a pas été enregistré car la mémoire de l'ordinateur est insuffisante.
adRecPendingChanges | 0x80 | L'enregistrement n'a pas été enregistré car il fait référence à une insertion en attente.
adRecPermissionDenied | 0x10000 | L'enregistrement n'a pas été enregistré car l'utilisateur n'a pas les droits nécessaires.
adRecSchemaViolation | 0x20000 | L'enregistrement n'a pas été enregistré car il enfreint la structure de la base de données sous-jacente.
adRecUnmodified | 0x8 | L'enregistrement n'a pas été modifié.

Équivalent ADO/WFC

AdoEnums.RecordStatus.

Package : com.ms.wfc.data

Constante
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

Voir aussi

S'applique à : Status, propriété (objet ADO Recordset)


RecordTypeEnum

Indique le type de l'objet Record.

Constante | Valeur | Description
adSimpleRecord | 0 | Enregistrement simple (sans nœuds enfants).
adCollectionRecord | 1 | Enregistrement collection (avec nœuds enfants).
adRecordUnknown | -1 | Le type de Record est inconnu.
adStructDoc | 2 | Enregistrement collection de type spécial représentant des documents structurés COM.

Équivalent ADO/WFC

Ces constantes n'ont pas d'équivalent ADO/WFC.

S'applique à : RecordType, propriété


ResyncEnum

Indique si les valeurs sous-jacentes sont remplacées par un appel de Resync.

Constante | Valeur | Description
adResyncAllValues | 2 | Valeur par défaut. Les données sont remplacées et les mises à jour en attente sont annulées.
adResyncUnderlyingValues | 1 | Les données ne sont pas remplacées et les mises à jour en attente ne sont pas annulées.

Équivalent ADO/WFC

Package : com.ms.wfc.data

Constante
AdoEnums.Resync.ALLVALUES
AdoEnums.Resync.UNDERLYINGVALUES

S'applique à : Resync, méthode


SaveOptionsEnum

Indique si un fichier doit être créé ou remplacé lors de l'enregistrement à partir d'un objet Stream. Il est possible de combiner ces valeurs à l'aide d'un opérateur AND.

Constante | Valeur | Description
adSaveCreateNotExist | 1 | Valeur par défaut. Crée un fichier si le fichier spécifié par le paramètre FileName n'existe pas déjà.
adSaveCreateOverWrite | 2 | Remplace le contenu du fichier par les données provenant de l'objet Stream ouvert, si le fichier spécifié par le paramètre FileName existe déjà.

Équivalent ADO/WFC

Ces constantes n'ont pas d'équivalent ADO/WFC.

S'applique à : SaveToFile, méthode


SchemaEnum

Indique le type de schéma Recordset que récupère la méthode OpenSchema.

Remarques

Pour plus d'informations sur la fonction et les colonnes renvoyées pour chaque constante ADO, consultez les rubriques de l'annexe B du Guide de référence du programmeur OLE DB. Le titre de chaque rubrique apparaît entre parenthèses dans la section Description du tableau ci-dessous.

Pour plus d'informations sur la fonction et les colonnes renvoyées pour chaque constante ADO MD, consultez les rubriques du chapitre 23 de la documentation OLE DB pour OLAP. Le titre de chaque rubrique apparaît entre parenthèses avec un astérisque (*) dans la colonne Description du tableau ci-dessous.

Pour obtenir une équivalence entre les types de données des colonnes dans la documentation OLE DB et les types de données ADO, consultez la colonne Description de la rubrique DataTypeEnum ADO. Par exemple, le type de données DBTYPE_WSTR OLE DB a pour équivalent le type de données adWChar ADO.

ADO génère des résultats de type schéma pour les constantes, adSchemaDBInfoKeywords et adSchemaDBInfoLiterals. ADO crée Recordset, puis place sur chaque ligne les valeurs renvoyées respectivement par les méthodes IDBInfo::GetKeywords et IDBInfo::GetLiteralInfo. Pour des informations supplémentaires sur ces méthodes, consultez la section IDBInfo du Guide de référence du programmeur OLE DB.

Constante | Valeur | Description | Colonnes des contraintes
adSchemaAsserts | 0 | Renvoie les assertions définies dans le catalogue et appartenant à un utilisateur particulier. (ASSERTIONS Rowset) | CONSTRAINT_CATALOG CONSTRAINT_SCHEMA CONSTRAINT_NAME
adSchemaCatalogs | 1 | Renvoie les attributs physiques des catalogues accessibles à partir du système de gestion de base de données. (CATALOGS Rowset) | CATALOG_NAME
adSchemaCharacterSets | 2 | Renvoie les jeux de caractères définis dans le catalogue et accessibles à un utilisateur particulier. (CHARACTER_SETS Rowset) | CHARACTER_SET_CATALOG CHARACTER_SET_SCHEMA CHARACTER_SET_NAME
adSchemaCheckConstraints | 5 | Renvoie les contraintes de vérification définies dans le catalogue et appartenant à un utilisateur particulier. (CHECK_CONSTRAINTS Rowset) | CONSTRAINT_CATALOG CONSTRAINT_SCHEMA CONSTRAINT_NAME
adSchemaCollations | 3 | Renvoie les modes de tri des caractères définis dans le catalogue et accessibles à un utilisateur particulier. (COLLATIONS Rowset) | COLLATION_CATALOG COLLATION_SCHEMA COLLATION_NAME
adSchemaColumnPrivileges | 13 | Renvoie les privilèges obtenus par un utilisateur particulier ou accordés par celui-ci sur les colonnes de tables, et qui sont définis dans le catalogue. (COLUMN_PRIVILEGES Rowset) | TABLE_CATALOG TABLE_SCHEMA TABLE_NAME COLUMN_NAME GRANTOR GRANTEE
adSchemaColumns | 4 | Renvoie les colonnes des tables (vues comprises) définies dans le catalogue et accessibles à un utilisateur particulier. (COLUMNS Rowset) | TABLE_CATALOG TABLE_SCHEMA TABLE_NAME COLUMN_NAME
adSchemaColumnsDomainUsage | 11 | Renvoie les colonnes du catalogue qui dépendent d'un domaine défini dans le catalogue et appartiennent à un utilisateur particulier. (COLUMN_DOMAIN_USAGE Rowset) | DOMAIN_CATALOG DOMAIN_SCHEMA DOMAIN_NAME COLUMN_NAME
adSchemaConstraintColumnUsage | 6 | Renvoie les colonnes utilisées par les contraintes d'intégrité référentielle, les contraintes d'unicité, les contraintes de vérification et les assertions définies dans le catalogue et appartenant à un utilisateur particulier. (CONSTRAINT_COLUMN_USAGE Rowset) | TABLE_CATALOG TABLE_SCHEMA TABLE_NAME COLUMN_NAME
adSchemaConstraintTableUsage | 7 | Renvoie les tables utilisées par les contraintes d'intégrité référentielle, les contraintes d'unicité, les contraintes de vérification et les assertions définies dans le catalogue et appartenant à un utilisateur particulier. (CONSTRAINT_TABLE_USAGE Rowset) | TABLE_CATALOG TABLE_SCHEMA TABLE_NAME
adSchemaCubes | 32 | Renvoie des informations sur les cubes disponibles dans un schéma (ou le catalogue, si le fournisseur ne prend pas en charge les schémas). (CUBES Rowset*) | CATALOG_NAME SCHEMA_NAME CUBE_NAME
adSchemaDBInfoKeywords | 30 | Renvoie une liste de mots clés propres au fournisseur. (IDBInfo::GetKeywords *) | <Aucune>
adSchemaDBInfoLiterals | 31 | Renvoie une liste de littéraux propres au fournisseur et utilisés dans les commandes texte. (IDBInfo::GetLiteralInfo *) | <Aucune>
adSchemaDimensions | 33 | Renvoie des informations sur les dimensions d'un cube donné. Ce schéma possède une ligne par dimension. (DIMENSIONS Rowset *) | CATALOG_NAME SCHEMA_NAME CUBE_NAME DIMENSION_NAME DIMENSION_UNIQUE_NAME
adSchemaForeignKeys | 27 | Renvoie les colonnes clés externes définies dans le catalogue par un utilisateur particulier. (FOREIGN_KEYS Rowset) | PK_TABLE_CATALOG PK_TABLE_SCHEMA PK_TABLE_NAME FK_TABLE_CATALOG FK_TABLE_SCHEMA FK_TABLE_NAME
adSchemaHierarchies | 34 | Renvoie des informations sur les hiérarchies d'une dimension. (HIERARCHIES Rowset *) | CATALOG_NAME SCHEMA_NAME CUBE_NAME DIMENSION_UNIQUE_NAME HIERARCHY_NAME HIERARCHY_UNIQUE_NAME
adSchemaIndexes | 12 | Renvoie les index contenus dans le catalogue et appartenant à un utilisateur particulier. (INDEXES Rowset) | TABLE_CATALOG TABLE_SCHEMA INDEX_NAME TYPE TABLE_NAME
adSchemaKeyColumnUsage | 8 | Renvoie les colonnes clés contenues dans le catalogue. (KEY_COLUMN_USAGE Rowset) | CONSTRAINT_CATALOG CONSTRAINT_SCHEMA CONSTRAINT_NAME TABLE_CATALOG TABLE_SCHEMA TABLE_NAME COLUMN_NAME
adSchemaLevels | 35 | Renvoie des informations sur les niveaux d'une dimension. (LEVELS Rowset*) | CATALOG_NAME SCHEMA_NAME CUBE_NAME DIMENSION_UNIQUE_NAME HIERARCHY_UNIQUE_NAME LEVEL_NAME LEVEL_UNIQUE_NAME
adSchemaMeasures | 36 | Renvoie des informations sur les mesures disponibles. (MEASURES Rowset *) | CATALOG_NAME SCHEMA_NAME CUBE_NAME MEASURE_NAME MEASURE_UNIQUE_NAME
adSchemaMembers | 38 | Renvoie des informations sur les membres disponibles. (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 Opérateur d'arborescence (Pour plus d'informations, consultez la documentation OLE DB pour OLAP.)
adSchemaPrimaryKeys | 28 | Renvoie les colonnes clés primaires définies dans le catalogue par un utilisateur particulier. (PRIMARY_KEYS Rowset) | PK_TABLE_CATALOG PK_TABLE_SCHEMA PK_TABLE_NAME
adSchemaProcedureColumns | 29 | Renvoie des informations sur les colonnes d'ensembles de lignes utilisées dans les procédures. (PROCEDURE_COLUMNS Rowset) | PROCEDURE_CATALOG PROCEDURE_SCHEMA PROCEDURE_NAME COLUMN_NAME
adSchemaProcedureParameters | 26 | Renvoie des informations sur les paramètres ainsi que sur les codes de renvoi des procédures. (PROCEDURE_PARAMETERS Rowset) | PROCEDURE_CATALOG PROCEDURE_SCHEMA PROCEDURE_NAME PARAMETER_NAME
adSchemaProcedures | 16 | Renvoie les procédures définies dans le catalogue et appartenant à un utilisateur particulier. (PROCEDURES Rowset) | PROCEDURE_CATALOG PROCEDURE_SCHEMA PROCEDURE_NAME PROCEDURE_TYPE
adSchemaProperties | 37 | Renvoie des informations sur les propriétés disponibles pour chaque niveau de la dimension. (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 | Utilisé si le fournisseur définit ses propres requêtes de schéma non standard. | <Propre au fournisseur>
adSchemaProviderTypes | 22 | Renvoie les types de données (de base) pris en charge par le fournisseur de données. (PROVIDER_TYPES Rowset) | DATA_TYPE BEST_MATCH
AdSchemaReferentialConstraints | 9 | Renvoie les contraintes d'intégrité référentielle définies dans le catalogue et appartenant à un utilisateur particulier. (REFERENTIAL_CONSTRAINTS Rowset) | CONSTRAINT_CATALOG CONSTRAINT_SCHEMA CONSTRAINT_NAME
adSchemaSchemata | 17 | Renvoie les schémas (objets de base de données) appartenant à un utilisateur particulier. (SCHEMATA Rowset) | CATALOG_NAME SCHEMA_NAME SCHEMA_OWNER
adSchemaSQLLanguages | 18 | Renvoie les niveaux de conformité, options et dialectes pris en charge par les données de traitement d'implémentation de SQL définies dans le catalogue. (SQL_LANGUAGES Rowset) | <Aucune>
adSchemaStatistics | 19 | Renvoie les statistiques définies dans le catalogue et appartenant à un utilisateur particulier. (STATISTICS Rowset) | TABLE_CATALOG TABLE_SCHEMA TABLE_NAME
adSchemaTableConstraints | 10 | Renvoie les contraintes de table définies dans le catalogue et appartenant à un utilisateur particulier. (TABLE_CONSTRAINTS Rowset) | CONSTRAINT_CATALOG CONSTRAINT_SCHEMA CONSTRAINT_NAME TABLE_CATALOG TABLE_SCHEMA TABLE_NAME CONSTRAINT_TYPE
adSchemaTablePrivileges | 14 | Renvoie les privilèges obtenus par un utilisateur particulier ou accordés par celui-ci sur les tables définies dans le catalogue. (TABLE_PRIVILEGES Rowset) | TABLE_CATALOG TABLE_SCHEMA TABLE_NAME GRANTOR GRANTEE
adSchemaTables | 20 | Ce schéma renvoie les tables (vues comprises) définies dans le catalogue et accessibles à un utilisateur particulier. (TABLES Rowset) | TABLE_CATALOG TABLE_SCHEMA TABLE_NAME TABLE_TYPE
adSchemaTranslations | 21 | Renvoie les conversions de caractères définies dans le catalogue et accessibles à un utilisateur particulier. (TRANSLATIONS Rowset) | TRANSLATION_CATALOG TRANSLATION_SCHEMA TRANSLATION_NAME
adSchemaTrustees | 39 | Réservé à une fonction future. |
adSchemaUsagePrivileges | 15 | Renvoie les privilèges USAGE obtenus par un utilisateur particulier ou accordés par celui-ci sur les objets définis dans le catalogue. (USAGE_PRIVILEGES Rowset) | OBJECT_CATALOG OBJECT_SCHEMA OBJECT_NAME OBJECT_TYPE GRANTOR GRANTEE
adSchemaViewColumnUsage | 24 | Renvoie les colonnes dont dépendent les tables affichées, définies dans le catalogue et détenues par un utilisateur donné. (VIEW_COLUMN_USAGE Rowset) | VIEW_CATALOG VIEW_SCHEMA VIEW_NAME
adSchemaViews | 23 | Renvoie les vues définies dans le catalogue et accessibles à un utilisateur particulier. (VIEWS Rowset) | TABLE_CATALOG TABLE_SCHEMA TABLE_NAME
adSchemaViewTableUsage | 25 | Renvoie les tables dont dépendent les tables affichées, définies dans le catalogue et détenues par un utilisateur donné. (VIEW_TABLE_USAGE Rowset) | VIEW_CATALOG VIEW_SCHEMA VIEW_NAME

Équivalent ADO/WFC

Package : com.ms.wfc.data

Constante
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

S'applique à : OpenSchema, méthode


SearchDirectionEnum

Indique le sens de recherche d'un enregistrement dans Recordset.

Constante | Valeur | Description
adSearchBackward | -1 | Effectue une recherche vers l'arrière, en s'arrêtant au début de Recordset. Si aucune correspondance n'est trouvée, le pointeur de l'enregistrement se positionne au début du fichier (BOF).
adSearchForward | 1 | Effectue une recherche vers l'avant, en s'arrêtant à la fin de Recordset. Si aucune correspondance n'est trouvée, le pointeur de l'enregistrement se positionne à la fin du fichier (EOF).

Équivalent ADO/WFC

Package : com.ms.wfc.data

Constante
AdoEnums.SearchDirection.BACKWARD
AdoEnums.SearchDirection.FORWARD

S'applique à : Find, méthode


SeekEnum

Indique le type de méthode Seek à exécuter.

Constante | Valeur | Description
adSeekFirstEQ | 1 | Recherche la première clé égale à KeyValues.
adSeekLastEQ | 2 | Recherche la dernière clé égale à KeyValues.
adSeekAfterEQ | 4 | Recherche une clé égale à KeyValues ou juste après l'emplacement où la correspondance serait intervenue.
adSeekAfter | 8 | Recherche une clé juste après qu'une correspondance avec KeyValues serait intervenue.
adSeekBeforeEQ | 16 | Recherche une clé égale à KeyValues ou juste avant l'emplacement où la correspondance serait intervenue.
adSeekBefore | 32 | Recherche une clé juste avant qu'une correspondance avec KeyValues serait intervenue.

Équivalent ADO/WFC

Package : com.ms.wfc.data

Constante
AdoEnums.Seek.FIRSTEQ
AdoEnums.Seek.LASTEQ
AdoEnums.Seek.AFTEREQ
AdoEnums.Seek.AFTER
AdoEnums.Seek.BEFOREEQ
AdoEnums.Seek.BEFORE

S'applique à : Seek, méthode


StreamOpenOptionsEnum

Indique les options d'ouverture d'un objet Stream. Il est possible de combiner ces valeurs à l'aide d'un opérateur OR.

Constante | Valeur | Description
adOpenStreamAsync | 1 | Ouvre l'objet Stream en mode asynchrone.
adOpenStreamFromRecord | 4 | Identifie le contenu du paramètre Source comme étant un objet Record déjà ouvert. Le comportement par défaut est de considérer Source comme une URL qui pointe directement vers un nœud dans une structure arborescente. Le flux par défaut associé à ce nœud est ouvert.
adOpenStreamUnspecified | -1 | Valeur par défaut. Indique l'ouverture de l'objet Stream avec les options par défaut.

Équivalent ADO/WFC

Ces constantes n'ont pas d'équivalent ADO/WFC.

Voir aussi

S'applique à : Open, méthode (objet ADO Stream)


StreamReadEnum

Indique s'il faut lire le flux entier ou seulement la ligne suivante dans un objet Stream.

Constante | Valeur | Description
adReadAll | -1 | Valeur par défaut. Lit tous les octets du flux, de la position actuelle jusqu'au marqueur EOS. Il s'agit de la seule valeur StreamReadEnum valide avec les flux binaires (le type est adTypeBinary).
adReadLine | -2 | Lit la ligne suivante dans le flux (désignée par la propriété LineSeparator).

Équivalent ADO/WFC

Ces constantes n'ont pas d'équivalent ADO/WFC.

S'applique à : Read, méthode | ReadText, méthode


StreamTypeEnum

Indique le type de données stockées dans un objet Stream.

Constante | Valeur | Description
adTypeBinary | 1 | Données binaires.
adTypeText | 2 | Valeur par défaut. Données texte, utilisant le jeu de caractères spécifié par Charset.

Équivalent ADO/WFC

Ces constantes n'ont pas d'équivalent ADO/WFC.

Voir aussi

S'applique à : Type, propriété (objet ADO Stream)


StreamWriteEnum

Indique si un séparateur de lignes est ajouté à la chaîne écrite dans un objet Stream.

Constante | Valeur | Description
adWriteChar | 0 | Valeur par défaut. La chaîne de texte spécifiée (par le paramètre Data) est écrite dans l'objet Stream.
adWriteLine | 1 | Une chaîne de texte et un caractère séparateur de ligne sont écrits dans un objet Stream. Si la propriété LineSeparator n'est pas définie, une erreur d'exécution est renvoyée.

Équivalent ADO/WFC

Ces constantes n'ont pas d'équivalent ADO/WFC.

S'applique à : WriteText, méthode


StringFormatEnum

Indique le format dans lequel Recordset doit être extrait comme une chaîne.

Constante | Valeur | Description
adClipString | 2 | Délimite les lignes par RowDelimiter, les colonnes par ColumnDelimiter et les valeurs Null par NullExpr. Ces trois paramètres de la méthode GetString sont valides seulement avec StringFormat de adClipString.

Équivalent ADO/WFC

Package : com.ms.wfc.data

Constante
AdoEnums.StringFormat.CLIPSTRING

S'applique à : GetString, méthode


XactAttributeEnum

Indique les attributs de la transaction d'un objet Connection.

Constante | Valeur | Description
adXactAbortRetaining | 262144 | Exécute un abandon avec conservation : si vous appelez la méthode RollbackTrans, une nouvelle transaction commence automatiquement. Certains fournisseurs ne prennent pas en charge cette propriété.
adXactCommitRetaining | 131072 | Exécute une validation avec conservation : si vous appelez la méthode CommitTrans, une nouvelle transaction commence automatiquement. Certains fournisseurs ne prennent pas en charge cette propriété.

Équivalent ADO/WFC

Package : com.ms.wfc.data

Constante
AdoEnums.XactAttribute.ABORTRETAINING
AdoEnums.XactAttribute.COMMITRETAINING

S'applique à : Attributes, propriété


Index de syntaxe ADO

La syntaxe d'appel des méthodes et propriétés ADO diffère selon votre environnement de développement. Le reste du Guide de référence du langage ADO utilise le langage de programmation Microsoft Visual Basic pour illustrer la syntaxe des méthodes et propriétés ADO. Cependant, consultez les sections ci-dessous pour obtenir davantage d'exemples de syntaxe spécifiques basés sur votre langage et votre méthodologie de programmation.

  • Index de la syntaxe ADO pour Visual C++ pour COM traite des propriétés et méthodes ADO sans utilisation de la directive du compilateur #import avec Microsoft Visual C++.
  • Index de la syntaxe ADO pour Visual C++ avec #import traite des propriétés et méthodes ADO sans utilisation de la directive du compilateur #import avec Microsoft Visual C++.
  • Index de la syntaxe ADO/WFC traite de l'utilisation des classes ADO pour Windows Foundation Classes avec Visual J++.

Voir aussi

Utilisation de ADO avec Microsoft Visual Basic | Utilisation de ADO avec Microsoft Visual C++ | Utilisation de ADO avec Microsoft Visual J++ | Utilisation de ADO avec les langages de script


Index de la syntaxe ADO pour Visual C++ pour COM

Cet index dresse la liste des correspondances avec les rubriques du Guide de référence du langage ADO basées sur Microsoft Visual C++.

Si vous utilisez la directive #import dans votre application, un fichier d'en-tête sera généré et vous permettra d'utiliser une syntaxe semblable à celle de Microsoft Visual Basic. Les noms de propriété de la forme get_PropertyName et put_PropertyName peuvent être traités comme s'ils étaient déclarés simplement en tant que PropertyName. Une propriété peut alors être traitée comme un membre de données plutôt que comme une fonction.

Toutes les méthodes, propriétés et événements sont des fonctions qui renvoient un code HRESULT que vous pouvez tester pour savoir si la fonction s'est exécutée avec succès.

La syntaxe des méthodes et des propriétés dans Visual C++ est listée pour les éléments suivants :

  • Collections
  • Command, objet
  • Connection, objet
  • Error, objet
  • Field, objet
  • Parameter, objet
  • Record, objet
  • Recordset, objet
  • Stream, objet

Voir aussi

Index de la syntaxe ADO pour Visual C++ avec #import | Page de démarrage des objets de données ActiveX


Collections (syntaxe ADO pour Visual C++)

Paramètres

Méthodes

Append(IDispatch *Object)
Delete(VARIANT Index)
Refresh(void)

Propriétés

get_Count(long *c)
get_Item(VARIANT Index, _ADOParameter **ppvObject)

Champs

Méthodes

Append(BSTR bstrName, DataTypeEnum Type, long DefinedSize, FieldAttributeEnum Attrib)
Delete(VARIANT Index)
Refresh(void)

Propriétés

get_Count(long *c)
get_Item(VARIANT Index, ADOField **ppvObject)

Erreurs

Méthodes

Clear(void)
Refresh(void)

Propriétés

get_Count(long *c)
get_Item(VARIANT Index, ADOError **ppvObject)

Propriétés

Méthodes

Refresh(void)

Propriétés

get_Count(long *c)
get_Item(VARIANT Index, ADOProperty **ppvObject)

Voir aussi

Errors, collection | Fields, collection | Parameters, collection | Properties, collection


Command (syntaxe ADO pour Visual C++)

Méthodes

Cancel(void)
CreateParameter(BSTR Name, DataTypeEnum Type, ParameterDirectionEnum Direction, long Size, VARIANT Value, _ADOParameter **ppiprm)
Execute(VARIANT *RecordsAffected, VARIANT *Parameters, long Options, _ADORecordset **ppirs)

Propriétés

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)

Command, objet


Connection (syntaxe ADO pour Visual C++)

Méthodes

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)

Propriétés

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)

Événements

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)

Connection, objet


Error (syntaxe ADO pour Visual C++)

Propriétés

get_Description(BSTR *pbstr)
get_NativeError(long *pl)
get_Number(long *pl)
get_Source(BSTR *pbstr)
get_SQLState(BSTR *pbstr)

Error, objet


Field (syntaxe ADO pour Visual C++)

Méthodes

AppendChunk(VARIANT Data)
GetChunk(long Length, VARIANT *pvar)

Propriétés

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)

Field, objet


Parameter (syntaxe ADO pour Visual C++)

Méthodes

AppendChunk(VARIANT Val)

Propriétés

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)

Parameter, objet


Record (syntaxe ADO pour Visual C++)

Méthodes

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)

Propriétés

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)

Record, objet


Recordset (syntaxe ADO pour Visual C++)

Méthodes

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)

Propriétés

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)

Événements

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)

Recordset, objet


Stream (syntaxe ADO pour Visual C++)

Méthodes

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)

Propriétés

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)

Stream, objet


Index de la syntaxe ADO pour Visual C++ avec #import

Cet index dresse la liste des correspondances avec les rubriques du Guide de référence du langage ADO basées sur Microsoft Visual C++ et la directive #import.

Il a été dérivé en compilant un programme avec la directive #import par rapport à la DLL ADO, puis en remettant en forme le fichier *.tlh ainsi généré. Seules les informations concernant les méthodes, propriétés et événements ont été conservées. L'autre syntaxe déclarée pour chaque propriété est indiquée par la directive « __declspec(property...) » correspondante.

Il est fortement recommandé de lire Programmation ADO en Visual C++ pour plus d'informations.

La syntaxe des méthodes et des propriétés dans Visual C++ avec la directive #import est listée pour les éléments suivants :

  • Collections ADO
  • Command, objet
  • Connection, objet
  • Error, objet
  • Field, objet
  • Parameter, objet
  • Property, objet
  • Record, objet
  • Recordset, objet
  • Stream, objet
  • ConnectionEvents
  • RecordsetEvents

Index de la syntaxe ADO pour Visual C++ pour COM


Collections (index de la syntaxe Visual C++ avec #import)

Il est utile de savoir que les collections héritent de certaines méthodes et propriétés courantes.

Toutes les collections héritent de la propriété Count et de la méthode Refresh, et toutes les collections ajoutent la propriété Item. La collection Errors ajoute la méthode Clear. La collection Parameters hérite des méthodes Append et Delete, alors que la collection Fields ajoute les méthodes Append, Delete et Update.

Properties, collection

Méthodes

HRESULT Refresh( );

Propriétés

long GetCount( );
__declspec(property(get=GetCount)) long Count;

PropertyPtr GetItem( const _variant_t & Index );
__declspec(property(get=GetItem)) PropertyPtr Item[];

Errors, collection

Méthodes

HRESULT Clear( );

HRESULT Refresh( );

Propriétés

long GetCount( );
__declspec(property(get=GetCount)) long Count;

PropertyPtr GetItem( const _variant_t & Index );
__declspec(property(get=GetItem)) PropertyPtr Item[];

Parameters, collection

Méthodes

HRESULT Append( IDispatch * Object );

HRESULT Delete( const _variant_t & Index );

HRESULT Refresh( );

Propriétés

long GetCount( );
__declspec(property(get=GetCount)) long Count;

PropertyPtr GetItem( const _variant_t & Index );
__declspec(property(get=GetItem)) PropertyPtr Item[];

Fields, collection

Méthodes

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( );

Propriétés

long GetCount( );
__declspec(property(get=GetCount)) long Count;

PropertyPtr GetItem( const _variant_t & Index );
__declspec(property(get=GetItem)) PropertyPtr Item[];

Voir aussi

Errors, collection | Fields, collection | Parameters, collection | Properties, collection


Command (index de la syntaxe Visual C++ avec #import)

Méthodes

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 );

Propriétés

_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;

Command, objet


Connection (index de la syntaxe Visual C++ avec #import)

Méthodes

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 );

Propriétés

_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;

Connection, objet


Error (index de la syntaxe Visual C++ avec #import)

Propriétés

_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;

Error, objet


Field (index de la syntaxe Visual C++ avec #import)

Méthodes

HRESULT AppendChunk( const _variant_t & Data );

_variant_t GetChunk( long Length );

Propriétés

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;

Field, objet


Parameter (index de la syntaxe Visual C++ avec #import)

Méthodes

HRESULT AppendChunk( const _variant_t & Val );

Propriétés

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;

Parameter, objet


Property (index de la syntaxe Visual C++ avec #import)

Propriétés

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;

Property, objet


Record (index de la syntaxe Visual C++ avec #import)

Méthodes

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 );

Propriétés

_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;

Record, objet


Recordset (index de la syntaxe Visual C++ avec #import)

Méthodes

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 );

Propriétés

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;

Recordset, objet


Stream (index de la syntaxe Visual C++ avec #import)

Méthodes

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 );

Propriétés

_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;

Stream, objet


ConnectionEvents (index de la syntaxe Visual C++ avec #import)

Événements

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 );


RecordsetEvents (index de la syntaxe Visual C++ avec #import)

Événements

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 );


Index de la syntaxe ADO/WFC

Le Guide de référence du langage ADO utilise le langage de programmation Microsoft Visual Basic pour illustrer la syntaxe des méthodes et propriétés ADO. Cet index dresse la liste des correspondances avec les rubriques du Guide de référence du langage ADO basées sur Microsoft Visual J++ et ADO pour Windows Foundation Classes (ADO/WFC). Quand il existe des différences dans la syntaxe, utilisez les signatures de fonction de cet index contrairement aux listes de syntaxe dans la rubrique de référence du langage.

La syntaxe des méthodes et des propriétés est indiquée pour les éléments suivants :

Objets de données ActiveX

  • Collections ADO
  • Command, objet
  • Connection, objet
  • Error, objet
  • Field, objet
  • Parameter, objet
  • Recordset, objet

RDS (Remote Data Service)

  • DataSpace
  • ObjectProxy

Voir aussi

Modèle d'événement ADO, opérations synchrones et asynchrones | ADO pour Windows Foundation Classes | Page de démarrage des objets de données ActiveX


Collections (syntaxe ADO/WFC)

Package com.ms.wfc.data

Paramètres

Méthodes

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)

Propriétés

public int getCount()

Champs

Méthodes

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)

Propriétés

public int getCount()

Erreurs

Méthodes

public void clear()
public void refresh()
public com.ms.wfc.data.Error getItem(int n)
public com.ms.wfc.data.Error getItem(String s)

Propriétés

public int getCount()

Voir aussi

Errors, collection | Fields, collection | Parameters, collection


Command (syntaxe ADO/WFC)

Package com.ms.wfc.data

Constructeur

public Command()
public Command(String commandtext)

Méthodes

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()

La méthode executeUpdate est particulière car elle appelle la méthode ADO execute sous-jacente à l'aide de certains paramètres. La méthode executeUpdate ne prend pas en charge le renvoi d'un objet Recordset, par conséquent le paramètre options de la méthode execute est modifié par AdoEnums.ExecuteOptions.NORECORDS. Une fois l'exécution de la méthode execute effectuée, son paramètre RecordsAffected mis à jour est retransmis à la méthode executeUpdate, laquelle est finalement renvoyée sous forme de int.

Propriétés

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()

Command, objet


Connection (syntaxe ADO/WFC)

Package com.ms.wfc.data

Constructeur

public Connection()
public Connection(String connectionstring)

Méthodes

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)

La méthode executeUpdate est particulière car elle appelle la méthode ADO execute sous-jacente à l'aide de certains paramètres. La méthode executeUpdate ne prend pas en charge le renvoi d'un objet Recordset, par conséquent le paramètre options de la méthode execute est modifié par AdoEnums.ExecuteOptions.NORECORDS. Une fois l'exécution de la méthode execute effectuée, son paramètre RecordsAffected mis à jour est retransmis à la méthode executeUpdate, laquelle est finalement renvoyée sous forme de int.

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)

Propriétés

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()

Événements

Pour plus d'informations sur les événements ADO/WFC, consultez Instanciation d'événements ADO par langage.

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)

Connection, objet


DataSpace (syntaxe ADO/WFC)

La méthode createObject de la classe DataSpace spécifie un objet Business pour traiter des demandes d'applications clientes (progid) ainsi que le protocole et le serveur de communications (connection). La méthode createObject renvoie un objet ObjectProxy qui représente le serveur.

Package com.ms.wfc.data

Constructeur

public DataSpace()

Méthodes

public static ObjectProxy DataSpace.createObject(String
    progid, String connection)

Propriétés

public static int getInternetTimeout()
public static void setInternetTimeout(int plInetTimeout)

Voir aussi

DataSpace, objet (RDS)


Error (syntaxe ADO/WFC)

Package com.ms.wfc.data

Propriétés

public String getDescription()
public int getNativeError()
public int getNumber()
public String getSource()
public String getSQLState()

Error, objet


Field (syntaxe ADO/WFC)

Package com.ms.wfc.data

Méthodes

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)

Propriétés

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)

(Pour plus d'informations, consultez la documentation Microsoft Visual J++ WFC Reference pour l'interface com.ms.wfc.data.IDataFormat.)

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()

Méthodes d'accès à l'objet Field

La propriété Value d'un objet Field renvoie ou définit le contenu de cet objet. Le contenu est représenté sous forme de VARIANT, un type d'objet auquel il est possible d'affecter une valeur et plusieurs types de données.

ADO/WFC implémente la propriété Value à l'aide de la méthode getValue qui renvoie un objet VARIANT et de la méthode setValue qui accepte un argument de type VARIANT. Les types VARIANT sont particulièrement performants dans certains langages tels que Microsoft Visual Basic. Cependant, vous pouvez obtenir de meilleures performances dans Microsoft Visual J++ en utilisant des types de données Java natifs.

Outre la propriété Value, ADO/WFC propose des méthodes accessor qui utilisent des types de données Java pour renvoyer et définir le contenu d'objets Field. La plupart de ces méthodes portent des noms de la forme get DataType ou set DataType.

Il convient de noter deux exceptions : l'une des méthodes getObject renvoie un objet devant obligatoirement appartenir à une classe spécifiée ; il n'existe pas de propriété getNull, mais il existe une propriété isNull qui renvoie une valeur booléenne indiquant si le champ est Null.

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)

Field, objet


ObjectProxy (syntaxe ADO/WFC)

Un objet ObjectProxy représente un serveur ; il est renvoyé par la méthode createObject de l'objet DataSpace. La classe ObjectProxy possède une méthode call, qui peut faire appel à une méthode du serveur et renvoyer un objet comme résultat de cet appel.

Package com.ms.wfc.data

Méthodes

Call, méthode (syntaxe ADO/WFC)

La méthode Call appelle une méthode sur le serveur représenté par ObjectProxy. Des arguments peuvent éventuellement être passés à cette méthode sous la forme d'un tableau d'objets.

Syntaxe

public Object ObjectProxy.call( String method )
public Object ObjectProxy.call( String method, Object[] args)

Renvoie

Objet
Un objet résultant de l'appel à cette méthode

Paramètres

ObjectProxy
Objet ObjectProxy qui représente le serveur.
method
Chaîne contenant le nom de la méthode à appeler sur le serveur
args
Facultatif. Tableau d'objets représentant les arguments de la méthode sur le serveur. Les types de données Java sont automatiquement convertis en types de données utilisables par le serveur.


Parameter (syntaxe ADO/WFC)

Package com.ms.wfc.data

Constructeur

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)

Méthodes

public void appendChunk(byte[] bytes)
public void appendChunk(char[] chars)
public void appendChunk(String chars)

Propriétés

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()

Méthodes d'accès à l'objet Parameter

La propriété Value d'un objet Parameter renvoie ou définit le contenu de cet objet. Le contenu est représenté sous forme de VARIANT, un type d'objet auquel il est possible d'affecter une valeur et plusieurs types de données.

ADO/WFC implémente la propriété Value à l'aide de la méthode getValue qui renvoie un objet VARIANT et de la méthode setValue qui accepte un argument de type VARIANT. Les types VARIANT sont particulièrement performants dans certains langages tels que Microsoft Visual Basic. Cependant, vous pouvez obtenir de meilleures performances dans Microsoft Visual J++ en utilisant des types de données Java natifs.

Outre la propriété Value, ADO/WFC propose des méthodes accessor qui utilisent des types de données Java pour renvoyer et définir le contenu d'objets Parameter. La plupart de ces méthodes portent des noms de la forme get DataType ou set DataType.

Il convient de noter une exception : il n'existe pas de propriété getNull, mais il existe une propriété isNull qui renvoie une valeur booléenne indiquant si le champ est Null.

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()

Parameter, objet


Recordset (syntaxe ADO/WFC)

Package com.ms.wfc.data

Constructeurs

public Recordset()
public Recordset(Object r)

Méthodes

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)

Propriétés

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()

Événements

Pour plus d'informations sur les événements ADO/WFC, consultez Instanciation d'événements ADO par langage.

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)

Recordset, objet


Exemples de code ADO

Utilisez les exemples de code ci-dessous pour apprendre à utiliser les objets, méthodes, propriétés et événements ADO.

Remarque Collez entièrement les exemples de code dans votre éditeur de code. L'exemple risque de ne pas fonctionner correctement si des copies partielles d'exemple sont utilisées ou si la mise en forme des paragraphes est perdue.
  • Exemples de code ADO en Microsoft Visual Basic
  • Exemples de code ADO en Microsoft Visual Basic Scripting Edition
  • Exemples de code ADO en Microsoft Visual C++
  • Exemples de code ADO en Microsoft Visual J++
  • Exemples de code ADO en Microsoft JScript


Exemples de code ADO en Microsoft Visual Basic

Utilisez les exemples de code ci-dessous pour apprendre à utiliser les méthodes, propriétés et événements ADO lorsque vous programmez en Visual Basic.

Remarque Collez l'exemple de code dans sa totalité, de Sub à End Sub, dans votre éditeur de code. L'exemple risque de ne pas fonctionner correctement si des copies partielles d'exemple sont utilisées ou si la mise en forme des paragraphes est perdue.

Méthodes

  • Exemple de méthode AddNew
  • Exemple de méthodes Append et CreateParameter
  • Exemple de méthodes AppendChunk et GetChunk
  • Exemple de méthodes BeginTrans, CommitTrans et RollbackTrans
  • Exemple de méthode Cancel
  • Exemple de méthode Clone
  • Exemple de méthode CompareBookmarks
  • Exemple de méthode ConvertToString
  • Exemple de méthodes CopyRecord, CopyTo et SaveToFile
  • Exemple de méthode CreateRecordset
  • Exemple de méthode Delete
  • Exemple de méthodes DeleteRecord et MoveRecord
  • Exemple de méthodes Execute, Requery et Clear
  • Exemple de méthode Find
  • Exemple de méthode GetRows
  • Exemple de méthode GetString
  • Exemple de méthode SkipLine, de propriétés EOS et LineSeparator
  • Exemple de méthode Move
  • Exemple de méthodes MoveFirst, MoveLast, MoveNext et MovePrevious
  • Exemple de méthode NextRecordset
  • Exemple de méthodes Open et Close
  • Exemple de méthode OpenSchema
  • Exemple de méthodes Read, ReadText, Write et WriteText
  • Exemple de méthode Refresh
  • Exemple de méthode Resync
  • Exemple de méthodes Save et Open
  • Exemple de méthode Seek et de propriété Index
  • Exemple de méthode Supports
  • Exemple de méthodes Update et CancelUpdate
  • Exemple de méthodes UpdateBatch et CancelBatch

Propriétés

  • Exemple de propriétés AbsolutePage, PageCount et PageSize
  • Exemple de propriétés AbsolutePosition et CursorLocation
  • Exemple de propriété ActiveCommand
  • Exemple de propriétés ActiveConnection, CommandText, CommandTimeout, CommandType, Size et Direction
  • Exemple de propriétés ActualSize et DefinedSize
  • Exemple de propriétés Attributes et Name
  • Exemple de propriétés BOF, EOF et Bookmark
  • Exemple de propriété CacheSize
  • Exemple de propriétés ConnectionString, ConnectionTimeout et State
  • Exemple de propriété Count
  • Exemple de propriétés CursorType, LockType et EditMode
  • Exemple de propriétés Description, HelpContext, HelpFile, NativeError, Number, Source et SQLState
  • Exemple de propriétés EOS et LineSeparator, et de méthode SkipLine
  • Exemple de propriétés Filter et RecordCount
  • Exemple de propriétés IsolationLevel et Mode
  • Exemple de propriété Item
  • Exemple de propriété MarshalOptions
  • Exemple de propriété MaxRecords
  • Exemple de propriétés NumericScale et Precision
  • Exemple de propriété Optimize
  • Exemple de propriétés OriginalValue et UnderlyingValue
  • Exemple de propriété Prepared
  • Exemple de propriétés Provider et DefaultDatabase
  • Exemple de propriété Sort
  • Exemple de propriété Source
  • Exemple de propriété State
  • Exemple de propriété Status
  • Exemple de propriété StayInSync
  • Exemple de propriété Type (Field)
  • Exemple de propriété Type (Property)
  • Exemple de propriété Value
  • Exemple de propriété Version

Voir aussi

Exemples de code ADO en Microsoft Visual Basic Scripting Edition | Exemples de code ADO en Microsoft Visual C++ | Exemples de code ADO en Microsoft Visual J++


Exemple de propriétés AbsolutePage, PageCount et PageSize (VB)

'BeginAbsolutePageVB

    'To integrate this code
    'replace the data source and initial catalog values
    'in the connection string

Public Sub Main()
    On Error GoTo ErrorHandler

    'recordset and connection variables
    Dim rstEmployees As ADODB.Recordset
    Dim Cnxn As ADODB.Connection
    Dim strCnxn As String
    Dim strSQL As String
        'record variables
    Dim strMessage As String
    Dim intPage As Integer
    Dim intPageCount As Integer
    Dim intRecord As Integer

    'Open connection
    Set Cnxn = New ADODB.Connection
    strCnxn = "Provider='sqloledb';Data Source='MySqlServer';" & _
        "Initial Catalog='Pubs';Integrated Security='SSPI';"
    Cnxn.Open strCnxn

    ' Open employee recordset
    ' Use client cursor to enable AbsolutePosition property
    Set rstEmployees = New ADODB.Recordset
    strSQL = "employee"
    rstEmployees.Open strSQL, strCnxn, adUseClient, adLockReadOnly, adCmdTable

    ' Display names and hire dates, five records at a time
    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

    ' clean up
    rstEmployees.Close
    Cnxn.Close
    Set rstEmployees = Nothing
    Set Cnxn = Nothing
    Exit Sub

ErrorHandler:
    ' clean up
    If Not rstEmployees Is Nothing Then
        If rstEmployees.State = adStateOpen Then rstEmployees.Close
    End If
    Set rstEmployees = Nothing

    If Not Cnxn Is Nothing Then
        If Cnxn.State = adStateOpen Then Cnxn.Close
    End If
    Set Cnxn = Nothing

    If Err <> 0 Then
        MsgBox Err.Source & "-->" & Err.Description, , "Error"
    End If
End Sub
'EndAbsolutePageVB

Voir aussi

AbsolutePage, propriété | PageCount, propriété | PageSize, propriété | Recordset, objet


Exemple de propriétés AbsolutePosition et CursorLocation (VB)

Cet exemple illustre comment la propriété AbsolutePosition peut suivre la progression d'une boucle énumérant tous les enregistrements d'un objet Recordset. Il utilise la propriété CursorLocation pour activer la propriété AbsolutePosition en sélectionnant le type de curseur côté client.

'BeginAbsolutePositionVB

    'To integrate this code
    'replace the data source and initial catalog values
    'in the connection string

Public Sub Main()
    On Error GoTo ErrorHandler

    'recordset and connection variables
    Dim rstEmployees As ADODB.Recordset
    Dim Cnxn As ADODB.Connection
    Dim strCnxn As String
    Dim strSQL As String
        'record variables
    Dim strMessage As String

    'Open connection
    Set Cnxn = New ADODB.Connection
    strCnxn = "Provider='sqloledb';Data Source='MySqlServer';" & _
        "Initial Catalog='Pubs';Integrated Security='SSPI';"
    Cnxn.Open strCnxn

    ' Open Employee recordset with
    ' Client-side cursor to enable AbsolutePosition property
    Set rstEmployees = New ADODB.Recordset
    strSQL = "employee"
    rstEmployees.Open strSQL, strCnxn, adUseClient, adLockReadOnly, adCmdTable

    ' Enumerate Recordset
    Do While Not rstEmployees.EOF
        ' Display current record information
        strMessage = "Employee: " & rstEmployees!lname & vbCr & _
            "(record " & rstEmployees.AbsolutePosition & _
            " of " & rstEmployees.RecordCount & ")"
        If MsgBox(strMessage, vbOKCancel) = vbCancel Then Exit Do
        rstEmployees.MoveNext
    Loop

    ' clean up
    rstEmployees.Close
    Cnxn.Close
    Set rstEmployees = Nothing
    Set Cnxn = Nothing
    Exit Sub

ErrorHandler:
   ' clean up
    If Not rstEmployees Is Nothing Then
        If rstEmployees.State = adStateOpen Then rstEmployees.Close
    End If
    Set rstEmployees = Nothing

    If Not Cnxn Is Nothing Then
        If Cnxn.State = adStateOpen Then Cnxn.Close
    End If
    Set Cnxn = Nothing

    If Err <> 0 Then
        MsgBox Err.Source & "-->" & Err.Description, , "Error"
    End If
End Sub
'EndAbsolutePositionVB

Voir aussi

AbsolutePosition, propriété | CursorLocation, propriété | Recordset, objet


Exemple de propriété ActiveCommand (VB)

Cet exemple utilise la propriété ActiveCommand.

Un objet Recordset dont la propriété ActiveCommand permet d'afficher le texte et le paramètre de la commande ayant servi à la création du Recordset est attribué à une sous-routine.

'BeginActiveCommandVB

    'To integrate this code
    'replace the data source and initial catalog values
    'in the connection string

Public Sub Main()
    On Error GoTo ErrorHandler

        'recordset and connection variables
    Dim cmd As ADODB.Command
    Dim rst As ADODB.Recordset
    Dim Cnxn As ADODB.Connection
    Dim strCnxn As String
        'record variables
    Dim strPrompt As String
    Dim strName As String

    Set Cnxn = New ADODB.Connection
    Set cmd = New ADODB.Command

    strPrompt = "Enter an author's name (e.g., Ringer): "
    strName = Trim(InputBox(strPrompt, "ActiveCommandX Example"))
    strCnxn = "Provider='sqloledb';Data Source='MySqlServer';" & _
        "Initial Catalog='Pubs';Integrated Security='SSPI';"

        'create SQL command string
    cmd.CommandText = "SELECT * FROM Authors WHERE au_lname = ?"
    cmd.Parameters.Append cmd.CreateParameter("LastName", adChar, adParamInput, 20, strName)

    Cnxn.Open strCnxn
    cmd.ActiveConnection = Cnxn

        'create the recordset by executing command string
    Set rst = cmd.Execute(, , adCmdText)
        'see the results
    Call ActiveCommandXprint(rst)

    ' clean up
    Cnxn.Close
    Set rst = Nothing
    Set Cnxn = Nothing
    Exit Sub

ErrorHandler:
    ' clean up
    If Not rst Is Nothing Then
        If rst.State = adStateOpen Then rst.Close
    End If
    Set rst = Nothing

    If Not Cnxn Is Nothing Then
        If Cnxn.State = adStateOpen Then Cnxn.Close
    End If
    Set Cnxn = Nothing

    If Err <> 0 Then
        MsgBox Err.Source & "-->" & Err.Description, , "Error"
    End If
End Sub
'EndActiveCommandVB

La routine ActiveCommandXprint est associée seulement à un objet Recordset, mais elle doit quand même imprimer le texte de la commande et le paramètre ayant servi à la création du Recordset. Cette opération est possible car la propriété ActiveCommand de l'objet Recordset génère l'objet Command associé.

La propriété CommandText de l'objet Command génère la commande paramétrée ayant créé le Recordset. La collection Parameters de l'objet Command génère la valeur qui a remplacé l'espace réservé (« ? ») du paramètre de la commande.

Enfin, un message d'erreur ou l'ID et le nom de l'auteur sont affichés.

'BeginActiveCommandPrintVB
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

    rstp.Close
    Set rstp = Nothing
End Sub

'Voir aussi EndActiveCommandPrintVB

ActiveCommand, propriété | Command, objet | Recordset, objet


Exemple de propriétés ActiveConnection, CommandText, CommandTimeout, CommandType, Size et Direction (VB)

Cet exemple utilise les propriétés ActiveConnection, CommandText, CommandTimeout, CommandType, Size et Direction pour exécuter une procédure stockée.

'BeginActiveConnectionVB

    'To integrate this code
    'replace the data source and initial catalog values
    'in the connection string

Public Sub Main()
    On Error GoTo ErrorHandler

    'recordset, command and connection variables
    Dim Cnxn As ADODB.Connection
    Dim cmdByRoyalty As ADODB.Command
    Dim prmByRoyalty As ADODB.Parameter
    Dim rstByRoyalty As ADODB.Recordset
    Dim rstAuthors As ADODB.Recordset
    Dim strCnxn As String
    Dim strSQLAuthors As String
    Dim strSQLByRoyalty As String
     'record variables
    Dim intRoyalty As Integer
    Dim strAuthorID As String

    ' Define a command object for a stored procedure
    Set Cnxn = New ADODB.Connection
    strCnxn = "Provider='sqloledb';Data Source='MySqlServer';" & _
        "Initial Catalog='Pubs';Integrated Security='SSPI';"
    Cnxn.Open strCnxn

    Set cmdByRoyalty = New ADODB.Command
    Set cmdByRoyalty.ActiveConnection = Cnxn
    ' Set the criteria
    strSQLByRoyalty = "byroyalty"
    cmdByRoyalty.CommandText = strSQLByRoyalty
    cmdByRoyalty.CommandType = adCmdStoredProc
    cmdByRoyalty.CommandTimeout = 15

    ' Define the stored procedure's input parameter
    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

    ' Create a recordset by executing the command.
    Set rstByRoyalty = cmdByRoyalty.Execute()

    ' Open the Authors Table to get author names for display
    Set rstAuthors = New ADODB.Recordset
    strSQLAuthors = "Authors"

    'rstAuthors.Open strSQLAuthors, strCnxn, , , adCmdTable
    rstAuthors.Open strSQLAuthors, strCnxn, adOpenForwardOnly, adLockReadOnly, adCmdTable
    'the above two lines of code are identical as the default values for
    'CursorType and LockType arguments match those shown

    ' Print the recordset and add author names from Table
    Debug.Print "Authors with " & intRoyalty & _
       " percent royalty"

    Do Until 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

    ' clean up
    rstAuthors.Close
    rstByRoyalty.Close
    Cnxn.Close
    Set rstAuthors = Nothing
    Set rstByRoyalty = Nothing
    Set Cnxn = Nothing
    Exit Sub

ErrorHandler:
    ' clean up
    If Not rstAuthors Is Nothing Then
        If rstAuthors.State = adStateOpen Then rstAuthors.Close
    End If
    Set rstAuthors = Nothing

    If Not rstByRoyalty Is Nothing Then
        If rstByRoyalty.State = adStateOpen Then rstByRoyalty.Close
    End If
    Set rstByRoyalty = Nothing

    If Not Cnxn Is Nothing Then
        If Cnxn.State = adStateOpen Then Cnxn.Close
    End If
    Set Cnxn = Nothing

    If Err <> 0 Then
        MsgBox Err.Source & "-->" & Err.Description, , "Error"
    End If
End Sub
'EndActiveConnectionVB

Voir aussi

ActiveCommand, propriété | Command, objet | CommandText, propriété | CommandTimeout, propriété | CommandType, propriété | Connection, objet | Direction, propriété | Parameter, objet | Record, objet | Recordset, objet | Size, propriété


Exemple de propriétés ActualSize et DefinedSize (VB)

Cet exemple utilise les propriétés ActualSize et DefinedSize pour afficher la taille définie et la taille réelle d'un champ.

'BeginActualSizeVB

    'To integrate this code
    'replace the data source and initial catalog values
    'in the connection string

Public Sub Main()
    On Error GoTo ErrorHandler

    'recordset and connection variables
    Dim rstStores As ADODB.Recordset
    Dim SQLStores As String
    Dim strCnxn As String
     'record variables
    Dim strMessage As String

    ' Open a recordset for the Stores table
    strCnxn = "Provider='sqloledb';Data Source='MySqlServer';" & _
        "Initial Catalog='Northwind';Integrated Security='SSPI';"
    Set rstStores = New ADODB.Recordset

    SQLStores = "Suppliers"
    rstStores.Open SQLStores, strCnxn, adOpenForwardOnly, adLockReadOnly, adCmdTable
    'the above two lines of code are identical as the default values for
    'CursorType and LockType arguments match those indicated

    ' Loop through the recordset displaying the contents
    ' of the store_name field, the field's defined size,
    ' and its actual size.
    rstStores.MoveFirst

    Do Until rstStores.EOF
        strMessage = "Company name: " & rstStores!CompanyName & _
        vbCrLf & "Defined size: " & _
        rstStores!CompanyName.DefinedSize & _
        vbCrLf & "Actual size: " & _
        rstStores!CompanyName.ActualSize & vbCrLf

        MsgBox strMessage, vbOKCancel, "ADO ActualSize Property (Visual Basic)"
        rstStores.MoveNext
    Loop

    ' clean up
    rstStores.Close
    Set rstStores = Nothing
    Exit Sub

ErrorHandler:
    ' clean up
    If Not rstStores Is Nothing Then
        If rstStores.State = adStateOpen Then rstStores.Close
    End If
    Set rstStores = Nothing

    If Err <> 0 Then
        MsgBox Err.Source & "-->" & Err.Description, , "Error"
    End If
End Sub
'EndActualSizeVB

Voir aussi

ActualSize, propriété | DefinedSize, propriété | Field, objet


Exemple de méthode AddNew (VB)

Cet exemple utilise la méthode AddNew pour créer un enregistrement portant le nom indiqué.

'BeginAddNewVB

    'To integrate this code
    'replace the data source and initial catalog values
    'in the connection string

Public Sub Main()
    On Error GoTo ErrorHandler

    'recordset and connection variables
    Dim Cnxn As ADODB.Connection
    Dim rstEmployees As ADODB.Recordset
    Dim strCnxn As String
    Dim strSQL As String
     'record variables
    Dim strID As String
    Dim strFirstName As String
    Dim strLastName As String
    Dim blnRecordAdded As Boolean

    ' Open a connection
    Set Cnxn = New ADODB.Connection
    strCnxn = "Provider='sqloledb';Data Source='MySqlServer';" & _
        "Initial Catalog='Northwind';Integrated Security='SSPI';"
    Cnxn.Open strCnxn

    ' Open Employees Table with a cursor that allows updates
    Set rstEmployees = New ADODB.Recordset
    strSQL = "Employees"
    rstEmployees.Open strSQL, strCnxn, adOpenKeyset, adLockOptimistic, adCmdTable

    ' Get data from the user
    strFirstName = Trim(InputBox("Enter first name:"))
    strLastName = Trim(InputBox("Enter last name:"))

    ' Proceed only if the user actually entered something
    ' for both the first and last names
    If strFirstName <> "" And strLastName <> "" Then

        rstEmployees.AddNew
        rstEmployees!firstname = strFirstName
        rstEmployees!LastName = strLastName
        rstEmployees.Update
        blnRecordAdded = True

        ' Show the newly added data
        MsgBox "New record: " & rstEmployees!EmployeeId & " " & _
        rstEmployees!firstname & " " & rstEmployees!LastName

    Else
        MsgBox "Please enter a first name and last name."
    End If

    ' Delete the new record because this is a demonstration
    Cnxn.Execute "DELETE FROM Employees WHERE EmployeeID = '" & strID & "'"

    ' clean up
    rstEmployees.Close
    Cnxn.Close
    Set rstEmployees = Nothing
    Set Cnxn = Nothing
    Exit Sub

ErrorHandler:
   ' clean up
    If Not rstEmployees Is Nothing Then
        If rstEmployees.State = adStateOpen Then rstEmployees.Close
    End If
    Set rstEmployees = Nothing

    If Not Cnxn Is Nothing Then
        If Cnxn.State = adStateOpen Then Cnxn.Close
    End If
    Set Cnxn = Nothing

    If Err <> 0 Then
        MsgBox Err.Source & "-->" & Err.Description, , "Error"
    End If
End Sub
'EndAddNewVB

AddNew, méthode | Recordset, objet


Exemple de méthodes Append et CreateParameter (VB)

Cet exemple utilise les méthodes Append et CreateParameter pour exécuter une procédure stockée avec un paramètres d'entrée.

'BeginAppendVB

    'To integrate this code
    'replace the data source and initial catalog values
    'in the connection string

Public Sub Main()
    On Error GoTo ErrorHandler

    'recordset, command and connection variables
    Dim Cnxn As ADODB.Connection
    Dim cmdByRoyalty As ADODB.Command
    Dim prmByRoyalty As ADODB.Parameter
    Dim rstByRoyalty As ADODB.Recordset
    Dim rstAuthors As ADODB.Recordset
    Dim strCnxn As String
    Dim strSQLAuthors As String
    Dim strSQLByRoyalty As String
     'record variables
    Dim intRoyalty As Integer
    Dim strAuthorID As String

    ' Open connection
    Set Cnxn = New ADODB.Connection
    strCnxn = "Provider='sqloledb';Data Source='MySqlServer';" & _
        "Initial Catalog='Pubs';Integrated Security='SSPI';"
    Cnxn.Open strCnxn

    ' Open command object with one parameter
    Set cmdByRoyalty = New ADODB.Command
    cmdByRoyalty.CommandText = "byroyalty"
    cmdByRoyalty.CommandType = adCmdStoredProc

    ' Get parameter value and append parameter
    intRoyalty = Trim(InputBox("Enter royalty:"))
    Set prmByRoyalty = cmdByRoyalty.CreateParameter("percentage", adInteger, adParamInput)
    cmdByRoyalty.Parameters.Append prmByRoyalty
    prmByRoyalty.Value = intRoyalty

    ' Create recordset by executing the command
    Set cmdByRoyalty.ActiveConnection = Cnxn
    Set rstByRoyalty = cmdByRoyalty.Execute

    ' Open the Authors Table to get author names for display
    ' and set cursor client-side
    Set rstAuthors = New ADODB.Recordset
    strSQLAuthors = "Authors"
    rstAuthors.Open strSQLAuthors, Cnxn, adUseClient, adLockOptimistic, adCmdTable

    ' Print recordset adding author names from Authors table
    Debug.Print "Authors with " & intRoyalty & " percent royalty"

    Do Until 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

    ' clean up
    rstByRoyalty.Close
    rstAuthors.Close
    Cnxn.Close
    Set rstByRoyalty = Nothing
    Set rstAuthors = Nothing
    Set Cnxn = Nothing
    Exit Sub

ErrorHandler:
    ' clean up
    If Not rstByRoyalty Is Nothing Then
        If rstByRoyalty.State = adStateOpen Then rstByRoyalty.Close
    End If
    Set rstByRoyalty = Nothing

    If Not rstAuthors Is Nothing Then
        If rstAuthors.State = adStateOpen Then rstAuthors.Close
    End If
    Set rstAuthors = Nothing

    If Not Cnxn Is Nothing Then
        If Cnxn.State = adStateOpen Then Cnxn.Close
    End If
    Set Cnxn = Nothing

    If Err <> 0 Then
        MsgBox Err.Source & "-->" & Err.Description, , "Error"
    End If
End Sub
'EndAppendVB

Voir aussi

Append, méthode | CreateParameter, méthode | Field, objet | Fields, collection | Parameter, objet


Exemple de méthodes AppendChunk et GetChunk (VB)

Cet exemple utilise les méthodes AppendChunk et GetChunk pour ajouter dans un champ d'image des données provenant d'un autre enregistrement.

'BeginAppendChunkVB

    'To integrate this code
    'replace the data source and initial catalog values
    'in the connection string

Public Sub Main()
    On Error GoTo ErrorHandler

    'recordset and connection variables
    Dim Cnxn As ADODB.Connection
    Dim strCnxn As String
    Dim rstPubInfo As ADODB.Recordset
    Dim strSQLPubInfo As String
     'record variables
    Dim strPubID As String
    Dim strPRInfo As String
    Dim lngOffset As Long
    Dim lngLogoSize As Long
    Dim varLogo As Variant
    Dim varChunk As Variant
    Dim strMsg As String

    Const conChunkSize = 100

    ' Open a connection
    Set Cnxn = New ADODB.Connection
    strCnxn = "Provider='sqloledb';Data Source='MySqlServer';" & _
        "Initial Catalog='Pubs';Integrated Security='SSPI';"
    Cnxn.Open strCnxn

    ' Open the pub_info table with a cursor that allows updates
    Set rstPubInfo = New ADODB.Recordset
    strSQLPubInfo = "pub_info"
    rstPubInfo.Open strSQLPubInfo, Cnxn, adOpenKeyset, adLockOptimistic, adCmdTable

    ' Prompt for a logo to copy
    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)

    ' Copy the logo to a variable in chunks
    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

    ' Get data from the user
    strPubID = Trim(InputBox("Enter a new pub ID" & _
                             " [must be > 9899 & < 9999]:"))

    strPRInfo = Trim(InputBox("Enter descriptive text:"))

    ' Add the new publisher to the publishers table to avoid
    ' getting an error due to foreign key constraint
    Cnxn.Execute "INSERT publishers(pub_id, pub_name) VALUES('" & _
                   strPubID & "','Your Test Publisher')"

    ' Add a new record, copying the logo in chunks
    rstPubInfo.AddNew
    rstPubInfo!pub_id = strPubID
    rstPubInfo!pr_info = strPRInfo

    lngOffset = 0 ' Reset offset
    Do While lngOffset < lngLogoSize
        varChunk = LeftB(RightB(varLogo, lngLogoSize - lngOffset), _
            conChunkSize)
        rstPubInfo!logo.AppendChunk varChunk
        lngOffset = lngOffset + conChunkSize
    Loop
    rstPubInfo.Update

    ' Show the newly added data
    MsgBox "New record: " & rstPubInfo!pub_id & vbCr & _
        "Description: " & rstPubInfo!pr_info & vbCr & _
        "Logo size: " & rstPubInfo!logo.ActualSize

    ' Delete new records because this is a demo
    rstPubInfo.Requery
    Cnxn.Execute "DELETE FROM pub_info " & _
        "WHERE pub_id = '" & strPubID & "'"

    Cnxn.Execute "DELETE FROM publishers " & _
        "WHERE pub_id = '" & strPubID & "'"

    ' clean up
    rstPubInfo.Close
    Cnxn.Close
    Set rstPubInfo = Nothing
    Set Cnxn = Nothing
    Exit Sub

ErrorHandler:
   ' clean up
    If Not rstPubInfo Is Nothing Then
        If rstPubInfo.State = adStateOpen Then rstPubInfo.Close
    End If
    Set rstPubInfo = Nothing

    If Not Cnxn Is Nothing Then
        If Cnxn.State = adStateOpen Then Cnxn.Close
    End If
    Set Cnxn = Nothing

    If Err <> 0 Then
        MsgBox Err.Source & "-->" & Err.Description, , "Error"
    End If
End Sub
'EndAppendChunkVB

Voir aussi

AppendChunk, méthode | Field, objet | GetChunk, méthode | Parameter, objet


Exemple de propriétés Attributes et Name (VB)

Cet exemple affiche la valeur de la propriété Attributes pour les objets Connection, Field et Property. Il utilise la propriété Name pour afficher le nom de chaque objet Field et Property.

'BeginAttributesVB

    'To integrate this code
    'replace the data source and initial catalog values
    'in the connection string

Public Sub Main()
    On Error GoTo ErrorHandler

    'recordset and connection variables
    Dim Cnxn As ADODB.Connection
    Dim strCnxn As String
    Dim rstEmployees As ADODB.Recordset
    Dim strSQLEmployee As String
     'record variables
    Dim adoField As ADODB.Field
    Dim adoProp As ADODB.Property

    ' Open connection
    strCnxn = "Provider='sqloledb';Data Source='MySqlServer';" & _
        "Initial Catalog='Pubs';Integrated Security='SSPI';"
    Set Cnxn = New ADODB.Connection
    Cnxn.Open strCnxn

    ' Open recordset
    Set rstEmployees = New ADODB.Recordset
    strSQLEmployee = "employee"
    rstEmployees.Open strSQLEmployee, Cnxn, adOpenForwardOnly, adLockReadOnly, adCmdTable
    'the above two lines openign the recordset are identical as
    'the default values for CursorType and LockType arguments match those shown

    ' Display the attributes of the connection
    Debug.Print "Connection attributes = " & Cnxn.Attributes

    ' Display the property attributes of the Employee Table
    Debug.Print "Property attributes:"
    For Each adoProp In rstEmployees.Properties
        Debug.Print "   " & adoProp.Name & " = " & adoProp.Attributes
    Next adoProp

    ' Display the field attributes of the Employee Table
    Debug.Print "Field attributes:"
    For Each adoField In rstEmployees.Fields
       Debug.Print "   " & adoField.Name & " = " & adoField.Attributes
    Next adoField

    ' Display fields of the Employee Table which are NULLABLE
    Debug.Print "NULLABLE Fields:"
    For Each adoField In rstEmployees.Fields
        If CBool(adoField.Attributes And adFldIsNullable) Then
            Debug.Print "   " & adoField.Name
        End If
    Next adoField

    ' clean up
    rstEmployees.Close
    Cnxn.Close
    Set rstEmployees = Nothing
    Set Cnxn = Nothing
    Exit Sub

ErrorHandler:
    ' clean up
    If Not rstEmployees Is Nothing Then
        If rstEmployees.State = adStateOpen Then rstEmployees.Close
    End If
    Set rstEmployees = Nothing

    If Not Cnxn Is Nothing Then
        If Cnxn.State = adStateOpen Then Cnxn.Close
    End If
    Set Cnxn = Nothing

    If Err <> 0 Then
        MsgBox Err.Source & "-->" & Err.Description, , "Error"
    End If
End Sub
'EndAttributesVB

Voir aussi

Attributes, propriété | Connection, objet | Field, objet | Name, propriété | Property, objet


Exemple de méthodes BeginTrans, CommitTrans et RollbackTrans (VB)

Cet exemple change le type de tous les livres de psychologie figurant dans la table Titles de la base de données. Une fois que la méthode BeginTrans a commencé une transaction qui identifie toutes les modifications effectuées dans la table Titles, la méthode CommitTrans enregistre ces modifications. Vous pouvez utiliser la méthode RollbackTrans pour annuler les modifications que vous avez enregistrées à l'aide de la méthode Update.

'BeginBeginTransVB

    'To integrate this code
    'replace the data source and initial catalog values
    'in the connection string

Public Sub Main()
    On Error GoTo ErrorHandler

    'recordset and connection variables
    Dim Cnxn As ADODB.Connection
    Dim strCnxn As String
    Dim rstTitles As ADODB.Recordset
    Dim strSQLTitles As String
    'record variables
    Dim strTitle As String
    Dim strMessage As String

    ' Open connection
    strCnxn = "Provider='sqloledb';Data Source='MySqlServer';" & _
        "Initial Catalog='Pubs';Integrated Security='SSPI';"
    Set Cnxn = New ADODB.Connection
    Cnxn.Open strCnxn

    ' Open recordset dynamic to allow for changes
    Set rstTitles = New ADODB.Recordset
    strSQLTitles = "Titles"
    rstTitles.Open strSQLTitles, Cnxn, adOpenDynamic, adLockPessimistic, adCmdTable

    Cnxn.BeginTrans

    ' Loop through recordset and prompt user
    ' to change the type for a specified title

    rstTitles.MoveFirst

    Do Until rstTitles.EOF
        If Trim(rstTitles!Type) = "psychology" Then
            strTitle = rstTitles!Title
            strMessage = "Title: " & strTitle & vbCr & _
            "Change type to self help?"

            ' If yes, change type for the specified title
            If MsgBox(strMessage, vbYesNo) = vbYes Then
                rstTitles!Type = "self_help"
                rstTitles.Update
            End If
        End If
    rstTitles.MoveNext
    Loop

    ' Prompt user to commit all changes made
    If MsgBox("Save all changes?", vbYesNo) = vbYes Then
        Cnxn.CommitTrans
    Else
        Cnxn.RollbackTrans
    End If

    ' Print recordset
    rstTitles.Requery
    rstTitles.MoveFirst
    Do While Not rstTitles.EOF
        Debug.Print rstTitles!Title & " - " & rstTitles!Type
        rstTitles.MoveNext
    Loop

    ' Restore original data as this is a demo
    rstTitles.MoveFirst

    Do Until rstTitles.EOF
        If Trim(rstTitles!Type) = "self_help" Then
            rstTitles!Type = "psychology"
            rstTitles.Update
        End If
        rstTitles.MoveNext
    Loop

    ' clean up
    rstTitles.Close
    Cnxn.Close
    Set rstTitles = Nothing
    Set Cnxn = Nothing
    Exit Sub

ErrorHandler:
    ' clean up
    If Not rstTitles Is Nothing Then
        If rstTitles.State = adStateOpen Then rstTitles.Close
    End If
    Set rstTitles = Nothing

    If Not Cnxn Is Nothing Then
        If Cnxn.State = adStateOpen Then Cnxn.Close
    End If
    Set Cnxn = Nothing

    If Err <> 0 Then
        MsgBox Err.Source & "-->" & Err.Description, , "Error"
    End If
End Sub

'EndBeginTransVB

Voir aussi

BeginTrans, CommitTrans et RollbackTrans, méthodes | Connection, objet


Exemple de propriétés BOF, EOF et Bookmark (VB)

Cet exemple utilise les propriétés BOF et EOF pour afficher un message lorsqu'un utilisateur tente d'aller au-delà du premier ou du dernier enregistrement d'un objet Recordset. Il utilise également la propriété Bookmark qui permet à l'utilisateur de marquer un enregistrement dans un objet Recordset pour y revenir ultérieurement.

'BeginBOFVB

    'To integrate this code
    'replace the data source and initial catalog values
    'in the connection string

Public Sub Main()
    On Error GoTo ErrorHandler

    'recordset and connection variables
    Dim Cnxn As ADODB.Connection
    Dim rstPublishers As ADODB.Recordset
    Dim strCnxn As String
    Dim strSQLPubs As String
     'record variables
    Dim strMessage As String
    Dim intCommand As Integer
    Dim varBookmark As Variant

     ' open connection
    Set Cnxn = New ADODB.Connection
    strCnxn = "Provider='sqloledb';Data Source='MySqlServer';" & _
        "Initial Catalog='Pubs';Integrated Security='SSPI';"
    Cnxn.Open strCnxn

     ' Open recordset and use client cursor
     ' to enable AbsolutePosition property
    Set rstPublishers = New ADODB.Recordset
    strSQLPubs = "SELECT pub_id, pub_name FROM publishers ORDER BY pub_name"
    rstPublishers.Open strSQLPubs, strCnxn, adUseClient, adOpenStatic, adCmdText

    rstPublishers.MoveFirst
    Do Until rstPublishers.EOF
        ' Display information about current record
        ' and get user input
        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))

        ' Check user input
        Select Case intCommand
            Case 1
                ' Move forward trapping for EOF
                rstPublishers.MoveNext
                If rstPublishers.EOF Then
                    MsgBox "Moving past the last record." & _
                        vbCr & "Try again."
                    rstPublishers.MoveLast
                End If
            Case 2
                ' Move backward trapping for BOF
                rstPublishers.MovePrevious
                If rstPublishers.BOF Then
                    MsgBox "Moving past the first record." & _
                        vbCr & "Try again."
                    rstPublishers.MoveFirst
                End If
            Case 3
                ' Store the bookmark of the current record
                varBookmark = rstPublishers.Bookmark
            Case 4
                ' Go to the record indicated by the stored bookmark
                If IsEmpty(varBookmark) Then
                    MsgBox "No Bookmark set!"
                Else
                    rstPublishers.Bookmark = varBookmark
                End If
            Case Else
                Exit Do
        End Select
    Loop

    ' clean up
    rstPublishers.Close
    Cnxn.Close
    Set rstPublishers = Nothing
    Set Cnxn = Nothing
    Exit Sub

ErrorHandler:
    ' clean up
    If Not rstPublishers Is Nothing Then
        If rstPublishers.State = adStateOpen Then rstPublishers.Close
    End If
    Set rstPublishers = Nothing

    If Not Cnxn Is Nothing Then
        If Cnxn.State = adStateOpen Then Cnxn.Close
    End If
    Set Cnxn = Nothing

    If Err <> 0 Then
        MsgBox Err.Source & "-->" & Err.Description, , "Error"
    End If
End Sub
'EndBOFVB

L'exemple suivant utilise les propriétés Bookmark et Filter pour créer une vue limitée du Recordset. Seuls les enregistrements référencés par les signets seront accessibles.

'BeginBOF2VB
Public Sub Main()
    On Error GoTo ErrorHandler

    'recordset and connection variables
    Dim rs As New ADODB.Recordset
    Dim Cnxn As ADODB.Connection
    Dim strSQL As String
    Dim strCnxn As String

    Dim bmk(10)

     ' open connection
    Set Cnxn = New ADODB.Connection
    strCnxn = "Provider='sqloledb';Data Source='MySqlServer';" & _
        "Initial Catalog='Pubs';Integrated Security='SSPI';"
    Cnxn.Open strCnxn

        'open the recordset client-side
    Set rs = New ADODB.Recordset
    strSQL = "Select * from Authors"
    rs.Open strSQL, Cnxn, adUseClient, adLockReadOnly, adCmdText
    Debug.Print "Number of records before filtering: ", rs.RecordCount

    Dim ii As Integer
    ii = 0

    If rs.EOF <> True And ii < 11 Then
        Do
            If Not (rs.EOF <> True And ii < 11) Then Exit Do
            bmk(ii) = rs.Bookmark
            ii = ii + 1
            rs.Move 2
        Loop Until rs.EOF
    End If

    rs.Filter = bmk
    Debug.Print "Number of records after filtering: ", rs.RecordCount

    rs.MoveFirst
    If rs.EOF <> True Then
        Do
            Debug.Print rs.AbsolutePosition, rs("au_lname")
            rs.MoveNext
        Loop Until rs.EOF
    End If

    ' clean up
    rs.Close
    Cnxn.Close
    Set rs = Nothing
    Set Cnxn = Nothing
    Exit Sub

ErrorHandler:
    ' clean up
    If Not rs Is Nothing Then
        If rs.State = adStateOpen Then rs.Close
    End If
    Set rs = Nothing

    If Not Cnxn Is Nothing Then
        If Cnxn.State = adStateOpen Then Cnxn.Close
    End If
    Set Cnxn = Nothing

    If Err <> 0 Then
        MsgBox Err.Source & "-->" & Err.Description, , "Error"
    End If
End Sub
'EndBOF2VB

Voir aussi

BOF, EOF, propriétés | Bookmark, propriété | Recordset, objet


Exemple de propriété CacheSize (VB)

Cet exemple utilise la propriété CacheSize pour illustrer l'amélioration des performances lorsque 30 enregistrements sont mis en mémoire cache durant une opération.

'BeginCacheSizeVB

    'To integrate this code
    'replace the data source and initial catalog values
    'in the connection string

Public Sub Main()
    On Error GoTo ErrorHandler

    'recordset and connection variables
    Dim rstRoySched As ADODB.Recordset
    Dim strSQLSched As String
    Dim strCnxn As String
     'record variables
    Dim sngStart As Single
    Dim sngEnd As Single
    Dim sngNoCache As Single
    Dim sngCache As Single
    Dim intLoop As Integer
    Dim strTemp As String

    ' Open the connection
    strCnxn = "Provider='sqloledb';Data Source='MySqlServer';" & _
        "Initial Catalog='Pubs';Integrated Security='SSPI';"

    ' Open the RoySched Table
    Set rstRoySched = New ADODB.Recordset
    strSQLSched = "roysched"
    rstRoySched.Open strSQLSched, strCnxn, , , adCmdTable

    ' Enumerate the Recordset object twice and
    ' record the elapsed time
    sngStart = Timer

    For intLoop = 1 To 2
        rstRoySched.MoveFirst

        If Not rstRoySched.EOF Then
            ' Execute a simple operation for the
            ' performance test
            Do
                strTemp = rstRoySched!title_id
                rstRoySched.MoveNext
            Loop Until rstRoySched.EOF
        End If
    Next intLoop

    sngEnd = Timer
    sngNoCache = sngEnd - sngStart

    ' Cache records in groups of 30 records.
    rstRoySched.MoveFirst
    rstRoySched.CacheSize = 30
    sngStart = Timer

    ' Enumerate the Recordset object twice and record
    ' the elapsed time
    For intLoop = 1 To 2
        rstRoySched.MoveFirst
        Do While Not rstRoySched.EOF
            ' Execute a simple operation for the
            ' performance test
            strTemp = rstRoySched!title_id
            rstRoySched.MoveNext
        Loop
    Next intLoop

    sngEnd = Timer
    sngCache = sngEnd - sngStart

    ' Display performance results.
    MsgBox "Caching Performance Results:" & vbCr & _
        "   No cache: " & Format(sngNoCache, "##0.000") & " seconds" & vbCr & _
        "   30-record cache: " & Format(sngCache, "##0.000") & " seconds"

    ' clean up
    rstRoySched.Close
    Set rstRoySched = Nothing
    Exit Sub

ErrorHandler:
   ' clean up
    If Not rstRoySched Is Nothing Then
        If rstRoySched.State = adStateOpen Then rstRoySched.Close
    End If
    Set rstRoySched = Nothing

    If Err <> 0 Then
        MsgBox Err.Source & "-->" & Err.Description, , "Error"
    End If
End Sub
'EndCacheSizeVB

CacheSize, propriété | Recordset, objet


Exemple de méthode Cancel (VB)

Cet exemple utilise la méthode Cancel pour annuler une commande s'exécutant sur un objet Connection lorsque la connexion est occupée.

'BeginCancelVB

    'To integrate this code
    'replace the data source and initial catalog values
    'in the connection string

Public Sub Main()
    On Error GoTo ErrorHandler

    'recordset and connection variables
    Dim Cnxn As ADODB.Connection
    Dim strCnxn As String
    Dim strCmdChange As String
    Dim strCmdRestore As String
     'record variables
    Dim blnChanged As Boolean

    ' Open a connection
    Set Cnxn = New ADODB.Connection
    strCnxn = "Provider='sqloledb';Data Source='MySqlServer';" & _
        "Initial Catalog='Pubs';Integrated Security='SSPI';"
    Cnxn.Open strCnxn

    ' Define command strings
    strCmdChange = "UPDATE titles SET type = 'self_help' WHERE type = 'psychology'"
    strCmdRestore = "UPDATE titles SET type = 'psychology' " & _
                     "WHERE type = 'self_help'"

    ' Begin a transaction, then execute a command asynchronously
    Cnxn.BeginTrans
    Cnxn.Execute strCmdChange, , adAsyncExecute
    ' do something else for a little while –
    ' use i = 1 to 32000 to allow completion
    Dim i As Integer
    For i = 1 To 1000
        i = i + i
        Debug.Print i
    Next i

    ' If the command has NOT completed, cancel the execute and
    ' roll back the transaction; otherwise, commit the transaction
    If CBool(Cnxn.State And adStateExecuting) Then
        Cnxn.Cancel
        Cnxn.RollbackTrans
        blnChanged = False
        MsgBox "Update canceled."
    Else
        Cnxn.CommitTrans
        blnChanged = True
        MsgBox "Update complete."
    End If

    ' If the change was made, restore the data
    ' because this is only a demo
    If blnChanged Then
        Cnxn.Execute strCmdRestore
        MsgBox "Data restored."
    End If

    ' clean up
    Cnxn.Close
    Set Cnxn = Nothing
    Exit Sub

ErrorHandler:
    If Not Cnxn Is Nothing Then
        If Cnxn.State = adStateOpen Then Cnxn.Close
    End If
    Set Cnxn = Nothing

    If Err <> 0 Then
        MsgBox Err.Source & "-->" & Err.Description, , "Error"
    End If
End Sub
'EndCancelVB

Cancel, méthode | Connection, objet


Exemple de méthode Clone (VB)

Cet exemple utilise la méthode Clone pour créer des copies d'un objet Recordset puis laisse l'utilisateur positionner de façon autonome le pointeur de l'enregistrement de chaque copie.

'BeginCloneVB

    'To integrate this code
    'replace the data source and initial catalog values
    'in the connection string

Public Sub Main()
    On Error GoTo ErrorHandler

    'recordset array and connection variables
    Dim arstStores(1 To 3) As ADODB.Recordset
    Dim Cnxn As ADODB.Connection
    Dim strSQLStore As String
    Dim strCnxn As String
     'record variables
    Dim intLoop As Integer
    Dim strMessage As String
    Dim strFind As String

    ' Open a connection
    Set Cnxn = New ADODB.Connection
    strCnxn = "Provider='sqloledb';Data Source='MySqlServer';" & _
        "Initial Catalog='Pubs';Integrated Security='SSPI';"
    Cnxn.Open strCnxn

    ' Open recordset as a static cursor type recordset
    Set arstStores(1) = New ADODB.Recordset
    strSQLStore = "SELECT stor_name FROM Stores ORDER BY stor_name"
    arstStores(1).Open strSQLStore, strCnxn, adOpenStatic, adLockBatchOptimistic, adCmdText

    ' Create two clones of the original Recordset
    Set arstStores(2) = arstStores(1).Clone
    Set arstStores(3) = arstStores(1).Clone

    ' Loop through the array so that on each pass the user
    ' is searching a different copy of the same Recordset
    Do
        For intLoop = 1 To 3
             ' Ask for search string while showing where
             ' the current record pointer is for each Recordset
            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))
             ' make sure something was entered, if not then EXIT loop
            If strFind = "" Then Exit Do

             ' otherwise locate the record from the entered string
            arstStores(intLoop).Filter = "stor_name = '" & strFind & "'"

             'if there's no match, jump to the last record
            If arstStores(intLoop).EOF Then
                arstStores(intLoop).Filter = adFilterNone
                arstStores(intLoop).MoveLast
            Else
                MsgBox "Found " & strFind
            End If
        Next intLoop
    Loop

    ' clean up
    arstStores(1).Close
    arstStores(2).Close
    arstStores(3).Close
    Cnxn.Close
    Set arstStores(1) = Nothing
    Set arstStores(2) = Nothing
    Set arstStores(3) = Nothing
    Set Cnxn = Nothing
    Exit Sub

ErrorHandler:
    ' clean up
    If Not arstStores(1) Is Nothing Then
        If arstStores(1).State = adStateOpen Then arstStores(1).Close
    End If
    Set arstStores(1) = Nothing
    If Not arstStores(2) Is Nothing Then
        If arstStores(2).State = adStateOpen Then arstStores(2).Close
    End If
    Set arstStores(2) = Nothing
    If Not arstStores(3) Is Nothing Then
        If arstStores(3).State = adStateOpen Then arstStores(3).Close
    End If
    Set arstStores(3) = Nothing

    If Not Cnxn Is Nothing Then
        If Cnxn.State = adStateOpen Then Cnxn.Close
    End If
    Set Cnxn = Nothing

    If Err <> 0 Then
        MsgBox Err.Source & "-->" & Err.Description, , "Error"
    End If
End Sub
'EndCloneVB

Clone, méthode | Recordset, objet


Exemple de méthode CompareBookmarks (VB)

Cet exemple met en application la méthode CompareBookmarks. La valeur relative des signets est rarement nécessaire sauf quand un signet présente un intérêt particulier.

Désignez une ligne aléatoire d'un objet Recordset dérivé de la table Authors comme cible de la recherche. Affichez ensuite la position de chaque ligne par rapport à la cible.

'BeginCompareBookmarksVB

    'To integrate this code
    'replace the data source and initial catalog values
    'in the connection string

Public Sub Main()
    On Error GoTo ErrorHandler

     ' recordset and connection variables
    Dim rstAuthors As ADODB.Recordset
    Dim Cnxn As ADODB.Connection
    Dim strSQLAuthors As String
    Dim strCnxn As String

     ' comparison variables
    Dim count As Integer
    Dim target As Variant
    Dim result As Long
    Dim strAnswer As String
    Dim strTitle As String
    strTitle = "CompareBookmarks Example"

    ' Open a connection
    Set Cnxn = New ADODB.Connection
    strCnxn = "Provider='sqloledb';Data Source='MySqlServer';" & _
        "Initial Catalog='Pubs';Integrated Security='SSPI';"
    Cnxn.Open strCnxn

     ' Open recordset as a static cursor type recordset
    Set rstAuthors = New ADODB.Recordset
    strSQLAuthors = "SELECT * FROM Authors"
    rstAuthors.Open strSQLAuthors, Cnxn, adOpenStatic, adLockReadOnly, adCmdText

    count = rstAuthors.RecordCount
    Debug.Print "Rows in the Recordset = "; count

     ' Exit if an empty recordset
    If count = 0 Then Exit Sub

     ' Get position between 0 and count -1
    Randomize
    count = (Int(count * Rnd))
    Debug.Print "Randomly chosen row position = "; count
     ' Move row to random position
    rstAuthors.Move count, adBookmarkFirst
     ' Remember the mystery row
    target = rstAuthors.Bookmark

    count = 0
    rstAuthors.MoveFirst
         ' Loop through recordset
    Do Until rstAuthors.EOF
       result = rstAuthors.CompareBookmarks(rstAuthors.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
                strAnswer = "less than"
             Case adCompareEqual
                strAnswer = "equal to"
             Case adCompareGreaterThan
                strAnswer = "greater than"
             Case Else
                strAnswer = "in error comparing to"
          End Select
            'show the results row-by-row
          Debug.Print "Row position " & count & " is " & strAnswer & " the target."
       End If

       count = count + 1
       rstAuthors.MoveNext
    Loop

    ' clean up
    rstAuthors.Close
    Cnxn.Close
    Set rstAuthors = Nothing
    Set Cnxn = Nothing
    Exit Sub

ErrorHandler:
    ' clean up
    If Not rstAuthors Is Nothing Then
        If rstAuthors.State = adStateOpen Then rstAuthors.Close
    End If
    Set rstAuthors = Nothing

    If Not Cnxn Is Nothing Then
        If Cnxn.State = adStateOpen Then Cnxn.Close
    End If
    Set Cnxn = Nothing

    If Err <> 0 Then
        MsgBox Err.Source & "-->" & Err.Description, , "Error"
    End If

End Sub
'EndCompareBookmarksVB

CompareBookmarks, méthode | CompareEnum | Recordset, objet


Exemple de propriétés ConnectionString, ConnectionTimeout et State (VB)

Cet exemple illustre les différentes façons d'utiliser la propriété ConnectionString pour ouvrir un objet Connection. Il utilise également la propriété ConnectionTimeout pour définir le délai d'attente pour la connexion, et la propriété State pour vérifier l'état des connexions. L'exécution de cette procédure requiert la fonction GetState.

'BeginConnectionStringVB

    'To integrate this code replace
    'the database, DSN or Data Source values

Public Sub Main()
    On Error GoTo ErrorHandler

    Dim Cnxn1 As ADODB.Connection
    Dim Cnxn2 As ADODB.Connection
    Dim Cnxn3 As ADODB.Connection
    Dim Cnxn4 As ADODB.Connection

     ' Open a connection without using a Data Source Name (DSN)
    Set Cnxn1 = New ADODB.Connection
    Cnxn1.ConnectionString = "Provider='sqloledb';Data Source='MySqlServer';" & _
        "Initial Catalog='Pubs';Integrated Security='SSPI';"
    Cnxn1.Open
    MsgBox "Cnxn1 state: " & GetState(Cnxn1.State)

     ' Open a connection using a DSN and ODBC tags
     ' It is assumed that you have create DSN 'Pubs' with a user name as
     ' 'MyUserId' and password as 'MyPassword'.
    Set Cnxn2 = New ADODB.Connection
    Cnxn2.ConnectionString = "Data Source='Pubs';" & _
        "User ID='MyUserId';Password='MyPassword';"
    Cnxn2.ConnectionTimeout = 30
    Cnxn2.Open
    MsgBox "Cnxn2 state: " & GetState(Cnxn2.State)

     ' Open a connection using a DSN and OLE DB tags
     ' It is assumed that you have create DSN 'Pubs1' with windows authentication.
    Set Cnxn3 = New ADODB.Connection
    Cnxn3.ConnectionString = "Data Source='Pubs1';"
    Cnxn3.Open
    MsgBox "Cnxn2 state: " & GetState(Cnxn3.State)

     ' Open a connection using a DSN and individual
     ' arguments instead of a connection string
     ' It is assumed that you have create DSN 'Pubs' with a user name as
     ' 'MyUserId' and password as 'MyPassword'.
    Set Cnxn4 = New ADODB.Connection
    Cnxn4.Open "Pubs", "MyUserId", "MyPassword"
    MsgBox "Cnxn4 state: " & GetState(Cnxn4.State)

    ' clean up
    Cnxn1.Close
    Cnxn2.Close
    Cnxn3.Close
    Cnxn4.Close
    Set Cnxn1 = Nothing
    Set Cnxn2 = Nothing
    Set Cnxn3 = Nothing
    Set Cnxn4 = Nothing
    Exit Sub

ErrorHandler:
    ' clean up
    If Not Cnxn1 Is Nothing Then
        If Cnxn1.State = adStateOpen Then Cnxn1.Close
    End If
    Set Cnxn1 = Nothing

    If Not Cnxn2 Is Nothing Then
        If Cnxn2.State = adStateOpen Then Cnxn2.Close
    End If
    Set Cnxn2 = Nothing

    If Not Cnxn3 Is Nothing Then
        If Cnxn3.State = adStateOpen Then Cnxn3.Close
    End If
    Set Cnxn3 = Nothing

    If Not Cnxn4 Is Nothing Then
        If Cnxn4.State = adStateOpen Then Cnxn4.Close
    End If
    Set Cnxn4 = Nothing

    If Err <> 0 Then
        MsgBox Err.Source & "-->" & Err.Description, , "Error"
    End If
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
'EndConnectionStringVB

Voir aussi

Connection, objet | ConnectionString, propriété | ConnectionTimeout, propriété | State, propriété


Exemple de méthode ConvertToString (VB)

'BeginConvertToStringVB

    'To integrate this code
    'replace the data source and initial catalog values
    'in the connection string

Public Sub Main()
    On Error GoTo ErrorHandler

     ' to integrate this code replace the server name
     ' in the CreateObject call

     ' RDS variables
    Dim rdsDS As RDS.DataSpace
    Dim rdsDC As RDS.DataControl
    Dim rdsDF As Object
     ' recordset and connection variables
    Dim rsAuthors As ADODB.Recordset
    Dim strSQLAuthors As String
    Dim strCnxn As String
    Dim varString As Variant

     ' Create a DataSpace object
    Set rdsDS = New RDS.DataSpace
     ' Create a DataFactory object
    Set rdsDF = rdsDS.CreateObject("RDSServer.DataFactory", "http://MyServer") 'MyServer

     ' Get all of the Author records

    strCnxn = "Provider='sqloledb';Data Source='MySqlServer';" & _
        "Initial Catalog='Pubs';Integrated Security='SSPI';"
    strSQLAuthors = "SELECT * FROM Authors"
    Set rsAuthors = rdsDF.Query(strCnxn, strSQLAuthors)
     ' Show results
    Debug.Print "Old RDS recordset count:" & rsAuthors.RecordCount

     ' Convert the recordset into a MIME formatted string
    varString = rdsDF.ConvertToString(rsAuthors)
    Debug.Print "Recordset as MIME format string:"
    Debug.Print varString

     ' Convert string value back into an ADO Recordset
    Set rdsDC = New RDS.DataControl
    rdsDC.SQL = varString
    rdsDC.ExecuteOptions = adcExecSync
    rdsDC.FetchOptions = adcFetchUpFront
    rdsDC.Refresh
     ' Show results
    Debug.Print "New ADO recordset count:" & rdsDC.Recordset.RecordCount

     ' clean up
    rsAuthors.Close
    Set rsAuthors = Nothing
    Set rdsDC = Nothing
    Set rdsDS = Nothing
    Set rdsDC = Nothing

ErrorHandler:

    If Not rsAuthors Is Nothing Then
        If rsAuthors.State = adStateOpen Then rsAuthors.Close
    End If
    Set rsAuthors = Nothing
    Set rdsDC = Nothing
    Set rdsDS = Nothing
    Set rdsDC = Nothing

    If Err <> 0 Then
        MsgBox Err.Source & "-->" & Err.Description, , "Error"
    End If

End Sub
'EndConvertToStringVB

ConvertToString, méthode (RDS) | Recordset, objet


Exemple de méthodes CopyRecord, CopyTo et SaveToFile (VB)

Cet exemple illustre comment créer des copies d'un fichier à l'aide des objets Stream ou Record. Une copie est effectuée vers un dossier Web à des fins de publication sur Internet. Les autres propriétés et méthodes indiquées incluent Stream Type, Open, LoadFromFile et Record Open.

'BeginCopyRecordVB

'Note:
' This sample requires that "C:\checkmrk.wmf" and
' "http://MyServer/mywmf.wmf" exist.

Option Explicit

Private Sub Form_Load()
    On Error GoTo ErrorHandler

    ' Declare variables
    Dim strPicturePath, strStreamPath, strStream2Path, _
        strRecordPath, strStreamURL, strRecordURL As String
    Dim objStream, objStream2 As Stream
    Dim objRecord As Record
    Dim objField As Field

    ' Instantiate objects
    Set objStream = New Stream
    Set objStream2 = New Stream
    Set objRecord = New Record

    ' Initialize path and URL strings
    strPicturePath = "C:\checkmrk.wmf"
    strStreamPath = "C:\mywmf.wmf"
    strStreamURL = "URL=http://MyServer/mywmf.wmf"
    strStream2Path = "C:\checkmrk2.wmf"
    strRecordPath = "C:\mywmf.wmf"
    strRecordURL = "http://MyServer/mywmf2.wmf"

    ' Load the file into the stream
    objStream.Open
    objStream.Type = adTypeBinary
    objStream.LoadFromFile (strPicturePath)

    ' Save the stream to a new path and filename
    objStream.SaveToFile strStreamPath, adSaveCreateOverWrite

    ' Copy the contents of the first stream to a second stream
    objStream2.Open
    objStream2.Type = adTypeBinary
    objStream.CopyTo objStream2

    ' Save the second stream to a different path
    objStream2.SaveToFile strStream2Path, adSaveCreateOverWrite

    ' Because strStreamPath is a Web Folder, open a Record on the URL
    objRecord.Open "", strStreamURL

    ' Display the Fields of the record
    For Each objField In objRecord.Fields
        Debug.Print objField.Name & ": " & objField.Value
    Next

    ' Copy the record to a new URL
    objRecord.CopyRecord "", strRecordURL, , , adCopyOverWrite

    ' Load each copy of the graphic into Image controls for viewing
    Image1.Picture = LoadPicture(strPicturePath)
    Image2.Picture = LoadPicture(strStreamPath)
    Image3.Picture = LoadPicture(strStream2Path)
    Image4.Picture = LoadPicture(strRecordPath)

    ' clean up
    objStream.Close
    objStream2.Close
    objRecord.Close
    Set objStream = Nothing
    Set objStream2 = Nothing
    Set objRecord = Nothing
    Exit Sub

ErrorHandler:
    ' clean up
    If Not objStream Is Nothing Then
        If objStream.State = adStateOpen Then objStream.Close
    End If
    Set objStream = Nothing

    If Not objStream2 Is Nothing Then
        If objStream2.State = adStateOpen Then objStream2.Close
    End If
    Set objStream2 = Nothing

    If Not objRecord Is Nothing Then
        If objRecord.State = adStateOpen Then objRecord.Close
    End If
    Set objRecord = Nothing

    If Err <> 0 Then
        MsgBox Err.Source & "-->" & Err.Description, , "Error"
    End If
End Sub
'EndCopyRecordVB

Voir aussi

CopyRecord, méthode | CopyTo, méthode | LoadFromFile, méthode | Open, méthode (objet ADO Record) | Open, méthode (objet ADO Stream) | Record, objet | SaveToFile, méthode | Stream, objet | Type, propriété (objet ADO Stream)


Exemple de propriété Count (VB)

Cet exemple illustre l'utilisation de la propriété Count avec deux collections dans la base de données Employees. La propriété vérifie le nombre d'objets contenus dans chaque collection et définit le nombre maximal de boucles énumérant les collections. L'énumération des collections peut également se faire à l'aide d'instructions For Each...Next, sans avoir recours à la propriété Count.

'BeginCountVB

    'To integrate this code
    'replace the data source and initial catalog values
    'in the connection string

Public Sub Main()
    On Error GoTo ErrorHandler

    ' recordset and connection variables
    Dim rstEmployees As ADODB.Recordset
    Dim Cnxn As ADODB.Connection
    Dim strSQLEmployees As String
    Dim strCnxn As String

    Dim intLoop As Integer

    ' Open a connection
    Set Cnxn = New ADODB.Connection
    strCnxn = "Provider='sqloledb';Data Source='MySqlServer';" & _
        "Initial Catalog='Northwind';Integrated Security='SSPI';"
    Cnxn.Open strCnxn

    ' Open recordset with data from Employee table
    Set rstEmployees = New ADODB.Recordset
    strSQLEmployees = "Employees"
    'rstEmployees.Open strSQLEmployee, Cnxn, , , adCmdTable
    rstEmployees.Open strSQLEmployees, Cnxn, adOpenForwardOnly, adLockReadOnly, adCmdTable
    'the above two lines opening the recordset are identical as
    'the default values for CursorType and LockType arguments match those specified

    ' Print information about Fields collection
    Debug.Print rstEmployees.Fields.Count & " Fields in Employee"

    For intLoop = 0 To rstEmployees.Fields.Count - 1
        Debug.Print "   " & rstEmployees.Fields(intLoop).Name
    Next intLoop

    ' Print information about Properties collection
    Debug.Print rstEmployees.Properties.Count & " Properties in Employee"

    For intLoop = 0 To rstEmployees.Properties.Count - 1
        Debug.Print "   " & rstEmployees.Properties(intLoop).Name
    Next intLoop

    ' clean up
    rstEmployees.Close
    Cnxn.Close
    Set rstEmployees = Nothing
    Set Cnxn = Nothing
    Exit Sub

ErrorHandler:
    ' clean up
    If Not rstEmployees Is Nothing Then
        If rstEmployees.State = adStateOpen Then rstEmployees.Close
    End If
    Set rstEmployees = Nothing

    If Not Cnxn Is Nothing Then
        If Cnxn.State = adStateOpen Then Cnxn.Close
    End If
    Set Cnxn = Nothing

    If Err <> 0 Then
        MsgBox Err.Source & "-->" & Err.Description, , "Error"
    End If
End Sub
'EndCountVB

Count, propriété


Exemple de méthode CreateRecordset (VB)

Vous pouvez créer un objet Recordset et spécifier l'information de la colonne. Vous pouvez ensuite insérer les données dans l'objet Recordset ; l'ensemble de lignes sous-jacent place les insertions dans la mémoire tampon.

L'exemple de code suivant montre comment définir un Recordset à l'aide de l'objet RDSServer.DataFactory. Vous pouvez également effectuer cette opération à l'aide de l'objet RDS.DataControl.

'BeginRsDefineShapeVB
Sub Main()
    On Error GoTo ErrorHandler

    Dim ADF As RDSServer.DataFactory
    Dim vntRecordShape(3)
    Dim vntField1Shape(3)
    Dim vntField2Shape(3)
    Dim vntField3Shape(3)
    Dim vntField4Shape(3)

    Set ADF = New RDSServer.DataFactory

    ' For each field, specify the name,
    ' type, size, and nullability.

    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

    ' Put all fields into an array of arrays.
    vntRecordShape(0) = vntField1Shape
    vntRecordShape(1) = vntField2Shape
    vntRecordShape(2) = vntField3Shape
    vntRecordShape(3) = vntField4Shape

    ' Use the RDSServer.DataFactory to create an empty
    ' recordset. It takes an array of variants where
    ' every element is itself another array of
    ' variants, one for every column required in the
    ' recordset.
    ' The elements of the inner array are the column's
    ' name, type, size, and nullability.
    '
    ' NOTE: You could just use the RDS.DataControl object
    ' instead of the RDSServer.DataFactory object. In
    ' that case, the following code would be Set NewRS
    ' = ADC1.CreateRecordset(vntRecordShape)
    Dim NewRs As ADODB.Recordset
    Set NewRs = ADF.CreateRecordSet(vntRecordShape)

    Dim fields(3)
    fields(0) = vntField1Shape(0)
    fields(1) = vntField2Shape(0)
    fields(2) = vntField3Shape(0)
    fields(3) = vntField4Shape(0)

    ' Populate the new recordset with data values.
    Dim fieldVals(3)

    ' Use AddNew to add the records.
    fieldVals(0) = "Joe"
    fieldVals(1) = 5
    fieldVals(2) = CDate(#1/5/1996#)
    fieldVals(3) = 123.456
    NewRs.AddNew fields, fieldVals

    fieldVals(0) = "Mary"
    fieldVals(1) = 6
    fieldVals(2) = CDate(#6/5/1996#)
    fieldVals(3) = 31
    NewRs.AddNew fields, fieldVals

    fieldVals(0) = "Alex"
    fieldVals(1) = 13
    fieldVals(2) = CDate(#1/6/1996#)
    fieldVals(3) = 34.0001
    NewRs.AddNew fields, fieldVals

    fieldVals(0) = "Susan"
    fieldVals(1) = 13
    fieldVals(2) = CDate(#8/6/1996#)
    fieldVals(3) = 0#
    NewRs.AddNew fields, fieldVals

    NewRs.MoveFirst

    ' Set the newly created and populated Recordset to
    ' the SourceRecordset property of the
    ' RDS.DataControl to bind to visual controls
    Dim ADC1 As RDS.DataControl
    Set ADC1 = New RDS.DataControl
    Set ADC1.SourceRecordset = NewRs

    'Clean up
    If NewRs.State = adStateOpen Then NewRs.Close
    Set NewRs = Nothing
    Set ADC1 = Nothing
    Set ADF = Nothing
    Exit Sub

ErrorHandler:
    ' clean up
    If Not NewRs Is Nothing Then
        If NewRs.State = adStateOpen Then NewRs.Close
    End If
    Set NewRs = Nothing
    Set ADC1 = Nothing
    Set ADF = Nothing

    If Err <> 0 Then
        MsgBox Err.Source & "-->" & Err.Description, , "Error"
    End If
End Sub
'EndRsDefineShapeVB


Exemple de propriétés CursorType, LockType et EditMode (VB)

Cet exemple montre comment définir les propriétés CursorType et LockType avant l'ouverture d'un objet Recordset. Il donne également la valeur de la propriété EditMode sous diverses conditions. L'exécution de cette procédure requiert la fonction EditModeOutput.

'BeginEditModeVB

    'To integrate this code
    'replace the data source and initial catalog values
    'in the connection string

Public Sub Main()
    On Error GoTo ErrorHandler

    ' recordset variables
    Dim rstEmployees As ADODB.Recordset
    Dim Cnxn As ADODB.Connection
    Dim strCnxn As String
    Dim SQLEmployees As String

     ' open connection
    Set Cnxn = New ADODB.Connection
    strCnxn = "Provider='sqloledb';Data Source='MySqlServer';" & _
        "Initial Catalog='Pubs';Integrated Security='SSPI';"
    Cnxn.Open strCnxn

      ' set recordset properties through object refs
      ' instead of through arguments to Open method
    Set rstEmployees = New ADODB.Recordset
    Set rstEmployees.ActiveConnection = Cnxn
    rstEmployees.CursorLocation = adUseClient
    rstEmployees.CursorType = adOpenStatic
    rstEmployees.LockType = adLockBatchOptimistic

     ' open recordset with data from Employee table
    SQLEmployees = "employee"
    rstEmployees.Open SQLEmployees, , , , adCmdTable

    ' Show the EditMode property under different editing states
    rstEmployees.AddNew
        rstEmployees!emp_id = "T-T55555M"
        rstEmployees!fname = "temp_fname"
        rstEmployees!lname = "temp_lname"
            'call function below
            'to output results to debug window
        EditModeOutput "After AddNew:", rstEmployees.EditMode
        rstEmployees.UpdateBatch
        EditModeOutput "After UpdateBatch:", rstEmployees.EditMode
        rstEmployees!fname = "test"
        EditModeOutput "After Edit:", rstEmployees.EditMode
    rstEmployees.Close

    ' Delete new record because this is a demonstration
    Cnxn.Execute "DELETE FROM employee WHERE emp_id = 'T-T55555M'"

    ' clean up
    Cnxn.Close
    Set rstEmployees = Nothing
    Set Cnxn = Nothing
    Exit Sub

ErrorHandler:
    ' clean up
    If Not rstEmployees Is Nothing Then
        If rstEmployees.State = adStateOpen Then rstEmployees.Close
    End If
    Set rstEmployees = Nothing

    If Not Cnxn Is Nothing Then
        If Cnxn.State = adStateOpen Then Cnxn.Close
    End If
    Set Cnxn = Nothing

    If Err <> 0 Then
        MsgBox Err.Source & "-->" & Err.Description, , "Error"
    End If

End Sub

Public Function EditModeOutput(strTemp As String, _
   intEditMode As Integer)

   ' Print report based on the value of the EditMode
   ' property
   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
'EndEditModeVB

Voir aussi

CursorType, propriété | CursorTypeEnum | EditMode, propriété | EditModeEnum | LockType, propriété | LockTypeEnum | Recordset, objet


Exemple de méthode Delete (VB)

Cet exemple utilise la méthode Delete pour supprimer un enregistrement spécifié dans un objet Recordset.

'BeginDeleteVB

    'To integrate this code
    'replace the data source and initial catalog values
    'in the connection string

Public Sub Main()
    On Error GoTo ErrorHandler

    Dim rstRoySched As ADODB.Recordset
    Dim Cnxn As ADODB.Connection
    Dim strCnxn As String
    Dim strSQLRoySched As String

    Dim strMsg As String
    Dim strTitleID As String
    Dim intLoRange As Integer
    Dim intHiRange As Integer
    Dim intRoyalty As Integer

     ' open connection
    Set Cnxn = New ADODB.Connection
    strCnxn = "Provider='sqloledb';Data Source='MySqlServer';" & _
        "Initial Catalog='Pubs';Integrated Security='SSPI';"
    Cnxn.Open strCnxn

    ' open RoySched table with cursor client-side
    Set rstRoySched = New ADODB.Recordset
    rstRoySched.CursorLocation = adUseClient
    rstRoySched.CursorType = adOpenStatic
    rstRoySched.LockType = adLockBatchOptimistic
    rstRoySched.Open "SELECT * FROM roysched WHERE royalty = 20", strCnxn, , , adCmdText

    ' Prompt for a record to delete
    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))

    If strTitleID = "" Then
        Err.Raise 1, , "You didn't enter any value for the record ID."
    End If

    ' Move to the record and save data so it can be restored
    rstRoySched.Filter = "title_id = '" & strTitleID & "'"

    If rstRoySched.RecordCount < 1 Then
        Err.Raise 1, , "There is no record for the record ID you entered."
    End If

    intLoRange = rstRoySched!lorange
    intHiRange = rstRoySched!hirange
    intRoyalty = rstRoySched!royalty

    ' Delete the record
    rstRoySched.Delete
    rstRoySched.UpdateBatch

    ' Show the results
    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

    ' Restore the data because this is a demonstration
    rstRoySched.AddNew
    rstRoySched!title_id = strTitleID
    rstRoySched!lorange = intLoRange
    rstRoySched!hirange = intHiRange
    rstRoySched!royalty = intRoyalty
    rstRoySched.UpdateBatch

    ' clean up
    rstRoySched.Close
    Set rstRoySched = Nothing
    Exit Sub

ErrorHandler:
    ' clean up
    If Not rstRoySched Is Nothing Then
        If rstRoySched.State = adStateOpen Then rstRoySched.Close
    End If
    Set rstRoySched = Nothing

    If Err <> 0 Then
        MsgBox Err.Source & "-->" & Err.Description, , "Error"
    End If
End Sub
'EndDeleteVB

Delete, méthode (objet ADO Recordset) | Recordset, objet


Exemple de méthodes DeleteRecord et MoveRecord (VB)

Cet exemple montre comment copier, déplacer, modifier et supprimer le contenu d'un fichier texte publié vers un dossier Web. Les autres propriétés et méthodes incluent GetChildren, ParentURL, Source et Flush

'BeginDeleteRecordVB

'Note:
' IIS must be running for this sample to work. To
' use this sample you must:
'
' 1. create folders named "test" and "test2"
'    in the root web folder of http://MyServer
'
' 2. Create a text file named "test2.txt" in the
'    "test" folder.
' 3. Replace "MyServer" with the appropriate web
'    server name.

Public Sub Main()
    On Error GoTo ErrorHandler

     ' connection and recordset variables
    Dim rsDestFolder As ADODB.Recordset
    Dim Cnxn As ADODB.Connection
    Dim strCnxn As String

     ' file as record variables
    Dim rcFile As ADODB.Record
    Dim rcDestFile As ADODB.Record
    Dim rcDestFolder As ADODB.Record
    Dim objStream As Stream

     ' file variables
    Dim strFile As String
    Dim strDestFile As String
    Dim strDestFolder As String

     ' instantiate variables
    Set rsDestFolder = New ADODB.Recordset
    Set rcDestFolder = New ADODB.Record
    Set rcFile = New ADODB.Record
    Set rcDestFile = New ADODB.Record
    Set objStream = New ADODB.Stream

     ' open a record on a text file
    Set Cnxn = New ADODB.Connection
    strCnxn = "url=http://MyServer/"
    Cnxn.Open strCnxn
    strFile = "test/test2.txt"
    rcFile.Open strFile, Cnxn, adModeReadWrite, adOpenIfExists Or adCreateNonCollection
    Debug.Print Cnxn

     ' edit the contents of the text file
    objStream.Open rcFile, , adOpenStreamFromRecord

    Debug.Print "Source: " & strCnxn & rcFile.Source
    Debug.Print "Original text: " & objStream.ReadText

    objStream.Position = 0
    objStream.WriteText "Newer Text. "
    objStream.Position = 0

    Debug.Print "New text: " & objStream.ReadText

     ' reset the stream object
    objStream.Flush
    objStream.Close
    rcFile.Close

     ' reopen record to see new contents of text file
    rcFile.Open strFile, Cnxn, adModeReadWrite, adOpenIfExists Or adCreateNonCollection
    objStream.Open rcFile, adModeReadWrite, adOpenStreamFromRecord

    Debug.Print "Source: " & strCnxn & rcFile.Source
    Debug.Print "Edited text: " & objStream.ReadText

     ' copy the file to another folder
    strDestFile = "test2/test1.txt"
    rcFile.CopyRecord "", "http://MyServer/" & strDestFile, "", "", adCopyOverWrite

     ' delete the original file
    rcFile.DeleteRecord

     ' move the file from the subfolder back to original location
    strDestFolder = "test2/"
    rcDestFolder.Open strDestFolder, Cnxn ', adOpenIfExists  'Or adCreateCollection
    Set rsDestFolder = rcDestFolder.GetChildren
    rsDestFolder.MoveFirst

     ' position current record at on the correct file
    Do While Not (rsDestFolder.EOF Or rsDestFolder(0) = "test1.txt")
        rsDestFolder.MoveNext
    Loop

     ' open a record on the correct row of the recordset
    rcDestFile.Open rsDestFolder, Cnxn

     ' do the move
    rcDestFile.MoveRecord "", "http://MyServer/" & strFile, "", "", adMoveOverWrite

    ' clean up
    rsDestFolder.Close
    Cnxn.Close
    Set rsDestFolder = Nothing
    Set Cnxn = Nothing
    Exit Sub

ErrorHandler:
    ' clean up
    If Not rsDestFolder Is Nothing Then
        If rsDestFolder.State = adStateOpen Then rsDestFolder.Close
    End If
    Set rsDestFolder = Nothing

    If Not Cnxn Is Nothing Then
        If Cnxn.State = adStateOpen Then Cnxn.Close
    End If
    Set Cnxn = Nothing

    If Err <> 0 Then
        MsgBox Err.Source & "-->" & Err.Description, , "Error"
    End If
End Sub
'EndDeleteRecordVB

Voir aussi

DeleteRecord, méthode | Flush, méthode | GetChildren, méthode | MoveRecord, méthode | ParentURL, propriété | Source, propriété (objet ADO Record)


Exemple de propriétés Description, HelpContext, HelpFile, NativeError, Number, Source et SQLState (VB)

Cet exemple déclenche une erreur, l'intercepte et affiche les propriétés Description, HelpContext, HelpFile, NativeError, Number, Source et SQLState de l'objet Error résultant.

'BeginDescriptionVB
Public Sub Main()

    Dim Cnxn As ADODB.Connection
    Dim Err As ADODB.Error
    Dim strError As String

    On Error GoTo ErrorHandler

    ' Intentionally trigger an error
    Set Cnxn = New ADODB.Connection
    Cnxn.Open "nothing"

    Set Cnxn = Nothing
    Exit Sub

ErrorHandler:

    ' Enumerate Errors collection and display
    ' properties of each Error object
    For Each Err In Cnxn.Errors
        strError = "Error #" & Err.Number & vbCr & _
            "   " & Err.Description & vbCr & _
            "   (Source: " & Err.Source & ")" & vbCr & _
            "   (SQL State: " & Err.SQLState & ")" & vbCr & _
            "   (NativeError: " & Err.NativeError & ")" & vbCr
        If Err.HelpFile = "" Then
            strError = strError & "   No Help file available"
        Else
            strError = strError & _
               "   (HelpFile: " & Err.HelpFile & ")" & vbCr & _
               "   (HelpContext: " & Err.HelpContext & ")" & _
               vbCr & vbCr
        End If

        Debug.Print strError
    Next

    Resume Next
End Sub
'EndDescriptionVB

Voir aussi

Description, propriété | Error, objet | HelpContext, propriété | HelpFile, propriété | NativeError, propriété | Number, propriété | Source, propriété (Error ADO) | SQLState, propriété


Exemple de propriétés EOS et LineSeparator, et de méthode SkipLine (VB)

Cet exemple illustre comment manipuler les flux de texte une ligne à la fois. Il montre l'effet produit par le remplacement de la valeur par défaut retour chariot/saut de ligne (adCRLF) par un simple saut de ligne (adLF) ou retour chariot (adCR).

'BeginSkipLineVB
Private Sub cmdSkipLine_Click()
    On Error GoTo ErrorHandler

    'Declare variables
    Dim i As Integer
    Dim objStream As Stream
    Dim strLine, strChar As String

    'Instantiate and open stream
    Set objStream = New Stream
    objStream.Open

    'Set line separator to line feed
    objStream.LineSeparator = adLF

    'Load text content of list box into stream
    'One line at a time
    For i = 0 To (List1.ListCount - 1)
        objStream.WriteText List1.List(i), adWriteLine
    Next

    'Display the entire stream
    Debug.Print "Whole Stream:"
    objStream.Position = 0
    Debug.Print objStream.ReadText

    'Display the first line
    Debug.Print "First Line:"
    objStream.Position = 0
    strLine = objStream.ReadText(adReadLine)
    Debug.Print strLine
    Debug.Print "Line length: " + Str(Len(strLine))

    'Skip a line, then display another line
    Debug.Print "Third Line:"
    objStream.SkipLine
    strLine = objStream.ReadText(adReadLine)
    Debug.Print strLine
    Debug.Print "Line length: " + Str(Len(strLine))

    'Switch line separator to carriage return
    'All items from list will be considered one line
    'Assuming no CRs have been loaded into stream
    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)

    'Use EOS to Determine End of Stream
    Debug.Print "Character by character:"
    objStream.Position = 0
    Do Until objStream.EOS
        strChar = objStream.ReadText(1)
        Debug.Print strChar
    Loop

    ' clean up
    objStream.Close
    Set objStream = Nothing
    Exit Sub

ErrorHandler:
    ' clean up
    If Not objStream Is Nothing Then
        If objStream.State = adStateOpen Then objStream.Close
    End If
    Set objStream = Nothing

    If Err <> 0 Then
        MsgBox Err.Source & "-->" & Err.Description, , "Error"
    End If
End Sub

Private Sub Form_Load()
    List1.AddItem "This is the first line"
    List1.AddItem "This is the second line"
    List1.AddItem "This is the third line"
End Sub
'EndSkipLineVB

Voir aussi

EOS, propriété | LineSeparator, propriété | SkipLine, méthode


Exemple de méthodes Execute, Requery et Clear (VB)

Cet exemple illustre l'utilisation de la méthode Execute lorsqu'elle est exécutée à partir d'un objet Command et d'un objet Connection. Il utilise également la méthode Requery pour extraire les données actuelles d'un objet Recordset, ainsi que la méthode Clear pour effacer le contenu de la collection Errors. (La collection Errors est accessible via l'objet Connection de la propriété ActiveConnection de Recordset.) Les procédures ExecuteCommand et PrintOutput sont nécessaires à l'exécution de cette procédure.

'BeginExecuteVB

    'To integrate this code
    'replace the data source and initial catalog values
    'in the connection string

Public Sub Main()
    On Error GoTo Err_Execute

    ' connection, command, and recordset variables
    Dim Cnxn As ADODB.Connection
    Dim cmdChange As ADODB.Command
    Dim rstTitles As ADODB.Recordset
    Dim Err As ADODB.Error
    Dim strSQLChange As String
    Dim strSQLRestore As String
    Dim strSQLTitles
    Dim strCnxn As String

     ' Define two SQL statements to execute as command text
    strSQLChange = "UPDATE Titles SET Type = 'self_help' WHERE Type = 'psychology'"
    strSQLRestore = "UPDATE Titles SET Type = 'psychology' WHERE Type = 'self_help'"

     ' Open connection
    strCnxn = "Provider='sqloledb';Data Source='MySqlServer';" & _
        "Initial Catalog='Pubs';Integrated Security='SSPI';"
    Set Cnxn = New ADODB.Connection
    Cnxn.Open strCnxn

     ' Create command object
    Set cmdChange = New ADODB.Command
    Set cmdChange.ActiveConnection = Cnxn
    cmdChange.CommandText = strSQLChange

     ' Open titles table
    Set rstTitles = New ADODB.Recordset
    strSQLTitles = "titles"
    rstTitles.Open strSQLTitles, Cnxn, , , adCmdTable

    ' Print report of original data
    Debug.Print _
       "Data in Titles table before executing the query"
    PrintOutput rstTitles

    ' Call the ExecuteCommand subroutine below to execute cmdChange command
    ExecuteCommand cmdChange, rstTitles

    ' Print report of new data
    Debug.Print _
       "Data in Titles table after executing the query"
    PrintOutput rstTitles

    ' Use the Connection object's execute method to
    ' execute SQL statement to restore data and trap for
    ' errors, checking the Errors collection if necessary
    Cnxn.Execute strSQLRestore, , adExecuteNoRecords

    ' Retrieve the current data by requerying the recordset
    rstTitles.Requery

    ' Print report of restored data using sub from below
    Debug.Print "Data after executing the query to restore the original information "
    PrintOutput rstTitles

    ' clean up
    rstTitles.Close
    Cnxn.Close
    Set rstTitles = Nothing
    Set Cnxn = Nothing
    Exit Sub

Err_Execute:
    ' Notify user of any errors that result from
    ' executing the query
    If rstTitles.ActiveConnection.Errors.Count >= 0 Then
       For Each Err In rstTitles.ActiveConnection.Errors
          MsgBox "Error number: " & Err.Number & vbCr & _
             Err.Description
       Next Err
    End If

    ' clean up
    If Not rstTitles Is Nothing Then
        If rstTitles.State = adStateOpen Then rstTitles.Close
    End If
    Set rstTitles = Nothing

    If Not Cnxn Is Nothing Then
        If Cnxn.State = adStateOpen Then Cnxn.Close
    End If
    Set Cnxn = Nothing

    If Err <> 0 Then
        MsgBox Err.Source & "-->" & Err.Description, , "Error"
    End If
End Sub

Public Sub ExecuteCommand(cmdTemp As ADODB.Command, rstTemp As ADODB.Recordset)

   Dim Err As Error

   ' Run the specified Command object and trap for
   ' errors, checking the Errors collection
   On Error GoTo Err_Execute
   cmdTemp.Execute
   On Error GoTo 0

   ' Retrieve the current data by requerying the recordset
   rstTemp.Requery

   Exit Sub

Err_Execute:

   ' Notify user of any errors that result from
   ' executing the query
   If rstTemp.ActiveConnection.Errors.Count > 0 Then
      For Each Err In rstTemp.ActiveConnection.Errors
         MsgBox "Error number: " & Err.Number & vbCr & _
            Err.Description
      Next Err
   End If

   Resume Next

End Sub

Public Sub PrintOutput(rstTemp As ADODB.Recordset)

   ' Enumerate Recordset
   Do While Not rstTemp.EOF
      Debug.Print "  " & rstTemp!Title & _
         ", " & rstTemp!Type
      rstTemp.MoveNext
   Loop

End Sub
'EndExecuteVB

Voir aussi

Clear, méthode | Command, objet | Connection, objet | Error, objet | Execute, méthode (objet ADO Command) | Execute, méthode (objet ADO Connection) | Recordset, objet | Requery, méthode


Exemple de propriétés Filter et RecordCount (VB)

Cet exemple ouvre un objet Recordset sur la table Publishers de la base de données Pubs. Il utilise ensuite la propriété Filter pour limiter le nombre d'enregistrements visibles aux éditeurs d'un pays/État spécifique. La propriété RecordCount montre la différence entre les jeux d'enregistrements filtrés et non filtrés.

'BeginFilterVB

    'To integrate this code
    'replace the data source and initial catalog values
    'in the connection string

Public Sub Main()
    On Error GoTo ErrorHandler

    ' recordset variables
    Dim rstPublishers As ADODB.Recordset
    Dim Cnxn As ADODB.Connection
    Dim strCnxn As String
    Dim SQLPublishers As String

     ' criteria variables
    Dim intPublisherCount As Integer
    Dim strCountry As String
    Dim strMessage As String

     ' open connection
    Set Cnxn = New ADODB.Connection
    strCnxn = "Provider='sqloledb';Data Source='MySqlServer';" & _
        "Initial Catalog='Pubs';Integrated Security='SSPI';"
    Cnxn.Open strCnxn

    ' open recordset with data from Publishers table
    Set rstPublishers = New ADODB.Recordset
    SQLPublishers = "publishers"
    rstPublishers.Open SQLPublishers, strCnxn, adOpenStatic, , adCmdTable

    intPublisherCount = rstPublishers.RecordCount

    ' get user input
    strCountry = Trim(InputBox("Enter a country to filter on (e.g. USA):"))

    If strCountry <> "" Then
        ' open a filtered Recordset object
        rstPublishers.Filter = "Country ='" & strCountry & "'"

        If rstPublishers.RecordCount = 0 Then
            MsgBox "No publishers from that country."
        Else
           ' print number of records for the original recordset
           ' and the filtered recordset
            strMessage = "Orders in original recordset: " & _
                vbCr & intPublisherCount & vbCr & _
                "Orders in filtered recordset (Country = '" & _
                strCountry & "'): " & vbCr & _
                rstPublishers.RecordCount
            MsgBox strMessage
        End If
    End If

    ' clean up
    rstPublishers.Close
    Cnxn.Close
    Set rstPublishers = Nothing
    Set Cnxn = Nothing
    Exit Sub

ErrorHandler:
    ' clean up
    If Not rstPublishers Is Nothing Then
        If rstPublishers.State = adStateOpen Then rstPublishers.Close
    End If
    Set rstPublishers = Nothing

    If Not Cnxn Is Nothing Then
        If Cnxn.State = adStateOpen Then Cnxn.Close
    End If
    Set Cnxn = Nothing

    If Err <> 0 Then
        MsgBox Err.Source & "-->" & Err.Description, , "Error"
    End If

End Sub
'EndFilterVB
Remarque Si vous savez quelles données vous voulez sélectionner, il est préférable en général d'ouvrir un objet Recordset à l'aide d'une instruction SQL. L'exemple suivant montre comment créer un objet Recordset et obtenir les enregistrements d'un pays/État spécifique.
'BeginFilter2VB

    'To integrate this code
    'replace the data source and initial catalog values
    'in the connection string

Public Sub Main()
    On Error GoTo ErrorHandler

    Dim rstPublishers As ADODB.Recordset
    Dim Cnxn As ADODB.Connection
    Dim strSQLPublishers As String
    Dim strCnxn As String

     ' open connection
    Set Cnxn = New ADODB.Connection
    strCnxn = "Provider='sqloledb';Data Source='MySqlServer';" & _
        "Initial Catalog='Pubs';Integrated Security='SSPI';"
    Cnxn.Open strCnxn

    ' open recordset with criteria from Publishers table
    Set rstPublishers = New ADODB.Recordset
    strSQLPublishers = "SELECT * FROM publishers WHERE Country = 'USA'"
    rstPublishers.Open strSQLPublishers, Cnxn, adOpenStatic, adLockReadOnly, adCmdText

    ' print recordset
    rstPublishers.MoveFirst
    Do While Not rstPublishers.EOF
        Debug.Print rstPublishers!pub_name & ", " & rstPublishers!country
        rstPublishers.MoveNext
    Loop

    ' clean up
    rstPublishers.Close
    Cnxn.Close
    Set rstPublishers = Nothing
    Set Cnxn = Nothing
    Exit Sub

ErrorHandler:
    ' clean up
    If Not rstPublishers Is Nothing Then
        If rstPublishers.State = adStateOpen Then rstPublishers.Close
    End If
    Set rstPublishers = Nothing

    If Not Cnxn Is Nothing Then
        If Cnxn.State = adStateOpen Then Cnxn.Close
    End If
    Set Cnxn = Nothing

    If Err <> 0 Then
        MsgBox Err.Source & "-->" & Err.Description, , "Error"
    End If
End Sub
'EndFilter2VB

Voir aussi

Filter, propriété | RecordCount, propriété | Recordset, objet


Exemple de méthode Find (VB)

Cet exemple utilise la méthode Find de l'objet Recordset pour localiser et compter le nombre de titres commerciaux dans la base de données Pubs. Cet exemple présuppose que le fournisseur sous-jacent ne prend pas en charge une fonctionnalité similaire.

'BeginFindVB

    'To integrate this code
    'replace the data source and initial catalog values
    'in the connection string

Public Sub Main()
    On Error GoTo ErrorHandler

     ' connection and recordset variables
    Dim Cnxn As New ADODB.Connection
    Dim rstTitles As New ADODB.Recordset
    Dim strCnxn As String
    Dim strSQLTitles As String

     ' record variables
    Dim mark As Variant
    Dim count As Integer

     ' open connection
    Set Cnxn = New ADODB.Connection
    strCnxn = "Provider='sqloledb';Data Source='MySqlServer';" & _
        "Initial Catalog='Pubs';Integrated Security='SSPI';"
    Cnxn.Open strCnxn

    ' open recordset with default parameters which are
    ' sufficient to search forward through a Recordset
    Set rstTitles = New ADODB.Recordset
    strSQLTitles = "SELECT title_id FROM titles"
    rstTitles.Open strSQLTitles, Cnxn, adOpenStatic, adLockReadOnly, adCmdText

    count = 0
    rstTitles.Find "title_id LIKE 'BU%'"

    Do While Not rstTitles.EOF
        'continue if last find succeeded
        Debug.Print "Title ID: "; rstTitles!title_id
        'count the last title found
        count = count + 1
        ' note current position
        mark = rstTitles.Bookmark
        rstTitles.Find "title_id LIKE 'BU%'", 1, adSearchForward, mark
        ' above code skips current record to avoid finding the same row repeatedly;
        ' last arg (bookmark) is redundant because Find searches from current position
    Loop

    Debug.Print "The number of business titles is " & count

    ' clean up
    rstTitles.Close
    Cnxn.Close
    Set rstTitles = Nothing
    Set Cnxn = Nothing
    Exit Sub

ErrorHandler:
    ' clean up
    If Not rstTitles Is Nothing Then
        If rstTitles.State = adStateOpen Then rstTitles.Close
    End If
    Set rstTitles = Nothing

    If Not Cnxn Is Nothing Then
        If Cnxn.State = adStateOpen Then Cnxn.Close
    End If
    Set Cnxn = Nothing

    If Err <> 0 Then
        MsgBox Err.Source & "-->" & Err.Description, , "Error"
    End If
End Sub
'EndFindVB

Find, méthode | Recordset, objet


Exemple de méthode GetRows (VB)

Cet exemple utilise la méthode GetRows pour extraire un nombre défini de lignes d'un objet Recordset et remplir un tableau avec les données obtenues. La méthode GetRows renvoie un nombre de lignes inférieur à celui désiré dans deux cas : EOF a été atteint ou GetRows a essayé d'extraire un enregistrement supprimé par un autre utilisateur. La fonction renvoie la valeur False seulement dans le second cas. L'exécution de cette procédure requiert la fonction GetRowsOK.

'BeginGetRowsVB

    'To integrate this code
    'replace the data source and initial catalog values
    'in the connection string

Public Sub Main()
    On Error GoTo ErrorHandler

     ' connection and recordset variables
    Dim rstEmployees As ADODB.Recordset
    Dim Cnxn As ADODB.Connection
    Dim strSQLEmployees As String
    Dim strCnxn As String
    ' array variable
    Dim arrEmployees As Variant
    ' detail variables
    Dim strMessage As String
    Dim intRows As Integer
    Dim intRecord As Integer

    ' open connection
    Set Cnxn = New ADODB.Connection
    strCnxn = "Provider='sqloledb';Data Source='MySqlServer';" & _
        "Initial Catalog='Pubs';Integrated Security='SSPI';"
    Cnxn.Open strCnxn

    ' open recordset client-side to enable RecordCount
    Set rstEmployees = New ADODB.Recordset
    strSQLEmployees = "SELECT fName, lName, hire_date FROM Employee ORDER BY lName"
    rstEmployees.Open strSQLEmployees, Cnxn, adOpenStatic, adLockReadOnly, adCmdText

    ' get user input for number of rows
    Do
        strMessage = "Enter number of rows to retrieve:"
        intRows = Val(InputBox(strMessage))

          ' if bad user input exit the loop
        If intRows <= 0 Then
            MsgBox "Please enter a positive number", vbOKOnly, "Not less than zero!"
        ' if number of requested records is over the total
        ElseIf intRows > rstEmployees.RecordCount Then
            MsgBox "Not enough records in Recordset to retrieve " & intRows & " rows.", _
            vbOKOnly, "Over the available total"
        Else
            Exit Do
        End If
    Loop

      ' else put the data in an array and print
    arrEmployees = rstEmployees.GetRows(intRows)

    Dim x As Integer, y As Integer

    For x = 0 To intRows - 1
        For y = 0 To 2
            Debug.Print arrEmployees(y, x) & " ";
        Next y
        Debug.Print vbCrLf
    Next x

    ' clean up
    rstEmployees.Close
    Cnxn.Close
    Set rstEmployees = Nothing
    Set Cnxn = Nothing
    Exit Sub

ErrorHandler:
    ' clean up
    If Not rstEmployees Is Nothing Then
        If rstEmployees.State = adStateOpen Then rstEmployees.Close
    End If
    Set rstEmployees = Nothing

    If Not Cnxn Is Nothing Then
        If Cnxn.State = adStateOpen Then Cnxn.Close
    End If
    Set Cnxn = Nothing

    If Err <> 0 Then
        MsgBox Err.Source & "-->" & Err.Description, , "Error"
    End If
End Sub
'EndGetRowsVB

GetRows, méthode | Recordset, objet


Exemple de méthode GetString (VB)

Cet exemple met en application la méthode GetString.

Il suppose que vous déboguez un problème d'accès aux données et que vous voulez trouver un moyen simple et rapide d'imprimer le contenu d'un petit objet Recordset.

'BeginGetStringVB

    'To integrate this code
    'replace the data source and initial catalog values
    'in the connection string

Public Sub Main()
    On Error GoTo ErrorHandler

     ' connection variables
    Dim Cnxn As ADODB.Connection
    Dim rstAuthors As ADODB.Recordset
    Dim strCnxn As String
    Dim strSQLAuthors As String
    Dim varOutput As Variant

     ' specific variables
    Dim strPrompt As String
    Dim strState As String

     ' open connection
    Set Cnxn = New ADODB.Connection
    strCnxn = "Provider='sqloledb';Data Source='MySqlServer';" & _
        "Initial Catalog='Pubs';Integrated Security='SSPI';"
    Cnxn.Open strCnxn

     ' get user input
    strPrompt = "Enter a state (CA, IN, KS, MD, MI, OR, TN, UT): "
    strState = Trim(InputBox(strPrompt, "GetString Example"))

     ' open recordset
    Set rstAuthors = New ADODB.Recordset
    strSQLAuthors = "SELECT au_fname, au_lname, address, city FROM Authors " & _
                "WHERE state = '" & strState & "'"
    rstAuthors.Open strSQLAuthors, Cnxn, adOpenStatic, adLockReadOnly, adCmdText

    If Not rstAuthors.EOF Then
    ' Use all defaults: get all rows, TAB as column delimiter,
    ' CARRIAGE RETURN as row delimiter, EMPTY-string as null delimiter
       varOutput = rstAuthors.GetString(adClipString)
        ' print output
       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

    ' clean up
    rstAuthors.Close
    Cnxn.Close
    Set rstAuthors = Nothing
    Set Cnxn = Nothing
    Exit Sub

ErrorHandler:
    ' clean up
    If Not rstAuthors Is Nothing Then
        If rstAuthors.State = adStateOpen Then rstAuthors.Close
    End If
    Set rstAuthors = Nothing

    If Not Cnxn Is Nothing Then
        If Cnxn.State = adStateOpen Then Cnxn.Close
    End If
    Set Cnxn = Nothing

    If Err <> 0 Then
        MsgBox Err.Source & "-->" & Err.Description, , "Error"
    End If
End Sub
'EndGetStringVB

GetString, méthode | Recordset, objet


Exemple de propriétés IsolationLevel et Mode (VB)

Cet exemple utilise la propriété Mode pour ouvrir une connexion exclusive, et la propriété IsolationLevel pour ouvrir une transaction effectuée indépendamment des autres transactions.

'BeginIsolationLevelVB

    'To integrate this code
    'replace the data source and initial catalog values
    'in the connection string

Public Sub Main()
    On Error GoTo ErrorHandler

    Dim Cnxn As ADODB.Connection
    Dim rstTitles As ADODB.Recordset
    Dim strCnxn As String
    Dim strSQLTitles As String

    ' Open connection
    Set Cnxn = New ADODB.Connection
    strCnxn = "Provider='sqloledb';Data Source='MySqlServer';" & _
        "Initial Catalog='Pubs';Integrated Security='SSPI';"
    Cnxn.Mode = adModeShareExclusive
    Cnxn.IsolationLevel = adXactIsolated
    Cnxn.Open strCnxn

     ' open Titles table
    Set rstTitles = New ADODB.Recordset
    strSQLTitles = "titles"
    rstTitles.Open strSQLTitles, Cnxn, adOpenDynamic, adLockPessimistic, adCmdTable

    Cnxn.BeginTrans

    ' Display connection mode
    If Cnxn.Mode = adModeShareExclusive Then
        MsgBox "Connection mode is exclusive."
    Else
        MsgBox "Connection mode is not exclusive."
    End If

    ' Display isolation level
    If Cnxn.IsolationLevel = adXactIsolated Then
        MsgBox "Transaction is isolated."
    Else
        MsgBox "Transaction is not isolated."
    End If

    ' Change the type of psychology titles
    Do Until rstTitles.EOF
        If Trim(rstTitles!Type) = "psychology" Then
            rstTitles!Type = "self_help"
            rstTitles.Update
        End If
        rstTitles.MoveNext
    Loop

    ' Print current data in recordset
    rstTitles.Requery
    Do While Not rstTitles.EOF
        Debug.Print rstTitles!Title & " - " & rstTitles!Type
        rstTitles.MoveNext
    Loop

    ' clean up
    rstTitles.Close
    Cnxn.RollbackTrans
    Cnxn.Close
    Set rstTitles = Nothing
    Set Cnxn = Nothing
    Exit Sub

ErrorHandler:
    ' clean up
    If Not rstTitles Is Nothing Then
        If rstTitles.State = adStateOpen Then rstTitles.Close
    End If
    Set rstTitles = Nothing

    If Not Cnxn Is Nothing Then
        If Cnxn.State = adStateOpen Then
            Cnxn.RollbackTrans
            Cnxn.Close
        End If
    End If
    Set Cnxn = Nothing

    If Err <> 0 Then
        MsgBox Err.Source & "-->" & Err.Description, , "Error"
    End If
End Sub
'EndIsolationLevelVB

Voir aussi

Connection, objet | IsolationLevel, propriété | Mode, propriété


Exemple de propriété Item (VB)

Cet exemple montre comment la propriété Item est utilisée pour accéder aux membres d'une collection. L'exemple ouvre la table Authors de la base de données Pubs à l'aide d'une commande paramétrée.

Dans la commande émise sur la base de données, le paramètre est accessible à partir de la collection Parameters de l'objet Command grâce à l'index et au nom. Les champs du Recordset renvoyé sont ensuite accessibles via la collection Fields de l'objet par l'index et le nom.

'BeginItemVB

    'To integrate this code
    'replace the data source and initial catalog values
    'in the connection string

Public Sub Main()
    On Error GoTo ErrorHandler

    Dim Cnxn As ADODB.Connection
    Dim rstAuthors As ADODB.Recordset
    Dim cmd As ADODB.Command
    Dim prm As ADODB.Parameter
    Dim fld As ADODB.Field
    Dim strCnxn As String

    Dim ix As Integer
    Dim limit As Long
    Dim Column(0 To 8) As Variant

    Set Cnxn = New ADODB.Connection
    Set rstAuthors = New ADODB.Recordset
    Set cmd = New ADODB.Command

    'Set the array with the Authors table field (column) names
    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
     ' set connection
    strCnxn = "Provider='sqloledb';Data Source='MySqlServer';" & _
        "Initial Catalog='Pubs';Integrated Security='SSPI';"
    Cnxn.Open strCnxn
    cmd.ActiveConnection = Cnxn
     ' open recordset
    rstAuthors.Open cmd, , adOpenStatic, adLockReadOnly
    'Connection and CommandType are omitted because
    'a Command object is provided

    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..."

    rstAuthors.MoveFirst
    limit = rstAuthors.Fields.Count - 1
    For ix = 0 To limit
       Set fld = rstAuthors.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..."

    rstAuthors.MoveFirst
    For ix = 0 To 8
       Set fld = rstAuthors.Fields.Item(Column(ix))
       Debug.Print "Field name = '"; fld.Name; "', Value = '"; fld.Value; "'"
    Next ix

    ' clean up
    rstAuthors.Close
    Cnxn.Close
    Set rstAuthors = Nothing
    Set Cnxn = Nothing
    Exit Sub

ErrorHandler:
    ' clean up
    If Not rstAuthors Is Nothing Then
        If rstAuthors.State = adStateOpen Then rstAuthors.Close
    End If
    Set rstAuthors = Nothing

    If Not Cnxn Is Nothing Then
        If Cnxn.State = adStateOpen Then Cnxn.Close
    End If
    Set Cnxn = Nothing

    Set cmd = Nothing

    If Err <> 0 Then
        MsgBox Err.Source & "-->" & Err.Description, , "Error"
    End If

End Sub
'EndItemVB

Voir aussi

Command, objet | Fields, collection | Item, propriété | Parameters, collection | Recordset, objet


Exemple de propriété MarshalOptions (VB)

Cet exemple utilise la propriété MarshalOptions pour spécifier les lignes renvoyées au serveur, à savoir la totalité des lignes ou uniquement celles qui ont été modifiées.

'BeginMarshalOptionsVB

    'To integrate this code
    'replace the data source and initial catalog values
    'in the connection string

Public Sub Main()
    On Error GoTo ErrorHandler

    Dim rstEmployees As ADODB.Recordset
    Dim Cnxn As ADODB.Connection
    Dim strCnxn As String
    Dim strSQLEmployees As String

    Dim strOldFirst As String
    Dim strOldLast As String
    Dim strMessage As String
    Dim strMarshalAll As String
    Dim strMarshalModified As String

    ' Open connection
    strCnxn = "Provider='sqloledb';Data Source='MySqlServer';" & _
        "Initial Catalog='Pubs';Integrated Security='SSPI';"
    Set Cnxn = New ADODB.Connection
    Cnxn.Open strCnxn

    ' open recordset with names from Employees table
    ' and set some properties through object refs
    Set rstEmployees = New ADODB.Recordset
    rstEmployees.CursorType = adOpenKeyset
    rstEmployees.LockType = adLockOptimistic
    rstEmployees.CursorLocation = adUseClient

    strSQLEmployees = "SELECT fname, lname FROM Employee ORDER BY lname"

    rstEmployees.Open strSQLEmployees, Cnxn, , , adCmdText
     ' empty properties have been set above

     ' Store original data
    strOldFirst = rstEmployees!fname
    strOldLast = rstEmployees!lname

    ' Change data in edit buffer
    rstEmployees!fname = "Linda"
    rstEmployees!lname = "Kobara"

    ' Show contents of buffer and get user input
    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

    ' sShow the resulting data
    MsgBox "Data in recordset = " & rstEmployees!fname & " " & _
        rstEmployees!lname

    ' restore original data because this is a demonstration
    If Not (strOldFirst = rstEmployees!fname And _
            strOldLast = rstEmployees!lname) Then
        rstEmployees!fname = strOldFirst
        rstEmployees!lname = strOldLast
        rstEmployees.Update
    End If

    ' clean up
    rstEmployees.Close
    Cnxn.Close
    Set rstEmployees = Nothing
    Set Cnxn = Nothing
    Exit Sub

ErrorHandler:
    ' clean up
    If Not rstEmployees Is Nothing Then
        If rstEmployees.State = adStateOpen Then rstEmployees.Close
    End If
    Set rstEmployees = Nothing

    If Not Cnxn Is Nothing Then
        If Cnxn.State = adStateOpen Then Cnxn.Close
    End If
    Set Cnxn = Nothing

    If Err <> 0 Then
        MsgBox Err.Source & "-->" & Err.Description, , "Error"
    End If
End Sub
'EndMarshalOptionsVB

MarshalOptions, propriété | MarshalOptionsEnum


Exemple de propriété MaxRecords (VB)

Cet exemple utilise la propriété MaxRecords pour ouvrir un objet Recordset contenant les 10 livres les plus chers figurant dans la table Titles.

'BeginMaxRecordsVB

    'To integrate this code
    'replace the data source and initial catalog values
    'in the connection string

Public Sub Main()
    On Error GoTo ErrorHandler

    Dim rstTitles As ADODB.Recordset
    Dim Cnxn As ADODB.Connection
    Dim strCnxn As String
    Dim strSQLTitles As String

    ' Open a connection
    Set Cnxn = New ADODB.Connection
    strCnxn = "Provider='sqloledb';Data Source='MySqlServer';" & _
        "Initial Catalog='Pubs';Integrated Security='SSPI';"
    Cnxn.Open strCnxn

    ' Open recordset containing the 10 most expensive
    ' titles in the Titles table
    Set rstTitles = New ADODB.Recordset
    rstTitles.MaxRecords = 10

    strSQLTitles = "SELECT Title, Price FROM Titles ORDER BY Price DESC"
    rstTitles.Open strSQLTitles, strCnxn, adOpenStatic, adLockReadOnly, adCmdText

    ' Display the contents of the recordset
    Debug.Print "Top Ten Titles by Price:"

    Do Until rstTitles.EOF
        Debug.Print "  " & rstTitles!Title & " - " & rstTitles!Price
        rstTitles.MoveNext
    Loop

    ' clean up
    rstTitles.Close
    Cnxn.Close
    Set rstTitles = Nothing
    Set Cnxn = Nothing
    Exit Sub

ErrorHandler:
    ' clean up
    If Not rstTitles Is Nothing Then
        If rstTitles.State = adStateOpen Then rstTitles.Close
    End If
    Set rstTitles = Nothing

    If Not Cnxn Is Nothing Then
        If Cnxn.State = adStateOpen Then Cnxn.Close
    End If
    Set Cnxn = Nothing

    If Err <> 0 Then
        MsgBox Err.Source & "-->" & Err.Description, , "Error"
    End If
End Sub
'EndMaxRecordsVB

MaxRecords, propriété | Recordset, objet


Exemple de méthode Move (VB)

Cet exemple utilise la méthode Move pour positionner le pointeur de l'enregistrement, en fonction des entrées émises par l'utilisateur.

'BeginMoveVB

    'To integrate this code
    'replace the data source and initial catalog values
    'in the connection string

Public Sub Main()
    On Error GoTo ErrorHandler

    ' connection and recordset variables
    Dim rstAuthors As ADODB.Recordset
    Dim Cnxn As ADODB.Connection
    Dim strCnxn As String
    Dim strSQLAuthors As String
     ' record variables
    Dim varBookmark As Variant
    Dim strCommand As String
    Dim lngMove As Long

    ' Open connection
    Set Cnxn = New ADODB.Connection
    strCnxn = "Provider='sqloledb';Data Source='MySqlServer';" & _
        "Initial Catalog='Pubs';Integrated Security='SSPI';"
    Cnxn.Open strCnxn

    ' Open recordset from Authors table
    Set rstAuthors = New ADODB.Recordset
    rstAuthors.CursorLocation = adUseClient
    ' Use client cursor to allow use of AbsolutePosition property
    strSQLAuthors = "SELECT au_id, au_fname, au_lname, city, state FROM Authors ORDER BY au_lname"
    rstAuthors.Open strSQLAuthors, strCnxn, adOpenStatic, adLockOptimistic, adCmdText

    rstAuthors.MoveFirst

    Do
        ' Display information about current record and
        ' ask how many records to move

        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).")

          ' this is for exiting the loop
        'lngMove = CLng(strCommand)

        lngMove = CLng(Val(strCommand))
        If lngMove = 0 Then
            MsgBox "You either entered a non-number or canceled the input box. Exit the application."
            Exit Do
        End If

        ' Store bookmark in case the Move goes too far
        ' forward or backward
        varBookmark = rstAuthors.Bookmark

        ' Move method requires parameter of data type Long
        rstAuthors.Move lngMove

        ' Trap for BOF or EOF
        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

    ' clean up
    rstAuthors.Close
    Cnxn.Close
    Set rstAuthors = Nothing
    Set Cnxn = Nothing
    Exit Sub

ErrorHandler:
    ' clean up
    If Not rstAuthors Is Nothing Then
        If rstAuthors.State = adStateOpen Then rstAuthors.Close
    End If
    Set rstAuthors = Nothing

    If Not Cnxn Is Nothing Then
        If Cnxn.State = adStateOpen Then Cnxn.Close
    End If
    Set Cnxn = Nothing

    If Err <> 0 Then
        MsgBox Err.Source & "-->" & Err.Description, , "Error"
    End If
End Sub
'EndMoveVB

Move, méthode | Recordset, objet


Exemple de méthodes MoveFirst, MoveLast, MoveNext et MovePrevious (VB)

Cet exemple utilise les méthodes MoveFirst, MoveLast, MoveNext et MovePrevious pour déplacer le pointeur de l'enregistrement d'un objet Recordset sur la base de la commande transmise. La procédure MoveAny est nécessaire à l'exécution de cette procédure.

'BeginMoveFirstVB

    'To integrate this code
    'replace the data source and initial catalog values
    'in the connection string

Public Sub Main()
    On Error GoTo ErrorHandler

    ' connection and recordset variables
    Dim rstAuthors As ADODB.Recordset
    Dim Cnxn As ADODB.Connection
    Dim strCnxn As String
    Dim strSQLAuthors
     ' record variables
    Dim strMessage As String
    Dim intCommand As Integer

    ' Open connection
    Set Cnxn = New ADODB.Connection
    strCnxn = "Provider='sqloledb';Data Source='MySqlServer';" & _
        "Initial Catalog='Pubs';Integrated Security='SSPI';"
    Cnxn.Open strCnxn

    ' Open recordset from Authors table
    Set rstAuthors = New ADODB.Recordset
    rstAuthors.CursorLocation = adUseClient
    ' Use client cursor to enable AbsolutePosition property
    strSQLAuthors = "Authors"
    rstAuthors.Open strSQLAuthors, Cnxn, adOpenStatic, adLockReadOnly, adCmdTable

    ' Show current record information and get user's method choice
    Do
        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))

         ' for exiting the loop
        If intCommand < 1 Or intCommand > 4 Then
            MsgBox "You either entered a non-number or canceled the input box. Exit the application."
            Exit Do
        End If

        ' Use specified method while trapping for BOF and EOF
        Select Case intCommand
            Case 1
                rstAuthors.MoveFirst
            Case 2
                rstAuthors.MoveLast
            Case 3
                rstAuthors.MoveNext
                If rstAuthors.EOF Then
                    MsgBox "Already at end of recordset!"
                    rstAuthors.MoveLast
                End If
            Case 4
                rstAuthors.MovePrevious
                If rstAuthors.BOF Then
                    MsgBox "Already at beginning of recordset!"
                    rstAuthors.MoveFirst
                End If
        End Select
    Loop

    ' clean up
    rstAuthors.Close
    Cnxn.Close
    Set rstAuthors = Nothing
    Set Cnxn = Nothing
    Exit Sub

ErrorHandler:
    ' clean up
    If Not rstAuthors Is Nothing Then
        If rstAuthors.State = adStateOpen Then rstAuthors.Close
    End If
    Set rstAuthors = Nothing

    If Not Cnxn Is Nothing Then
        If Cnxn.State = adStateOpen Then Cnxn.Close
    End If
    Set Cnxn = Nothing

    If Err <> 0 Then
        MsgBox Err.Source & "-->" & Err.Description, , "Error"
    End If
End Sub

'EndMoveFirstVB

Voir aussi

MoveFirst, MoveLast, MoveNext et MovePrevious, méthodes | Recordset, objet


Exemple de méthode NextRecordset (VB)

Cet exemple utilise la méthode NextRecordset pour afficher les données dans un jeu d'enregistrements qui utilise une instruction de commande combinée, composée de trois différentes instructions SELECT.

'BeginNextRecordsetVB

    'To integrate this code
    'replace the data source and initial catalog values
    'in the connection string

Public Sub Main()
    On Error GoTo ErrorHandler

    ' connection and recordset variables
    Dim rstCompound As ADODB.Recordset
    Dim Cnxn As ADODB.Connection
    Dim strCnxn As String
    Dim SQLCompound As String

    Dim intCount As Integer

    ' Open connection
    Set Cnxn = New ADODB.Connection
    strCnxn = "Provider='sqloledb';Data Source='MySqlServer';" & _
        "Initial Catalog='Pubs';Integrated Security='SSPI';"
    Cnxn.Open strCnxn

    ' Open compound recordset
    Set rstCompound = New ADODB.Recordset
    SQLCompound = "SELECT * FROM Authors; " & _
        "SELECT * FROM stores; " & _
        "SELECT * FROM jobs"
    rstCompound.Open SQLCompound, Cnxn, adOpenStatic, adLockReadOnly, adCmdText

    ' Display results from each SELECT statement
    intCount = 1
    Do Until rstCompound Is Nothing
        Debug.Print "Contents of recordset #" & intCount

        Do Until rstCompound.EOF
            Debug.Print , rstCompound.Fields(0), rstCompound.Fields(1)
            rstCompound.MoveNext
        Loop

        Set rstCompound = rstCompound.NextRecordset
        intCount = intCount + 1
    Loop

    ' clean up
    Cnxn.Close
    Set rstCompound = Nothing
    Set Cnxn = Nothing
    Exit Sub

ErrorHandler:
    ' clean up
    If Not rstCompound Is Nothing Then
        If rstCompound.State = adStateOpen Then rstCompound.Close
    End If
    Set rstCompound = Nothing

    If Not Cnxn Is Nothing Then
        If Cnxn.State = adStateOpen Then Cnxn.Close
    End If
    Set Cnxn = Nothing

    If Err <> 0 Then
        MsgBox Err.Source & "-->" & Err.Description, , "Error"
    End If
End Sub
'EndNextRecordsetVB

NextRecordset, méthode | Recordset, objet


Exemple de propriétés NumericScale et Precision (VB)

Cet exemple utilise les propriétés NumericScale et Precision pour afficher l'échelle numérique et la précision des champs de la table Discounts de la base de données Pubs.

'BeginNumericScaleVB

    'To integrate this code
    'replace the data source and initial catalog values
    'in the connection string

Public Sub Main()
    On Error GoTo ErrorHandler

    ' connection and recordset variables
    Dim rstDiscounts As ADODB.Recordset
    Dim Cnxn As ADODB.Connection
    Dim fldTemp As ADODB.Field
    Dim strCnxn As String
    Dim strSQLDiscounts As String

    ' Open connection
    Set Cnxn = New ADODB.Connection
    strCnxn = "Provider='sqloledb';Data Source='MySqlServer';" & _
        "Initial Catalog='Pubs';Integrated Security='SSPI';"
    Cnxn.Open strCnxn

    ' Open recordset
    Set rstDiscounts = New ADODB.Recordset
    strSQLDiscounts = "Discounts"
    rstDiscounts.Open strSQLDiscounts, Cnxn, adOpenStatic, adLockReadOnly, adCmdTable

    ' Display numeric scale and precision of
    ' numeric and small integer fields
    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

    ' clean up
    rstDiscounts.Close
    Cnxn.Close
    Set rstDiscounts = Nothing
    Set Cnxn = Nothing
    Exit Sub

ErrorHandler:
    ' clean up
    If Not rstDiscounts Is Nothing Then
        If rstDiscounts.State = adStateOpen Then rstDiscounts.Close
    End If
    Set rstDiscounts = Nothing

    If Not Cnxn Is Nothing Then
        If Cnxn.State = adStateOpen Then Cnxn.Close
    End If
    Set Cnxn = Nothing

    If Err <> 0 Then
        MsgBox Err.Source & "-->" & Err.Description, , "Error"
    End If

End Sub
'EndNumericScaleVB

Voir aussi

Field, objet | NumericScale, propriété | Parameter, objet | Precision, propriété


Exemple de méthodes Open et Close (VB)

Cet exemple utilise les méthodes Open et Close sur les deux objets Recordset et Connection qui ont été ouverts.

'BeginOpenVB

    'To integrate this code
    'replace the data source and initial catalog values
    'in the connection string

Public Sub OpenX()
    On Error GoTo ErrorHandler

    Dim Cnxn As ADODB.Connection
    Dim rstEmployees As ADODB.Recordset
    Dim strCnxn As String
    Dim strSQLEmployees As String
    Dim varDate As Variant

    ' Open connection
    strCnxn = "Provider='sqloledb';Data Source='MySqlServer';" & _
        "Initial Catalog='Pubs';Integrated Security='SSPI';"
    Set Cnxn = New ADODB.Connection
    Cnxn.Open strCnxn

    ' Open employee table
    Set rstEmployees = New ADODB.Recordset
    strSQLEmployees = "employee"
    rstEmployees.Open strSQLEmployees, Cnxn, adOpenKeyset, adLockOptimistic, adCmdTable

    ' Assign the first employee record's hire date
    ' to a variable, then change the hire date
    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

    ' Requery Recordset and reset the hire date
    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

    ' clean up
    rstEmployees.Close
    Cnxn.Close
    Set rstEmployees = Nothing
    Set Cnxn = Nothing
    Exit Sub

ErrorHandler:
    ' clean up
    If Not rstEmployees Is Nothing Then
        If rstEmployees.State = adStateOpen Then rstEmployees.Close
    End If
    Set rstEmployees = Nothing

    If Not Cnxn Is Nothing Then
        If Cnxn.State = adStateOpen Then Cnxn.Close
    End If
    Set Cnxn = Nothing

    If Err <> 0 Then
        MsgBox Err.Source & "-->" & Err.Description, , "Error"
    End If
End Sub
'EndOpenVB

Voir aussi

Close, méthode | Connection, objet | Open, méthode (objet Connection ADO) | Open, méthode (objet Recordset ADO) | Recordset, objet


Exemple de méthode OpenSchema (VB)

Cet exemple utilise la méthode OpenSchema pour afficher le nom et le type de chaque table dans la base de données Pubs.

'BeginOpenSchemaVB

    'To integrate this code
    'replace the data source and initial catalog values
    'in the connection string

Public Sub OpenSchemaX()
    On Error GoTo ErrorHandler

    Dim Cnxn As ADODB.Connection
    Dim rstSchema As ADODB.Recordset
    Dim strCnxn As String

    Set Cnxn = New ADODB.Connection
    strCnxn = "Provider='sqloledb';Data Source='MySqlServer';" & _
        "Initial Catalog='Pubs';Integrated Security='SSPI';"
    Cnxn.Open strCnxn

    Set rstSchema = Cnxn.OpenSchema(adSchemaTables)

    Do Until rstSchema.EOF
        Debug.Print "Table name: " & _
            rstSchema!TABLE_NAME & vbCr & _
            "Table type: " & rstSchema!TABLE_TYPE & vbCr
        rstSchema.MoveNext
    Loop

    ' clean up
    rstSchema.Close
    Cnxn.Close
    Set rstSchema = Nothing
    Set Cnxn = Nothing
    Exit Sub

ErrorHandler:
    ' clean up
    If Not rstSchema Is Nothing Then
        If rstSchema.State = adStateOpen Then rstSchema.Close
    End If
    Set rstSchema = Nothing

    If Not Cnxn Is Nothing Then
        If Cnxn.State = adStateOpen Then Cnxn.Close
    End If
    Set Cnxn = Nothing

    If Err <> 0 Then
        MsgBox Err.Source & "-->" & Err.Description, , "Error"
    End If
End Sub
'EndOpenSchemaVB

Cet exemple indique une contrainte de requête TABLE_TYPE dans l'argument Criteria de la méthode OpenSchema. Résultat : seules les informations de schéma des vues spécifiées dans la base de données Pubs sont renvoyées. L'exemple affiche ensuite les noms et types de chaque table.

'BeginOpenSchema2VB
Public Sub Main()
    On Error GoTo ErrorHandler

    Dim Cnxn2 As ADODB.Connection
    Dim rstSchema As ADODB.Recordset
    Dim strCnxn As String

    Set Cnxn2 = New ADODB.Connection
    strCnxn = "Provider=sqloledb;" & _
        "Data Source=MySqlServer;Initial Catalog=Pubs;Integrated Security=SSPI; "
    Cnxn2.Open strCnxn

    Set rstSchema = Cnxn2.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

    ' clean up
    rstSchema.Close
    Cnxn2.Close
    Set rstSchema = Nothing
    Set Cnxn2 = Nothing
    Exit Sub

ErrorHandler:
   ' clean up
    If Not rstSchema Is Nothing Then
        If rstSchema.State = adStateOpen Then rstSchema.Close
    End If
    Set rstSchema = Nothing

    If Not Cnxn2 Is Nothing Then
        If Cnxn2.State = adStateOpen Then Cnxn2.Close
    End If
    Set Cnxn2 = Nothing

    If Err <> 0 Then
        MsgBox Err.Source & "-->" & Err.Description, , "Error"
    End If
End Sub
'EndOpenSchema2VB

OpenSchema, méthode | Recordset, objet


Exemple de propriété Optimize (VB)

Cet exemple met en application la propriété dynamique Optimize de l'objet Field. Le champ zip de la table Authors dans la base de données Pubs n'est pas indexé. L'affectation de la valeur True à la propriété Optimize sur le champ zip permet à ADO de construire un index qui améliore les performances de la méthode Find.

'BeginOptimizeVB
Public Sub Main()
    On Error GoTo ErrorHandler

    'To integrate this code
    'replace the data source and initial catalog values
    'in the connection string

    ' recordset and connection variables
    Dim Cnxn As ADODB.Connection
    Dim rstAuthors As ADODB.Recordset
    Dim strCnxn As String
    Dim strSQLAuthors As String

     ' Open connection
    strCnxn = "Provider='sqloledb';Data Source='MySqlServer';" & _
        "Initial Catalog='Pubs';Integrated Security='SSPI';"
    Set Cnxn = New ADODB.Connection
    Cnxn.Open strCnxn

     ' open recordset client-side to enable index creation
    Set rstAuthors = New ADODB.Recordset
    rstAuthors.CursorLocation = adUseClient
    strSQLAuthors = "SELECT * FROM Authors"
    rstAuthors.Open strSQLAuthors, Cnxn, adOpenStatic, adLockReadOnly, adCmdText
     ' Create the index
    rstAuthors!zip.Properties("Optimize") = True
     ' Find Akiko Yokomoto
    rstAuthors.Find "zip = '94595'"

     ' show results
    Debug.Print rstAuthors!au_fname & " " & rstAuthors!au_lname & " " & _
             rstAuthors!address & " " & rstAuthors!city & " " & rstAuthors!State
    rstAuthors!zip.Properties("Optimize") = False  'Delete the index

    ' clean up
    rstAuthors.Close
    Cnxn.Close
    Set rstAuthors = Nothing
    Set Cnxn = Nothing
    Exit Sub

ErrorHandler:
    ' clean up
    If Not rstAuthors Is Nothing Then
        If rstAuthors.State = adStateOpen Then rstAuthors.Close
    End If
    Set rstAuthors = Nothing

    If Not Cnxn Is Nothing Then
        If Cnxn.State = adStateOpen Then Cnxn.Close
    End If
    Set Cnxn = Nothing

    If Err <> 0 Then
        MsgBox Err.Source & "-->" & Err.Description, , "Error"
    End If
End Sub
'EndOptimizeVB

Voir aussi

Field, objet | Optimize, propriété dynamique (ADO)


Exemple de propriétés OriginalValue et UnderlyingValue (VB)

Cet exemple montre comment les propriétés OriginalValue et UnderlyingValue sont utilisées pour afficher un message lorsque les données sous-jacentes d'un enregistrement sont modifiées durant la mise à jour par lots d'un objet Recordset.

'BeginOriginalValueVB
Public Sub Main()
    On Error GoTo ErrorHandler

    'To integrate this code
    'replace the data source and initial catalog values
    'in the connection string

    Dim Cnxn As ADODB.Connection
    Dim rstTitles As ADODB.Recordset
    Dim fldType As ADODB.Field
    Dim strCnxn As String
    Dim strSQLTitles As String

    ' Open connection.
    Set Cnxn = New ADODB.Connection
    strCnxn = "Provider='sqloledb';Data Source='MySqlServer';" & _
        "Initial Catalog='Pubs';Integrated Security='SSPI';"
    Cnxn.Open strCnxn

    ' Open recordset for batch update
    ' using object refs to set properties
    Set rstTitles = New ADODB.Recordset
    Set rstTitles.ActiveConnection = Cnxn
    rstTitles.CursorType = adOpenKeyset
    rstTitles.LockType = adLockBatchOptimistic
    strSQLTitles = "titles"
    rstTitles.Open strSQLTitles

    ' Set field object variable for Type field
    Set fldType = rstTitles!Type

    ' Change the type of psychology titles
    Do Until rstTitles.EOF
        If Trim(fldType) = "psychology" Then
            fldType = "self_help"
        End If
        rstTitles.MoveNext
    Loop

    ' Similate a change by another user by updating
    ' data using a command string
    Cnxn.Execute "UPDATE Titles SET type = 'sociology' " & _
       "WHERE type = 'psychology'"

    'Check for changes
    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

    ' Cancel the update because this is a demonstration
    rstTitles.CancelBatch

    ' Restore original values
    Cnxn.Execute "UPDATE Titles SET type = 'psychology' " & _
        "WHERE type = 'sociology'"

    ' clean up
    rstTitles.Close
    Cnxn.Close
    Set rstTitles = Nothing
    Set Cnxn = Nothing
    Exit Sub

ErrorHandler:
    ' clean up
    If Not rstTitles Is Nothing Then
        If rstTitles.State = adStateOpen Then rstTitles.Close
    End If
    Set rstTitles = Nothing

    If Not Cnxn Is Nothing Then
        If Cnxn.State = adStateOpen Then Cnxn.Close
    End If
    Set Cnxn = Nothing

    If Err <> 0 Then
        MsgBox Err.Source & "-->" & Err.Description, , "Error"
    End If
End Sub
'EndOriginalValueVB

Voir aussi

OriginalValue, propriété | Recordset, objet | UnderlyingValue, propriété


Exemple de propriété Prepared (VB)

Cet exemple illustre l'utilisation de la propriété Prepared en ouvrant deux objets Command, l'un préparé et l'autre pas.

'BeginPreparedVB

    'To integrate this code
    'replace the data source and initial catalog values
    'in the connection string

Public Sub Main()
    On Error GoTo ErrorHandler

    Dim Cnxn As ADODB.Connection
    Dim cmd1 As ADODB.Command
    Dim cmd2 As ADODB.Command

    Dim strCnxn 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

    ' Open a connection
    strCnxn = "Provider='sqloledb';Data Source='MySqlServer';" & _
        "Initial Catalog='Pubs';Integrated Security='SSPI';"
    Set Cnxn = New ADODB.Connection
    Cnxn.Open strCnxn

    ' Create two command objects for the same
    ' command - one prepared and one not prepared
    strCmd = "SELECT title, type FROM Titles ORDER BY type"

    Set cmd1 = New ADODB.Command
    Set cmd1.ActiveConnection = Cnxn
    cmd1.CommandText = strCmd

    Set cmd2 = New ADODB.Command
    Set cmd2.ActiveConnection = Cnxn
    cmd2.CommandText = strCmd
    cmd2.Prepared = True

    ' Set a timer, then execute the unprepared
    ' command 20 times
    sngStart = Timer
    For intLoop = 1 To 20
        cmd1.Execute
    Next intLoop
    sngEnd = Timer
    sngNotPrepared = sngEnd - sngStart

    ' Reset the timer, then execute the prepared
    ' command 20 times
    sngStart = Timer
    For intLoop = 1 To 20
        cmd2.Execute
    Next intLoop
    sngEnd = Timer
    sngPrepared = sngEnd - sngStart

    ' Display performance results
    MsgBox "Performance Results:" & vbCr & _
        "   Not Prepared: " & Format(sngNotPrepared, _
        "##0.000") & " seconds" & vbCr & _
        "   Prepared: " & Format(sngPrepared, _
        "##0.000") & " seconds"

    ' clean up
    Cnxn.Close
    Set Cnxn = Nothing
    Set cmd1 = Nothing
    Set cmd2 = Nothing
    Exit Sub

ErrorHandler:
    ' clean up
    Set cmd1 = Nothing
    Set cmd2 = Nothing

    If Not Cnxn Is Nothing Then
        If Cnxn.State = adStateOpen Then Cnxn.Close
    End If
    Set Cnxn = Nothing

    If Err <> 0 Then
        MsgBox Err.Source & "-->" & Err.Description, , "Error"
    End If
End Sub
'EndPreparedVB

Command, objet | Prepared, propriété


Exemple de propriétés Provider et DefaultDatabase (VB)

Cet exemple illustre l'utilisation de la propriété Provider en ouvrant trois objets Connection à partir de fournisseurs différents. Il utilise également la propriété DefaultDatabase pour définir la base de données par défaut pour le fournisseur ODBC Microsoft.

'BeginProviderVB

    'To integrate this code
    'replace the data source and initial catalog values
    'in the connection strings

Public Sub Main()
    On Error GoTo ErrorHandler

    Dim Cnxn1 As ADODB.Connection
    Dim Cnxn2 As ADODB.Connection
    Dim Cnxn3 As ADODB.Connection
    Dim strCnxn As String

    ' Open a connection using the Microsoft ODBC provider
    Set Cnxn1 = New ADODB.Connection
    Cnxn1.ConnectionString = "driver={SQL Server};server='MySqlServer';" & _
        "user id='MyUserID';password='MyPassword';"
    Cnxn1.Open strCnxn
    Cnxn1.DefaultDatabase = "Pubs"

    ' Display the provider
    MsgBox "Cnxn1 provider: " & Cnxn1.Provider

    ' Open a connection using the Microsoft Jet provider
    Set Cnxn2 = New ADODB.Connection
    Cnxn2.Provider = "Microsoft.Jet.OLEDB.4.0"
    Cnxn2.Open "C:\Program Files\Microsoft Office\Office\Samples\northwind.mdb", _
        "MyUserID", "MyPassword"

    ' Display the provider.
    MsgBox "Cnxn2 provider: " & Cnxn2.Provider

    ' Open a connection using the Microsoft SQL Server provider
    Set Cnxn3 = New ADODB.Connection
    Cnxn3.Provider = "sqloledb"
    Cnxn3.Open "Data Source='MySqlServer';" & _
        "Initial Catalog='Pubs';Integrated Security='SSPI';"

    ' Display the provider
    MsgBox "Cnxn3 provider: " & Cnxn3.Provider

    ' clean up
    Cnxn1.Close
    Cnxn2.Close
    Cnxn3.Close
    Set Cnxn1 = Nothing
    Set Cnxn2 = Nothing
    Set Cnxn3 = Nothing
    Exit Sub

ErrorHandler:
    If Not Cnxn1 Is Nothing Then
        If Cnxn1.State = adStateOpen Then Cnxn1.Close
    End If
    Set Cnxn1 = Nothing

    If Not Cnxn2 Is Nothing Then
        If Cnxn2.State = adStateOpen Then Cnxn2.Close
    End If
    Set Cnxn2 = Nothing

    If Not Cnxn3 Is Nothing Then
        If Cnxn3.State = adStateOpen Then Cnxn3.Close
    End If
    Set Cnxn3 = Nothing

    If Err <> 0 Then
        MsgBox Err.Source & "-->" & Err.Description, , "Error"
    End If

End Sub
'EndProviderVB

Voir aussi

Connection, objet | DefaultDatabase, propriété | Provider, propriété


Exemple de méthodes Read, ReadText, Write et WriteText (VB)

Cet exemple illustre comment lire le contenu d'une zone de texte à la fois dans un Stream texte et dans un Stream binaire. Les autres propriétés et méthode indiquées incluent Position, Size, Charset et SetEOS.

'BeginReadVB
Private Sub cmdRead_Click()
    On Error GoTo ErrorHandler

    'Declare variables
    Dim objStream As Stream
    Dim varA As Variant
    Dim bytA() As Byte
    Dim i As Integer
    Dim strBytes As String

    'Instantiate and Open Stream
    Set objStream = New Stream
    objStream.Open

    'Write the text content of a textbox to the stream
    If Text1.Text = "" Then
        Err.Raise 1, , "The text field is blank."
    End If
    objStream.WriteText Text1.Text

    'Display the text contents and size of the stream
    objStream.Position = 0
    Debug.Print "Default text:"
    Debug.Print objStream.ReadText
    Debug.Print objStream.Size

    'Switch character set and display
    objStream.Position = 0
    objStream.Charset = "Windows-1252"
    Debug.Print "New Charset text:"
    Debug.Print objStream.ReadText
    Debug.Print objStream.Size

    'Switch to a binary stream and display
    objStream.Position = 0
    objStream.Type = adTypeBinary
    Debug.Print "Binary:"
    Debug.Print objStream.Read
    Debug.Print objStream.Size

    'Load an array of bytes with the text box text
    ReDim bytA(Len(Text1.Text))
    For i = 1 To Len(Text1.Text)
        bytA(i - 1) = CByte(Asc(Mid(Text1.Text, i, 1)))
    Next

    'Write the buffer to the binary stream and display
    objStream.Position = 0
    objStream.Write bytA()
    objStream.SetEOS
    objStream.Position = 0
    Debug.Print "Binary after Write:"
    Debug.Print objStream.Read
    Debug.Print objStream.Size

    'Switch back to a text stream and display
    Debug.Print "Translated back:"
    objStream.Position = 0
    objStream.Type = adTypeText
    Debug.Print objStream.ReadText
    Debug.Print objStream.Size

    ' clean up
    objStream.Close
    Set objStream = Nothing
    Exit Sub

ErrorHandler:
    ' clean up
    If Not objStream Is Nothing Then
        If objStream.State = adStateOpen Then objStream.Close
    End If
    Set objStream = Nothing

    If Err <> 0 Then
        MsgBox Err.Source & "-->" & Err.Description, , "Error"
    End If
End Sub
'EndReadVB

Voir aussi

Charset, propriété | Position, propriété | Read, méthode | ReadText, méthode | SetEOS, méthode | Size, propriété (objet ADO Stream) | Stream, objet | Write, méthode | WriteText, méthode


Exemple de méthode Refresh (VB)

Cet exemple montre comment utiliser la méthode Refresh pour actualiser la collection Parameters pour l'objet Command d'une procédure stockée.

Option Explicit

'BeginRefreshVB
Public Sub Main()
    On Error GoTo ErrorHandler

    'To integrate this code
    'replace the data source and initial catalog values
    'in the connection strings

    ' connection and recordset variables
    Dim Cnxn As ADODB.Connection
    Dim cmdByRoyalty As ADODB.Command
    Dim rstByRoyalty As ADODB.Recordset
    Dim rstAuthors As ADODB.Recordset
    Dim strCnxn As String
    Dim strSQLAuthors As String
     ' record variables
    Dim intRoyalty As Integer
    Dim strAuthorID As String
    Dim strRoyalty As String

    ' Open connection
    Set Cnxn = New ADODB.Connection
    strCnxn = "Provider='sqloledb';Data Source='MySqlServer';" & _
        "Initial Catalog='Pubs';Integrated Security='SSPI';"
    Cnxn.Open strCnxn

    ' Open a command object for a stored procedure
    ' with one parameter
    Set cmdByRoyalty = New ADODB.Command
    Set cmdByRoyalty.ActiveConnection = Cnxn
    cmdByRoyalty.CommandText = "byroyalty"
    cmdByRoyalty.CommandType = adCmdStoredProc
    cmdByRoyalty.Parameters.Refresh

    ' Get paramater value, execute the command
    ' and store the results in a recordset
    strRoyalty = InputBox("Enter royalty:")
    If strRoyalty = "" Then
        Err.Raise 1, , "You either didn't enter royalty or canceled the input box. Exit the application"
    End If

    intRoyalty = Trim(strRoyalty)
    cmdByRoyalty.Parameters(1) = intRoyalty
    Set rstByRoyalty = cmdByRoyalty.Execute()

    ' Open the Authors table to get author names for display
    Set rstAuthors = New ADODB.Recordset
    strSQLAuthors = "Authors"
    rstAuthors.Open strSQLAuthors, Cnxn, adOpenForwardOnly, adLockPessimistic, adCmdTable

    ' Print current data in the recordset
    ' and add author names
    Debug.Print "Authors with " & intRoyalty & " percent royalty"

    Do Until 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

    ' clean up
    rstByRoyalty.Close
    rstAuthors.Close
    Cnxn.Close
    Set rstByRoyalty = Nothing
    Set rstAuthors = Nothing
    Set Cnxn = Nothing
    Exit Sub

ErrorHandler:
    ' clean up
    If Not rstByRoyalty Is Nothing Then
        If rstByRoyalty.State = adStateOpen Then rstByRoyalty.Close
    End If
    Set rstByRoyalty = Nothing

    If Not rstAuthors Is Nothing Then
        If rstAuthors.State = adStateOpen Then rstAuthors.Close
    End If
    Set rstAuthors = Nothing

    If Not Cnxn Is Nothing Then
        If Cnxn.State = adStateOpen Then Cnxn.Close
    End If
    Set Cnxn = Nothing

    If Err <> 0 Then
        MsgBox Err.Source & "-->" & Err.Description, , "Error"
    End If
End Sub
'EndRefreshVB

Command, objet | Parameters, collection | Refresh, méthode


Exemple de méthode Resync (VB)

L'exemple ci-dessous illustre comment utiliser la méthode Resync pour actualiser les données d'un jeu d'enregistrements statique.

'BeginResyncVB

    'To integrate this code
    'replace the data source and initial catalog values
    'in the connection strings

Public Sub Main()
    On Error GoTo ErrorHandler

    'connection and recordset variables
    Dim Cnxn As ADODB.Connection
    Dim rstTitles As ADODB.Recordset
    Dim strCnxn As String
    Dim strSQLTitles As String

    ' Open connection
    Set Cnxn = New ADODB.Connection
    strCnxn = "Provider='sqloledb';Data Source='MySqlServer';" & _
        "Initial Catalog='Pubs';Integrated Security='SSPI';"
    Cnxn.Open strCnxn

    ' Open recordset using object refs to set properties
    ' that allow for updates to the database
    Set rstTitles = New ADODB.Recordset
    Set rstTitles.ActiveConnection = Cnxn
    rstTitles.CursorType = adOpenKeyset
    rstTitles.LockType = adLockOptimistic

    strSQLTitles = "titles"
    rstTitles.Open strSQLTitles

    'rstTitles.Open strSQLTitles, Cnxn, adOpenKeyset, adLockPessimistic, adCmdTable
    'the above line of code passes the same refs as the object refs listed above

    ' Change the type of the first title in the recordset
    rstTitles!Type = "database"

    ' Display the results of the change
    MsgBox "Before resync: " & vbCr & vbCr & _
        "Title - " & rstTitles!Title & vbCr & _
        "Type - " & rstTitles!Type

    ' Resync with database and redisplay results
    rstTitles.Resync
    MsgBox "After resync: " & vbCr & vbCr & _
        "Title - " & rstTitles!Title & vbCr & _
        "Type - " & rstTitles!Type

    ' clean up
    rstTitles.CancelBatch
    rstTitles.Close
    Cnxn.Close
    Set rstTitles = Nothing
    Set Cnxn = Nothing
    Exit Sub

ErrorHandler:
    ' clean up
    If Not rstTitles Is Nothing Then
        If rstTitles.State = adStateOpen Then
            rstTitles.CancelBatch
            rstTitles.Close
        End If
    End If
    Set rstTitles = Nothing

    If Not Cnxn Is Nothing Then
        If Cnxn.State = adStateOpen Then Cnxn.Close
    End If
    Set Cnxn = Nothing

    If Err <> 0 Then
        MsgBox Err.Source & "-->" & Err.Description, , "Error"
    End If
End Sub
'EndResyncVB

Recordset, objet | Resync, méthode


Exemple de méthodes Save et Open (VB)

Ces trois exemples illustrent comment utiliser ensemble les méthodes Save et Open.

Supposez que vous partez en voyage d'affaires et que vous voulez prendre avec vous une table d'une base de données. Avant de partir, vous accédez aux données en tant qu'objet Recordset et les enregistrez sous une forme transportable. Une fois arrivé à destination, vous accédez au Recordset en tant que Recordset local, déconnecté. Vous effectuez les modifications voulues dans le Recordset. Enfin, de retour chez vous, vous vous connectez de nouveau à la base de données et la mettez à jour avec les modifications effectuées en déplacement.

Accédez d'abord à la table Authors et enregistrez-la.

'BeginSaveVB

    'To integrate this code
    'replace the data source and initial catalog values
    'in the connection string

Public Sub Main()
    On Error GoTo ErrorHandler

    'recordset and connection variables
    Dim rstAuthors As ADODB.Recordset
    Dim Cnxn As ADODB.Connection
    Dim strCnxn As String
    Dim strSQLAuthors As String

    ' Open connection
    Set Cnxn = New ADODB.Connection
    strCnxn = "Provider='sqloledb';Data Source='MySqlServer';" & _
        "Initial Catalog='Pubs';Integrated Security='SSPI';"
    Cnxn.Open strCnxn

    Set rstAuthors = New ADODB.Recordset
    strSQLAuthors = "SELECT au_id, au_lname, au_fname, city, phone FROM Authors"
    rstAuthors.Open strSQLAuthors, Cnxn, adOpenDynamic, adLockOptimistic, adCmdText

    'For sake of illustration, save the Recordset to a diskette in XML format
    rstAuthors.Save "c:\Pubs.xml", adPersistXML

    ' clean up
    rstAuthors.Close
    Cnxn.Close
    Set rstAuthors = Nothing
    Set Cnxn = Nothing
    Exit Sub

ErrorHandler:
    'clean up
    If Not rstAuthors Is Nothing Then
        If rstAuthors.State = adStateOpen Then rstAuthors.Close
    End If
    Set rstAuthors = Nothing

    If Not Cnxn Is Nothing Then
        If Cnxn.State = adStateOpen Then Cnxn.Close
    End If
    Set Cnxn = Nothing

    If Err <> 0 Then
        MsgBox Err.Source & "-->" & Err.Description, , "Error"
    End If
End Sub
'EndSaveVB

À ce stade, vous êtes arrivé à destination. Vous accéderez à la table Authors comme un Recordset local, déconnecté. N'oubliez pas que le fournisseur MSPersist doit être installé sur l'ordinateur que vous utilisez pour accéder au fichier enregistré, a:\Pubs.xml.

'BeginSave2VB
Public Sub Main()
    On Error GoTo ErrorHandler

    Dim rst As ADODB.Recordset
    Set rst = New ADODB.Recordset

    'For sake of illustration, we specify all parameters
    rst.Open "c:\Pubs.xml", "Provider=MSPersist;", adOpenForwardOnly, adLockBatchOptimistic, adCmdFile

    'Now you have a local, disconnected Recordset - Edit as you desired
    '(In this example the change makes no difference)
    rst.Find "au_lname = 'Carson'"
    If rst.EOF Then
       Debug.Print "Name not found."
       Exit Sub
    End If

    rst!city = "Chicago"
    rst.Update

    'Save changes in ADTG format this time, purely for sake of illustration.
    'Note that the previous version is still on the diskette, as a:\Pubs.xml.
    rst.Save "c:\Pubs.adtg", adPersistADTG

    ' clean up
    rst.Close
    Set rst = Nothing
    Exit Sub

ErrorHandler:
    'clean up
    If Not rst Is Nothing Then
        If rst.State = adStateOpen Then rst.Close
    End If
    Set rst = Nothing

    If Err <> 0 Then
        MsgBox Err.Source & "-->" & Err.Description, , "Error"
    End If
End Sub
'EndSave2VB

Enfin, vous retournez chez vous. Maintenant, mettez à jour la base de données pour y intégrer les modifications effectuées.

'BeginSave3VB
Public Sub Main()
    On Error GoTo ErrorHandler

    'To integrate this code
    'replace the data source and initial catalog values
    'in the connection string

    Dim Cnxn As New ADODB.Connection
    Dim rst As ADODB.Recordset
    Dim strCnxn As String

    Set rst = New ADODB.Recordset
    ' The lock mode is batch optimistic because we are going to
    ' use the UpdateBatch method.
    rst.Open "c:\Pubs.adtg", "Provider=MSPersist;", adOpenForwardOnly, adLockBatchOptimistic, adCmdFile

     ' Connect to the database, associate the Recordset with the connection
     ' then update the database table with the changed Recordset
    strCnxn = "Provider=SQLOLEDB;Data Source=MySqlServer;Integrated Security=SSPI;Initial Catalog=pubs;"
    Cnxn.Open strCnxn

    rst.ActiveConnection = Cnxn
    rst.UpdateBatch

    ' clean up
    rst.Close
    Cnxn.Close
    Set rst = Nothing
    Set Cnxn = Nothing
    Exit Sub

ErrorHandler:
    'clean up
    If Not rst Is Nothing Then
        If rst.State = adStateOpen Then rst.Close
    End If
    Set rst = Nothing

    If Not Cnxn Is Nothing Then
        If Cnxn.State = adStateOpen Then Cnxn.Close
    End If
    Set Cnxn = Nothing

    If Err <> 0 Then
        MsgBox Err.Source & "-->" & Err.Description, , "Error"
    End If
End Sub
'EndSave3VB

Voir aussi

Open, méthode (objet Recordset ADO) | Recordset, objet | Persistance d'un Recordset | Save, méthode


Exemple de méthode Seek et de propriété Index (VB)

Cet exemple illustre l'utilisation combinée de la méthode Seek et de la propriété Index de l'objet Recordset avec un Employee ID spécifique, pour localiser le nom de l'employé dans la table Employees de la base de données Nwind.mdb.

'BeginSeekVB
Public Sub Main()
    On Error GoTo ErrorHandler

    ' To integrate this code replace the data source
    ' in the connection string

     'recordset and connection variables
    Dim rstEmployees As ADODB.Recordset
    Dim Cnxn As ADODB.Connection
    Dim strCnxn As String
    Dim strSQLEmployees As String

    Dim strID As String
    Dim strPrompt As String
    strPrompt = "Enter an EmployeeID (e.g., 1 to 9)"

    ' Open connection
    Set Cnxn = New ADODB.Connection
    strCnxn = "Provider='Microsoft.Jet.OLEDB.4.0';" & _
                "Data Source='c:\Program Files\Microsoft Office\Office\Samples\northwind.mdb';"
    Cnxn.Open strCnxn

     ' open recordset server-side for indexing
    Set rstEmployees = New ADODB.Recordset
    rstEmployees.CursorLocation = adUseServer
    strSQLEmployees = "employees"
    rstEmployees.Open strSQLEmployees, strCnxn, adOpenKeyset, adLockReadOnly, adCmdTableDirect

    ' Does this provider support Seek and Index?
    If rstEmployees.Supports(adIndex) And rstEmployees.Supports(adSeek) Then
        rstEmployees.Index = "PrimaryKey"
        ' Display all the employees
            rstEmployees.MoveFirst
            Do While rstEmployees.EOF = False
                Debug.Print rstEmployees!EmployeeId; ": "; rstEmployees!firstname; " "; _
                    rstEmployees!LastName
                rstEmployees.MoveNext
            Loop

    ' Prompt the user for an EmployeeID between 1 and 9
          rstEmployees.MoveFirst
          Do
             strID = LCase(Trim(InputBox(strPrompt, "Seek Example")))
             ' Quit if strID is a zero-length string (CANCEL, null, etc.)
             If Len(strID) = 0 Then Exit Do
             If Len(strID) = 1 And strID >= "1" And strID <= "9" Then
                rstEmployees.Seek Array(strID), adSeekFirstEQ
                If rstEmployees.EOF Then
                   Debug.Print "Employee not found."
                Else
                   Debug.Print strID; ": Employee='"; rstEmployees!firstname; " "; _
                   rstEmployees!LastName; "'"
                End If
             End If
          Loop
    End If

    ' clean up
    rstEmployees.Close
    Cnxn.Close
    Set rstEmployees = Nothing
    Set Cnxn = Nothing
    Exit Sub

ErrorHandler:
    ' clean up
    If Not rstEmployees Is Nothing Then
        If rstEmployees.State = adStateOpen Then rstEmployees.Close
    End If
    Set rstEmployees = Nothing

    If Not Cnxn Is Nothing Then
        If Cnxn.State = adStateOpen Then Cnxn.Close
    End If
    Set Cnxn = Nothing

    If Err <> 0 Then
        MsgBox Err.Source & "-->" & Err.Description, , "Error"
    End If
End Sub
'EndSeekVB

Index, propriété | Recordset, objet | Seek, méthode


Exemple de propriété Sort (VB)

Cet exemple utilise la propriété Sort de l'objet Recordset pour réorganiser les lignes d'un objet Recordset provenant de la table Authors de la base de données Pubs. Une routine d'utilitaire secondaire imprime chaque ligne.

'BeginSortVB

    'To integrate this code
    'replace the data source and initial catalog values
    'in the connection string

Public Sub Main()
    On Error GoTo ErrorHandler

     ' connection and recordset variables
    Dim Cnxn As New ADODB.Connection
    Dim rstAuthors As New ADODB.Recordset
    Dim strCnxn As String
    Dim strSQLAuthors As String

    Dim strTitle As String

    ' Open connection
    Set Cnxn = New ADODB.Connection
    strCnxn = "Provider='sqloledb';Data Source='MySqlServer';" & _
        "Initial Catalog='Pubs';Integrated Security='SSPI';"
    Cnxn.Open strCnxn

    ' open client-side recordset to enable sort method
    Set rstAuthors = New ADODB.Recordset
    rstAuthors.CursorLocation = adUseClient
    strSQLAuthors = "SELECT * FROM Authors"
    rstAuthors.Open strSQLAuthors, Cnxn, adOpenStatic, adLockReadOnly, adCmdText

     ' sort the recordset last name ascending
    rstAuthors.Sort = "au_lname ASC, au_fname ASC"
     ' show output
    Debug.Print "Last Name Ascending:"
    Debug.Print "First Name  Last Name" & vbCr

    rstAuthors.MoveFirst
    Do Until rstAuthors.EOF
        Debug.Print rstAuthors!au_fname & " " & rstAuthors!au_lname
        rstAuthors.MoveNext
    Loop

     ' sort the recordset last name descending
    rstAuthors.Sort = "au_lname DESC, au_fname ASC"
     ' show output
    Debug.Print "Last Name Descending"
    Debug.Print "First Name  Last Name" & vbCr

    Do Until rstAuthors.EOF
        Debug.Print rstAuthors!au_fname & " " & rstAuthors!au_lname
        rstAuthors.MoveNext
    Loop

    ' clean up
    rstAuthors.Close
    Cnxn.Close
    Set rstAuthors = Nothing
    Set Cnxn = Nothing
    Exit Sub

ErrorHandler:
    ' clean up
    If Not rstAuthors Is Nothing Then
        If rstAuthors.State = adStateOpen Then rstAuthors.Close
    End If
    Set rstAuthors = Nothing

    If Not Cnxn Is Nothing Then
        If Cnxn.State = adStateOpen Then Cnxn.Close
    End If
    Set Cnxn = Nothing

    If Err <> 0 Then
        MsgBox Err.Source & "-->" & Err.Description, , "Error"
    End If
End Sub
'EndSortVB

C'est la routine d'utilitaire secondaire qui imprime le titre donné et le contenu de l'objet Recordset spécifié.

Attribute VB_Name = "Sort"

Recordset, objet | Sort, propriété


Exemple de propriété Source (VB)

Cet exemple illustre l'utilisation de la propriété Source en ouvrant trois objets Recordset basés sur des sources de données différentes.

'BeginSourceVB

    'To integrate this code
    'replace the data source and initial catalog values
    'in the connection string

Public Sub Main()
    On Error GoTo ErrorHandler

    Dim Cnxn 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 strCnxn As String
    Dim strSQL As String

    ' Open a connection
    Set Cnxn = New ADODB.Connection
    strCnxn = "Provider='sqloledb';Data Source='MySqlServer';" & _
        "Initial Catalog='Pubs';Integrated Security='SSPI';"
    Cnxn.Open strCnxn

    ' Open a recordset based on a command object
    Set cmdSQL = New ADODB.Command
    Set cmdSQL.ActiveConnection = Cnxn
    strSQL = "Select title, type, pubdate FROM Titles ORDER BY title"
    cmdSQL.CommandText = strSQL
    Set rstTitles = cmdSQL.Execute()

    ' Open a recordset based on a table
    Set rstPublishers = New ADODB.Recordset
    strSQL = "Publishers"
    rstPublishers.Open strSQL, Cnxn, adOpenStatic, adLockReadOnly, adCmdTable
    'rstPublishers.Open strSQL, Cnxn, , , adCmdTable
     ' the above two lines of code are identical

    ' Open a recordset based on a table
    Set rstPublishersDirect = New ADODB.Recordset
    rstPublishersDirect.Open strSQL, strCnxn, , , adCmdTableDirect

    ' Open a recordset based on an SQL string.
    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, strCnxn, , , adCmdText

    ' Use the Source property to display the source of each recordset.
    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

    ' clean up
    rstTitles.Close
    rstPublishers.Close
    rstTitlesPublishers.Close
    Cnxn.Close
    Set rstTitles = Nothing
    Set rstPublishers = Nothing
    Set rstTitlesPublishers = Nothing
    Set Cnxn = Nothing
    Exit Sub

ErrorHandler:
    ' clean up
    If Not rstTitles Is Nothing Then
        If rstTitles.State = adStateOpen Then rstTitles.Close
    End If
    Set rstTitles = Nothing

    If Not rstPublishers Is Nothing Then
        If rstPublishers.State = adStateOpen Then rstPublishers.Close
    End If
    Set rstPublishers = Nothing

    If Not rstTitlesPublishers Is Nothing Then
        If rstTitlesPublishers.State = adStateOpen Then rstTitlesPublishers.Close
    End If
    Set rstTitlesPublishers = Nothing

    If Not Cnxn Is Nothing Then
        If Cnxn.State = adStateOpen Then Cnxn.Close
    End If
    Set Cnxn = Nothing

    If Err <> 0 Then
        MsgBox Err.Source & "-->" & Err.Description, , "Error"
    End If
End Sub
'EndSourceVB

Voir aussi

Recordset, objet | Source, propriété (Recordset ADO)


Exemple de propriété State (VB)

Cet exemple utilise la propriété State pour afficher un message lors de l'ouverture de connexions asynchrones et de l'exécution de commandes asynchrones.

'BeginStateVB

    'To integrate this code
    'replace the data source and initial catalog values
    'in the connection string

Public Sub Main()
    On Error GoTo ErrorHandler

    Dim Cnxn1 As ADODB.Connection
    Dim Cnxn2 As ADODB.Connection
    Dim cmdChange As ADODB.Command
    Dim cmdRestore As ADODB.Command
    Dim strCnxn As String
    Dim strSQL As String

    ' Open two asynchronous connections, displaying
    ' a message while connecting
    Set Cnxn1 = New ADODB.Connection
    Set Cnxn2 = New ADODB.Connection
    strCnxn = "Provider='sqloledb';Data Source='MySqlServer';" & _
        "Initial Catalog='Pubs';Integrated Security='SSPI';"

    Cnxn1.Open strCnxn, , , adAsyncConnect
    Do Until Cnxn1.State <> adStateConnecting
       Debug.Print "Opening first connection...."
    Loop

    Cnxn2.Open strCnxn, , , adAsyncConnect
    Do Until Cnxn2.State <> adStateConnecting
       Debug.Print "Opening second connection...."
    Loop

    ' Create two command objects
    Set cmdChange = New ADODB.Command
    cmdChange.ActiveConnection = Cnxn1
    strSQL = "UPDATE Titles SET type = 'self_help' WHERE type = 'psychology'"
    cmdChange.CommandText = strSQL

    Set cmdRestore = New ADODB.Command
    cmdRestore.ActiveConnection = Cnxn2
    strSQL = "UPDATE Titles SET type = 'psychology' WHERE type = 'self_help'"
    cmdRestore.CommandText = strSQL

    ' Executing the commands, displaying a message
    ' while they are executing
    cmdChange.Execute , , adAsyncExecute
    Do Until cmdChange.State <> adStateExecuting
       Debug.Print "Change command executing...."
    Loop

    cmdRestore.Execute , , adAsyncExecute
    Do Until cmdRestore.State <> adStateExecuting
       Debug.Print "Restore command executing...."
    Loop

    ' clean up
    Cnxn1.Close
    Cnxn2.Close
    Set Cnxn1 = Nothing
    Set Cnxn2 = Nothing
    Exit Sub

ErrorHandler:
    ' clean up
    If Not Cnxn1 Is Nothing Then
        If Cnxn1.State = adStateOpen Then Cnxn1.Close
    End If
    Set Cnxn1 = Nothing

    If Not Cnxn2 Is Nothing Then
        If Cnxn2.State = adStateOpen Then Cnxn2.Close
    End If
    Set Cnxn2 = Nothing

    If Err <> 0 Then
        MsgBox Err.Source & "-->" & Err.Description, , "Error"
    End If
End Sub
'EndStateVB

Recordset, objet | State, propriété


Exemple de propriété Status (Field) (VB)

L'exemple suivant ouvre un document à partir d'un dossier accessible en lecture/écriture à l'aide de Microsoft OLE DB Provider pour Internet Publishing. La propriété Status d'un objet Field de l'objet Record sera d'abord définie sur adFieldPendingInsert, puis mise à jour vers adFieldOk.

'BeginStatusFieldVB

 ' to integrate this code replace the values in the source string

Sub Main()

   Dim File As ADODB.Record
   Dim strFile As String
   Dim Cnxn As ADODB.Connection
   Dim strCnxn As String

   Set Cnxn = New ADODB.Connection
   strCnxn = "url=http://MyServer/"
   Cnxn.Open strCnxn

   Set File = New ADODB.Record
   strFile = "Folder/FileName"
   ' Open a read/write document
   File.Source = strFile
   File.ActiveConnection = Cnxn
   File.Mode = adModeReadWrite
   File.Open

   Debug.Print "Append a couple of fields"

   File.Fields.Append "chektest:fld1", adWChar, 42, adFldUpdatable, "fld1"
   File.Fields.Append "chektest:fld2", adWChar, 42, adFldUpdatable, "fld2"

   Debug.Print "status for the fields"
   Debug.Print File.Fields("chektest:fld1").Status 'adfldpendinginsert
   Debug.Print File.Fields("chektest:fld2").Status 'adfldpendinginsert

    'turn off error-handling to verify field status
   On Error Resume Next

   File.Fields.Update

   Debug.Print "Update succeeds"
   Debug.Print File.Fields("chektest:fld1").Status 'adfldpendinginsert + adFieldUnavailable
   Debug.Print File.Fields("chektest:fld2").Status 'adfldpendinginsert + adFieldUnavailable

    ' resume default error-handling
   On Error GoTo 0

     ' clean up
    File.Close
    Cnxn.Close
    Set File = Nothing
    Set Cnxn = Nothing

End Sub
'EndStatusFieldVB

L'exemple ci-dessous supprime un objet Field connu d'un objet Record ouvert depuis un document. La propriété Status sera d'abord définie sur adFieldOK, puis sur adFieldPendingUnknown.

'BeginStatusField2VB

' to integrate this code replace the values in the source string

Sub Main()

   Dim File As ADODB.Record
   Dim fld As ADODB.Field
   Dim strFile As String

   Dim Cnxn As ADODB.Connection
   Dim strCnxn As String

    ' create connection as a URL
   Set Cnxn = New ADODB.Connection
   strCnxn = "url=http://MyServer/"
   Cnxn.Open strCnxn
   Set File = New ADODB.Record
   strFile = "Folder/FileName"
   ' Open a read/write document
   File.Open strFile, Cnxn, adModeReadWrite
   Debug.Print File.Fields("chektest:fld1").Status ' should be adFldOK

   ' Delete a field which already exists in the collection
   File.Fields.Delete "chektest:fld1"
   Set fld = File.Fields("chektest:fld1")
   Debug.Print File.Fields("chektest:fld1").Status   ' Pending delete

    'turn off error-handling to verify field status
   On Error Resume Next

   File.Fields.Update

   Debug.Print "Deleted"
   Debug.Print fld.Status   ' Pending unknown

    ' resume default error-handling
   On Error GoTo 0

     ' clean up
    File.Close
    Cnxn.Close
    Set File = Nothing
    Set Cnxn = Nothing

End Sub
'EndStatusField2VB

Le code ci-dessous supprime un objet Field connu à partir d'un objet Record ouvert depuis un document en lecture seule. La propriété Status aura comme valeur adFieldPendingDelete. Lors de l'appel de la méthode Update, l'opération de suppression échouera et la propriété Status correspondra à adFieldPendingDelete plus adFieldPermissionDenied. CancelUpdate efface le paramètre Status en attente.

Sub Main()
   Dim File As ADODB.Record
   Dim fld As ADODB.Field
   Dim Cnxn As ADODB.Connection
   Dim strCnxn As String
   Dim strFile As String

    ' create connection as a URL
   Set Cnxn = New ADODB.Connection
   strCnxn = "url=http://MyServer/"
   Cnxn.Open strCnxn

   ' Open a read/write document
   Set File = New ADODB.Record
   strFile = "Folder/FileName"
   File.Open strFile, Cnxn, adModeReadWrite, adCreateCollection Or adOpenIfExists

   Debug.Print "Try to delete something without permission"
   File.Fields.Delete ("RESOURCE_PARSENAME")
   Set fld = File.Fields("RESOURCE_PARSENAME")

   Debug.Print "Pending delete"
   Debug.Print fld.Status   ' Pending delete
   Debug.Print "Delete should fail on Update"

    'turn off error-handling to verify field status
   On Error Resume Next

   File.Fields.Update   ' Should fail

   Debug.Print fld.Status   ' Pending delete plus error
   File.Fields.CancelUpdate
   Debug.Print fld.Status   ' Okay

    ' resume default error-handling
   On Error GoTo 0

     ' clean up
    File.Close
    Cnxn.Close
    Set File = Nothing
    Set Cnxn = Nothing

End Sub
'EndStatusField3VB

Voir aussi

Field, objet | Record, objet | Status, propriété (Field ADO)


Exemple de propriété Status (Recordset) (VB)

Cet exemple utilise la propriété Status pour afficher les enregistrements modifiés durant une opération globale avant une mise à jour par lots.

'BeginStatusRecordsetVB
Public Sub Main()
    On Error GoTo ErrorHandler

    'To integrate this code
    'replace the data source and initial catalog values
    'in the connection string

    ' connection and recordset variables
    Dim rstTitles As ADODB.Recordset
    Dim Cnxn As ADODB.Connection
    Dim strCnxn As String
    Dim strSQLTitles As String

     ' open connection
    Set Cnxn = New ADODB.Connection
    strCnxn = "Provider='sqloledb';Data Source='MySqlServer';" & _
        "Initial Catalog='Pubs';Integrated Security='SSPI';"
    Cnxn.Open strCnxn

     ' open recordset for batch update
    Set rstTitles = New ADODB.Recordset
    strSQLTitles = "Titles"
    rstTitles.Open strSQLTitles, Cnxn, adOpenKeyset, adLockBatchOptimistic, adCmdTable

    ' change the type of psychology titles
    Do Until rstTitles.EOF
        If Trim(rstTitles!Type) = "psychology" Then rstTitles!Type = "self_help"
        rstTitles.MoveNext
    Loop

    ' display Title ID and status
    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

    ' clean up
    rstTitles.Close
    Cnxn.Close
    Set rstTitles = Nothing
    Set Cnxn = Nothing
    Exit Sub

ErrorHandler:
    ' clean up
    If Not rstTitles Is Nothing Then
        If rstTitles.State = adStateOpen Then
            ' Cancel the update because this is a demonstration
            rstTitles.CancelBatch
            rstTitles.Close
        End If
    End If
    Set rstTitles = Nothing

    If Not Cnxn Is Nothing Then
        If Cnxn.State = adStateOpen Then Cnxn.Close
    End If
    Set Cnxn = Nothing

    If Err <> 0 Then
        MsgBox Err.Source & "-->" & Err.Description, , "Error"
    End If
End Sub
'EndStatusRecordsetVB

Voir aussi

Status, propriété (Recordset ADO)


Exemple de propriété StayInSync (VB)

Cet exemple montre comment la propriété StayInSync facilite l'accès aux lignes dans un objet Recordset hiérarchique.

La boucle extérieure affiche le prénom et le nom de chaque auteur, son département et son identification. L'objet Recordset intégré pour chaque ligne est extrait de la collection Fields pour être automatiquement attribué à rstTitleAuthor par la propriété StayInSync, chaque fois que l'objet Recordset parent est déplacé vers une nouvelle ligne. La boucle intérieure affiche quatre champs provenant de chaque ligne du jeu d'enregistrements ajouté.

'BeginStayInSyncVB
Public Sub Main()
    On Error GoTo ErrorHandler

    'To integrate this code create a DSN called Pubs
    'with a user_id = sa and no password

    Dim Cnxn As ADODB.Connection
    Dim rst As ADODB.Recordset
    Dim rstTitleAuthor As New ADODB.Recordset
    Dim strCnxn As String

        ' open connection with Data Shape attributes
    Set Cnxn = New ADODB.Connection
    strCnxn = "Provider=MSDataShape;Data Provider='sqloledb';Data Source='MySqlServer';" & _
        "Initial Catalog='Pubs';Integrated Security='SSPI';"
    Cnxn.Open strCnxn

        ' create recordset
    Set rst = New ADODB.Recordset
    rst.StayInSync = True
    rst.Open "SHAPE {select * from Authors} " & _
                   "APPEND ( { select * from titleauthor} AS chapTitleAuthor " & _
                   "RELATE au_id TO au_id) ", Cnxn, , , adCmdText

    Set rstTitleAuthor = rst("chapTitleAuthor").Value
    Do Until rst.EOF
        Debug.Print rst!au_fname & " " & rst!au_lname & " " & _
                   rst!State & " " & rst!au_id

        Do Until rstTitleAuthor.EOF
            Debug.Print rstTitleAuthor(0) & " " & rstTitleAuthor(1) & " " & _
                   rstTitleAuthor(2) & " " & rstTitleAuthor(3)
            rstTitleAuthor.MoveNext
        Loop

        rst.MoveNext
    Loop

    ' clean up
    rst.Close
    Cnxn.Close
    Set rst = Nothing
    Set Cnxn = Nothing
    Exit Sub

ErrorHandler:
    ' clean up
    If Not rst Is Nothing Then
        If rst.State = adStateOpen Then rst.Close
    End If
    Set rst = Nothing

    If Not Cnxn Is Nothing Then
        If Cnxn.State = adStateOpen Then Cnxn.Close
    End If
    Set Cnxn = Nothing

    If Err <> 0 Then
        MsgBox Err.Source & "-->" & Err.Description, , "Error"
    End If
End Sub
'EndStayInSyncVB

Voir aussi

Fields, collection | Recordset, objet | StayInSync, propriété


Exemple de méthode Supports (VB)

L'exemple ci-dessous utilise la méthode Supports pour afficher les options gérées par un jeu d'enregistrements ouvert avec différents types de curseur. La procédure DisplaySupport est nécessaire à l'exécution de cet exemple.

'BeginSupportsVB

    'To integrate this code
    'replace the data source and initial catalog values
    'in the connection string

Public Sub Main()
    On Error GoTo ErrorHandler

    ' recordset and connection variables
    Dim rstTitles As ADODB.Recordset
    Dim Cnxn As ADODB.Connection
    Dim strCnxn As String
    Dim strSQLTitles As String
     ' array variables
    Dim arrCursorType(4) As Integer
    Dim intIndex As Integer

    ' open connection
    Set Cnxn = New ADODB.Connection
    strCnxn = "Provider='sqloledb';Data Source='MySqlServer';" & _
        "Initial Catalog='Pubs';Integrated Security='SSPI';"
    Cnxn.Open strCnxn

    ' Fill array with CursorType constants
    arrCursorType(0) = adOpenForwardOnly
    arrCursorType(1) = adOpenKeyset
    arrCursorType(2) = adOpenDynamic
    arrCursorType(3) = adOpenStatic

    ' open recordset using each CursorType and optimistic locking
    For intIndex = 0 To 3
        Set rstTitles = New ADODB.Recordset
        rstTitles.CursorType = arrCursorType(intIndex)
        rstTitles.LockType = adLockOptimistic

        strSQLTitles = "Titles"
        rstTitles.Open strSQLTitles, Cnxn, , , adCmdTable

        Select Case arrCursorType(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

        ' call the DisplaySupport procedure from below
        ' to display the supported options
        DisplaySupport rstTitles

    Next intIndex

    ' clean up
    rstTitles.Close
    Cnxn.Close
    Set rstTitles = Nothing
    Set Cnxn = Nothing
    Exit Sub

ErrorHandler:
    ' clean up
    If Not rstTitles Is Nothing Then
        If rstTitles.State = adStateOpen Then rstTitles.Close
    End If
    Set rstTitles = Nothing

    If Not Cnxn Is Nothing Then
        If Cnxn.State = adStateOpen Then Cnxn.Close
    End If
    Set Cnxn = Nothing

    If Err <> 0 Then
        MsgBox Err.Source & "-->" & Err.Description, , "Error"
    End If
End Sub
'EndSupportsVB

'BeginSupports2VB
Public Sub DisplaySupport(rstTemp As ADODB.Recordset)

   Dim arrConstants(11) As Long
   Dim blnSupports As Boolean
   Dim intIndex As Integer

   ' Fill array with cursor option constants
   arrConstants(0) = adAddNew
   arrConstants(1) = adApproxPosition
   arrConstants(2) = adBookmark
   arrConstants(3) = adDelete
   arrConstants(4) = adFind
   arrConstants(5) = adHoldRecords
   arrConstants(6) = adMovePrevious
   arrConstants(7) = adNotify
   arrConstants(8) = adResync
   arrConstants(9) = adUpdate
   arrConstants(10) = adUpdateBatch

   For intIndex = 0 To 10
      blnSupports = _
         rstTemp.Supports(arrConstants(intIndex))
      If blnSupports Then
         Select Case arrConstants(intIndex)
            Case adAddNew
               Debug.Print "   AddNew"
            Case adApproxPosition
               Debug.Print "   AbsolutePosition and AbsolutePage"
            Case adBookmark
               Debug.Print "   blnkmark"
            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
'EndSupports2VB

Recordset, objet | Supports, méthode


Exemple de propriété Type (Field) (VB)

Cet exemple montre comment la propriété Type est utilisée pour afficher le nom de la constante qui correspond à la valeur de la propriété Type de tous les objets Field de la table Employees. L'exécution de cette procédure requiert la fonction FieldType.

'BeginTypeFieldVB
Public Sub Main()
    On Error GoTo ErrorHandler

    'To integrate this code
    'replace the data source and initial catalog values
    'in the connection string

    Dim Cnxn As ADODB.Connection
    Dim rstEmployees As ADODB.Recordset
    Dim fld As ADODB.Field
    Dim strCnxn As String
    Dim strSQLEmployee As String
    Dim FieldType As String

    ' Open connection
    Set Cnxn = New ADODB.Connection
    strCnxn = "Provider='sqloledb';Data Source='MySqlServer';" & _
        "Initial Catalog='Pubs';Integrated Security='SSPI';"
    Cnxn.Open strCnxn

    ' Open recordset with data from Employees table
    Set rstEmployees = New ADODB.Recordset
    strSQLEmployee = "employee"
    rstEmployees.Open strSQLEmployee, Cnxn, , , adCmdTable
    'rstEmployees.Open strSQLEmployee, Cnxn, adOpenStatic, adLockReadOnly, adCmdTable
     ' the above two lines of code are identical

    Debug.Print "Fields in Employees Table:" & vbCr

    ' Enumerate Fields collection of Employees table
    For Each fld In rstEmployees.Fields
        ' translate field-type code to text
        Select Case fld.Type
            Case adChar
               FieldType = "adChar"
            Case adVarChar
               FieldType = "adVarChar"
            Case adSmallInt
               FieldType = "adSmallInt"
            Case adUnsignedTinyInt
               FieldType = "adUnsignedTinyInt"
            Case adDBTimeStamp
               FieldType = "adDBTimeStamp"
        End Select
        ' show results
        Debug.Print "  Name: " & fld.Name & vbCr & _
          "  Type: " & FieldType & vbCr
    Next fld

    ' clean up
    rstEmployees.Close
    Cnxn.Close
    Set rstEmployees = Nothing
    Set Cnxn = Nothing
    Exit Sub

ErrorHandler:
    ' clean up
    If Not rstEmployees Is Nothing Then
        If rstEmployees.State = adStateOpen Then rstEmployees.Close
    End If
    Set rstEmployees = Nothing

    If Not Cnxn Is Nothing Then
        If Cnxn.State = adStateOpen Then Cnxn.Close
    End If
    Set Cnxn = Nothing

    Set fld = Nothing

    If Err <> 0 Then
        MsgBox Err.Source & "-->" & Err.Description, , "Error"
    End If
End Sub
'EndTypeFieldVB

Field, objet | Type, propriété


Exemple de propriété Type (Property) (VB)

Cet exemple illustre l'utilisation de la propriété Type. Il s'agit d'un modèle d'utilitaire pour le listage des noms et des types d'une collection, comme Properties, Fields, etc.

Il n'est pas nécessaire d'ouvrir l'objet Recordset pour accéder à la collection Properties ; les propriétés apparaissent lorsque l'objet Recordset est instancié. Cependant, l'affectation de la propriété CursorLocation à adUseClient ajoute plusieurs propriétés dynamiques à la collection Properties de l'objet Recordset, rendant cet exemple un peu plus intéressant. À des fins d'illustration, nous utilisons explicitement la propriété Item pour accéder à chaque objet Property.

'BeginTypePropertyVB
Public Sub Main()
    On Error GoTo ErrorHandler

     ' recordset variables
    Dim rst As ADODB.Recordset
    Dim prop As ADODB.Property
     ' property variables
    Dim ix As Integer
    Dim strMsg As String

     ' create client-side recordset
    Set rst = New ADODB.Recordset
    rst.CursorLocation = adUseClient
     ' enumerate property types
    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
            'show results
        Debug.Print "Property " & ix & ": " & prop.Name & _
                    ", Type = " & strMsg
    Next ix

    ' clean up
    Set rst = Nothing
    Exit Sub

ErrorHandler:
    ' clean up
    Set rst = Nothing

    If Err <> 0 Then
        MsgBox Err.Source & "-->" & Err.Description, , "Error"
    End If

End Sub
'EndTypePropertyVB

Property, objet | Type, propriété


Exemple de méthodes Update et CancelUpdate (VB)

Cette exemple illustre l'utilisation combinée des méthodes Update et CancelUpdate.

'BeginUpdateVB
Public Sub Main()
    On Error GoTo ErrorHandler

    'To integrate this code
    'replace the data source and initial catalog values
    'in the connection string

    ' recordset and connection variables
    Dim rstEmployees As ADODB.Recordset
    Dim Cnxn As ADODB.Connection
    Dim strCnxn As String
    Dim strSQLEmployees As String
     ' buffer variables
    Dim strOldFirst As String
    Dim strOldLast As String
    Dim strMessage As String

    ' Open connection
    Set Cnxn = New ADODB.Connection
    strCnxn = "Provider='sqloledb';Data Source='MySqlServer';" & _
        "Initial Catalog='Pubs';Integrated Security='SSPI';"
    Cnxn.Open strCnxn

    ' Open recordset to enable changes
    Set rstEmployees = New ADODB.Recordset
    strSQLEmployees = "SELECT fname, lname FROM Employee ORDER BY lname"
    rstEmployees.Open strSQLEmployees, Cnxn, adOpenKeyset, adLockOptimistic, adCmdText

    ' Store original data
    strOldFirst = rstEmployees!fname
    strOldLast = rstEmployees!lname
    ' Change data in edit buffer
    rstEmployees!fname = "Linda"
    rstEmployees!lname = "Kobara"

    ' Show contents of buffer and get user input
    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

    ' show the resulting data
    MsgBox "Data in recordset = " & rstEmployees!fname & " " & _
       rstEmployees!lname

    ' restore original data because this is a demonstration
    If Not (strOldFirst = rstEmployees!fname And _
           strOldLast = rstEmployees!lname) Then
        rstEmployees!fname = strOldFirst
        rstEmployees!lname = strOldLast
        rstEmployees.Update
    End If

    ' clean up
    rstEmployees.Close
    Cnxn.Close
    Set rstEmployees = Nothing
    Set Cnxn = Nothing
    Exit Sub

ErrorHandler:
    ' clean up
    If Not rstEmployees Is Nothing Then
        If rstEmployees.State = adStateOpen Then rstEmployees.Close
    End If
    Set rstEmployees = Nothing

    If Not Cnxn Is Nothing Then
        If Cnxn.State = adStateOpen Then Cnxn.Close
    End If
    Set Cnxn = Nothing

    If Err <> 0 Then
        MsgBox Err.Source & "-->" & Err.Description, , "Error"
    End If
End Sub
' EndUpdateVB

Cette exemple illustre l'utilisation combinée des méthodes Update et AddNew.

' BeginUpdate2VB
Public Sub Main()
    On Error GoTo ErrorHandler

    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
    Dim strCnn As String

    ' Open a connection.
    Set cnn1 = New ADODB.Connection
       strCnn = "Provider=sqloledb;" & _
       "Data Source=MySqlServer;Initial Catalog=Pubs;Integrated Security=SSPI; "
    cnn1.Open strCnn

    ' Open recordset with data from Employees table.
    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"

    ' Show contents of buffer and get user input.
    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
        ' Go to the new record and show the resulting data.
        MsgBox "Data in recordset = " & rstEmployees!emp_id & ", " & _
            rstEmployees!fname & " " & rstEmployees!lname
    Else
        rstEmployees.CancelUpdate
        MsgBox "No new record added."
    End If

    ' Delete new data because this is a demonstration.
    cnn1.Execute "DELETE FROM employee WHERE emp_id = '" & strEmpID & "'"

    ' clean up
    rstEmployees.Close
    cnn1.Close
    Set rstEmployees = Nothing
    Set cnn1 = Nothing
    Exit Sub

ErrorHandler:
    ' clean up
    If Not rstEmployees Is Nothing Then
        If rstEmployees.State = adStateOpen Then rstEmployees.Close
    End If
    Set rstEmployees = Nothing

    If Not cnn1 Is Nothing Then
        If cnn1.State = adStateOpen Then cnn1.Close
    End If
    Set cnn1 = Nothing

    If Err <> 0 Then
        MsgBox Err.Source & "-->" & Err.Description, , "Error"
    End If
End Sub
'EndUpdate2VB

CancelUpdate, méthode | Recordset, objet | Update, méthode


Exemple de méthodes UpdateBatch et CancelBatch (VB)

Cet exemple illustre l'utilisation combinée des méthodes UpdateBatch et CancelBatch.

'BeginUpdateBatchVB
Public Sub Main()
    On Error GoTo ErrorHandler

    'To integrate this code
    'replace the data source and initial catalog values
    'in the connection string

    'connection and recordset variables
    Dim rstTitles As ADODB.Recordset
    Dim Cnxn As ADODB.Connection
    Dim strCnxn As String
    Dim strSQLTitles As String
     'record variables
    Dim strTitle As String
    Dim strMessage As String

    ' Open connection
    Set Cnxn = New ADODB.Connection
    strCnxn = "Provider='sqloledb';Data Source='MySqlServer';" & _
        "Initial Catalog='Pubs';Integrated Security='SSPI';"
    Cnxn.Open strCnxn

     ' open recordset for batch uodate
    Set rstTitles = New ADODB.Recordset
    strSQLTitles = "titles"
    rstTitles.Open strSQLTitles, Cnxn, adOpenKeyset, adLockBatchOptimistic, adCmdTable

    rstTitles.MoveFirst
    ' Loop through recordset and ask user if she wants
    ' to change the type for a specified title.
    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

    ' Ask the user if she wants to commit to all the
    ' changes made above.
    If MsgBox("Save all changes?", vbYesNo) = vbYes Then
        rstTitles.UpdateBatch
    Else
        rstTitles.CancelBatch
    End If

    ' Print current data in recordset.
    rstTitles.Requery
    rstTitles.MoveFirst
    Do While Not rstTitles.EOF
        Debug.Print rstTitles!Title & " - " & rstTitles!Type
        rstTitles.MoveNext
    Loop

    ' Restore original values because this is a demonstration.
    rstTitles.MoveFirst
    Do Until rstTitles.EOF
        If Trim(rstTitles!Type) = "self_help" Then
            rstTitles!Type = "psychology"
        End If
        rstTitles.MoveNext
    Loop
    rstTitles.UpdateBatch

    ' clean up
    rstTitles.Close
    Cnxn.Close
    Set rstTitles = Nothing
    Set Cnxn = Nothing
    Exit Sub

ErrorHandler:
    ' clean up
    If Not rstTitles Is Nothing Then
        If rstTitles.State = adStateOpen Then rstTitles.Close
    End If
    Set rstTitles = Nothing

    If Not Cnxn Is Nothing Then
        If Cnxn.State = adStateOpen Then Cnxn.Close
    End If
    Set Cnxn = Nothing

    If Err <> 0 Then
        MsgBox Err.Source & "-->" & Err.Description, , "Error"
    End If
End Sub
'EndUpdateBatchVB

CancelBatch, méthode | UpdateBatch, méthode


Exemple de propriété Value (VB)

Cet exemple illustre l'utilisation de la propriété Value avec les objets Field et Property pour afficher les valeurs champ et propriété du tableau Employees.

'BeginValueVB
Public Sub Main()
    On Error GoTo ErrorHandler

    'To integrate this code
    'replace the data source and initial catalog values
    'in the connection string

    ' connection and recordset variables
    Dim rstEmployees As ADODB.Recordset
    Dim Cnxn As ADODB.Connection
    Dim strCnxn As String
    Dim strSQLEmployees As String
     ' field property variables
    Dim fld As ADODB.Field
    Dim prp As ADODB.Property

     ' Open connection
    Set Cnxn = New ADODB.Connection
    strCnxn = "Provider='sqloledb';Data Source='MySqlServer';" & _
        "Initial Catalog='Pubs';Integrated Security='SSPI';"
    Cnxn.Open strCnxn

    ' Open recordset with data from Employees table
    Set rstEmployees = New ADODB.Recordset
    strSQLEmployees = "employee"
    rstEmployees.Open strSQLEmployees, Cnxn, , , adCmdTable
    'rstEmployees.Open strSQLEmployees, Cnxn, adOpenStatic, adLockReadOnly, adCmdTable
    ' the above two lines of code are identical

    Debug.Print "Field values in rstEmployees"

    ' Enumerate the Fields collection of the Employees table
    For Each fld In rstEmployees.Fields
        ' Because Value is the default property of a
        ' Field object, the use of the actual keyword
        ' here is optional.
        Debug.Print "   " & fld.Name & " = " & fld.Value
    Next fld

    Debug.Print "Property values in rstEmployees"

    ' Enumerate the Properties collection of the Recordset object
    For Each prp In rstEmployees.Properties
        Debug.Print "   " & prp.Name & " = " & prp.Value
        ' because Value is the default property of a Property object
        ' use of the actual Value keyword is optional
    Next prp

    ' clean up
    rstEmployees.Close
    Cnxn.Close
    Set rstEmployees = Nothing
    Set Cnxn = Nothing
    Exit Sub

ErrorHandler:
    ' clean up
    If Not rstEmployees Is Nothing Then
        If rstEmployees.State = adStateOpen Then rstEmployees.Close
    End If
    Set rstEmployees = Nothing

    If Not Cnxn Is Nothing Then
        If Cnxn.State = adStateOpen Then Cnxn.Close
    End If
    Set Cnxn = Nothing

    If Err <> 0 Then
        MsgBox Err.Source & "-->" & Err.Description, , "Error"
    End If
End Sub
'EndValueVB

Field, objet | Property, objet | Value, propriété


Exemple de propriété Version (VB)

Cet exemple utilise la propriété Version d'un objet Connection pour afficher le numéro de la version ADO utilisée. Il emploie également plusieurs propriétés dynamiques pour afficher :

  • le nom et la version du système de gestion de base de données (SGBD) ;
  • la version OLE DB ;
  • le nom et la version du fournisseur ;
  • la version ODBC ;
  • le nom et la version du gestionnaire ODBC.
'BeginVersionVB
Public Sub Main()
    On Error GoTo ErrorHandler

    Dim Cnxn As ADODB.Connection
    Dim strCnxn As String
    Dim strVersionInfo As String

    ' Open connection
    Set Cnxn = New ADODB.Connection
    strCnxn = "Provider='sqloledb';Data Source='MySqlServer';" & _
        "Initial Catalog='Pubs';Integrated Security='SSPI';"
    Cnxn.Open strCnxn

    strVersionInfo = "ADO Version: " & Cnxn.Version & vbCr
    strVersionInfo = strVersionInfo & "DBMS Name: " & Cnxn.Properties("DBMS Name") & vbCr
    strVersionInfo = strVersionInfo & "DBMS Version: " & Cnxn.Properties("DBMS Version") & vbCr
    strVersionInfo = strVersionInfo & "OLE DB Version: " & Cnxn.Properties("OLE DB Version") & vbCr
    strVersionInfo = strVersionInfo & "Provider Name: " & Cnxn.Properties("Provider Name") & vbCr
    strVersionInfo = strVersionInfo & "Provider Version: " & Cnxn.Properties("Provider Version") & vbCr

    MsgBox strVersionInfo

    ' clean up
    Cnxn.Close
    Set Cnxn = Nothing
    Exit Sub

ErrorHandler:
    ' clean up
    If Not Cnxn Is Nothing Then
        If Cnxn.State = adStateOpen Then Cnxn.Close
    End If
    Set Cnxn = Nothing

    If Err <> 0 Then
        MsgBox Err.Source & "-->" & Err.Description, , "Error"
    End If
End Sub
'EndVersionVB

Connection, objet | Version, propriété


Exemples de code ADO en Microsoft Visual Basic Scripting Edition

Utilisez les exemples de code ci-dessous pour apprendre à utiliser les méthodes ADO lorsque vous programmez en Visual Basic Scripting Edition (VBScript).

Remarque Collez l'exemple de code dans sa totalité, du début à la fin, dans votre éditeur de code. L'exemple risque de ne pas fonctionner correctement si des copies partielles d'exemple sont utilisées ou si la mise en forme des paragraphes est perdue.

Méthodes

  • Exemple de méthode AddNew
  • Exemple de méthode Clone
  • Exemple de méthode Delete
  • Exemple de méthodes Execute, Requery et Clear
  • Exemple de méthode Move
  • Exemple de méthodes MoveFirst, MoveLast, MoveNext et MovePrevious
  • Exemple de méthodes Open et Close

Voir aussi

Exemples de code ADO en Microsoft Visual Basic | Exemples de code ADO en Microsoft Visual C++ | Exemples de code ADO en Microsoft Visual J++


Exemple de méthode AddNew (VBScript)

Cet exemple utilise la méthode AddNew pour créer un enregistrement portant le nom indiqué.

Utilisez l'exemple suivant dans une page ASP (Active Server Page). Utilisez Find pour localiser le fichier Adovbs.inc et le placer dans votre répertoire de travail. Coupez et collez le code suivant dans le Bloc-notes ou un autre éditeur de texte, puis enregistrez-le sous AddNewVBS.asp. Pour afficher le résultat, vous pouvez recourir à n'importe quel navigateur client.

Pour tester cet exemple, ajoutez un nouvel enregistrement au format HTML. Cliquez sur Ajouter un nouveau. Pour supprimer les enregistrements indésirables, consultez la rubrique Exemple de méthode Delete.

<!-- BeginAddNewVBS -->
<%@Language = VBScript %>
<%' use this meta tag instead of adovbs.inc%>
<!--METADATA TYPE="typelib" uuid="00000205-0000-0010-8000-00AA006D2EA4" -->
<HTML>
<HEAD>
    <TITLE>ADO AddNew Method (VBScript)</TITLE>
    <STYLE>
    <!--
    body {
       font-family: 'Verdana','Arial','Helvetica',sans-serif;
       BACKGROUND-COLOR:white;
       COLOR:black;
        }
    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>

<H1>ADO AddNew Method (VBScript)</H1>

<% ' to integrate/test this code replace the
   ' Data Source value in the Connection string%>
<%
    ' connection and recordset variables
    Dim Cnxn, strCnxn
    Dim rsCustomers, strSQLCustomers
    Dim fld, Err

    ' open connection
    Set Cnxn = Server.CreateObject("ADODB.Connection")
    strCnxn = "Provider='sqloledb';Data Source=" & _
            Request.ServerVariables("SERVER_NAME") & ";" & _
            "Integrated Security='SSPI';Initial Catalog='Northwind';"
    Cnxn.Open strCnxn

     ' create and open Recordset using object refs
    Set rsCustomers = Server.CreateObject("ADODB.Recordset")
    strSQLCustomers = "Customers"

    rsCustomers.ActiveConnection = Cnxn
    rsCustomers.CursorLocation = adUseClient
    rsCustomers.CursorType = adOpenKeyset
    rsCustomers.LockType = adLockOptimistic
    rsCustomers.Source = strSQLCustomers
    rsCustomers.Open

    'If this is first time page is open, Form collection
    'will be empty when data is entered. run AddNew method
    If Not IsEmpty(Request.Form) Then
        If Not Request.Form("CompanyName") = "" Then
            rsCustomers.AddNew
                rsCustomers("CustomerID") = Request.Form("CompanyID")
                rsCustomers("CompanyName") = Request.Form("CompanyName")
                rsCustomers("ContactName") = Request.Form("FirstName") & _
                    " " & Request.Form("LastName")
                rsCustomers("Phone") = Request.Form("PhoneNumber")
                rsCustomers("City") = Request.Form("City")
                rsCustomers("Region") = Request.Form("State")
            rsCustomers.Update
             ' check for errors
            If Cnxn.Errors.Count > 0 Then
                For Each Err In Cnxn.Errors
                    Response.Write("Error " & Err.SQLState & ": " & _
                        Err.Description & " | " & Err.NativeError)
                Next
            Cnxn.Errors.Clear
            rsCustomers.CancelUpdate
            End If
            'On Error GoTo 0
        rsCustomers.MoveFirst
        End If
    End If
%>

<TABLE COLSPAN="8" CELLPADDING=5 BORDER=1 ALIGN="center">
<!-- BEGIN column header row for Customer Table-->
    <TR>
        <TH>Customer ID</TH>
        <TH>Company Name</TH>
        <TH>Contact Name</TH>
        <TH>Phone Number</TH>
        <TH>City</TH>
        <TH>State/Province</TH>
        </TR>

    <% ' show the data
        Do Until rsCustomers.EOF
            Response.Write("<TR>")
            Response.Write("<TD>" & rsCustomers("CustomerID") & "</TD>")
            Response.Write("<TD>" & rsCustomers("CompanyName")& "</TD>")
            Response.Write("<TD>" & rsCustomers("ContactName") & "</TD>")
            Response.Write("<TD>" & rsCustomers("Phone") & "</TD>")
            Response.Write("<TD>" & rsCustomers("City") & "</TD>")
            Response.Write("<TD>" & rsCustomers("Region") & "</TD>")
            Response.Write("</TR>")
        rsCustomers.MoveNext
        Loop
    %>
</TABLE>

<HR>

<!--
    Form to enter new record posts variables
    back to this page
-->
<FORM Method=post Action="AddNewVbs.asp" Name=Form>
    <TABLE>
        <TR>
            <TD>Company ID:</TD>
            <TD><INPUT Size="5" Name="CompanyID" maxLength=5  ></TD>
        </TR>
        <TR>
            <TD>Company Name:</TD>
            <TD><INPUT Size="50" Name="CompanyName" ></TD>
        </TR>
        <TR>
            <TD>Contact First Name:</TD>
            <TD><INPUT Size="50" Name="FirstName" ></TD>
        </TR>
        <TR>
            <TD>Contact Last Name:</TD>
            <TD><INPUT Size="50" Name="LastName" ></TD>
        </TR>
        <TR>
            <TD>Contact Phone:</TD>
            <TD><INPUT Size="50" Name="PhoneNumber" ></TD>
        </TR>
        <TR>
            <TD>City:</TD>
            <TD><INPUT Size="50" Name="City" ></TD>
        </TR>
        <TR>
            <TD>State / Province:</TD>
            <TD><INPUT Size="5" Name="State" ></TD>
        </TR>
        <TR>
            <TD Align="right"><INPUT Type="submit" Value="Add New"></TD>
            <TD Align="left"><INPUT Type="reset" Value="Reset Form"></TD>
        </TR>
    </TABLE>
</FORM>

<%
    ' show connection
    Response.Write("Following is the connection string: <br><br>")
    Response.Write(Cnxn)

    ' Clean up.
    If rsCustomers.State = adStateOpen then
       rsCustomers.Close
    End If
    If Cnxn.State = adStateOpen then
       Cnxn.Close
    End If
    Set rsCustomers=Nothing
    Set Cnxn=Nothing
    Set fld=Nothing
%>

<SCRIPT Language = "VBScript">
Sub Form_OnSubmit
   MsgBox "Sending New Record to Server",,"ADO-ASP _Example"
End Sub
</SCRIPT>
</BODY>
</HTML>
<!-- EndAddNewVBS -->

AddNew, méthode | Recordset, objet


Exemple de méthode Clone (VBScript)

Cet exemple utilise la méthode Clone pour créer des copies d'un objet Recordset puis laisse l'utilisateur positionner de façon autonome le pointeur de l'enregistrement de chaque copie.

Utilisez l'exemple suivant dans une page ASP (Active Server Page). Cet exemple utilise la base de données Les Comptoirs livrée avec Microsoft Access. Coupez et collez le code suivant dans le Bloc-notes ou un autre éditeur de texte, puis enregistrez-le sous CloneVBS.asp. Pour afficher le résultat, vous pouvez recourir à n'importe quel navigateur client.

Pour tester cet exemple, remplacez la ligne RsCustomerList.Source = "Customers" par RsCustomerList.Source = "Products" pour disposer d'une table plus grande.

<!-- BeginCloneVBS -->
<% Language = VBScript %>
<%' use this meta tag instead of adovbs.inc%>
<!--METADATA TYPE="typelib" uuid="00000205-0000-0010-8000-00AA006D2EA4" -->
<HTML>
<HEAD>
<TITLE>ADO Clone Method</TITLE>
</HEAD>

<BODY>

<H1 align="center">ADO Clone Method</H1>
<HR>
<% ' to integrate/test this code replace the
   ' Data Source value in the Connection string%>
<%
    ' connection and recordset variables
    Dim Cnxn, strCnxn
    Dim rsCustomers, strSQLCustomers
    Dim rsFirst, rsLast, rsCount
    Dim rsClone
    Dim CloneFirst, CloneLast, CloneCount

    ' open connection
    Set Cnxn = Server.CreateObject("ADODB.Connection")
    strCnxn = "Provider='sqloledb';Data Source=" & _
            Request.ServerVariables("SERVER_NAME") & ";" & _
            "Integrated Security='SSPI';Initial Catalog='Northwind';"
    Cnxn.Open strCnxn

    ' create and open Recordset using object refs
    Set rsCustomers = Server.CreateObject("ADODB.Recordset")
    strSQLCustomers = "Customers"

    rsCustomers.ActiveConnection = Cnxn
    rsCustomers.CursorLocation = adUseClient
    rsCustomers.CursorType = adOpenKeyset
    rsCustomers.LockType = adLockOptimistic
    rsCustomers.Source = strSQLCustomers
    rsCustomers.Open

    rsCustomers.MoveFirst
    rsCount = rsCustomers.RecordCount
    rsFirst = rsCustomers("CompanyName")
    rsCustomers.MoveLast
    rsLast = rsCustomers("CompanyName")

    ' create clone
    Set rsClone = rsCustomers.Clone
    rsClone.MoveFirst
    CloneCount = rsClone.RecordCount
    CloneFirst = rsClone("CompanyName")
    rsClone.MoveLast
    CloneLast = rsClone("CompanyName")
%>

<!-- Display Results -->
<H3>There Are <%=rsCount%> Records in the original recordset</H3>
<H3>The first record is <%=rsFirst%> and the last record is <%=rsLast%></H3>
<BR><HR>
<H3>There Are <%=CloneCount%> Records in the original recordset</H3>
<H3>The first record is <%=CloneFirst%> and the last record is <%=CloneLast%></H3>
<BR><HR>
<H4>Location of OLEDB Database</H4>

<%
    ' Show location of DSN data source
    Response.Write(Cnxn)

    ' Clean up
    If rsCustomers.State = adStateOpen then
       rsCustomers.Close
    End If
    If rsClone.State = adStateOpen then
       rsClone.Close
    End If
    If Cnxn.State = adStateOpen then
       Cnxn.Close
    End If
    Set rsCustomers = Nothing
    Set rsClone = Nothing
    Set Cnxn = Nothing
%>
</BODY>
</HTML>
<!-- EndCloneVBS -->

Clone, méthode | Recordset, objet


Exemple de méthode Delete (VBScript)

Cet exemple utilise la méthode Delete pour supprimer un enregistrement spécifié dans un objet Recordset.

Utilisez l'exemple suivant dans une page ASP (Active Server Page).

Utilisez Find pour localiser le fichier Adovbs.inc, puis placez-le dans votre répertoire de travail. Coupez et collez le code suivant dans le Bloc-notes ou un autre éditeur de texte, puis enregistrez-le sous DeleteVBS.asp. Pour afficher le résultat, vous pouvez recourir à n'importe quel navigateur client.

Pour tester cet exemple, essayez d'utiliser d'abord l'exemple AddNew pour ajouter quelques enregistrements. Essayez ensuite de les supprimer. Affichez le résultat dans le navigateur client de votre choix.

<!-- BeginDeleteVBS -->
<%@ Language=VBScript %>
<% ' use this meta tag instead of ADOVBS.inc%>
<!-- METADATA TYPE="typelib" uuid="00000205-0000-0010-8000-00AA006D2EA4"  -->
<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>

<%
    ' to integrate this code replace the DataSource value in the connection string

    ' connection and recordset variables
   Dim Cnxn, strCnxn
   Dim rsCustomers, strSQLCustomers

    ' create and open connection
   Set Cnxn = Server.CreateObject("ADODB.Connection")
   strCnxn="Provider='sqloledb';Data Source=" & _
            Request.ServerVariables("SERVER_NAME") & ";" & _
            "Integrated Security='SSPI';Initial Catalog='Northwind';"
   Cnxn.Open  strCnxn
    ' create and open recordset
   Set rsCustomers = Server.CreateObject("ADODB.Recordset")
   strSQLCustomers = "Customers"
   rsCustomers.Open strSQLCustomers, Cnxn, adOpenKeyset, adLockOptimistic, adCmdTable

   ' Move to designated record and delete it
   If Not IsEmpty(Request.Form("WhichRecord")) Then
      'Get value to move from Form Post method
      Moves = Request.Form("WhichRecord")

      rsCustomers.Move CInt(Moves)
      If Not rsCustomers.EOF or rsCustomers.BOF Then
          ' handle any db errors
         On Error Resume Next
         rsCustomers.Delete 1
         If Cnxn.Errors.Count <> 0 Then
            Response.Write "Cannot delete since there are related records in other tables."
            Response.End
         End If
         rsCustomers.MoveFirst
         On Error GoTo 0
      Else
         Response.Write "Not a Valid Record Number"
         rsCustomers.MoveFirst
      End If
   End If
%>

<!-- BEGIN column header row for Customer Table-->
<TABLE COLSPAN=8 CELLPADDING=5 BORDER=0>
<TR>
   <TH>Rec. #</TH>
   <TH>Company Name</TH>
   <TH>Contact Name</TH>
   <TH>City</TH>
</TR>

   <%
   ' Display ADO Data from Customer Table
   ' Loop through Recordset adding one row to HTML Table each pass
   Dim iCount
   iCount = 0
   Do Until rsCustomers.EOF %>
   <TR>
     <TD> <%= CStr(iCount) %>
     <TD> <%= rsCustomers("CompanyName")%> </TD>
     <TD> <%= rsCustomers("ContactName")%> </TD>
     <TD> <%= rsCustomers("City")%> </TD>
   </TR>
   <%
     iCount = iCount + 1
     rsCustomers.MoveNext
   Loop
   %>
</TABLE>

<!-- Do Client side Input Data Validation Move to named record and Delete it -->
<Center>
<H4>Clicking Button Will Remove Designated Record</H4>
<H5>There are <%=rsCustomers.RecordCount%> Records in this Set</H5>

<Form Method=Post Action="Deletevbs.asp" Name=Form>
   <Input Type=Text Name="WhichRecord" Size=3>
   <Input Type=Button Name=cmdDelete Value="Delete Record">
</Form>

</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>

<%
    ' clean up
    If rsCustomers.State = adStateOpen then
        rsCustomers.Close
    End If
    If Cnxn.State = adStateOpen then
        Cnxn.Close
    End If
%>
</HTML>
<!-- EndDeleteVBS -->

Voir aussi

Delete, méthode (objet ADO Recordset) | Recordset, objet

© 1998-2002 Microsoft Corporation. Tous droits réservés.


Exemple de méthodes Execute, Requery et Clear (VBScript)

Cet exemple illustre l'utilisation de la méthode Execute lorsqu'elle est exécutée à partir d'un objet Command et d'un objet Connection. Il utilise également la méthode Requery pour extraire les données actuelles d'un objet Recordset, ainsi que la méthode Clear pour effacer le contenu de la collection Errors. Les procédures ExecuteCommand et PrintOutput sont nécessaires à l'exécution de cette procédure.

Utilisez l'exemple suivant dans une page ASP (Active Server Page). Utilisez Find pour localiser le fichier Adovbs.inc et le placer dans votre répertoire de travail. Coupez et collez le code suivant dans le Bloc-notes ou un autre éditeur de texte, puis enregistrez-le sous ExecuteVBS.asp. Pour afficher le résultat, vous pouvez recourir à n'importe quel navigateur client.

<!-- BeginExecuteVBS -->
<%@ Language=VBScript %>
<% ' use this meta tag instead of ADOVBS.inc%>
<!-- METADATA TYPE="typelib" uuid="00000205-0000-0010-8000-00AA006D2EA4"  -->
<HTML>
<HEAD>
<META name="VI60_DefaultClientScript"  content=VBScript>
<META NAME="GENERATOR" Content="Microsoft Visual Studio 6.0">
<title>ADO Execute Method</title>
<STYLE>
<!--
BODY {
   font-family: 'Verdana','Arial','Helvetica',sans-serif;
   BACKGROUND-COLOR:white;
   COLOR:black;
    }
.thead {
   background-color: #008080;
   font-family: 'Verdana','Arial','Helvetica',sans-serif;
   font-size: x-small;
   color: white;
   }
.thead2 {
   background-color: #800000;
   font-family: 'Verdana','Arial','Helvetica',sans-serif;
   font-size: x-small;
   color: white;
   }
.tbody {
   text-align: center;
   background-color: #f7efde;
   font-family: 'Verdana','Arial','Helvetica',sans-serif;
   font-size: x-small;
    }
-->
</STYLE>
</HEAD>

<BODY>
<H3>ADO Execute Method</H3>
<HR>
<H4>Recordset Retrieved Using Connection Object</H4>
<!--- Recordsets retrieved using Execute method of Connection and Command Objects-->
<%
     ' connection, command and recordset variables
    Dim Cnxn, strCnxn
    Dim rsCustomers, strSQLCustomers
    Dim Cmd
    Dim rsProducts, strSQLProducts

    ' create and open connection
    Set Cnxn = Server.CreateObject("ADODB.Connection")
    strCnxn="Provider='sqloledb';Data Source=" & _
            Request.ServerVariables("SERVER_NAME") & ";" & _
            "Integrated Security='SSPI';Initial Catalog='Northwind';"
    Cnxn.Open  strCnxn
    ' create and open recordset
    Set rsCustomers = Server.CreateObject("ADODB.Recordset")
    strSQLCustomers = "Customers"
    rsCustomers.Open strSQLCustomers, Cnxn, adOpenKeyset, adLockOptimistic, adCmdTable

    '1st Recordset using Connection - Execute
    Set rsCustomers = Cnxn.Execute(strSQLCustomers)

    Set Cmd = Server.CreateObject("ADODB.Command")
    Cmd.ActiveConnection = Cnxn
    strSQLProducts = "SELECT * From Products"
    Cmd.CommandText = strSQLProducts

    '2nd Recordset Cmd - execute
    Set rsProducts = Cmd.Execute
    %>
    <TABLE COLSPAN=8 CELLPADDING=5 BORDER=0 ALIGN=CENTER>
    <!-- BEGIN column header row for Customer Table-->
    <TR CLASS=thead>
      <TH>Company Name</TH>
      <TH>Contact Name</TH>
      <TH>City</TH>
    </TR>

    <!--Display ADO Data from Customer Table-->
    <%
    Do While Not rsCustomers.EOF %>
      <TR CLASS=tbody>
        <TD>
        <%= rsCustomers("CompanyName")%>
        </TD>
        <TD>
        <%= rsCustomers("ContactName") %>
        </TD>
        <TD>
        <%= rsCustomers("City")%>
        </TD>
      </TR>
      <%
    rsCustomers.MoveNext
    Loop
    %>
</TABLE>

<HR>
<H4>Recordset Retrieved Using Command Object</H4>

<TABLE CELLPADDING=5 BORDER=0 ALIGN=CENTER WIDTH="80%">

<!-- BEGIN column header row for Product List Table-->
<TR CLASS=thead2>
  <TH>Product Name</TH>
  <TH>Unit Price</TH>
</TR>

<!-- Display ADO Data Product List-->
<% Do Until rsProducts.EOF %>
  <TR CLASS=tbody>
    <TD>
    <%= rsProducts("ProductName")%>
    </TD>
    <TD>
    <%= rsProducts("UnitPrice")%>
    </TD>
<%
    rsProducts.MoveNext
    Loop

    ' clean up
    If rsCustomers.State = adStateOpen then
        rsCustomers.Close
    End If
    If rsProducts.State = adStateOpen then
        rsProducts.Close
    End If
    If Cnxn.State = adStateOpen then
        Cnxn.Close
    End If
    Set Cmd = Nothing
    Set rsCustomers = Nothing
    Set rsProducts = Nothing
    Set Cnxn = Nothing
%>
</TABLE>

</BODY>
</HTML>
<!-- EndExecuteVBS -->

Voir aussi

Clear, méthode | Command, objet | Connection, objet | Error, objet | Errors, collection | Execute, méthode (objet ADO Command) | Execute, méthode (objet ADO Connection) | Recordset, objet | Requery, méthode

© 1998-2002 Microsoft Corporation. Tous droits réservés.


Exemple de méthode Move (VBScript)

Cet exemple utilise la méthode Move pour positionner le pointeur de l'enregistrement, en fonction des entrées émises par l'utilisateur.

Utilisez l'exemple suivant dans une page ASP (Active Server Page).

Utilisez Find pour localiser le fichier Adovbs.inc, puis placez-le dans votre répertoire de travail. Coupez et collez le code suivant dans le Bloc-notes ou un autre éditeur de texte, puis enregistrez-le sous MoveVBS.asp. Pour afficher le résultat, vous pouvez recourir à n'importe quel navigateur.

Essayez d'entrer une lettre ou un nombre non-entier pour observer le mécanisme de gestion des erreurs à l'œuvre.

<!-- BeginMoveVBS -->
<%@ Language=VBScript %>
<%' use this meta tag instead of adovbs.inc%>
<!--METADATA TYPE="typelib" uuid="00000205-0000-0010-8000-00AA006D2EA4" -->
<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>
<% ' to integrate/test this code replace the
   ' Data Source value in the Connection string%>
<%
    ' connection and recordset variables
    Dim Cnxn, strCnxn
    Dim rsCustomers, strSQLCustomers

    ' open connection
    Set Cnxn = Server.CreateObject("ADODB.Connection")
    strCnxn = "Provider='sqloledb';Data Source=" & _
            Request.ServerVariables("SERVER_NAME") & ";" & _
            "Integrated Security='SSPI';Initial Catalog='Northwind';"

    Cnxn.Open strCnxn

     ' create and open Recordset using object refs
    Set rsCustomers = Server.CreateObject("ADODB.Recordset")
    strSQLCustomers = "Customers"

    rsCustomers.ActiveConnection = Cnxn
    rsCustomers.CursorLocation = adUseClient
    rsCustomers.CursorType = adOpenKeyset
    rsCustomers.LockType = adLockOptimistic
    rsCustomers.Source = strSQLCustomers
    rsCustomers.Open

    'Check number of user moves this session and increment by entry
    Session("Clicks") = Session("Clicks") + Request.Form("MoveAmount")
    Clicks = Session("Clicks")
    ' Move to last known recordset position plus amount passed
    rsCustomers.Move CInt(Clicks)

    'Error Handling
    If rsCustomers.EOF Then
        Session("Clicks") = rsCustomers.RecordCount
        Response.Write "This is the Last Record"
        rsCustomers.MoveLast
    ElseIf rsCustomers.BOF Then
        Session("Clicks") = 1
        rsCustomers.MoveFirst
        Response.Write "This is the First Record"
    End If
    %>

    <H3>Current Record Number is <BR>
    <%
    If Session("Clicks") = 0 Then Session("Clicks") = 1
    Response.Write(Session("Clicks") )%> of <%=rsCustomers.RecordCount%></H3>
    <HR>

    <TABLE COLSPAN=8 CELLPADDING=5 BORDER=0>

    <!-- BEGIN column header row for Customer Table-->

    <TR CLASS=thead1>
       <TD>Company Name</TD>
       <TD>Contact Name</TD>
       <TD>City</TD>
    </TR>
        <% 'display%>
        <TR CLASS=tbody>
          <TD> <%= rsCustomers("CompanyName")%> </TD>
          <TD> <%= rsCustomers("ContactName")%></TD>
          <TD> <%= rsCustomers("City")%> </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> <BR>

    <FORM Method = Post Action="MoveVbs.asp" Name=Form>
    <TABLE>
        <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>
    </TABLE>
    Click Move Amount to use Move Method<br>
    Enter Number of Records to Move + or - </H5>    </FORM>
</BODY>

<Script Language = "VBScript">

Sub Move_OnClick
   ' Make sure move value entered is an integer
   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>

<%
    ' clean up
    If rsCustomers.State = adStateOpen then
        rsCustomers.Close
    End If
    If Cnxn.State = adStateOpen then
        Cnxn.Close
    End If
%>
</HTML>
<!-- EndMoveVBS -->

Voir aussi

Move, méthode | Recordset, objet

© 1998-2002 Microsoft Corporation. Tous droits réservés.


Exemple de méthodes MoveFirst, MoveLast, MoveNext et MovePrevious (VBScript)

Cet exemple utilise les méthodes MoveFirst, MoveLast, MoveNext et MovePrevious pour déplacer le pointeur de l'enregistrement d'un objet Recordset sur la base de la commande transmise.

Coupez et collez le code suivant dans le Bloc-notes ou un autre éditeur de texte, puis enregistrez-le sous MoveFirstVBS.asp. Pour afficher le résultat, vous pouvez recourir à n'importe quel navigateur client.

<!-- BeginMoveFirstVBS -->
<%@ Language=VBScript %>
<%' use this meta tag instead of adovbs.inc%>
<!--METADATA TYPE="typelib" uuid="00000205-0000-0010-8000-00AA006D2EA4" -->
<HTML>
<HEAD>
<TITLE>ADO MoveNext, MovePrevious, MoveLast, MoveFirst Methods</TITLE>

<SCRIPT LANGUAGE="VBScript">
<!--
   Sub cmdDown_OnClick
      'Set Values in Form Input Boxes and Submit Form
      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>
</HEAD>

<body bgcolor="white">
<h1 align="center">ADO MoveNext, MovePrevious <br> MoveLast & MoveFirst Methods</h1>
<% ' to integrate/test this code replace the
   ' Data Source value in the Connection string%>
<%
   ' connection and recordset variables
   Dim Cnxn, strCnxn
   Dim rsEmployees, strSQLEmployees

   ' open connection
    Set Cnxn = Server.CreateObject("ADODB.Connection")
    strCnxn = "Provider='sqloledb';Data Source=" & _
            Request.ServerVariables("SERVER_NAME") & ";" & _
            "Integrated Security='SSPI';Initial Catalog='Northwind';"
    Cnxn.Open strCnxn

    ' create and open Recordset using object refs
   Set rsEmployees = Server.CreateObject("ADODB.Recordset")
   strSQLEmployees = "Employees"

   rsEmployees.ActiveConnection = Cnxn
   rsEmployees.CursorLocation = adUseClient
   rsEmployees.CursorType = adOpenKeyset
   rsEmployees.LockType = adLockOptimistic
   rsEmployees.Source = strSQLEmployees
   rsEmployees.Open

   rsEmployees.MoveFirst

   If Not IsEmpty(Request.Form("MoveAction")) Then
      strAction = Request.Form("MoveAction")
      varPosition  = Request.Form("Position")

      rsEmployees.AbsolutePosition = varPosition

      Select Case strAction

        Case "MoveNext"

         rsEmployees.MoveNext
         If rsEmployees.EOF Then
            rsEmployees.MoveLast
            strMessage = "Can't move beyond the last record."
         End If

        Case "MovePrev"

         rsEmployees.MovePrevious
         If rsEmployees.BOF Then
            rsEmployees.MoveFirst
            strMessage = "Can't move beyond the first record."
         End If

        Case "MoveLast"

         rsEmployees.MoveLast

        Case "MoveFirst"

         rsEmployees.MoveFirst

      End Select
   End If

%>

<!-- Display Current Record Number and Recordset Size -->
<h2>Record Number <%=rsEmployees.AbsolutePosition%> of <%=rsEmployees.RecordCount%></H2>
<hr>
<table cellpadding=5 border=0>
<!-- BEGIN column header row for Customer Table-->
<tr>
   <th>Name</th>
   <th>Hire Date</th>
</tr>

<!--Display ADO Data from Customer Table-->
<tr>
  <td><%= rsEmployees("LastName") & ", " %>
      <%= rsEmployees("FirstName") & " " %></td>
  <td><%= rsEmployees("HireDate")%></td>
</tr>
<tr>
  <td colspan=2><%=strMessage%></td>
</tr>
</table>

<hr>

<form Name="Form" Method="Post" Action="MoveFirstVbs.asp">
<Input Type=Button Name=cmdDown Value="<">
<Input Type=Button Name=cmdUp Value=">">
<BR>
<H3>Click Direction Arrows to Use MovePrevious or MoveNext</H3>
<Input Type=Button Name=cmdFirst Value="First Record">
<Input Type=Button Name=cmdLast Value="Last Record">

<!-- Use Hidden Form Fields to record values to send to Server -->

<input Type="Hidden" Size="4" Name="MoveAction" Value="Move">
<input Type="Hidden" Size="4" Name="Position" Value="<%= rsEmployees.AbsolutePosition%>">
</form>

<HR>
</BODY>

<%
    ' clean up
    If rsEmployees.State = adStateOpen then
        rsEmployees.Close
    End If
    If Cnxn.State = adStateOpen then
        Cnxn.Close
    End If
%>
</HTML>
<!-- EndMoveFirstVBS -->

Voir aussi

MoveFirst, MoveLast, MoveNext et MovePrevious, méthodes | Recordset, objet


Exemple de méthodes Open et Close (VBScript)

Cet exemple utilise les méthodes Open et Close sur les deux objets Recordset et Connection qui ont été ouverts.

Utilisez l'exemple suivant dans une page ASP (Active Server Page). Utilisez Find pour localiser le fichier Adovbs.inc et le placer dans votre répertoire de travail. Coupez et collez le code suivant dans le Bloc-notes ou un autre éditeur de texte, puis enregistrez-le sous OpenVBS.asp. Pour afficher le résultat, vous pouvez recourir à n'importe quel navigateur.

<!-- BeginOpenVBS -->
<%@ Language=VBScript %>
<%' use this meta tag instead of adovbs.inc%>
<!--METADATA TYPE="typelib" uuid="00000205-0000-0010-8000-00AA006D2EA4" -->
<HTML>
<HEAD>
<META name="VI60_DefaultClientScript"  content=VBScript>
<META NAME="GENERATOR" Content="Microsoft Visual Studio 6.0">
<title>ADO Open Method</title>
<STYLE>
<!--
BODY {
   font-family: 'Verdana','Arial','Helvetica',sans-serif;
   BACKGROUND-COLOR:white;
   COLOR:black;
    }
.thead {
   background-color: #008080;
   font-family: 'Verdana','Arial','Helvetica',sans-serif;
   font-size: x-small;
   color: white;
   }
.thead2 {
   background-color: #800000;
   font-family: 'Verdana','Arial','Helvetica',sans-serif;
   font-size: x-small;
   color: white;
   }
.tbody {
   text-align: center;
   background-color: #f7efde;
   font-family: 'Verdana','Arial','Helvetica',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>
<% ' to integrate/test this code replace the
   ' Data Source value in the Connection string%>
<%
    ' connection and recordset variables
    Dim Cnxn, strCnxn
    Dim rsCustomers, strSQLCustomers
    Dim rsProducts, strSQLProducts

    ' open connection
    Set Cnxn = Server.CreateObject("ADODB.Connection")
    strCnxn = "Provider='sqloledb';Data Source=" & _
            Request.ServerVariables("SERVER_NAME") & ";" & _
            "Integrated Security='SSPI';Initial Catalog='Northwind';"

    Cnxn.Open strCnxn

    ' create and open first Recordset using Connection - execute
    Set rsCustomers = Server.CreateObject("ADODB.Recordset")
    strSQLCustomers = "SELECT CompanyName, ContactName, City FROM Customers"
    Set rsCustomers = Cnxn.Execute(strSQLCustomers)

    ' create and open second Recordset using recordset - open
    Set rsProducts = Server.CreateObject("ADODB.Recordset")
    strSQLProducts = "SELECT ProductName, UnitPrice FROM Products"
    rsProducts.Open strSQLProducts, Cnxn, adOpenDynamic, adLockPessimistic, adCmdText
    %>

    <TABLE COLSPAN=8 CELLPADDING=5 BORDER=0>
    <!-- BEGIN column header row for Customer Table-->
    <TR CLASS=thead>
       <TD>Company Name</TD>
       <TD>Contact Name</TD>
       <TD>City</TD>
    </TR>

    <!--Display ADO Data from Customer Table-->
    <% Do Until rsCustomers.EOF %>
    <TR CLASS=tbody>
      <TD> <%=rsCustomers("CompanyName")%> </TD>
      <TD> <%=rsCustomers("ContactName")%></TD>
      <TD> <%=rsCustomers("City")%> </TD>
    </TR>
    <%rsCustomers.MoveNext
    Loop
    %>
    </TABLE>

    <HR>

    <TABLE COLSPAN=8 CELLPADDING=5 BORDER=0>
    <!-- BEGIN column header row for Product List Table-->

    <TR CLASS=thead2>
       <TD>Product Name</TD>
       <TD>Unit Price</TD>
    </TR>
    <!-- Display ADO Data Product List-->
    <% Do Until rsProducts.EOF %>
      <TR CLASS=tbody>
      <TD> <%=rsProducts("ProductName")%> </TD>
      <TD> <%=rsProducts("UnitPrice")%> </TD>
      </TR>
      <!--  Next Row = Record -->
    <%rsProducts.MoveNext
    Loop

    ' clean up
    If rsProducts.State = adStateOpen then
        rsProducts.Close
    End If
    If rsCustomers.State = adStateOpen then
        rsCustomers.Close
    End If
    If Cnxn.State = adStateOpen then
        Cnxn.Close
    End If
    Set rsProducts = Nothing
    Set rsCustomers = Nothing
    Set Cnxn = Nothing

    %>
    </TABLE>

</BODY>
</HTML>
<!-- EndOpenVBS -->

Voir aussi

Close, méthode | Connection, objet | Open, méthode (objet ADO Connection) | Open, méthode (objet ADO Recordset) | Recordset, objet


Exemples de code ADO en Microsoft Visual C++

Utilisez les exemples de code ci-dessous pour apprendre à utiliser les méthodes, propriétés et événements ADO lorsque vous programmez en Microsoft Visual C++.

Remarque Collez l'exemple de code dans sa totalité, du début à la fin, dans votre éditeur de code. L'exemple risque de ne pas fonctionner correctement si des copies partielles d'exemple sont utilisées ou si la mise en forme des paragraphes est perdue.

Méthodes

  • Exemple de méthode AddNew
  • Exemple de méthodes Append et CreateParameter
  • Exemple de méthodes AppendChunk et GetChunk
  • Exemple de méthodes BeginTrans, CommitTrans et RollbackTrans
  • Exemple de méthode Cancel
  • Exemple de méthode Clone
  • Exemple de méthode CompareBookmarks
  • Exemple de méthode Delete
  • Exemple de méthodes Execute, Requery et Clear
  • Exemple de méthode Find
  • Exemple de méthode GetRows
  • Exemple de méthode GetString
  • Exemple de méthodes MoveFirst, MoveLast, MoveNext et MovePrevious
  • Exemple de méthode NextRecordset
  • Exemple de méthodes Open et Close
  • Exemple de méthode OpenSchema
  • Exemple de méthode Refresh
  • Exemple de méthode Resync
  • Exemple de méthodes Save et Open
  • Exemple de méthode Seek et de propriété Index
  • Exemple de méthode Supports
  • Exemple de méthodes Update et CancelUpdate
  • Exemple de méthodes UpdateBatch et CancelBatch

Propriétés

  • Exemple de propriétés AbsolutePage, PageCount et PageSize
  • Exemple de propriétés AbsolutePosition et CursorLocation
  • Exemple de propriété ActiveCommand
  • Exemple de propriétés ActiveConnection, CommandText, CommandTimeout, CommandType, Size et Direction
  • Exemple de propriétés ActualSize et DefinedSize
  • Exemple de propriétés Attributes et Name
  • Exemple de propriétés BOF, EOF et Bookmark
  • Exemple de propriété CacheSize
  • Exemple de propriétés ConnectionString, ConnectionTimeout et State
  • Exemple de propriété Count
  • Exemple de propriétés CursorType, LockType et EditMode
  • Exemple de propriétés Description, HelpContext, HelpFile, NativeError, Number, Source et SQLState
  • Exemple de propriétés Filter et RecordCount
  • Exemple de méthode Seek et de propriété Index
  • Exemple de propriétés IsolationLevel et Mode
  • Exemple de propriété Item
  • Exemple de propriété MarshalOptions
  • Exemple de propriété MaxRecords
  • Exemple de propriétés NumericScale et Precision
  • Exemple de propriété Optimize
  • Exemple de propriétés OriginalValue et UnderlyingValue
  • Exemple de propriété Prepared
  • Exemple de propriétés Provider et DefaultDatabase
  • Exemple de propriété Sort
  • Exemple de propriété Source
  • Exemple de propriété State
  • Exemple de propriété Status
  • Exemple de propriété StayInSync
  • Exemple de propriété Type (Field)
  • Exemple de propriété Type (Property)
  • Exemple de propriété Value
  • Exemple de propriété Version

Autre

  • Exemple de modèle d'événements ADO

Voir aussi

Exemples de code ADO en Microsoft Visual Basic | Exemples de code ADO en Microsoft Visual Basic Scripting Edition | Exemples de code ADO en Microsoft Visual J++


Exemple de modèle d'événements ADO (VC++)

La section Instanciation d'événements ADO par langage correspondant à Visual C++ contient une description générale du mode d'instanciation du modèle d'événements ADO. Ce qui suit est un exemple spécifique d'instanciation du modèle d'événements dans l'environnement créé par la directive #import.

La description générale utilise adoint.h comme référence pour les signatures de méthode. Cependant, quelques détails de la description générale changent légèrement à la suite de l'utilisation de la directive #import :

  • La directive #import convertit les typedef, ainsi que les types de données de signature de méthode et les modificateurs, en leur forme de base.
  • Les méthodes virtuelles pures qui doivent être remplacées sont toutes précédées de « raw_ ».

Une partie du code reflète simplement le style de codage.

  • Le pointeur de IUnknown utilisé par la méthode Advise est obtenu explicitement via un appel à QueryInterface.
  • Il n'est pas nécessaire de coder explicitement un destructeur dans les définitions de classe.
  • Vous pouvez coder des implémentations plus robustes de QueryInterface, AddRef et Release.
  • La directive __uuidof() est utilisée massivement pour obtenir des ID d'interface.

Enfin, l'exemple contient un fragment de code opérationnel.

  • L'exemple est écrit en tant qu'application de console.
  • Vous devez insérer votre propre code sous le commentaire, « // Effectuer un travail quelconque ».
  • Les gestionnaires d'événements ne font rien par défaut, et annulent toutes les notifications à venir. Vous devez insérer le code approprié à votre application, et autoriser les notifications si nécessaire.
// eventmodel.cpp : Defines the entry point for the console application.
//

#import "c:\Program Files\Common Files\System\ADO\msado15.dll" \
   no_namespace rename("EOF", "EndOfFile")
#include <comdef.h>
#include <stdio.h>

//----The Connection events----------------------------------------------

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);
};

//-----The Recordset events----------------------------------------------

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);
};

//-----Implement each connection method----------------------------------

      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;
         };

//-----Implement each recordset method-----------------------------------

      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;
         };

//-----Implement QueryInterface, AddRef, and 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;
                              }

//-----Write your main block of code-------------------------------------

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;

   // Start using the Connection events

   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;

   // Start using the Recordset events

   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;

   // Do some work

   pConn->Open("dsn=Pubs;", "MyUserName", "MyPassword", 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();

   // Stop using the Connection events

   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;

   // Stop using the Recordset events
   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;
}


Exemple de propriétés AbsolutePage, PageCount et PageSize (VC++)

Cet exemple utilise les propriétés AbsolutePage, PageCount et PageSize pour afficher les noms et dates de recrutement extraits de la table Employees, à raison de cinq enregistrements à la fois.

// BeginAbsolutePageCpp
#import "C:\Program Files\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <stdio.h>
#include <ole2.h>
#include "conio.h"
#include "AbsolutepageX.h"

//Function Declarations.
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void AbsolutePageX(void);
void PrintProviderError(_ConnectionPtr pConnection);

///////////////////////////////////////////////////////////
//                                                       //
//      Main Function                                    //
//                                                       //
///////////////////////////////////////////////////////////
void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    AbsolutePageX();

    ::CoUninitialize();
}

/////////////////////////////////////////////////////////////
//                                                         //
//      AbsolutePageX Function                             //
//                                                         //
/////////////////////////////////////////////////////////////

void AbsolutePageX(void)
{

    // Define ADO object pointers.
    // Initialize pointers on define.
    // These are in the ADODB::  namespace.
    _RecordsetPtr   pRstEmployees   = NULL;

    //Define Other Variables
    //Interface Pointer declared.(VC++ Extensions)
    IADORecordBinding   *picRs = NULL;
    CEmployeeRs emprs;          //C++ class object
    HRESULT hr = S_OK;
    _bstr_t strMessage;

    //Open a recordset using a Client Cursor
    //For the Employee Table

    _bstr_t strCnn("Provider='sqloledb';Data Source='MySqlServer';"
        "Initial Catalog='pubs';Integrated Security='SSPI';");

    try
    {
        // Open a recordset.
        TESTHR(hr = pRstEmployees.CreateInstance(__uuidof(Recordset)));

        // Use client cursor to enable Absoluteposition property.
        pRstEmployees->CursorLocation = adUseClient;

        // You have to explicitly pass the default Cursor type
        // and LockType to the Recordset here
        TESTHR(hr = pRstEmployees->Open("employee",
            strCnn,adOpenForwardOnly,adLockReadOnly,adCmdTable));

        //Open an IADORecordBinding interface pointer which we'll use for
        //Binding Recordset to a class
        TESTHR(hr = pRstEmployees->QueryInterface
            (__uuidof(IADORecordBinding), (LPVOID*)&picRs));

        //Bind the Recordset to a C++ Class here
        TESTHR(hr = picRs->BindToRecordset(&emprs));

        //Display Names and hire dates, five records at a time
        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();

            //Clear the Screen for the next Display
            system("cls");
        }
    }
    catch(_com_error &e)
    {
        // Notify the user of errors if any.
        _variant_t vtConnect = pRstEmployees->GetActiveConnection();

        // GetActiveConnection returns connect string if connection
        // is not open, else returns Connection object.
        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;
        }
    }
    // Clean up objects before exit.
    //Release the IADORecordset Interface here
    if (picRs)
        picRs->Release();

    if (pRstEmployees)
        if (pRstEmployees->State == adStateOpen)
            pRstEmployees->Close();
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintProviderError Function                      //
//                                                       //
///////////////////////////////////////////////////////////

void PrintProviderError(_ConnectionPtr pConnection)
{
    // Print Provider Errors from Connection object.
    // pErr is a record object in the Connection's Error collection.
    ErrorPtr  pErr  = NULL;

    if( (pConnection->Errors->Count) > 0)
    {
        long nCount = pConnection->Errors->Count;
        // Collection ranges from 0 to 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);
        }
    }
}
//EndAbsolutePageCpp

AbsolutePageX.h

// BeginAbsolutePageH
#include "icrsint.h"

//This Class extracts only fname,lastname and hire_date

class CEmployeeRs : public CADORecordBinding
{
BEGIN_ADO_BINDING(CEmployeeRs)

    //Column fname is the 2nd field in the table
   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;

};
// EndAbsolutePageH

Voir aussi

AbsolutePage, propriété | PageCount, propriété | PageSize, propriété | Recordset, objet


Exemple de propriétés AbsolutePosition et CursorLocation (VC++)

Cet exemple illustre comment la propriété AbsolutePosition peut suivre la progression d'une boucle énumérant tous les enregistrements d'un objet Recordset. Il utilise la propriété CursorLocation pour activer la propriété AbsolutePosition en sélectionnant le type de curseur côté client.

// BeginAbsolutePositionCpp
#import "C:\Program Files\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <ole2.h>
#include <stdio.h>
#include "conio.h"
#include "AbsolutePositionX.h"

//Function Declarations
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void AbsolutePositionX(void);
void AbsolutePosition2X(void);
void PrintProviderError(_ConnectionPtr pConnection);

///////////////////////////////////////////////////////////
//                                                       //
//      Main Function                                    //
//                                                       //
///////////////////////////////////////////////////////////
void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    AbsolutePositionX();

    //Clear the screen for the next display
    printf("Press any key to continue...");
    getch();
    system("cls");

    AbsolutePosition2X();

    ::CoUninitialize();
}

///////////////////////////////////////////////////////////
//                                                       //
//      AbsolutePositionX Function                       //
//                                                       //
///////////////////////////////////////////////////////////

void AbsolutePositionX(void)
{
    HRESULT hr = S_OK;

    // Define ADO object pointers.
    // Initialize pointers on define.
    // These are in the ADODB::  namespace.
    _RecordsetPtr  pRstEmployees  = NULL;

    //Define Other Variables
    //Interface Pointer declared.(VC++ Extensions)
    IADORecordBinding *picRs = NULL;
    CEmployeeRs emprs;                  //C++ class object
    _bstr_t strMessage;
    char chKey;

    //Open a recordset using a Client Cursor
    //For the Employee Table

    _bstr_t strCnn("Provider='sqloledb';Data Source='MySqlServer';"
        "Initial Catalog='pubs';Integrated Security='SSPI';");

    try
    {
        //Open a recordset.
        TESTHR(pRstEmployees.CreateInstance(__uuidof(Recordset)));

        //Use client cursor to enable Absoluteposition property.
        pRstEmployees->CursorLocation = adUseClient;

        //You have to explicitly pass the default Cursor type
        //and LockType to the Recordset.
        TESTHR(  pRstEmployees->Open("employee",
        strCnn,adOpenForwardOnly,adLockReadOnly,adCmdTable));

        // Open an IADORecordBinding interface pointer which we'll use
        // for Binding Recordset to a class.
        TESTHR(pRstEmployees->QueryInterface(
            __uuidof(IADORecordBinding),(LPVOID*)&picRs));

        //Bind the Recordset to a C++ Class here
        TESTHR(picRs->BindToRecordset(&emprs));

        strMessage= "";

        //Enumerate recordset
        do
        {
            //Display Current Record Information
            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');

            //Clear the Screen for the next output
            system("cls");

            if(chKey == 'n')
                break;

            strMessage = "";
            pRstEmployees->MoveNext();
        }while(!(pRstEmployees->EndOfFile));
    }
    catch(_com_error &e)
    {
        // Notify the user of errors if any.
        _variant_t vtConnect = pRstEmployees->GetActiveConnection();

        // GetActiveConnection returns connect string if connection
        // is not open, else returns Connection object.
        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;
        }
    }

    // Clean up objects before exit.
    //Release the IADORecordset Interface here
    if (picRs)
        picRs->Release();

    if (pRstEmployees)
        if (pRstEmployees->State == adStateOpen)
            pRstEmployees->Close();
}

///////////////////////////////////////////////////////////
//                                                       //
//      AbsolutePosition2X Function                       //
//                                                       //
///////////////////////////////////////////////////////////

void AbsolutePosition2X(void)
{
    HRESULT hr = S_OK;

    // Define ADO object pointers.
    // Initialize pointers on define.
    // These are in the ADODB::  namespace.
    _RecordsetPtr  pRstEmployees  = NULL;

    //Define Other Variables
    //Interface Pointer declared.(VC++ Extensions)
    IADORecordBinding *picRs = NULL;
    CEmployeeRs emprs;                  //C++ class object
    _bstr_t strMessage;

    //Open a recordset using a Client Cursor
    //For the Employee Table

    _bstr_t strCnn("Provider='sqloledb';Data Source='MySqlServer';"
        "Initial Catalog='pubs';Integrated Security='SSPI';");

    try
    {
        //Open a recordset.
        TESTHR(pRstEmployees.CreateInstance(__uuidof(Recordset)));

        //Use client cursor to enable Absoluteposition property.
        pRstEmployees->CursorLocation = adUseClient;

        //You have to explicitly pass the default Cursor type
        //and LockType to the Recordset.
        TESTHR(pRstEmployees->Open("employee",
          strCnn,adOpenStatic,adLockReadOnly,adCmdTable));

        // Open an IADORecordBinding interface pointer which we'll use
        // for Binding Recordset to a class.
        TESTHR(pRstEmployees->QueryInterface(
            __uuidof(IADORecordBinding),(LPVOID*)&picRs));

        //Bind the Recordset to a C++ Class here
        TESTHR(picRs->BindToRecordset(&emprs));

        long lGoToPos = 21;

        pRstEmployees->AbsolutePosition = (PositionEnum)lGoToPos;

        //Display Current Record Information
        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();
    }
    catch(_com_error &e)
    {
        // Notify the user of errors if any.
        _variant_t vtConnect = pRstEmployees->GetActiveConnection();

        // GetActiveConnection returns connect string if connection
        // is not open, else returns Connection object.
        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;
        }
    }

    // Clean up objects before exit.
    //Release the IADORecordset Interface here
    if (picRs)
        picRs->Release();

    if (pRstEmployees)
        if (pRstEmployees->State == adStateOpen)
            pRstEmployees->Close();
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintProviderError Function                      //
//                                                       //
///////////////////////////////////////////////////////////

void PrintProviderError(_ConnectionPtr pConnection)
{
    // Print Provider Errors from Connection object.
    // pErr is a record object in the Connection's Error collection.
    ErrorPtr    pErr  = NULL;
    long      nCount  = 0;
    long      i     = 0;

    if( (pConnection->Errors->Count) > 0)
    {
        nCount = pConnection->Errors->Count;
        // Collection ranges from 0 to 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);
        }
    }
}

// EndAbsolutePositionCpp

AbsolutePositionX.h

// BeginAbsolutePositionH
#include <ole2.h>
#include <stdio.h>
#include "icrsint.h"

//This Class extracts lastname.

class CEmployeeRs : public CADORecordBinding
{
BEGIN_ADO_BINDING(CEmployeeRs)

    //Column lname is the 4th field in the 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;

};
// EndAbsolutePositionH

Voir aussi

AbsolutePosition, propriété | CursorLocation, propriété | Recordset, objet


Exemple de propriété ActiveCommand (VC++)

Cet exemple utilise la propriété ActiveCommand.

Un objet Recordset dont la propriété ActiveCommand permet d'afficher le texte et le paramètre de la commande ayant servi à la création du Recordset est attribué à une sous-routine.

// BeginActiveCommandCpp
#import "C:\Program Files\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <ole2.h>
#include <stdio.h>
#include <conio.h>
#include "ActiveCommandX.h"

// Function declarations
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);
inline char* mygets(char* strDest, int n)
{
    char strExBuff[10];
    char* pstrRet = fgets(strDest, n, stdin);

    if (pstrRet == NULL)
        return NULL;

    if (!strrchr(strDest, '\n'))
        // Exhaust the input buffer.
        do
        {
            fgets(strExBuff, sizeof(strExBuff), stdin);
        }while (!strrchr(strExBuff, '\n'));
    else
        // Replace '\n' with '\0'
        strDest[strrchr(strDest, '\n') - strDest] = '\0';

    return pstrRet;
}

//////////////////////////////////////////////////////////
//                                                      //
//        Main Function                                 //
//                                                      //
//////////////////////////////////////////////////////////

void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    ActiveCommandX();

    ::CoUninitialize();
}

//////////////////////////////////////////////////////////
//                                                      //
//            ActiveCommandX Function                   //
//                                                      //
//////////////////////////////////////////////////////////

void ActiveCommandX(void)
{

    HRESULT    hr = S_OK;

    // Define ADO object pointers.
    // Initialize pointers on define.
    // These are in the ADODB::  namespace.
    _ConnectionPtr  pConnection      = NULL;
    _CommandPtr    pCmd      = NULL;
    _RecordsetPtr  pRstAuthors    = NULL;

    //Definitions of other variables
    _bstr_t strCnn("Provider='sqloledb';Data Source='MySqlServer';"
        "Initial Catalog='pubs';Integrated Security='SSPI';");
    _bstr_t      strPrompt;
    _bstr_t      strName;
    CHAR strcharName[50];

    try
    {
        // Open connection.
        TESTHR(pConnection.CreateInstance(__uuidof(Connection)));

        TESTHR(pRstAuthors.CreateInstance(__uuidof(Recordset)));

        TESTHR(pCmd.CreateInstance(__uuidof(Command)));

        printf ("ActiveCommandX Example\n\n");
        strPrompt = "Enter an author's name (e.g., Ringer): ";
        printf(strPrompt);
        mygets(strcharName, 50);
        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, "", "", adConnectUnspecified);

        pCmd->PutActiveConnection(_variant_t((IDispatch*)pConnection));

        pRstAuthors = pCmd->Execute(NULL,NULL,adCmdText);

        ActiveCommandXprint(pRstAuthors);

    }    // End Try statement.
    catch(_com_error &e)
    {
        // Notify the user of errors if any.
        // Pass a connection pointer accessed from the Recordset.
        PrintProviderError(pConnection);
        PrintComError(e);
    }

    // Clean up objects before exit.
    if (pRstAuthors)
        if (pRstAuthors->State == adStateOpen)
            pRstAuthors->Close();
    if (pConnection)
        if (pConnection->State == adStateOpen)
            pConnection->Close();
}

//////////////////////////////////////////////////////////
//                                                      //
//              ActiveCommandXprint Function            //
//                                                      //
//////////////////////////////////////////////////////////

void ActiveCommandXprint(_RecordsetPtr    pRst = NULL)
{
    // Varible Declaraion & initialization
    IADORecordBinding   *picRs  = NULL;  //Interface Pointer declared.
    CAuthorsRs autrs;           //C++ class object
    _bstr_t strName;

    //Open an IADORecordBinding interface pointer which
    //we'll use for Binding Recordset to a class
    TESTHR(pRst->QueryInterface(__uuidof(IADORecordBinding),(LPVOID*)&picRs));

    //Bind the Recordset to a C++ Class here
    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>");
    }

    //Release IADORecordset Interface
    if (picRs)
        picRs->Release();

}

//////////////////////////////////////////////////////////
//                                                      //
//        PrintProviderError Function                   //
//                                                      //
//////////////////////////////////////////////////////////

void PrintProviderError(_ConnectionPtr pConnection)
{
    // Print Provider Errors from Connection object.
    // pErr is a record object in the Connection's Error collection.
    ErrorPtr    pErr  = NULL;
    long      nCount  = 0;
    long      i     = 0;

    if( (pConnection->Errors->Count) > 0)
    {
        nCount = pConnection->Errors->Count;
        // Collection ranges from 0 to nCount -1.
        for(i = 0; i < nCount; i++)
        {
            pErr = pConnection->Errors->GetItem(i);
            printf("\t Error number: %x\t%s\n", pErr->Number, (LPCSTR)pErr->Description);
        }
    }
}

//////////////////////////////////////////////////////////
//                                                      //
//       PrintComError Function                         //
//                                                      //
//////////////////////////////////////////////////////////

void PrintComError(_com_error &e)
{
   _bstr_t bstrSource(e.Source());
   _bstr_t bstrDescription(e.Description());

    // Print Com errors.
   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);

}
// EndActiveCommandCpp

ActiveCommandX.h
// BeginActiveCommandH
#include "icrsint.h"

// This Class extracts id, fname, lname from authors table.

class CAuthorsRs : public CADORecordBinding
{
BEGIN_ADO_BINDING(CAuthorsRs)

    // Column au_id is the 1st field in the recordset
    ADO_VARIABLE_LENGTH_ENTRY2(1, adVarChar, m_au_id,
         sizeof(m_au_id), lau_idStatus, TRUE)

    // Column au_fname is the 2nd field in the recordset
    ADO_VARIABLE_LENGTH_ENTRY2(2, adVarChar, m_au_fname,
         sizeof(m_au_fname), lau_fnameStatus, TRUE)

    // Column au_lname is the 3rd field in the 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;

};
// EndActiveCommandH

ActiveCommand, propriété | Recordset, objet


Exemple de propriétés ActiveConnection, CommandText, CommandTimeout, CommandType, Size et Direction (VC++)

Cet exemple utilise les propriétés ActiveConnection, CommandText, CommandTimeout, CommandType, Size et Direction pour exécuter une procédure stockée.

// BeginActiveConnectionCpp
#import "C:\Program Files\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#define TESTHR(x) if FAILED(x) _com_issue_error(x)

#include <stdio.h>
#include <ole2.h>
#include "conio.h"
#include "ActiveConnectionX.h"

//Function declaration
void ActiveConnectionX(VOID);
void PrintProviderError(_ConnectionPtr pConnection);

///////////////////////////////////////////////////////////
//                                                       //
//      Main Function                                    //
//                                                       //
///////////////////////////////////////////////////////////
void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    ActiveConnectionX();

    //Wait here for user to see the output..
    printf("\n\nPress any key to continue..");
    getch();

    ::CoUninitialize();
}

///////////////////////////////////////////////////////////
//                                                       //
//      ActiveConnectionX Function                       //
//                                                       //
///////////////////////////////////////////////////////////
VOID ActiveConnectionX(VOID)
{
    HRESULT hr = S_OK;

    // Define ADO object pointers.
    // Initialize pointers on define.
    // These are in the ADODB::  namespace.
    _ConnectionPtr  pConnection      = NULL;
    _CommandPtr     pCmdByRoyalty  = NULL;
    _RecordsetPtr  pRstByRoyalty  = NULL;
    _RecordsetPtr  pRstAuthors   = NULL;
    _ParameterPtr    pPrmByRoyalty  = NULL;

    //Define Other variables
    IADORecordBinding   *picRs = NULL;  //Interface Pointer declared.(VC++ Extensions)  TCS(SPA)
    CEmployeeRs emprs;          //C++ class object  TCS(SPA)
    _bstr_t strAuthorId;
    int intRoyalty;
    VARIANT vtroyal ;

    _bstr_t strCnn("Provider='sqloledb';Data Source='MySqlServer';"
            "Initial Catalog='pubs';Integrated Security='SSPI';");

    try
    {
        //Define a command object for a stored procedure.

        TESTHR(pConnection.CreateInstance(__uuidof(Connection)));
        hr = pConnection->Open(strCnn,"","",adConnectUnspecified);

        TESTHR(pCmdByRoyalty.CreateInstance(__uuidof(Command)));

        pCmdByRoyalty->ActiveConnection = pConnection;
        pCmdByRoyalty->CommandText = "byRoyalty";
        pCmdByRoyalty->CommandType = adCmdStoredProc;
        pCmdByRoyalty->CommandTimeout = 15;

        //Define stored procedure's input parameter.
        printf("Enter Royalty :  ");
        scanf("%d",&intRoyalty);

        //Assign Integer value
        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);

        //Create a recordset by executing a command.
        pRstByRoyalty = pCmdByRoyalty->Execute(NULL,NULL,adCmdStoredProc);

        //Open the authors table to get author names for display.

        TESTHR(pRstAuthors.CreateInstance(__uuidof(Recordset)));
        hr = pRstAuthors->Open("authors",strCnn,adOpenForwardOnly,adLockReadOnly,adCmdTable);

        //Open an IADORecordBinding interface pointer which we'll use for Binding Recordset to a class
        TESTHR(pRstAuthors->QueryInterface(__uuidof(IADORecordBinding),(LPVOID*)&picRs));

        //Bind the Recordset to a C++ Class here
        TESTHR(picRs->BindToRecordset(&emprs));

        //Print current data in the recordset ,adding author names from author table.
        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();
        }
    }
    catch(_com_error &e)
    {
        // Notify the user of errors if any.
        _bstr_t bstrSource(e.Source());
        _bstr_t bstrDescription(e.Description());

         PrintProviderError(pConnection);
         printf("Source : %s \n Description : %s \n",(LPCSTR)bstrSource,(LPCSTR)bstrDescription);
    }

    // Clean up objects before exit.
    //Release the IADORecordset Interface here
    if (picRs)
        picRs->Release();

    if (pRstByRoyalty)
        if (pRstByRoyalty->State == adStateOpen)
            pRstByRoyalty->Close();
    if (pRstAuthors)
        if (pRstAuthors->State == adStateOpen)
            pRstAuthors->Close();
    if (pConnection)
        if (pConnection->State == adStateOpen)
            pConnection->Close();
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintProviderError Function                      //
//                                                       //
///////////////////////////////////////////////////////////

VOID PrintProviderError(_ConnectionPtr pConnection)
{
    // Print Provider Errors from Connection object.
    // pErr is a record object in the Connection's Error collection.
    ErrorPtr    pErr  = NULL;
    long      nCount  = 0;
    long      i     = 0;

    if( (pConnection->Errors->Count) > 0)
    {
        nCount = pConnection->Errors->Count;
        // Collection ranges from 0 to nCount -1.
        for(i = 0; i < nCount; i++)
        {
            pErr = pConnection->Errors->GetItem(i);
            printf("Error number: %x\t%s", pErr->Number,(LPCSTR)pErr->Description);
        }
    }
}

// EndActiveConnectionCpp

ActiveConnectionX.h

// BeginActiveConnectionH
#include "icrsint.h"

//This Class extracts  fname,lastname

class CEmployeeRs : public CADORecordBinding
{
BEGIN_ADO_BINDING(CEmployeeRs)

    //Column au_id is the 1st field in the 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;

};
// EndActiveConnectionH

Voir aussi

ActiveConnection, propriété | CommandText, propriété | CommandTimeout, propriété | CommandType, propriété | Direction, propriété | Size, propriété


Exemple de propriétés ActualSize et DefinedSize (VC++)

Cet exemple utilise les propriétés ActualSize et DefinedSize pour afficher la taille définie et la taille réelle d'un champ.

// BeginActualSizeCpp
#import "C:\Program Files\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <ole2.h>
#include <stdio.h>
#include "conio.h"

//Function declarations
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void ActualSizeX(VOID);
void PrintProviderError(_ConnectionPtr pConnection);

///////////////////////////////////////////////////////////
//                                                       //
//      Main Function                                    //
//                                                       //
///////////////////////////////////////////////////////////
void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;
    ActualSizeX();
    ::CoUninitialize();
}

///////////////////////////////////////////////////////////
//                                                       //
//      ActualSizeX Function                             //
//                                                       //
///////////////////////////////////////////////////////////
VOID ActualSizeX(VOID)
{
    HRESULT hr = S_OK;

    // Define ADO object pointers.
    // Initialize pointers on define.
    // These are in the ADODB::  namespace.
    _RecordsetPtr pRstStores = NULL;

    //Define Other variables
    _bstr_t strMessage;
    _bstr_t strCnn("Provider='sqloledb';Data Source='MySqlServer';"
        "Initial Catalog='pubs';Integrated Security='SSPI';");

    try
    {
        //Open a recordset for the stores table.
        TESTHR(pRstStores.CreateInstance(__uuidof(Recordset)));

        //You have to explicitly pass the Cursor type and LockType
        //to the Recordset here.
        hr = pRstStores->Open("stores",
                strCnn,adOpenForwardOnly,adLockReadOnly,adCmdTable);

        //Loop through the recordset displaying the contents
        //of the stor_name field, the field's defined size,
        //and its actual size.

        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();
            //Clear the screen for the next display
            system("cls");
            pRstStores->MoveNext();
        }
    }
    catch(_com_error &e)
    {
        _variant_t vtConnect = pRstStores->GetActiveConnection();

        // GetActiveConnection returns connect string if connection
        // is not open, else returns Connection object.
        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;
        }
    }

    // Clean up objects before exit.
    if (pRstStores)
        if (pRstStores->State == adStateOpen)
            pRstStores->Close();
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintProviderError Function                      //
//                                                       //
///////////////////////////////////////////////////////////

VOID PrintProviderError(_ConnectionPtr pConnection)
{
    // Print Provider Errors from Connection object.
    // pErr is a record object in the Connection's Error collection.
    ErrorPtr    pErr  = NULL;
    long        nCount    = 0;
    long        i     = 0;

    if( (pConnection->Errors->Count) > 0)
    {
        nCount = pConnection->Errors->Count;
        // Collection ranges from 0 to 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);
        }
    }
}
// EndActualSizeCpp

ActualSize, propriété | DefinedSize, propriété


Exemple de méthode AddNew (VC++)

Cet exemple utilise la méthode AddNew pour créer un enregistrement portant le nom indiqué.

// Note: When adding the record. You need to get the data from the user
// The employee id must be formatted as first,middle and last initial,
// five numbers,then M or F to signify the gender.For example,the
// employee id for Bill A. Sorensen would be "BAS55555M".

// BeginAddNewCpp
#import "C:\Program Files\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <ole2.h>
#include <stdio.h>
#include "conio.h"
#include "AddNewX.h"

//Function declaration
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void AddNewX(VOID);
void PrintProviderError(_ConnectionPtr pConnection);
inline int myscanf(char* strDest, int n)
{
    char strExBuff[10];
    char* pstrRet = fgets(strDest, n, stdin);

    if (pstrRet == NULL)
        return 0;

    if (!strrchr(strDest, '\n'))
        // Exhaust the input buffer.
        do
        {
            fgets(strExBuff, sizeof(strExBuff), stdin);
        }while (!strrchr(strExBuff, '\n'));
    else
        // Replace '\n' with '\0'
        strDest[strrchr(strDest, '\n') - strDest] = '\0';

    return strlen(strDest);
}

///////////////////////////////////////////////////////////
//                                                       //
//      Main Function                                    //
//                                                       //
///////////////////////////////////////////////////////////
void main()
{
    HRESULT  hr = S_OK;

    if(FAILED(::CoInitialize(NULL)))
        return;

    if (SUCCEEDED(hr))
    {
         AddNewX();

        //Wait here for the user to see the output
        printf("Press any key to continue...");
        getch();

        ::CoUninitialize();
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      AddNewX Function                                 //
//                                                       //
///////////////////////////////////////////////////////////
VOID AddNewX(VOID)
{

    // Define ADO object pointers.
    // Initialize pointers on define.
    _RecordsetPtr pRstEmployees = NULL;
    _ConnectionPtr pConnection  = NULL;

    //Define Other variables
    IADORecordBinding *picRs = NULL;  //Interface Pointer declared.(VC++ Extensions)
    CEmployeeRs emprs;    //C++ class object

    HRESULT hr = S_OK;

                            //Replace Data Source value with your server name.
    _bstr_t strCnn("Provider='sqloledb';Data Source='MySqlServer';"
        "Initial Catalog='pubs';Integrated Security='SSPI';");
    _bstr_t strId;
    _bstr_t strMessage;

    try
    {
        //Open a connection
        TESTHR(pConnection.CreateInstance(__uuidof(Connection)));
        pConnection->Open(strCnn,"","",adConnectUnspecified);

        //Open employee table
        TESTHR(pRstEmployees.CreateInstance(__uuidof(Recordset)));

        //You have to explicitly pass the Cursor type and LockType to the Recordset here
        pRstEmployees->Open("employee",_variant_t((IDispatch *) pConnection, true),
            adOpenKeyset,adLockOptimistic,adCmdTable);

        //Open an IADORecordBinding interface pointer which we'll use for Binding
        //Recordset to a class
        TESTHR(pRstEmployees->QueryInterface(__uuidof(IADORecordBinding),(LPVOID*)&picRs));

        //Bind the Recordset to a C++ Class here
        TESTHR(picRs->BindToRecordset(&emprs));

        // Get data from the user.The employee id must be formatted as
        // first,middle and last initial,five numbers,then M or F to
        // signify the gender.For example,the employee id for
        // Bill A. Sorensen would be "BAS55555M".

        printf("Enter Employee Id: ");
        myscanf(emprs.m_sz_empid, sizeof(emprs.m_sz_empid));
        strId = emprs.m_sz_empid;
        printf("Enter First Name: ");
        myscanf(emprs.m_sz_fname, sizeof(emprs.m_sz_fname));
        printf("Enter Last Name:");
        myscanf(emprs.m_sz_lname, sizeof(emprs.m_sz_lname));

        //Proceed if the user actually entered some thing
        //for the id, the first and the last name.

        if(strcmp(emprs.m_sz_empid,"")  && strcmp(emprs.m_sz_fname,"") &&
            strcmp(emprs.m_sz_lname,""))
        {
            //This adds a new record to the table
            //if (FAILED(hr = picRs->AddNew(&emprs)))
            //_com_issue_error(hr);
            TESTHR(picRs->AddNew(&emprs));

            //Show the newly added data
            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");

        //Delete the new record because this is a demonstration.
        pConnection->Execute("DELETE FROM EMPLOYEE WHERE emp_id = '"+strId+"'",
            NULL,adCmdText);
    }
    catch(_com_error &e)
    {
        // Notify the user of errors if any.
        _variant_t vtConnect = pRstEmployees->GetActiveConnection();

        // GetActiveConnection returns connect string if connection
        // is not open, else returns Connection object.
        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;
        }

    }

    // Clean up objects before exit.
    //Release the IADORecordset Interface here
    if (picRs)
        picRs->Release();

    if (pRstEmployees)
        if (pRstEmployees->State == adStateOpen)
            pRstEmployees->Close();
    if (pConnection)
        if (pConnection->State == adStateOpen)
            pConnection->Close();
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintProviderError Function                      //
//                                                       //
///////////////////////////////////////////////////////////

VOID PrintProviderError(_ConnectionPtr pConnection)
{
    // Print Provider Errors from Connection object.
    // pErr is a record object in the Connection's Error collection.
    ErrorPtr  pErr = NULL;
    long      nCount = 0;
    long      i = 0;

    if( (pConnection->Errors->Count) > 0)
    {
        nCount = pConnection->Errors->Count;
        // Collection ranges from 0 to 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);
        }
    }
}
// EndAddNewCpp

AddNewX.h

// BeginAddNewH
#include "icrsint.h"

//This Class extracts empid, fname and lastname

class CEmployeeRs : public CADORecordBinding
{
BEGIN_ADO_BINDING(CEmployeeRs)

    //Column empid is the 1st field in the 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;

};
// EndAddNewH

AddNew, méthode | Recordset, objet


Exemple de méthodes Append et CreateParameter (VC++)

Cet exemple utilise les méthodes Append et CreateParameter pour exécuter une procédure stockée avec un paramètres d'entrée.

// BeginAppendCpp
#import "C:\Program Files\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <ole2.h>
#include <stdio.h>
#include "conio.h"
#include "AppendX.h"

//Function declaration
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void AppendX(VOID);
void PrintProviderError(_ConnectionPtr pConnection);

///////////////////////////////////////////////////////////
//                                                       //
//      Main Function                                    //
//                                                       //
///////////////////////////////////////////////////////////
void main()
{
    HRESULT  hr = S_OK;

    if(FAILED(::CoInitialize(NULL)))
        return;

    AppendX();

    //Wait here for the user to see the output.
    printf("\n\nPress any key to continue...");
    getch();
    ::CoUninitialize();
}

///////////////////////////////////////////////////////////
//                                                       //
//      AppendX Function                                 //
//                                                       //
///////////////////////////////////////////////////////////
VOID  AppendX(VOID)
{

    HRESULT hr = S_OK;

    // Define ADO object pointers.
    // Initialize pointers on define.
    // These are in the ADODB::  namespace.
    _RecordsetPtr pRstByRoyalty = NULL;
    _RecordsetPtr pRstAuthors = NULL;
    _CommandPtr pcmdByRoyalty = NULL;
    _ParameterPtr pprmByRoyalty = NULL;
    _ConnectionPtr pConnection = NULL;

    //Define Other variables
    IADORecordBinding *picRs = NULL;    //Interface Pointer declared.(VC++ Extensions)
    CEmployeeRs emprs;                  //C++ class object

    _bstr_t strCnn("Provider='sqloledb';Data Source='MySqlServer';"
        "Initial Catalog='pubs';Integrated Security='SSPI';");

    _bstr_t strMessage, strAuthorID;

    int intRoyalty;
    VARIANT vtRoyalty;

    try
    {
        //Open a Connection.
        TESTHR(pConnection.CreateInstance(__uuidof(Connection)));
        hr = pConnection->Open(strCnn,"","",adConnectUnspecified);
        pConnection->CursorLocation = adUseClient;

        //Open Command Object with one Parameter
        TESTHR(pcmdByRoyalty.CreateInstance(__uuidof(Command)));
        pcmdByRoyalty->CommandText = "byroyalty";
        pcmdByRoyalty->CommandType = adCmdStoredProc;

        //Get parameter value and append parameter
        printf("Enter Royalty: ");
        scanf("%d",&intRoyalty);

        //Define Integer/variant.
        vtRoyalty.vt = VT_I2;
        vtRoyalty.iVal = intRoyalty;
        pprmByRoyalty = pcmdByRoyalty->CreateParameter("percentage",adInteger,adParamInput,sizeof(int),vtRoyalty);
        pcmdByRoyalty->Parameters->Append(pprmByRoyalty);

        pprmByRoyalty->Value  = vtRoyalty;

        //Create Recordset by executing the command
        pcmdByRoyalty->ActiveConnection = pConnection;
        pRstByRoyalty = pcmdByRoyalty->Execute(NULL,NULL,adCmdStoredProc);

        //Open the authors table to get author names for display
        TESTHR(pRstAuthors.CreateInstance(__uuidof(Recordset)));

        //You have to explicitly pass the default Cursor type and LockType to the Recordset here
        hr = pRstAuthors->Open("authors",_variant_t((IDispatch*)pConnection,true),adOpenForwardOnly,adLockReadOnly,adCmdTable);

        //Open an IADORecordBinding interface pointer which we'll use for Binding Recordset to a class
        TESTHR(pRstAuthors->QueryInterface(__uuidof(IADORecordBinding),(LPVOID*)&picRs));

        //Bind the Recordset to a C++ Class here
        TESTHR(picRs->BindToRecordset(&emprs));

        //Print current data in the recordset, adding
        //author names from author table.
        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();
        }
    }
    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);
    }

    // Clean up objects before exit.
    //Release the IADORecordset Interface here
    if (picRs)
        picRs->Release();

    if (pRstByRoyalty)
        if (pRstByRoyalty->State == adStateOpen)
            pRstByRoyalty->Close();
    if (pRstAuthors)
        if (pRstAuthors->State == adStateOpen)
            pRstAuthors->Close();
    if (pConnection)
        if (pConnection->State == adStateOpen)
            pConnection->Close();
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintProviderError Function                      //
//                                                       //
///////////////////////////////////////////////////////////

VOID PrintProviderError(_ConnectionPtr pConnection)
{
    // Print Provider Errors from Connection object.
    // pErr is a record object in the Connection's Error collection.
    ErrorPtr    pErr = NULL;
    long        nCount = 0;
    long        i = 0;

    if( (pConnection->Errors->Count) > 0)
    {
        nCount = pConnection->Errors->Count;
        // Collection ranges from 0 to 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);
        }
    }
}
// EndAppendCpp

AppendX.h

// BeginAppendH
#include "icrsint.h"

//This Class extracts only author id,fname,lastname

class CEmployeeRs : public CADORecordBinding
{
BEGIN_ADO_BINDING(CEmployeeRs)

    //Column au_id is the 1st field in the 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;

};
// EndAppendH

Append, méthode | CreateParameter, méthode


Exemple de méthodes AppendChunk et GetChunk (VC++)

Cet exemple utilise les méthodes AppendChunk et GetChunk pour ajouter dans un champ d'image des données provenant d'un autre enregistrement.

// BeginAppendChunkCpp
#import "C:\Program Files\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"

//Function declarations
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void AppendChunkX(VOID);
void PrintProviderError(_ConnectionPtr pConnection);
inline int myscanf(char* strDest, int n)
{
    char strExBuff[10];
    char* pstrRet = fgets(strDest, n, stdin);

    if (pstrRet == NULL)
        return 0;

    if (!strrchr(strDest, '\n'))
        // Exhaust the input buffer.
        do
        {
            fgets(strExBuff, sizeof(strExBuff), stdin);
        }while (!strrchr(strExBuff, '\n'));
    else
        // Replace '\n' with '\0'
        strDest[strrchr(strDest, '\n') - strDest] = '\0';

    return strlen(strDest);
}
inline char* mygets(char* strDest, int n)
{
    char strExBuff[10];
    char* pstrRet = fgets(strDest, n, stdin);

    if (pstrRet == NULL)
        return NULL;

    if (!strrchr(strDest, '\n'))
        // Exhaust the input buffer.
        do
        {
            fgets(strExBuff, sizeof(strExBuff), stdin);
        }while (!strrchr(strExBuff, '\n'));
    else
        // Replace '\n' with '\0'
        strDest[strrchr(strDest, '\n') - strDest] = '\0';

    return pstrRet;
}

///////////////////////////////////////////////////////////
//                                                       //
//      Main Function                                    //
//                                                       //
///////////////////////////////////////////////////////////
void main()
{
    HRESULT  hr = S_OK;

    if(FAILED(::CoInitialize(NULL)))
        return;

    AppendChunkX();

    //Wait here for the user to see the output
    printf("\n\nPress any key to continue..");
    getch();
    ::CoUninitialize();
}

///////////////////////////////////////////////////////////
//                                                       //
//      AppendChunkX Function                            //
//                                                       //
///////////////////////////////////////////////////////////
VOID  AppendChunkX(VOID)
{
    // Define ADO object pointers.
    // Initialize pointers on define.
    // These are in the ADODB::  namespace.
    _RecordsetPtr pRstPubInfo = NULL;
    _ConnectionPtr pConnection = NULL;

    //Define other variables
    IADORecordBinding   *picRs = NULL;  //Interface Pointer declared.(VC++ Extensions)
    CPubInfoRs pubrs;          //C++ class object

    HRESULT hr = S_OK;
    _bstr_t strCnn("Provider='sqloledb';Data Source='MySqlServer';"
        "Initial Catalog='pubs';Integrated Security='SSPI';");

    _bstr_t strMessage,strPubID,strPRInfo;
    _variant_t varChunk;
    long lngOffSet,lngLogoSize;
    char pubId[50];
    lngOffSet = 0;

    UCHAR chData;
    SAFEARRAY FAR *psa;
    SAFEARRAYBOUND rgsabound[1];
    rgsabound[0].lLbound = 0;
    rgsabound[0].cElements = ChunkSize;

    try
    {
        //Open a Connection.
        TESTHR(pConnection.CreateInstance(__uuidof(Connection)));
        hr = pConnection->Open(strCnn,"","",adConnectUnspecified);

        TESTHR(hr= pRstPubInfo.CreateInstance(__uuidof(Recordset)));

        pRstPubInfo->CursorType = adOpenKeyset;
        pRstPubInfo->LockType = adLockOptimistic;

        hr = pRstPubInfo->Open("pub_info",
            _variant_t((IDispatch*)pConnection,true),
            adOpenKeyset,adLockOptimistic,adCmdTable);

        //Open an IADORecordBinding interface pointer which we'll use
        //for Binding Recordset to a class
        TESTHR(pRstPubInfo->QueryInterface(
            __uuidof(IADORecordBinding),(LPVOID*)&picRs));

        //Bind the Recordset to a C++ Class here
        TESTHR(picRs->BindToRecordset(&pubrs));

        //Display the available logos here
        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,","));

            //Display 5 records at a time and wait for user to continue..
            if (++Counter >= 5)
            {
                Counter = 0;
                printf("\nPress any key to continue...");
                getch();
            }
            pRstPubInfo->MoveNext();
        }

        //Prompt For a Logo to Copy
        printf("\nEnter the ID of a logo to copy: ");
        myscanf(pubId, sizeof(pubId));
        strPubID = pubId;

        //Copy the logo to a variable in chunks

        pRstPubInfo->Filter = "pub_id = '"  + strPubID + "'";
        lngLogoSize = pRstPubInfo->Fields->Item["logo"]->ActualSize;

        //Create a safe array to store the array of BYTES
        rgsabound[0].cElements = lngLogoSize;
        psa = SafeArrayCreate(VT_UI1,1,rgsabound);

        long index1 = 0;
        while(lngOffSet < lngLogoSize)
        {
            varChunk = pRstPubInfo->Fields->
                        Item["logo"]->GetChunk(ChunkSize);

            //Copy the data only upto the Actual Size of Field.
            for(long index=0;index<=(ChunkSize-1);index++)
            {
                hr= SafeArrayGetElement(varChunk.parray,&index,&chData);
                if(SUCCEEDED(hr))
                {
                    //Take BYTE by BYTE and advance Memory Location
                    hr = SafeArrayPutElement(psa,&index1,&chData);
                    index1++;
                }
                else
                    break;
            }
            lngOffSet = lngOffSet + ChunkSize;
        }
        lngOffSet = 0;

        printf("Enter a new Pub Id: ");
        myscanf(pubrs.m_sz_pubid, sizeof(pubrs.m_sz_pubid));
        strPubID = pubrs.m_sz_pubid;
        printf("Enter descriptive text: " );
        mygets(pubrs.m_sz_prinfo, sizeof(pubrs.m_sz_prinfo));

        pRstPubInfo->AddNew();
        pRstPubInfo->Fields->GetItem("pub_id")->PutValue(strPubID);
        pRstPubInfo->Fields->GetItem("pr_info")->
            PutValue(pubrs.m_sz_prinfo);

        //Assign the Safe array  to a variant.
        varChunk.vt = VT_ARRAY|VT_UI1;
        varChunk.parray = psa;
        hr = pRstPubInfo->Fields->GetItem("logo")->
                AppendChunk(varChunk);

        //Update the table
        pRstPubInfo->Update();

        lngLogoSize = pRstPubInfo->Fields->Item["logo"]->ActualSize;

        //Show the newly added record.
        printf("New Record : %s\n Description : %s\n Logo Size : %s",
            pubrs.m_sz_pubid,
            pubrs.m_sz_prinfo,(LPCSTR)(_bstr_t)pRstPubInfo->Fields->
            Item["logo"]->ActualSize);

        //Delete new record because this is demonstration.
        pConnection->Execute("DELETE FROM PUB_INFO WHERE pub_id = '"
                        + strPubID +"'",NULL,adCmdText);
    }
    catch(_com_error &e)
    {
         // Notify the user of errors if any.
        _bstr_t bstrSource(e.Source());
        _bstr_t bstrDescription(e.Description());

        PrintProviderError(pConnection);
        printf("Source : %s \n Description : %s\n",(LPCSTR)bstrSource,
            (LPCSTR)bstrDescription);
    }

    // Clean up objects before exit.
    if (pRstPubInfo)
        if (pRstPubInfo->State == adStateOpen)
            pRstPubInfo->Close();
    if (pConnection)
        if (pConnection->State == adStateOpen)
            pConnection->Close();
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintProviderError Function                      //
//                                                       //
///////////////////////////////////////////////////////////

VOID PrintProviderError(_ConnectionPtr pConnection)
{
    // Print Provider Errors from Connection object.
    // pErr is a record object in the Connection's Error collection.
    ErrorPtr    pErr = NULL;
    long        nCount = 0;
    long        i = 0;

    if( (pConnection->Errors->Count) > 0)
    {
        nCount = pConnection->Errors->Count;
        // Collection ranges from 0 to 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);
        }
    }
}

// EndAppendChunkCpp

AppendChunkX.h

// BeginAppendChunkH
#include "icrsint.h"

//This Class extracts pubid,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;
};
// EndAppendChunkH

AppendChunk, méthode | Field, objet | GetChunk, méthode


Exemple de propriétés Attributes et Name (VC++)

Cet exemple affiche la valeur de la propriété Attributes pour les objets Connection, Field et Property. Il utilise la propriété Name pour afficher le nom de chaque objet Field et Property.

// BeginAttributesCpp
#import "C:\Program Files\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <ole2.h>
#include <stdio.h>
#include <conio.h>

// Function declarations
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void AttributesX();
void PrintProviderError(_ConnectionPtr pConnection);
void PrintComError(_com_error &e);

///////////////////////////////////////////////////////////
//                                                       //
//      Main Function                                    //
//                                                       //
///////////////////////////////////////////////////////////

void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    AttributesX();

    //Wait here for user to see the output..
    printf("\nPress any key to continue...");
    getch();

    ::CoUninitialize();
}

///////////////////////////////////////////////////////////
//                                                       //
//      AttributesX Function                             //
//                                                       //
///////////////////////////////////////////////////////////

void AttributesX()
{
    // Define ADO object pointers.
    // Initialize pointers on define.
    // These are in the ADODB::  namespace
    _RecordsetPtr pRstEmployee  = NULL;
    _ConnectionPtr pConnection = NULL;
    FieldsPtr fldLoop = NULL;
    PropertiesPtr proLoop = NULL;

    //Define Other Variables
    HRESULT  hr = S_OK;
    _variant_t Index;
    Index.vt = VT_I2;
    int j=0;
    //Open a recordset using a Client Cursor
    //For the Employee Table
    _bstr_t strCnn("Provider='sqloledb';Data Source='MySqlServer';"
    "Initial Catalog='pubs';Integrated Security='SSPI';");

    try
    {
        // open connection and record set
        TESTHR(pConnection.CreateInstance(__uuidof(Connection)));
        pConnection->Open(strCnn,"","",adConnectUnspecified);

        TESTHR(pRstEmployee.CreateInstance(__uuidof(Recordset)));
        pRstEmployee->Open("Employee", _variant_t((IDispatch *)pConnection,true), adOpenForwardOnly,
            adLockReadOnly, adCmdTable);

        // Display the attributes of Connection.
        printf("Connection attributes: %d \n", pConnection->Attributes);

        // Display the attribute of the employee table's
        //fields
        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());
        }

        // Display Fields of the Employee table which are NULLBALE
        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());
                }
        }

        // Display the attributes of the Employee tables's
        // properties
        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();

                //Clear the screen for the next display
                system("cls");
                j=0;
            }

        }
    }
    catch(_com_error &e)
    {
        // Notify the user of errors if any.

        PrintProviderError(pConnection);
        PrintComError(e);
    }

    // Clean up objects before exit.
    if (pRstEmployee)
        if (pRstEmployee->State == adStateOpen)
            pRstEmployee->Close();
    if (pConnection)
        if (pConnection->State == adStateOpen)
            pConnection->Close();
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintProviderError Function                      //
//                                                       //
///////////////////////////////////////////////////////////

void PrintProviderError(_ConnectionPtr pConnection)
{
    // Print Provider Errors from Connection object.

    // pErr is a record object in the Connection's Error collection.
    ErrorPtr    pErr  = NULL;
    long      nCount  = 0;
    long       i    = 0;

    if( (pConnection->Errors->Count) > 0)
    {
        nCount = pConnection->Errors->Count;

        // Collection ranges from 0 to 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 Function                           //
//                                                       //
///////////////////////////////////////////////////////////

VOID PrintComError(_com_error &e)
{
    _bstr_t bstrSource(e.Source());
    _bstr_t bstrDescription(e.Description());

    // Print Com errors.
    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);
}
// EndAttributesCpp

AttributesX.h

// BeginAttributesH
#include "icrsint.h"

//This class extracts LastName, FirstName, FaxPhone from Employees table

class CEmployeeRs : public CADORecordBinding
{
BEGIN_ADO_BINDING(CEmployeeRs)

        // Column LastName is the 2nd field in the table
        ADO_VARIABLE_LENGTH_ENTRY2(2,adVarChar,m_szemp_LastName,
            sizeof(m_szemp_LastName),lemp_LastNameStatus,TRUE)

        // Column FirstName is the 17th field in the table
        ADO_VARIABLE_LENGTH_ENTRY2(17,adVarChar,m_szemp_FirstName,
            sizeof(m_szemp_FirstName),lemp_FirstNameStatus,TRUE)

        // Column FaxPhone is the 18th field in the table
        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;
};

// EndAttributesH

Voir aussi

Attributes, propriété | Connection, objet | Field, objet | Name, propriété | Property, objet


Exemple de méthodes BeginTrans, CommitTrans et RollbackTrans (VC++)

Cet exemple change le type de tous les livres de psychologie figurant dans la table Titles de la base de données. Une fois que la méthode BeginTrans a commencé une transaction qui identifie toutes les modifications effectuées dans la table Titles, la méthode CommitTrans enregistre ces modifications. Vous pouvez utiliser la méthode Rollback pour annuler les modifications que vous avez enregistrées à l'aide de la méthode Update.

// BeginBeginTransCpp
#import "C:\Program Files\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();

    //Wait here for user to see the output.
    printf("\nPress any key to continue...");
    getch();

    ::CoUninitialize();
}

///////////////////////////////////////////////////////////
//                                                       //
//      BeginTransX Function                             //
//                                                       //
///////////////////////////////////////////////////////////

void BeginTransX()
{
    // Define ADO object pointers.
    // Initialize pointers on define.
    // These are in the ADODB::  namespace.
    _RecordsetPtr rstTitles = NULL;
    _ConnectionPtr pConnection = NULL;

    //Define Other Variables
    HRESULT hr = S_OK;
    IADORecordBinding   *picRs = NULL;  //Interface Pointer declared...
    CTitlesRs titlrs;
    _bstr_t strTitle;
    _bstr_t strMessage;
    LPSTR p_TempStr = NULL;
    char chKey;
    int i = 0;

    try
    {
        // open connection.
        _bstr_t strCnn("Provider='sqloledb';Data Source='MySqlServer';"
            "Initial Catalog='pubs';Integrated Security='SSPI';");

        TESTHR(pConnection.CreateInstance(__uuidof(Connection)));

        TESTHR(pConnection->Open(strCnn,"","",adConnectUnspecified));

        rstTitles.CreateInstance(__uuidof(Recordset));

        rstTitles->CursorType = adOpenDynamic;
        rstTitles->LockType = adLockPessimistic;

        // open Titles table
        TESTHR(rstTitles->Open("titles",
            _variant_t((IDispatch*)pConnection,true),
            adOpenDynamic, adLockPessimistic,adCmdTable));

        rstTitles->MoveFirst();
        pConnection->BeginTrans();

        //Open an IADORecordBinding interface pointer which
        //we'll use for Binding Recordset to a class
        TESTHR(rstTitles->QueryInterface(
            __uuidof(IADORecordBinding), (LPVOID*)&picRs));

        //Bind the Recordset to a C++ Class here
        TESTHR(picRs->BindToRecordset(&titlrs));

        // Loop through recordset and ask user if he wants
        // to change the type for a specified title.
        // Allocate memory to p_TempStr string pointer.
        p_TempStr = (LPSTR) malloc(sizeof(titlrs.m_szT_type));

        // Check for null string.
        assert(p_TempStr != NULL);
        while (VARIANT_FALSE == rstTitles->EndOfFile)
        {
            // Set the final character of the destination string to NULL.
            p_TempStr[sizeof(titlrs.m_szT_type)-1] = '\0';
            // The source string will get truncated if its length is
            // longer than the length of the destination string minus one.
            strncpy(p_TempStr,strtok(titlrs.m_szT_type," "),sizeof(titlrs.m_szT_type)-1);

            // Compare type with psychology
            if (!strcmp(p_TempStr,"psychology"))
            {
                strTitle = titlrs.m_szT_title;
                strMessage = "Title: " + strTitle +
                        "\n Change type to Self help?(y/n)";

                // Change the title for specified employee
                printf("%s\n",(LPCSTR)strMessage);
                do
                {
                    chKey = getch();
                }while(chKey != 'y' && chKey !='n');
                if(chKey == 'y')
                {
                    // Set the final character of the destination string to NULL.
                    titlrs.m_szT_type[sizeof(titlrs.m_szT_type)-1] = '\0';
                    // Copy "self_help" title field.
                    // The source string will get truncated if its length is
                    // longer than the length of the destination string minus one.
                    strncpy(titlrs.m_szT_type,"self_help", sizeof(titlrs.m_szT_type)-1);
                    picRs->Update(&titlrs);
                }
            }
            rstTitles->MoveNext();
        }
        // Ask if the User wants to commit to all the
        // changes made above
        printf("\n\n Save all changes(y/n)?");
        do
        {
            chKey = getch();
        }while(chKey != 'y' && chKey !='n');

        if(chKey == 'y')

            // Save the changes to the title table
            pConnection->CommitTrans();
        else
            // Unsave the changes to the title table
            pConnection->RollbackTrans();

        // Print current data in recordset.
        rstTitles->Requery(0);

        // Move to the first record of the title table
        rstTitles->MoveFirst();
        printf("\n\nPress any key to continue...");
        getch();

        // Clear the screen for the next display
        //system("cls");

        // Open IADORecordBinding interface pointer again
        // for binding Recordset to a class.
        TESTHR(rstTitles->QueryInterface(
            __uuidof(IADORecordBinding),
            (LPVOID*)&picRs));

        // Rebind the Recordset to a C++ Class.
        TESTHR(picRs->BindToRecordset(&titlrs));

        while (!rstTitles->EndOfFile)
        {
            i= i+1;
            if (i % 23 == 0)
            {
                printf("\nPress any key to continue...");
                getch();

                //Clear the screen for the next display
                //system("cls");
            }
            printf("%s -  %s\n",titlrs.m_szT_title,titlrs.m_szT_type);
            rstTitles->MoveNext();
        }
        // Restore original data becasue this is a demonstration.
        rstTitles->MoveFirst();

        while (VARIANT_FALSE == rstTitles->EndOfFile)
        {
            // Set the final character of the destination string to NULL.
            p_TempStr[sizeof(titlrs.m_szT_type)-1] = '\0';
            // The source string will get truncated if its length is
            // longer than the length of the destination string minus one.
            strncpy(p_TempStr,titlrs.m_szT_type,sizeof(titlrs.m_szT_type)-1);
            p_TempStr = strtok(p_TempStr," ");

            if (!strcmp(p_TempStr,"self_help"))
            {
                // Set the final character of the destination string to NULL.
                titlrs.m_szT_type[sizeof(titlrs.m_szT_type)-1] = '\0';
                // The source string will get truncated if its length is
                // longer than the length of the destination string minus one.
                strncpy(titlrs.m_szT_type,"psychology",sizeof(titlrs.m_szT_type)-1);
                picRs->Update(&titlrs);
            }
            rstTitles->MoveNext();
        }
    }
    catch(_com_error &e)
    {
        // Notify the user of errors if any.
        _bstr_t bstrSource(e.Source());
        _bstr_t bstrDescription(e.Description());

        PrintProviderError(pConnection);

        printf("Source : %s\n",(LPCSTR)bstrSource);
        printf("Description : %s\n",(LPCSTR)bstrDescription);
    }

    // Deallocate the memory
    if (p_TempStr)
        free(p_TempStr);
    // Clean up objects before exit.
    //Release the IADORecordset Interface here
    if (picRs)
        picRs->Release();

    if (rstTitles)
        if (rstTitles->State == adStateOpen)
            rstTitles->Close();
    if (pConnection)
        if (pConnection->State == adStateOpen)
            pConnection->Close();
};

///////////////////////////////////////////////////////////
//                                                       //
//      PrintProviderError Function                      //
//                                                       //
///////////////////////////////////////////////////////////

void PrintProviderError(_ConnectionPtr pConnection)
{
    // Print Provider Errors from Connection object.
    // pErr is a record object in the Connection's Error collection.
    ErrorPtr  pErr    = NULL;
    long      nCount  = 0;
    long      i       = 0;

    if( (pConnection->Errors->Count) > 0)
    {
        nCount = pConnection->Errors->Count;
        // Collection ranges from 0 to 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);
        }
    }
}
// EndBeginTransCpp

BeginTransX.h

// BeginBeginTransH
#include "icrsint.h"

//This Class extracts only title and type
class CTitlesRs : public CADORecordBinding
{
BEGIN_ADO_BINDING(CTitlesRs)
    //Column title is the 2nd field in the recordset
    ADO_VARIABLE_LENGTH_ENTRY2(2, adVarChar, m_szT_title,
         sizeof(m_szT_title), lT_titleStatus, FALSE)

    //Column type is the 3rd field in the 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;
};
// EndBeginTransH

Voir aussi

BeginTrans, CommitTrans et RollbackTrans, méthodes | Update, méthode


Exemple de propriétés BOF, EOF et Bookmark (VC++)

La première fonction de cet exemple utilise les propriétés BOF et EOF pour afficher un message lorsqu'un utilisateur tente d'aller au-delà du premier ou du dernier enregistrement d'un objet Recordset. Il utilise également la propriété Bookmark qui permet à l'utilisateur de marquer un enregistrement dans un objet Recordset pour y revenir ultérieurement.

La seconde fonction utilise la propriété Bookmark pour placer la propriété Bookmark de chacun des autres objets Recordset dans un tableau, puis filtre l'objet Recordset à l'aide de ce tableau.

// BeginBOFCpp
#import "C:\Program Files\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <ole2.h>
#include <stdio.h>
#include <conio.h>
#include "BofEofBookmark.h"

// Function declarations
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 Function                                    //
//                                                       //
///////////////////////////////////////////////////////////

void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    BOFX();

    //Clear the screen for the next display
    system("cls");

    BookmarkX();

    printf("Press any key to continue...");
    getch();

    ::CoUninitialize();
}

///////////////////////////////////////////////////////////
//                                                       //
//      BOFX Function                                    //
//                                                       //
///////////////////////////////////////////////////////////

void BOFX(void)
{
    // Define ADO object pointers.
    // Initialize pointers on define.
    // These are in the ADODB::  namespace
    _RecordsetPtr rstPublishers = NULL;

    //Define Other Variables
    HRESULT hr = S_OK;
    IADORecordBinding  *picRs = NULL;    //Interface Pointer declared.
    CPublishers Publs;

    bstr_t strCnn("Provider='sqloledb';Data Source='MySqlServer';"
        "Initial Catalog='pubs';Integrated Security='SSPI';");
    _bstr_t strMessage;
    _variant_t VarBookmark;
    int intCommand = 0;
    _variant_t TempPublisher;

    try
    {
        // Open recordset with data from Publishers table.
        TESTHR(rstPublishers.CreateInstance(__uuidof(Recordset)));
        rstPublishers->CursorType = adOpenStatic;

        // Use client cursor to enable absolutePosition property.
        rstPublishers->CursorLocation = adUseClient;
        rstPublishers->Open("select pub_id, pub_name from publishers"
            " order by pub_name", strCnn, adOpenStatic,
            adLockBatchOptimistic, adCmdText);

        //Open an IADORecordBinding interface pointer
        //which will be used for Binding Recordset to a class
        TESTHR(rstPublishers->QueryInterface(
            __uuidof(IADORecordBinding), (LPVOID*)&picRs));

        //Bind the Recordset to a C++ Class here
        TESTHR(picRs->BindToRecordset(&Publs));

        rstPublishers->MoveFirst();

         while (true)    // Continuous loop.
        {
            // Display information about the current record
            // and get user input
            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;    // Out of range entry exits program loop.

            switch(intCommand)
            {
                // Move forward or backward, trapping for BOF or EOF
                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;

                // store the bookmark of the current record.
                case 3:
                    VarBookmark = rstPublishers->Bookmark;
                    // Go to the record indicated by the
                    // stored bookmark
                    break;

                case 4:
                    // Check for whether bookmark set for a record
                    if (VarBookmark.vt == VT_EMPTY)
                        printf("No Bookmark set!\n");
                    else
                        rstPublishers->Bookmark = VarBookmark;
                    break;

                default:
                    break;
            }
        }
    }
    catch (_com_error &e)
    {
        printf("Error in BOFx...\n");
        // Notify the user of errors if any.
        _variant_t vtConnect = rstPublishers->GetActiveConnection();

        // GetActiveConnection returns connect string if connection
        // is not open, else returns Connection object.
        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();
    }

    // Clean up objects before exit.
    //Release the IADORecordset Interface here
    if (picRs)
        picRs->Release();

    if (rstPublishers)
        if (rstPublishers->State == adStateOpen)
            rstPublishers->Close();
}

///////////////////////////////////////////////////////////
//                                                       //
//      BookmarkX Function                               //
//                                                       //
///////////////////////////////////////////////////////////

void BookmarkX(void)
{
    // Define ADO object pointers.
    // Initialize pointers on define.
    // These are in the ADODB::  namespace.
    _RecordsetPtr rstAuthors = NULL;

    //Define Other Variables
    IADORecordBinding *picRs = NULL; //Interface Pointer declared.
    CAuthors Authrs;
    HRESULT  hr = S_OK;
    _bstr_t  strCnn("Provider='sqloledb';Data Source='MySqlServer';"
              "Initial Catalog='pubs';Integrated Security='SSPI';");
    _variant_t vBookmark;

    // Variable declaration for safe arrays.
    SAFEARRAY FAR* psa;

    // define ARRAY/ VARIANT variant.
    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));
        // Set The Cursor Location
        rstAuthors->CursorLocation  = adUseClient;
        rstAuthors->PutActiveConnection((_variant_t)strCnn);

        // Open Authors table
        TESTHR(rstAuthors->Open("select * from authors",strCnn,
            adOpenStatic,adLockBatchOptimistic,adCmdText));

        //Open an IADORecordBinding interface pointer
        //which we'll use for binding Recordset to a class
        TESTHR(rstAuthors->QueryInterface(__uuidof(IADORecordBinding),
                (LPVOID*)&picRs));

        //Bind the Recordset to a C++ Class here
        TESTHR(picRs->BindToRecordset(&Authrs));

        printf("Number of Records before filtering:  %d\n",
                rstAuthors->RecordCount);

        // Create safearrays to store array of variant
        psa = SafeArrayCreate(VT_VARIANT,1,rgsabound);

        // Store bookmark of every other record into an array.
        while ((!rstAuthors->EndOfFile) && (ii < 11))
        {
            SafeArrayPutElement(psa,&ii,&rstAuthors->Bookmark);
            //ii = ii +1;
            ii++;
            rstAuthors->Move(2);
        }

        vBookmark.parray = psa;

        // Filter the Record with the array of bookmarks.
        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();
        }
    }
    catch (_com_error &e)
    {
        // Notify the user of errors if any.
        _variant_t vtConnect = rstAuthors->GetActiveConnection();

        // GetActiveConnection returns connect string if connection
        // is not open, else returns Connection object.
        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;
        }
    }

    // Clean up objects before exit.
    //Release the IADORecordset Interface here
    if (picRs)
        picRs->Release();

    if (rstAuthors)
        if (rstAuthors->State == adStateOpen)
            rstAuthors->Close();
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintProviderError Function                      //
//                                                       //
///////////////////////////////////////////////////////////

void PrintProviderError(_ConnectionPtr pConnection)
{
    // Print Provider Errors from Connection object.
    // pErr is a record object in the Connection's Error collection.
    ErrorPtr  pErr    = NULL;
    long      nCount  = 0;
    long      i       = 0;

    if( (pConnection->Errors->Count) > 0)
    {
        nCount = pConnection->Errors->Count;
        // Collection ranges from 0 to 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);
        }
    }
}
// EndBOFCpp

BofEofBookmark.h

// BeginBOFEOFH
#include "icrsint.h"

//This Class extracts only pubid,lastname and hire_date
class CPublishers : public CADORecordBinding
{
BEGIN_ADO_BINDING(CPublishers)

    //Column title is the 2nd field in the recordset
    ADO_VARIABLE_LENGTH_ENTRY2(1, adVarChar, m_szP_pubid,
        sizeof(m_szP_pubid), lP_pubidStatus, FALSE)

    //Column type is the 3rd field in the 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;
};

//This Class extracts only authorlastname

class CAuthors : public CADORecordBinding
{
BEGIN_ADO_BINDING(CAuthors)

    //Column authorlname is the 2nd field in the 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;
};
// EndBOFEOFH

Voir aussi

BOF, EOF, propriétés | Bookmark, propriété | Recordset, objet


Exemple de propriété CacheSize (VC++)

Cet exemple utilise la propriété CacheSize pour illustrer l'amélioration des performances lorsque 30 enregistrements sont mis en mémoire cache durant une opération.

// BeginCacheSizeCpp
#import "C:\Program Files\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <ole2.h>
#include <stdio.h>
#include <conio.h>
#include <winbase.h>

// Function declarations
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void CacheSizeX();
void PrintProviderError(_ConnectionPtr pConnection);
void PrintComError(_com_error &e);

///////////////////////////////////////////////////////////
//                                                       //
//      Main Function                                    //
//                                                       //
///////////////////////////////////////////////////////////

void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    CacheSizeX();

    //Wait here for user to see the output..
    printf("\nPress any key to continue...");
    getch();

    ::CoUninitialize();
}

///////////////////////////////////////////////////////////
//                                                       //
//      CacheSizeX Function                              //
//                                                       //
///////////////////////////////////////////////////////////

void CacheSizeX()
{
    // Define ADO object pointers.
    // Initialize pointers on define.
    // These are in the ADODB::  namespace
     _RecordsetPtr    pRstRoySched  = NULL;

     //Define Other Variables
    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='MySqlServer';"
        "Initial Catalog='pubs';Integrated Security='SSPI';");

    try
    {
        //Open the RoySched table.
        TESTHR(pRstRoySched.CreateInstance(__uuidof(Recordset)));
        pRstRoySched->Open("roysched", strCnn, adOpenForwardOnly,
            adLockReadOnly, adCmdTable);

        // Enumerate the Recordset object twice and record
        // the elapsed time.
        sngStart = GetTickCount();

        for (intLoop = 1; intLoop < 2; intLoop++)
        {
            pRstRoySched->MoveFirst();

            while(!(pRstRoySched->EndOfFile))
            {
                    // Execute a simple operation for the
                    // performance test.
                    strTemp = pRstRoySched->Fields->
                        Item["title_id"]->Value;
                    pRstRoySched->MoveNext();
            }
        }
        sngEnd = GetTickCount();
        sngNoCache = (float)(sngEnd - sngStart)/(float)1000;

        // Cache records in groups of 30 records.
        pRstRoySched->MoveFirst();
        pRstRoySched->CacheSize = 30;

        sngStart =  GetTickCount();

        // Enumerate the Recordset object twice and record
        // the elapsed time.
        for (intLoop = 1;intLoop < 2; intLoop++)
        {
            pRstRoySched->MoveFirst();
            while(!(pRstRoySched->EndOfFile))
            {
                    // Execute a simple operation for the
                    // performance test.
                    strTemp = pRstRoySched->Fields->
                        Item["title_id"]->Value;
                    pRstRoySched->MoveNext();
            }
        }
        sngEnd =  GetTickCount();
        sngCache = (float)(sngEnd - sngStart)/(float)1000;

        // Display performance results.
        printf("Caching Performance Results:\n");
        printf("No cache: %6.3f  seconds \n", sngNoCache);
        printf("30-record cache: %6.3f  seconds \n", sngCache);
    }
    catch(_com_error &e)
    {
         // Notify the user of errors if any.
        _variant_t vtConnect = pRstRoySched->GetActiveConnection();

        // GetActiveConnection returns connect string if connection
        // is not open, else returns Connection object.
        switch(vtConnect.vt)
        {
            case VT_BSTR:
                PrintComError(e);
                break;
            case VT_DISPATCH:
               // Pass a connection pointer accessed from the Recordset.
               PrintProviderError(vtConnect);
               break;
            default:
                printf("Errors occured.");
                break;
        }
    }

    // Clean up objects before exit.
    if (pRstRoySched)
        if (pRstRoySched->State == adStateOpen)
            pRstRoySched->Close();
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintProviderError Function                      //
//                                                       //
///////////////////////////////////////////////////////////

void PrintProviderError(_ConnectionPtr pConnection)
{
    // Print Provider Errors from Connection object.

    // pErr is a record object in the Connection's Error collection.
    ErrorPtr pErr  = NULL;

    if( (pConnection->Errors->Count) > 0)
    {
        long nCount = pConnection->Errors->Count;
        // Collection ranges from 0 to 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 Function                           //
//                                                       //
///////////////////////////////////////////////////////////

void PrintComError(_com_error &e)
{
    _bstr_t bstrSource(e.Source());
    _bstr_t bstrDescription(e.Description());

    // Print Com errors.
    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);

}
// EndCacheSizeCpp

CacheSize, propriété | Recordset, objet


Exemple de méthode Cancel (VC++)

Cet exemple utilise la méthode Cancel pour annuler une commande s'exécutant sur un objet Connection lorsque la connexion est occupée.

// BeginCancelCpp
#import "C:\Program Files\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <ole2.h>
#include <stdio.h>
#include<conio.h>

// Function declarations
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void CancelX();
void PrintProviderError(_ConnectionPtr pConnection);
void PrintComError(_com_error &e);

///////////////////////////////////////////////////////////
//                                                       //
//      Main Function                                    //
//                                                       //
///////////////////////////////////////////////////////////

void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    CancelX();

    //Wait here for user to see the output..
    printf("\nPress any key to continue...");
    getch();

    ::CoUninitialize();
}

///////////////////////////////////////////////////////////
//                                                       //
//      CancelX Function                                 //
//                                                       //
///////////////////////////////////////////////////////////

void CancelX()
{
    // Define ADO object pointers.
    // Initialize pointers on define.
    // These are in the ADODB::  namespace
     _ConnectionPtr pConnection = NULL;

     //Define Other Variables
    HRESULT  hr = S_OK;
    _bstr_t strCmdChange;
    _bstr_t strCmdRestore;
    BOOL booChanged = FALSE;

    _bstr_t strCnn("Provider='sqloledb';Data Source='MySqlServer';"
        "Initial Catalog='pubs';Integrated Security='SSPI';");

    try
    {
        // open a connection.
        TESTHR(pConnection.CreateInstance(__uuidof(Connection)));
        pConnection->Open(strCnn,"","",adConnectUnspecified);

        // Define command strings.
        strCmdChange = "UPDATE titles SET type = 'self_help' "
            "WHERE type = 'psychology'";

        strCmdRestore = "UPDATE titles SET type = 'psychology' "
            "WHERE type = 'self_help'";

        // Begin a transaction, then execute a command asynchronously.
        pConnection->BeginTrans();
        pConnection->Execute(strCmdChange,NULL,adAsyncExecute);

        // do something else for a little while - this could be changed
        for (int i = 1; i<=100000 ;i++)
        {
           // i = i + i;
            printf("%d\n", i);
        }

        // If the command has NOT completed, cancel the execute
        // and roll back the transaction. Otherwise, commit the
        // transaction.
        if ((pConnection->GetState()))
        {
            pConnection->Cancel();
            pConnection->RollbackTrans();
            booChanged = FALSE;
            printf("Update canceled.\n");
            printf("GetState = %d\n", pConnection->GetState());
        }
        else
        {
            pConnection->CommitTrans();
            booChanged = TRUE;
            printf("Update complete.\n");

        }

        // If the change was made, restore the data
        // because this is a demonstration.
        if (booChanged)
        {
            pConnection->Execute(strCmdRestore,NULL,0);
            printf("Data restored.\n");
        }
    }
    catch(_com_error &e)
    {
        // Notify user of any errors that result from
        // executing the query.
        // Pass a connection pointer accessed from the Connection.
        PrintProviderError(pConnection);
        PrintComError(e);
    }

    // Cleanup object before exit
    if (pConnection)
        if (pConnection->State == adStateOpen)
            pConnection->Close();
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintProviderError Function                      //
//                                                       //
///////////////////////////////////////////////////////////

void PrintProviderError(_ConnectionPtr pConnection)
{
    // Print Provider Errors from Connection object.
    // pErr is a record object in the Connection's Error collection.
    ErrorPtr pErr  = NULL;

    if( (pConnection->Errors->Count) > 0)
    {
        long nCount = pConnection->Errors->Count;

        // Collection ranges from 0 to 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 Function                           //
//                                                       //
///////////////////////////////////////////////////////////

void PrintComError(_com_error &e)
{
    _bstr_t bstrSource(e.Source());
    _bstr_t bstrDescription(e.Description());

    // Print Com errors.
    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);
}
// EndCancelCpp

Cancel, méthode | Connection, objet


Exemple de méthode Clone (VC++)

Cet exemple utilise la méthode Clone pour créer des copies d'un objet Recordset puis laisse l'utilisateur positionner de façon autonome le pointeur de l'enregistrement de chaque copie.

// BeginCloneCpp
#import "C:\Program Files\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <stdio.h>
#include <ole2.h>
#include <conio.h>
#include "CloneX.h"

// Function Declarations.
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void CloneX(void);
void PrintProviderError(_ConnectionPtr pConnection);
void PrintComError(_com_error &e);
inline char* mygets(char* strDest, int n)
{
    char strExBuff[10];
    char* pstrRet = fgets(strDest, n, stdin);

    if (pstrRet == NULL)
        return NULL;

    if (!strrchr(strDest, '\n'))
        // Exhaust the input buffer.
        do
        {
            fgets(strExBuff, sizeof(strExBuff), stdin);
        }while (!strrchr(strExBuff, '\n'));
    else
        // Replace '\n' with '\0'
        strDest[strrchr(strDest, '\n') - strDest] = '\0';

    return pstrRet;
}

///////////////////////////////////////////////////////////
//                                                       //
//      Main Function                                    //
//                                                       //
///////////////////////////////////////////////////////////
void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    CloneX();

    //Wait here for user to see the output..
    printf("\nPress any key to continue...");
    getch();
    ::CoUninitialize();
}

///////////////////////////////////////////////////////////
//                                                       //
//      CloneX Function                                  //
//                                                       //
///////////////////////////////////////////////////////////

void  CloneX()
{
    // Define ADO object pointers.
    // Initialize pointers on define.
    // These are in the ADODB::  namespace.
    _RecordsetPtr  arstStores[3];

    //Define Other Variables
    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];

    // Assign SQL statement and connection string to variables.
    strSQL = "SELECT stor_name FROM Stores ORDER BY stor_name";

    _bstr_t strCnn("Provider='sqloledb';Data Source='MySqlServer';"
            "Initial Catalog='pubs';Integrated Security='SSPI';");

    try
    {
        // Open recordset as a static cursor type recordset.
        arstStores[0].CreateInstance(__uuidof(Recordset));
        arstStores[0]->CursorType = adOpenStatic;
        arstStores[0]->LockType = adLockBatchOptimistic;

        TESTHR(arstStores[0]->Open(strSQL,strCnn, adOpenStatic,
            adLockBatchOptimistic,adCmdText));

        // Create two clones of the original Recordset.
        arstStores[1] = arstStores[0]->Clone(adLockUnspecified);
        arstStores[2] = arstStores[0]->Clone(adLockUnspecified);

        while (boolFlag)
        {
            // Loop through the array so that on each pass,
            // the user is searching a different copy of the
            // same Recordset.
            for (intLoop = 1; intLoop <= 3 ; intLoop++)
            {
                // Ask for search string while showing where
                // the current record pointer is for each Recordset.
                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, "
                    "or press Enter to quit.\n", intLoop);
                mygets(m_szS_stor_name, 150);

                // Trim the String.
                tempStr = strtok(m_szS_stor_name, "  \t");
                strMessage = tempStr;
                if (tempStr == NULL)
                {
                    boolFlag = FALSE;
                    break;
                }

                // Find the search string; if there's no
                // match, jump to the last record.
                intLoop1 = intLoop - 1;

                arstStores[intLoop1]->Filter = "stor_name >= '" +
                    strMessage + "'";

                if (arstStores[intLoop1]->EndOfFile)
                {
                    arstStores[intLoop1]->Filter = (long)adFilterNone;
                    arstStores[intLoop1]->MoveLast();
                }
            }
        } // End of While Loop
    }
    catch(_com_error &e)
    {
        // Notify the user of errors if any.
        _variant_t vtConnect;

        vtConnect = arstStores[0]->GetActiveConnection();

        switch(vtConnect.vt)
        {
            case VT_BSTR:
                PrintComError(e);
                break;
            case VT_DISPATCH:
                PrintProviderError(vtConnect);
                break;
            default:
                printf("Errors occured.");
                break;
        }
    }

    // Clean up objects before exit.
    if (arstStores[0])
        if (arstStores[0]->State == adStateOpen)
            arstStores[0]->Close();
    if (arstStores[1])
        if (arstStores[1]->State == adStateOpen)
            arstStores[1]->Close();
    if (arstStores[2])
        if (arstStores[2]->State == adStateOpen)
            arstStores[2]->Close();
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintProviderError Function                      //
//                                                       //
///////////////////////////////////////////////////////////

void PrintProviderError(_ConnectionPtr pConnection)
{
    // Print Provider Errors from Connection object.
    // pErr is a record object in the Connection's Error collection.
    ErrorPtr pErr = NULL;

    if( (pConnection->Errors->Count) > 0)
    {
        long nCount = pConnection->Errors->Count;
        // Collection ranges from 0 to 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 Function                           //
//                                                       //
///////////////////////////////////////////////////////////

void PrintComError(_com_error &e)
{
    _bstr_t bstrSource(e.Source());
    _bstr_t bstrDescription(e.Description());

    // Print Com errors.
    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);
};
// EndCloneCpp

CloneX.h

// BeginCloneH
#include "icrsint.h"

// This Class extracts only store name
// from "stores" table.
class CStores : public CADORecordBinding
{
BEGIN_ADO_BINDING(CStores)

    //Column stor_name is the 1st field in the 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;
};

// EndCloneH

Clone, méthode | Recordset, objet


Exemple de méthode CompareBookmarks (VC++)

Cet exemple met en application la méthode CompareBookmarks. La valeur relative des signets est rarement nécessaire sauf quand un signet présente un intérêt particulier.

Désignez une ligne aléatoire d'un objet Recordset dérivé de la table Authors comme cible de la recherche. Affichez ensuite la position de chaque ligne par rapport à la cible.

// BeginCompareBookmarksCpp
#import "C:\Program Files\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <ole2.h>
#include <stdio.h>
#include <conio.h>
#include <time.h>
#include <stdlib.h>

// Function declarations
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void CompareBookMarksX(void);
void PrintProviderError(_ConnectionPtr pConnection);
void PrintComError(_com_error &e);

//////////////////////////////////////////////////////////
//                                                      //
//        Main Function                                 //
//                                                      //
//////////////////////////////////////////////////////////

void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    CompareBookMarksX();

    printf("Press any key to continue...");
    getch();
    ::CoUninitialize();
}

//////////////////////////////////////////////////////////
//                                                      //
//           CompareBookMarksX Function                 //
//                                                      //
//////////////////////////////////////////////////////////

void CompareBookMarksX(void)
{
    HRESULT hr = S_OK;

    _bstr_t strCnn("Provider='sqloledb';Data Source='MySqlServer';"
        "Initial Catalog='pubs';Integrated Security='SSPI';");

    // Initialize pointers on define.
    // These are in the 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);     //Exit if an empty recordset

        srand( (unsigned)time( NULL ) ); //Randomize

        count = int(rand() % (count-1)); //Get position between 1 and count-1
        if(!count) {count++;};

        printf("Randomly chosen row position = %d\n", count);

        _variant_t vtBookMark = (short)adBookmarkFirst;

        pRstAuthors->Move(count,vtBookMark); //Move row to random position

        vTarget = pRstAuthors->Bookmark;    //Remember the mystery row.
        count = 0;
        long intLineCnt = 3;
        pRstAuthors->MoveFirst();

        while (!(pRstAuthors->EndOfFile))       //Loop through recordset
        {
            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();
        }
   }
   catch(_com_error &e)
   {
       // Notify the user of errors if any.
       // Pass a connection pointer accessed from the Recordset.
        _variant_t vtConnect = pRstAuthors->GetActiveConnection();

        // GetActiveConnection returns connect string if connection
        // is not open, else returns Connection object.
        switch(vtConnect.vt)
        {
            case VT_BSTR:
                PrintComError(e);
                break;
            case VT_DISPATCH:
                PrintProviderError(vtConnect);
                break;
            default:
                printf("Errors occured.");
                break;
        }
    }

    // Clean up objects before exit.
    if (pRstAuthors)
        if (pRstAuthors->State == adStateOpen)
            pRstAuthors->Close();
}

//////////////////////////////////////////////////////////
//                                                      //
//            PrintProviderError Function               //
//                                                      //
//////////////////////////////////////////////////////////

void PrintProviderError(_ConnectionPtr pConnection)
{
    // Print Provider Errors from Connection object.
    // pErr is a record object in the Connection's Error collection.
    ErrorPtr pErr = NULL;

    if( (pConnection->Errors->Count) > 0)
    {
        long nCount = pConnection->Errors->Count;
        // Collection ranges from 0 to 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 Function                        //
//                                                      //
//////////////////////////////////////////////////////////

void PrintComError(_com_error &e)
{
   _bstr_t bstrSource(e.Source());
   _bstr_t bstrDescription(e.Description());

    // Print Com errors.
   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);
}
// EndCompareBookmarksCpp

CompareBookmarks, méthode | Recordset, objet


Exemple de propriétés ConnectionString, ConnectionTimeout et State (VC++)

Cet exemple illustre les différentes façons d'utiliser la propriété ConnectionString pour ouvrir un objet Connection. Il utilise également la propriété ConnectionTimeout pour définir le délai d'attente pour la connexion, et la propriété State pour vérifier l'état des connexions. L'exécution de cette procédure requiert la fonction GetState.

// BeingConnectionStringCpp
#import "C:\Program Files\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <ole2.h>
#include <stdio.h>
#include <conio.h>

// Function declarations
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 Function                                    //
//                                                       //
///////////////////////////////////////////////////////////

void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    ConnectionStringX();

    //Wait here for user to see the output..
    printf("\nPress any key to continue...");
    getch();

    ::CoUninitialize();
}

///////////////////////////////////////////////////////////
//                                                       //
//      ConnectionStringX Function                       //
//                                                       //
///////////////////////////////////////////////////////////

void ConnectionStringX()
{
    // Define Connection object pointers.
    // Initialize pointers on define.
    // These are in the ADODB::  namespace
     _ConnectionPtr pConnection1 = NULL;
     _ConnectionPtr pConnection2 = NULL;
     _ConnectionPtr pConnection3 = NULL;
     _ConnectionPtr pConnection4 = NULL;

    //Define Other Variables
    HRESULT  hr = S_OK;

    try
    {
        // Open a connection using OLE DB syntax.
        TESTHR(pConnection1.CreateInstance(__uuidof(Connection)));
        pConnection1->ConnectionString =
            "Provider='sqloledb';Data Source='MySqlServer';"
            "Initial Catalog='Pubs';Integrated Security='SSPI';";
        pConnection1->ConnectionTimeout = 30;
        pConnection1->Open("","","",adConnectUnspecified);
        printf("cnn1 state: %s\n",
            (LPCTSTR)GetState(pConnection1->State));

        // Open a connection using a DSN and ODBC tags.
        // It is assumed that you have create DSN 'Pubs' with a user name as
        // 'MyUserId' and password as 'MyPassword'.
        TESTHR(pConnection2.CreateInstance(__uuidof(Connection)));
        pConnection2->ConnectionString = "DSN=Pubs;UID=MyUserId;PWD=MyPassword;";
        pConnection2->Open("","","",adConnectUnspecified);
        printf("cnn2 state: %s\n",
            (LPCTSTR)GetState(pConnection2->State));

        // Open a connection using a DSN and OLE DB tags.
        TESTHR(pConnection3.CreateInstance(__uuidof(Connection)));
        pConnection3->ConnectionString = "Data Source=Pubs;";
        pConnection3->Open("","","",adConnectUnspecified);
        printf("cnn3 state: %s\n",
            (LPCTSTR)GetState(pConnection3->State));

        // Open a connection using a DSN and individual
        // arguments instead of a connection string.
        // It is assumed that you have create DSN 'Pubs' with a user name as
        // 'MyUserId' and password as 'MyPassword'.
        TESTHR(pConnection4.CreateInstance(__uuidof(Connection)));
        pConnection4->Open("Pubs","MyUserId","MyPassword",adConnectUnspecified);
        printf("cnn4 state: %s\n",
            (LPCTSTR)GetState(pConnection4->State));
    }
    catch(_com_error &e)
    {
        // Notify user of any errors.
        // Pass a connection pointer accessed from the Connection.
        PrintProviderError(pConnection1);
        if(pConnection2)
            PrintProviderError(pConnection2);
        if(pConnection3)
            PrintProviderError(pConnection3);
        if(pConnection4)
            PrintProviderError(pConnection4);
        PrintComError(e);
    }

    //Cleanup objects before exit.
    if (pConnection1)
        if (pConnection1->State == adStateOpen)
            pConnection1->Close();
    if (pConnection2)
        if (pConnection2->State == adStateOpen)
            pConnection2->Close();
    if (pConnection3)
        if (pConnection3->State == adStateOpen)
            pConnection3->Close();
    if (pConnection4)
        if (pConnection4->State == adStateOpen)
            pConnection4->Close();
}

///////////////////////////////////////////////////////////
//                                                       //
//      GetState Function                                //
//                                                       //
///////////////////////////////////////////////////////////

_bstr_t GetState(int intState)
{
    _bstr_t strState;
    switch(intState)
    {
        case adStateClosed:
            strState = "adStateClosed";
            break;
        case adStateOpen:
            strState = "adStateOpen";
            break;
        default:
        ;
    }
    return strState;
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintProviderError Function                      //
//                                                       //
///////////////////////////////////////////////////////////

void PrintProviderError(_ConnectionPtr pConnection)
{
    // Print Provider Errors from Connection object.
    // pErr is a record object in the Connection's Error collection.
    ErrorPtr  pErr = NULL;

    if( (pConnection->Errors->Count) > 0)
    {
        long nCount = pConnection->Errors->Count;

        // Collection ranges from 0 to 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 Function                           //
//                                                       //
///////////////////////////////////////////////////////////

void PrintComError(_com_error &e)
{
    _bstr_t bstrSource(e.Source());
    _bstr_t bstrDescription(e.Description());

    // Print Com errors.
    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);
}
// EndConnectionStringCpp

Voir aussi

Connection, objet | ConnectionString, propriété | ConnectionTimeout, propriété | State, propriété


Exemple de propriété Count (VC++)

Cet exemple illustre l'utilisation de la propriété Count avec deux collections dans la base de données Employees. La propriété vérifie le nombre d'objets contenus dans chaque collection et définit le nombre maximal de boucles énumérant les collections. L'énumération des collections peut également se faire à l'aide d'instructions For Each...Next, sans avoir recours à la propriété Count.

// BeginCountCpp
#import "C:\Program Files\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <ole2.h>
#include <stdio.h>
#include<conio.h>

// Function declarations
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 Function                                    //
//                                                       //
///////////////////////////////////////////////////////////

void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    CountX();

    //Wait here for user to see the output..
    printf("\nPress any key to Exit...");
    getch();

    ::CoUninitialize();
}

///////////////////////////////////////////////////////////
//                                                       //
//      CountX Function                                  //
//                                                       //
///////////////////////////////////////////////////////////

void CountX()
{
    // Define ADO object pointers.
    // Initialize pointers on define.
    // These are in the ADODB::  namespace
    _RecordsetPtr pRstEmployee = NULL;

    //Define Other Variables
    HRESULT hr = S_OK;
    _variant_t Index;
    Index.vt = VT_I2;
    int j = 0;

    _bstr_t strCnn("Provider='sqloledb';Data Source='MySqlServer';"
        "Initial Catalog='pubs';Integrated Security='SSPI';");

    try
    {
        // Open recordset with data from Employee table.
        TESTHR(pRstEmployee.CreateInstance(__uuidof(Recordset)));
        pRstEmployee->Open("Employee", strCnn, adOpenForwardOnly,
            adLockReadOnly, adCmdTable);

        // Print information about Fields collection.
        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);
        }

        // Print information about Properties collection.
        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();

                //Clear the screen for the next display
                system("cls");
                j = 0;
            }
        }
    }
    catch(_com_error &e)
    {
        // Notify user of any errors that result from
        // executing the query.
        // Pass a connection pointer accessed from the Recordset.
        _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;
        }
    }
    // Clean up objects before exit.
    if (pRstEmployee)
        if (pRstEmployee->State == adStateOpen)
            pRstEmployee->Close();
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintProviderError Function                      //
//                                                       //
///////////////////////////////////////////////////////////

void PrintProviderError(_ConnectionPtr pConnection)
{
    // Print Provider Errors from Connection object.
    // pErr is a record object in the Connection's Error collection.
    ErrorPtr pErr = NULL;

    if( (pConnection->Errors->Count) > 0)
    {
        long nCount = pConnection->Errors->Count;

        // Collection ranges from 0 to 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 Function                           //
//                                                       //
///////////////////////////////////////////////////////////

void PrintComError(_com_error &e)
{
    _bstr_t bstrSource(e.Source());
    _bstr_t bstrDescription(e.Description());

    // Print Com errors.
    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);
}
// EndCountCpp

Count, propriété


Exemple de propriétés CursorType, LockType et EditMode (VC++)

Cet exemple montre comment définir les propriétés CursorType et LockType avant l'ouverture d'un objet Recordset. Il donne également la valeur de la propriété EditMode sous diverses conditions. L'exécution de cette procédure requiert la fonction EditModeOutput.

// BeginEditModeCpp
#import "C:\Program Files\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <ole2.h>
#include <stdio.h>
#include <conio.h>

// Function declaration
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 Function                                    //
//                                                       //
///////////////////////////////////////////////////////////
void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

     EditModeX();

    // Wait here for the user to see the output
    printf("\n\nPress any key to continue...");
    getch();

    ::CoUninitialize();
}

///////////////////////////////////////////////////////////
//                                                       //
//      EditModeX Function                               //
//                                                       //
///////////////////////////////////////////////////////////
void EditModeX(void)
{
    // Define ADO object pointers.
    // Initialize pointers on define.
    // These are in the ADODB::  namespace.
    _RecordsetPtr     pRstEmployees = NULL;
    _ConnectionPtr    pConnection  = NULL;

    HRESULT hr = S_OK;

    _bstr_t strCnn("Provider='sqloledb';Data Source='MySqlServer';"
        "Initial Catalog='pubs';Integrated Security='SSPI';");

    try
    {
        // Open a connection
        TESTHR(pConnection.CreateInstance(__uuidof(Connection)));
        hr = pConnection->Open(strCnn,"","",adConnectUnspecified);

        // Open recordset with data from employee table
        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);

        // Show the EditMode property under different editing states.
        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);

        // Delete new record because this is a demonstration.
        pConnection->Execute("DELETE FROM employee WHERE emp_id = "
            "'T-T55555M'", NULL, adCmdText);
    }
    catch(_com_error &e)
    {
        // Notify the user of errors if any.
        // Pass a connection pointer accessed from the Recordset.
        PrintProviderError(pConnection);
        PrintComError(e);
    }

    // Clean up objects before exit.
    if (pRstEmployees)
        if (pRstEmployees->State == adStateOpen)
            pRstEmployees->Close();
    if (pConnection)
        if (pConnection->State == adStateOpen)
            pConnection->Close();
}

///////////////////////////////////////////////////////////
//                                                       //
//      EditModeOutput() Function                        //
//                                                       //
///////////////////////////////////////////////////////////
void EditModeOutput(char *strTemp, int intEditMode)
{
    // Print report based on the value of the EditMode property.
    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 Function                      //
//                                                       //
///////////////////////////////////////////////////////////

void PrintProviderError(_ConnectionPtr pConnection)
{
    // Print Provider Errors from Connection object.
    // pErr is a record object in the Connection's Error collection.
    ErrorPtr  pErr = NULL;

    if( (pConnection->Errors->Count) > 0)
    {
        long nCount = pConnection->Errors->Count;
        // Collection ranges from 0 to nCount -1.
        for(long i = 0; i < nCount; i++)
        {
            pErr = pConnection->Errors->GetItem(i);
            printf("\n\t Error number: %x\t%s\n", pErr->Number,
                (LPCSTR)pErr->Description);
        }
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintComError Function                           //
//                                                       //
///////////////////////////////////////////////////////////

void PrintComError(_com_error &e)
{
    _bstr_t bstrSource(e.Source());
    _bstr_t bstrDescription(e.Description());

    // Print Com errors.
    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);
}

// EndEditModeCpp

Voir aussi

CursorType, propriété | EditMode, propriété | LockType, propriété | Recordset, objet


Exemple de méthode Delete (VC++)

Cet exemple utilise la méthode Delete pour supprimer un enregistrement spécifié dans un objet Recordset.

// BeginDeleteCpp
#import "C:\Program Files\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <stdio.h>
#include <ole2.h>
#include <conio.h>
#include "DeleteX.h"

//Function Declarations.
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void DeleteX(void);
void PrintProviderError(_ConnectionPtr pConnection);
void PrintComError(_com_error &e);
inline char* mygets(char* strDest, int n)
{
    char strExBuff[10];
    char* pstrRet = fgets(strDest, n, stdin);

    if (pstrRet == NULL)
        return NULL;

    if (!strrchr(strDest, '\n'))
        // Exhaust the input buffer.
        do
        {
            fgets(strExBuff, sizeof(strExBuff), stdin);
        }while (!strrchr(strExBuff, '\n'));
    else
        // Replace '\n' with '\0'
        strDest[strrchr(strDest, '\n') - strDest] = '\0';

    return pstrRet;
}

///////////////////////////////////////////////////////////
//                                                       //
//      Main Function                                    //
//                                                       //
///////////////////////////////////////////////////////////
void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    DeleteX();

    // Wait here for the user to see the output
    printf("\n\nPress any key to continue...");
    getch();

    ::CoUninitialize();
}

///////////////////////////////////////////////////////////
//                                                       //
//      DeleteX Function                                 //
//                                                       //
///////////////////////////////////////////////////////////

void DeleteX(void)
{

    // Define ADO object pointers.
    // Initialize pointers on define.
    // These are in the ADODB::  namespace.
    _RecordsetPtr  pRstRoySched = NULL;

    // Define Other Variables
    IADORecordBinding   *picRs = NULL;  //Interface Pointer declared.
    CRoySchedRs    royschrs;            //C++ class object
    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='MySqlServer';"
            "Initial Catalog='pubs';Integrated Security='SSPI';");

    try
    {
        // Open RoySched table
        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));

        // Prompt for a record to delete.
        printf("Before delete there are %d titles with 20 percent "
            "royalty :\n", pRstRoySched->RecordCount);

        // Open an IADORecordBinding interface pointer which we'll use
        // for Binding Recordset to a class.
        TESTHR(pRstRoySched->QueryInterface(
            __uuidof(IADORecordBinding),(LPVOID*)&picRs));

        // Bind the Recordset to a C++ Class here
        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: ");
        mygets(strTitleID, 10);

        // Converting the title_id to upper case
        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];
                }
            }
        }

        // Move to the record and save data so it can be restored.
        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;

            // Delete the record
            pRstRoySched->Delete(adAffectCurrent);
            pRstRoySched->UpdateBatch(adAffectCurrent);
        }
        else
        {
            blnFound = FALSE;
            printf("This Title ID not available");
        }

        // Show the results.
        VARIANT varFilter;
        varFilter.vt = VT_I2;
        varFilter.iVal = adFilterNone;
        pRstRoySched->PutFilter (varFilter);
        pRstRoySched->Requery(-1);

        // Bind the Recordset to a C++ Class here.
        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();
        }

        // Restore the data because this is a demonstration.
        if(blnFound)
        {
            // Set the final character of the destination string to NULL.
            royschrs.m_sz_titleid[sizeof(royschrs.m_sz_titleid)-1] = '\0';
            // The source string will get truncated if its length is
            // longer than the length of the destination string minus one.
            strncpy(royschrs.m_sz_titleid,strTmpTitleID,sizeof(royschrs.m_sz_titleid)-1);
            royschrs.m_sz_lorange = intLoRange;
            royschrs.m_sz_hirange = longHiRange;
            royschrs.m_sz_royalty = intRoyalty;

            TESTHR(picRs->AddNew(&royschrs));

            pRstRoySched->UpdateBatch(adAffectCurrent);
        }
    }
    catch(_com_error &e)
    {
       // Notify the user of errors if any.
       // Pass a connection pointer accessed from the Recordset.
        _variant_t vtConnect = pRstRoySched->GetActiveConnection();

        // GetActiveConnection returns connect string if connection
        // is not open, else returns Connection object.
        switch(vtConnect.vt)
        {
            case VT_BSTR:
                PrintComError(e);
                break;
            case VT_DISPATCH:
                PrintProviderError(vtConnect);
                break;
            default:
                printf("Errors occured.");
                break;
        }
    }

    // Clean up objects before exit.
    //Release the IADORecordset Interface here
    if (picRs)
        picRs->Release();

    if (pRstRoySched)
        if (pRstRoySched->State == adStateOpen)
            pRstRoySched->Close();
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintProviderError Function                      //
//                                                       //
///////////////////////////////////////////////////////////

void PrintProviderError(_ConnectionPtr pConnection)
{
    // Print Provider Errors from Connection object.
    // pErr is a record object in the Connection's Error collection.
    ErrorPtr  pErr = NULL;

    if( (pConnection->Errors->Count) > 0)
    {
        long nCount = pConnection->Errors->Count;
        // Collection ranges from 0 to 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 Function                           //
//                                                       //
///////////////////////////////////////////////////////////

void PrintComError(_com_error &e)
{
   _bstr_t bstrSource(e.Source());
   _bstr_t bstrDescription(e.Description());

    // Print Com errors.
   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);
}
// EndDeleteCpp

DeleteX.h

// BeginDeleteH
#include "icrsint.h"

// This Class extracts titleid, lorange, hirange and royalty
// from the "roysched" table.

class CRoySchedRs : public CADORecordBinding
{
BEGIN_ADO_BINDING(CRoySchedRs)

    //Column empid is the 1st field in the 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;
};
// EndDeleteH

Delete, méthode (objet ADO Recordset) | Recordset, objet


Exemple de propriétés Description, HelpContext, HelpFile, NativeError, Number, Source et SQLState (VC++)

Cet exemple déclenche une erreur, l'intercepte et affiche les propriétés Description, HelpContext, HelpFile, NativeError, Number, Source et SQLState de l'objet Error résultant.

// BeginDescriptionCpp
#import "C:\Program Files\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <ole2.h>
#include <stdio.h>
#include<conio.h>

// Function declarations
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 Function                                    //
//                                                       //
///////////////////////////////////////////////////////////

void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    DescriptionX();

    //Wait here for user to see the output..
    printf("\nPress any key to continue...");
    getch();
    ::CoUninitialize();
}

///////////////////////////////////////////////////////////
//                                                       //
//      DescriptionX Function                            //
//                                                       //
///////////////////////////////////////////////////////////

void DescriptionX()
{
    // Define ADO object pointers.
    // Initialize pointers on define.
    // These are in the ADODB::  namespace
    _ConnectionPtr pConnection = NULL;
    ErrorPtr errorLoop = NULL;

    //Define Other Variables
    HRESULT hr = S_OK;

    try
    {
        // Intentionally trigger an error.
        // open connection
        TESTHR(pConnection.CreateInstance(__uuidof(Connection)));

        if (FAILED(hr = pConnection->Open("nothing","","",adConnectUnspecified)))
        {
            _com_issue_error(hr);
            exit(1);
        }

        // Cleanup object before exit.
        pConnection->Close();
    }
    catch(_com_error)
    {
        // Pass a connection pointer.
        PrintProviderError(pConnection);
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintProviderError Function                      //
//                                                       //
///////////////////////////////////////////////////////////

void PrintProviderError(_ConnectionPtr pConnection)
{
    //Define Other Variables
    HRESULT  hr = S_OK;
    _bstr_t  strError;
    ErrorPtr  pErr = NULL;

    try
    {
        // Enumerate Errors collection and display
        // properties of each Error object.
        long nCount = pConnection->Errors->Count;

        // Collection ranges from 0 to nCount - 1.
        for(long i = 0; i < nCount; i++)
        {
            pErr = pConnection->Errors->GetItem(i);
            printf("Error #%d\n", pErr->Number);
            printf(" %s\n",(LPCSTR)pErr->Description);
            printf(" (Source: %s)\n",(LPCSTR)pErr->Source);
            printf(" (SQL State: %s)\n",(LPCSTR)pErr->SQLState);
            printf(" (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)
    {
        // Notify the user of errors if any.
        PrintComError(e);
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintComError Function                           //
//                                                       //
///////////////////////////////////////////////////////////

void PrintComError(_com_error &e)
{
   // Notify the user of errors if any.
   _bstr_t bstrSource(e.Source());
   _bstr_t bstrDescription(e.Description());

    // Print Com errors.

   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);
}
// EndDescriptionCpp

Voir aussi

Description, propriété | Error, objet | HelpContext, propriété | HelpFile, propriété | NativeError, propriété | Number, propriété | Source, propriété (Error ADO) | SQLState, propriété


Exemple de méthodes Execute, Requery et Clear (VC++)

Cet exemple illustre l'utilisation de la méthode Execute lorsqu'elle est exécutée à partir d'un objet Command et d'un objet Connection. Il utilise également la méthode Requery pour extraire les données actuelles d'un objet Recordset, ainsi que la méthode Clear pour effacer le contenu de la collection Errors. Les fonctions ExecuteCommand et PrintOutput sont nécessaires à l'exécution de cet exemple.

// BeginExecuteCpp
#include <ole2.h>
#include <stdio.h>

#import "c:\Program Files\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

// Function declarations
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 Function         //
////////////////////////////////

void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    ExecuteX();

    ::CoUninitialize();
}

///////////////////////////////////
//      ExecuteX Function        //
///////////////////////////////////

void ExecuteX(void)
{
   HRESULT    hr = S_OK;

    // Define string variables.
   _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='MySqlServer';"
            "Initial Catalog='pubs';Integrated Security='SSPI';");

    // Define ADO object pointers.
    // Initialize pointers on define.
    // These are in the ADODB::  namespace.
    _ConnectionPtr  pConnection = NULL;
    _CommandPtr     pCmdChange  = NULL;
    _RecordsetPtr   pRstTitles  = NULL;

    try
    {
        // Open connection.
        TESTHR(pConnection.CreateInstance(__uuidof(Connection)));
        pConnection->Open (strCnn, "", "", adConnectUnspecified);

        // Create command object.
        TESTHR(pCmdChange.CreateInstance(__uuidof(Command)));
        pCmdChange->ActiveConnection = pConnection;
        pCmdChange->CommandText = strSQLChange;

        // Open titles table, casting Connection pointer to an
        // IDispatch type so converted to correct type of variant.
        TESTHR(pRstTitles.CreateInstance(__uuidof(Recordset)));
        pRstTitles->Open ("Titles", _variant_t((IDispatch *) pConnection,
            true), adOpenStatic, adLockOptimistic, adCmdTable);

        // Print report of original data.
        printf(
            "\n\nData in Titles table before executing the query: \n");

        // Call function to print loop recordset contents.
        PrintOutput(pRstTitles);

        // Clear extraneous errors from the Errors collection.
        pConnection->Errors->Clear();

        // Call ExecuteCommand subroutine to execute pCmdChange command.
        ExecuteCommand(pCmdChange, pRstTitles);

        // Print report of new data.
        printf(
            "\n\n\tData in Titles table after executing the query: \n");
        PrintOutput(pRstTitles);

        // Use the Connection object's execute method to
        // execute SQL statement to restore data.
        pConnection->Execute(strSQLRestore, NULL, adExecuteNoRecords);

        // Retrieve the current data by requerying the recordset.
        pRstTitles->Requery(adCmdUnknown);

        // Print report of restored data.
        printf(
            "\n\n\tData after exec. query to restore original info: \n");
        PrintOutput(pRstTitles);
    }
    catch (_com_error &e)
    {
        PrintProviderError(pConnection);
        PrintComError(e);
    }

    // Clean up objects before exit.
    if (pRstTitles)
        if (pRstTitles->State == adStateOpen)
            pRstTitles->Close();
    if (pConnection)
        if (pConnection->State == adStateOpen)
            pConnection->Close();
}

//////////////////////////////////////////
//      ExecuteCommand Function         //
//////////////////////////////////////////

void ExecuteCommand(_CommandPtr pCmdTemp, _RecordsetPtr pRstTemp)
{
    try
    {
        // CommandText property already set before function was called.
        pCmdTemp->Execute(NULL, NULL, adCmdText);

        // Retrieve the current data by requerying the recordset.
        pRstTemp->Requery(adCmdUnknown);
    }

    catch(_com_error &e)
    {
        // Notify user of any errors that result from
        // executing the query.
        // Pass a connection pointer accessed from the Recordset.
        PrintProviderError(pRstTemp->GetActiveConnection());
        PrintComError(e);
    }
}

/////////////////////////////////////
//      PrintOutput Function       //
/////////////////////////////////////

void PrintOutput(_RecordsetPtr pRstTemp)
{
    // Ensure at top of recordset.
    pRstTemp->MoveFirst();

    // If EOF is true, then no data and skip print loop.
    if( pRstTemp->EndOfFile )
    {
        printf("\tRecordset empty\n");
    }
    else
    {
        // Define temporary strings for output conversions.
        // Initialize to first record's values.
        _bstr_t bstrTitle;
        _bstr_t bstrType;

        // Enumerate Recordset and print from each.
        while(!(pRstTemp->EndOfFile))
            {
            // Convert variant string to convertable string type.
            bstrTitle = pRstTemp->Fields->GetItem("Title")->Value;
            bstrType  = pRstTemp->Fields->GetItem("Type")->Value;
            printf("\t%s, %s \n",
                (LPCSTR) bstrTitle,
                (LPCSTR) bstrType);

            pRstTemp->MoveNext();
        }
    }
}

///////////////////////////////////////////////
//      PrintProviderError Function          //
///////////////////////////////////////////////

void PrintProviderError(_ConnectionPtr pConnection)
{
    // Print Provider Errors from Connection object.
    // pErr is a record object in the Connection's Error collection.
    ErrorPtr  pErr = NULL;

    if( (pConnection->Errors->Count) > 0)
    {
        long nCount = pConnection->Errors->Count;
        // Collection ranges from 0 to 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 Function      //
//////////////////////////////////////

void PrintComError(_com_error &e)
{
    _bstr_t bstrSource(e.Source());
    _bstr_t bstrDescription(e.Description());

    // Print Com errors.
    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);
}
// EndExecuteCpp

Voir aussi

Clear, méthode | Command, objet | Connection, objet | Errors, collection | Execute, méthode (objet ADO Command) | Execute, méthode (objet ADO Connection) | Requery, méthode


Exemple de propriétés Filter et RecordCount (VC++)

Cet exemple utilise la propriété Filter pour ouvrir un nouvel objet Recordset selon une condition spécifique appliquée à un objet Recordset existant. Il utilise la propriété RecordCount pour indiquer le nombre d'enregistrements contenus dans les deux objets Recordset. L'exécution de cette procédure requiert la fonction FilterField.

// BeginFilterCpp
#import "C:\Program Files\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <stdio.h>
#include <ole2.h>
#include <conio.h>
#include "FilterX.h"

// Function declarations
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 pCnn1);
void PrintComError(_com_error &e);
inline char* mygets(char* strDest, int n)
{
    char strExBuff[10];
    char* pstrRet = fgets(strDest, n, stdin);

    if (pstrRet == NULL)
        return NULL;

    if (!strrchr(strDest, '\n'))
        // Exhaust the input buffer.
        do
        {
            fgets(strExBuff, sizeof(strExBuff), stdin);
        }while (!strrchr(strExBuff, '\n'));
    else
        // Replace '\n' with '\0'
        strDest[strrchr(strDest, '\n') - strDest] = '\0';

    return pstrRet;
}

void main()
{
    HRESULT hr = S_OK;

    if(FAILED(::CoInitialize(NULL)))
        return;

    FilterX();

    //Wait here for user to see the output..
    printf("\nPress any key to Continue...");
    getch();

    //Clear the screen for the next display
    system("cls");

    FilterX2();

    //Wait here for user to see the output..
    printf("\nPress any key to Exit...");
    getch();
    ::CoUninitialize();
}

///////////////////////////////////////////////////////////
//                                                       //
//      FilterX Function                                 //
//                                                       //
///////////////////////////////////////////////////////////

void  FilterX()
{
    // Define ADO object pointers.
    // Initialize pointers on define.
    // These are in the ADODB::  namespace.
    _RecordsetPtr rstPublishers = NULL;
    _RecordsetPtr rstPublishersCountry = NULL;

    //Define Other Variables
    HRESULT hr = S_OK;
    _bstr_t strCnn("Provider='sqloledb';Data Source='MySqlServer';"
            "Initial Catalog='pubs';Integrated Security='SSPI';");
    int intPublisherCount = 0;
    long recCount = 0;
    _bstr_t strCountry;
    _bstr_t strMessage;
    char *tempStr;
    CHAR sz_CountryName[50];
    bool boolFlag = TRUE;
    try
    {
        // Open recordset with data from Publishers table.
        rstPublishers.CreateInstance(__uuidof(Recordset));
        rstPublishersCountry.CreateInstance(__uuidof(Recordset));

        rstPublishers->CursorType = adOpenStatic;

        TESTHR(rstPublishers->Open("publishers",strCnn,
             adOpenStatic , adLockReadOnly,adCmdTable));

        // Populate the Recordset.
        intPublisherCount = rstPublishers->RecordCount;

        // Get user input.
        printf("Enter a country to filter on:");
        mygets(sz_CountryName, 50);

        // Trim the string
        tempStr = strtok(sz_CountryName, "  \t");
        strCountry = tempStr;
        if (tempStr == NULL)
        {
            boolFlag = FALSE;
        }

        if (boolFlag)
        {
            if (strcmp(sz_CountryName,""))
            {
                // Open a filtered Recordset object.
                rstPublishersCountry = FilterField(rstPublishers,
                    "Country", strCountry);
                recCount = rstPublishersCountry->GetRecordCount();
                if (recCount==0)
                {
                    printf("\nNo publishers from that country.\n");
                }
                else
                {
                    // Print number of records for the original
                    // Recordset object and the filtered Recordset
                    // object.
                    printf("\nOrders in original recordset:\n%d",
                        intPublisherCount);
                    printf("\nOrders in filtered recordset "
                        "(Country = '%s'): \n%d\n\n", (LPCSTR)strCountry ,
                        rstPublishersCountry->RecordCount);
                }
            }
        }
    }
    catch(_com_error &e)
    {
        // Notify the user of errors if any.
        _variant_t vtConnect = rstPublishers->GetActiveConnection();

        // GetActiveConnection returns connect string if connection
        // is not open, else returns Connection object.
        switch(vtConnect.vt)
        {
            case VT_BSTR:
                PrintComError(e);
                break;
            case VT_DISPATCH:
                PrintProviderError(vtConnect);
                break;
            default:
                printf("Errors occured.");
                break;
        }
    }

    // Clean up objects before exit.
    if (rstPublishers)
        if (rstPublishers->State == adStateOpen)
            rstPublishers->Close();
    if (rstPublishersCountry)
        if (rstPublishersCountry->State == adStateOpen)
            rstPublishersCountry->Close();
}

_RecordsetPtr FilterField(_RecordsetPtr rstTemp,_bstr_t strField,
    _bstr_t strFilter)
{
        // Set a filter on the specified Recordset object and then
        // open a new Recordset object.
        rstTemp->Filter  = strField + " = '" + strFilter + "'";
        return rstTemp;
}

void FilterX2(void)
{
    _RecordsetPtr rstPublishers;
    CPublishers publishers;

    //Define Other Variables
    HRESULT hr = S_OK;
    IADORecordBinding   *picRs = NULL;  //Interface Pointer declared...

    _bstr_t strCnn("Provider='sqloledb';Data Source='MySqlServer';"
            "Initial Catalog='pubs';Integrated Security='SSPI';");
    try
    {
        // Open recordset with data from Publishers table.
        rstPublishers.CreateInstance(__uuidof(Recordset));

        rstPublishers->CursorType = adOpenStatic;

        TESTHR(rstPublishers->Open("SELECT * FROM publishers WHERE "
            "Country='USA'",strCnn,adOpenStatic,adLockReadOnly,
            adCmdText));

        //Open an IADORecordBinding interface pointer
        //which we'll use for Binding Recordset to a class
        TESTHR(rstPublishers->QueryInterface(
            __uuidof(IADORecordBinding), (LPVOID*)&picRs));

        //Bind the Recordset to a C++ Class here
        TESTHR(picRs->BindToRecordset(&publishers));

        // Print current data in recordset.
        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();
        }
    }
    catch (_com_error &e)
    {
        // Notify the user of errors if any.
        _variant_t vtConnect = rstPublishers->GetActiveConnection();

        // GetActiveConnection returns connect string if connection
        // is not open, else returns Connection object.
        switch(vtConnect.vt)
        {
            case VT_BSTR:
                PrintComError(e);
                break;
            case VT_DISPATCH:
                PrintProviderError(vtConnect);
                break;
            default:
                printf("Errors occured.");
                break;
        }
    }

    // Clean up objects before exit.
    //Release the IADORecordset Interface here
    if (picRs)
        picRs->Release();

    if (rstPublishers)
        if (rstPublishers->State == adStateOpen)
            rstPublishers->Close();
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintProviderError Function                      //
//                                                       //
///////////////////////////////////////////////////////////

void PrintProviderError(_ConnectionPtr pCnn1)
{
    // Print Provider Errors from Connection object.
    // pErr is a record object in the Connection's Error collection.
    ErrorPtr  pErr  = NULL;

    if( (pCnn1->Errors->Count) > 0)
    {
        long nCount = pCnn1->Errors->Count;
        // Collection ranges from 0 to nCount -1.
        for(long i = 0; i < nCount; i++)
        {
            pErr = pCnn1->Errors->GetItem(i);
            printf("\t Error number: %x\t%s", pErr->Number,
                (LPCSTR) pErr->Description);
        }
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintComError Function                           //
//                                                       //
///////////////////////////////////////////////////////////

void PrintComError(_com_error &e)
{
   _bstr_t bstrSource(e.Source());
   _bstr_t bstrDescription(e.Description());

    // Print Com errors.
    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);
}
// EndFilterCpp

FilterX.h

// BeginFilterH
#include "icrsint.h"

//This Class extracts only Pub Name and Country Name.
class CPublishers : public CADORecordBinding
{
BEGIN_ADO_BINDING(CPublishers)

    //Column Pub Name is the 2nd field in the recordset
    ADO_VARIABLE_LENGTH_ENTRY2(2, adVarChar, m_szP_pubname,
         sizeof(m_szP_pubname), lP_pubnameStatus, TRUE)

    //Column Country Name is the 5th field in the 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;
};
// EndFilterH

Voir aussi

Filter, propriété | RecordCount, propriété | Recordset, objet


Exemple de méthode Find (VC++)

Cet exemple utilise la méthode Find de l'objet Recordset pour localiser et compter le nombre de titres commerciaux dans la base de données Pubs. Cet exemple présuppose que le fournisseur sous-jacent ne prend pas en charge une fonctionnalité similaire.

// BeginFindCpp
#import "C:\Program Files\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <ole2.h>
#include <stdio.h>
#include <conio.h>
#include "FindX.h"

// Function declarations
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 Function                                   //
//                                                      //
//////////////////////////////////////////////////////////

void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    FindX();

    //Wait here for the user to see the output.
    printf("Press any key to continue...");
    getch();
    ::CoUninitialize();
}

//////////////////////////////////////////////////////////
//                                                      //
//             FindX Function                           //
//                                                      //
//////////////////////////////////////////////////////////

void FindX(void)
{
    HRESULT    hr = S_OK;

    // Define ADO object pointers.
    // Initialize pointers on define.
    // These are in the ADODB::  namespace.
    _ConnectionPtr    pConnection  = NULL;
    _RecordsetPtr     pRstTitles   = NULL;
    IADORecordBinding   *picRs     = NULL;  //Interface Pointer declared.
    CTitlesRs titlers;                      //C++ class object

    _bstr_t strCnn("Provider='sqloledb';Data Source='MySqlServer';"
            "Initial Catalog='pubs';Integrated Security='SSPI';");

    try
    {
        // Open connection.
        TESTHR(pConnection.CreateInstance(__uuidof(Connection)));
        pConnection->Open (strCnn, "", "", adConnectUnspecified);

        // Open title Table
        TESTHR(pRstTitles.CreateInstance(__uuidof(Recordset)));

        pRstTitles->Open("SELECT title_id FROM titles",
            _variant_t((IDispatch *)pConnection),
            adOpenStatic, adLockReadOnly, adCmdText);

        // The default parameters are sufficient to search forward
        // through a Recordset.

        pRstTitles->Find ("title_id LIKE 'BU%'",0,adSearchForward,"");

        //Open an IADORecordBinding interface pointer which
        //we'll use for Binding Recordset to a class
        TESTHR(pRstTitles->QueryInterface(
            __uuidof(IADORecordBinding),(LPVOID*)&picRs));

        //Bind the Recordset to a C++ Class here
        TESTHR(picRs->BindToRecordset(&titlers));

        // Skip the current record to avoid finding the same
        // row repeatedly. The bookmark is redundant because Find
        // searches from the current position.
        int count = 0;

        //Continue if last find succeeded.
        while (!(pRstTitles->EndOfFile))
        {
            printf("Title ID: %s\n",titlers.lt_titleidStatus == adFldOK ?
                titlers.m_szt_titleid : "<NULL>");
            count++;                       //Count the last title found.

            _variant_t mark = pRstTitles->Bookmark;  //Note current pos.
            pRstTitles->Find("title_id LIKE 'BU%'", 1, adSearchForward,
                mark);
        }
        printf("The number of business titles is %d\n",count);
    }
    catch(_com_error &e)
    {
       // Notify the user of errors if any.
       // Pass a connection pointer accessed from the Recordset.
       PrintProviderError(pConnection);
       PrintComError(e);
    }

    // Clean up objects before exit.
    //Release the IADORecordset Interface here
    if (picRs)
        picRs->Release();

    if (pRstTitles)
        if (pRstTitles->State == adStateOpen)
            pRstTitles->Close();
    if (pConnection)
        if (pConnection->State == adStateOpen)
            pConnection->Close();
}

//////////////////////////////////////////////////////////
//                                                      //
//       PrintProviderError Function                    //
//                                                      //
//////////////////////////////////////////////////////////

void PrintProviderError(_ConnectionPtr pConnection)
{
    // Print Provider Errors from Connection object.
    // pErr is a record object in the Connection's Error collection.
    ErrorPtr    pErr  = NULL;

    if( (pConnection->Errors->Count) > 0)
    {
        long nCount = pConnection->Errors->Count;
        // Collection ranges from 0 to 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 Function                         //
//                                                      //
//////////////////////////////////////////////////////////

void PrintComError(_com_error &e)
{
   _bstr_t bstrSource(e.Source());
   _bstr_t bstrDescription(e.Description());

    // Print Com errors.
   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);
}
// EndFindCpp

FindX.h

// BeginFindH
#include "icrsint.h"

//This Class extracts only titleId from Titles table.
class CTitlesRs : public CADORecordBinding
{
BEGIN_ADO_BINDING(CTitlesRs)

    // Column title_id is the 1st field in the recordset
    // from Titles table.
    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;
};
// EndFindH

Find, méthode | Recordset, objet


Exemple de méthode GetRows (VC++)

Cet exemple utilise la méthode GetRows pour extraire un nombre défini de lignes d'un objet Recordset et remplir un tableau avec les données obtenues. La méthode GetRows renvoie un nombre de lignes inférieur à celui désiré dans deux cas : EOF a été atteint ou GetRows a essayé d'extraire un enregistrement supprimé par un autre utilisateur. La fonction renvoie la valeur False seulement dans le second cas. L'exécution de cette procédure requiert la fonction GetRowsOK.

// BeginGetRowsCpp
#import "C:\Program Files\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <stdio.h>
#include <ole2.h>
#include <conio.h>

// Function Declarations
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 Function                                //
//                                                       //
///////////////////////////////////////////////////////////

void GetRowsX(void)
{
    HRESULT hr = S_OK;

    // Define string variables.
    _bstr_t strCnn("Provider='sqloledb';Data Source='MySqlServer';"
            "Initial Catalog='pubs';Integrated Security='SSPI';");

    // Define ADO object pointers.
    // Initialize pointers on define.
    // These are in the ADODB::  namespace.
    _RecordsetPtr pRstEmployees = NULL;

    try
    {
        // Open recordset with names and hire dates from employee table.
        TESTHR(pRstEmployees.CreateInstance(__uuidof(Recordset)));

        pRstEmployees->Open("SELECT fName, lName, hire_date "
            "FROM Employee ORDER BY lName",strCnn,
            adOpenStatic, adLockReadOnly,adCmdText);

        while (true) //continuous loop
        {
            int intLines = 0;

            // Get user input for number of rows.
            printf("\nEnter number of rows to retrieve (0 to exit): ");
            int intRows;
            scanf("%d", &intRows);

            if (intRows <= 0)
                break;

            //Clear the screen for the next display
            system("cls");

            // If GetRowsOK is successful, print the results,
            // noting if the end of the file was reached.
            _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);

                // Print the retrieved data.
                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;

                        //Clear the screen for the next display
                        system("cls");
                    }
                }
            }
            else
            {
                // Assuming the GetRows error was due to data
                // changes by another user, use Requery to
                // refresh the Recordset and start over.
                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;
                }
            }

            // Because using GetRows leaves the current
            // record pointer at the last record accessed,
            // move the pointer back to the beginning of the
            // Recordset before looping back for another search.
            pRstEmployees->MoveFirst();
        }
    }
    catch(_com_error &e)
    {
       // Notify the user of errors if any.
       // Pass a connection pointer accessed from the Recordset.
        _variant_t vtConnect = pRstEmployees->GetActiveConnection();

        // GetActiveConnection returns connect string if connection
        // is not open, else returns Connection object.
        switch(vtConnect.vt)
        {
            case VT_BSTR:
                PrintComError(e);
                break;
            case VT_DISPATCH:
                PrintProviderError(vtConnect);
                break;
            default:
                printf("Errors occured.");
                break;
        }
    }

    //Clean up objects before exit.
    if (pRstEmployees)
        if (pRstEmployees->State == adStateOpen)
            pRstEmployees->Close();
}

bool GetRowsOK(_RecordsetPtr pRstTemp,int intNumber,
        _variant_t& avarData)
{
    // Store results of GetRows method in array.
    avarData = pRstTemp->GetRows(intNumber);

    // Return False only if fewer than the desired
    // number of rows were returned, but not because the
    // end of the Recordset was reached.
    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 Array's Upper Bound\n");
        return false;
    }
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintProviderError Function                      //
//                                                       //
///////////////////////////////////////////////////////////

void PrintProviderError(_ConnectionPtr pConnection)
{
    // Print Provider Errors from Connection object.
    // pErr is a record object in the Connection's Error collection.
    ErrorPtr  pErr  = NULL;

    if( (pConnection->Errors->Count) > 0)
    {
        long nCount = pConnection->Errors->Count;
        // Collection ranges from 0 to 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 Function                           //
//                                                       //
///////////////////////////////////////////////////////////

void PrintComError(_com_error &e)
{
   _bstr_t bstrSource(e.Source());
   _bstr_t bstrDescription(e.Description());

    // Print Com errors.
   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);
}
// EndGetRowsCpp

BOF, EOF, propriétés | GetRows, méthode | Recordset, objet


Exemple de méthode GetString (VC++)

Cet exemple met en application la méthode GetString.

Il suppose que vous déboguez un problème d'accès aux données et que vous voulez trouver un moyen simple et rapide d'imprimer le contenu d'un petit objet Recordset.

// BeginGetStringCpp
#import "C:\Program Files\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <ole2.h>
#include <stdio.h>
#include <conio.h>
#include <string.h>

// Function declarations
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 Function                                   //
//                                                      //
//////////////////////////////////////////////////////////

void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    GetStringX();

    ::CoUninitialize();
}

//////////////////////////////////////////////////////////
//                                                      //
//          GetStringX Function                         //
//                                                      //
//////////////////////////////////////////////////////////

void GetStringX(void)
{
    HRESULT  hr = S_OK;

    // Define ADO object pointers.
    // Initialize pointers on define.
    // These are in the ADODB::  namespace.
   _ConnectionPtr  pConnection   = NULL;
   _RecordsetPtr   pRstAuthors   = NULL;

    // Define string variables.
    _bstr_t strCnn("Provider='sqloledb';Data Source='localhost';"
            "Initial Catalog='Northwind';Integrated Security='SSPI';");
    _bstr_t varOutput;
    char *strPrompt = "Enter a state (CA, IN, KS, MD, MI, OR, TN, UT): ";
    char strState[2], *pState;

    try
    {
       // Open connection.
        TESTHR(pConnection.CreateInstance(__uuidof(Connection)));

        // Open a command object for a stored procedure,
        // with one 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, "", "", adConnectUnspecified);

        pRstAuthors->Open(strQuery, _variant_t((IDispatch*)pConnection,
            true),
        adOpenStatic, adLockReadOnly, adCmdText);

        if (pRstAuthors->RecordCount > 0)
        {
            // Use all defaults: get all rows, TAB column delimiter,
            // CARRIAGE RETURN row delimiter, empty-string null delimiter
            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);
        }
        // Clean up objects before exit.
        pRstAuthors->Close();
        pConnection->Close();
   }

   catch(_com_error &e)
   {
       // Notify the user of errors if any.
       // Pass a connection pointer accessed from the Recordset.
       PrintProviderError(pConnection);
       PrintComError(e);
   }
}

//////////////////////////////////////////////////////////
//                                                      //
//        PrintProviderError Function                   //
//                                                      //
//////////////////////////////////////////////////////////

void PrintProviderError(_ConnectionPtr pConnection)
{
    // Print Provider Errors from Connection object.
    // pErr is a record object in the Connection's Error collection.
    ErrorPtr   pErr = NULL;

    if( (pConnection->Errors->Count) > 0)
    {
        long nCount = pConnection->Errors->Count;
        // Collection ranges from 0 to 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 Function                          //
//                                                      //
//////////////////////////////////////////////////////////

void PrintComError(_com_error &e)
{
   _bstr_t bstrSource(e.Source());
   _bstr_t bstrDescription(e.Description());

    // Print Com errors.
   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);

}
// EndGetStringCpp

GetString, méthode | Recordset, objet


Exemple de propriétés IsolationLevel et Mode (VC++)

Cet exemple utilise la propriété Mode pour ouvrir une connexion exclusive, et la propriété IsolationLevel pour ouvrir une transaction effectuée indépendamment des autres transactions.

// BeginIsolationLevelCpp
#import "C:\Program Files\Common Files\System\ADO\msado15.dll"\
    no_namespace rename("EOF","EndOfFile")

#include <ole2.h>
#include <stdio.h>
#include <conio.h>
#include "IsolationLevelX.h"

// Function Declarations
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 Function                        //
//                                                             //
//                                                             //
/////////////////////////////////////////////////////////////////

void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    IsolationLevelX();

    printf("Press any key to continue...");
    getch();
    ::CoUninitialize();
}

/////////////////////////////////////////////////////////////////
//                                                             //
//      IsolationLevelX()  Function                            //
//                                                             //
/////////////////////////////////////////////////////////////////

void IsolationLevelX(void)
{
    // Define ADO ObjectPointers
    // Initialize Pointers on define
    // These are in the ADODB :: namespace
    _RecordsetPtr  pRstTitles  = NULL;
    _ConnectionPtr pConnection = NULL;

    // Define other Variables
    HRESULT hr = S_OK;
    IADORecordBinding *picRs  = NULL;  // Interface Pointer Declared
    CTitleRs titlers;                  // C++ Class Object
    LPSTR p_TempStr = NULL;

    //Assign Connection String to Variable
    _bstr_t strCnn("Provider='sqloledb';Data Source='MySqlServer';"
                    "Initial Catalog='pubs';Integrated Security='SSPI';");

    try
    {
        // Open Connection and Titles Table
        TESTHR(pConnection.CreateInstance(__uuidof(Connection)));
        pConnection->Mode = adModeShareExclusive;
        pConnection->IsolationLevel = adXactIsolated;
        pConnection->Open(strCnn,"","",adConnectUnspecified);

        TESTHR(pRstTitles.CreateInstance(__uuidof(Recordset)));
        pRstTitles->CursorType = adOpenDynamic;
        pRstTitles->LockType = adLockPessimistic;

        pRstTitles->Open("titles",_variant_t((IDispatch*) pConnection,
            true),adOpenDynamic,adLockPessimistic,adCmdTable);

        pConnection->BeginTrans();

        // Display Connection Mode
        if(pConnection->Mode == adModeShareExclusive)
        {
            printf("Connection Mode Is Exclusive");
        }
        else
        {
            printf("Connection Mode Is Not Exclusive");
        }

        // Display Isolation Level
        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();
        }

        // Open an IADORecordBinding interface pointer which
        // we will use for binding Recordset to a class
        TESTHR(pRstTitles->QueryInterface(
            __uuidof(IADORecordBinding),(LPVOID*)&picRs));

        // Bind the Recordset to a C++ class here
        TESTHR(picRs->BindToRecordset(&titlers));

        // Change the type of psychology titles.
        p_TempStr = (LPSTR) malloc(sizeof(titlers.m_szau_Type));

        while (!(pRstTitles->EndOfFile))
        {
            // Set the final character of the destination string to NULL.
            p_TempStr[sizeof(titlers.m_szau_Type)-1] = '\0';
            // The source string will get truncated if its length is
            // longer than the length of the destination string minus one.
            strncpy(p_TempStr,strtok(titlers.m_szau_Type," "),sizeof(titlers.m_szau_Type)-1);

            // Compare type with psychology
            if (!strcmp(p_TempStr,"psychology"))
            {
                // Set the final character of the destination string to NULL.
                titlers.m_szau_Type[sizeof(titlers.m_szau_Type)-1] = '\0';
                // Copy "self_help" title field
                // The source string will get truncated if its length is
                // longer than the length of the destination string minus one.
                strncpy(titlers.m_szau_Type,"self_help",sizeof(titlers.m_szau_Type)-1);
                picRs->Update(&titlers);
            }
            pRstTitles->MoveNext();
        }
        // Print current data in recordset.
        pRstTitles->Requery(adOptionUnspecified);

        // Open again IADORecordBinding interface pointer for Binding
        // Recordset to a class.
        TESTHR(pRstTitles->QueryInterface(
            __uuidof(IADORecordBinding),(LPVOID*)&picRs));

        // ReBinding the Recordset to a C++ Class
        TESTHR(picRs->BindToRecordset(&titlers));

        // Move to the first record of the title table
        pRstTitles->MoveFirst();

        //Clear the screen for the next display
        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();
        }
    }
    catch(_com_error &e)
    {
        // Notify the user of errors if any.
        PrintProviderError(pConnection);
        PrintComError(e);
    }

    // Clean up objects before exit.
    //Release the IADORecordset Interface here
    if (picRs)
        picRs->Release();

    if (pRstTitles)
        if (pRstTitles->State == adStateOpen)
            pRstTitles->Close();
    if (pConnection)
        if (pConnection->State == adStateOpen)
        {
            // Restore Original Data
            pConnection->RollbackTrans();

            pConnection->Close();
        }

    // Deallocate the memory
    if (p_TempStr)
        free(p_TempStr);
}

/////////////////////////////////////////////////////////////////
//                                                             //
//                  PrintProviderError Function                //
//                                                             //
/////////////////////////////////////////////////////////////////

void PrintProviderError(_ConnectionPtr pConnection)
{
    //Print Provider Errors from Connection object
    //pErr is a record object in the Connection's Error collection
    ErrorPtr    pErr = NULL;

    if((pConnection->Errors->Count)>0)
    {
        long nCount = pConnection->Errors->Count;

        //Collection ranges from 0 to 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 Function                           //
//                                                       //
///////////////////////////////////////////////////////////

void PrintComError(_com_error &e)
{
   _bstr_t bstrSource(e.Source());
   _bstr_t bstrDescription(e.Description());

    // Print Com errors.
    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);
}
// EndIsolationLevelCpp

IsolationLevelX.h

// BeginIsolationLevelH

#include "icrsint.h"

//This class extracts titles and type from Title table

class CTitleRs : public CADORecordBinding
{
BEGIN_ADO_BINDING(CTitleRs)
        // Column title is the 2nd field in the table
        ADO_VARIABLE_LENGTH_ENTRY2(2,adVarChar,m_szau_Title,
            sizeof(m_szau_Title),lau_TitleStatus,FALSE)
        // Column type is the 3rd field in the table
        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;
};
// EndIsolationLevelH

IsolationLevel, propriété | Mode, propriété


Exemple de propriété Item (VC++)

Cet exemple montre comment la propriété Item est utilisée pour accéder aux membres d'une collection. L'exemple ouvre la table Authors de la base de données Pubs à l'aide d'une commande paramétrée.

Dans la commande émise sur la base de données, le paramètre est accessible à partir de la collection Parameters de l'objet Command grâce à l'index et au nom. Les champs du Recordset renvoyé sont ensuite accessibles via la collection Fields de l'objet par l'index et le nom.

// BeginItemCpp
#import "C:\Program Files\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <ole2.h>
#include <stdio.h>
#include <conio.h>

// Function declarations
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 Function                                  //
//                                                      //
//////////////////////////////////////////////////////////

void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

        ItemX();

     //Wait here for the user to see the output
     printf("Press any key to continue...");
     getch();
    ::CoUninitialize();
}

//////////////////////////////////////////////////////////
//                                                      //
//       ItemX Function                                 //
//                                                      //
//////////////////////////////////////////////////////////

void ItemX(void)
{
    HRESULT  hr = S_OK;

    // Define ADO object pointers.
    // Initialize pointers on define.
    // These are in the ADODB::  namespace.
   _ConnectionPtr  pConnection  = NULL;
   _RecordsetPtr   pRst     = NULL;
   _CommandPtr     pCmd     = NULL;
   _ParameterPtr   pPrm     = NULL;
    FieldPtr       pFld     = NULL;

    // Other Variables.
    _bstr_t strCnn("Provider='sqloledb';Data Source='MySqlServer';"
            "Initial Catalog='pubs';Integrated Security='SSPI';");
    _variant_t    Column[9];
    _variant_t    vIndex;

    try
    {
       // Open connection.
        TESTHR(pConnection.CreateInstance(__uuidof(Connection)));

        TESTHR(pRst.CreateInstance(__uuidof(Recordset)));

        TESTHR(pCmd.CreateInstance(__uuidof(Command)));

        //Set the array with the authors table field (column) names
        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, "", "", adConnectUnspecified);
        pCmd->ActiveConnection = pConnection;

        // Connection and CommandType are omitted because
        // a Command object is provided.
        _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();

            // Because Value is the default property of a
            // Property object,the use of the actual keyword
            // here is 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();

            // Because Value is the default property of a
            // Property object,the use of the actual keyword
            // here is 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;
            }
        }
    }
    catch(_com_error &e)
    {
       // Notify the user of errors if any.
       // Pass a connection pointer accessed from the Recordset.
       PrintProviderError(pConnection);
       PrintComError(e);
    }

    // Clean up objects before exit.
    if (pRst)
        if (pRst->State == adStateOpen)
            pRst->Close();
    if (pConnection)
        if (pConnection->State == adStateOpen)
            pConnection->Close();
}

//////////////////////////////////////////////////////////
//                                                      //
//      PrintProviderError Function                     //
//                                                      //
//////////////////////////////////////////////////////////

void PrintProviderError(_ConnectionPtr pConnection)
{
    // Print Provider Errors from Connection object.
    // pErr is a record object in the Connection's Error collection.
    ErrorPtr    pErr  = NULL;

    if( (pConnection->Errors->Count) > 0)
    {
        long nCount = pConnection->Errors->Count;
        // Collection ranges from 0 to 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 Function                         //
//                                                      //
//////////////////////////////////////////////////////////

void PrintComError(_com_error &e)
{
   _bstr_t bstrSource(e.Source());
   _bstr_t bstrDescription(e.Description());

    // Print Com errors.
   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);
}
// EndItemCpp

Voir aussi

Command, objet | Fields, collection | Item, propriété | Parameters, collection | Recordset, objet


Exemple de propriété MarshalOptions (VC++)

Cet exemple utilise la propriété MarshalOptions pour spécifier les lignes renvoyées au serveur, à savoir la totalité des lignes ou uniquement celles qui ont été modifiées.

// BeginMarshalOptionsCpp
#import "C:\Program Files\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"

// Function declarations
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 Function                           //
//                                                       //
///////////////////////////////////////////////////////////

void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

      MarshalOptionsX();

    printf("Press any key to continue...");
    getch();
    ::CoUninitialize();
}

///////////////////////////////////////////////////////////
//                                                       //
//      Marshal Options Function                         //
//                                                       //
///////////////////////////////////////////////////////////

void   MarshalOptionsX(void)
{

    // Define string variables
    _bstr_t strCnn("Provider='sqloledb';Data Source='MySqlServer';"
            "Initial Catalog='pubs';Integrated Security='SSPI';");

    // Define ADO object pointers.
    // Initialize pointers on define.
    // These are in the ADODB::  namespace
    _RecordsetPtr pRstEmployees = NULL;

    // Define Other Variables
    IADORecordBinding   *picRs  = NULL;  //Interface Pointer declared
    CEmployeeRs emprs;               //C++ Class Object
    HRESULT hr = S_OK;
    LPSTR strOldFirst = NULL;
    LPSTR strOldLast = NULL;

    try
    {
        // Open recordset with names from Employee table.
        TESTHR(pRstEmployees.CreateInstance(__uuidof(Recordset)));
        pRstEmployees->CursorType = adOpenKeyset;
        pRstEmployees->LockType = adLockOptimistic;
        pRstEmployees->CursorLocation = adUseClient;
        pRstEmployees->Open("SELECT fname, lname FROM Employee "
            "ORDER BY lname",strCnn,
            adOpenKeyset, adLockOptimistic,adCmdText);

        // Open an IADORecordBinding interface pointer which
        // we'll use for Binding Recordset to a class.
        TESTHR(pRstEmployees->QueryInterface(
            __uuidof(IADORecordBinding),(LPVOID*)&picRs));

        // Bind the Recordset to a C++ Class here.
        TESTHR(picRs->BindToRecordset(&emprs));

        // Store Original Data
        strOldFirst = (LPSTR) malloc(sizeof(emprs.m_szemp_fname));
        strOldLast  = (LPSTR) malloc(sizeof(emprs.m_szemp_lname));
        // Set the final character of the destination string to NULL.
        strOldFirst[sizeof(emprs.m_szemp_fname)-1] = '\0';
        // The source string will get truncated if its length is
        // longer than the length of the destination string minus one.
        strncpy(strOldFirst,strtok(emprs.m_szemp_fname," "),
            sizeof(emprs.m_szemp_fname)-1);
        // Set the final character of the destination string to NULL.
        strOldLast[sizeof(emprs.m_szemp_lname)-1] = '\0';
        // The source string will get truncated if its length is
        // longer than the length of the destination string minus one.
        strncpy(strOldLast,strtok(emprs.m_szemp_lname," "),
            sizeof(emprs.m_szemp_lname)-1);

        //Change Data in Edit Buffer
        // Set the final character of the destination string to NULL.
        emprs.m_szemp_fname[sizeof(emprs.m_szemp_fname)-1] = '\0';
        // The source string will get truncated if its length is
        // longer than the length of the destination string minus one.
        strncpy(emprs.m_szemp_fname,"Linda",sizeof(emprs.m_szemp_fname)-1);
        // Set the final character of the destination string to NULL.
        emprs.m_szemp_lname[sizeof(emprs.m_szemp_lname)-1] = '\0';
        // The source string will get truncated if its length is
        // longer than the length of the destination string minus one.
        strncpy(emprs.m_szemp_lname,"Kobara",sizeof(emprs.m_szemp_lname)-1);

        // Show contents of buffer and get user input
        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);
                        }
                }
        }
        // Show the resulting data
        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>");

        // Restore original data because this is a demonstration
        if((strcmp(strOldFirst,emprs.m_szemp_fname)) &&
           (strcmp(strOldLast,emprs.m_szemp_lname)))
        {
            // Set the final character of the destination string to NULL.
            emprs.m_szemp_fname[sizeof(emprs.m_szemp_fname)-1] = '\0';
            // The source string will get truncated if its length is
            // longer than the length of the destination string minus one.
            strncpy(emprs.m_szemp_fname,strOldFirst,
                sizeof(emprs.m_szemp_fname)-1);
            // Set the final character of the destination string to NULL.
            emprs.m_szemp_lname[sizeof(emprs.m_szemp_lname)-1] = '\0';
            // The source string will get truncated if its length is
            // longer than the length of the destination string minus one.
            strncpy(emprs.m_szemp_lname,strOldLast,
                sizeof(emprs.m_szemp_lname)-1);
            picRs->Update(&emprs);
        }
    }
    catch(_com_error &e)
    {
       // Notify the user of errors if any.
       // Pass a connection pointer accessed from the Recordset.
        _variant_t vtConnect = pRstEmployees->GetActiveConnection();

        // GetActiveConnection returns connect string if connection
        // is not open, else returns Connection object.
        switch(vtConnect.vt)
        {
            case VT_BSTR:
                PrintComError(e);
                break;
            case VT_DISPATCH:
                PrintProviderError(vtConnect);
                break;
            default:
                printf("Errors occured.");
                break;
        }
    }

    // Clean up objects before exit.
    // Deallocate memory
    if (strOldFirst)
        free(strOldFirst);
    if (strOldLast)
        free(strOldLast);

    //Release the IADORecordset Interface here
    if (picRs)
        picRs->Release();

    if (pRstEmployees)
        if (pRstEmployees->State == adStateOpen)
            pRstEmployees->Close();
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintProviderError Function                      //
//                                                       //
///////////////////////////////////////////////////////////

void PrintProviderError(_ConnectionPtr pConnection)
{
    // Print Provider Errors from Connection object.
    // pErr is a record object in the Connection's Error collection.
    ErrorPtr     pErr   = NULL;

    if( (pConnection->Errors->Count) > 0)
    {
        long nCount = pConnection->Errors->Count;
        // Collection ranges from 0 to 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 Function                           //
//                                                       //
///////////////////////////////////////////////////////////

void PrintComError(_com_error &e)
{
    _bstr_t bstrSource(e.Source());
    _bstr_t bstrDescription(e.Description());

     // Print Com errors.
    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);
}
// EndMarshalOptionsCpp

MarshalOptionsX.h

// BeginMarshalOptionsH

#include "icrsint.h"

//This Class extracts only fname,lname from employees table
class CEmployeeRs : public CADORecordBinding
{
BEGIN_ADO_BINDING(CEmployeeRs)

    //Column fname is the 1st field in the recordset
    ADO_VARIABLE_LENGTH_ENTRY2(1, adVarChar, m_szemp_fname,
         sizeof(m_szemp_fname), lemp_fnameStatus, TRUE)

     //Column lname is the 2nd field in the 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;
};
// EndMarshalOptionsH

MarshalOptions, propriété


Exemple de propriété MaxRecords (VC++)

Cet exemple utilise la propriété MaxRecords pour ouvrir un objet Recordset contenant les 10 livres les plus chers figurant dans la table Titles.

// BeginMaxRecordsCpp
#import "C:\Program Files\Common Files\System\ADO\msado15.dll"\
    no_namespace rename("EOF","EndOfFile")

#include <ole2.h>
#include <stdio.h>
#include <conio.h>
#include "MaxRecordsX.h"

// Function Declarations
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 Function                     //
//                                                          //
//////////////////////////////////////////////////////////////

void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    MaxRecordsX();

    printf("Press any key to continue...");
    getch();
    ::CoUninitialize();
}

//   MaxRecordsX()  Function
void  MaxRecordsX(void)
{
    // Define ADO ObjectPointers
    // Initialize Pointers on define
    // These are in the ADODB :: namespace
    _RecordsetPtr pRstTemp    = NULL;

    // Define Other Variables
    IADORecordBinding *picRs  = NULL;   // Interface Pointer Declared
    CTitleRs titlers;            // C++ Class Object
    HRESULT hr = S_OK;

    try
    {
        //Assign Connection String to Variable
        _bstr_t strCnn("Provider='sqloledb';Data Source='MySqlServer';"
                    "Initial Catalog='pubs';Integrated Security='SSPI';");

        // Open Recordset containing the 10 most expensive titles in the
        // Titles table.
        TESTHR(pRstTemp.CreateInstance(__uuidof(Recordset)));

        pRstTemp->MaxRecords=10;

        pRstTemp->Open("SELECT title,price FROM Titles "
            "ORDER BY Price DESC",strCnn,adOpenForwardOnly,
            adLockReadOnly,adCmdText);

        // Open an IADORecordBinding interface pointer which
        // we will use for binding Recordset to a class
        TESTHR(pRstTemp->QueryInterface(
            __uuidof(IADORecordBinding),(LPVOID*)&picRs));

        // Bind the Recordset to a C++ class here
        TESTHR(picRs->BindToRecordset(&titlers));

        // Display the contents of the Recordset
        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();
        }
    }
    catch(_com_error &e)
    {
       // Notify the user of errors if any.
       // Pass a connection pointer accessed from the Recordset.
        _variant_t vtConnect = pRstTemp->GetActiveConnection();

        // GetActiveConnection returns connect string if connection
        // is not open, else returns Connection object.
        switch(vtConnect.vt)
        {
            case VT_BSTR:
                PrintComError(e);
                break;
            case VT_DISPATCH:
                PrintProviderError(vtConnect);
                break;
            default:
                printf("Errors occured.");
                break;
        }
    }

    // Clean up objects before exit.
    //Release the IADORecordset Interface here
    if (picRs)
        picRs->Release();

    if (pRstTemp)
        if (pRstTemp->State == adStateOpen)
            pRstTemp->Close();
};

//////////////////////////////////////////////////////////////
//                                                          //
//                  PrintProviderError Function             //
//                                                          //
//////////////////////////////////////////////////////////////

void PrintProviderError(_ConnectionPtr pConnection)
{
    //Print Provider Errors from Connection object
    //pErr is a record object in the Connection's Error collection
    ErrorPtr    pErr = NULL;

    if((pConnection->Errors->Count)>0)
    {
        long nCount = pConnection->Errors->Count;

        //Collection ranges from 0 to 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 Function                           //
//                                                       //
///////////////////////////////////////////////////////////

void PrintComError(_com_error &e)
{
    _bstr_t bstrSource(e.Source());
    _bstr_t bstrDescription(e.Description());

    // Print Com errors.
    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);
}
// EndMaxRecordsCpp

MaxRecords, propriété | Recordset, objet


Exemple de méthode Move (VC++)

Cet exemple utilise la méthode Move pour positionner le pointeur de l'enregistrement, en fonction des entrées émises par l'utilisateur.

// BeginMoveCpp
#import "C:\Program Files\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"

// Function Declaration.
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void MoveX(void);
void PrintProviderError(_ConnectionPtr pConnection);
void PrintComError(_com_error &e);
inline char* mygets(char* strDest, int n)
{
    char strExBuff[10];
    char* pstrRet = fgets(strDest, n, stdin);

    if (pstrRet == NULL)
        return NULL;

    if (!strrchr(strDest, '\n'))
        // Exhaust the input buffer.
        do
        {
            fgets(strExBuff, sizeof(strExBuff), stdin);
        }while (!strrchr(strExBuff, '\n'));
    else
        // Replace '\n' with '\0'
        strDest[strrchr(strDest, '\n') - strDest] = '\0';

    return pstrRet;
}

///////////////////////////////////////////////////////////
//                                                       //
//      Main Function                                    //
//                                                       //
///////////////////////////////////////////////////////////
void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

     MoveX();

     ::CoUninitialize();
}

//////////////////////////////////////////////////
//                                              //
//      MoveX Function                          //
//                                              //
//////////////////////////////////////////////////

void MoveX(void)
{
    // Define ADO object pointers.
    // Initialize pointers on define.
    // These are in the ADODB::  namespace.
    _RecordsetPtr  pRstAuthors    = NULL;

    // Define Other Variables
    IADORecordBinding   *picRs = NULL;  //Interface Pointer declared
    CAuthorsRs    authorsrs;         //C++ class object
    HRESULT hr = S_OK;

    // Open Authors table
    _bstr_t strCnn("Provider='sqloledb';Data Source='MySqlServer';"
            "Initial Catalog='pubs';Integrated Security='SSPI';");

    try
    {
        // Open recordset from Authors table.
        TESTHR(pRstAuthors.CreateInstance(__uuidof(Recordset)));

        pRstAuthors->CursorType = adOpenStatic;
        // Use client cursor to allow use of AbsolutePosition property.
        pRstAuthors->CursorLocation = adUseClient;

        pRstAuthors->Open("SELECT au_id, au_fname, au_lname, city, "
            "state FROM Authors ORDER BY au_lname", strCnn, adOpenStatic,
            adLockReadOnly, adCmdText);

        // Open an IADORecordBinding interface pointer which we'll use
        // for Binding Recordset to a class.
        TESTHR(pRstAuthors->QueryInterface(
            __uuidof(IADORecordBinding),(LPVOID*)&picRs));

        // Bind the Recordset to a C++ Class here.
        TESTHR(picRs->BindToRecordset(&authorsrs));

        pRstAuthors->MoveFirst();

        char *strMove;
        char strTemp[5];
        while(true)
        {
            // Display information about current record and ask how many
            // records to move.
            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>");

            printf("Enter number of records to Move "
                "\n(positive or negative, Enter to quit): ");
            mygets(strTemp, 5);

            strMove = strtok(strTemp," \t");

            if (strMove == NULL)
                break;

            // if the input is not numeric then notify the user.
            if(!atol(strMove))
            {
                printf("Expecting numeric value...\n");
                continue;
            }

            // Store bookmark in case the Move goes too far
            // forward or backward.
            _variant_t varBookmark = pRstAuthors->Bookmark;

            // Move method requires parameter of data type Long.
            long lngMove = atol(strMove);

            pRstAuthors->Move(lngMove);

            // Trap for BOF or 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;
            }
        }
    }
    catch(_com_error &e)
    {
       // Notify the user of errors if any.
       // Pass a connection pointer accessed from the Recordset.
        _variant_t vtConnect = pRstAuthors->GetActiveConnection();

        // GetActiveConnection returns connect string if connection
        // is not open, else returns Connection object.
        switch(vtConnect.vt)
        {
            case VT_BSTR:
                PrintComError(e);
                break;
            case VT_DISPATCH:
                PrintProviderError(vtConnect);
                break;
            default:
                printf("Errors occured.");
                break;
        }
    }

    // Clean up objects before exit.
    //Release the IADORecordset Interface here
    if (picRs)
        picRs->Release();

    if (pRstAuthors)
        if (pRstAuthors->State == adStateOpen)
            pRstAuthors->Close();
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintProviderError Function                      //
//                                                       //
///////////////////////////////////////////////////////////

void PrintProviderError(_ConnectionPtr pConnection)
{
    // Print Provider Errors from Connection object.
    // pErr is a record object in the Connection's Error collection.
    ErrorPtr  pErr  = NULL;

    if( (pConnection->Errors->Count) > 0)
    {
        long nCount = pConnection->Errors->Count;
        // Collection ranges from 0 to 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 Function                           //
//                                                       //
///////////////////////////////////////////////////////////

void PrintComError(_com_error &e)
{
   _bstr_t bstrSource(e.Source());
   _bstr_t bstrDescription(e.Description());

    // Print Com errors.
   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);
}
// EndMoveCpp

MoveX.h

// BeginMoveH

#include "icrsint.h"

// This Class extracts fname, lname, city and state
// from the "authors" table.

class CAuthorsRs : public CADORecordBinding
{
BEGIN_ADO_BINDING(CAuthorsRs)

    // Column au_id is the 1st field in the 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;
};

// EndMoveH

Move, méthode


Exemple de méthodes MoveFirst, MoveLast, MoveNext et MovePrevious (VC++)

Cet exemple utilise les méthodes MoveFirst, MoveLast, MoveNext et MovePrevious pour déplacer le pointeur de l'enregistrement d'un objet Recordset sur la base de la commande transmise. La fonction MoveAny est nécessaire à l'exécution de cet exemple.

// BeginMoveFirstCpp
#include <ole2.h>
#include <stdio.h>

#import "c:\Program Files\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

// Function declarations
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 Function          //
/////////////////////////////////

void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    MoveFirstX();

    ::CoUninitialize();
}

//////////////////////////////////////
//      MoveFirstX Function         //
//////////////////////////////////////

void MoveFirstX()
{
    HRESULT    hr = S_OK;
    _RecordsetPtr    pRstAuthors  = NULL;
    _bstr_t strCnn("Provider='sqloledb';Data Source='MySqlServer';"
            "Initial Catalog='pubs';Integrated Security='SSPI';");
    _bstr_t strMessage("UPDATE Titles SET Type = "
            "'psychology' WHERE Type = 'self_help'");
    int intCommand = 0;

    // Temporary string variable for type conversion for printing.
    _bstr_t  bstrFName;
    _bstr_t  bstrLName;

    try
    {
        // Open recordset from Authors table.
        TESTHR(pRstAuthors.CreateInstance(__uuidof(Recordset)));
        pRstAuthors->CursorType = adOpenStatic;

        // Use client cursor to enable AbsolutePosition property.
        pRstAuthors->CursorLocation = adUseClient;
        pRstAuthors->Open("Authors", strCnn, adOpenStatic,
            adLockBatchOptimistic, adCmdTable);

        // Show current record information and get user's method choice.
        while (true)  // Continuous loop.
        {
            // Convert variant string to convertable string type.
            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;   // Out of range entry exits program loop.

            // Call method based on user's input.
            MoveAny(intCommand, pRstAuthors);
        }
    }
    catch (_com_error &e)
    {
       // Notify the user of errors if any.
       // Pass a connection pointer accessed from the Recordset.
        _variant_t vtConnect = pRstAuthors->GetActiveConnection();

        // GetActiveConnection returns connect string if connection
        // is not open, else returns Connection object.
        switch(vtConnect.vt)
        {
            case VT_BSTR:
                PrintComError(e);
                break;
            case VT_DISPATCH:
                PrintProviderError(vtConnect);
                break;
            default:
                printf("Errors occured.");
                break;
        }
    }

    // Clean up objects before exit.
    if (pRstAuthors)
        if (pRstAuthors->State == adStateOpen)
            pRstAuthors->Close();
}

/////////////////////////////////
//      MoveAny Function       //
/////////////////////////////////

void MoveAny(int intChoice, _RecordsetPtr pRstTemp)
{
    // Use specified method, trapping for BOF and 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)
    {
       // Notify the user of errors if any.
       // Pass a connection pointer accessed from the Recordset.
        _variant_t vtConnect = pRstTemp->GetActiveConnection();

        // GetActiveConnection returns connect string if connection
        // is not open, else returns Connection object.
        switch(vtConnect.vt)
        {
            case VT_BSTR:
                PrintComError(e);
                break;
            case VT_DISPATCH:
                PrintProviderError(vtConnect);
                break;
            default:
                printf("Errors occured.");
                break;
        }
    }
}

////////////////////////////////////////////
//      PrintProviderError Function       //
////////////////////////////////////////////

void PrintProviderError(_ConnectionPtr pConnection)
{
    // Print Provider Errors from Connection object.

    // pErr is a record object in the Connection's Error collection.
    ErrorPtr  pErr  = NULL;

    if( (pConnection->Errors->Count) > 0)
    {
        long nCount = pConnection->Errors->Count;
        // Collection ranges from 0 to 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 Function      //
//////////////////////////////////////

void PrintComError(_com_error &e)
{
    _bstr_t bstrSource(e.Source());
    _bstr_t bstrDescription(e.Description());

    // Print Com errors.
    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);
}
// EndMoveFirstCpp

Voir aussi

MoveFirst, MoveLast, MoveNext et MovePrevious, méthodes | Recordset, objet


Exemple de méthode NextRecordset (VC++)

Cet exemple utilise la méthode NextRecordset pour afficher les données dans un jeu d'enregistrements qui utilise une instruction de commande combinée, composée de trois différentes instructions SELECT.

// BeginNextRecordsetCpp
#import "C:\Program Files\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <stdio.h>
#include <ole2.h>
#include <conio.h>
#include <stdlib.h>

//Function Declaration.
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 Function                                    //
//                                                       //
///////////////////////////////////////////////////////////
void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    NextRecordsetX();

    ::CoUninitialize();
}

//////////////////////////////////////////////////
//                                              //
//      NextRecordsetX Function                 //
//                                              //
//////////////////////////////////////////////////

void NextRecordsetX(void)
{
    // Define ADO object pointers.
    // Initialize pointers on define.
    // These are in the ADODB::  namespace.
    _RecordsetPtr    pRstCompound = NULL;

    // Define Other Variables
    HRESULT hr = S_OK;
    _variant_t index;
    index.vt = VT_I2;

    // Assign connection string to a variable.
    _bstr_t strCnn("Provider='sqloledb';Data Source='MySqlServer';"
            "Initial Catalog='pubs';Integrated Security='SSPI';");

    try
    {
        // Open recordset from Authors table.
        TESTHR(pRstCompound.CreateInstance(__uuidof(Recordset)));

        // Pass the Cursor type and Lock type to the Recordset.
        pRstCompound->Open("SELECT * FROM authors; SELECT * FROM stores;"
            "SELECT * FROM jobs", strCnn, adOpenForwardOnly,
            adLockReadOnly, adCmdText);

        // Display results from each SELECT statement.
        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();

                    //Clear the screen for the next display.
                    system("cls");
                }
            }
            long    lngRec = 0;
            pRstCompound = pRstCompound->
                NextRecordset((VARIANT *)lngRec);

            printf("\nPress any key to continue...");
            getch();
            intCount = intCount + 1;
        }
    }
    catch(_com_error &e)
    {
       // Notify the user of errors if any.
       // Pass a connection pointer accessed from the Recordset.
        _variant_t vtConnect = pRstCompound->GetActiveConnection();

        // GetActiveConnection returns connect string if connection
        // is not open, else returns Connection object.
        switch(vtConnect.vt)
        {
            case VT_BSTR:
                PrintComError(e);
                break;
            case VT_DISPATCH:
                PrintProviderError(vtConnect);
                break;
            default:
                printf("Errors occured.");
                break;
        }
    }

    // Clean up objects before exit.
    if (pRstCompound)
        if (pRstCompound->State == adStateOpen)
            pRstCompound->Close();
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintProviderError Function                      //
//                                                       //
///////////////////////////////////////////////////////////

void PrintProviderError(_ConnectionPtr pConnection)
{
    // Print Provider Errors from Connection object.
    // pErr is a record object in the Connection's Error collection.
    ErrorPtr    pErr   = NULL;

    if( (pConnection->Errors->Count) > 0)
    {
        long nCount = pConnection->Errors->Count;
        // Collection ranges from 0 to 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 Function                           //
//                                                       //
///////////////////////////////////////////////////////////

void PrintComError(_com_error &e)
{
    _bstr_t bstrSource(e.Source());
    _bstr_t bstrDescription(e.Description());

    // Print Com errors.
    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);
}
// EndNextRecordsetCpp

NextRecordset, méthode


Exemple de propriétés NumericScale et Precision (VC++)

Cet exemple utilise les propriétés NumericScale et Precision pour afficher l'échelle numérique et la précision des champs de la table Discounts de la base de données Pubs.

// BeginNumericScaleCpp
#import "C:\Program Files\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <ole2.h>
#include <stdio.h>
#include <conio.h>

// Function declarations
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 Function                                    //
//                                                       //
///////////////////////////////////////////////////////////

void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    NumericScaleX();

    ::CoUninitialize();
}

///////////////////////////////////////////////////////////
//                                                       //
//      NumericScaleX Function                           //
//                                                       //
///////////////////////////////////////////////////////////

void NumericScaleX(void)
{
    // Define ADO object pointers.
    // Initialize pointers on define.
    // These are in the ADODB::  namespace
    _RecordsetPtr  pRstDiscounts  = NULL;
     FieldsPtr  fldTemp  = NULL;

    //Define Other Variables
    HRESULT  hr = S_OK;
    _variant_t Index;
    Index.vt = VT_I2;

    _bstr_t strCnn("Provider='sqloledb';Data Source='MySqlServer';"
         "Initial Catalog='pubs';Integrated Security='SSPI';");

    try
    {
        // Open recordset.
        TESTHR(pRstDiscounts.CreateInstance(__uuidof(Recordset)));
        pRstDiscounts->Open("discounts", strCnn, adOpenForwardOnly,
            adLockReadOnly, adCmdTable);

        // Display numeric scale and precision of
        // numeric and small integer fields.
        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());
            }
        }
    }
    catch(_com_error &e)
    {
       // Notify the user of errors if any.
       // Pass a connection pointer accessed from the Recordset.
        _variant_t vtConnect = pRstDiscounts->GetActiveConnection();

        // GetActiveConnection returns connect string if connection
        // is not open, else returns Connection object.
        switch(vtConnect.vt)
        {
            case VT_BSTR:
                PrintComError(e);
                break;
            case VT_DISPATCH:
                PrintProviderError(vtConnect);
                break;
            default:
                printf("Errors occured.");
                break;
        }
    }

    // Clean up objects before exit.
    if (pRstDiscounts)
        if (pRstDiscounts->State == adStateOpen)
            pRstDiscounts->Close();
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintProviderError Function                      //
//                                                       //
///////////////////////////////////////////////////////////

void PrintProviderError(_ConnectionPtr pConnection)
{
    // Print Provider Errors from Connection object.
    // pErr is a record object in the Connection's Error collection.
    ErrorPtr    pErr  = NULL;

    if( (pConnection->Errors->Count) > 0)
    {
        long nCount = pConnection->Errors->Count;

        // Collection ranges from 0 to 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 Function                           //
//                                                       //
///////////////////////////////////////////////////////////

void PrintComError(_com_error &e)
{
   _bstr_t bstrSource(e.Source());
   _bstr_t bstrDescription(e.Description());

    // Print COM errors.
   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);
}
// EndNumericScaleCpp

NumericScale, propriété | Precision, propriété


Exemple de méthodes Open et Close (VC++)

Cet exemple utilise les méthodes Open et Close sur les deux objets Recordset et Connection qui ont été ouverts.

// BeginOpenCpp
#import "C:\Program Files\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <oledb.h>
#include <stdio.h>
#include <conio.h>
#include "OpenX.h"

// Function declarations
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 Function                                    //
//                                                       //
///////////////////////////////////////////////////////////

void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    OpenX();

    ::CoUninitialize();
}

///////////////////////////////////////////////////////////
//                                                       //
//               OpenX Function                          //
//                                                       //
///////////////////////////////////////////////////////////

void OpenX(void)
{
    // Define ADO object pointers.
    // Initialize pointers on define.
    // These are in the ADODB::  namespace
     _RecordsetPtr    pRstEmployee  = NULL;
     _ConnectionPtr pConnection    = NULL;

    // Define string variables.
    _bstr_t strCnn("Provider='sqloledb';Data Source='MySqlServer';"
        "Initial Catalog='pubs';Integrated Security='SSPI';");

    // Define Other Variables.
    HRESULT  hr = S_OK;
    IADORecordBinding   *picRs  = NULL;  // Interface Pointer declared.
    CEmployeeRs emprs;       // C++ Class object
    DBDATE varDate;

    try
    {
        // open connection and record set
        TESTHR(pConnection.CreateInstance(__uuidof(Connection)));
        pConnection->Open(strCnn,"","",adConnectUnspecified);

        TESTHR(pRstEmployee.CreateInstance(__uuidof(Recordset)));
        pRstEmployee->Open("Employee",
            _variant_t((IDispatch *)pConnection,true), adOpenKeyset,
            adLockOptimistic, adCmdTable);

        // Open an IADORecordBinding interface pointer which we'll
        // use for Binding Recordset to a class.
        TESTHR(pRstEmployee->QueryInterface(
            __uuidof(IADORecordBinding),(LPVOID*)&picRs));

        //Bind the Recordset to a C++ Class here.
        TESTHR(picRs->BindToRecordset(&emprs));

        // Assign the first employee record's hire date
        // to a variable, then change the hire date.
        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);

        // Requery Recordset and reset the hire date.
        pRstEmployee->Requery(adOptionUnspecified);
        // Open an IADORecordBinding interface pointer which we'll
        // use for Binding Recordset to a class.
        TESTHR(pRstEmployee->QueryInterface(
            __uuidof(IADORecordBinding),(LPVOID*)&picRs));

        // Rebind the Recordset to a C++ Class here.
        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);
    }
    catch(_com_error &e)
    {
        // Notify the user of errors if any.
        // Pass a connection pointer accessed from the Connection.
        PrintProviderError(pConnection);
        PrintComError(e);
    }

    // Clean up objects before exit.
    if (pRstEmployee)
        if (pRstEmployee->State == adStateOpen)
            pRstEmployee->Close();
    if (pConnection)
        if (pConnection->State == adStateOpen)
            pConnection->Close();
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintProviderError Function                      //
//                                                       //
///////////////////////////////////////////////////////////

void PrintProviderError(_ConnectionPtr pConnection)
{
    // Print Provider Errors from Connection object.
    // pErr is a record object in the Connection's Error collection.
    ErrorPtr    pErr  = NULL;

    if( (pConnection->Errors->Count) > 0)
    {
        long nCount = pConnection->Errors->Count;
        // Collection ranges from 0 to 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 Function                           //
//                                                       //
///////////////////////////////////////////////////////////

void PrintComError(_com_error &e)
{
   _bstr_t bstrSource(e.Source());
   _bstr_t bstrDescription(e.Description());

    // Print COM errors.
   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);
}
// EndOpenCpp

OpenX.h

// BeginOpenH
#include "icrsint.h"

// This Class extracts only fname,lastname and
// hire_date from employee table
class CEmployeeRs : public CADORecordBinding
{

BEGIN_ADO_BINDING(CEmployeeRs)

    // Column fname is the 2nd field in the table
   ADO_VARIABLE_LENGTH_ENTRY2(2, adVarChar, m_sze_fname,
         sizeof(m_sze_fname), le_fnameStatus, FALSE)

    // Column lname is the 4th field in the table.
   ADO_VARIABLE_LENGTH_ENTRY2(4, adVarChar, m_sze_lname,
         sizeof(m_sze_lname), le_lnameStatus, FALSE)

    // Column hiredate is the 8th field in the table.
   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;
};
// EndOpenH

Voir aussi

Close, méthode | Connection, objet | Open, méthode (objet Connection ADO) | Open, méthode (objet Recordset ADO) | Recordset, objet


Exemple de méthode OpenSchema (VC++)

Cet exemple utilise la méthode OpenSchema pour afficher le nom et le type de chaque table dans la base de données Pubs.

// BeginOpenSchemaCpp
#import "c:\Program Files\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <ole2.h>
#include <stdio.h>
#include <oleauto.h>
#include <conio.h>

// Function declarations
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 Function                                    //
//                                                       //
///////////////////////////////////////////////////////////

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 Function                             //
//                                                       //
///////////////////////////////////////////////////////////

void OpenSchemaX()
{
    // Define ADO object pointers.
    // Initialize pointers on define.
    // These are in the ADODB::  namespace.
    _ConnectionPtr  pConnection    = NULL;
    _RecordsetPtr  pRstSchema  = NULL;

    //Other Variables
    HRESULT  hr = S_OK;

    _bstr_t strCnn("Provider='sqloledb';Data Source='MySqlServer';"
            "Initial Catalog='pubs';Integrated Security='SSPI';");

    try
    {
        // Open connection.
        TESTHR(pConnection.CreateInstance(__uuidof(Connection)));
        pConnection->Open (strCnn, "", "", adConnectUnspecified);

        pRstSchema = pConnection->OpenSchema(adSchemaTables);

        while(!(pRstSchema->EndOfFile))
        {
            _bstr_t table_name = pRstSchema->Fields->
                GetItem("TABLE_NAME")->Value;

            printf("Table Name: %s\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();
                //Clear the screen for the next display
                system("cls");
            }
        }
    }
    catch (_com_error &e)
    {
        // Notify the user of errors if any.
        // Pass a connection pointer accessed from the Connection.
        PrintProviderError(pConnection);
        PrintComError(e);
    }

    // Clean up objects before exit.
    if (pRstSchema)
        if (pRstSchema->State == adStateOpen)
            pRstSchema->Close();
    if (pConnection)
        if (pConnection->State == adStateOpen)
            pConnection->Close();
}

///////////////////////////////////////////////////////////
//                                                       //
//      OpenSchemaX2 Function                            //
//                                                       //
///////////////////////////////////////////////////////////
void OpenSchemaX2()
{
    HRESULT  hr = S_OK;
    // Define ADO object pointers.
    // Initialize pointers on define.
    // These are in the ADODB::  namespace.
    _ConnectionPtr  pConnection2  = NULL;
    _RecordsetPtr   pRstSchema  = NULL;

    _bstr_t strCnn("Provider='sqloledb';Data Source='MySqlServer';"
            "Initial Catalog='pubs';Integrated Security='SSPI';");

    try
    {
        // Open connection.
        TESTHR(pConnection2.CreateInstance(__uuidof(Connection)));
        pConnection2->Open (strCnn, "", "", adConnectUnspecified);

        // Create a safearray which takes four elements,and pass it as
        // 2nd parameter in OpenSchema method.
        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", (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();
                    //Clear the screen for the next display
                    system("cls");
                }
        }
    }    // End Try statement.
    catch (_com_error &e)
    {
        // Notify the user of errors if any.
        // Pass a connection pointer accessed from the Connection.
        PrintProviderError(pConnection2);
        PrintComError(e);
    }

    // Clean up objects before exit.
    if (pRstSchema)
        if (pRstSchema->State == adStateOpen)
            pRstSchema->Close();
    if (pConnection2)
        if (pConnection2->State == adStateOpen)
            pConnection2->Close();
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintProviderError Function                      //
//                                                       //
///////////////////////////////////////////////////////////

void PrintProviderError(_ConnectionPtr pConnection)
{
    // Print Provider Errors from Connection object.
    // pErr is a record object in the Connection's Error collection.
    ErrorPtr    pErr  = NULL;

    if( (pConnection->Errors->Count) > 0)
    {
        long nCount = pConnection->Errors->Count;
        // Collection ranges from 0 to 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 Function                           //
//                                                       //
///////////////////////////////////////////////////////////

void PrintComError(_com_error &e)
{
   _bstr_t bstrSource(e.Source());
   _bstr_t bstrDescription(e.Description());

    // Print COM errors.
   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);
}
// EndOpenSchemaCpp

OpenSchema, méthode


Exemple de propriété Optimize (VC++)

Cet exemple met en application la propriété dynamique Optimize de l'objet Field. Le champ zip de la table Authors dans la base de données Pubs n'est pas indexé. L'affectation de la valeur True à la propriété Optimize sur le champ zip permet à ADO de construire un index qui améliore les performances de la méthode Find.

// BeginOptimizeCpp
#import "c:\Program Files\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <ole2.h>
#include <stdio.h>
#include <conio.h>

// Function declarations
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 Function                                     //
//                                                      //
//////////////////////////////////////////////////////////
void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    OptimizeX();

    ::CoUninitialize();
}

//////////////////////////////////////////////////////////
//                                                      //
//           OptimizeX Function                         //
//                                                      //
//////////////////////////////////////////////////////////
void OptimizeX(void)
{
    HRESULT   hr = S_OK;

    // Define string variables.
    _bstr_t strCnn("Provider='sqloledb';Data Source='MySqlServer';"
            "Initial Catalog='pubs';Integrated Security='SSPI';");
    // Define ADO object pointers.
    // Initialize pointers on define.
    // These are in the ADODB::  namespace.
    _RecordsetPtr   pRst = NULL;

    try
    {
        TESTHR(pRst.CreateInstance(__uuidof(Recordset)));

        // Enable Index creation.
        pRst->CursorLocation = adUseClient;
        pRst->Open ("SELECT * FROM authors", strCnn,
            adOpenStatic, adLockReadOnly, adCmdText);

        // Create the index
        pRst->Fields->GetItem("zip")->Properties->
            GetItem("Optimize")->PutValue("True");

        // Find 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);

        // Delete the index
        pRst->Fields->GetItem("zip")->Properties->
            GetItem("Optimize")->PutValue("False");
    }
    catch (_com_error &e)
    {
       // Notify the user of errors if any.
       // Pass a connection pointer accessed from the Recordset.
        _variant_t vtConnect = pRst->GetActiveConnection();

        // GetActiveConnection returns connect string if connection
        // is not open, else returns Connection object.
        switch(vtConnect.vt)
        {
            case VT_BSTR:
                PrintComError(e);
                break;
            case VT_DISPATCH:
                PrintProviderError(vtConnect);
                break;
            default:
                printf("Errors occured.");
                break;
        }
    }

    // Clean up objects before exit.
    if (pRst)
        if (pRst->State == adStateOpen)
            pRst->Close();
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintProviderError Function                      //
//                                                       //
///////////////////////////////////////////////////////////
void PrintProviderError(_ConnectionPtr pConnection)
{
    // Print Provider Errors from Connection object.
    // pErr is a record object in the Connection's Error collection.
    ErrorPtr    pErr  = NULL;

    if( (pConnection->Errors->Count) > 0)
    {
        long nCount = pConnection->Errors->Count;

        // Collection ranges from 0 to 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 Function                           //
//                                                       //
///////////////////////////////////////////////////////////
void PrintComError(_com_error &e)
{
   _bstr_t bstrSource(e.Source());
   _bstr_t bstrDescription(e.Description());

    // Print COM errors.
   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);
}
// EndOptimizeCpp

Voir aussi

Field, objet | Optimize, propriété dynamique (ADO)


Exemple de propriétés OriginalValue et UnderlyingValue (VC++)

Cet exemple montre comment les propriétés OriginalValue et UnderlyingValue sont utilisées pour afficher un message lorsque les données sous-jacentes d'un enregistrement sont modifiées durant la mise à jour par lots d'un objet Recordset.

// BeginOriginalValueCpp
#import "c:\Program Files\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <ole2.h>
#include <stdio.h>
#include <conio.h>
#include "OriginalValueX.h"

// Function declarations
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 Function                                    //
//                                                       //
///////////////////////////////////////////////////////////

void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

   OriginalValueX();

    ::CoUninitialize();
}

///////////////////////////////////////////////////////////
//                                                       //
//            OriginalValueX Function                    //
//                                                       //
///////////////////////////////////////////////////////////

void OriginalValueX(void)
{
    // Define ADO object pointers.
    // Initialize pointers on define.
    // These are in the ADODB::  namespace.
    _ConnectionPtr   pConnection    = NULL;
     FieldPtr      pFldType   = NULL;
    _RecordsetPtr   pRstTitles   = NULL;

    // Define string variables.
    _bstr_t strSQLChange("UPDATE Titles SET Type = "
            "'sociology' WHERE Type = 'psychology'");
    _bstr_t strSQLRestore("UPDATE Titles SET Type = "
            "'psychology' WHERE Type = 'sociology'");

    // Define Other Variables
    HRESULT    hr = S_OK;
    IADORecordBinding   *picRs  = NULL;  //Interface Pointer declared
    CTitleRs titlers;        // C++ Class object

    try
    {
        _bstr_t strCnn("Provider='sqloledb';Data Source='MySqlServer';"
            "Initial Catalog='pubs';Integrated Security='SSPI';");

        // Open connection.
        TESTHR(pConnection.CreateInstance(__uuidof(Connection)));
        pConnection->Open (strCnn, "", "", adConnectUnspecified);

        // Open Recordset for batch update.
        TESTHR(pRstTitles.CreateInstance(__uuidof(Recordset)));
        pRstTitles->PutActiveConnection(
            _variant_t((IDispatch *)pConnection,true));
        pRstTitles->CursorType = adOpenKeyset;
        pRstTitles->LockType = adLockBatchOptimistic;

        // Cast Connection pointer to an IDispatch type so converted
        // to correct type of variant.
        pRstTitles->Open("Titles",
            _variant_t((IDispatch *)pConnection,true),
            adOpenKeyset, adLockBatchOptimistic, adCmdTable);

        //Open an IADORecordBinding interface pointer which
        //we'll use for Binding Recordset to a class.
        TESTHR(pRstTitles->QueryInterface(
            __uuidof(IADORecordBinding),(LPVOID*)&picRs));

        //Bind the Recordset to a C++ Class here
        TESTHR(picRs->BindToRecordset(&titlers));

        // Set field object variable for Type field.
        pFldType = pRstTitles->Fields->GetItem("type");

        // Change the type of psychology titles.
        while(!(pRstTitles->EndOfFile))
        {
            if (!strcmp(strtok((char *)titlers.m_szau_Type," "),
                "psychology"))
            {
                pFldType->Value = "self_help";
            }
            pRstTitles->MoveNext();
        }

        // Simulate a change by another user by updating data
        // using a command string.
        pConnection->Execute(strSQLChange,NULL,0);

        // Check for changes.
        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();
        }
    }
    catch (_com_error &e)
    {
        // Notify the user of errors if any.
        // Pass a connection pointer accessed from the Connection.
        PrintProviderError(pConnection);
        PrintComError(e);
    }

    // Clean up objects before exit.
    //Release the IADORecordset Interface here
    if (picRs)
        picRs->Release();

    if (pRstTitles)
        if (pRstTitles->State == adStateOpen)
        {
            // Cancel the update because this is a demonstration.
            pRstTitles->CancelBatch(adAffectAll);
            pRstTitles->Close();
        }
    if (pConnection)
        if (pConnection->State == adStateOpen)
        {
            // Restore Original Values.
            pConnection->Execute(strSQLRestore,NULL,0);
            pConnection->Close();
        }
};

///////////////////////////////////////////////////////////
//                                                       //
//      PrintProviderError Function                      //
//                                                       //
///////////////////////////////////////////////////////////
void PrintProviderError(_ConnectionPtr pConnection)
{
    // Print Provider Errors from Connection object.
    // pErr is a record object in the Connection's Error collection.
    ErrorPtr    pErr  = NULL;

    if( (pConnection->Errors->Count) > 0)
    {
        long nCount = pConnection->Errors->Count;

        // Collection ranges from 0 to 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 Function                           //
//                                                       //
///////////////////////////////////////////////////////////
void PrintComError(_com_error &e)
{
   _bstr_t bstrSource(e.Source());
   _bstr_t bstrDescription(e.Description());

    // Print COM errors.
   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);
}
// EndOriginalValueCpp

OriginalValueX.h

// BeginOriginalValueH
#include "icrsint.h"

//This class extracts title_id and type from titles table
class CTitleRs : public CADORecordBinding
{
BEGIN_ADO_BINDING(CTitleRs)
        // Column title_id is the 1st field in the Recordset
        ADO_VARIABLE_LENGTH_ENTRY2(1, adVarChar, m_szau_Title_id,
            sizeof(m_szau_Title_id), lau_Title_idStatus, FALSE)

        // Column type is the 3rd field in the 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;
};
// EndOriginalValueH

Voir aussi

OriginalValue, propriété | Recordset, objet | UnderlyingValue, propriété


Exemple de propriété Prepared (VC++)

Cet exemple illustre l'utilisation de la propriété Prepared en ouvrant deux objets Command, l'un préparé et l'autre pas.

// BeginPreparedCpp
#import "c:\Program Files\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <ole2.h>
#include <stdio.h>
#include <conio.h>
#include <winbase.h>

// Function declarations
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 Function                                    //
//                                                       //
///////////////////////////////////////////////////////////

void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    PreparedX();

    ::CoUninitialize();
}

///////////////////////////////////////////////////////////
//                                                       //
//      PreparedX Function                               //
//                                                       //
///////////////////////////////////////////////////////////

void PreparedX(void)
{
    // Define ADO object pointers.
    // Initialize pointers on define.
    // These are in the ADODB::  namespace.
    _ConnectionPtr   pConnection    =NULL;
    _CommandPtr      pCmd1    =NULL;
    _CommandPtr      pCmd2    =NULL;

    // Define string variables.
    _bstr_t strCnn("Provider='sqloledb';Data Source='MySqlServer';"
            "Initial Catalog='pubs';Integrated Security='SSPI';");

    //Define Other Variables
    HRESULT   hr = S_OK;

    try
    {
        // Open a connection.
        TESTHR(pConnection.CreateInstance(__uuidof(Connection)));
        pConnection->Open (strCnn, "", "", adConnectUnspecified);

        _bstr_t strCmd ("SELECT title,type FROM titles ORDER BY type");

        // Create two command objects for the same
        // command - one prepared and one not prepared.
        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);

        // Set a timer,then execute the unprepared command 20 times.
        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;

        // Reset the timer,then execute the prepared command 20 times
        sngStart=GetTickCount();
        for(intLoop=1;intLoop<=20;intLoop++)
        {
            pCmd2->Execute(NULL,NULL,adCmdText);
        }
        sngEnd=GetTickCount();

        float sngPrepared = (float)(sngEnd - sngStart)/(float)1000;

        // Display performance results
        printf("\n\nPerformance Results:");
        printf("\n\nNot Prepared: %6.3f seconds",sngNotPrepared);
        printf("\n\nPrepared:     %6.3f seconds\n\n",sngPrepared);
    }
    catch (_com_error &e)
    {
        // Notify the user of errors if any.
        // Pass a connection pointer accessed from the Connection.
        PrintProviderError(pConnection);
        PrintComError(e);
    }

    if (pConnection)
        if (pConnection->State == adStateOpen)
            pConnection->Close();
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintProviderError Function                      //
//                                                       //
///////////////////////////////////////////////////////////
void PrintProviderError(_ConnectionPtr pConnection)
{
    // Print Provider Errors from Connection object.
    // pErr is a record object in the Connection's Error collection.
    ErrorPtr    pErr  = NULL;

    if( (pConnection->Errors->Count) > 0)
    {
        long nCount = pConnection->Errors->Count;

        // Collection ranges from 0 to 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 Function                           //
//                                                       //
///////////////////////////////////////////////////////////
void PrintComError(_com_error &e)
{
   _bstr_t bstrSource(e.Source());
   _bstr_t bstrDescription(e.Description());

    // Print COM errors.
   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);
}
// EndPreparedCpp

Command, objet | Prepared, propriété


Exemple de propriétés Provider et DefaultDatabase (VC++)

Cet exemple illustre l'utilisation de la propriété Provider en ouvrant trois objets Connection à partir de fournisseurs différents. Il utilise également la propriété DefaultDatabase pour définir la base de données par défaut pour le fournisseur ODBC Microsoft.

// BeginProviderCpp
#import "c:\Program Files\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <ole2.h>
#include <stdio.h>
#include <conio.h>

// Function declarations
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 Function          //
//                           //
///////////////////////////////
void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    ProviderX();

    ::CoUninitialize();
}

/////////////////////////////////
//                             //
//    ProviderX Function       //
//                             //
/////////////////////////////////

void ProviderX(void)
{
    HRESULT    hr = S_OK;

    // Define ADO object pointers.
    // Initialize pointers on define.
    // These are in the ADODB::  namespace.
    _ConnectionPtr    pConnection1    = NULL;
    _ConnectionPtr    pConnection2     = NULL;
    _ConnectionPtr    pConnection3     = NULL;

    try
    {
        // Open a Connection using the Microsoft ODBC provider.
        TESTHR(pConnection1.CreateInstance(__uuidof(Connection)));
        pConnection1->ConnectionString = "driver={SQL Server};"
            "server='MySqlServer';user id='MyUserId';password='MyPassword';";
        pConnection1->Open("","","",adConnectUnspecified);
        pConnection1->DefaultDatabase = "pubs";

        // Display the provider
        printf("\n\nConnection1 provider: %s \n\n",
            (LPCSTR)pConnection1->Provider);

        // Open a connection using the OLE DB Provider for Microsoft Jet.
        TESTHR(pConnection2.CreateInstance(__uuidof(Connection)));
        pConnection2->Provider = "Microsoft.Jet.OLEDB.4.0";

        char *sConn = "c:\\Program Files\\Microsoft Office\\Office\\"
            "Samples\\Northwind.mdb";

        pConnection2->Open(sConn,"admin","",NULL);

        // Display the provider
        printf("Connection2 provider: %s \n\n",(LPCSTR)pConnection2->
            Provider);

        // Open a Connection using the Microsoft SQL Server provider.
        TESTHR(pConnection3.CreateInstance(__uuidof(Connection)));
        pConnection3->Provider = "sqloledb";
        pConnection3->Open("Data Source='MySqlServer';Initial Catalog='pubs';",
            "MyUserId","MyPassword",NULL);

        // Display the provider.
        printf("Connection3 provider: %s\n\n",(LPCSTR)pConnection3->
            Provider);
    }

    catch (_com_error &e)
    {
        // Notify the user of errors if any.
        PrintProviderError(pConnection1);
        if(pConnection2) PrintProviderError(pConnection2);
        if(pConnection3) PrintProviderError(pConnection3);
        PrintComError(e);
    }

    if (pConnection1)
        if (pConnection1->State == adStateOpen)
            pConnection1->Close();
    if (pConnection2)
        if (pConnection2->State == adStateOpen)
            pConnection2->Close();
    if (pConnection3)
        if (pConnection3->State == adStateOpen)
            pConnection3->Close();
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintProviderError Function                      //
//                                                       //
///////////////////////////////////////////////////////////
void PrintProviderError(_ConnectionPtr pConnection)
{
    // Print Provider Errors from Connection object.
    // pErr is a record object in the Connection's Error collection.
    ErrorPtr    pErr  = NULL;

    if( (pConnection->Errors->Count) > 0)
    {
        long nCount = pConnection->Errors->Count;

        // Collection ranges from 0 to 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 Function                           //
//                                                       //
///////////////////////////////////////////////////////////
void PrintComError(_com_error &e)
{
    _bstr_t bstrSource(e.Source());
    _bstr_t bstrDescription(e.Description());

    // Print COM errors.
    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);
}
// EndProviderCpp

Voir aussi

Connection, objet | DefaultDatabase, propriété | Provider, propriété


Exemple de méthode Refresh (VC++)

Cet exemple montre comment utiliser la méthode Refresh pour actualiser la collection Parameters pour l'objet Command d'une procédure stockée.

// BeginRefreshCpp
#import "c:\Program Files\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <ole2.h>
#include <stdio.h>
#include <conio.h>
#include "RefreshX.h"

// Function declarations
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void RefreshX(void);
void PrintProviderError(_ConnectionPtr pConnection);
void PrintComError(_com_error &e);
inline char* mygets(char* strDest, int n)
{
    char strExBuff[10];
    char* pstrRet = fgets(strDest, n, stdin);

    if (pstrRet == NULL)
        return NULL;

    if (!strrchr(strDest, '\n'))
        // Exhaust the input buffer.
        do
        {
            fgets(strExBuff, sizeof(strExBuff), stdin);
        }while (!strrchr(strExBuff, '\n'));
    else
        // Replace '\n' with '\0'
        strDest[strrchr(strDest, '\n') - strDest] = '\0';

    return pstrRet;
}

//////////////////////////////
//                          //
//    Main Function         //
//                          //
//////////////////////////////
void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    RefreshX();

    ::CoUninitialize();
}

////////////////////////////////////////////
//                                        //
//             RefreshX Function          //
//                                        //
////////////////////////////////////////////

void RefreshX(void)
{
    HRESULT  hr = S_OK;

    // Define string variables.
    _bstr_t strCnn("Provider='sqloledb';Data Source='MySqlServer';"
            "Initial Catalog='pubs';Integrated Security='SSPI';");

    // Define ADO object pointers.
    // Initialize pointers on define.
    // These are in the ADODB::  namespace.
    _ConnectionPtr    pConnection      = NULL;
    _CommandPtr     pCmdByRoyalty  = NULL;
    _RecordsetPtr  pRstByRoyalty  = NULL;
    _RecordsetPtr  pRstAuthors    = NULL;
    IADORecordBinding   *picRs    = NULL;  //Interface Pointer declared.
    CAuthorsRs authorsrs;            //C++ class object

    try
    {
        // Open connection.
        TESTHR(pConnection.CreateInstance(__uuidof(Connection)));
        pConnection->Open (strCnn, "", "", adConnectUnspecified);

        // Open a command object for a stored procedure,
        // with one parameter.
        TESTHR(pCmdByRoyalty.CreateInstance(__uuidof(Command)));
        pCmdByRoyalty->ActiveConnection = pConnection;
        pCmdByRoyalty->CommandText = "byroyalty";
        pCmdByRoyalty->CommandType = adCmdStoredProc;
        pCmdByRoyalty->Parameters->Refresh();

        // Get parameter value and execute the command,
        // storing the results in a recordset.
        char *strRoyalty;
        char strTemp[5];
        do
        {
            printf("\n\nEnter royalty : ");
            mygets(strTemp, 5);

            strRoyalty = strtok(strTemp," \t");
            if(strRoyalty == NULL)
            {
                exit(1);
            }

            // if the input is not numeric then notify the user.
            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);

        // Open the Authors table to get author names for display.
        TESTHR(pRstAuthors.CreateInstance(__uuidof(Recordset)));
        pRstAuthors->Open ("authors",
            _variant_t((IDispatch *) pConnection, true),
            adOpenForwardOnly, adLockReadOnly, adCmdTable);

        //Open an IADORecordBinding interface pointer which we'll use for
        //Binding Recordset to a class.
        TESTHR(pRstAuthors->QueryInterface(
            __uuidof(IADORecordBinding),(LPVOID*)&picRs));

        //Bind the Recordset to a C++ Class here.
        TESTHR(picRs->BindToRecordset(&authorsrs));

        // Print current data in the recordset,adding
        // author names from Authors table.
        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();
        }
    }
    catch (_com_error &e)
    {
        PrintProviderError(pConnection);
        PrintComError(e);
    }

    if (pRstByRoyalty)
        if (pRstByRoyalty->State == adStateOpen)
            pRstByRoyalty->Close();
    if (pRstAuthors)
        if (pRstAuthors->State == adStateOpen)
            pRstAuthors->Close();
    if (pConnection)
        if (pConnection->State == adStateOpen)
            pConnection->Close();
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintProviderError Function                      //
//                                                       //
///////////////////////////////////////////////////////////
void PrintProviderError(_ConnectionPtr pConnection)
{
    // Print Provider Errors from Connection object.
    // pErr is a record object in the Connection's Error collection.
    ErrorPtr    pErr  = NULL;

    if( (pConnection->Errors->Count) > 0)
    {
        long nCount = pConnection->Errors->Count;

        // Collection ranges from 0 to 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 Function                           //
//                                                       //
///////////////////////////////////////////////////////////
void PrintComError(_com_error &e)
{
   _bstr_t bstrSource(e.Source());
   _bstr_t bstrDescription(e.Description());

    // Print COM errors.
   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);
}
// EndRefreshCpp

RefreshX.h

// BeginRefreshH
#include "icrsint.h"

//This Class extracts  lname,fname from authors table.
class CAuthorsRs : public CADORecordBinding
{
BEGIN_ADO_BINDING(CAuthorsRs)
    // Column lname is the 2nd field in the recordset
     ADO_VARIABLE_LENGTH_ENTRY2(2, adVarChar, m_szau_lname,
         sizeof(m_szau_lname), lau_lnameStatus, TRUE)
    // Column fname is the 3rd field in the 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;
};
// EndRefreshH

Command, objet | Parameters, collection | Refresh, méthode


Exemple de méthode Resync (VC++)

L'exemple ci-dessous illustre comment utiliser la méthode Resync pour actualiser les données d'un jeu d'enregistrements statique.

// BeginResyncCpp
#import "c:\Program Files\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <ole2.h>
#include <stdio.h>
#include <conio.h>

// Function declarations
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 Function        //
//                         //
/////////////////////////////

void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    ResyncX();

    ::CoUninitialize();
}

/////////////////////////////////
//                             //
//     ResyncX Function        //
//                             //
/////////////////////////////////

void ResyncX(void)
{
    HRESULT  hr = S_OK;

    // Define string variables.
    _bstr_t strCnn("Provider='sqloledb';Data Source='MySqlServer';"
            "Initial Catalog='pubs';Integrated Security='SSPI';");

    // Define ADO object pointers.
    // Initialize pointers on define.
    // These are in the ADODB::  namespace.
    _RecordsetPtr  pRstTitles  = NULL;

    try
    {
        // Open recordset for titles table.
        TESTHR(pRstTitles.CreateInstance(__uuidof(Recordset)));
        pRstTitles->CursorLocation = adUseClient;
        pRstTitles->CursorType = adOpenStatic;
        pRstTitles->LockType = adLockBatchOptimistic;
        pRstTitles->Open ("titles",strCnn,
            adOpenStatic, adLockBatchOptimistic, adCmdTable);

        // Change the type of the first title in the recordset.
        pRstTitles->Fields->GetItem("type")->Value =
            (_bstr_t) ("database");

        // Display the results of the change.
        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);

        // Resync with database.
        pRstTitles->Resync(adAffectAll,adResyncAllValues);

        // Display the results of the resynch.
        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);
    }
    catch (_com_error &e)
    {
       // Notify the user of errors if any.
       // Pass a connection pointer accessed from the Recordset.
        _variant_t vtConnect = pRstTitles->GetActiveConnection();

        // GetActiveConnection returns connect string if connection
        // is not open, else returns Connection object.
        switch(vtConnect.vt)
        {
            case VT_BSTR:
                PrintComError(e);
                break;
            case VT_DISPATCH:
                PrintProviderError(vtConnect);
                break;
            default:
                printf("Errors occured.");
                break;
        }
    }

    if (pRstTitles)
        if (pRstTitles->State == adStateOpen)
        {
            pRstTitles->CancelBatch(adAffectAll);
            pRstTitles->Close();
        }
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintProviderError Function                      //
//                                                       //
///////////////////////////////////////////////////////////
void PrintProviderError(_ConnectionPtr pConnection)
{
    // Print Provider Errors from Connection object.
    // pErr is a record object in the Connection's Error collection.
    ErrorPtr    pErr  = NULL;

    if( (pConnection->Errors->Count) > 0)
    {
        long nCount = pConnection->Errors->Count;

        // Collection ranges from 0 to 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 Function                           //
//                                                       //
///////////////////////////////////////////////////////////
void PrintComError(_com_error &e)
{
   _bstr_t bstrSource(e.Source());
   _bstr_t bstrDescription(e.Description());

    // Print COM errors.
   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);
}
// EndResyncCpp

Resync, méthode


Exemple de méthodes Save et Open (VC++)

Ces trois exemples illustrent comment utiliser ensemble les méthodes Save et Open.

Supposez que vous partez en voyage d'affaires et que vous voulez prendre avec vous une table d'une base de données. Avant de partir, vous accédez aux données en tant qu'objet Recordset et les enregistrez sous une forme transportable. Une fois arrivé à destination, vous accédez au Recordset en tant que Recordset local, déconnecté. Vous effectuez les modifications voulues dans le Recordset. Enfin, de retour chez vous, vous vous connectez de nouveau à la base de données et la mettez à jour avec les modifications effectuées en déplacement.

// BeginSaveCpp
#import "c:\Program Files\Common Files\system\ado\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <ole2.h>
#include <stdio.h>
#include <conio.h>
#include <io.h>

//Function declarations
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 Function                                 //
//                                                      //
//////////////////////////////////////////////////////////
void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    //If File exists in the specified directory, then display error
    if (!FileExists())
    {
        SaveX1();
        SaveX2();
        SaveX3();
    }

    ::CoUninitialize();
}

//////////////////////////////////////////////////////////
//                                                      //
//     SaveX1 Function                                  //
//                                                      //
//////////////////////////////////////////////////////////

//First, access and save the authors table.
void SaveX1()
{
    HRESULT hr = S_OK;

    // Define ADO object pointers.
    // Initialize pointers on define.
    // These are in the ADODB::  namespace.
    _RecordsetPtr pRstAuthors = NULL;

    //Definitions of other variables
    _bstr_t strCnn("Provider='sqloledb';Data Source='MySqlServer';"
            "Initial Catalog='pubs';Integrated Security='SSPI';");

    try
    {
        TESTHR(pRstAuthors.CreateInstance(__uuidof(Recordset)));

        pRstAuthors->Open("SELECT * FROM authors",strCnn,
            adOpenDynamic,adLockBatchOptimistic,adCmdText);

        // For sake of illustration, save the Recordset to a diskette
        // in XML format.
        pRstAuthors->Save("c:\\pubs.xml",adPersistXML);
    }
    catch(_com_error &e)
    {
       // Notify the user of errors if any.
       // Pass a connection pointer accessed from the Recordset.
        _variant_t vtConnect = pRstAuthors->GetActiveConnection();

        // GetActiveConnection returns connect string if connection
        // is not open, else returns Connection object.
        switch(vtConnect.vt)
        {
            case VT_BSTR:
                PrintComError(e);
                break;
            case VT_DISPATCH:
                PrintProviderError(vtConnect);
                break;
            default:
                printf("Errors occured.");
                break;
        }
    }

    if (pRstAuthors)
        if (pRstAuthors->State == adStateOpen)
            pRstAuthors->Close();
}

//////////////////////////////////////////////////////////
//                                                      //
//       SaveX2 Function                                //
//                                                      //
//////////////////////////////////////////////////////////
//At this point, you have arrived at your destination.
//You will access the authors table as a local, disconnected Recordset.
//Don't forget you must have the MSPersist provider on the machine you
//are using in order to access the saved file, c:\pubs.xml.
void SaveX2()
{
    HRESULT hr = S_OK;

    // Define ADO object pointers.
    // Initialize pointers on define.
    // These are in the ADODB::  namespace.
    _RecordsetPtr pRstAuthors = NULL;

    try
    {
        TESTHR(pRstAuthors.CreateInstance(__uuidof(Recordset)));

        //For sake of illustration, we specify all parameters.
        pRstAuthors->Open("c:\\pubs.xml","Provider='MSPersist';",
            adOpenForwardOnly,adLockBatchOptimistic,adCmdFile);

        //Now you have a local, disconnected Recordset.
        //Edit it as you desire.
        //(In this example, the change makes no difference).
        pRstAuthors->Find("au_lname = 'Carson'",NULL,adSearchForward);
        if (pRstAuthors->EndOfFile)
        {
            printf("Name not found ...\n");
            pRstAuthors->Close();
            return;
        }
        pRstAuthors->GetFields()->GetItem("City")->PutValue("Chicago");
        pRstAuthors->Update();

        // Save changes in ADTG format this time, purely for sake of
        // illustration. Note that the previous version is still on the
        // diskette as c:\pubs.xml.
        pRstAuthors->Save("c:\\pubs.adtg",adPersistADTG);
    }
    catch(_com_error &e)
    {
       // Notify the user of errors if any.
       // Pass a connection pointer accessed from the Recordset.
        _variant_t vtConnect = pRstAuthors->GetActiveConnection();

        // GetActiveConnection returns connect string if connection
        // is not open, else returns Connection object.
        switch(vtConnect.vt)
        {
            case VT_BSTR:
                PrintComError(e);
                break;
            case VT_DISPATCH:
                PrintProviderError(vtConnect);
                break;
            default:
                printf("Errors occured.");
                break;
        }
    }

    if (pRstAuthors)
        if (pRstAuthors->State == adStateOpen)
            pRstAuthors->Close();
}

//////////////////////////////////////////////////////////
//                                                      //
//   SaveX3 Function                                    //
//                                                      //
//////////////////////////////////////////////////////////
//Finally, you return home. Now update the database with
//your changes.
void SaveX3()
{
    HRESULT hr = S_OK;

    // Define ADO object pointers.
    // Initialize pointers on define.
    // These are in the ADODB::  namespace.
    _RecordsetPtr pRstAuthors = NULL;
    _ConnectionPtr pCnn = NULL;

    //Definitions of other variables
    _bstr_t strCnn("Provider='sqloledb';Data Source='MySqlServer';"
            "Initial Catalog='pubs';Integrated Security='SSPI';");

    try
    {
        TESTHR(pCnn.CreateInstance(__uuidof(Connection)));

        TESTHR(pRstAuthors.CreateInstance(__uuidof(Recordset)));

        //If there is no ActiveConnection, you can open with defaults.
        pRstAuthors->Open("c:\\pubs.adtg","Provider=MSPersist;",
            adOpenForwardOnly,adLockBatchOptimistic,adCmdFile);

        //Connect to the database, associate the Recordset with
        //the connection, then update the database table with the
        //changed Recordset.
        pCnn->Open(strCnn,"","",NULL);

        pRstAuthors->PutActiveConnection(_variant_t((IDispatch *) pCnn));
        pRstAuthors->UpdateBatch(adAffectAll);
    }
    catch(_com_error &e)
    {
       // Notify the user of errors if any.
       // Pass a connection pointer accessed from the Recordset.
        _variant_t vtConnect = pRstAuthors->GetActiveConnection();

        // GetActiveConnection returns connect string if connection
        // is not open, else returns Connection object.
        switch(vtConnect.vt)
        {
            case VT_BSTR:
                PrintComError(e);
                break;
            case VT_DISPATCH:
                PrintProviderError(vtConnect);
                break;
            default:
                printf("Errors occured.");
                break;
        }
    }

    if (pRstAuthors)
        if (pRstAuthors->State == adStateOpen)
            pRstAuthors->Close();
    if (pCnn)
        if (pCnn->State == adStateOpen)
            pCnn->Close();
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintProviderError Function                      //
//                                                       //
///////////////////////////////////////////////////////////
void PrintProviderError(_ConnectionPtr pConnection)
{
    // Print Provider Errors from Connection object.
    // pErr is a record object in the Connection's Error collection.
    ErrorPtr    pErr  = NULL;

    if( (pConnection->Errors->Count) > 0)
    {
        long nCount = pConnection->Errors->Count;

        // Collection ranges from 0 to 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 Function                           //
//                                                       //
///////////////////////////////////////////////////////////

void PrintComError(_com_error &e)
{
   _bstr_t bstrSource(e.Source());
   _bstr_t bstrDescription(e.Description());

    // Print COM errors.
   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("c:\\pubs.xml", &xml_file )) != -1L)
    {
       printf( "File already exists!\n" );
       return(true);
    }
    else
        return (false);
}
// EndSaveCpp

Voir aussi

Open, méthode (objet Recordset ADO) | Recordset, objet | Save, méthode


Exemple de méthode Seek et de propriété Index (VC++)

Cet exemple illustre l'utilisation combinée de la méthode Seek et de la propriété Index de l'objet Recordset avec un Employee ID spécifique, pour localiser le nom de l'employé dans la table Employees de la base de données Nwind.mdb.

// BeginSeekCpp
#import "C:\Program Files\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <stdio.h>
#include <ole2.h>
#include <conio.h>
#include <string.h>
#include "SeekX.h"

//Function declarations
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void SeekX(void);
void PrintProviderError(_ConnectionPtr pConnection);
void PrintComError(_com_error &e);
inline char* mygets(char* strDest, int n)
{
    char strExBuff[10];
    char* pstrRet = fgets(strDest, n, stdin);

    if (pstrRet == NULL)
        return NULL;

    if (!strrchr(strDest, '\n'))
        // Exhaust the input buffer.
        do
        {
            fgets(strExBuff, sizeof(strExBuff), stdin);
        }while (!strrchr(strExBuff, '\n'));
    else
        // Replace '\n' with '\0'
        strDest[strrchr(strDest, '\n') - strDest] = '\0';

    return pstrRet;
}

//////////////////////////////////////////////////////////
//                                                      //
//       Main Function                                  //
//                                                      //
//////////////////////////////////////////////////////////
void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    SeekX();

    ::CoUninitialize();
}

//////////////////////////////////////////////////////////
//                                                      //
//     SeekX Function                                   //
//                                                      //
//////////////////////////////////////////////////////////
void SeekX()
{
    HRESULT hr = S_OK;

    // Define ADO object pointers.
    // Initialize pointers on define.
    // These are in the ADODB::  namespace.

    _RecordsetPtr pRstEmp = NULL;

    IADORecordBinding    *picRs = NULL;  // Interface Pointer declared
    CEmployeeRs EmpRs; //C++ class object

    //Definitions of other variables
    _bstr_t strPrompt("Enter an EmployeeID (e.g., 1 to 9)");
    char strEmpId[2];

    try
    {
        TESTHR(pRstEmp.CreateInstance(__uuidof(Recordset)));
        pRstEmp->CursorLocation = adUseServer;
        pRstEmp->Open("employees", "Provider='Microsoft.Jet.OLEDB.4.0';"
            "Data Source='C:\\Program Files\\Microsoft Office\\Office\\"
            "Samples\\Northwind.mdb';",
            adOpenKeyset,adLockReadOnly,adCmdTableDirect);

        //Open an IADORecordBinding interface pointer which
        //we'll use for binding Recordset to a Class
        TESTHR(pRstEmp->QueryInterface(
            __uuidof(IADORecordBinding), (LPVOID*)&picRs));

        //Bind the Recordset to a C++ Class
        TESTHR(picRs->BindToRecordset(&EmpRs));

        //Does this provider support Seek and Index?
        if (pRstEmp->Supports(adIndex) && pRstEmp->Supports(adSeek))
        {
            pRstEmp->Index = "PrimaryKey";

            //Display all the employees.
            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();
            }
            //Prompt the user for an EmployeeID between 1 and 9.
            do
            {
                pRstEmp->MoveFirst();
                printf("\n\n%s\t",(LPCSTR) strPrompt);
                mygets(strEmpId, 2);

                //Quit if strEmpID is a zero-length string
                //(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);
        }
    }
    catch(_com_error &e)
    {
       // Notify the user of errors if any.
       // Pass a connection pointer accessed from the Recordset.
        _variant_t vtConnect = pRstEmp->GetActiveConnection();

        // GetActiveConnection returns connect string if connection
        // is not open, else returns Connection object.
        switch(vtConnect.vt)
        {
            case VT_BSTR:
                PrintComError(e);
                break;
            case VT_DISPATCH:
                PrintProviderError(vtConnect);
                break;
            default:
                printf("Errors occured.");
                break;
        }
    }

    // Clean up objects before exit.
    //Release the IADORecordset Interface here
    if (picRs)
        picRs->Release();

    if (pRstEmp)
        if (pRstEmp->State == adStateOpen)
            pRstEmp->Close();
}

///////////////////////////////////////////////////////////
//                                                       //
//      PrintProviderError Function                      //
//                                                       //
///////////////////////////////////////////////////////////
void PrintProviderError(_ConnectionPtr pConnection)
{
    // Print Provider Errors from Connection object.
    // pErr is a record object in the Connection's Error collection.
    ErrorPtr    pErr  = NULL;

    if( (pConnection->Errors->Count) > 0)
    {
        long nCount = pConnection->Errors->Count;

        // Collection ranges from 0 to 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 Function                           //
//                                                       //
///////////////////////////////////////////////////////////
void PrintComError(_com_error &e)
{
   _bstr_t bstrSource(e.Source());
   _bstr_t bstrDescription(e.Description());

    // Print COM errors.
   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);
}
// EndSeekCpp

SeekX.h

// BeginSeekH
#include "icrsint.h"

// This Class extracts only EmployeeId,FirstName and LastName
// from employees table
class CEmployeeRs : public CADORecordBinding
{
BEGIN_ADO_BINDING(CEmployeeRs)

   // Column hiredate is the 1st field in the table.
   ADO_VARIABLE_LENGTH_ENTRY2(1, adInteger,m_ie_empid,
        sizeof(m_ie_empid), le_empidStatus, FALSE)

    // Column LastName is the 2nd field in the table.
   ADO_VARIABLE_LENGTH_ENTRY2(2, adVarChar, m_sze_lname,
         sizeof(m_sze_lname), le_lnameStatus, FALSE)

    // Column FirstName is the 3rd field in the table.
   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;
};
// EndSeekH

Index, propriété | Recordset, objet | Seek, méthode


Exemple de propriété Sort (VC++)

Cet exemple utilise la propriété Sort de l'objet Recordset pour réorganiser les lignes d'un objet Recordset provenant de la table Authors de la base de données Pubs. Une routine d'utilitaire secondaire imprime chaque ligne.

// BeginSortCpp
#import "C:\Program Files\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <ole2.h>
#include <stdio.h>
#include <conio.h>

// Function declarations
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);

//////////////////////////////////////////////////////////
//                                                      //
//    Main Function                                     //
//                                                      //
//////////////////////////////////////////////////////////
void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    SortX();

    ::CoUninitialize();
}

//////////////////////////////////////////////////////////
//                                                      //
//        SortX Function                                //
//                                                      //
//////////////////////////////////////////////////////////
void SortX(void)
{
    HRESULT  hr = S_OK;

    // Initialize pointers on define.
    // These are in the ADODB::  namespace.
    _ConnectionPtr  pConnection      = NULL;
    _RecordsetPtr  pRstAuthors    = NULL;

    // Define string variables.
    _bstr_t strCnn("Provider='sqloledb';Data Source='MySqlServer';"
            "Initial Catalog='pubs';Integrated Security='SSPI';");

    try
    {
        TESTHR(pConnection.CreateInstance(__uuidof(Connection)));

        TESTHR(pRstAuthors.CreateInstance(__uuidof(Recordset)));

        pRstAuthors->CursorLocation = adUseClient;
        pConnection->Open (strCnn, "", "", adConnectUnspecified);
        pRstAuthors->Open("SELECT * FROM authors",
            _variant_t((IDispatch *) pConnection),
             adOpenStatic, adLockReadOnly, adCmdText);

        SortXprint("    Initial Order    ", pRstAuthors);

        //Clear the screen for the next display.
        printf("\nPress any key to continue...");
        getch();
        system("cls");

        pRstAuthors->Sort = "au_lname ASC, au_fname ASC";
        SortXprint("Last Name Ascending", pRstAuthors);

        //Clear the screen for the next display.
        printf("\nPress any key to continue...");
        getch();
        system("cls");

        pRstAuthors->Sort = "au_lname DESC, au_fname ASC";
        SortXprint("Last Name Descending", pRstAuthors);
    }
    catch(_com_error &e)
    {
        PrintProviderError(pConnection);
        PrintComError(e);
    }

    // Clean up objects before exit.
    if (pRstAuthors)
        if (pRstAuthors->State == adStateOpen)
            pRstAuthors->Close();
    if (pConnection)
        if (pConnection->State == adStateOpen)
            pConnection->Close();
}

//////////////////////////////////////////////////////////
//                                                      //
//        SortXprint Function                           //
//                                                      //
//////////////////////////////////////////////////////////
//This is the secondary utility routine that prints
//the given title, and the contents of the specified Recordset.
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 Function                      //
//                                                      //
//////////////////////////////////////////////////////////
void PrintProviderError(_ConnectionPtr pConnection)
{
    // Print Provider Errors from Connection object.
    // pErr is a record object in the Connection's Error collection.
    ErrorPtr    pErr  = NULL;

    if( (pConnection->Errors->Count) > 0)
    {
        long nCount = pConnection->Errors->Count;
        // Collection ranges from 0 to 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 Function                              //
//                                                      //
//////////////////////////////////////////////////////////

void PrintComError(_com_error &e)
{
   _bstr_t bstrSource(e.Source());
   _bstr_t bstrDescription(e.Description());

    // Print Com errors.
   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);

}

// EndSortCpp

Recordset, objet | Sort, propriété


Exemple de propriété Source (VC++)

Cet exemple illustre l'utilisation de la propriété Source en ouvrant trois objets Recordset basés sur des sources de données différentes.

// BeginSourceCpp
#import "c:\Program Files\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <ole2.h>
#include <stdio.h>
#include <conio.h>

// Function declarations
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void SourceX(void);
void PrintProviderError(_ConnectionPtr pConnection);
void PrintComError(_com_error &e);

///////////////////////////
//                       //
//    Main Function      //
//                       //
///////////////////////////
void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    SourceX();

    ::CoUninitialize();
}

///////////////////////////////////////////////
//                                           //
//    SourceX Function                       //
//                                           //
///////////////////////////////////////////////
void SourceX(void)
{
    HRESULT  hr = S_OK;

    // Define string variables.
    _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='MySqlServer';"
        "Initial Catalog='pubs';Integrated Security='SSPI';");

    // Define ADO object pointers.
    // Initialize pointers on define.
    // These are in the ADODB::  namespace.
    _ConnectionPtr  pConnection          = NULL;
    _RecordsetPtr  pRstTitles        = NULL;
    _RecordsetPtr  pRstPublishers      = NULL;
    _RecordsetPtr  pRstPublishersDirect    = NULL;
    _RecordsetPtr  pRstTitlesPublishers    = NULL;
    _CommandPtr     pCmdSQL          = NULL;

    try
    {
        // Open a connection.
        TESTHR(pConnection.CreateInstance(__uuidof(Connection)));
        pConnection->Open (strCnn, "", "", adConnectUnspecified);

        // Open a recordset based on a command object.
        TESTHR(pCmdSQL.CreateInstance(__uuidof(Command)));
        pCmdSQL->ActiveConnection = pConnection;
        pCmdSQL->CommandText = strCmdSQL;
        pRstTitles = pCmdSQL->Execute(NULL,NULL,adCmdText);

        // Open a recordset based on a a table
        TESTHR(pRstPublishers.CreateInstance(__uuidof(Recordset)));
        pRstPublishers->Open ("publishers",
            _variant_t((IDispatch *) pConnection, true),
            adOpenForwardOnly, adLockReadOnly, adCmdTable);

        // Open a recordset based on a table
        TESTHR(pRstPublishersDirect.CreateInstance(
            __uuidof(Recordset)));
        pRstPublishersDirect->Open ("publishers",
            _variant_t((IDispatch *) pConnection, true),
            adOpenForwardOnly, adLockReadOnly, adCmdTableDirect);

        // Open a recordset based on a SQL string.
        TESTHR(pRstTitlesPublishers.CreateInstance(
            __uuidof(Recordset)));
        pRstTitlesPublishers->Open(strSQL,
            _variant_t((IDispatch *) pConnection, true),
            adOpenForwardOnly, adLockReadOnly, adCmdText);

        // Use the Source property to display the source of
        // each recordset.
        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);
    }
    catch (_com_error &e)
    {
        // Notify the user of errors if any.
        PrintProviderError(pConnection);
        PrintComError(e);
    }

    if (pRstTitles)
        if (pRstTitles->State == adStateOpen)
            pRstTitles->Close();
    if (pRstPublishers)
        if (pRstPublishers->State == adStateOpen)
            pRstPublishers->Close();
    if (pRstPublishersDirect)
        if (pRstPublishersDirect->State == adStateOpen)
            pRstPublishersDirect->Close();
    if (pRstTitlesPublishers)
        if (pRstTitlesPublishers->State == adStateOpen)
            pRstTitlesPublishers->Close();
    if (pConnection)
        if (pConnection->State == adStateOpen)
            pConnection->Close();
}

///////////////////////////////////////////////
//                                           //
//    PrintProviderError Function            //
//                                           //
///////////////////////////////////////////////
void PrintProviderError(_ConnectionPtr pConnection)
{
    // Print Provider Errors from Connection object.
    // pErr is a record object in the Connection's Error collection.
    ErrorPtr    pErr  = NULL;

    if( (pConnection->Errors->Count) > 0)
    {
        long nCount = pConnection->Errors->Count;
        // Collection ranges from 0 to 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 Function                 //
//                                           //
///////////////////////////////////////////////
void PrintComError(_com_error &e)
{
   _bstr_t bstrSource(e.Source());
   _bstr_t bstrDescription(e.Description());

    // Print Com errors.
   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);

}
// EndSourceCpp

Voir aussi

Recordset, objet | Source, propriété (Recordset ADO)


Exemple de propriété State (VC++)

Cet exemple utilise la propriété State pour afficher un message lors de l'ouverture de connexions asynchrones et de l'exécution de commandes asynchrones.

// BeginStateCpp
#import "c:\Program Files\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <ole2.h>
#include <stdio.h>
#include <conio.h>

// Function declarations
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void StateX(void);
void PrintProviderError(_ConnectionPtr pConnection);
void PrintComError(_com_error &e);

///////////////////////////////////////////////
//                                           //
//    Main Function                          //
//                                           //
///////////////////////////////////////////////
void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    StateX();

    ::CoUninitialize();
}

///////////////////////////////////////////////
//                                           //
//        StateX Function                    //
//                                           //
///////////////////////////////////////////////
void StateX(void)
{
    HRESULT  hr = S_OK;

    // Define string variables.
    _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='MySqlServer';"
            "Initial Catalog='pubs';Integrated Security='SSPI';");

    // Define ADO object pointers.
    // Initialize pointers on define.
    // These are in the ADODB::  namespace.
    _ConnectionPtr    pConnection        = NULL;
    _ConnectionPtr    pConnection2        = NULL;
    _CommandPtr         pCmdChange    = NULL;
    _CommandPtr         pCmdRestore    = NULL;

    try
    {
        // Open two asynchronous connections,displaying
        // a message while connecting.
        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");
        }

        // Create two command objects.
        TESTHR(pCmdChange.CreateInstance(__uuidof(Command)));
        pCmdChange->ActiveConnection = pConnection;
        pCmdChange->CommandText = strSQLChange;

        TESTHR(pCmdRestore.CreateInstance(__uuidof(Command)));
        pCmdRestore->ActiveConnection = pConnection2;
        pCmdRestore->CommandText = strSQLRestore;

        // Executing the commands,displaying a message
        // while they are executing.
        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");
        }
    }
    catch (_com_error &e)
    {
        // Notify the user of errors if any.
        PrintProviderError(pConnection);
        PrintComError(e);
    }

    if (pConnection)
        if (pConnection->State == adStateOpen)
            pConnection->Close();
    if (pConnection2)
        if (pConnection2->State == adStateOpen)
            pConnection2->Close();
}

///////////////////////////////////////////////
//                                           //
//    PrintProviderError Function            //
//                                           //
///////////////////////////////////////////////
void PrintProviderError(_ConnectionPtr pConnection)
{
    // Print Provider Errors from Connection object.
    // pErr is a record object in the Connection's Error collection.
    ErrorPtr    pErr  = NULL;

    if( (pConnection->Errors->Count) > 0)
    {
        long nCount = pConnection->Errors->Count;
        // Collection ranges from 0 to 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 Function                 //
//                                           //
///////////////////////////////////////////////
void PrintComError(_com_error &e)
{
   _bstr_t bstrSource(e.Source());
   _bstr_t bstrDescription(e.Description());

    // Print Com errors.
   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);
}
// EndStateCpp

State, propriété


Exemple de propriété Status (VC++)

Cet exemple utilise la propriété Status pour afficher les enregistrements modifiés durant une opération globale avant une mise à jour par lots.

// BeginStatusCpp
#import "c:\Program Files\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <ole2.h>
#include <stdio.h>
#include <conio.h>
#include "StatusX.h"

// Function declarations
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void StatusX(void);
void PrintProviderError(_ConnectionPtr pConnection);
void PrintComError(_com_error &e);

///////////////////////////////////////////////
//                                           //
//    Main Function                          //
//                                           //
///////////////////////////////////////////////

void main()
{
    if(FAILED(CoInitialize(NULL)))
        return;

    StatusX();

    ::CoUninitialize();
}

///////////////////////////////////////////////
//                                           //
//    StatusX Function                       //
//                                           //
///////////////////////////////////////////////
void StatusX(void)
{
    HRESULT  hr = S_OK;

    // Define string variables.
    _bstr_t strCnn("Provider='sqloledb';Data Source='MySqlServer';"
            "Initial Catalog='pubs';Integrated Security='SSPI';");

    // Define ADO object pointers.
    // Initialize pointers on define.
    // These are in the ADODB::  namespace.
     IADORecordBinding *picRs    = NULL;  // Interface Pointer Declared
     CTitleRs titlers;           // C++ Class Object
    _RecordsetPtr  pRstTitles    = NULL;
    LPSTR p_TempStr        = NULL;

    try
    {
        // Open recordset for batch update
        TESTHR(hr = pRstTitles.CreateInstance(__uuidof(Recordset)));
        pRstTitles->CursorType = adOpenKeyset;
        pRstTitles->LockType = adLockBatchOptimistic;
        pRstTitles->Open ("titles", strCnn,
            adOpenKeyset, adLockBatchOptimistic, adCmdTable);

        // Open an IADORecordBinding interface pointer which
        // we will use for binding Recordset to a class.
        TESTHR(hr = pRstTitles->QueryInterface(
            __uuidof(IADORecordBinding),(LPVOID*)&picRs));

        // Bind the Recordset to a C++ class here
        TESTHR(hr = picRs->BindToRecordset(&titlers));

        p_TempStr = (LPSTR) malloc(sizeof(titlers.m_szt_Type));

        // Change the type of psychology titles.
        while(!(pRstTitles->EndOfFile))
        {
            // Set the final character of the destination string to NULL.
            p_TempStr[sizeof(titlers.m_szt_Type)-1] = '\0';
            // The source string will get truncated if its length is
            // longer than the length of the destination string minus one.
            strncpy(p_TempStr,strtok(titlers.m_szt_Type," "),
                sizeof(titlers.m_szt_Type)-1);

            // Compare the type of psychology titles
            if (!strcmp(p_TempStr,"psychology"))
            {
                    // Copy "self_help" title field
                    pRstTitles->Fields->GetItem("type")->Value =
                        (_bstr_t) ("self_help");
            }
            pRstTitles->MoveNext();
        }

        // Display Title ID and status
        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();
        }
    }
    catch (_com_error &e)
    {
       // Notify the user of errors if any.
       // Pass a connection pointer accessed from the Recordset.
        _variant_t vtConnect = pRstTitles->GetActiveConnection();

        // GetActiveConnection returns connect string if connection
        // is not open, else returns Connection object.
        switch(vtConnect.vt)
        {
            case VT_BSTR:
                PrintComError(e);
                break;
            case VT_DISPATCH:
                PrintProviderError(vtConnect);
                break;
            default:
                printf("Errors occured.");
                break;
        }
    }

    // Deallocate the memory
    if (p_TempStr)
        free(p_TempStr);

    if (pRstTitles)
        if (pRstTitles->State == adStateOpen)
        {
            // Cancel the update because this is a demonstration.
            pRstTitles->CancelBatch(adAffectAll);
            pRstTitles->Close();
        }
}

///////////////////////////////////////////////
//                                           //
//    PrintProviderError Function            //
//                                           //
///////////////////////////////////////////////

void PrintProviderError(_ConnectionPtr pConnection)
{
    // Print Provider Errors from Connection object.
    // pErr is a record object in the Connection's Error collection.
    ErrorPtr    pErr  = NULL;

    if( (pConnection->Errors->Count) > 0)
    {
        long nCount = pConnection->Errors->Count;
        // Collection ranges from 0 to 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 Function                 //
//                                           //
///////////////////////////////////////////////
void PrintComError(_com_error &e)
{
   _bstr_t bstrSource(e.Source());
   _bstr_t bstrDescription(e.Description());

    // Print Com errors.
   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);
}
// EndStatusCpp

StatusX.h

// BeginStatusH
#include "icrsint.h"

//This class extracts title_id and type from titles table.
class CTitleRs : public CADORecordBinding
{
    BEGIN_ADO_BINDING(CTitleRs)
        // Column title_id is the 1st field in the table
        ADO_VARIABLE_LENGTH_ENTRY2(1,adVarChar,m_szt_Title_id,
            sizeof(m_szt_Title_id),lt_Title_idStatus,FALSE)
        // Column type is the 3rd field in the table
        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;
};
// EndStatusH

Voir aussi

Status, propriété (Recordset ADO)


Exemple de propriété StayInSync (VC++)

Cet exemple montre comment la propriété StayInSync facilite l'accès aux lignes dans un objet Recordset hiérarchique.

La boucle extérieure affiche le prénom et le nom de chaque auteur, son département et son identification. L'objet Recordset intégré pour chaque ligne est extrait de la collection Fields pour être automatiquement attribué à rstTitleAuthor par la propriété StayInSync, chaque fois que l'objet Recordset parent est déplacé vers une nouvelle ligne. La boucle intérieure affiche quatre champs provenant de chaque ligne du jeu d'enregistrements ajouté.

// BeginStayInSyncCpp
#import "C:\Program Files\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <ole2.h>
#include <stdio.h>
#include <conio.h>

// Function declarations
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void StayInSyncX(void);
void PrintProviderError(_ConnectionPtr pConnection);
void PrintComError(_com_error &e);

//////////////////////////////////////////////////////////
//                                                      //
//        Main Function                                 //
//                                                      //
//////////////////////////////////////////////////////////
void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    StayInSyncX();

    ::CoUninitialize();
}

//////////////////////////////////////////////////////////
//                                                      //
//       StayInSyncX Function                           //
//                                                      //
//////////////////////////////////////////////////////////
void StayInSyncX(void)
{
    HRESULT  hr = S_OK;

    // Define string variables.
    _bstr_t strCnn("Provider='MSDataShape';"
        "Data Provider='sqloledb';Data Source='MySqlServer';"
        "Initial Catalog='pubs';Integrated Security='SSPI';");

    // Define ADO object pointers.
    // Initialize pointers on define.
    // These are in the ADODB::  namespace.
    _ConnectionPtr  pConnection      = NULL;
    _RecordsetPtr  pRst      = NULL;
    _RecordsetPtr  pRstTitleAuthor    = NULL;

    try
    {
        TESTHR(pRstTitleAuthor.CreateInstance(__uuidof(Recordset)));

        TESTHR(pConnection.CreateInstance(__uuidof(Connection)));

        TESTHR(pRst.CreateInstance(__uuidof(Recordset)));

        // Open connection.
        pConnection->Open (strCnn, "", "", adConnectUnspecified);
        pRst->PutStayInSync(true);

        // Open recordset with names from Author & titleauthor table.
        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);

        pRstTitleAuthor = 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(!(pRstTitleAuthor->EndOfFile))
            {
                vIndex = (short) 0;
                printf("%s    ",(LPCSTR)(_bstr_t)pRstTitleAuthor->
                    Fields->Item[&vIndex]->Value);
                vIndex = (short) 1;
                printf("%s    ",(LPCSTR)(_bstr_t)pRstTitleAuthor->
                    Fields->Item[&vIndex]->Value);
                vIndex = (short) 2;
                printf("%s    ",(LPCSTR)(_bstr_t)pRstTitleAuthor->
                    Fields->Item[&vIndex]->Value);
                vIndex = (short) 3;
                printf("%s\n",(LPCSTR)(_bstr_t)pRstTitleAuthor->
                    Fields->Item[&vIndex]->Value);
                intLineCnt++;

                if (intLineCnt%15 == 0)
                {
                    printf("\nPress any key to continue...\n");
                    getch();
                }
                pRstTitleAuthor->MoveNext();
            }
            pRst->MoveNext();
        }
    }
    catch(_com_error &e)
    {
        // Notify the user of errors if any.
        // Pass a connection pointer accessed from the Recordset.
        PrintProviderError(pConnection);
        PrintComError(e);
    }

    // Clean up objects before exit.
    if (pRst)
        if (pRst->State == adStateOpen)
            pRst->Close();
    if (pConnection)
        if (pConnection->State == adStateOpen)
            pConnection->Close();
}

//////////////////////////////////////////////////////////
//                                                      //
//        PrintProviderError Function                   //
//                                                      //
//////////////////////////////////////////////////////////
void PrintProviderError(_ConnectionPtr pConnection)
{
    // Print Provider Errors from Connection object.
    // pErr is a record object in the Connection's Error collection.
    ErrorPtr    pErr  = NULL;

    if( (pConnection->Errors->Count) > 0)
    {
        long nCount = pConnection->Errors->Count;
        // Collection ranges from 0 to 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 Function                           //
//                                                      //
//////////////////////////////////////////////////////////
void PrintComError(_com_error &e)
{

    _bstr_t bstrSource(e.Source());
    _bstr_t bstrDescription(e.Description());

    // Print Com errors.
    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);

}
// EndStayInSyncCpp

Voir aussi

Fields, collection | Recordset, objet | StayInSync, propriété


Exemple de méthode Supports (VC++)

L'exemple ci-dessous utilise la méthode Supports pour afficher les options gérées par un jeu d'enregistrements ouvert avec différents types de curseur. La fonction DisplaySupport est nécessaire à l'exécution de cet exemple.

// BeginSupportsCpp
#import "C:\Program Files\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <stdio.h>
#include <ole2.h>
#include <conio.h>

//Function Declarations.
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);

///////////////////////////////////////////////
//                                           //
//    Main Function                          //
//                                           //
///////////////////////////////////////////////
void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    SupportsX();

    ::CoUninitialize();
}

///////////////////////////////////////////////
//                                           //
//    SupportsX Function                     //
//                                           //
///////////////////////////////////////////////
void SupportsX(void)
{
    // Define ADO object pointers.
    // Initialize pointers on define.
    // These are in the ADODB::  namespace.
    _RecordsetPtr  pRstTitles  = NULL;

    // Define Other Variables
    HRESULT hr = S_OK;

    // Assign connection string to a variable
    _bstr_t strCnn("Provider='sqloledb';Data Source='MySqlServer';"
            "Initial Catalog='pubs';Integrated Security='SSPI';");

    try
    {
        // Open a recordset from Titles table
        TESTHR(pRstTitles.CreateInstance(__uuidof(Recordset)));

        // Fill array with CursorType constants.
        int  aintCursorType[4];
        aintCursorType[0] = adOpenForwardOnly;
        aintCursorType[1] = adOpenKeyset;
        aintCursorType[2] = adOpenDynamic;
        aintCursorType[3] = adOpenStatic;

        // Open recordset using each CursorType and optimistic locking.
        // Then call the DisplaySupport procedure to display the
        // supported options.
        for (int intIndex=0; intIndex <= 3; intIndex++)
        {
            pRstTitles->CursorType =
               (enum CursorTypeEnum)aintCursorType[intIndex];
            pRstTitles->LockType = adLockOptimistic;

            // Pass the Cursor type and LockType to the Recordset.
            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();

            //Clear the screen for the next display.
            system("cls");
        }
    }
    catch(_com_error &e)
    {
       // Notify the user of errors if any.
       // Pass a connection pointer accessed from the Recordset.
        _variant_t vtConnect = pRstTitles->GetActiveConnection();

        // GetActiveConnection returns connect string if connection
        // is not open, else returns Connection object.
        switch(vtConnect.vt)
        {
            case VT_BSTR:
                PrintComError(e);
                break;
            case VT_DISPATCH:
                PrintProviderError(vtConnect);
                break;
            default:
                printf("Errors occured.");
                break;
        }
    }

    // Clean up objects before exit.
    if (pRstTitles)
        if (pRstTitles->State == adStateOpen)
            pRstTitles->Close();
}

///////////////////////////////////////////////
//                                           //
//    DisplaySupport Function                //
//                                           //
///////////////////////////////////////////////
void DisplaySupport (_RecordsetPtr  pRstTemp)
{
    // Fill array with cursor option constants.
    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 Function            //
//                                           //
///////////////////////////////////////////////
void PrintProviderError(_ConnectionPtr pConnection)
{
    // Print Provider Errors from Connection object.
    // pErr is a record object in the Connection's Error collection.
    ErrorPtr    pErr  = NULL;

    if( (pConnection->Errors->Count) > 0)
    {
        long nCount = pConnection->Errors->Count;
        // Collection ranges from 0 to 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 Function                 //
//                                           //
///////////////////////////////////////////////
void PrintComError(_com_error &e)
{
   _bstr_t bstrSource(e.Source());
   _bstr_t bstrDescription(e.Description());

    // Print Com errors.
   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);
}
// EndSupportsCpp

Recordset, objet | Supports, méthode


Exemple de propriété Type (Field) (VC++)

Cet exemple montre comment la propriété Type est utilisée pour afficher le nom de la constante qui correspond à la valeur de la propriété Type de tous les objets Field de la table Employees. L'exécution de cette procédure requiert la fonction FieldType.

// BeginTypeFieldCpp
#import "c:\Program Files\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <ole2.h>
#include <stdio.h>
#include <conio.h>

// Function declarations
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);

///////////////////////////////////////////////
//                                           //
//    Main Function                          //
//                                           //
///////////////////////////////////////////////
void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    TypeX();

    ::CoUninitialize();
}

///////////////////////////////////////////////
//                                           //
//             TypeX Function                //
//                                           //
///////////////////////////////////////////////
void TypeX(void)
{
    HRESULT  hr = S_OK;

    // Define string variables.
    _bstr_t strCnn("Provider='sqloledb';Data Source='MySqlServer';"
        "Initial Catalog='pubs';Integrated Security='SSPI';");

    // Define ADO object pointers.
    // Initialize pointers on define.
    // These are in the ADODB::  namespace.
    _RecordsetPtr  pRstEmployees  = NULL;
    FieldsPtr  pFldLoop      = NULL;

    try
    {
        // Open recordset with data from Employee table.
        TESTHR(pRstEmployees.CreateInstance(__uuidof(Recordset)));
        pRstEmployees->Open ("employee",strCnn,
            adOpenForwardOnly, adLockReadOnly, adCmdTable);

        printf("Fields in Employee Table:\n\n");

        // Enumerate the Fields collection of the Employees table.
        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");
            }
        }
    }
    catch (_com_error &e)
    {
       // Notify the user of errors if any.
       // Pass a connection pointer accessed from the Recordset.
        _variant_t vtConnect = pRstEmployees->GetActiveConnection();

        // GetActiveConnection returns connect string if connection
        // is not open, else returns Connection object.
        switch(vtConnect.vt)
        {
            case VT_BSTR:
                PrintComError(e);
                break;
            case VT_DISPATCH:
                PrintProviderError(vtConnect);
                break;
            default:
                printf("Errors occured.");
                break;
        }
    }

    // Clean up objects before exit.
    if (pRstEmployees)
        if (pRstEmployees->State == adStateOpen)
            pRstEmployees->Close();
}

///////////////////////////////////////////////
//                                           //
//             FieldType Function            //
//                                           //
///////////////////////////////////////////////
_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 Function            //
//                                           //
///////////////////////////////////////////////
void PrintProviderError(_ConnectionPtr pConnection)
{
    // Print Provider Errors from Connection object.
    // pErr is a record object in the Connection's Error collection.
    ErrorPtr    pErr  = NULL;

    if( (pConnection->Errors->Count) > 0)
    {
        long nCount = pConnection->Errors->Count;
        // Collection ranges from 0 to 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 Function                 //
//                                           //
///////////////////////////////////////////////
void PrintComError(_com_error &e)
{
   _bstr_t bstrSource(e.Source());
   _bstr_t bstrDescription(e.Description());

    // Print Com errors.
   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);
}
// EndTypeFieldCpp

Field, objet | Type, propriété


Exemple de propriété Type (Property) (VC++)

Cet exemple illustre l'utilisation de la propriété Type. Il s'agit d'un modèle d'utilitaire pour le listage des noms et des types d'une collection, comme Properties, Fields, etc.

Il n'est pas nécessaire d'ouvrir l'objet Recordset pour accéder à la collection Properties ; les propriétés apparaissent lorsque l'objet Recordset est instancié. Cependant, l'affectation de la propriété CursorLocation à adUseClient ajoute plusieurs propriétés dynamiques à la collection Properties de l'objet Recordset, rendant cet exemple un peu plus intéressant. À des fins d'illustration, nous utilisons explicitement la propriété Item pour accéder à chaque objet Property.

// BeginTypePropertyCpp
#import "C:\Program Files\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <ole2.h>
#include <stdio.h>
#include<conio.h>

// Function declarations
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void TypeX();
void PrintComError(_com_error &e);

//////////////////////////////////////////////////////////
//                                                      //
//     Main Function                                    //
//                                                      //
//////////////////////////////////////////////////////////
void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    TypeX();

    ::CoUninitialize();
}

//////////////////////////////////////////////////////////
//                                                      //
//        TypeX Function                                //
//                                                      //
//////////////////////////////////////////////////////////
void TypeX()
{
    HRESULT  hr = S_OK;

    // Define ADO object pointers.
    // Initialize pointers on define.
    // These are in the ADODB::  namespace
    _RecordsetPtr  pRst  = NULL;
    PropertyPtr pProperty = NULL;

    //Define Other Variables
    _bstr_t strMsg;
    _variant_t vIndex;
    int intLineCnt = 0;

    try
    {
        TESTHR(pRst.CreateInstance (__uuidof(Recordset)));

        // Set the Recordset Cursor Location
        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)
    {
        // Notify the user of errors if any.
        PrintComError(e);
    }
}

//////////////////////////////////////////////////////////
//                                                      //
//      PrintComError Function                          //
//                                                      //
//////////////////////////////////////////////////////////

void PrintComError(_com_error &e)
{

    _bstr_t bstrSource(e.Source());
    _bstr_t bstrDescription(e.Description());

    // Print Com errors.
    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);
}
// EndTypePropertyCpp

Property, objet | Type, propriété


Exemple de méthodes Update et CancelUpdate (VC++)

Cette exemple illustre l'utilisation combinée des méthodes Update et CancelUpdate.

// BeginUpdateCpp
#import "C:\Program Files\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <stdio.h>
#include <ole2.h>
#include <malloc.h>
#include <conio.h>
#include "UpdateX.h"

// Function Declartion.
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();

     //Wait here for user to see the output..
     printf("\nPress any key to continue...");
     getch();

     //Clear the screen for the next display
     system("cls");

     UpdateX2();

     ::CoUninitialize();
}

//////////////////////////////////////////////////////////
//                                                      //
//      UpdateX Function                                //
//                                                      //
//////////////////////////////////////////////////////////
void UpdateX(void)
{
    HRESULT hr = S_OK;

    // Define ADO object pointers.
    // Initialize pointers on define.
    // These are in the ADODB::  namespace.
    _RecordsetPtr pRstEmployees  = NULL;

    // Define string variables.
    _bstr_t strCnn("Provider='sqloledb';Data Source='MySqlServer';"
            "Initial Catalog='pubs';Integrated Security='SSPI';");

    IADORecordBinding   *picRs   = NULL;  // Interface Pointer declared
    CEmployeeRs emprs;             // C++ Class object.

    try
    {
        // Open recordset with names from Employee table.
        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);

        // Store original data.
        _bstr_t strOldFirst = pRstEmployees->Fields->
            GetItem("fname")->Value;
        _bstr_t strOldLast  = pRstEmployees->Fields->
            GetItem("lname")->Value;

        //Change data in edit buffer.
        pRstEmployees->Fields->GetItem("fname")->Value =
            (_bstr_t)("Linda");
        pRstEmployees->Fields->GetItem("lname")->Value =
            (_bstr_t)("Kobara");

        // Show contents of buffer and get user input.
        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);

        // Ask if the User wants to Update
        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();

        //Open an IADORecordBinding interface pointer which
        //we'll use for binding Recordset to a class.
        TESTHR(pRstEmployees->QueryInterface(
            __uuidof(IADORecordBinding),(LPVOID*)&picRs));

        //Bind the Recordset to a C++ Class here.
        TESTHR(picRs->BindToRecordset(&emprs));

        pRstEmployees->MoveFirst();

        // Show the resulting data.
        printf("\nData in recordset =  %s %s", emprs.le_fnameStatus ==
            adFldOK ? emprs.m_sze_fname : "<NULL>",
            emprs.le_lnameStatus == adFldOK ?
            emprs.m_sze_lname : "<NULL>");

        // Restore original data because this is a demonstration.
        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();
        }
    }
    catch(_com_error &e)
    {
       // Notify the user of errors if any.
       // Pass a connection pointer accessed from the Recordset.
        _variant_t vtConnect = pRstEmployees->GetActiveConnection();

        // GetActiveConnection returns connect string if connection
        // is not open, else returns Connection object.
        switch(vtConnect.vt)
        {
            case VT_BSTR:
                PrintComError(e);
                break;
            case VT_DISPATCH:
                PrintProviderError(vtConnect);
                break;
            default:
                printf("Errors occured.");
                break;
        }
    }

    // Clean up objects before exit.
    //Release the IADORecordset Interface here
    if (picRs)
        picRs->Release();

    if (pRstEmployees)
        if (pRstEmployees->State == adStateOpen)
            pRstEmployees->Close();
}

// The next example demonstrates the Update method
// in conjunction with the AddNew method.

//////////////////////////////////////////////////////////
//                                                      //
//           UpdateX2 Function                          //
//                                                      //
//////////////////////////////////////////////////////////
void UpdateX2(void)
{
    HRESULT hr = S_OK;

    // Define ADO object pointers.
    // Initialize pointers on define.
    // These are in the ADODB::  namespace.
    _ConnectionPtr pConnection        = NULL;
    _RecordsetPtr pRstEmployees = NULL;

    // Define string variables.
    _bstr_t strCnn("Provider='sqloledb';Data Source='MySqlServer';"
            "Initial Catalog='pubs';Integrated Security='SSPI';");

    IADORecordBinding   *picRs  = NULL;  // Interface Pointer declared
    CEmployeeRs1 emprs;            // C++ Class object.

    try
    {
        // Open a connection.
        TESTHR(pConnection.CreateInstance(__uuidof(Connection)));
         pConnection->Open(strCnn,"","",NULL);

        // Open recordset with data from Employee table.
        TESTHR(pRstEmployees.CreateInstance(__uuidof(Recordset)));
        pRstEmployees->CursorType = adOpenKeyset;
        pRstEmployees->LockType = adLockOptimistic;
        pRstEmployees->Open("employee",
            _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");

        // Show contents of buffer and get user input.
        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();

            //Open an IADORecordBinding interface pointer which
            //we'll use for binding Recordset to a class.
            TESTHR(pRstEmployees->QueryInterface(
                __uuidof(IADORecordBinding),(LPVOID*)&picRs));

            //Bind the Recordset to a C++ Class here
            TESTHR(picRs->BindToRecordset(&emprs));

            // Go to the new record and show the resulting data.
            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");
        }
        // Delete new data because this is a demonstration.
        _bstr_t strSQLDelete("DELETE FROM employee WHERE emp_id = '" +
            strEmpID + "'");
        pConnection->Execute(strSQLDelete ,NULL,adExecuteNoRecords);
    }

    catch(_com_error &e)
    {
        // Notify the user of errors if any.
        // Pass a connection pointer accessed from the Connection.
        PrintProviderError(pConnection);
        PrintComError(e);
    }

    // Clean up objects before exit.
    //Release the IADORecordset Interface here
    if (picRs)
        picRs->Release();

    if (pRstEmployees)
        if (pRstEmployees->State == adStateOpen)
            pRstEmployees->Close();
    if (pConnection)
        if (pConnection->State == adStateOpen)
            pConnection->Close();
}

//////////////////////////////////////////////////////////
//                                                      //
//       PrintProviderError Function                    //
//                                                      //
//////////////////////////////////////////////////////////
void PrintProviderError(_ConnectionPtr pConnection)
{
    // Print Provider Errors from Connection object.
    // pErr is a record object in the Connection's Error collection.
    ErrorPtr    pErr  = NULL;

    if( (pConnection->Errors->Count) > 0)
    {
        long nCount = pConnection->Errors->Count;
        // Collection ranges from 0 to 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 Function                          //
//                                                      //
//////////////////////////////////////////////////////////
void PrintComError(_com_error &e)
{

    _bstr_t bstrSource(e.Source());
    _bstr_t bstrDescription(e.Description());

    // Print Com errors.
    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);
}
// EndUpdateCpp

UpdateX.h

// BeginUpdateH
#include "icrsint.h"

//This Class extracts only fname,lname from employee table.
class CEmployeeRs : public CADORecordBinding
{
BEGIN_ADO_BINDING(CEmployeeRs)
    // fname is the 1st field in the recordset
    ADO_VARIABLE_LENGTH_ENTRY2(1, adVarChar, m_sze_fname,
         sizeof(m_sze_fname), le_fnameStatus, FALSE)
    // lname is the 2nd field in the 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;
};

//This Class extracts only empid,fname,lname,from employee table.
class CEmployeeRs1 : public CADORecordBinding
{
BEGIN_ADO_BINDING(CEmployeeRs1)
    // emp_id is the 1st field in the table.
    ADO_VARIABLE_LENGTH_ENTRY2(1, adVarChar, m_sze_empid,
        sizeof(m_sze_empid), le_empidStatus, FALSE)
    // fname is the 2nd field in the table.
   ADO_VARIABLE_LENGTH_ENTRY2(2, adVarChar, m_sze_fname,
         sizeof(m_sze_fname), le_fnameStatus, FALSE)
    // lname is the 4rt field in the table.
   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;
};
// EndUpdateH

CancelUpdate, méthode | Update, méthode


Exemple de méthodes UpdateBatch et CancelBatch (VC++)

Cet exemple illustre l'utilisation combinée des méthodes UpdateBatch et CancelBatch.

// BeginUpdateBatchCpp
#import "c:\Program Files\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <ole2.h>
#include <stdio.h>
#include <conio.h>
#include "UpdateBatchX.h"

// Function declarations
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void UpdateBatchX(void);
void PrintProviderError(_ConnectionPtr pConnection);
void PrintComError(_com_error &e);

//////////////////////////////////////////////////////////
//                                                      //
//       Main Function                                  //
//                                                      //
//////////////////////////////////////////////////////////
void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    UpdateBatchX();

    ::CoUninitialize();
}

//////////////////////////////////////////////////////////
//                                                      //
//      UpdateBatchX Function                           //
//                                                      //
//////////////////////////////////////////////////////////
void UpdateBatchX(void)
{
   HRESULT  hr = S_OK;

    // Define ADO object pointers.
    // Initialize pointers on define.
    // These are in the ADODB::  namespace.
    _RecordsetPtr  pRstTitles   = NULL;

    // Define string variables.
    _bstr_t strCnn("Provider='sqloledb';Data Source='MySqlServer';"
            "Initial Catalog='pubs';Integrated Security='SSPI';");

    IADORecordBinding *picRs    = NULL;    // Interface Pointer Declared
    CTitleRs titlers;             // C++ Class Object

    try
    {
        // Open titles table.
        TESTHR(pRstTitles.CreateInstance(__uuidof(Recordset)));
        pRstTitles->CursorType = adOpenKeyset;
        pRstTitles->LockType = adLockBatchOptimistic;
        pRstTitles->Open ("titles", strCnn,
            adOpenKeyset, adLockBatchOptimistic, adCmdTable);

        // Open IADORecordBinding interface pointer for binding
        // Recordset to a class
        TESTHR(pRstTitles->QueryInterface(
            __uuidof(IADORecordBinding),(LPVOID*)&picRs));

        // Binding the Recordset to a C++ Class
        TESTHR(picRs->BindToRecordset(&titlers));
        pRstTitles->MoveFirst();

        // Loop through recordset and ask user if she wants,
        // to change the type for a specified title.
        while (!(pRstTitles->EndOfFile))
        {
            // Compare type with psychology
            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')
                {
                    // Change type to self_help.
                    pRstTitles->Fields->GetItem("type")->Value =
                        (_bstr_t)("self_help");
                }
            }
            pRstTitles->MoveNext();
        }

        // Ask the user if she wants to commit to all the
        // changes made above.
        printf("\n\nSave all changes?");
        char chKey;
        chKey = getch();
        if(toupper(chKey) == 'Y')
        {
            pRstTitles->UpdateBatch(adAffectAll);
        }
        else
        {
            pRstTitles->CancelBatch(adAffectAll);
        }

        // Print current data in recordset.
        pRstTitles->Requery(adOptionUnspecified);

        // Open IADORecordBinding interface pointer for Binding Recordset to a class
        TESTHR(pRstTitles->QueryInterface(
            __uuidof(IADORecordBinding),(LPVOID*)&picRs));

        // ReBinding the Recordset to a C++ Class.
        TESTHR(picRs->BindToRecordset(&titlers));

        // Move to the first record of the title table
        pRstTitles->MoveFirst();

        //Clear the screen for the next display.
        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();

        // Restore original data because this is demonstration.
        while (!(pRstTitles->EndOfFile))
        {
            // Compare type with psychology
            if(!strcmp( (char *)strtok(titlers.m_szt_Type," "),
                "self_help" ))
            {
                // Change type to psychology.
                pRstTitles->Fields->GetItem("type")->Value =
                    (_bstr_t)("psychology");
            }
            pRstTitles->MoveNext();
        }
    }
    catch (_com_error &e)
    {
       // Notify the user of errors if any.
       // Pass a connection pointer accessed from the Recordset.
        _variant_t vtConnect = pRstTitles->GetActiveConnection();

        // GetActiveConnection returns connect string if connection
        // is not open, else returns Connection object.
        switch(vtConnect.vt)
        {
            case VT_BSTR:
                PrintComError(e);
                break;
            case VT_DISPATCH:
                PrintProviderError(vtConnect);
                break;
            default:
                printf("Errors occured.");
                break;
        }
    }

    if (pRstTitles)
        if (pRstTitles->State == adStateOpen)
        {
            pRstTitles->UpdateBatch(adAffectAll);
            pRstTitles->Close();
        }
}

//////////////////////////////////////////////////////////
//                                                      //
//    PrintProviderError Function                       //
//                                                      //
//////////////////////////////////////////////////////////
void PrintProviderError(_ConnectionPtr pConnection)
{
    // Print Provider Errors from Connection object.
    // pErr is a record object in the Connection's Error collection.
    ErrorPtr    pErr  = NULL;

    if( (pConnection->Errors->Count) > 0)
    {
        long nCount = pConnection->Errors->Count;
        // Collection ranges from 0 to 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 Function                          //
//                                                      //
//////////////////////////////////////////////////////////

void PrintComError(_com_error &e)
{
   _bstr_t bstrSource(e.Source());
   _bstr_t bstrDescription(e.Description());

    // Print Com errors.
   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);
}
// EndUpdateBatchCpp

UpdateBatchX.h

// BeginUpdateBatchH
#include "icrsint.h"

//This class extracts titles and type from Titles table
class CTitleRs : public CADORecordBinding
{
BEGIN_ADO_BINDING(CTitleRs)
        // Column title is the 2nd field in the table
        ADO_VARIABLE_LENGTH_ENTRY2(2,adVarChar,m_szt_Title,
            sizeof(m_szt_Title),lt_TitleStatus,FALSE)
        // Column type is the 3rd field in the table
        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;
};
// EndUpdateBatchH

CancelBatch, méthode | UpdateBatch, méthode


Exemple de propriété Value (VC++)

Cet exemple illustre l'utilisation de la propriété Value avec les objets Field et Property pour afficher les valeurs champ et propriété du tableau Employees.

// BeginValueCpp
#import "c:\Program Files\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <ole2.h>
#include <stdio.h>
#include <conio.h>

// Function declarations
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void ValueX(void);
void PrintProviderError(_ConnectionPtr pConnection);
void PrintComError(_com_error &e);

//////////////////////////////////////////////////////////
//                                                      //
//    Main Function                                     //
//                                                      //
//////////////////////////////////////////////////////////

void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    ValueX();

    ::CoUninitialize();
}

//////////////////////////////////////////////////////////
//                                                      //
//              ValueX Function                         //
//                                                      //
//////////////////////////////////////////////////////////
void ValueX(void)
{
   HRESULT  hr = S_OK;

    // Define string variables.
   _bstr_t strCnn("Provider='sqloledb';Data Source='MySqlServer';"
            "Initial Catalog='pubs';Integrated Security='SSPI';");

    // Define ADO object pointers.
    // Initialize pointers on define.
    // These are in the ADODB::  namespace.
    _RecordsetPtr  pRstEmployees  = NULL;
    FieldsPtr    pFldLoop    = NULL;
    PropertiesPtr  pPrpLoop    = NULL;
    _variant_t vtIndex;
    vtIndex.vt = VT_I2;

    try
    {
        // Open recordset with data from Employee table.
        TESTHR(pRstEmployees.CreateInstance(__uuidof(Recordset)));
        pRstEmployees->Open ("employee",strCnn ,
            adOpenForwardOnly, adLockReadOnly, adCmdTable);

        printf("Field values in rstEmployees\n\n");

        // Enumerate the Fields collection of the Employees table.
        pFldLoop = pRstEmployees->GetFields();

        for (int intFields = 0; intFields < (int)pFldLoop->GetCount(); intFields++)
        {
            vtIndex.iVal = intFields;

            // Because Value is the default property of a
            // Field object,the use of the actual keyword
            // here is 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");

        // Enumerate the Properties collection of the Recordset object.
        pPrpLoop = pRstEmployees->GetProperties();
        int intLine = 0;

        for (int intProperties = 0; intProperties < (int)pPrpLoop->
            GetCount(); intProperties++)
        {
            vtIndex.iVal = intProperties;

            // Because Value is the default property of a
            // Property object,the use of the actual keyword
            // here is 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();

                    //Clear the screen for the next display
                    system("cls");
                }
        }
    }
    catch (_com_error &e)
    {
       // Notify the user of errors if any.
       // Pass a connection pointer accessed from the Recordset.
        _variant_t vtConnect = pRstEmployees->GetActiveConnection();

        // GetActiveConnection returns connect string if connection
        // is not open, else returns Connection object.
        switch(vtConnect.vt)
        {
            case VT_BSTR:
                PrintComError(e);
                break;
            case VT_DISPATCH:
                PrintProviderError(vtConnect);
                break;
            default:
                printf("Errors occured.");
                break;
        }
    }

    if (pRstEmployees)
        if (pRstEmployees->State == adStateOpen)
            pRstEmployees->Close();
}

//////////////////////////////////////////////////////////
//                                                      //
//    PrintProviderError Function                       //
//                                                      //
//////////////////////////////////////////////////////////
void PrintProviderError(_ConnectionPtr pConnection)
{
    // Print Provider Errors from Connection object.
    // pErr is a record object in the Connection's Error collection.
    ErrorPtr    pErr  = NULL;

    if( (pConnection->Errors->Count) > 0)
    {
        long nCount = pConnection->Errors->Count;
        // Collection ranges from 0 to 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 Function                          //
//                                                      //
//////////////////////////////////////////////////////////
void PrintComError(_com_error &e)
{
   _bstr_t bstrSource(e.Source());
   _bstr_t bstrDescription(e.Description());

    // Print Com errors.
   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);
}
// EndValueCpp

Field, objet | Property, objet | Value, propriété


Exemple de propriété Version (VC++)

Cet exemple utilise la propriété Version d'un objet Connection pour afficher le numéro de la version ADO utilisée. Il emploie également plusieurs propriétés dynamiques pour afficher :

  • le nom et la version du système de gestion de base de données (SGBD) ;
  • la version OLE DB ;
  • le nom et la version du fournisseur ;
  • la version ODBC ;
  • le nom et la version du gestionnaire ODBC.
// BeginVersionCpp
#import "c:\Program Files\Common Files\System\ADO\msado15.dll" \
    no_namespace rename("EOF", "EndOfFile")

#include <ole2.h>
#include <stdio.h>
#include <conio.h>

// Function declarations
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void VersionX(void);
void PrintProviderError(_ConnectionPtr pConnection);
void PrintComError(_com_error &e);

//////////////////////////////////////////////////////////
//                                                      //
//       Main Function                                  //
//                                                      //
//////////////////////////////////////////////////////////

void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    VersionX();

    ::CoUninitialize();
}

//////////////////////////////////////////////////////////
//                                                      //
//         VersionX Function                            //
//                                                      //
//////////////////////////////////////////////////////////
void VersionX(void)
{
    HRESULT   hr = S_OK;

    // Define string variables.
    _bstr_t strCnn("driver={SQL Server};server='MySqlServer';"
        "user id='MyUserId';password='MyPassword';database='pubs';");

    // Define ADO object pointers.
    // Initialize pointers on define.
    // These are in the ADODB::  namespace.
    _ConnectionPtr    pConnection     = NULL;

    try
    {
        // Open connection.
        TESTHR(pConnection.CreateInstance(__uuidof(Connection)));
        pConnection->Open (strCnn, "", "", adConnectUnspecified);

        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);

    }

    catch (_com_error &e)
    {
        // Notify the user of errors if any.
        PrintProviderError(pConnection);
        PrintComError(e);
    }

    if (pConnection)
        if (pConnection->State == adStateOpen)
            pConnection->Close();
}

//////////////////////////////////////////////////////////
//                                                      //
//     PrintProviderError Function                      //
//                                                      //
//////////////////////////////////////////////////////////
void PrintProviderError(_ConnectionPtr pConnection)
{
    // Print Provider Errors from Connection object.
    // pErr is a record object in the Connection's Error collection.
    ErrorPtr    pErr  = NULL;

    if( (pConnection->Errors->Count) > 0)
    {
        long nCount = pConnection->Errors->Count;
        // Collection ranges from 0 to 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 Function                          //
//                                                      //
//////////////////////////////////////////////////////////
void PrintComError(_com_error &e)
{
   _bstr_t bstrSource(e.Source());
   _bstr_t bstrDescription(e.Description());

    // Print Com errors.
   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);
}
// EndVersionCpp

Connection, objet | Version, propriété


Exemples de code ADO en Microsoft Visual J++

Utilisez les exemples de code ci-dessous pour apprendre à utiliser les méthodes et propriétés ADO lorsque vous programmez en Microsoft Visual J++.

Remarque Collez l'exemple de code dans sa totalité, du début à la fin, dans votre éditeur de code. L'exemple risque de ne pas fonctionner correctement si des copies partielles d'exemple sont utilisées ou si la mise en forme des paragraphes est perdue.

Méthodes

  • Exemple de méthode AddNew
  • Exemple de méthodes Append et CreateParameter
  • Exemple de méthodes AppendChunk et GetChunk
  • Exemple de méthodes BeginTrans, CommitTrans et RollbackTrans
  • Exemple de méthode Cancel
  • Exemple de méthode Clone
  • Exemple de méthode CompareBookmarks
  • Exemple de méthode Delete
  • Exemple de méthodes Execute, Requery et Clear
  • Exemple de méthode Find
  • Exemple de méthode GetRows
  • Exemple de méthode GetString
  • Exemple de méthodes MoveFirst, MoveLast, MoveNext et MovePrevious
  • Exemple de méthode NextRecordset
  • Exemple de méthodes Open et Close
  • Exemple de méthode OpenSchema
  • Exemple de méthode Refresh
  • Exemple de méthode Resync
  • Exemple de méthodes Save et Open
  • Exemple de méthode Supports
  • Exemple de méthodes Update et CancelUpdate
  • Exemple de méthodes UpdateBatch et CancelBatch

Propriétés

  • Exemple de propriétés AbsolutePage, PageCount et PageSize
  • Exemple de propriétés AbsolutePosition et CursorLocation
  • Exemple de propriété ActiveCommand
  • Exemple de propriétés ActiveConnection, CommandText, CommandTimeout, CommandType, Size et Direction
  • Exemple de propriétés ActualSize et DefinedSize
  • Exemple de propriétés Attributes et Name
  • Exemple de propriétés BOF, EOF et Bookmark
  • Exemple de propriété CacheSize
  • Exemple de propriétés ConnectionString, ConnectionTimeout et State
  • Exemple de propriété Count
  • Exemple de propriétés CursorType, LockType et EditMode
  • Exemple de propriétés Description, HelpContext, HelpFile, NativeError, Number, Source et SQLState
  • Exemple de propriétés Filter et RecordCount
  • Exemple de propriétés IsolationLevel et Mode
  • Exemple de propriété Item
  • Exemple de propriété MarshalOptions
  • Exemple de propriété MaxRecords
  • Exemple de propriétés NumericScale et Precision
  • Exemple de propriété Optimize
  • Exemple de propriétés OriginalValue et UnderlyingValue
  • Exemple de propriété Prepared
  • Exemple de propriétés Provider et DefaultDatabase
  • Exemple de propriété Sort
  • Exemple de propriété Source
  • Exemple de propriété State
  • Exemple de propriété Status
  • Exemple de propriété StayInSync
  • Exemple de propriété Type (Field)
  • Exemple de propriété Type (Property)
  • Exemple de propriété Value
  • Exemple de propriété Version

Voir aussi

Exemples de code ADO en Microsoft Visual Basic | Exemples de code ADO en Microsoft Visual Basic Scripting Edition | Exemples de code ADO en Microsoft Visual C++


Exemple de propriétés AbsolutePage, PageCount et PageSize (VJ++)

Cet exemple utilise les propriétés AbsolutePage, PageCount et PageSize pour afficher les noms et dates de recrutement extraits de la table Employees, à raison de cinq enregistrements à la fois.

// BeginAbsolutePageJ
// The WFC class includes the ADO objects.

import com.ms.wfc.data.*;
import java.io.* ;

public class AbsolutePageX
{
   // The main entry point for the application.

   public static void main (String[] args)
   {
      AbsolutePageX();
      System.exit(0);
   }

   // AbsolutePageX function

   static void AbsolutePageX()
   {
      // Define ADO Objects.
      Recordset rstEmployees = null;

      // Declarations.
      BufferedReader in = new BufferedReader (new
         InputStreamReader(System.in));
      String line = null;
      String strCnn = "Provider='sqloledb';Data Source='MySqlServer';"
         + "Initial Catalog='Pubs';Integrated Security='SSPI';";

      String strName;
      String strFName;
      String strLName;
      String strHDate;
      int intPage;
      int intRecord;

      try
      {
         rstEmployees = new Recordset();

         // Use client cursor to enable AbsolutePosition property.
         rstEmployees.setCursorLocation( AdoEnums.CursorLocation.CLIENT);

         // Open a recordset using client cursor for the Employees table.
         rstEmployees.open("employee", strCnn,
            AdoEnums.CursorType.FORWARDONLY,
            AdoEnums.LockType.READONLY,
            AdoEnums.CommandType.TABLE);

         // Display names and hire dates, five records at a time.

         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);
            // Get user input to display next records.

            System.out.println("\n\nPress <Enter> key to Continue.");
            line = in.readLine();
         }
      }
      catch( AdoException ae )
      {
         // Notify user of any errors that result from ADO.

         // Check for null pointer for connection object.
         if (rstEmployees.getActiveConnection()==null)
            System.out.println("Exception: " + ae.getMessage());

         // As passing a Recordset, check for null pointer first.
         if (rstEmployees != null)
         {
            PrintProviderError(rstEmployees.getActiveConnection());
         }
         else
         {
            System.out.println("Exception: " + ae.getMessage());
         }
      }
      // System read requires this catch.
      catch( java.io.IOException je)
      {
         PrintIOError(je);
      }
      finally
      {
         // Cleanup objects before exit.
         if (rstEmployees != null)
            if (rstEmployees.getState() == 1)
               rstEmployees.close();
      }
   }

   // PrintProviderError Function

   static void PrintProviderError( Connection Cnn1 )
   {
      // Print Provider errors from Connection object.
      // ErrItem is an item object in the Connections Errors collection.
      com.ms.wfc.data.Error  ErrItem = null;
      long nCount = 0;
      int  i      = 0;

      nCount = Cnn1.getErrors().getCount();

      // If there are any errors in the collection, print them.
      if( nCount > 0);
      {
         // Collection ranges from 0 to 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 Function

   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");
   }
}
// EndAbsolutePageJ

Voir aussi

AbsolutePage, propriété | PageCount, propriété | PageSize, propriété | Recordset, objet


Exemple de propriétés AbsolutePosition et CursorLocation (VJ++)

Cet exemple illustre comment la propriété AbsolutePosition peut suivre la progression d'une boucle énumérant tous les enregistrements d'un objet Recordset. Il utilise la propriété CursorLocation pour activer la propriété AbsolutePosition en sélectionnant le type de curseur côté client.

// BeginAboslutePositionJ
import com.ms.wfc.data.*;
import java.io.*;

public class AbsolutePositionX
{
   // The main entry point for the application.

   public static void main (String[] args)
   {
      AbsolutePositionX();
      System.exit(0);
   }

   //.AbsolutePositionX function

   static void AbsolutePositionX()
   {

      // define ADO Objects.
      Recordset rstEmployees = null;

      // Declarations.
      BufferedReader in =
         new BufferedReader(new InputStreamReader(System.in));
      String line = null;
      String strCnn = "Provider='sqloledb';Data Source='MySqlServer';" +
         "Initial Catalog='Pubs';Integrated Security='SSPI';";

      String strLName;
      String strMessage;
      String strAbsolutePosition,strRecordCount;
      int intAbsolutePosition;
      int intRecordCount;
      int intChoice;

      try
      {

         rstEmployees = new Recordset();

         // Use client cursor to enable AbsolutePosition property.
         rstEmployees.setCursorLocation( AdoEnums.CursorLocation.CLIENT);

         // Open a recordset for Employees table using a client cursor.
         rstEmployees.open("employee", strCnn,
            AdoEnums.CursorType.FORWARDONLY ,
            AdoEnums.LockType.READONLY,
            AdoEnums.CommandType.TABLE);

         // Enumerate Recordset.
         while ( !rstEmployees.getEOF()) // continuous loop
         {
            intRecordCount = rstEmployees.getRecordCount();
            strRecordCount = Integer.toString(intRecordCount);

            // Read data field in the variables.
            strLName = rstEmployees.getField("lname").getString();
            intAbsolutePosition = rstEmployees.getAbsolutePosition();
            strAbsolutePosition = Integer.toString(intAbsolutePosition);

            // Display current record information.
            strMessage = "\nEmployee: " + strLName + "\n" + "(Record " +
               strAbsolutePosition + " of " +strRecordCount + " )";
            System.out.println(strMessage);
            System.out.println(
               "\nDo you want to continue (1 -> Yes / 2 -> No)?");
            //user types a number followed by enter (cr-lf).
            line = in.readLine().trim();
            intChoice = Integer.parseInt(line);
            if ( intChoice != 1)
               break;
            rstEmployees.moveNext();
         }
      }

      catch( NumberFormatException ne)
      {
         System.out.println("\nException : Integer Input required.");
         System.exit(0);
      }

      catch( AdoException ae )
      {
         // Notify user of any errors that result from ADO.

         // Check for null pointer for connection object.
         if (rstEmployees.getActiveConnection()== null)
            System.out.println("Exception: " + ae.getMessage());
         // As passing a Recordset, check for null pointer first.
         if (rstEmployees != null)
         {
            PrintProviderError(rstEmployees.getActiveConnection());
         }
         else
         {
            System.out.println("Exception: " + ae.getMessage());
         }
      }

      // System read requires this catch.
      catch( java.io.IOException je)
      {
         PrintIOError(je);
      }

      finally
      {
         // Cleanup objects before exit.
         if (rstEmployees != null)
            if (rstEmployees.getState() == 1)
               rstEmployees.close();
      }
   }

   // PrintProviderError Function

   static void PrintProviderError( Connection Cnn1 )
   {
      // Print Provider errors from Connection object.
      // ErrItem is an item object in the Connections Errors collection.
      com.ms.wfc.data.Error  ErrItem = null;
      long nCount = 0;
      int  i      = 0;

      nCount = Cnn1.getErrors().getCount();

      // If there are any errors in the collection, print them.
      if( nCount > 0);
      {
         // Collection ranges from 0 to 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 Function

   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");
   }
}

// EndAbsolutePositionJ

Voir aussi

AbsolutePosition, propriété | CursorLocation, propriété | Recordset, objet


Exemple de propriété ActiveCommand (VJ++)

Cet exemple utilise la propriété ActiveCommand.

Un objet Recordset dont la propriété ActiveCommand permet d'afficher le texte et le paramètre de la commande ayant servi à la création du Recordset est attribué à une sous-routine.

// BeginActiveCommandJ
import com.ms.wfc.data.*;
import java.io.* ;

public class ActiveCommandX
{
   // The main entry point for the application.

   public static void main (String[] args)
   {
      ActiveCommandX();
      System.exit(0);
   }

   // ActiveCommandX function

   static void ActiveCommandX()
   {
      // Define ADO Objects.
      Connection cnConn1 = null;
      Command cmd = null;
      Recordset rstAuthors = null;

      // Declarations.
      BufferedReader in =
         new BufferedReader (new InputStreamReader(System.in));
      String strCnn = "Provider='sqloledb';Data Source='MySqlServer';"
         + "Initial Catalog='Pubs';Integrated Security='SSPI';";
      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);
      }
      catch( AdoException ae )
      {
         // Notify user of any errors that result from ADO.

         // As passing a Recordset, check for null pointer first.
         if (rstAuthors != null)
         {
            PrintProviderError(rstAuthors.getActiveConnection());
         }
         else
         {
            System.out.println("Exception: " + ae.getMessage());
         }
      }

      // System read requires this catch.
      catch( java.io.IOException je)
      {
         PrintIOError(je);
      }

      finally
      {
         // Cleanup objects before exit.
         if (rstAuthors != null)
            if (rstAuthors.getState() == 1)
               rstAuthors.close();
         // Cleanup objects before exit.
         if (cnConn1 != null)
            if (cnConn1.getState() == 1)
               cnConn1.close();
      }
   }

   // ActiveCommandXprint function
   static void ActiveCommandXprint(Recordset rstp)
   {
      // Declarations.
      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 )
      {
         // Notify user of any errors that result from ADO.

         // As passing a Recordset, check for null pointer first.
         if (rstp != null)
         {
            PrintProviderError(rstp.getActiveConnection());
         }
         else
         {
            System.out.println("Exception: " + ae.getMessage());
         }
      }

      // System read requires this catch.
      catch( java.io.IOException je)
      {
         PrintIOError(je);
      }
   }

   // PrintProviderError Function

   static void PrintProviderError( Connection Cnn1 )
   {
      // Print Provider errors from Connection object.
      // ErrItem is an item object in the Connections Errors collection.
      com.ms.wfc.data.Error  ErrItem = null;
      long nCount = 0;
      int  i      = 0;

      nCount = Cnn1.getErrors().getCount();

      // If there are any errors in the collection, print them.
      if( nCount > 0);
      {
         // Collection ranges from 0 to 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 Function

   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");
   }
}

// EndActiveCommandJ

ActiveCommand, propriété | Recordset, objet


Exemple de propriétés ActiveConnection, CommandText, CommandTimeout, CommandType, Size et Direction (VJ++)

Cet exemple utilise les propriétés ActiveConnection, CommandText, CommandTimeout, CommandType, Size et Direction pour exécuter une procédure stockée.

// BeginActiveConnectionJ
import com.ms.wfc.data.*;
import java.io.*;

public class ActiveConnectionX
{
   // The main entry point for the application.

   public static void main (String[] args)
   {
      ActiveConnectionX();
      System.exit(0);
   }

   //.ActiveConnectionX function

   static void ActiveConnectionX()
   {
      // Define ADO Objects.
      Connection cnConn1 = null;
      Command cmdByRoyalty = null;
      Parameter prmByRoyalty = null;
      Recordset rstByRoyalty = null;
      Recordset rstAuthors = null;

      //Declarations.
      String strCnn;
      String strAuthorID;
      String strFName;
      String strLName;
      int intRoyalty ;
      BufferedReader in = new BufferedReader
         (new InputStreamReader (System.in));
      String line = null;

      try
      {
         // Open a connection.

         strCnn = "Provider='sqloledb';Data Source='MySqlServer';"
            + "Initial Catalog='Pubs';Integrated Security='SSPI';";
         cnConn1 = new Connection();
         cnConn1.open(strCnn,"","",AdoEnums.CommandType.UNSPECIFIED);

         // Define a command object for stored procedure.
         cmdByRoyalty = new Command();
         cmdByRoyalty.setActiveConnection(cnConn1);
         cmdByRoyalty.setCommandText("byRoyalty");
         cmdByRoyalty.setCommandType(AdoEnums.CommandType.STOREDPROC);
         cmdByRoyalty.setCommandTimeout(15);

         //Define the stored procedure's input parameter.
         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);

         // Create a recordset by executing the command.

         rstByRoyalty = cmdByRoyalty.execute();

         // Open the Authors table to get author names for display.
         rstAuthors = new Recordset ();
         rstAuthors.open("authors",strCnn,
            AdoEnums.CursorType.FORWARDONLY,
            AdoEnums.LockType.READONLY ,AdoEnums.CommandType.TABLE );

         // Print current data in the recordset,
         // adding author names from Authors table.
         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 objects before exit.
         rstByRoyalty.close();
         rstAuthors.close();
         cnConn1.close();

      }
      catch( AdoException ae )
      {
         // Notify user of any errors that result from ADO.

         // Check for null pointer for connection object
         if(rstByRoyalty.getActiveConnection()==null)
            System.out.println("Exception: " + ae.getMessage());
         if(rstAuthors.getActiveConnection()==null)
            System.out.println("Exception: " + ae.getMessage());
         // As passing a Recordset, check for null pointer first.
         if (rstByRoyalty != null)
         {
            PrintProviderError(rstByRoyalty.getActiveConnection());
         }
         if (rstAuthors != null)
         {
            PrintProviderError(rstAuthors.getActiveConnection());
         }
         else
         {
            System.out.println("Exception: " + ae.getMessage());
         }
      }

      // This catch is required if input string cannot be converted to
      // Integer data type.
      catch ( java.lang.NumberFormatException ne)
      {
         System.out.println("\nException: Integer Input required.");
      }
      // System Read requires this catch.
      catch( java.io.IOException je )
      {
         PrintIOError(je);
      }
      finally
      {
         // Cleanup objects before exit.
         if (rstByRoyalty != null)
            if (rstByRoyalty.getState() == 1)
               rstByRoyalty.close();
         if (rstAuthors != null)
            if (rstAuthors.getState() == 1)
               rstAuthors.close();
         if (cnConn1 != null)
            if (cnConn1.getState() == 1)
               cnConn1.close();
      }
   }

   // PrintProviderError Function

   static void PrintProviderError( Connection Cnn1 )
   {
      // Print Provider errors from Connection object.
      // ErrItem is an item object in the Connections Errors collection.
      com.ms.wfc.data.Error  ErrItem = null;
      long nCount = 0;
      int  i      = 0;

      nCount = Cnn1.getErrors().getCount();

      // If there are any errors in the collection, print them.
      if( nCount > 0);
      {
         // Collection ranges from 0 to 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 Function

   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");
   }
}

// EndActiveConnectionJ

Voir aussi

ActiveConnection, propriété | CommandText, propriété | CommandTimeout, propriété | CommandType, propriété | Direction, propriété | Size, propriété


Exemple de propriétés ActualSize et DefinedSize (VJ++)

Cet exemple utilise les propriétés ActualSize et DefinedSize pour afficher la taille définie et la taille réelle d'un champ.

// BeginActualSizeJ
import com.ms.wfc.data.*;
import java.io.*;

public class ActualSizeX
{
   // The main entry point for the application.

   public static void main (String[] args)
   {
      ActualSizeX();
      System.exit(0);
   }

   // ActualSizeX function

   static void ActualSizeX()
   {

      // Define ADO Objects.
      Recordset rstStores = null;

      // Declarations.
      BufferedReader in = new
         BufferedReader(new InputStreamReader(System.in));
      String line = null;
      String strCnn = "Provider='sqloledb';Data Source='MySqlServer';"
         + "Initial Catalog='Pubs';Integrated Security='SSPI';";

      String strStoreName;
      String strMessage;
      String strDSize,strASize;
      int intDefinedSize;
      int intActualSize;
      int intChoice = 0;

      try
      {
         // Open recordset with Stores table.
         rstStores = new Recordset();
         rstStores.open("stores", strCnn,
            AdoEnums.CursorType.FORWARDONLY ,
            AdoEnums.LockType.READONLY ,
            AdoEnums.CommandType.TABLE);

         // Loop through the Recordset displaying the contents
         // of the stor_name field, the field's defined size
         // and it's actual size.

         while ( !(rstStores.getEOF( ))) // continuous loop
         {
            // Read data field in the variables.
            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);

            // Display current record information.
            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();
         }
      }
      catch( AdoException ae )
      {
         // Notify user of any errors that result from ADO.

         // Check for null pointer for connection object.
         if (rstStores.getActiveConnection()==null)
            System.out.println("Exception: " + ae.getMessage());
         // As passing a Recordset, check for null pointer first.
         if (rstStores != null)
         {
            PrintProviderError(rstStores.getActiveConnection());
         }
         else
         {
            System.out.println("Exception: " + ae.getMessage());
         }
      }

      // System read requires this catch.
      catch( java.io.IOException je)
      {
         PrintIOError(je);
      }

      finally
      {
         // Cleanup objects before exit.
         if (rstStores != null)
            if (rstStores.getState() == 1)
               rstStores.close();
      }
   }

   // PrintProviderError Function

   static void PrintProviderError( Connection Cnn1 )
   {
      // Print Provider errors from Connection object.
      // ErrItem is an item object in the Connections Errors collection.
      com.ms.wfc.data.Error  ErrItem = null;
      long nCount = 0;
      int  i      = 0;

      nCount = Cnn1.getErrors().getCount();

      // If there are any errors in the collection, print them.
      if( nCount > 0);
      {
         // Collection ranges from 0 to 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 Function

   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");
   }
}
// EndActualSizeJ

ActualSize, propriété | DefinedSize, propriété


Exemple de méthode AddNew (VJ++)

Cet exemple utilise la méthode AddNew pour créer un enregistrement portant le nom indiqué.

// BeginAddNewJ
import com.ms.wfc.data.*;
import java.io.*;

public class AddNewX
{
   // The main entry point for the application.

   public static void main (String[] args)
   {
      AddNewX();
      System.exit(0);
   }

   // AddNewX function

   static void AddNewX()
   {
      // Define ADO Objects.
      Connection cnConn1 = null;
      Recordset rstEmployees = null;

      //Declarations.
      String strCnn;
      String strID;
      String strFirstName;
      String strLastName;
      boolean booRecordAdded ;
      BufferedReader in =
         new BufferedReader (new InputStreamReader (System.in));
      String line = null;

      try
      {
         // Open a connection.
         strCnn = "Provider='sqloledb';Data Source='MySqlServer';"
            + "Initial Catalog='Pubs';Integrated Security='SSPI';";
         cnConn1 = new Connection();
         cnConn1.open(strCnn);//,"","",AdoEnums.CommandType.UNSPECIFIED);

         // Open Employees table.
         rstEmployees = new Recordset ();
         rstEmployees.open("employee", cnConn1,
            AdoEnums.CursorType.KEYSET , AdoEnums.LockType.OPTIMISTIC ,
            AdoEnums.CommandType.TABLE );

         /* Get data from the user. The employee ID must be formatted as
         first,middle, and last initial, five numbers, then M or F to
         signify the gender. For example, the employee id for Bill
         Sornsin would be "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();

         // Proceed only if the user actually entered something
         // for both the first and last names.

         if ( !(strID.compareTo("") == 0) &
            !(strFirstName.compareTo("") == 0) &
            !(strLastName.compareTo("")== 0))
         {
            // Add new record.
            rstEmployees.addNew();
            rstEmployees.getField("emp_id").setString(strID);
            rstEmployees.getField("fname").setString(strFirstName);
            rstEmployees.getField("lname").setString(strLastName);

            // update the record with the new data.
            rstEmployees.update();
            booRecordAdded = true;

            // Show the newly added data.
            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();

         // Delete the new record because this is a demonstration.
         cnConn1.execute("DELETE FROM employee WHERE "
            + "emp_id = '" + strID + "'");
      }
      catch( AdoException ae )
      {
         // Notify user of any errors that result from ADO.

         //Check for null pointer for connection object.
         if(rstEmployees.getActiveConnection()==null)
            System.out.println("Exception: " + ae.getMessage());
         // As passing a Recordset, check for null pointer first.
         if (rstEmployees != null)
         {
            PrintProviderError(rstEmployees.getActiveConnection());
         }
         else
         {
            System.out.println("Exception: " + ae.getMessage());
         }
         System.exit(0);
      }
      // System Read requires this catch.
      catch( java.io.IOException je )
      {
         PrintIOError(je);
      }
      finally
      {
         // Cleanup objects before exit.
         if (rstEmployees != null)
            if (rstEmployees.getState() == 1)
               rstEmployees.close();
         if (cnConn1 != null)
            if (cnConn1.getState() == 1)
               cnConn1.close();
         System.exit(0);
      }

   }

   // PrintProviderError Function

   static void PrintProviderError( Connection Cnn1 )
   {
      // Print Provider errors from Connection object.
      // ErrItem is an item object in the Connections Errors collection.
      com.ms.wfc.data.Error  ErrItem = null;
      long nCount = 0;
      int  i      = 0;

      nCount = Cnn1.getErrors().getCount();

      // If there are any errors in the collection, print them.
      if( nCount > 0);
      {
         // Collection ranges from 0 to 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 Function

   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");
   }
}

// EndAddNewJ

AddNew, méthode | Recordset, objet


Exemple de méthodes Append et CreateParameter (VJ++)

Cet exemple utilise les méthodes Append et CreateParameter pour exécuter une procédure stockée avec un paramètres d'entrée.

// BeginAppendJ
import com.ms.wfc.data.*;
import java.io.*;
import com.ms.com.*;

public class AppendX
{
   // The main entry point for the application.

   public static void main (String[] args)
   {
      AppendX();
   }

   // AppendX function

   static void AppendX()
   {
      // Define ADO Objects.
      Connection cnConn1 = null;
      Command cmdByRoyalty = null;
      Parameter prmByRoyalty = null;
      Recordset rstByRoyalty = null;
      Recordset rstAuthors = null;

      //Declarations.
      String strCnn;
      String strAuthorID;
      String strFName;
      String strLName;
      int intRoyalty ;
      BufferedReader in =
         new BufferedReader (new InputStreamReader (System.in));
      String line = null;
      Variant varRoyalty;

      try
      {
         // Open a connection.

         strCnn = "Provider='sqloledb';Data Source='MySqlServer';"
            + "Initial Catalog='Pubs';Integrated Security='SSPI';";
         cnConn1 = new Connection();
         cnConn1.open(strCnn);
         cnConn1.setCursorLocation(AdoEnums.CursorLocation.CLIENT);

         // Open command object with one parameter.
         cmdByRoyalty = new Command();
         cmdByRoyalty.setCommandText("byRoyalty");
         cmdByRoyalty.setCommandType(AdoEnums.CommandType.STOREDPROC);

         //Get parameter value and append parameter.
         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);

         // Create a recordset by executing the command.
         cmdByRoyalty.setActiveConnection(cnConn1);
         rstByRoyalty = cmdByRoyalty.execute();

         // Open the Authors table to get author names for display.
         rstAuthors = new Recordset ();
         rstAuthors.open("authors", cnConn1,
            AdoEnums.CursorType.FORWARDONLY,
            AdoEnums.LockType.READONLY,
            AdoEnums.CommandType.TABLE );

         // Print current data in the recordset,
         // adding author names from Authors table.
         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();

      }
      catch( AdoException ae )
      {
         // Notify user of any errors that result from ADO.

         // Check for null pointer for connection object.
         if(rstByRoyalty.getActiveConnection()==null)
            System.out.println("Exception: " + ae.getMessage());
         // As passing a Recordset, check for null pointer first.
         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());
         }
      }

      // This catch is required if input string cannot be converted to
      // Integer data type.
      catch( java.lang.NumberFormatException ne)
      {
         System.out.println("\nException: Integer Number required.");
         System.exit(0);
      }
      // System Read requires this catch.
      catch( java.io.IOException je )
      {
         PrintIOError(je);
      }
      finally
      {
         // Cleanup objects before exit.
         if (rstByRoyalty != null)
            if (rstByRoyalty.getState() == 1)
               rstByRoyalty.close();
         if (rstAuthors != null)
            if (rstAuthors.getState() == 1)
               rstAuthors.close();
         if (cnConn1 != null)
            if (cnConn1.getState() == 1)
               cnConn1.close();
         System.exit(0);//required here only.
      }

   }

   // PrintProviderError Function

   static void PrintProviderError( Connection Cnn1 )
   {
      // Print Provider errors from Connection object.
      // ErrItem is an item object in the Connections Errors collection.
      com.ms.wfc.data.Error  ErrItem = null;
      long nCount = 0;
      int  i      = 0;

      nCount = Cnn1.getErrors().getCount();

      // If there are any errors in the collection, print them.
      if( nCount > 0);
      {
         // Collection ranges from 0 to 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 Function

   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");
   }
}

// EndAppendJ

Append, méthode | CreateParameter, méthode


Exemple de méthodes AppendChunk et GetChunk (VJ++)

Cet exemple utilise les méthodes AppendChunk et GetChunk pour ajouter dans un champ d'image des données provenant d'un autre enregistrement.

// BeginAppendChunkJ
import com.ms.wfc.data.*;
import java.io.*;
import com.ms.com.*;
import java.util.*;

public class AppendChunkX
{

   // The main entry point for the application.

   public static void main (String[] args)
   {
      AppendChunkX();
      System.exit(0);
   }

   // AppendChunkX function

   static void AppendChunkX()
   {
      // Define ADO Objects.
      Connection cnConn1 = null;
      Recordset rstPubInfo = null;

      //Declarations.
      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
      {
         // Open a connection.
         strCnn = "Provider='sqloledb';Data Source='MySqlServer';"
            + "Initial Catalog='Pubs';Integrated Security='SSPI';";
         cnConn1 = new Connection();
         cnConn1.open(strCnn,"","",AdoEnums.CommandType.UNSPECIFIED);

         // Open the pub_info Table.
         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();

         // Prompt for the Logo to copy.
         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";
            // Display five records at a time.
            if ( recordCount == noOfRecordesDisplayed)
            {
               System.out.println(strMessage);
               System.out.println("\n\nPress <Enter> to continue..");
               line = in.readLine();
               strMessage = "";
               recordCount = 0;
            }
            rstPubInfo.moveNext();
            // Display last records and exit if last record.
            if(rstPubInfo.getEOF())
            {
               System.out.println(strMessage);
               break;
            }
         }
         System.out.println ("\nEnter the ID of a logo to copy :\n"  );
         strPubID = in.readLine();

         // Copy the logo to a variable in chunks.
         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 ;
         }
            //Get the data for New ID from the user.
            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();

            //Temporarily add new publisher to publishers table to
            //avoid getting error foreign key constraint.
            cnConn1.execute("INSERT publishers(pub_id) VALUES('" +
               strPubID + "')");

            //Add a new record.
            rstPubInfo.addNew();
            rstPubInfo.getField("pub_id").setString(strPubID);
            rstPubInfo.getField("pr_info").setString(strPRInfo);

            //Copy the selected logo to the new logo in chunks.
            lngOffset = 0;

            //Divide logosize in multiples of constant chunk size.
            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 ;
               // Copy the logo in constant chunk size.
               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);
               }
               // Copy the last remaining chunk.
               else
               {
                  while (ii < intLastChunkSize &&
                     (int)lngOffset < varLogo.size () )
                  {
                     lastChunk[ii] =
                        ((Byte)varLogo.elementAt
                        ((int)lngOffset)).byteValue();
                     ii++;
                     lngOffset++;

                  }
                  rstPubInfo.getField("logo").appendChunk(lastChunk);
               }

            }

            // Update the new recordset with new logo.

            rstPubInfo.update();

            //Show the newly added data.
            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();

            //Delete new records because this is a demonstration.
            rstPubInfo.requery();
            cnConn1.execute("DELETE FROM pub_info WHERE  pub_id = '" +
               strPubID + "'");
            cnConn1.execute("DELETE FROM publishers WHERE  pub_id = '" +
               strPubID + "'");
      }
      catch( AdoException ae )
         {
            // Notify user of any errors that result from ADO.

            // Check for null pointer for connection object.
            if(rstPubInfo.getActiveConnection()==null)
                  System.out.println("Exception: " + ae.getMessage());
            // As passing a Recordset, check for null pointer first.
            if (rstPubInfo != null)
            {
               PrintProviderError(rstPubInfo.getActiveConnection());
               PrintADOError(ae);
            }
            else
            {
               System.out.println("Exception: " + ae.getMessage());
            }
      }
      // System Read requires this catch.
      catch( java.io.IOException je )
      {
         PrintIOError(je);
      }
      finally
      {
         // Cleanup objects before exit.
         if (rstPubInfo != null)
            if (rstPubInfo.getState() == 1)
               rstPubInfo.close();
         if (cnConn1 != null)
            if (cnConn1.getState() == 1)
               cnConn1.close();
      }
   }

   // PrintProviderError Function

   static void PrintProviderError( Connection Cnn1 )
   {
      // Print Provider errors from Connection object.
      // ErrItem is an item object in the Connections Errors collection.
      com.ms.wfc.data.Error  ErrItem = null;
      long nCount = 0;
      int  i      = 0;

      nCount = Cnn1.getErrors().getCount();

      // If there are any errors in the collection, print them.
      if( nCount > 0);
      {
         // Collection ranges from 0 to 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 Function

   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 Function

   static void PrintADOError(AdoException ae)
   {
      System.out.println("\t Error Source = " + ae.getSource() + "\n");
      System.out.println("\t Description = " + ae.getMessage() + "\n");
   }
}
// EndAppendChunkJ

AppendChunk, méthode | Field, objet | GetChunk, méthode


Exemple de propriétés Attributes et Name (VJ++)

Cet exemple affiche la valeur de la propriété Attributes pour les objets Connection, Field et Property. Il utilise la propriété Name pour afficher le nom de chaque objet Field et Property.

// BeginAttributesJ
import com.ms.wfc.data.*;
import java.io.*;

public class AttributesX
{
   // The main entry point for the application
   public static void main (String[] args)
   {
      AttributesX();
      System.exit(0);
   }

   // AttributeX Function

   static void AttributesX()
   {
      // Define ADO Objects.
      Connection cnConn1 = null;
      Recordset rstEmployees = null;
      Fields listOfFields = null;
      AdoProperties listOfProperties = null;

      //Declarations.
      BufferedReader in =
         new BufferedReader (new InputStreamReader(System.in));
      String line = null;
      String strCnn = "Provider='sqloledb';Data Source='MySqlServer';"
         + "Initial Catalog='Pubs';Integrated Security='SSPI';";
      int recordDisplaySize = 15;
      int propertyCount = 0;
      try
      {
         // Open connection and recordset.
         cnConn1 = new Connection();
         cnConn1.open(strCnn);

         rstEmployees = new Recordset ();
         rstEmployees.open("employee",
            cnConn1,AdoEnums.CursorType.FORWARDONLY,
            AdoEnums.LockType.READONLY, AdoEnums.CommandType.TABLE);

         // Display the attributes of the connection.
         System.out.println("Connection attributes = "
            + cnConn1.getAttributes());
         // Display the attributes of the Employees table's fields.
         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());
         }

         // Display fields of the Employees table which are NULLABLE.
         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();

         // Display the attributes of the Employees table's properties.
         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();
      }
      catch( AdoException ae )
      {
         // Notify user of any errors that result from ADO.

         // Check for null pointer for connection object.
         if (rstEmployees.getActiveConnection()==null)
            System.out.println("Exception: " + ae.getMessage());

         // As passing a Recordset, check for null pointer first.

         if (rstEmployees != null)
         {
            PrintProviderError(rstEmployees.getActiveConnection());
         }
         else
         {
            System.out.println("Exception: " + ae.getMessage());
         }
      }

      // System read requires this catch.
      catch( java.io.IOException je)
      {
         PrintIOError(je);
      }

      finally
      {
         // Cleanup objects before exit.
         if (rstEmployees != null)
            if (rstEmployees.getState() == 1)
               rstEmployees.close();
         if (cnConn1 != null)
            if (cnConn1.getState() == 1)
               cnConn1.close();
      }
   }

   // PrintProviderError Function

   static void PrintProviderError( Connection Cnn1 )
   {
      // Print Provider errors from Connection object.
      // ErrItem is an item object in the Connections Errors collection.
      com.ms.wfc.data.Error  ErrItem = null;
      long nCount = 0;
      int  i      = 0;

      nCount = Cnn1.getErrors().getCount();

      // If there are any errors in the collection, print them.
      if( nCount > 0);
      {
         // Collection ranges from 0 to 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 Function

   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");
   }
}

// EndAttributesJ

Voir aussi

Attributes, propriété | Connection, objet | Field, objet | Name, propriété | Property, objet


Exemple de méthodes BeginTrans, CommitTrans et RollbackTrans (VJ++)

Cet exemple change le type de tous les livres de psychologie figurant dans la table Titles de la base de données. Une fois que la méthode BeginTrans a commencé une transaction qui identifie toutes les modifications effectuées dans la table Titles, la méthode CommitTrans enregistre ces modifications. Vous pouvez utiliser la méthode Rollback pour annuler les modifications que vous avez enregistrées à l'aide de la méthode Update.

// BeginBeginTransJ
import com.ms.wfc.data.*;
import java.io.*;

public class BeginTransX
{
   // The main entry point for the application.

   public static void main (String[] args)
   {
      BeginTransX();
      System.exit(0);
   }

   // BeginTransX function
   static void BeginTransX()
   {
      // Define ADO Objects.
      Connection cnConn1 = null;
      Recordset rstTitles = null;

      //Declarations.
      String strCnn = "Provider='sqloledb';Data Source='MySqlServer';"
         + "Initial Catalog='Pubs';Integrated Security='SSPI';";
      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
      {
         // Open a connection.

         cnConn1 = new Connection();
         cnConn1.open(strCnn,"","",AdoEnums.CommandType.UNSPECIFIED);

         // Open the Titles table.
         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();

         // Loop through recordset and ask user if he/she wants
         // to change the type for a specified title.

         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) ?");
               // Change the title for the specified book.
               line = in.readLine().trim();
               intChoice = Integer.parseInt(line);
               if ( intChoice == 1)
               {
                  rstTitles.getField("type").setString("self_help");
                  rstTitles.update();
               }
            }
            rstTitles.moveNext();
         }

         // Ask if the user wants to commit to all the
         // changes made above.
         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();

         // Print current data in recordset.
         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();

         // Restore original data because this
         // is a demonstration.
         rstTitles.moveFirst();
         while (!rstTitles.getEOF())
         {
            if ((rstTitles.getField("type").getString().
               trim().compareTo("self_help"))== 0)
            {
               rstTitles.getField("type").setString("psychology");
               rstTitles.update();
            }
            rstTitles.moveNext();
         }
      }
      catch( AdoException ae )
      {
         // Notify user of any errors that result from ADO.

         // Check for null pointer for connection object.
         if(rstTitles.getActiveConnection()==null)
            System.out.println("Exception: " + ae.getMessage());

         // As passing a Recordset, check for null pointer first.
         if (rstTitles != null)
         {
            PrintProviderError(rstTitles.getActiveConnection());
         }
         else
         {
            System.out.println("Exception: " + ae.getMessage());
         }
      }
      // System Read requires this catch.
      catch( java.io.IOException je )
      {
         PrintIOError(je);
      }
      finally
      {
         // Cleanup objects before exit.
         if (rstTitles != null)
            if (rstTitles.getState() == 1)
               rstTitles.close();
         if (cnConn1 != null)
            if (cnConn1.getState() == 1)
               cnConn1.close();
      }
   }

   // PrintProviderError Function

   static void PrintProviderError( Connection Cnn1 )
   {
      // Print Provider errors from Connection object.
      // ErrItem is an item object in the Connections Errors collection.
      com.ms.wfc.data.Error  ErrItem = null;
      long nCount = 0;
      int  i      = 0;

      nCount = Cnn1.getErrors().getCount();

      // If there are any errors in the collection, print them.
      if( nCount > 0);
      {
         // Collection ranges from 0 to 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 Function

   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");
   }
}

// EndBeginTransJ

Voir aussi

BeginTrans, CommitTrans et RollbackTrans, méthodes | Update, méthode


Exemple de propriétés BOF, EOF et Bookmark (VJ++)

Cet exemple utilise les propriétés BOF et EOF pour afficher un message lorsqu'un utilisateur tente d'aller au-delà du premier ou du dernier enregistrement d'un objet Recordset. Il utilise également la propriété Bookmark qui permet à l'utilisateur de marquer un enregistrement dans un objet Recordset pour y revenir ultérieurement.

// BeginBOFEOFJ
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;

   // The main entry point for the application.

   public static void main (String[] args)
   {
      BOFEOFBookmark b1 = new BOFEOFBookmark ();
      b1.BOFX();
      b1.BOFX2();
      System.exit(0);
      try
      {
         b1.finalize();
      }
      catch(Throwable te)
      {
         System.out.println("Exception: " + te.getMessage());
      }
   }

   // The main entry point for the application.

   public void BOFX()
   {
      // Declarations.
      Recordset rstPublishers = null;
      String strCnn;
      String strMessage;
      int intCommand = 0;

      strCnn = "Provider='sqloledb';Data Source='MySqlServer';"
         + "Initial Catalog='Pubs';Integrated Security='SSPI';";
      try
      {
         // Open a recordset with data from Publishers table.
         rstPublishers = new Recordset();
         rstPublishers.setCursorType(AdoEnums.CursorType.STATIC );
         rstPublishers.setCursorLocation(
            AdoEnums.CursorLocation.CLIENT);

         // Use client cursor to enable AbsolutePosition property.

         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();

         //Display information about current record and get user input.
         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] / 5 - quit]" ;
            System.out.println (strMessage);
            line = in.readLine();
            //No entry exits loop.
            if (line.length() == 0)
               break;
            //convert string entry to int.
            intCommand = Integer.parseInt(line);
            //out of range entry exits loop.
            if ((intCommand < 1) || (intCommand > 4)) break ;

            //Call method based on user's validated selection.
            MoveAny(intCommand, rstPublishers);
         }
      }
      catch( AdoException ae )
      {
         // Notify user of any errors that result from ADO.

         // As passing a Recordset, check for null pointer first.
         if (rstPublishers != null)
         {
            PrintProviderError(rstPublishers.getActiveConnection());
         }
         else
         {
            System.out.println("Exception: " + ae.getMessage());
         }
      }

      // This catch is required if input string cannot be converted to
      // Integer data type. "TCS[VSD]"

      catch ( java.lang.NumberFormatException ne)
      {
         System.out.println("\nException: Integer Input required." );
      }

      // System Read requires this catch.
      catch( java.io.IOException je )
      {
         PrintIOError(je);
      }
      finally
      {
         // Cleanup objects before exit.
         if (rstPublishers != null)
            if (rstPublishers.getState() == 1)
               rstPublishers.close();
      }
   }

   // MoveAny Function

   public void MoveAny(int intChoice, Recordset rsTemp)
   {
      // Move Forward or backword per selection from user,
      // trapping for BOF and EOF.
      try
      {
         switch(intChoice)
         {
            case 1:   // Equals char of 1.
               rsTemp.moveNext();
               if (rsTemp.getEOF())
               {
                  System.out.println (
                     "\nMoving past the last record \nTry again." );
                  rsTemp.moveLast();
               }
               break;
            case 2:   // Equals char of 2.
               rsTemp.movePrevious();
               if (rsTemp.getBOF())
               {
                  System.out.println (
                     "\nMoving past the first record \nTry again." );
                  rsTemp.moveFirst();
               }
               break;
            case 3:   // Equals char of 3.
               // Store the bookmark of the current record.
               varBookmark = (Variant)rsTemp.getBookmark();
               break;
            case 4:   // Equals char of 4.
               // Go to the record indicated by the stored bookmark.
               if (varBookmark == null)
                  System.out.println ("\nNo bookmark set!");
               else
                  rsTemp.setBookmark((Object)varBookmark);
               break;
            default:
               break;
         }
      }
      catch( AdoException ae )
      {
         // Notify user of any errors that result from ADO.

         // As passing a Recordset, check for null pointer first.
         if (rsTemp != null)
         {
            PrintProviderError(rsTemp.getActiveConnection());
         }
         else
         {
            System.out.println("Exception: " + ae.getMessage());
         }
      }
   }

   // PrintProviderError Function

   static void PrintProviderError( Connection Cnn1 )
   {
      // Print Provider errors from Connection object.
      // ErrItem is an item object in the Connections Errors collection.
      com.ms.wfc.data.Error  ErrItem = null;
      long nCount = 0;
      int  i      = 0;

      nCount = Cnn1.getErrors().getCount();

      // If there are any errors in the collection, print them.
      if( nCount > 0);
      {
         // Collection ranges from 0 to 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 Function

   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() Function.           //
   ////////////////////////////////////////////

   public void BOFX2()
   {
      Recordset rs = null ;

      try
      {
         // Declarations.
         rs = new Recordset();
         Variant[] arrbmk = new Variant[11];
         rs.setCursorLocation( AdoEnums.CursorLocation.CLIENT);
            String strCnn = "Provider='sqloledb';Data Source='MySqlServer';"
            + "Initial Catalog='Pubs';Integrated Security='SSPI';";
         rs.setActiveConnection (strCnn);
         // Open recorset with data from authors table.
         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;

         // Create array of bookmarks.
         while (rs.getEOF() != true && ii < 11)
         {
            arrbmk[ii] = (Variant)rs.getBookmark();
            ii++;
            rs.move (2);
         }

         // set Filter to recordset.
         Variant bmk=new Variant();
         bmk.putVariantArray(arrbmk);
         rs.setFilter(bmk);
         System.out.println ("\nNumber of records after filtering : " + rs.getRecordCount() );

         // Dislay the records after filtering.
         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 )
      {
         // Notify user of any errors that result from ADO.

         // As passing a Recordset, check for null pointer first.
         if (rs != null)
         {
            PrintProviderError(rs.getActiveConnection());
            System.out.println("Exception: " + ae.getMessage());
         }
         else
         {
            System.out.println("Exception: " + ae.getMessage());
         }
      }
      // System Read requires this catch.
      catch( java.io.IOException je )
      {
         PrintIOError(je);
      }
   }
}

// EndBOFEOFJ

Voir aussi

BOF, EOF, propriétés | Bookmark, propriété | Recordset, objet


Exemple de propriété CacheSize (VJ++)

Cet exemple utilise la propriété CacheSize pour illustrer l'amélioration des performances lorsque 30 enregistrements sont mis en mémoire cache durant une opération.

// BeginCacheSizeJ
import com.ms.wfc.data.*;
import java.io.* ;

public class CacheSizeX
{
   // The main entry point for the application.

   public static void main (String[] args)
   {
      CacheSizeX();
      System.exit(0);
   }

   // CacheSizeX function

   static void CacheSizeX()
   {

      // Define ADO Objects.
      Recordset rstRoySched = null;

      // Declarations.
      BufferedReader in =
         new BufferedReader (new InputStreamReader(System.in));
      String line = null;
      String strCnn = "Provider='sqloledb';Data Source='MySqlServer';"
         + "Initial Catalog='Pubs';Integrated Security='SSPI';";

      long timeStart;
      long timeEnd;
      float timeNoCache;
      float timeCache;
      int   intLoop;
      String strTemp;

      try
      {
         // Open the RoySched table.
         rstRoySched = new Recordset();
         rstRoySched.open("roysched", strCnn,
            AdoEnums.CursorType.FORWARDONLY,
            AdoEnums.LockType.READONLY,
            AdoEnums.CommandType.TABLE);

         // Enumerate the Recordset object twice and record
         // the elapsed time.

         timeStart = System.currentTimeMillis();
         for ( intLoop = 0; intLoop < 2; intLoop++)
         {
            rstRoySched.moveFirst();
            while (!rstRoySched.getEOF())
            {
               // Execute a simple operation for the
               // performance test.
               strTemp = rstRoySched.getField("title_id").getString();
               rstRoySched.moveNext();
            }

         }

         timeEnd = System.currentTimeMillis();
         timeNoCache =(float)(timeEnd - timeStart)/1000f;

         // Cache records in groups of 30 records.
         rstRoySched.moveFirst();
         rstRoySched.setCacheSize(30);
         timeStart = System.currentTimeMillis();

         // Enumerate the Recordset object twice and record
         // the elapsed time.
         for ( intLoop = 0; intLoop < 2; intLoop++)
         {
            rstRoySched.moveFirst();
            while (!rstRoySched.getEOF())
            {
               // Execute a simple operation for the
               // performance test.

               strTemp = rstRoySched.getField("title_id").getString();
               rstRoySched.moveNext();
            }

         }

         timeEnd = System.currentTimeMillis();
         timeCache = (float)(timeEnd - timeStart)/1000f;

         // Display performance results.
         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();

      }
      catch( AdoException ae )
      {
         // Notify user of any errors that result from ADO.

         // Check for null pointer for connection object.
         if (rstRoySched.getActiveConnection()==null)
            System.out.println("Exception: " + ae.getMessage());

         // As passing a Recordset, check for null pointer first.
         if (rstRoySched != null)
         {
            PrintProviderError(rstRoySched.getActiveConnection());
         }
         else
         {
            System.out.println("Exception: " + ae.getMessage());
         }
      }

      // System read requires this catch.
      catch( java.io.IOException je)
      {
         PrintIOError(je);
      }
      finally
      {
         // Cleanup objects before exit.
         if (rstRoySched != null)
            if (rstRoySched.getState() == 1)
               rstRoySched.close();
      }

   }

   // PrintProviderError Function

   static void PrintProviderError( Connection Cnn1 )
   {
      // Print Provider errors from Connection object.
      // ErrItem is an item object in the Connections Errors collection.
      com.ms.wfc.data.Error  ErrItem = null;
      long nCount = 0;
      int  i      = 0;

      nCount = Cnn1.getErrors().getCount();

      // If there are any errors in the collection, print them.
      if( nCount > 0);
      {
         // Collection ranges from 0 to 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 Function

   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");
   }
}

// EndCacheSizeJ

CacheSize, propriété | Recordset, objet


Exemple de méthode Cancel (VJ++)

Cet exemple utilise la méthode Cancel pour annuler une commande s'exécutant sur un objet Connection lorsque la connexion est occupée.

// BeginCancelJ
import com.ms.wfc.data.*;
import java.io.* ;

public class CancelX
{
   // The main entry point for the application.

   public static void main (String[] args)
   {
      CancelX();
      System.exit(0);
   }

   // CancelX function

   static void CancelX()
   {
      // Define command strings.
      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='MySqlServer';"
         + "Initial Catalog='Pubs';Integrated Security='SSPI';";

      // Define ADO Objects.
      Connection cnConn1 = null;

      //Declarations.
      boolean booChanged = false;
      BufferedReader in =
         new BufferedReader (new InputStreamReader(System.in));
      String line = null;

      try
      {
         // Open a connection.
         cnConn1 = new Connection();
         cnConn1.open(strCnn);

         // Begin a transaction, then execute a command asynchronously.
         cnConn1.beginTrans();
         cnConn1.execute(strCmdChange,
            AdoEnums.ExecuteOption.ASYNCEXECUTE);

         // do something else for a little while - this could be changed.

         for (int intLoop = 0; intLoop < 10; intLoop++)
         {
            System.out.println(intLoop);
         }

         // If the command has NOT completed, cancel the execute
         // and roll back the transaction. Otherwise, commit the
         // transaction.

         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.");
         }

         //If the change was made, restore the data
         // because this is a demonstration.

         if(booChanged )
         {
            cnConn1.execute(strCmdRestore);
            System.out.println("\nData restored.");
         }

         System.out.println("\n\nPress <Enter> to continue..");
         in.readLine();
      }
      catch( AdoException ae )
      {
         // Notify user of any errors that result from ADO.

         // As passing a connection, check for null pointer first.
         if (cnConn1 != null)
         {
            PrintProviderError(cnConn1);
         }
         else
         {
            System.out.println("Exception: " + ae.getMessage());
         }
      }

      // System read requires this catch.
      catch( java.io.IOException je)
      {
         PrintIOError(je);
      }
      finally
      {
         // Cleanup objects before exit.
         if (cnConn1 != null)
            if (cnConn1.getState() == 1)
               cnConn1.close();
      }
   }

   // PrintProviderError Function

   static void PrintProviderError( Connection Cnn1 )
   {
      // Print Provider errors from Connection object.
      // ErrItem is an item object in the Connections Errors collection.
      com.ms.wfc.data.Error  ErrItem = null;
      long nCount = 0;
      int  i      = 0;

      nCount = Cnn1.getErrors().getCount();

      // If there are any errors in the collection, print them.
      if( nCount > 0);
      {
         // Collection ranges from 0 to 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 Function

   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");
   }
}

// EndCancelJ

Cancel, méthode | Connection, objet


Exemple de méthode Clone (VJ++)

Cet exemple utilise la méthode Clone pour créer des copies d'un objet Recordset puis laisse l'utilisateur positionner de façon autonome le pointeur de l'enregistrement de chaque copie.

// BeginCloneJ
import com.ms.wfc.data.*;
import java.io.* ;

public class CloneX
{
   // The main entry point for the application.

   public static void main (String[] args)
   {
      CloneX();
      System.exit(0);
   }

   // CloneX function

   static void CloneX()
   {
      // Assign SQL statement and connection string to variables.
      String strSQL = "SELECT stor_name FROM Stores "
         + "ORDER BY stor_name";

      String strCnn = "Provider='sqloledb';Data Source='MySqlServer';"
         + "Initial Catalog='Pubs';Integrated Security='SSPI';";

      // Define ADO Objects.
      Recordset[] arstStores = null;

      //Declarations.
      BufferedReader in =
         new BufferedReader (new InputStreamReader(System.in));
      String line = null;
      String strMessage;
      String strFind;
      int  intLoop;
      boolean booExit = true;

      try
      {
         // Open recordset as a static cursor type recordset.
         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);

         // Create two clones of the original Recordset.
         arstStores[1] = (Recordset)arstStores[0].clone
            (AdoEnums.LockType.BATCHOPTIMISTIC);
         arstStores[2] = (Recordset)arstStores[0].clone
            (AdoEnums.LockType.BATCHOPTIMISTIC);

         while(booExit)
         {
            // Loop through the array so that on each pass,
            // the user is searching a different copy of the
            // same Recordset.
            for (intLoop = 0; intLoop < 3; intLoop++)
            {
               // Ask for search string while showing where
               // the current record pointer is for each Recordset
               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.)");

               strFind = in.readLine().trim();
               if(strFind.length() == 0)
               {
                  booExit = false;
                  break;
               }

               // Find the search string; if there's no
               // match, jump to the last record.
               arstStores[intLoop].setFilter("stor_name >= '" +
                  strFind + "'");
               if (arstStores[intLoop].getEOF())
               {
                  arstStores[intLoop].setFilter
                     (new Integer(AdoEnums.FilterGroup.NONE));
                  arstStores[intLoop].moveLast();
               }
            }
         }
      }
      catch( AdoException ae )
      {
         // Notify user of any errors that result from ADO.

         // As passing a connection, check for null pointer first.
         if (arstStores[0] != null)
         {
            PrintProviderError(arstStores[0].getActiveConnection());
         }
         else
         {
            System.out.println("Exception: " + ae.getMessage());
         }
      }

      // System read requires this catch.
      catch( java.io.IOException je)
      {
         PrintIOError(je);
      }

      finally
      {
         // Cleanup objects before exit.
         if (arstStores[0] != null)
            if (arstStores[0].getState() == 1)
               arstStores[0].close();
         if (arstStores[1] != null)
            if (arstStores[1].getState() == 1)
               arstStores[1].close();
         if (arstStores[2] != null)
            if (arstStores[2].getState() == 1)
               arstStores[2].close();
      }
   }

   // PrintProviderError Function

   static void PrintProviderError( Connection Cnn1 )
   {
      // Print Provider errors from Connection object.
      // ErrItem is an item object in the Connections Errors collection.
      com.ms.wfc.data.Error  ErrItem = null;
      long nCount = 0;
      int  i      = 0;

      nCount = Cnn1.getErrors().getCount();

      // If there are any errors in the collection, print them.
      if( nCount > 0);
      {
         // Collection ranges from 0 to 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 Function

   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");
   }
}
// EndCloneJ

Clone, méthode | Recordset, objet


Exemple de méthode CompareBookmarks (VJ++)

Cet exemple met en application la méthode CompareBookmarks. La valeur relative des signets est rarement nécessaire sauf quand un signet présente un intérêt particulier.

Désignez une ligne aléatoire d'un objet Recordset dérivé de la table Authors comme cible de la recherche. Affichez ensuite la position de chaque ligne par rapport à la cible.

// BeginCompareBookmarksJ
import com.ms.wfc.data.*;
import java.io.* ;
import com.ms.com.*;

public class CompareBookmarksX //
{
   // The main entry point for the application.

   public static void main (String[] args)
   {
      CompareBookmarksX();
      System.exit(0);
   }

   // CompareBookmarksX function

   static void CompareBookmarksX()
   {
      // Define ADO Objects.
      Recordset rstAuthors = null;

      // Declarations.
      BufferedReader in =
         new BufferedReader (new InputStreamReader(System.in));
      String strCnn = "Provider='sqloledb';Data Source='MySqlServer';" +
        "Initial Catalog='Pubs';Integrated Security='SSPI';";
      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));

         // Exit if an empty recordset.
         if(intCount == 0)
            System.exit(0);

         // Randomize.
         intCount = (int)(intCount * Math.random());
         // Get position between 0 and count-1.
         System.out.println("\nRandomly chosen row position = " +
            Integer.toString(intCount)+ "\n");
         rstAuthors.move(intCount,new Integer(AdoEnums.Bookmark.FIRST));          // Move row to random position.
         varTarget = (Variant)rstAuthors.getBookmark();
         // Remember the mystery row.
         intCount = 0;
         rstAuthors.moveFirst();

         // Loop through 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();
         }

         System.out.println("\nPress <Enter> to continue..");
         in.readLine();
      }
      catch( AdoException ae )
      {
         // Notify user of any errors that result from ADO.

         // As passing a Recordset, check for null pointer first.
         if (rstAuthors != null)
         {
            PrintProviderError(rstAuthors.getActiveConnection());
         }
         else
         {
            System.out.println("Exception: " + ae.getMessage());
         }
      }

      // System read requires this catch.
      catch( java.io.IOException je)
      {
         PrintIOError(je);
      }

      finally
      {
         // Cleanup objects before exit.
         if (rstAuthors != null)
            if (rstAuthors.getState() == 1)
               rstAuthors.close();
      }
   }

   // PrintProviderError Function

   static void PrintProviderError( Connection Cnn1 )
   {
      // Print Provider errors from Connection object.
      // ErrItem is an item object in the Connections Errors collection.
      com.ms.wfc.data.Error  ErrItem = null;
      long nCount = 0;
      int  i      = 0;

      nCount = Cnn1.getErrors().getCount();

      // If there are any errors in the collection, print them.
      if( nCount > 0);
      {
         // Collection ranges from 0 to 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 Function

   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");
   }
}

// EndCompareBookmarksJ

CompareBookmarks, méthode | Recordset, objet


Exemple de propriétés ConnectionString, ConnectionTimeout et State (VJ++)

Cet exemple illustre les différentes façons d'utiliser la propriété ConnectionString pour ouvrir un objet Connection. Il utilise également la propriété ConnectionTimeout pour définir le délai d'attente pour la connexion, et la propriété State pour vérifier l'état des connexions. L'exécution de cette procédure requiert la fonction GetState.

// BeginConnectionStringJ
import com.ms.wfc.data.*;
import java.io.* ;

public class ConnectionStringX
{
   // The main entry point for the application.

   public static void main (String[] args)
   {
      ConnectionStringX();
      System.exit(0);
   }

   // ConnectionStringX function

   static void ConnectionStringX()
   {
      // Define ADO Objects.
      Connection cnConn1 = null;
      Connection cnConn2 = null;
      Connection cnConn3 = null;
      Connection cnConn4 = null;

      //Declarations.

      BufferedReader in =
         new BufferedReader (new InputStreamReader(System.in));
      String line = null;
      String strTemp;

      try
      {
         // Open a connection using OLE DB syntax.
         cnConn1 = new Connection();
         cnConn1.setConnectionString(
            "Provider='sqloledb';Data Source='MySqlServer';" +
            "Initial Catalog='Pubs';Integrated Security='SSPI';");
         cnConn1.setCommandTimeout(30);
         cnConn1.open();
         strTemp = getState(cnConn1.getState());
         System.out.println("CnConn1 state: " + strTemp);

         // Open a connection using a DSN and ODBC tags.
         // It is assumed that you have create DSN 'Pubs' with a user name as
         // 'MyUserId' and password as 'MyPassword'.
         cnConn2 = new Connection();
         cnConn2.setConnectionString("DSN='Pubs';UID='MyUserId';PWD='MyPassword';");
         cnConn2.open();
         strTemp = getState(cnConn2.getState());
         System.out.println("CnConn2 state: " + strTemp);

         // Open a connection using a DSN and OLE DB tags.
         cnConn3 = new Connection();
         cnConn3.setConnectionString
            ("Data Source='Pubs';");
         cnConn3.open();
         strTemp = getState(cnConn3.getState());
         System.out.println("CnConn3 state: " + strTemp);

         // Open a connection using a DSN and individual
         // arguments instead of a connection string.
         // It is assumed that you have create DSN 'Pubs' with a user name as
         // 'MyUserId' and password as 'MyPassword'.
         cnConn4 = new Connection();
         cnConn4.open("Pubs", "MyUserId", "MyPassword");
         strTemp = getState(cnConn4.getState());
         System.out.println("CnConn4 state: " + strTemp);

         System.out.println("\n\nPress <Enter> to continue..");
         in.readLine();

      }
      catch( AdoException ae )
      {
         // Notify user of any errors that result from ADO.

         System.out.println("Exception: " + ae.getMessage());

      }

      // System read requires this catch.
      catch( java.io.IOException je)
      {
         PrintIOError(je);
      }

      finally
      {
         // Cleanup objects before exit.
         if (cnConn1 != null)
            if (cnConn1.getState() == 1)
               cnConn1.close();
         if (cnConn2 != null)
            if (cnConn2.getState() == 1)
               cnConn2.close();
         if (cnConn3 != null)
            if (cnConn3.getState() == 1)
               cnConn3.close();
         if (cnConn4 != null)
            if (cnConn4.getState() == 1)
               cnConn4.close();
      }

   }

   // getState Function

   static String getState(int intState)
   {
      // Returns current state of the connection object.
      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 Function

   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");
   }
}

// EndConnectionStringJ

Voir aussi

Connection, objet | ConnectionString, propriété | ConnectionTimeout, propriété | State, propriété


Exemple de propriété Count (VJ++)

Cet exemple illustre l'utilisation de la propriété Count avec deux collections dans la base de données Employees. La propriété vérifie le nombre d'objets contenus dans chaque collection et définit le nombre maximal de boucles énumérant les collections. L'énumération des collections peut également se faire à l'aide d'instructions For Each...Next, sans avoir recours à la propriété Count.

// BeginCountJ
import com.ms.wfc.data.*;
import java.io.* ;

public class CountX
{
   // The main entry point for the application.

   public static void main (String[] args)
   {
      CountX();
      System.exit(0);
   }

   // CountX function

   static void CountX()
   {

      // Define ADO Objects.
      Recordset rstEmployees = null;

      // Declarations.
      BufferedReader in =
         new BufferedReader (new InputStreamReader(System.in));
      String line = null;
      String strCnn = "Provider='sqloledb';Data Source='MySqlServer';"
         + "Initial Catalog='Pubs';Integrated Security='SSPI';";

      int intLoop;
      int intDisplaySize = 20;
      int recCount=0;

      try
      {
         rstEmployees = new Recordset();

         // Open recordset with data from Employees table.
         rstEmployees.open("employee", strCnn,
            AdoEnums.CursorType.FORWARDONLY,
            AdoEnums.LockType.READONLY,
            AdoEnums.CommandType.TABLE);

         // Print information about Fields collection.
         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();

         // Print information about Properties collection.
         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();

      }
      catch( AdoException ae )
      {
         // Notify user of any errors that result from ADO.

         // Check for null pointer for connection object.
         if (rstEmployees.getActiveConnection()==null)
         {
            System.out.println("Exception: " + ae.getMessage());
         }
         else
         {
            // As passing a Recordset, check for null pointer first.
            if (rstEmployees != null)
            {
               PrintProviderError(rstEmployees.getActiveConnection());
            }
            else
            {
               System.out.println("Exception: " + ae.getMessage());
            }
         }
      }

      // System read requires this catch.
      catch( java.io.IOException je)
      {
         PrintIOError(je);
      }

      finally
      {
         // Cleanup objects before exit.
         if (rstEmployees != null)
            if (rstEmployees.getState() == 1)
               rstEmployees.close();
      }
   }

   // PrintProviderError Function

   static void PrintProviderError( Connection Cnn1 )
   {
      // Print Provider errors from Connection object.
      // ErrItem is an item object in the Connections Errors collection.
      com.ms.wfc.data.Error  ErrItem = null;
      long nCount = 0;
      int  i      = 0;

      nCount = Cnn1.getErrors().getCount();

      // If there are any errors in the collection, print them.
      if( nCount > 0);
      {
         // Collection ranges from 0 to 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 Function

   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");
   }
}

// EndCountJ

Count, propriété


Exemple de propriétés CursorType, LockType et EditMode (VJ++)

Cet exemple montre comment définir les propriétés CursorType et LockType avant l'ouverture d'un objet Recordset. Il donne également la valeur de la propriété EditMode sous diverses conditions. L'exécution de cette procédure requiert la fonction EditModeOutput.

// BeginEditModeJ
import com.ms.wfc.data.*;
import java.io.* ;

public class EditModeX
{
   // The main entry point for the application.

   public static void main (String[] args)
   {
      EditModeX ();
      System.exit(0);
   }

   // EditModeX function

   static void EditModeX ()
   {

      // Define ADO Objects.
      Connection cnConn1 = null;
      Recordset rstEmployees = null;

      // Declarations.
      BufferedReader in =
         new BufferedReader (new InputStreamReader(System.in));
      String line = null;
      String strCnn = "Provider='sqloledb';Data Source='MySqlServer';"
            + "Initial Catalog='Pubs';Integrated Security='SSPI';";

      try
      {
         // Open recordset with data from Employees table.

         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);

         // Show the EditMode property under different editing states.

         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();

         // Delete new record because this is a demonstration.
         cnConn1.execute(
            "DELETE FROM employee WHERE emp_id = 'T-T55555M'");

         // Cleanup objects before exit.
         rstEmployees.close();
         cnConn1.close();

      }
      catch( AdoException ae )
      {
         // Notify user of any errors that result from ADO.

         // Check for null pointer for connection object.
         if (cnConn1==null)
            System.out.println("Exception: " + ae.getMessage());

         // As passing a Recordset, check for null pointer first.
         if (rstEmployees != null)
         {
            PrintProviderError(rstEmployees.getActiveConnection());
         }
         else
         {
            System.out.println("Exception: " + ae.getMessage());
         }
      }

      // System read requires this catch.
      catch( java.io.IOException je)
      {
         PrintIOError(je);
      }

      finally
      {
         // Cleanup objects before exit.
         if (rstEmployees != null)
            if (rstEmployees.getState() == 1)
               rstEmployees.close();
      }
   }

   // EditModeOutput Function

   static void EditModeOutput(String strTemp, int intEditMode)
   {
      String strMessage="";
      // Print report based on the value of the EditMode
      // property.

      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 Function

   static void PrintProviderError( Connection Cnn1 )
   {
      // Print Provider errors from Connection object.
      // ErrItem is an item object in the Connections Errors collection.
      com.ms.wfc.data.Error  ErrItem = null;
      long nCount = 0;
      int  i      = 0;

      nCount = Cnn1.getErrors().getCount();

      // If there are any errors in the collection, print them.
      if( nCount > 0);
      {
         // Collection ranges from 0 to 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 Function

   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");
   }
}
// EndEditModeJ

Voir aussi

CursorType, propriété | EditMode, propriété | LockType, propriété | Recordset, objet


Exemple de méthode Delete (VJ++)

Cet exemple utilise la méthode Delete pour supprimer un enregistrement spécifié dans un objet Recordset.

// BeginDeleteJ
// The WFC class includes the ADO objects.

import com.ms.wfc.data.*;
import java.io.* ;

public class DeleteX
{
   // The main entry point for the application.

   public static void main (String[] args)
   {
      DeleteX();
      System.exit(0);
   }

   // DeleteX function

   static void DeleteX()
   {

      // Define ADO Objects.
      Recordset rstRoySched = null;

      // Declarations.
      BufferedReader in =
         new BufferedReader (new InputStreamReader(System.in));
      String line = null;
      String strCnn = "Provider='sqloledb';Data Source='MySqlServer';"
         + "Initial Catalog='Pubs';Integrated Security='SSPI';";

      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);

         // Open RoySched table.
         rstRoySched.open("SELECT * FROM roysched " +
            "WHERE royalty = 20", strCnn,
            AdoEnums.CursorType.STATIC,
            AdoEnums.LockType.BATCHOPTIMISTIC,
            AdoEnums.CommandType.TEXT);

         // Prompt for a record to delete.
         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();

         // Move to the record and save data so it can be restored.
         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;
         }

         // Delete the record.
         if(bolFound)
         {
            rstRoySched.delete();
            rstRoySched.updateBatch();
         }
         // Show the results.
         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();

         // Restore the data because this is a demonstration.
         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();
         }
      }
      catch( AdoException ae )
      {
         // Notify user of any errors that result from ADO.

         // As passing a Recordset, check for null pointer first.
            if (rstRoySched != null)
            {
               PrintProviderError(rstRoySched.getActiveConnection());
               System.out.println("Exception: " + ae.getMessage());
            }
            else
            {
               System.out.println("Exception: " + ae.getMessage());
            }

      }

      // System read requires this catch.
      catch( java.io.IOException je)
      {
         PrintIOError(je);
      }

      finally
      {
         // Cleanup objects before exit.
         if (rstRoySched != null)
            if (rstRoySched.getState() == 1)
               rstRoySched.close();
      }

   }

   // PrintProviderError Function

   static void PrintProviderError( Connection Cnn1 )
   {
      // Print Provider errors from Connection object.
      // ErrItem is an item object in the Connections Errors collection.
      com.ms.wfc.data.Error  ErrItem = null;
      long nCount = 0;
      int  i      = 0;

      nCount = Cnn1.getErrors().getCount();

      // If there are any errors in the collection, print them.
      if( nCount > 0);
      {
         // Collection ranges from 0 to 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 Function

   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");
   }
}

// EndDeleteJ

Delete, méthode (objet ADO Recordset) | Recordset, objet


Exemple de propriétés Description, HelpContext, HelpFile, NativeError, Number, Source et SQLState (VJ++)

Cet exemple déclenche une erreur, l'intercepte et affiche les propriétés Description, HelpContext, HelpFile, NativeError, Number, Source et SQLState de l'objet Error résultant.

// BeginDescriptionJ
// The WFC class includes the ADO objects.

import com.ms.wfc.data.*;
import java.io.* ;

public class DescriptionX
{
   // The main entry point for the application.

   public static void main (String[] args)
   {
      DescriptionX();
      System.exit(0);
   }

   // DescriptionX function

   static void DescriptionX()
   {
      // Declarations.
      BufferedReader in = new
         BufferedReader(new InputStreamReader(System.in));

      // Define ADO Objects.
      Connection cnConn1 = null;

      try
      {
         // Intentionally trigger an error.
         cnConn1 = new Connection();
         cnConn1.open("nothing");
      }
      catch( AdoException ae )
      {
         // Notify user of any errors that result from ADO.
         PrintProviderError(cnConn1);
      }

      try
      {
         System.out.println("\nPress <Enter> key to continue.");
         in.readLine();
      }
      // System read requires this catch.
      catch( java.io.IOException je)
      {
         PrintIOError(je);
      }

   }

   // PrintProviderError Function

   static void PrintProviderError( Connection Cnn1 )
   {
      // Print Provider errors from Connection object.
      // ErrItem is an item object in the Connections Errors collection.
      com.ms.wfc.data.Error  ErrItem = null;
      long nCount = 0;
      int  i      = 0;

      nCount = Cnn1.getErrors().getCount();

      // If there are any errors in the collection, print them.
      if( nCount > 0);
      {
         // Collection ranges from 0 to 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 Function

   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");
   }
}
// EndDescriptionJ

Voir aussi

Description, propriété | Error, objet | HelpContext, propriété | HelpFile, propriété | NativeError, propriété | Number, propriété | Source, propriété (Error ADO) | SQLState, propriété


Exemple de méthodes Execute, Requery et Clear (VJ++)

Cet exemple illustre l'utilisation de la méthode Execute lorsqu'elle est exécutée à partir d'un objet Command et d'un objet Connection. Il utilise également la méthode Requery pour extraire les données actuelles d'un objet Recordset, ainsi que la méthode Clear pour effacer le contenu de la collection Errors. Les procédures ExecuteCommand et PrintOutput sont nécessaires à l'exécution de cette procédure.

// BeginExecuteJ
// The WFC class includes the ADO objects.
import com.ms.wfc.data.*;
import java.io.*;

public class ExecuteX
{
   // Main Function

   public static void main (String[] args)
   {
      ExecuteX();
   }

   // ExecuteX Function

   static void ExecuteX()
   {
      // Define string variables.
      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='MySqlServer';"
            + "Initial Catalog='Pubs';Integrated Security='SSPI';";

      // Define ADO objects.
      Connection  cnConn1    = null;
      Command  cmdChange  = null;
      Recordset  rsTitles  = null;

      try
      {
         // Open connection.
         cnConn1 = new Connection ();
         cnConn1.open(strCnn, "", "", AdoEnums.CommandType.UNSPECIFIED);

         // Create command object.
         cmdChange = new Command();
         cmdChange.setActiveConnection (cnConn1);
         cmdChange.setCommandText (strSQLChange);

         // Open recordset with Titles table.
         rsTitles = new Recordset();
         rsTitles.open("Titles", cnConn1,
                    AdoEnums.CursorType.STATIC,
                    AdoEnums.LockType.OPTIMISTIC,
                    AdoEnums.CommandType.TABLE);

         // Print report of original data.
         System.out.println("\n\n\tData in Titles table "
                        + "before executing the query: \n");
         PrintOutput(rsTitles);

         // Clear extraneous errors from the Errors collection.
         cnConn1.getErrors().clear();

         // Call the ExecuteCommand subroutine to
         // execute cmdChange command.
         ExecuteCommand(cmdChange, rsTitles);

         // Print report of new data.
         System.out.println("\n\n\tData in Titles table after "
            + "executing the query: \n");
         PrintOutput(rsTitles);

         // Use the Connection object's execute method to
         // execute SQL statement to restore data.
         cnConn1.execute(strSQLRestore);

         // Print report of restored data.
         System.out.println("\n\n\tData after executing the query "
            + "to restore the original information: \n");
         PrintOutput(rsTitles);
      }  // End Try statement.
      catch( AdoException ae )
      {
         // Notify user of any errors that result from ADO.

         // As passing a Recordset, check for null pointer first.
         if (rsTitles != null)
         {
            PrintProviderError(rsTitles.getActiveConnection());
         }
         else
         {
            System.out.println("Exception: " + ae.getMessage());
         }
      }

      finally
      {
         // Cleanup objects before exit.
         if (rsTitles != null)
            if (rsTitles.getState() == 1)
               rsTitles.close();
         if (cnConn1 != null)
            if (cnConn1.getState() == 1)
               cnConn1.close();
      }
   }

   // ExecuteCommand Function

   static void ExecuteCommand(Command cmdTemp, Recordset rstTemp)
   {
      try
      {
         // CommandText property already set before function was called.
         cmdTemp.setCommandType(AdoEnums.CommandType.TEXT);
         cmdTemp.execute();

         // Retrieve the current data by requerying the recordset.
         rstTemp.requery(AdoEnums.CommandType.UNKNOWN);
      }
      catch( AdoException ae )
      {
         // Notify user of any errors that result from ADO.
         PrintProviderError(rstTemp.getActiveConnection());
      }
   }

   //  PrintOutput Function

   static void PrintOutput(Recordset rstTemp)
   {
      // Declarations.
      BufferedReader in = new
         BufferedReader(new InputStreamReader(System.in));

      // Ensure at top of recordset.
      rstTemp.moveFirst();

      // If EOF is true, then no data and skip print loop.
      if( rstTemp.getEOF() )
      {
         System.out.println("\tRecordset empty\n");
      }
      else
      {
         // Enumerate Recordset and print data from each.
         while( !(rstTemp.getEOF()) )
         {
            // Convert variant string to convertable string type.
            System.out.println("\t"
               + rstTemp.getFields().getItem("Title").getValue() + " "
               + rstTemp.getFields().getItem("Type").getValue() + "\n");
            rstTemp.moveNext();
         }
      }
      try
      {
         System.out.println("\nPress <Enter> key to continue.");
         in.readLine();
      }
      // System read requires this catch.
      catch( java.io.IOException je)
      {
         PrintIOError(je);
      }
   }

   // PrintProviderError Function

   static void PrintProviderError( Connection Cnn1 )
   {
      // Print Provider errors from Connection object.
      // ErrItem is an item object in the Connections Errors collection.
      com.ms.wfc.data.Error  ErrItem = null;
      long nCount = 0;
      int  i      = 0;

      nCount = Cnn1.getErrors().getCount();

      // If there are any errors in the collection, print them.
      if( nCount > 0);
      {
         // Collection ranges from 0 to 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 Function

   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");
   }
}
// EndExecuteJ

Voir aussi

Clear, méthode | Command, objet | Connection, objet | Errors, collection | Execute, méthode (objet ADO Command) | Execute, méthode (objet ADO Connection) | Requery, méthode


Exemple de propriétés Filter et RecordCount (VJ++)

Cet exemple utilise la propriété Filter pour ouvrir un nouvel objet Recordset basé sur une condition spécifique appliquée à un objet Recordset existant. Il utilise la propriété RecordCount pour indiquer le nombre d'enregistrements contenus dans les deux objets Recordset. L'exécution de cette procédure requiert la fonction FilterField.

// BeginFilterJ
// The WFC class includes the ADO objects.

import com.ms.wfc.data.*;
import java.io.* ;

public class FilterX
{
   // The main entry point for the application.

   public static void main (String[] args)
   {
      FilterX();
      FilterX2();
      System.exit(0);
   }

   // FilterX function
   static void FilterX()
   {

      // Define ADO Objects.
      Recordset rstPublishers = null;
      Recordset rstPublishersCountry = null;

      // Declarations.
      BufferedReader in =
         new BufferedReader (new InputStreamReader(System.in));
      String line = null;
      String strCnn = "Provider='sqloledb';Data Source='MySqlServer';"
            + "Initial Catalog='Pubs';Integrated Security='SSPI';";

      int intPublisherCount;
      String strCountry;
      String strMessage;

      try
      {
         rstPublishers = new Recordset();

         // Open recordset with data from Publishers table.
         rstPublishers.setCursorType(AdoEnums.CursorType.STATIC);
         rstPublishers.open("publishers", strCnn,
                    AdoEnums.CursorType.STATIC,
                    AdoEnums.LockType.READONLY,
                    AdoEnums.CommandType.TABLE);

         // Populate the Recordset.
         intPublisherCount = rstPublishers.getRecordCount();

         // Get user input.
         System.out.println("Enter a country to filter on:");
         strCountry = in.readLine().trim();

         if(!strCountry.equals(""))
         {
            // Open a filtered Recordset object.
            rstPublishersCountry =
               FilterField(rstPublishers, "Country", strCountry);
            if(rstPublishersCountry.getRecordCount()==0)
               System.out.println("\nNo publishers from that country.");
            else
            {
               // Print number of records for the original
               // Recordset object and the filtered Recordset
               // object.
               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();

      }
      catch( AdoException ae )
      {
         // Notify user of any errors that result from ADO.

         // As passing a Recordset, check for null pointer first.
         if (rstPublishers != null)
         {
            PrintProviderError(rstPublishers.getActiveConnection());
         }
         else
         {
            System.out.println("Exception: " + ae.getMessage());
         }

      }

      // System read requires this catch.
      catch( java.io.IOException je)
      {
         PrintIOError(je);
      }

      finally
      {
         // Cleanup objects before exit.
         if (rstPublishers != null)
            if (rstPublishers.getState() == 1)
               rstPublishers.close();
      }

   }

   // FilterField Function

   static Recordset FilterField(Recordset rstTemp,String strField,
                         String strFilter)
   {
      // Set a filter on the specified Recordset object and then
      // open a new Recordset object.
      rstTemp.setFilter(strField + " = '" + strFilter + "'");
      return rstTemp;
   }

   // PrintProviderError Function

   static void PrintProviderError( Connection Cnn1 )
   {
      // Print Provider errors from Connection object.
      // ErrItem is an item object in the Connections Errors collection.
      com.ms.wfc.data.Error  ErrItem = null;
      long nCount = 0;
      int  i      = 0;

      nCount = Cnn1.getErrors().getCount();

      // If there are any errors in the collection, print them.
      if( nCount > 0);
      {
         // Collection ranges from 0 to 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 Function

   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 function

   static void FilterX2()
   {

      // Define ADO Objects.
      Recordset rstPublishers = null;

      // Declarations.
      BufferedReader in =
         new BufferedReader (new InputStreamReader(System.in));
      String line = null;
      String strCnn = "Provider='sqloledb';Data Source='MySqlServer';"
            + "Initial Catalog='Pubs';Integrated Security='SSPI';";

      try
      {
         rstPublishers = new Recordset();

         // Open recordset with data from Publishers table.
         rstPublishers.setCursorType(AdoEnums.CursorType.STATIC);
         rstPublishers.open("SELECT * FROM publishers " +
                        "WHERE Country = 'USA'", strCnn,
                        AdoEnums.CursorType.STATIC,
                        AdoEnums.LockType.READONLY,
                        AdoEnums.CommandType.TEXT);

         // Print current data in recordset.
         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 objects before exit.
         rstPublishers.close();

      }
      catch( AdoException ae )
      {
         // Notify user of any errors that result from ADO.

         // Check for null pointer for connection object.
         if (rstPublishers.getActiveConnection()==null)
         {
               System.out.println("Exception: " + ae.getMessage());
         }
         else
         {
            // As passing a Recordset, check for null pointer first.
            if (rstPublishers != null)
            {
               PrintProviderError(rstPublishers.getActiveConnection());
            }
            else
            {
               System.out.println("Exception: " + ae.getMessage());
            }
         }
      }

      // System read requires this catch.
      catch( java.io.IOException je)
      {
         PrintIOError(je);
      }

   }
}
// EndFilterJ

Voir aussi

Filter, propriété | RecordCount, propriété | Recordset, objet


Exemple de méthode Find (VJ++)

Cet exemple utilise la méthode Find de l'objet Recordset pour localiser et compter le nombre de titres commerciaux dans la base de données Pubs. Cet exemple présuppose que le fournisseur sous-jacent ne prend pas en charge une fonctionnalité similaire.

// BeginFindJ
// The WFC class includes the ADO objects.
import com.ms.wfc.data.*;
import java.io.* ;
import com.ms.com.*;

public class FindX
{
   // The main entry point for the application.

   public static void main (String[] args)
   {
      FindX();
      System.exit(0);
   }

   // FindX function

   static void FindX()
   {

      // Define ADO Objects.
      Connection cnConn1 = null;
      Recordset rstTitles = null;

      // Declarations.
      BufferedReader in =
         new BufferedReader (new InputStreamReader(System.in));
      String strCnn = "Provider='sqloledb';Data Source='MySqlServer';" +
            "Initial Catalog='Pubs';Integrated Security='SSPI';";
      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);

         //  The default parameters are sufficient to search forward
         //  through a Recordset.
         rstTitles.find("title_id LIKE 'BU%'");

         // Skip current record to avoid finding the same row repeatedly.
         // The bookmark is redundant because Find searches from current
         // position.
         while(!rstTitles.getEOF()) // Continue if last find succeeded.
         {
            System.out.println("Title ID: "
                           + rstTitles.getField("title_id").getString());
            intCount++; // Count the last title found.
            varMark = (Variant)rstTitles.getBookmark();
            // Note current position.
            rstTitles.find("title_id LIKE 'BU%'",
                   1,
                   AdoEnums.SearchDirection.FORWARD,
                   varMark);
         }

         System.out.println("\nThe number of business titles is " +
                        Integer.toString(intCount));
         System.out.println("\nPress <Enter> to continue..");
         in.readLine();
      }
      catch( AdoException ae )
      {
         // Notify user of any errors that result from ADO.

         // As passing a Recordset, check for null pointer first.
         if (rstTitles != null)
         {
            PrintProviderError(rstTitles.getActiveConnection());
         }
         else
         {
            System.out.println("Exception: " + ae.getMessage());
         }
      }

      // System read requires this catch.
      catch( java.io.IOException je)
      {
         PrintIOError(je);
      }

      finally
      {
         // Cleanup objects before exit.
         if (rstTitles != null)
            if (rstTitles.getState() == 1)
               rstTitles.close();
         if (cnConn1 != null)
            if (cnConn1.getState() == 1)
               cnConn1.close();
      }

   }

   // PrintProviderError Function

   static void PrintProviderError( Connection Cnn1 )
   {
      // Print Provider errors from Connection object.
      // ErrItem is an item object in the Connections Errors collection.
      com.ms.wfc.data.Error  ErrItem = null;
      long nCount = 0;
      int  i      = 0;

      nCount = Cnn1.getErrors().getCount();

      // If there are any errors in the collection, print them.
      if( nCount > 0);
      {
         // Collection ranges from 0 to 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 Function

   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");
   }
}
// EndFindJ

Find, méthode | Recordset, objet


Exemple de méthode GetRows (VJ++)

Cet exemple utilise la méthode GetRows pour extraire un nombre défini de lignes d'un objet Recordset et remplir un tableau avec les données obtenues. La méthode GetRows renvoie un nombre de lignes inférieur à celui désiré dans deux cas : EOF a été atteint ou GetRows a essayé d'extraire un enregistrement supprimé par un autre utilisateur. La fonction renvoie la valeur False seulement dans le second cas. L'exécution de cette procédure requiert la fonction GetRowsOK.

// BeginGetRowsJ
// The WFC class includes the ADO objects.

import com.ms.wfc.data.*;
import java.io.* ;
import com.ms.com.*;

public class GetRowsX
{
    // The main entry point for the application.

   static Variant avarRecords = null;

   public static void main (String[] args)
   {
      GetRowsX();
      System.exit(0);
   }

   // GetRowsX  function

   static void GetRowsX()
   {

      // Define ADO Objects.
      Recordset rstEmployees = null;

      // Declarations.
      BufferedReader in =
         new BufferedReader (new InputStreamReader(System.in));
      String line = null;
      String strCnn = "Provider='sqloledb';Data Source='MySqlServer';"
            + "Initial Catalog='Pubs';Integrated Security='SSPI';";

      int intRows;
      int intRecord;
      int intUBound;
      int intDisplaysize = 15;

      try
      {
         // Open recordset with names and hire dates from Employees table.
         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)
         {
            // Get user input for number of rows.
            System.out.println(
            "\nEnter number of rows to retrieve. (<= 0 to Exit)");
            line = in.readLine().trim();

            // Convert string entry to int.
            intRows = Integer.parseInt(line);

            // Exit the application if intRows is negative or zero.
            if(intRows <= 0)
               break;

            // If GetRowsOK is successful, print the results,
            // noting if the end of the file was reached.
            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");

               // Print the retrieved data.

               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
            {
               // Assuming the GetRows error was due to data
               // changes by another user, use Requery to
               // refresh the Recordset and start over.
               System.out.println("\nGetRows failed--retry? (Y/N)");
               if(in.readLine().trim().toUpperCase().equals("Y"))
                  rstEmployees.requery();
               else
               {
                  System.out.println("GetRows failed!");
                  break;
               }
            }

            // Because using GetRows leaves the current
            // record pointer at the last record accessed,
            // move the pointer back to the beginning of the
            // Recordset before looping back for another search.
            rstEmployees.moveFirst();
         }

         // Cleanup objects before exit.
         rstEmployees.close();

      }
      catch( AdoException ae )
      {
         // Notify user of any errors that result from ADO.

         // As passing a Recordset, check for null pointer first.
         if (rstEmployees != null)
         {
            PrintProviderError(rstEmployees.getActiveConnection());
         }
         else
         {
            System.out.println("Exception: " + ae.getMessage());
         }
      }

      // System read requires this catch.
      catch( java.io.IOException je)
      {
         PrintIOError(je);
      }

      // Display Error that the application has attempted to convert
      // a string of inappropriate format to one of the numeric types.
      catch(java.lang.NumberFormatException ne)
      {
         System.out.println(
            "Exception: Must specify an Integer value." );
      }

      finally
      {
         // Cleanup objects before exit.
         if (rstEmployees != null)
            if (rstEmployees.getState() == 1)
               rstEmployees.close();
      }

   }

   // GetRowsOK Function

   static boolean GetRowsOK(Recordset rstTemp,int intNumber)
      {
      // Store results of GetRows method in array.
      avarRecords = rstTemp.getRows(intNumber);

      // Return False only if fewer than the desired
      // number of rows were returned, but not because the
      // end of the Recordset was reached.
      if ( intNumber > (avarRecords.toSafeArray().getUBound(2)+ 1)
               && !(rstTemp.getEOF()))
         return false;
      else
         return true;

   }

   // PrintProviderError Function

   static void PrintProviderError( Connection Cnn1 )
   {
      // Print Provider errors from Connection object.
      // ErrItem is an item object in the Connections Errors collection.
      com.ms.wfc.data.Error  ErrItem = null;
      long nCount = 0;
      int  i      = 0;

      nCount = Cnn1.getErrors().getCount();

      // If there are any errors in the collection, print them.
      if( nCount > 0);
      {
         // Collection ranges from 0 to 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 Function

   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");
   }
}
// EndGetRowsJ

BOF, EOF, propriétés | GetRows, méthode | Recordset, objet


Exemple de méthode GetString (VJ++)

Cet exemple met en application la méthode GetString.

Il suppose que vous déboguez un problème d'accès aux données et que vous voulez trouver un moyen simple et rapide d'imprimer le contenu d'un petit objet Recordset.

// BeginGetStringJ
// The WFC class includes the ADO objects.
import com.ms.wfc.data.*;
import java.io.* ;

public class GetStringX
{
    // The main entry point for the application.

   public static void main (String[] args)
   {
      GetStringX ();
      System.exit(0);
   }

   // GetStringX  function
   static void GetStringX()
   {
      // Define ADO Objects.
      Connection cnConn1 = null;
      Recordset rstAuthors = null;

      // Declarations.
      BufferedReader in =
         new BufferedReader (new InputStreamReader(System.in));
      String strCnn = "Provider='sqloledb';Data Source='MySqlServer';" +
            "Initial Catalog='Pubs';Integrated Security='SSPI';";
      String strOutput;

      try
      {
         // Get the user input for state.
         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 + "'";

         // Open recordset with data from Authors table.
         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)
         {
            // Use all defaults: get all rows, TAB column delimiter,
            // CARRIAGE RETURN
            // row delimiter, empty-string null delimiter.
            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");

         System.out.println("\nPress <Enter> to continue..");
         in.readLine();
      }
      catch( AdoException ae )
      {
         // Notify user of any errors that result from ADO.

         // As passing a Recordset, check for null pointer first.
         if (rstAuthors != null)
         {
            PrintProviderError(rstAuthors.getActiveConnection());
         }
         else
         {
            System.out.println("Exception: " + ae.getMessage());
         }
      }

      // System read requires this catch.
      catch( java.io.IOException je)
      {
         PrintIOError(je);
      }

      finally
      {
         // Cleanup objects before exit.
         if (rstAuthors != null)
            if (rstAuthors.getState() == 1)
               rstAuthors.close();
         if (cnConn1 != null)
            if (cnConn1.getState() == 1)
               cnConn1.close();
      }

   }

   // PrintProviderError Function

   static void PrintProviderError( Connection Cnn1 )
   {
      // Print Provider errors from Connection object.
      // ErrItem is an item object in the Connections Errors collection.
      com.ms.wfc.data.Error  ErrItem = null;
      long nCount = 0;
      int  i      = 0;

      nCount = Cnn1.getErrors().getCount();

      // If there are any errors in the collection, print them.
      if( nCount > 0);
      {
         // Collection ranges from 0 to 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 Function

   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");
   }
}
// EndGetStringJ

GetString, méthode | Recordset, objet


Exemple de propriétés IsolationLevel et Mode (VJ++)

Cet exemple utilise la propriété Mode pour ouvrir une connexion exclusive, et la propriété IsolationLevel pour ouvrir une transaction effectuée indépendamment des autres transactions.

// BeginIsolationLevelJ
import com.ms.wfc.data.*;
import java.io.*;

public class IsolationLevelX
{
   // The main entry point for the application.
   public static void main (String[] args)
   {
      IsolationLevelX();
      System.exit(0);
   }

   // IsolationLevelX Function

   static void IsolationLevelX()
   {
      // Define ADO Objects
      Connection cnn1 = null;
      Recordset rstTitles = null;

      // Assign connection string to variable
      String strCnn = "Provider='sqloledb';Data Source='MySqlServer';"+
                  "Initial Catalog='Pubs';Integrated Security='SSPI';";

      // Declarations
      BufferedReader in =
         new BufferedReader ( new InputStreamReader(System.in));
      String line = null;

      try
      {
         // Open connection and Titles table
         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();

         // Display the connection mode
         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();

         // Display the Isolation level
         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();

         // Change the type of psychology titles
         while(!rstTitles.getEOF())
         {

            if(rstTitles.getField("Type").getString().trim().
               equals(new String("psychology")))
            {
               rstTitles.getField("Type").setString("self_help");
               rstTitles.update();
            }
            rstTitles.moveNext();

         }

         // Print current data in recordset
         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();

         // Restore original data
         cnn1.rollbackTrans();
      }
      catch(AdoException ae)
      {
         // Notify the user of any errors that result from ADO

         // As passing a connection, check for null pointer first
         if(cnn1 !=null)
         {
            PrintProviderError(cnn1);
         }
         else
         {
            System.out.println("Exception:" + ae.getLocalizedMessage());
         }
      }

      // System Read requires this catch
      catch(java.io.IOException je)
      {
         PrintIOError(je);

      }

      finally
      {
         // Cleanup objects before exit.
         if (rstTitles != null)
            if (rstTitles.getState() == 1)
               rstTitles.close();
         if (cnn1 != null)
            if (cnn1.getState() == 1)
               cnn1.close();
      }
   }

   // PrintProviderError Function

   static void PrintProviderError( Connection Cnn1 )
   {
      // Print Provider errors from Connection object.
      // ErrItem is an item object in the Connections Errors collection.
      com.ms.wfc.data.Error  ErrItem = null;
      long nCount = 0;
      int  i      = 0;

      nCount = Cnn1.getErrors().getCount();

      // If there are any errors in the collection, print them.
      if( nCount > 0);
      {
         // Collection ranges from 0 to 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 Function

   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");
   }
}
// EndIsolationLevelJ

IsolationLevel, propriété | Mode, propriété


Exemple de propriété Item (VJ++)

Cet exemple montre comment la propriété Item est utilisée pour accéder aux membres d'une collection. L'exemple ouvre la table Authors de la base de données Pubs à l'aide d'une commande paramétrée.

Dans la commande émise sur la base de données, le paramètre est accessible à partir de la collection Parameters de l'objet Command grâce à l'index et au nom. Les champs du Recordset renvoyé sont ensuite accessibles via la collection Fields de l'objet par l'index et le nom.

// BeginItemJ
import com.ms.wfc.data.*;
import java.io.* ;
import com.ms.com.*;

public class ItemX
{
   // The main entry point for the application.

   public static void main (String[] args)
   {
      ItemX();
      System.exit(0);
   }

   // ItemX  function

   static void ItemX()
   {

      // Define ADO Objects.
      Connection cnConn1 = null;
      Recordset rstAuthors = null;
      Command cmd = null;
      Parameter prm = null;
      Field fld = null;

      // Declarations.
      BufferedReader in =
         new BufferedReader (new InputStreamReader(System.in));
      String strCnn = "Provider='sqloledb';Data Source='MySqlServer';" +
            "Initial Catalog='Pubs';Integrated Security='SSPI';";
      Variant [] varColumn = null;
      int intIndex;
      int intLimit;

      try
      {
         cnConn1 = new Connection();
         rstAuthors = new Recordset();
         cmd = new Command();

         //  Set the array with the Authors table field (column) names.
         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 and CommandType are omitted
         // because a Command Object is provided.
         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();
      }
      catch( AdoException ae )
      {
         // Notify user of any errors that result from ADO.

         // As passing a Recordset, check for null pointer first.
         if (rstAuthors != null)
         {
            PrintProviderError(rstAuthors.getActiveConnection());
         }
         else
         {
            System.out.println("Exception: " + ae.getMessage());
         }
      }

      // System read requires this catch.
      catch( java.io.IOException je)
      {
         PrintIOError(je);
      }

      finally
      {
         // Cleanup objects before exit.
         if (rstAuthors != null)
            if (rstAuthors.getState() == 1)
               rstAuthors.close();
         if (cnConn1 != null)
            if (cnConn1.getState() == 1)
               cnConn1.close();
      }
   }

   // PrintProviderError Function

   static void PrintProviderError( Connection Cnn1 )
   {
      // Print Provider errors from Connection object.
      // ErrItem is an item object in the Connections Errors collection.
      com.ms.wfc.data.Error  ErrItem = null;
      long nCount = 0;
      int  i      = 0;

      nCount = Cnn1.getErrors().getCount();

      // If there are any errors in the collection, print them.
      if( nCount > 0);
      {
         // Collection ranges from 0 to 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 Function

   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");
   }
}
// EndItemJ

Voir aussi

Command, objet | Fields, collection | Item, propriété | Parameters, collection | Recordset, objet


Exemple de propriété MarshalOptions (VJ++)

Cet exemple utilise la propriété MarshalOptions pour spécifier les lignes renvoyées au serveur, à savoir la totalité des lignes ou uniquement celles qui ont été modifiées.

// BeginMarshalOptionsJ
import java.io.*;
import com.ms.wfc.data.*;

public class MarshalOptionsX
{
   // The main entry point for the application.
   public static void main (String[] args)
   {
      MarshalOptionsX();
      System.exit(0);
   }
   // MarshalX Function

   static void MarshalOptionsX()
   {
      // Define ADO Objects
      Recordset rstEmployees = null;

      // Declarations
      BufferedReader in =
         new BufferedReader(new InputStreamReader(System.in));
      String line = null;

      try
      {

         // Open Recordset with names from Employees Table.
         String strCnn = " Provider='sqloledb';Data Source='MySqlServer';" +
                "Initial Catalog='Pubs';Integrated Security='SSPI';";

         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);

         // Store original data
         String strOldFirst = rstEmployees.getField("fname").getString();
         String strOldLast = rstEmployees.getField("lname").getString();

         // Change data in edit buffer
         rstEmployees.getField("fname").setString("Linda");
         rstEmployees.getField("lname").setString("Kobara");

         // Show contents of buffer and get user input
         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();
               }
            }

         }

         // Show the resulting data
         System.out.println("\nData in recordset = " +
            rstEmployees.getField("fname").getString() +
            " " + rstEmployees.getField("lname").getString());

         // Restore original data because this is a demonstration
         if (!((strOldFirst.equals(rstEmployees.getField("fname")))
            &&(strOldLast.equals(rstEmployees.getField("lname")))))
         {
            rstEmployees.getField("fname").setString(strOldFirst);
            rstEmployees.getField("lname").setString(strOldLast);
            rstEmployees.update();
         }

         System.out.println("\n\nPress <Enter> to continue..");
         in.readLine();
      }

      catch(AdoException ae)
      {
         // Notify the user of any errors that result from ADO

         // As passing a connection, check for null pointer first
         if(rstEmployees!= null)
         {
            PrintProviderError(rstEmployees.getActiveConnection());
         }
         else
         {
            System.out.println("Exception: " + ae.getLocalizedMessage());
         }
      }

      // System Read requires this catch
      catch(java.io.IOException je)
      {
         PrintIOError(je);
      }

      finally
      {
         // Cleanup objects before exit.
         if (rstEmployees != null)
            if (rstEmployees.getState() == 1)
               rstEmployees.close();
      }
   }

   // PrintProviderError Function

   static void PrintProviderError( Connection Cnn1 )
   {
      // Print Provider errors from Connection object.
      // ErrItem is an item object in the Connections Errors collection.
      com.ms.wfc.data.Error  ErrItem = null;
      long nCount = 0;
      int  i      = 0;

      nCount = Cnn1.getErrors().getCount();

      // If there are any errors in the collection, print them.
      if( nCount > 0);
      {
         // Collection ranges from 0 to 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 Function

   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");
   }
}
// EndMarshalOptionsJ

MarshalOptions, propriété


Exemple de propriété MaxRecords (VJ++)

Cet exemple utilise la propriété MaxRecords pour ouvrir un objet Recordset contenant les 10 livres les plus chers figurant dans la table Titles.

// BeingMaxRecordsJ
import java.io.*;
import com.ms.wfc.data.*;

public class MaxRecordsX
{
   // The main entry point for the application.

   public static void main (String[] args)
   {
      MaxRecordsX();
      System.exit(0);
   }
   // MaxRecordsX Function

   static void MaxRecordsX()
   {
      //  Define ADO Objects
      Recordset rstTemp = null;

      try
      {
         // Declarations
         BufferedReader in =
            new BufferedReader(new InputStreamReader(System.in));

         // Open recordset containing the 10 most expensive
         // titles in the Titles table.
         String strCnn = " Provider='sqloledb';Data Source='MySqlServer';"+
            " Initial Catalog='Pubs';Integrated Security='SSPI';";
         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);

         // Display the contents of the recordset.
         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();
         }

         System.out.println("\n\nPress <Enter> to continue..");
         in.readLine();
      }

      catch(AdoException ae)
      {
         // Notify the user of any errors that result from ADO.

         // As passing a connection, check for null pointer first.
         if (rstTemp!=null)
         {
            PrintProviderError(rstTemp.getActiveConnection());
         }
         else
         {
            System.out.println("Exception: " + ae.getLocalizedMessage());
         }
      }

      // System read requires this catch.
      catch(java.io.IOException je)
      {
         PrintIOError(je);
      }

      finally
      {
         // Cleanup objects before exit.
         if (rstTemp != null)
            if (rstTemp.getState() == 1)
               rstTemp.close();
      }
}
   // PrintProviderError Function

   static void PrintProviderError( Connection Cnn1 )
   {
      // Print Provider errors from Connection object.
      // ErrItem is an item object in the Connections Errors collection.
      com.ms.wfc.data.Error  ErrItem = null;
      long nCount = 0;
      int  i      = 0;

      nCount = Cnn1.getErrors().getCount();

      // If there are any errors in the collection, print them.
      if( nCount > 0);
      {
         // Collection ranges from 0 to 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 Function

   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");
   }
}
// EndMaxRecordsJ

MaxRecords, propriété | Recordset, objet


Exemple de méthode Move (VJ++)

Cet exemple utilise la méthode Move pour positionner le pointeur de l'enregistrement, en fonction des entrées émises par l'utilisateur.

// BeginMoveJ
import java.io.*;
import com.ms.wfc.data.*;
import com.ms.com.*;

public class MoveX
{
   // The main entry point for the application.

   public static void main (String[] args)
   {
      MoveX();
      System.exit(0);
   }
   // MoveX Function

   static void MoveX()
   {
      // Define ADO Objects
      Recordset rstAuthors = null;

      // Declarations
      String line = null;
      Variant varBookmark;
      String strCommand = null;
      int lngMove;
      BufferedReader in =
         new BufferedReader(new InputStreamReader(System.in));

      try
      {
         //  Open recordset from Authors table.
         String strCnn = "Provider='sqloledb';Data Source='MySqlServer';"+
            "Initial Catalog='Pubs';Integrated Security='SSPI';";

         rstAuthors = new Recordset();
         rstAuthors.setCursorType(AdoEnums.CursorType.STATIC);

         // Use client cursor to allow use of
         // Absolute Position property.
         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)
         {
            // Display information about current record and
            // ask how many records to move.
            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();

            // No entry exits program loop.
            if (line.length()== 0)
               break;

            // Converts string entry to int.
            lngMove = Integer.parseInt(line);

            // Store bookmark in case the move goes too far
            // forward or backward.
            varBookmark =(Variant)rstAuthors.getBookmark();

            // Move method requires parameter of data type int.
            rstAuthors.move(lngMove);

            // Trap for BOF and EOF.
            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);
            }
         }
         System.out.println("\tPress <Enter> to continue..");
         in.readLine();
      }

      catch(AdoException ae)
      {
         // Notify user of any errors that result from ADO.

         // As passing a recordset, check for null pointer.
         if (rstAuthors!=null)
         {
            PrintProviderError(rstAuthors.getActiveConnection());
         }
         else
         {
            System.out.println(" Exception: "+ ae.getMessage());
         }
      }
      // System Read requires this catch.
      catch(java.io.IOException je)
      {
         PrintIOError(je);
      }
      // Required if the user enter non integer value.
      catch(java.lang.NumberFormatException ne)
      {
         System.out.println("\n\nPlease enter integer values!");
         rstAuthors.close();
      }

      finally
      {
         // Cleanup objects before exit.
         if (rstAuthors != null)
            if (rstAuthors.getState() == 1)
               rstAuthors.close();
      }
   }
   // PrintProviderError Function

   static void PrintProviderError( Connection Cnn1 )
   {
      // Print Provider errors from Connection object.
      // ErrItem is an item object in the Connections Errors collection.
      com.ms.wfc.data.Error  ErrItem = null;
      long nCount = 0;
      int  i      = 0;

      nCount = Cnn1.getErrors().getCount();

      // If there are any errors in the collection, print them.
      if( nCount > 0);
      {
         // Collection ranges from 0 to 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 Function

   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");
   }
}
// EndMoveJ

Move, méthode


Exemple de méthodes MoveFirst, MoveLast, MoveNext et MovePrevious (VJ++)

Cet exemple utilise les méthodes MoveFirst, MoveLast, MoveNext et MovePrevious pour déplacer le pointeur de l'enregistrement d'un objet Recordset sur la base de la commande transmise. La procédure MoveAny est nécessaire à l'exécution de cette procédure.

// BeginMoveFirstJ
import com.ms.wfc.data.*;
import java.io.*;

public class MoveFirstX  // DLL name.
{
   // Main Function

   public static void main( String rgArg[] )
   {
      MoveFirstX();
   }

   // MoveFirstX Function

   static void MoveFirstX()
   {
      // Declarations
      Recordset rsAuthors = null;
      BufferedReader in =
            new BufferedReader(new InputStreamReader(System.in));
      String  line = null;

      String strCnn = "Provider='sqloledb';Data Source='MySqlServer';"
         + "Initial Catalog='Pubs';Integrated Security='SSPI';";

      String strMessage = "UPDATE Titles SET type = 'psychology' "
         +"WHERE type = 'self_help'";

      int intCommand = 0;
      String strFName;
      String strLName;

      try
      {
         // Open recordset from Authors table.
         rsAuthors = new Recordset();
         rsAuthors.setCursorLocation( AdoEnums.CursorLocation.CLIENT );

         // Use client cursor to enable AbsolutePosition property.
         rsAuthors.open( "Authors", strCnn, AdoEnums.CursorType.STATIC,
            AdoEnums.LockType.BATCHOPTIMISTIC, AdoEnums.CommandType.TABLE );

         // Get user's move requests and show current record information.
         while( true )   // Continuous loop.
         {
            // Assign field information to variable to simplify output code.
            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");

            // User types a number followed by enter (cr-lf).
            line = in.readLine();

            // No entry exits program loop.
            if (line.length() == 0) break;
            // Convert string entry to int.
            intCommand = Integer.parseInt(line);
            // Out of range entry exits program loop.
            if ((intCommand < 1) || (intCommand > 4)) break;

            // Call method based on user's validated selection.
            MoveAny(intCommand, rsAuthors);
         }
      }
      catch( AdoException ae )
      {
         // Notify user of any errors that result from ADO.

         // As passing a Recordset, check for null pointer first.
         if (rsAuthors != null)
         {
            PrintProviderError(rsAuthors.getActiveConnection());
         }
         else
         {
            System.out.println("Exception: " + ae.getMessage());
         }
      }
      // System Read requires this catch.
      catch( java.io.IOException je )
      {
         PrintIOError(je);
      }

      finally
      {
         // Cleanup objects before exit.
         if (rsAuthors != null)
            if (rsAuthors.getState() == 1)
               rsAuthors.close();
      }
   }

   // MoveAny Function

   static void MoveAny(int intChoice, Recordset rsTemp)
   {
      // Move per selection from user, checking for BOF and EOF.
      try
      {
         switch(intChoice)
         {
         case 1:   // Equals char of 1.
            rsTemp.moveFirst();
            break;
         case 2:   // Equals char of 2.
            rsTemp.moveLast();
            break;
         case 3:   // Equals char of 3.
            rsTemp.moveNext();
            if(rsTemp.getEOF())
            {
               System.out.println("\nAlready at end of recordset!\n");
               rsTemp.moveLast();
            }
            break;
         case 4:   // Equals char of 4.
            rsTemp.movePrevious();
            if(rsTemp.getBOF())
            {
               System.out.println
                  ("\nAlready at beginning of recordset!\n");
               rsTemp.moveFirst();
            }
            break;
         default:
            break;
         }
      }
      catch( AdoException ae )
      {
         // Notify user of any errors that result from ADO.

         // As passing a Recordset, check for null pointer first.
         if (rsTemp != null)
         {
            PrintProviderError(rsTemp.getActiveConnection());
         }
         else
         {
            System.out.println("Exception: " + ae.getMessage());
         }
      }
   }

   // PrintProviderError Function

   static void PrintProviderError( Connection Cnn1 )
   {
      // Print Provider errors from Connection object.
      // ErrItem is an item object in the Connections Errors collection.
      com.ms.wfc.data.Error  ErrItem = null;
      long nCount = 0;
      int  i      = 0;

      nCount = Cnn1.getErrors().getCount();

      // If there are any errors in the collection, print them.
      if( nCount > 0);
      {
         // Collection ranges from 0 to 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 Function

   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");
   }
}
// EndMoveFirstJ

Voir aussi

MoveFirst, MoveLast, MoveNext et MovePrevious, méthodes | Recordset, objet


Exemple de méthode NextRecordset (VJ++)

Cet exemple utilise la méthode NextRecordset pour afficher les données dans un jeu d'enregistrements qui utilise une instruction de commande combinée, composée de trois différentes instructions SELECT.

// BeginNextRecordsetJ
import java.io.*;
import com.ms.wfc.data.*;

public class NextRecordsetX
{
   // The main entry point for the application.

   public static void main (String[] args)
   {
      NextRecordsetX();
      System.exit(0);
   }
   // NextRecordsetX Function
   static void NextRecordsetX()
   {
      // Define ADO Object
      Recordset rstCompound = null;

      // Declarations
      BufferedReader in =
         new BufferedReader(new InputStreamReader(System.in));
      String strCnn;
      int intCount;
      int intDisplayRecords = 15;
      int intRecordCount;

      try
      {
         // Open compound recordset.
         strCnn = "Provider='sqloledb';Data Source='MySqlServer';" +
             "Initial Catalog='Pubs';Integrated Security='SSPI';";

         rstCompound = new Recordset();
         rstCompound.open("select * from Authors;" +
             "select * from stores;" +
             "select * from jobs", strCnn, AdoEnums.CursorType.FORWARDONLY,
            AdoEnums.LockType.READONLY,AdoEnums.CommandType.TEXT);

         // Display results from each select statement.
         intCount=1;

         while (rstCompound != null)
         {
            System.out.println(
               "Contents of recordset #" + intCount + "\n");
            intRecordCount = 0;

            while(!rstCompound.getEOF())
               {
                  System.out.println(
                     rstCompound.getField(0).getString()+" " +
                     rstCompound.getField(1).getString());
                  intRecordCount++;

                  rstCompound.moveNext();
                  if ( intRecordCount == intDisplayRecords)
                  {
                     System.out.println("\nPress <Enter> to continue..");
                     in.readLine();
                     intRecordCount = 0;
                  }
               }
            System.out.println("\nPress <Enter> to continue..");
            in.readLine();

            rstCompound = rstCompound.nextRecordset();

            intCount++;
         }
      }
      // System read requires this catch.
      catch(java.io.IOException je)
      {
         PrintIOError(je);
      }
      catch(AdoException ae)
      {
         // Notify the user of any errors that result from ADO.

         // As passing a recordset. check for the null pointer first
         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());
      }

      finally
      {
         // Cleanup objects before exit.
         if (rstCompound != null)
            if (rstCompound.getState() == 1)
               rstCompound.close();
      }

   }

   // PrintProviderError Function

   static void PrintProviderError( Connection Cnn1 )
   {
      // Print Provider errors from Connection object.
      // ErrItem is an item object in the Connections Errors collection.
      com.ms.wfc.data.Error  ErrItem = null;
      long nCount = 0;
      int  i      = 0;

      nCount = Cnn1.getErrors().getCount();

      // If there are any errors in the collection, print them.
      if( nCount > 0);
      {
         // Collection ranges from 0 to 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 Function

   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");
   }
}
// EndNextRecordsetJ

NextRecordset, méthode


Exemple de propriétés NumericScale et Precision (VJ++)

Cet exemple utilise les propriétés NumericScale et Precision pour afficher l'échelle numérique et la précision des champs de la table Discounts de la base de données Pubs.

// BeginNumericScaleJ
import com.ms.wfc.data.*;
import java.io.* ;

public class NumericScaleX
{
   // The main entry point for the application.

   public static void main (String[] args)
   {
      NumericScaleX();
      System.exit(0);
   }

   // NumericScaleX function

   static void NumericScaleX()
   {

      // Define ADO Objects.
      Recordset rstDiscounts = null;
      Field fldTemp = null;

      // Declarations.
      BufferedReader in =
         new BufferedReader (new InputStreamReader(System.in));
      String strCnn = "Provider='sqloledb';Data Source='MySqlServer';"
          + "Initial Catalog='Pubs';Integrated Security='SSPI';";
      int intLoop;

      try
      {
         rstDiscounts = new Recordset();

         // Open recordset.
         rstDiscounts.open("Discounts", strCnn,
                    AdoEnums.CursorType.FORWARDONLY,
                    AdoEnums.LockType.READONLY,
                    AdoEnums.CommandType.TABLE);

         // Display numeric scale and precision of
         // numeric and small integer fields.
         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();
            }
         }

      }
      catch( AdoException ae )
      {
         // Notify user of any errors that result from ADO.

         // As passing a Recordset, check for null pointer first.
         if (rstDiscounts != null)
         {
            PrintProviderError(rstDiscounts.getActiveConnection());
         }
         else
         {
            System.out.println("Exception: " + ae.getMessage());
         }

      }

      // System read requires this catch.
      catch( java.io.IOException je)
      {
         PrintIOError(je);
      }

      finally
      {
         // Cleanup objects before exit.
         if (rstDiscounts != null)
            if (rstDiscounts.getState() == 1)
               rstDiscounts.close();
      }

   }

   // PrintProviderError Function

   static void PrintProviderError( Connection Cnn1 )
   {
      // Print Provider errors from Connection object.
      // ErrItem is an item object in the Connections Errors collection.
      com.ms.wfc.data.Error  ErrItem = null;
      long nCount = 0;
      int  i      = 0;

      nCount = Cnn1.getErrors().getCount();

      // If there are any errors in the collection, print them.
      if( nCount > 0);
      {
         // Collection ranges from 0 to 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 Function

   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");
   }
}
// EndNumericScaleJ

NumericScale, propriété | Precision, propriété


Exemple de méthodes Open et Close (VJ++)

Cet exemple utilise les méthodes Open et Close sur les deux objets Recordset et Connection qui ont été ouverts.

// BeginOpenJ
import com.ms.wfc.data.*;
import java.io.* ;
import com.ms.com.*;

public class OpenX
{
   // The main entry point for the application.

   public static void main (String[] args)
   {
      OpenX();
      System.exit(0);
   }

   // OpenX function

   static void OpenX()
   {

      // Define ADO Objects.
      Connection cnConn1 = null;
      Recordset rstEmployees = null;

      // Declarations.
      BufferedReader in =
         new BufferedReader (new InputStreamReader(System.in));
      String strCnn = "Provider='sqloledb';Data Source='MySqlServer';"
                  + "Initial Catalog='Pubs';Integrated Security='SSPI';";
      Variant varDate;
      String strHDate;

      try
      {
         // Open connection.
         cnConn1 = new Connection();
         cnConn1.open(strCnn);

         // Open Employees table.
         rstEmployees = new Recordset();
         rstEmployees.setCursorType(AdoEnums.CursorType.KEYSET);
         rstEmployees.setLockType(AdoEnums.LockType.OPTIMISTIC);
         rstEmployees.open("Employee", cnConn1,
                    AdoEnums.CursorType.KEYSET,
                    AdoEnums.LockType.OPTIMISTIC,
                    AdoEnums.CommandType.TABLE);

         // Assign the first employee record's hire date
         // to a variable, then change the hire date.
         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();

         // Requery Recordset and reset the hire date.
         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();
      }
      catch( AdoException ae )
      {
         // Notify user of any errors that result from ADO.

         // As passing a Recordset, check for null pointer first.
         if (rstEmployees != null)
         {
            PrintProviderError(rstEmployees.getActiveConnection());
         }
         else
         {
            System.out.println("Exception: " + ae.getMessage());
         }

      }

      // System read requires this catch.
      catch( java.io.IOException je)
      {
         PrintIOError(je);
      }

      finally
      {
         // Cleanup objects before exit.
         if (rstEmployees != null)
            if (rstEmployees.getState() == 1)
               rstEmployees.close();
         // Cleanup objects before exit.
         if (cnConn1 != null)
            if (cnConn1.getState() == 1)
               cnConn1.close();
      }

   }

   // PrintProviderError Function

   static void PrintProviderError( Connection Cnn1 )
   {
      // Print Provider errors from Connection object.
      // ErrItem is an item object in the Connections Errors collection.
      com.ms.wfc.data.Error  ErrItem = null;
      long nCount = 0;
      int  i      = 0;

      nCount = Cnn1.getErrors().getCount();

      // If there are any errors in the collection, print them.
      if( nCount > 0);
      {
         // Collection ranges from 0 to 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 Function

   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");
   }
}
// EndOpenJ

Voir aussi

Close, méthode | Connection, objet | Open, méthode (objet Connection ADO) | Open, méthode (objet Recordset ADO) | Recordset, objet


Exemple de méthode OpenSchema (VJ++)

Cet exemple utilise la méthode OpenSchema pour afficher le nom et le type de chaque table dans la base de données Pubs.

// BeginOpenSchemaJ
import com.ms.wfc.data.*;
import java.io.*;
import com.ms.com.*;

public class OpenSchemaX
{
 // The main entry point of the application.

public static void main (String[] args)
{
   System.out.println("\nResults for OpenSchemaX:\n\n");
   OpenSchemaX();
   System.out.println("\nResults for OpenSchemaX2:\n\n");
   OpenSchemaX2();
   System.exit(0);
}

// OpenSchemaX Function
   static void OpenSchemaX()
   {
      // Define ADO Objects
      Connection cnn1 = null;
      Recordset rstSchema = null;

      //  Declarations
      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;";
         cnn1.open(strCnn);
         rstSchema = cnn1.openSchema(AdoEnums.Schema.TABLES);

         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();

      }
      catch(AdoException ae)
      {
         // Notify user of any errors that result from ADO.

         // As passing a Recordset, check for null pointer first.
         if(rstSchema != null)
         {
            PrintProviderError(rstSchema.getActiveConnection());
         }
         else
         {
            System.out.println("Exception: " + ae.getMessage());
         }
      }
      // System read requires this catch.
      catch(java.io.IOException je)
      {
         PrintIOError(je);
      }

      finally
      {
         // Cleanup objects before exit.
         if (rstSchema != null)
            if (rstSchema.getState() == 1)
               rstSchema.close();
         if (cnn1 != null)
            if (cnn1.getState() == 1)
               cnn1.close();
      }
   }

   // OpenSchemaX2 Function

   static void OpenSchemaX2()
   {
      // Define ADO Objects
      Connection cnn2 = null;
      Recordset rstSchema = null;

      // Declarations
      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;";
         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();

      }
      catch(AdoException ae)
      {
         // Notify user of any errors that result from ADO.

         // As passing a Recordset, check for null pointer first.
         if(rstSchema != null)
         {
            PrintProviderError(rstSchema.getActiveConnection());
         }
         else
         {
            System.out.println("Exception: " + ae.getMessage());
         }
      }
      // System read requires this catch.
      catch(java.io.IOException je)
      {
         PrintIOError(je);
      }

      finally
      {
         // Cleanup Objects before exit.
         rstSchema.close();
         cnn2.close();
         // Cleanup objects before exit.
         if (rstSchema != null)
            if (rstSchema.getState() == 1)
               rstSchema.close();
         if (cnn2 != null)
            if (cnn2.getState() == 1)
               cnn2.close();
      }

   }
   // PrintProviderError Function

   static void PrintProviderError( Connection Cnn1 )
   {
      // Print Provider errors from Connection object.
      // ErrItem is an item object in the Connections Errors collection.
      com.ms.wfc.data.Error  ErrItem = null;
      long nCount = 0;
      int  i      = 0;

      nCount = Cnn1.getErrors().getCount();

      // If there are any errors in the collection, print them.
      if( nCount > 0);
      {
         // Collection ranges from 0 to 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 Function

   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");
   }
}
// EndOpenSchemaJ

OpenSchema, méthode


Exemple de propriété Optimize (VJ++)

Cet exemple met en application la propriété dynamique Optimize de l'objet Field. Le champ zip de la table Authors dans la base de données Pubs n'est pas indexé. L'affectation de la valeur True à la propriété Optimize sur le champ zip permet à ADO de construire un index qui améliore les performances de la méthode Find.

// BeginOptimizeJ
import com.ms.wfc.data.*;
import java.io.* ;

public class OptimizeX
{
   // The main entry point for the application.

   public static void main (String[] args)
   {
      OptimizeX();
      System.exit(0);
   }

   // OptimizeX function

   static void OptimizeX()
   {

      // Define ADO Objects.
      Recordset rstAuthors = null;

      // Declarations.
      BufferedReader in =
         new BufferedReader (new InputStreamReader(System.in));
      String strCnn = "Provider='sqloledb';Data Source='MySqlServer';"
         + "Initial Catalog='Pubs';Integrated Security='SSPI';";

      try
      {
         rstAuthors = new Recordset();
         rstAuthors.setCursorLocation(AdoEnums.CursorLocation.CLIENT);
         // Enable index creation.
         rstAuthors.open("SELECT * FROM Authors",
               strCnn,
               AdoEnums.CursorType.STATIC,
               AdoEnums.LockType.READONLY,
               AdoEnums.CommandType.TEXT);
         rstAuthors.getField("zip").getProperties().
            getItem("Optimize").setBoolean(true); // Create the index.
         rstAuthors.find("zip = '94595'");   // Find Akiko Yokomoto.
         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); // Delete the index.

         System.out.println("\nPress <Enter> to continue..");
         in.readLine();
      }
      catch( AdoException ae )
      {
         // Notify user of any errors that result from ADO.

         // As passing a Recordset, check for null pointer first.
         if (rstAuthors != null)
         {
            PrintProviderError(rstAuthors.getActiveConnection());
         }
         else
         {
            System.out.println("Exception: " + ae.getMessage());
         }
      }

      // System read requires this catch.
      catch( java.io.IOException je)
      {
         PrintIOError(je);
      }

      finally
      {
         // Cleanup objects before exit.
         if (rstAuthors != null)
            if (rstAuthors.getState() == 1)
               rstAuthors.close();
      }
   }

   // PrintProviderError Function

   static void PrintProviderError( Connection Cnn1 )
   {
      // Print Provider errors from Connection object.
      // ErrItem is an item object in the Connections Errors collection.
      com.ms.wfc.data.Error  ErrItem = null;
      long nCount = 0;
      int  i      = 0;

      nCount = Cnn1.getErrors().getCount();

      // If there are any errors in the collection, print them.
      if( nCount > 0);
      {
         // Collection ranges from 0 to 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 Function

   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");
   }
}
// EndOptimizeJ

Voir aussi

Field, objet | Optimize, propriété dynamique (ADO)


Exemple de propriétés OriginalValue et UnderlyingValue (VJ++)

Cet exemple montre comment les propriétés OriginalValue et UnderlyingValue sont utilisées pour afficher un message lorsque les données sous-jacentes d'un enregistrement sont modifiées durant la mise à jour par lots d'un objet Recordset.

// BeginOriginalValueJ
import com.ms.wfc.data.*;
import java.io.* ;

public class OriginalValueX
{
   // The main entry point for the application.

   public static void main (String[] args)
   {
      OriginalValueX();
      System.exit(0);
   }

   // OriginalValueX function

   static void OriginalValueX()
   {
      // Define ADO Objects.
      Connection cnConn1 = null;
      Recordset rstTitles = null;
      Field fldType = null;

      // Declarations.
      String strCnn = "Provider='sqloledb';Data Source='MySqlServer';"
         + "Initial Catalog='Pubs';Integrated Security='SSPI';";
      BufferedReader in =
         new BufferedReader (new InputStreamReader(System.in));

      try
      {
         // Open a connection.
         cnConn1 = new Connection();
         cnConn1.open(strCnn);

         // Open recordset for batch update.
         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);

         // Set field object variable for Type field.
         fldType = rstTitles.getField("type");

         // Change the type of psychology titles.
         while(!rstTitles.getEOF())
         {
            if(rstTitles.getField("type").getString().
               trim().equals("psychology"))
               fldType.setString("self_help");
            rstTitles.moveNext();
         }

         // Similate a change by another user by updating
         // data using a command string.
         cnConn1.execute("UPDATE Titles SET type = 'sociology' "
                        + "WHERE type = 'psychology'");

         // Check for changes.
         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();
         }
         // Cancel the update because this is a demonstration.

         rstTitles.cancelBatch();

         // Restore original values.
         cnConn1.execute("UPDATE Titles SET type = 'psychology' "
                     + "WHERE type = 'sociology'");
      }
      catch( AdoException ae )
      {
         // Notify user of any errors that result from ADO.

         // As passing a Recordset, check for null pointer first.
         if (rstTitles!= null)
         {
            PrintProviderError(rstTitles.getActiveConnection());
         }
         else
         {
            System.out.println("Exception: " + ae.getMessage());
         }
      }

      // System read requires this catch.
      catch( java.io.IOException je)
      {
         PrintIOError(je);
      }

      finally
      {
         // Cleanup objects before exit.
         if (rstTitles != null)
            if (rstTitles.getState() == 1)
               rstTitles.close();
         if (cnConn1 != null)
            if (cnConn1.getState() == 1)
               cnConn1.close();
      }

   }

   // PrintProviderError Function

   static void PrintProviderError( Connection Cnn1 )
   {
      // Print Provider errors from Connection object.
      // ErrItem is an item object in the Connections Errors collection.
      com.ms.wfc.data.Error  ErrItem = null;
      long nCount = 0;
      int  i      = 0;

      nCount = Cnn1.getErrors().getCount();

      // If there are any errors in the collection, print them.
      if( nCount > 0);
      {
         // Collection ranges from 0 to 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 Function

   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");
   }
}
// EndOriginalValueJ

Voir aussi

OriginalValue, propriété | Recordset, objet | UnderlyingValue, propriété


Exemple de propriété Prepared (VJ++)

Cet exemple illustre l'utilisation de la propriété Prepared en ouvrant deux objets Command, l'un préparé et l'autre pas.

// BeginPreparedJ
import com.ms.wfc.data.*;
import java.io.* ;

public class PreparedX
{
   // The main entry point for the application.

   public static void main (String[] args)
   {
      PreparedX();
      System.exit(0);
   }

   // PreparedX function

   static void PreparedX()
   {
      // Define string variables.
      String strCnn = "Provider='sqloledb';Data Source='MySqlServer';"
            + "Initial Catalog='Pubs';Integrated Security='SSPI';";
      String strCmd = "SELECT title, type FROM Titles ORDER BY type";

      // Define ADO Objects.
      Connection cnConn1 = null;
      Command cmd1 = null;
      Command cmd2 = null;

      // Declarations.
      BufferedReader in =
         new BufferedReader (new InputStreamReader(System.in));
      long timeStart;
      long timeEnd;
      float timeNotPrepared ;
      float timePrepared;
      int   intLoop;
      String strTemp;

      try
      {
         // Open a connection.
         cnConn1 = new Connection();
         cnConn1.open(strCnn);

         // Create two command objects for the same
         // command - one prepared and one not prepared.
         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);

         // Set a timer, then execute the unprepared
         // command 20 times.
         timeStart = System.currentTimeMillis();
         for ( intLoop = 0; intLoop < 20; intLoop++)
            cmd1.execute();
         timeEnd = System.currentTimeMillis();
         timeNotPrepared =(float)(timeEnd - timeStart)/1000f;

         // Reset the timer, then execute the prepared
         // command 20 times.
         timeStart = System.currentTimeMillis();
         for ( intLoop = 0; intLoop < 20; intLoop++)
            cmd2.execute();
         timeEnd = System.currentTimeMillis();
         timePrepared =(float)(timeEnd - timeStart)/1000f;

         // Display performance results.
         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();

      }
      catch( AdoException ae )
      {
         // Notify user of any errors that result from ADO.

         // As passing a Connection, check for null pointer first.
         if (cnConn1!= null)
         {
            PrintProviderError(cnConn1);
         }
         else
         {
            System.out.println("Exception: " + ae.getMessage());
         }
      }

      // System read requires this catch.
      catch( java.io.IOException je)
      {
         PrintIOError(je);
      }

      finally
      {
         // Cleanup objects before exit.
         if (cnConn1 != null)
            if (cnConn1.getState() == 1)
               cnConn1.close();
      }

   }

   // PrintProviderError Function

   static void PrintProviderError( Connection Cnn1 )
   {
      // Print Provider errors from Connection object.
      // ErrItem is an item object in the Connections Errors collection.
      com.ms.wfc.data.Error  ErrItem = null;
      long nCount = 0;
      int  i      = 0;

      nCount = Cnn1.getErrors().getCount();

      // If there are any errors in the collection, print them.
      if( nCount > 0);
      {
         // Collection ranges from 0 to 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 Function

   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");
   }
}
// EndPreparedJ

Command, objet | Prepared, propriété


Exemple de propriétés Provider et DefaultDatabase (VJ++)

Cet exemple illustre l'utilisation de la propriété Provider en ouvrant trois objets Connection à partir de fournisseurs différents. Il utilise également la propriété DefaultDatabase pour définir la base de données par défaut pour le fournisseur ODBC Microsoft.

// BeginProviderJ
import java.io.*;
import com.ms.wfc.data.*;

public class ProviderX
{
   //    The main entry point of the application.
   public static void main (String[] args)
   {
      ProviderX();
      System.exit(0);
   }
   // ProviderX Function
   static void ProviderX()
   {
      // Define ADO Objects.
      Connection cnn1 = null;
      Connection cnn2 = null;
      Connection cnn3 = null;

      // Declarations.
      BufferedReader in =
         new BufferedReader(new InputStreamReader(System.in));
      try
      {
         // Open a connection using the Microsoft ODBC Provider.
         cnn1 = new Connection();
         cnn1.setConnectionString("driver={SQL Server};"+
             "server='MySqlServer';User ID='MyUserID';Password='MyPassword';");
         cnn1.open();
         cnn1.setDefaultDatabase("Pubs");

         // Display the provider.
         System.out.println("\n\n\tCnn1 provider: "+ cnn1.getProvider());

         // Open connection using the OLE DB Provider for Microsoft Jet.
         cnn2 = new Connection();
         cnn2.setProvider("Microsoft.Jet.OLEDB.4.0");
         cnn2.open("C:\\Program Files\\Microsoft Office\\Office\\Samples\\Northwind.mdb","admin","");

         // Display the provider.
         System.out.println("\n\n\tCnn2 provider: " +
            cnn2.getProvider());

         // Open a connection using the Microsoft SQL Server Provider.
         cnn3 = new Connection();
         cnn3.setProvider("sqloledb");
         cnn3.open("Data Source='MySqlServer';Initial Catalog='Pubs';Integrated Security='SSPI';","","");

         // Display the provider.
         System.out.println("\n\n\tCnn3 provider: " +
            cnn3.getProvider());

         System.out.println("\n\n\tPress <Enter> to continue..");
         in.readLine();
      }
      catch(AdoException ae)
      {
         // Notify the user of any errors that result from ADO.

         // As passing a Connection, check for null pointer first.
         if(cnn1 != null)
         {
            PrintProviderError(cnn1);
         }
         else
         {
            System.out.println("Exception: " + ae.getLocalizedMessage());
         }
      }
      // System read requires needs this catch.
      catch(java.io.IOException je)
      {
         PrintIOError(je);
      }

      finally
      {
         // Cleanup objects before exit.
         if (cnn1 != null)
            if (cnn1.getState() == 1)
               cnn1.close();
         if (cnn2 != null)
            if (cnn2.getState() == 1)
               cnn2.close();
         if (cnn3 != null)
            if (cnn3.getState() == 1)
               cnn3.close();
      }
   }
   // PrintProviderError Function

   static void PrintProviderError( Connection Cnn1 )
   {
      // Print Provider errors from Connection object.
      // ErrItem is an item object in the Connections Errors collection.
      com.ms.wfc.data.Error  ErrItem = null;
      long nCount = 0;
      int  i      = 0;

      nCount = Cnn1.getErrors().getCount();

      // If there are any errors in the collection, print them.
      if( nCount > 0);
      {
         // Collection ranges from 0 to 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 Function

   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");
   }
}
// EndProviderJ

Voir aussi

Connection, objet | DefaultDatabase, propriété | Provider, propriété


Exemple de méthode Refresh (VJ++)

Cet exemple montre comment utiliser la méthode Refresh pour actualiser la collection Parameters pour l'objet Command d'une procédure stockée.

// BeginRefreshJ
import  com.ms.wfc.data.*;
import java.io.*;

public class RefreshX
{
   // The main entry point for the application.

   public static void main (String[] args)
   {
      RefreshX();
      System.exit(0);
   }

   // RefreshX function

   static void RefreshX()
   {
      // Define ADO Objects.
      Connection cnConn1 = null;
      Command cmdByRoyalty = null;
      Recordset rstByRoyalty = null;
      Recordset rstAuthors = null;

      //Declarations.
      String strAuthorID;
      String strFName;
      String strLName;
      int intRoyalty ;
      BufferedReader in =
         new BufferedReader (new InputStreamReader (System.in));
      String line = null;

      try
      {
         // Open a connection.
         String strCnn = "Provider='sqloledb';Data Source='MySqlServer';"
                     + "Initial Catalog='Pubs';Integrated Security='SSPI';";

         cnConn1 = new Connection();
         cnConn1.open(strCnn);

         // Open a command object for a stored procedure
         // with one parameter.
         cmdByRoyalty = new Command();
         cmdByRoyalty.setActiveConnection(cnConn1);
         cmdByRoyalty.setCommandText("byRoyalty");
         cmdByRoyalty.setCommandType(AdoEnums.CommandType.STOREDPROC);
         cmdByRoyalty.getParameters().refresh();

         // Get Parameter value and execute the command
         // storing the results in the recordset.
         System.out.println ("\nEnter Royalty : ");
         line = in.readLine().trim();
         intRoyalty = Integer.parseInt(line);
         cmdByRoyalty.getParameters().getItem(1).setInt(intRoyalty);

         // Create a recordset by executing the command.
         rstByRoyalty = cmdByRoyalty.execute();

         // Open the Authors table to get author names for display.
         rstAuthors = new Recordset ();
         rstAuthors.open(
            "Authors",strCnn,AdoEnums.CursorType.FORWARDONLY,
            AdoEnums.LockType.READONLY, AdoEnums.CommandType.TABLE );

         // Print current data in the recordset,
         // adding author names from Authors table.
         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();

      }
      catch( AdoException ae )
      {
         // Notify user of any errors that result from ADO.

         // As passing a Recordset, check for null pointer first.
         if (rstByRoyalty != null)
         {
            PrintProviderError(rstByRoyalty.getActiveConnection());
         }
         else if (rstAuthors != null)
         {
            PrintProviderError(rstAuthors.getActiveConnection());
         }
         else
         {
            System.out.println("Exception: " + ae.getMessage());
         }
      }

      // This catch is required if input string cannot be converted to
      // Integer data type.
      catch ( java.lang.NumberFormatException ne)
      {
            System.out.println("\nException: Integer Input required.");
      }
      // System Read requires this catch.
      catch( java.io.IOException je )
      {
         PrintIOError(je);
      }

      finally
      {
         // Cleanup objects before exit.
         if (rstByRoyalty != null)
            if (rstByRoyalty.getState() == 1)
               rstByRoyalty.close();
         if (rstAuthors != null)
            if (rstAuthors.getState() == 1)
               rstAuthors.close();
         if (cnConn1 != null)
            if (cnConn1.getState() == 1)
               cnConn1.close();
      }
   }

   // PrintProviderError Function

   static void PrintProviderError( Connection Cnn1 )
   {
      // Print Provider errors from Connection object.
      // ErrItem is an item object in the Connections Errors collection.
      com.ms.wfc.data.Error  ErrItem = null;
      long nCount = 0;
      int  i      = 0;

      nCount = Cnn1.getErrors().getCount();

      // If there are any errors in the collection, print them.
      if( nCount > 0);
      {
         // Collection ranges from 0 to 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 Function

   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");
   }
}
// EndRefreshJ

Command, objet | Parameters, collection | Refresh, méthode


Exemple de méthode Resync (VJ++)

L'exemple ci-dessous illustre comment utiliser la méthode Resync pour actualiser les données d'un jeu d'enregistrements statique.

// BeginResyncJ
import java.io.*;
import com.ms.wfc.data.*;

public class ResyncX
{
   // The main entry point of the application.
   public static void main (String[] args)
   {
      ResyncX();
      System.exit(0);
   }
   static void ResyncX()
   {
      // Define ADO Objects.
      Recordset rstTitles = null;

      // Declarations.
      BufferedReader in =
         new BufferedReader(new InputStreamReader(System.in));
      String strCnn = "Provider='sqloledb';Data Source='MySqlServer';" +
                  "Initial Catalog='Pubs';Integrated Security='SSPI';";

      try
      {
         // Open recordset for Titles table.
         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);

         // Change the type of the first title in the recordset.
         rstTitles.getField("type").setString("database");

         // Display the results of the change.
         System.out.println("\n\n\tBefore resync:\n" + "\tTitle - " +
            rstTitles.getField("title").getString() +
            "\n\tType  - " + rstTitles.getField("type").getString());

         // Resync with database and redisplay the results.
         rstTitles.resync();
         System.out.println("\n\n\tAfter resync:\n" + "\tTitle - " +
            rstTitles.getField("title").getString() +
            "\n\tType  - " +
            rstTitles.getField("type").getString()+"\n");
         rstTitles.cancelBatch();

         System.out.println("\tPress <Enter> to continue..");
         in.readLine();

      }
      catch(AdoException ae)
      {
         // Notify user of any errors that result from ADO.

         // As passing a recordset, check for null pointer first.
         if(rstTitles != null)
         {
            PrintProviderError(rstTitles.getActiveConnection());
         }
         else
         {
            System.out.println("Exception: " + ae.getMessage());
         }
      }
      // System read requires this catch.
      catch(java.io.IOException je)
      {
         PrintIOError(je);
      }

      finally
      {
         // Cleanup objects before exit.
         if (rstTitles != null)
            if (rstTitles.getState() == 1)
               rstTitles.close();
      }
   }

   // PrintProviderError Function

   static void PrintProviderError( Connection Cnn1 )
   {
      // Print Provider errors from Connection object.
      // ErrItem is an item object in the Connections Errors collection.
      com.ms.wfc.data.Error  ErrItem = null;
      long nCount = 0;
      int  i      = 0;

      nCount = Cnn1.getErrors().getCount();

      // If there are any errors in the collection, print them.
      if( nCount > 0);
      {
         // Collection ranges from 0 to 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 Function

   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");
   }
}
// EndResyncJ

Resync, méthode


Exemple de méthodes Save et Open (VJ++)

Ces trois exemples illustrent comment utiliser ensemble les méthodes Save et Open.

Supposez que vous partez en voyage d'affaires et que vous voulez prendre avec vous une table d'une base de données. Avant de partir, vous accédez aux données en tant qu'objet Recordset et les enregistrez sous une forme transportable. Une fois arrivé à destination, vous accédez au Recordset en tant que Recordset local, déconnecté. Vous effectuez les modifications voulues dans le Recordset. Enfin, de retour chez vous, vous vous connectez de nouveau à la base de données et la mettez à jour avec les modifications effectuées en déplacement.

// BeginSaveJ
import com.ms.wfc.data.*;
import java.io.* ;

public class SaveX
{
   // The main entry point for the application.

   public static void main (String[] args)
   {
      SaveX1();
      SaveX2();
      SaveX3();
      System.exit(0);
   }

   // First, access and save the Authors table.

   // SaveX1 function

   static void SaveX1()
   {
      // Define ADO Objects.
      Recordset rstAuthors = null;

      // Declarations.
      String strCnn = "Provider='sqloledb';Data Source='MySqlServer';" +
                      "Initial Catalog='Pubs';Integrated Security='SSPI';";
      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);

         // For the sake of illustration, save the recordset to a
         //diskette in XML format.
         file = new File("c:\\Pubs.xml");
         if(!file.exists())
            rstAuthors.save("c:\\Pubs.xml",AdoEnums.PersistFormat.XML);
         else
         {
            System.out.println("\nFile already exists.");
            System.out.println("\nPress <Enter> to continue..");
            in.readLine();
            System.exit(0);
         }
      }
      catch( AdoException ae )
      {
         // Notify user of any errors that result from ADO.

         // As passing a Recordset, check for null pointer first.
         if (rstAuthors != null)
         {
            PrintProviderError(rstAuthors.getActiveConnection());
         }
         else
         {
            System.out.println("Exception: " + ae.getMessage());
         }
      }
      // System read requires this catch.
      catch( java.io.IOException je)
      {
         PrintIOError(je);
      }

      finally
      {
         // Cleanup objects before exit.
         if (rstAuthors != null)
            if (rstAuthors.getState() == 1)
               rstAuthors.close();
      }
   }

   // At this point, you have arrived at your destination. You will
   // access the Authors table as a local, disconnected Recordset.
   // Don't forget you must have the MSPersist provider on the machine
   // you are using in order to access the saved file, a:\Pubs.xml.

   // SaveX2 function

   static void SaveX2()
   {
      // Define ADO Objects.
      Recordset rstAuthors = null;

      // Declarations.
      BufferedReader in =
         new BufferedReader(new InputStreamReader(System.in));

      try
      {
         rstAuthors = new Recordset();

         // For sake of illustration, we specify all parameters.
         rstAuthors.open("c:\\Pubs.xml",
               "Provider=MSPersist;",
               AdoEnums.CursorType.FORWARDONLY,
               AdoEnums.LockType.BATCHOPTIMISTIC,
               AdoEnums.CommandType.FILE);

         // Now you have a local, disconnected recordset.
         // Edit it as you desire.
         // (In this example, the change makes no difference).
         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();

         // Save changes in ADTG format this time, for illustration.
         // Note that previous version on the diskette, as a:\Pubs.xml.
         rstAuthors.save("c:\\Pubs.adtg",AdoEnums.PersistFormat.ADTG);

      }
      catch( AdoException ae )
      {
         // Notify user of any errors that result from ADO.

         // As passing a Recordset, check for null pointer first.
         if (rstAuthors != null)
         {
            PrintProviderError(rstAuthors.getActiveConnection());
         }
         else
         {
            System.out.println("Exception: " + ae.getMessage());
         }
      }

      // System read requires this catch.
      catch( java.io.IOException je)
      {
         PrintIOError(je);
      }

      finally
      {
         // Cleanup objects before exit.
         if (rstAuthors != null)
            if (rstAuthors.getState() == 1)
               rstAuthors.close();
      }
   }

   // Finally, update the database with your changes.

   // SaveX3 function

   static void SaveX3()
   {
      // Define ADO Objects.
      Connection cnConn1 = null;
      Recordset rstAuthors = null;

      // Declarations.
      String strCnn = "Provider='sqloledb';Data Source='MySqlServer';" +
                      "Initial Catalog='Pubs';Integrated Security='SSPI';";

      try
      {
         // If there is no ActiveConnection, you can open with defaults.
         rstAuthors = new Recordset();
         rstAuthors.open("c:\\Pubs.adtg");

         // Connect to the database, associate the Recordset with
         // connection, then update the database table with the changed
         // Recordset.
         cnConn1 = new Connection();
         cnConn1.open(strCnn);
         rstAuthors.setActiveConnection(cnConn1);
         rstAuthors.updateBatch();
      }
      catch( AdoException ae )
      {
         // Notify user of any errors that result from ADO.

         // As passing a Recordset, check for null pointer first.
         if (rstAuthors != null)
         {
            PrintProviderError(rstAuthors.getActiveConnection());
         }
         else
         {
            System.out.println("Exception: " + ae.getMessage());
         }
      }

      finally
      {
         // Cleanup objects before exit.
         if (rstAuthors != null)
            if (rstAuthors.getState() == 1)
               rstAuthors.close();
         if (cnConn1 != null)
            if (cnConn1.getState() == 1)
               cnConn1.close();
      }
   }

   // PrintProviderError Function

   static void PrintProviderError( Connection Cnn1 )
   {
      // Print Provider errors from Connection object.
      // ErrItem is an item object in the Connections Errors collection.
      com.ms.wfc.data.Error  ErrItem = null;
      long nCount = 0;
      int  i      = 0;

      nCount = Cnn1.getErrors().getCount();

      // If there are any errors in the collection, print them.
      if( nCount > 0);
      {
         // Collection ranges from 0 to 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 Function

   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");
   }
}
// EndSaveJ


Exemple de propriété Sort (VJ++)

Cet exemple utilise la propriété Sort de l'objet Recordset pour réorganiser les lignes d'un objet Recordset provenant de la table Authors de la base de données Pubs. Une routine d'utilitaire secondaire imprime chaque ligne.

// BeginSortJ
import com.ms.wfc.data.*;
import java.io.* ;

public class SortX
{
   // The main entry point for the application.

   public static void main (String[] args)
   {
      SortX();
      System.exit(0);
   }

   // SortX function

   static void SortX()
   {
      // Define ADO Objects.
      Connection cnConn1 = null;
      Recordset rstAuthors = null;

      // Declarations.
      String strCnn = "Provider='sqloledb';Data Source='MySqlServer';" +
                      "Initial Catalog='Pubs';Integrated Security='SSPI';";

      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);
      }
      catch( AdoException ae )
      {
         // Notify user of any errors that result from ADO.

         // As passing a Recordset, check for null pointer first.
         if (rstAuthors != null)
         {
            PrintProviderError(rstAuthors.getActiveConnection());
         }
         else
         {
            System.out.println("Exception: " + ae.getMessage());
         }
      }

      finally
      {
         // Cleanup objects before exit.
         if (rstAuthors != null)
            if (rstAuthors.getState() == 1)
               rstAuthors.close();
         if (cnConn1 != null)
            if (cnConn1.getState() == 1)
               cnConn1.close();
      }

   }

   // SortXprint function

   static void SortXprint(String strTitle,Recordset rstp)
   {
      // Declarations.
      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 )
      {
         // Notify user of any errors that result from ADO.

         // As passing a Recordset, check for null pointer first.
         if (rstp != null)
         {
            PrintProviderError(rstp.getActiveConnection());
         }
         else
         {
            System.out.println("Exception: " + ae.getMessage());
         }
      }

      // System read requires this catch.
      catch( java.io.IOException je)
      {
         PrintIOError(je);
      }
   }
   // PrintProviderError Function

   static void PrintProviderError( Connection Cnn1 )
   {
      // Print Provider errors from Connection object.
      // ErrItem is an item object in the Connections Errors collection.
      com.ms.wfc.data.Error  ErrItem = null;
      long nCount = 0;
      int  i      = 0;

      nCount = Cnn1.getErrors().getCount();

      // If there are any errors in the collection, print them.
      if( nCount > 0);
      {
         // Collection ranges from 0 to 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 Function

   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");
   }
}
// EndSortJ

Recordset, objet | Sort, propriété


Exemple de propriété Source (VJ++)

Cet exemple illustre l'utilisation de la propriété Source en ouvrant trois objets Recordset basés sur des sources de données différentes.

// BeginSourceJ
import java.io.*;
import com.ms.wfc.data.*;

public class SourceX
{
   // The main entry point of the application.
   public static void main (String[] args)
   {
      SourceX();
      System.exit(0);
   }
   // SourceX Function
   static void SourceX()
   {
      // Define string variables.
      String strCnn = "Provider='sqloledb';Data Source='MySqlServer';" +
                  "Initial Catalog='Pubs';Integrated Security='SSPI';";
      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";

      // Define ADO Objects.
      Connection cnn1 = null;
      Recordset rstTitles = null;
      Recordset rstPublishers = null;
      Recordset rstPublishersDirect = null;
      Recordset rstTitlesPublishers = null;
      Command cmdSQL = null;

      // Declarations.
      BufferedReader in =
         new BufferedReader(new InputStreamReader(System.in));

      try
      {
         // Open a connection.
         cnn1 = new Connection();
         cnn1.open(strCnn);

         // Open a recordset based on a command object.
         cmdSQL = new Command();
         cmdSQL.setActiveConnection(cnn1);
         cmdSQL.setCommandText("Select title,type,pubdate " +
             "FROM Titles ORDER BY title");

         rstTitles = new Recordset();
         rstTitles = cmdSQL.execute();

         // Open a recordset based on a table.
         rstPublishers = new Recordset();
         rstPublishers.open("publishers", strCnn,
            AdoEnums.CursorType.FORWARDONLY, AdoEnums.LockType.READONLY,
            AdoEnums.CommandType.TABLE);

         // Open a recordset based on a table.
         rstPublishersDirect = new Recordset();
         rstPublishersDirect.open("publishers", strCnn,
            AdoEnums.CursorType.FORWARDONLY, AdoEnums.LockType.READONLY,
            AdoEnums.CommandType.TABLEDIRECT);

         // Open a recordset based on an SQL String.
         rstTitlesPublishers = new Recordset();

         rstTitlesPublishers.open(strSQL, strCnn,
            AdoEnums.CursorType.FORWARDONLY, AdoEnums.LockType.READONLY,
            AdoEnums.CommandType.TEXT);

         // Use Source property to display the source of each recordset.
         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());

         System.out.println("\n\nPress <Enter> to continue..");
         in.readLine();
      }
      catch(AdoException ae)
      {
         // Notify the user of any errors that result from ADO.

         // As passing a recordset, check for null pointer first.

         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());

      }
      // System read requires this catch.
      catch(java.io.IOException je)
      {
         PrintIOError(je);
      }

      finally
      {
         // Cleanup objects before exit.
         if (rstTitles != null)
            if (rstTitles.getState() == 1)
               rstTitles.close();
         if (rstPublishers != null)
            if (rstPublishers.getState() == 1)
               rstPublishers.close();
         if (rstPublishersDirect != null)
            if (rstPublishersDirect.getState() == 1)
               rstPublishersDirect.close();
         if (rstTitlesPublishers != null)
            if (rstTitlesPublishers.getState() == 1)
               rstTitlesPublishers.close();
         if (cnn1 != null)
            if (cnn1.getState() == 1)
               cnn1.close();
      }

   }
   // PrintProviderError Function

   static void PrintProviderError( Connection Cnn1 )
   {
      // Print Provider errors from Connection object.
      // ErrItem is an item object in the Connections Errors collection.
      com.ms.wfc.data.Error  ErrItem = null;
      long nCount = 0;
      int  i      = 0;

      nCount = Cnn1.getErrors().getCount();

      // If there are any errors in the collection, print them.
      if( nCount > 0);
      {
         // Collection ranges from 0 to 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 Function

   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");
   }
}
// EndSourceJ

Voir aussi

Recordset, objet | Source, propriété (Recordset ADO)


Exemple de propriété State (VJ++)

Cet exemple utilise la propriété State pour afficher un message lors de l'ouverture de connexions asynchrones et de l'exécution de commandes asynchrones.

// BeginStateJ
import com.ms.wfc.data.*;
import java.io.*;

public class StateX
{
   // The main entry point of the application.
   public static void main (String[] args)
   {
      StateX();
      System.exit(0);
   }
   // StateX Function
   static void StateX()
   {
      // Define ADO Objects.
      Connection cnn1 = null;
      Connection cnn2 = null;
      Command cmdChange = null;
      Command cmdRestore = null;

      // Declarations.
      String strCnn = "Provider='sqloledb';Data Source='MySqlServer';"+
                  "Initial Catalog='Pubs';Integrated Security='SSPI';";
      BufferedReader in =
         new BufferedReader(new InputStreamReader(System.in));

      try
      {
         // Open two Asynchronous connections, displaying
         // a message while connecting.
         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....");

         // Create two command Objects.
         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'");

         // Executing the commands, displaying a message
         // while they are executing.
         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....");

         System.out.println("Press <Enter> to continue..");
         in.readLine();
      }
      // System read requires this catch.
      catch(java.io.IOException je)
      {
         PrintIOError(je);
      }
      catch(AdoException ae)
      {
         // Notify user of any errors resulting from ADO.

         // As passing a connection, check for null pointer first.
         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());
         }
      }

      finally
      {
         // Cleanup objects before exit.
         if (cnn1 != null)
            if (cnn1.getState() == 1)
               cnn1.close();
         if (cnn2 != null)
            if (cnn2.getState() == 1)
               cnn2.close();
      }

   }
   // PrintProviderError Function
   static void PrintProviderError(Connection cnn1)
   {
      // Print Provider Errors from Connection Object.
      // ErrItem is an item object in the Connections Errors Collection.
      com.ms.wfc.data.Error               ErrItem = null;
      long                                 nCount = 0;
      int                                       i = 0;

      nCount = cnn1.getErrors().getCount();

      // If there are any errors in the collection, print them.
      if ( nCount > 0)
      {
         // Collection ranges from 0 to 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 Function
   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");
   }
}
// EndStateJ

State, propriété


Exemple de propriété Status (VJ++)

Cet exemple utilise la propriété Status pour afficher les enregistrements modifiés durant une opération globale avant une mise à jour par lots.

// BeginStatusJ
import java.io.*;
import com.ms.wfc.data.*;

public class StatusX
{
   // The main entry point of the application.

   public static void main (String[] args)
   {
      StatusX();
      System.exit(0);
   }
   // StatusX Function

   static void StatusX()
   {
      // Define ADO Objects.
      Recordset rstTitles = null;

      // Declarations.
      String strCnn = "Provider='sqloledb';Data Source='MySqlServer';"+
                  "Initial Catalog='Pubs';Integrated Security='SSPI';";
      BufferedReader in =
         new BufferedReader(new InputStreamReader(System.in));

      try
      {
         // Open Recordset for batch update.
         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);

         // Change the type of psychology titles.
         while(!rstTitles.getEOF())
         {
            if(rstTitles.getField("Type").getString().trim().
               equals(new String("psychology")))
               rstTitles.getField("Type").setString("self_help");

            rstTitles.moveNext();
         }

         // Display Title ID and status.
         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();
         }

         // Cancel the update because this is a demonstration.
         rstTitles.cancelBatch();

         System.out.println("Press <Enter> to continue..");
         in.readLine();
      }
      catch(AdoException ae)
      {
         // Notify the user of any errors that result from ADO.

         // As passing a Recordset, check for the null pointer first.
         if(rstTitles != null)
         {
            PrintProviderError(rstTitles.getActiveConnection());
         }
         else
         {
            System.out.println("Exception: " + ae.getMessage());
         }
      }
      // System read requires this catch.
      catch(java.io.IOException je)
      {
         PrintIOError(je);
      }

      finally
      {
         // Cleanup objects before exit.
         if (rstTitles != null)
            if (rstTitles.getState() == 1)
               rstTitles.close();
      }
   }
   // PrintProviderError Function
   static void PrintProviderError(Connection cnn1)
   {
      // Print Provider Errors from Connection Object.
      // ErrItem is an item object in the Connections Errors Collection.
      com.ms.wfc.data.Error               ErrItem = null;
      long                                 nCount = 0;
      int                                       i = 0;

      nCount = cnn1.getErrors().getCount();

      // If there are any errors in the collection, print them.
      if ( nCount > 0)
      {
         // Collection ranges from 0 to 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 Function
   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");
   }
}
// EndStatusJ

Voir aussi

Status, propriété (Recordset ADO)


Exemple de propriété StayInSync (VJ++)

Cet exemple montre comment la propriété StayInSync facilite l'accès aux lignes dans un objet Recordset hiérarchique.

La boucle extérieure affiche le prénom et le nom de chaque auteur, son département et son identification. L'objet Recordset intégré pour chaque ligne est extrait de la collection Fields pour être automatiquement attribué à rstTitleAuthor par la propriété StayInSync, chaque fois que l'objet Recordset parent est déplacé vers une nouvelle ligne. La boucle intérieure affiche quatre champs provenant de chaque ligne du jeu d'enregistrements ajouté.

// BeginStayInSyncJ
import com.ms.wfc.data.*;
import java.io.* ;
import com.ms.com.*;

public class StayInSyncX
{
    // The main entry point for the application.

   public static void main (String[] args)
   {
      StayInSyncX();
      System.exit(0);
   }

   // StayInSyncX function

   static void StayInSyncX()
   {

      // Define ADO Objects.
      Connection cnConn1 = null;
      Recordset rstAuthors = null;
      Recordset rstTitleAuthor = null;

      // Declarations.
      BufferedReader in = new
         BufferedReader (new InputStreamReader(System.in));
      String strCnn = "Provider=MSDataShape;" +
         "Data Provider='sqloledb';Data Source='MySqlServer';" +
         "Initial Catalog='Pubs';Integrated Security='SSPI';";

      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();
         }

         System.out.println("\nPress <Enter> to continue..");
         in.readLine();
      }
      catch( AdoException ae )
      {
         // Notify user of any errors that result from ADO.

         // As passing a Recordset, check for null pointer first.
         if (rstAuthors != null)
         {
            PrintProviderError(rstAuthors.getActiveConnection());
         }
         else
         {
            System.out.println("Exception: " + ae.getMessage());
         }
      }

      // System read requires this catch.
      catch( java.io.IOException je)
      {
         PrintIOError(je);
      }

      finally
      {
         // Cleanup objects before exit.
         if (rstTitleAuthor != null)
            if (rstTitleAuthor.getState() == 1)
               rstTitleAuthor.close();
         if (rstAuthors != null)
            if (rstAuthors.getState() == 1)
               rstAuthors.close();
         if (cnConn1 != null)
            if (cnConn1.getState() == 1)
               cnConn1.close();
      }
   }

   // PrintProviderError Function
   static void PrintProviderError(Connection cnn1)
   {
      // Print Provider Errors from Connection Object.
      // ErrItem is an item object in the Connections Errors Collection.
      com.ms.wfc.data.Error               ErrItem = null;
      long                                 nCount = 0;
      int                                       i = 0;

      nCount = cnn1.getErrors().getCount();

      // If there are any errors in the collection, print them.
      if ( nCount > 0)
      {
         // Collection ranges from 0 to 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 Function
   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");
   }
}
// EndStayInSyncJ

Voir aussi

Fields, collection | Recordset, objet | StayInSync, propriété


Exemple de méthode Supports (VJ++)

L'exemple ci-dessous utilise la méthode Supports pour afficher les options gérées par un jeu d'enregistrements ouvert avec différents types de curseur. La fonction DisplaySupport est nécessaire à l'exécution de cet exemple.

// BeginSupportsJ
import com.ms.wfc.data.*;
import java.io.*;

public class SupportsX
{
   // The main entry point of the application.

   public static void main (String[] args)
   {
      SupportsX();
      System.exit(0);
   }
   // SupportsX Function

   static void SupportsX()
   {
      // Define ADO Objects.
      Recordset rstTitles = null;

      // Declarations.
      int[] aintCursorType = new int[4];
      String strCnn;
      int intIndex;
      BufferedReader in =
         new BufferedReader(new InputStreamReader(System.in));

      try
      {
         // Open connections.
         strCnn = "Provider='sqloledb';Data Source='MySqlServer';"+
                "Initial Catalog='Pubs';Integrated Security='SSPI';";

         // Fill array with CursorType constants.
         aintCursorType[0] = AdoEnums.CursorType.FORWARDONLY;
         aintCursorType[1] = AdoEnums.CursorType.KEYSET;
         aintCursorType[2] = AdoEnums.CursorType.DYNAMIC;
         aintCursorType[3] = AdoEnums.CursorType.STATIC;

         // Open recordset using each CursorType and
         // Optimistic Locking.  Then call the DisplaySupport
         // procedure to display the supported options.
         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);
            System.out.println("Press <Enter> to continue..");
            in.readLine();
         }
      }
      catch(AdoException ae)
      {
         // Notify user of any errors that result from ADO.

         // As passing a Recordset, check for null pointer first.
         if (rstTitles!= null)
         {
            PrintProviderError(rstTitles.getActiveConnection());
         }
         else
         {
            System.out.println("Exception: " + ae.getMessage());
         }
      }
      // System read requires this catch.
      catch( java.io.IOException je)
      {
         PrintIOError(je);
      }

      finally
      {
         // Cleanup objects before exit.
         if (rstTitles != null)
            if (rstTitles.getState() == 1)
               rstTitles.close();
      }
   }
   // DisplaySupport Function

   static void DisplaySupport( Recordset rstTemp )
   {
      long[] alngConstants = new long[11];
      boolean booSupports;
      int intIndex;
      try
      {
         // Fill array with cursor option constants.
         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)
      {
         // Notify user of any errors that result from ADO.

         // As passing a Recordset, check for null pointer first.
         if (rstTemp!= null)
         {
            PrintProviderError(rstTemp.getActiveConnection());
         }
         else
         {
            System.out.println("Exception: " + ae.getMessage());
         }
      }
   }

   // PrintProviderError Function
   static void PrintProviderError(Connection cnn1)
   {
      // Print Provider Errors from Connection Object.
      // ErrItem is an item object in the Connections Errors Collection.
      com.ms.wfc.data.Error               ErrItem = null;
      long                                 nCount = 0;
      int                                       i = 0;

      nCount = cnn1.getErrors().getCount();

      // If there are any errors in the collection, print them.
      if ( nCount > 0)
      {
         // Collection ranges from 0 to 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 Function
   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");
   }
}
// EndSupportsJ

Recordset, objet | Supports, méthode


Exemple de propriété Type (Field) (VJ++)

Cet exemple montre comment la propriété Type est utilisée pour afficher le nom de la constante qui correspond à la valeur de la propriété Type de tous les objets Field de la table Employees. L'exécution de cette procédure requiert la fonction FieldType.

// BeginFieldTypeJ
import java.io.*;
import com.ms.wfc.data.*;

public class TypeFieldX
{

   // The main entry point of the application.

   public static void main (String[] args)
   {
      TypeFieldX();
      System.exit(0);
   }

   // TypeFieldX Function
   static void TypeFieldX()
   {
      // Define ADO Objects.
      Recordset rstEmployees = null;
      Field fldLoop = null;

      // Declarations.
      String strCnn = "Provider='sqloledb';Data Source='MySqlServer';"+
                "Initial Catalog='Pubs';Integrated Security='SSPI';";
      int intLoop;
      int intRecordCount = 0;
      BufferedReader in =
         new BufferedReader(new InputStreamReader(System.in));

      try
      {
         // Open the Recordset with data from Employees table.
         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");

         // Enumerate fields collection of Employees table.
         for(intLoop = 0;intLoop <
            rstEmployees.getFields().getCount();intLoop++)
         {
            intRecordCount++;
            // Loop needed for display of records
            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)
      {
         // Notify the user of any errors that result from ADO.

         // As passing a Recordset, check for the null pointer first.
         if(rstEmployees != null)
         {
            PrintProviderError(rstEmployees.getActiveConnection());
         }
         else
         {
            System.out.println("Exception: " + ae.getMessage());
         }
      }
      // System read requires this catch.
      catch(java.io.IOException je)
      {
         PrintIOError(je);
      }

      finally
      {
         // Cleanup objects before exit.
         if (rstEmployees != null)
            if (rstEmployees.getState() == 1)
               rstEmployees.close();
      }
   }
   // FieldType Function
   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 Function
   static void PrintProviderError(Connection cnn1)
   {
      // Print Provider Errors from Connection Object.
      // ErrItem is an item object in the Connections Errors Collection.
      com.ms.wfc.data.Error               ErrItem = null;
      long                                 nCount = 0;
      int                                       i = 0;

      nCount = cnn1.getErrors().getCount();

      // If there are any errors in the collection, print them.
      if ( nCount > 0)
      {
         // Collection ranges from 0 to 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 Function
   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");
   }
}
// EndFieldTypeJ

Field, objet | Type, propriété


Exemple de propriété Type (Property) (VJ++)

Cet exemple illustre l'utilisation de la propriété Type. Il s'agit d'un modèle d'utilitaire pour le listage des noms et des types d'une collection, comme Properties, Fields, etc.

Il n'est pas nécessaire d'ouvrir l'objet Recordset pour accéder à la collection Properties ; les propriétés apparaissent lorsque l'objet Recordset est instancié. Cependant, l'affectation de la propriété CursorLocation à adUseClient ajoute plusieurs propriétés dynamiques à la collection Properties de l'objet Recordset, rendant cet exemple un peu plus intéressant. À des fins d'illustration, nous utilisons explicitement la propriété Item pour accéder à chaque objet Property.

// BegintTypePropertyJ
import com.ms.wfc.data.*;
import java.io.* ;

public class TypePropertyX
{
    // The main entry point for the application.

    public static void main (String[] args)
    {
        TypePropertyX();
        System.exit(0);
    }

    // TypePropertyX  function
    static void TypePropertyX()
    {
        // Define ADO Objects.
        Recordset rst = null;
        AdoProperty prop = null;

        // Declarations.
        BufferedReader in =
            new BufferedReader (new InputStreamReader(System.in));
        String strCnn = "DSN='Pubs';Provider='MSDASQL';Integrated Security='SSPI';";
        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 )
        {
            // Notify user of any errors that result from ADO.

            // As passing a Recordset, check for null pointer first.
            if (rst != null)
            {
                PrintProviderError(rst.getActiveConnection());
            }
            else
            {
                System.out.println("Exception: " + ae.getMessage());
            }
        }

        // System read requires this catch.
        catch( java.io.IOException je)
        {
            PrintIOError(je);
        }

      finally
      {
         // Cleanup objects before exit.
         if (rst != null)
            if (rst.getState() == 1)
               rst.close();
      }
    }

    // PrintProviderError Function
    static void PrintProviderError(Connection cnn1)
    {
        // Print Provider Errors from Connection Object.
        // ErrItem is an item object in the Connections Errors Collection.
        com.ms.wfc.data.Error               ErrItem = null;
        long                                 nCount = 0;
        int                                       i = 0;

        nCount = cnn1.getErrors().getCount();

        // If there are any errors in the collection, print them.
        if ( nCount > 0)
        {
            // Collection ranges from 0 to 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 Function
    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");
    }
}
// EndTypePropertyJ

Property, objet | Type, propriété


Exemple de méthodes Update et CancelUpdate (VJ++)

Cette exemple illustre l'utilisation combinée des méthodes Update et CancelUpdate.

// BeginUpdateJ
import java.io.*;
import com.ms.wfc.data.*;

public class UpdateX
{
   // The main entry point of the application.

   public static void main (String[] args)
   {
      UpdateX();
      UpdateX2();
      System.exit(0);
   }
   // UpdateX Function

   static void UpdateX()
   {
      // Define ADO objects.
      Recordset rstEmployees = null;

      // Declarations.
      String strCnn = "Provider='sqloledb';Data Source='MySqlServer';"+
                  "Initial Catalog='Pubs';Integrated Security='SSPI';";
      String strOldFirst;
      String strOldLast;
      String strMessage;
      BufferedReader in =
         new BufferedReader(new InputStreamReader(System.in));

      try
      {
         // Open Recordset with names from Employees table.
         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);

         // Store Original data.
         strOldFirst = rstEmployees.getField("fname").getString();
         strOldLast = rstEmployees.getField("lname").getString();

         // Change data in edit buffer.
         rstEmployees.getField("fname").setString("Linda");
         rstEmployees.getField("lname").setString("Kobara");

         // Show contents of buffer and get user input.
         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();

         // Show the resulting data.
         System.out.println("Data in Recordset = " +
            rstEmployees.getField("fname").getString() +
            "  " + rstEmployees.getField("lname").getString()+ "\n");

         // Restore original data because this is a demonstration.
         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 Objects before exit.
         rstEmployees.close();

         System.out.println("Press <Enter> to continue..");
         in.readLine();

      }
      catch(AdoException ae)
      {
         // Notify the user of any errors that result from ADO.

         // As passing a recordset, check for null pointer first.
         if(rstEmployees != null)
         {
            PrintProviderError(rstEmployees.getActiveConnection());
         }
         else
         {
            System.out.println("Exception: "+ ae.getMessage());
         }
      }
      // System read requires this catch.
      catch(java.io.IOException je)
      {
         PrintIOError(je);
      }

      finally
      {
         // Cleanup objects before exit.
         if (rstEmployees != null)
            if (rstEmployees.getState() == 1)
               rstEmployees.close();
      }
   }
   // UpdateX2 Function

   static void UpdateX2()
   {
      // This example demonstrates the Update method in conjunction
      // with the AddNew method.

      // Define ADO Objects.
      Connection cnn1 = null;
      Recordset rstEmployees = null;

      // Declarations.
      String strCnn = "Provider='sqloledb';Data Source='MySqlServer';"+
                  "Initial Catalog='Pubs';Integrated Security='SSPI';";
      String strEmpID;
      String strOldFirst;
      String strOldLast;
      String strMessage;
      BufferedReader in =
         new BufferedReader(new InputStreamReader(System.in));

      try
      {
         // Open a connection.
         cnn1 = new Connection();
         cnn1.open(strCnn);

         // Open Recordset with data from Employees table.
         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");

         // Show contents of buffer and get user input.
         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();
            // Go to the new record and show the resulting data.
            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");
         }
         // Delete new data because this is a demonstration.
         cnn1.execute(
            "DELETE FROM employee WHERE emp_id='" + strEmpID +"'");

         // Cleanup Objects before exit
         rstEmployees.close();

         System.out.println("Press <Enter> to continue..");
         in.readLine();
      }
      catch(AdoException ae)
      {
         // Notify the user of any errors that result from ADO.

         // As passing a recordset, check for null pointer first.
         if(rstEmployees != null)
         {
            PrintProviderError(rstEmployees.getActiveConnection());
         }
         else
         {
            System.out.println("Exception: "+ ae.getMessage());
         }
      }
      // System read requires this catch.
      catch(java.io.IOException je)
      {
         PrintIOError(je);
      }

      finally
      {
         // Cleanup objects before exit.
         if (rstEmployees != null)
            if (rstEmployees.getState() == 1)
               rstEmployees.close();
      }
   }
   // PrintProviderError Function
   static void PrintProviderError(Connection cnn1)
   {
      // Print Provider Errors from Connection Object.
      // ErrItem is an item object in the Connections Errors Collection.
      com.ms.wfc.data.Error               ErrItem = null;
      long                                 nCount = 0;
      int                                       i = 0;

      nCount = cnn1.getErrors().getCount();

      // If there are any errors in the collection, print them.
      if ( nCount > 0)
      {
         // Collection ranges from 0 to 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 Function
   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");
   }
}
// EndUpdateJ

CancelUpdate, méthode | Update, méthode


Exemple de méthodes UpdateBatch et CancelBatch (VJ++)

Cet exemple illustre l'utilisation combinée des méthodes UpdateBatch et CancelBatch.

// BeginUpdateBatchJ
import java.io.*;
import com.ms.wfc.data.*;

public class UpdateBatchX
{
   // The main entry point of the application.
   public static void main (String[] args)
   {
      UpdateBatchX();
      System.exit(0);
   }
   // UpdateBatchX Function

   static void UpdateBatchX()
   {
      // Define ADO Objects.
      Recordset rstTitles = null;

      // Declarations.
      String strCnn = "Provider='sqloledb';Data Source='MySqlServer';"+
                  "Initial Catalog='Pubs';Integrated Security='SSPI';";
      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();

         // Loop through recordset and ask user if she wants
         // to change the type for the specified table.
         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();
         }
         // Ask the user if she wants to commit to all the
         // changes made above.
         System.out.println("Save all changes?Enter (Y/N)");
         if(in.readLine().trim().equalsIgnoreCase("Y"))
            rstTitles.updateBatch();
         else
            rstTitles.cancelBatch();

         // Print current data in recordset.
         rstTitles.requery();
         rstTitles.moveFirst();
         while(!rstTitles.getEOF())
         {
         System.out.println(rstTitles.getField("title").getString() +
            " - " + rstTitles.getField("type").getString());
         rstTitles.moveNext();
         }

         // Restore original values because this is a demonstration.
         rstTitles.moveFirst();
         while(!rstTitles.getEOF())
         {
            if(rstTitles.getField("type").getString().
               trim().equalsIgnoreCase("self_help"))
               rstTitles.getField("type").setString("psychology");
            rstTitles.moveNext();
         }
         rstTitles.updateBatch();

         System.out.println("Press <Enter> to continue..");
         in.readLine();

      }
      catch(AdoException ae)
      {
         // Notify the user of any errors that result from ADO.

         // As passing a recordset, check for null pointer first.
         if(rstTitles != null)
         {
            PrintProviderError(rstTitles.getActiveConnection());
         }
         else
         {
            System.out.println("Exception: " + ae.getMessage());
         }
      }
      // System read requires this catch.
      catch(java.io.IOException je)
      {
         PrintIOError(je);
      }

      finally
      {
         // Cleanup objects before exit.
         if (rstTitles != null)
            if (rstTitles.getState() == 1)
               rstTitles.close();
      }
   }

   // PrintProviderError Function
   static void PrintProviderError(Connection cnn1)
   {
      // Print Provider Errors from Connection Object.
      // ErrItem is an item object in the Connections Errors Collection.
      com.ms.wfc.data.Error               ErrItem = null;
      long                                 nCount = 0;
      int                                       i = 0;

      nCount = cnn1.getErrors().getCount();

      // If there are any errors in the collection, print them.
      if ( nCount > 0)
      {
         // Collection ranges from 0 to 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 Function
   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");
   }
}
// EndUpdateBatchJ

CancelBatch, méthode | UpdateBatch, méthode


Exemple de propriété Value (VJ++)

Cet exemple illustre l'utilisation de la propriété Value avec les objets Field et Property pour afficher les valeurs champ et propriété du tableau Employees.

// BeginValueJ
import java.io.*;
import com.ms.wfc.data.*;
import com.ms.com.*;

public class ValueX
{
   // Main Function
   public static void main (String[] args)
   {
      ValueX();
      System.exit(0);
   }
   static void ValueX()
   {
      // Define ADO Objects.
      Recordset rstEmployees = null;
      Field    fldLoop     = null;
      AdoProperty  prpLoop   = null;

      // Declarations.
      String strCnn = "Provider='sqloledb';Data Source='MySqlServer';" +
         "Initial Catalog='Pubs';Integrated Security='SSPI';";
      int intLoop;
      BufferedReader in = new
         BufferedReader(new InputStreamReader(System.in));
      Variant varPropertyValue;
      String strMessage;

      try
      {
         // Open a Recordset with data from Employees table.
         rstEmployees = new Recordset();
         rstEmployees.open("employee", strCnn,
            AdoEnums.CursorType.FORWARDONLY, AdoEnums.LockType.READONLY,
            AdoEnums.CommandType.TABLE);

         System.out.println("Field values in rstEmployees\n");

         // Enumerate the Fields collection of the Employees
         // table.
         for(intLoop = 0;
            intLoop<rstEmployees.getFields().getCount();intLoop++)
         {
            fldLoop = rstEmployees.getFields().getItem(intLoop);
            // Because Value is the default property of a
            // Field object, the use of the actual keyword
            // here is 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");

         // Enumerate the Properties collection of the
         // Recordset object.
         int intCount = 0;
         for(intLoop = 0;
            intLoop<rstEmployees.getProperties().getCount();intLoop++)
         {
            prpLoop = rstEmployees.getProperties().getItem(intLoop);
            // Because Value is the default property of a
            // Field object, the use of the actual keyword
            // here is 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++;
            // Loop used to display records
            if (intCount % 15 == 0)
            {
               System.out.println("\nPress <Enter> to continue..");
               in.readLine();
               intCount = 0;
            }

         }
         // Cleanup objects before exit.
         rstEmployees.close();
         System.out.println("\nPress <Enter> to continue..");
         in.readLine();
      }
      // System read requires this catch.
      catch(java.io.IOException je)
      {
         PrintIOError(je);
      }
      catch(AdoException ae)
      {
         // Notify the user of any errors that result from ADO.

         // As passing a recordset, check for null pointer first.
         if(rstEmployees != null)
         {
            PrintProviderError(rstEmployees.getActiveConnection());
         }
         else
         {
            System.out.println("Exception: " + ae.getMessage());
         }
      }

      finally
      {
         // Cleanup objects before exit.
         if (rstEmployees != null)
            if (rstEmployees.getState() == 1)
               rstEmployees.close();
      }

   }
   // PrintProviderError Function
   static void PrintProviderError(Connection cnn1)
   {
      // Print Provider Errors from Connection Object.
      // ErrItem is an item object in the Connections Errors Collection.
      com.ms.wfc.data.Error               ErrItem = null;
      long                                 nCount = 0;
      int                                       i = 0;

      nCount = cnn1.getErrors().getCount();

      // If there are any errors in the collection, print them.
      if ( nCount > 0)
      {
         // Collection ranges from 0 to 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 Function
   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");
   }
}
// EndValueJ

Field, objet | Property, objet | Value, propriété


Exemple de propriété Version (VJ++)

Cet exemple utilise la propriété Version d'un objet Connection pour afficher le numéro de la version ADO utilisée. Il emploie également plusieurs propriétés dynamiques pour afficher :

  • le nom et la version du système de gestion de base de données (SGBD) ;
  • la version OLE DB ;
  • le nom et la version du fournisseur ;
  • la version ODBC ;
  • le nom et la version du gestionnaire ODBC.
// BeginVersionJ
import com.ms.wfc.data.*;
import java.io.*;

public class VersionX
{
   // The main entry point of the application.
   public static void main (String[] args)
   {
      VersionX();
      System.exit(0);
   }
   // VersionX Function
   static void VersionX()
   {
      // Define ADO Objects.
      Connection cnn1 = null;

      // Declarations.
      String strCnn = "Driver={SQL Server};Server='MySqlServer';" +
                  "User ID='MyUserID';Password='MyPassword';database='Pubs';";
      String strVersionInfo;
      BufferedReader in = new
         BufferedReader(new InputStreamReader(System.in));
      try
      {
         // Open connection.
         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);

         System.out.println("Press <Enter> to continue..");
         in.readLine();
      }
      // System read requires this catch.
      catch(java.io.IOException je)
      {
         PrintIOError(je);
      }
      catch(AdoException ae)
      {
         // Notify the user of any errors that result from ADO.

         // As passing a recordset, check for null pointer first.
         if(cnn1!= null)
         {
            PrintProviderError(cnn1);
         }
         else
         {
            System.out.println("Exception: " + ae.getMessage());
         }
      }
      finally
      {
         // Cleanup objects before exit.
         if (cnn1 != null)
            if (cnn1.getState() == 1)
               cnn1.close();
      }

   }
   // PrintProviderError Function
   static void PrintProviderError(Connection cnn1)
   {
      // Print Provider Errors from Connection Object.
      // ErrItem is an item object in the Connections Errors Collection.
      com.ms.wfc.data.Error               ErrItem = null;
      long                                 nCount = 0;
      int                                       i = 0;

      nCount = cnn1.getErrors().getCount();

      // If there are any errors in the collection, print them.
      if ( nCount > 0)
      {
         // Collection ranges from 0 to 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 Function
   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");
   }
}
// EndVersionJ

Connection, objet | Version, propriété


Exemples de code ADO en Microsoft JScript

Utilisez les exemples de code ci-dessous pour apprendre à utiliser les méthodes, propriétés et événements ADO lorsque vous programmez en JScript.

Remarque Collez l'exemple de code dans sa totalité, du début à la fin, dans votre éditeur de code. L'exemple risque de ne pas fonctionner correctement si des copies partielles d'exemple sont utilisées ou si la mise en forme des paragraphes est perdue.

Méthodes

  • Exemple de méthode AddNew
  • Exemple de méthodes Append et CreateParameter
  • Exemple de méthodes Execute, Requery et Clear
  • Exemple de méthode Find
  • Exemple de méthode GetRows

Propriétés

  • Exemple de propriétés AbsolutePage, PageCount et PageSize
  • Exemple de propriétés AbsolutePosition et CursorLocation
  • Exemple de propriété ActiveCommand
  • Exemple de propriétés ActiveConnection, CommandText, CommandTimeout, CommandType, Size et Direction
  • Exemple de propriétés ActualSize et DefinedSize
  • Exemple de propriété CacheSize
  • Exemple de propriétés Filter et RecordCount

Voir aussi

Exemples de code ADO en Microsoft Visual Basic | Exemples de code ADO en Microsoft Visual Basic Scripting Edition | Exemples de code ADO en Microsoft Visual C++ | Exemples de code ADO en Microsoft Visual J++


Exemple de propriétés AbsolutePage, PageCount et PageSize (JScript)

Cet exemple utilise les propriétés AbsolutePage, PageCount et PageSize. Coupez et collez le code suivant dans le Bloc-notes ou dans un autre éditeur de texte, puis nommez-le AbsolutePageJS.asp.

<!-- BeginAbsolutePageJS -->
<%@LANGUAGE="JScript" %>
<%// use this meta tag instead of adojavas.inc%>
<!--METADATA TYPE="typelib" uuid="00000205-0000-0010-8000-00AA006D2EA4" -->

<html>

<head>
<title>AbsolutePage, PageSize, and PageSize Properties (JScript)</title>
<style>
<!--
BODY {
   font-family: 'Verdana','Arial','Helvetica',sans-serif;
   BACKGROUND-COLOR:white;
   COLOR:black;
    }
.thead2 {
   background-color: #800000;
   font-family: 'Verdana','Arial','Helvetica',sans-serif;
   font-size: x-small;
   color: white;
   }
.tbody {
   text-align: center;
   background-color: #f7efde;
   font-family: 'Verdana','Arial','Helvetica',sans-serif;
   font-size: x-small;
    }
-->
</style>
</head>

<body bgcolor="White">
<h1>AbsolutePage, PageSize, and PageSize Properties (JScript)</h1>
<%
    // connection and recordset variables
    var Cnxn = Server.CreateObject("ADODB.Connection")
    var strCnxn = "Provider='sqloledb';Data Source=" + Request.ServerVariables("SERVER_NAME") + ";" +
            "Initial Catalog='Northwind';Integrated Security='SSPI';";
    var rsEmployee = Server.CreateObject("ADODB.Recordset");
    // display variables
    var strMessage, iRecord, iPageCount;

    try
    {
        // open connection
        Cnxn.Open(strCnxn);

        // Open a recordset on the Employee table using
        // a client-side cursor to enable AbsolutePage property.
        rsEmployee.CursorLocation = adUseClient;
        rsEmployee.Open("employees", strCnxn, adOpenStatic, adLockOptimistic, adCmdTable);

        // Set PageSize to five to display names and hire dates of five employees at a time
        rsEmployee.PageSize = 5;
        iPageCount = rsEmployee.PageCount;

        // Write header information to the document
        Response.Write('<p align="center">There are ' + iPageCount);
        Response.Write(" pages, each containing ");
        Response.Write(rsEmployee.PageSize + " or fewer records.</p>");
        Response.Write('<table border="0" align="center">');
        Response.Write('<tr class="thead2">');
        Response.Write("<th>Page</th><th>Name</th><th>Hire Date</th></tr>");

        for (var i=1; i<=iPageCount; i++)
        {
            rsEmployee.AbsolutePage = i;

            for (iRecord = 1; iRecord <= rsEmployee.PageSize; iRecord++)
            {
                strMessage = "";

                    // Start a new table row.
                    strMessage = '<tr class="tbody">';

                    // First column in row contains page number on
                    // first record of each page. Otherwise, the column
                    // contains a non-breaking space.
                    if (iRecord == 1)
                        strMessage += "<td>Page " + i + " of " + rsEmployee.PageCount + "</td>"
                    else
                        strMessage += "<td>&nbsp;</td>";

                    // First and last name are in first column.
                    strMessage += "<TD>" + rsEmployee.Fields("FirstName") + " ";
                    strMessage += rsEmployee.Fields("LastName") + " " + "</td>";

                    // Hire date in second column.
                    strMessage += "<td>" + rsEmployee.Fields("HireDate") + "</td>";

                    // End the row.
                    strMessage += "</tr>";

                    // Write line to document.
                    Response.Write(strMessage);

                    // Get next record.
                    rsEmployee.MoveNext;

                    if (rsEmployee.EOF)
                        break;
            }
        }

        // Finish writing table.
        Response.Write("</table>");
    }
    catch (e)
    {
        Response.Write(e.message);
    }
    finally
    {
        // 'clean up
        if (rsEmployee.State == adStateOpen)
            rsEmployee.Close;
        if (Cnxn.State == adStateOpen)
            Cnxn.Close;
        rsEmployee = null;
        Cnxn = null;
    }
%>

</body>

</html>
<!-- EndAbsolutePageJS -->

Voir aussi

AbsolutePage, propriété | PageCount, propriété | PageSize, propriété | Recordset, objet


Exemple de propriétés AbsolutePosition et CursorLocation (JScript)

Cet exemple illustre comment la propriété AbsolutePosition peut suivre la progression d'une boucle énumérant tous les enregistrements d'un objet Recordset. Il utilise la propriété CursorLocation pour activer la propriété AbsolutePosition en sélectionnant le type de curseur côté client. Coupez et collez le code suivant dans le Bloc-notes ou dans un autre éditeur de texte, puis nommez-le AbsolutePositionJS.asp.

<!-- BeginAbsolutePositionJS -->
<%@LANGUAGE="JScript" %>
<%// use this meta tag instead of adojavas.inc%>
<!--METADATA TYPE="typelib" uuid="00000205-0000-0010-8000-00AA006D2EA4" -->

<html>

<head>
<title>AbsolutePosition and CursorLocation Properties Example (JScript)</title>
<style>
<!--
BODY {
   font-family: 'Verdana','Arial','Helvetica',sans-serif;
   BACKGROUND-COLOR:white;
   COLOR:black;
    }
.thead2 {
   background-color: #800000;
   font-family: 'Verdana','Arial','Helvetica',sans-serif;
   font-size: x-small;
   color: white;
   }
.tbody {
   text-align: center;
   background-color: #f7efde;
   font-family: 'Verdana','Arial','Helvetica',sans-serif;
   font-size: x-small;
    }
-->
</style>
</head>

<body>
<h1>AbsolutePosition and CursorLocation Properties Example (JScript)</h1>
<%
    // connection and recordset variables
    var strCnxn = "Provider='sqloledb';Data Source=" + Request.ServerVariables("SERVER_NAME") + ";" +
            "Initial Catalog='Northwind';Integrated Security='SSPI';";
    var rsEmployee = Server.CreateObject("ADODB.Recordset");
        // display string
    var strMessage;

    try
    {
        // Open a recordset on the Employee table using
        // a client-side cursor to enable AbsolutePosition property.
        rsEmployee.CursorLocation = adUseClient;
        rsEmployee.Open("employees", strCnxn, adOpenStatic, adLockOptimistic, adCmdTable);

        // Write beginning of table to the document.
        Response.Write('<table border="0" align="center">');
        Response.Write('<tr class="thead2">');
        Response.Write("<th>AbsolutePosition</th><th>Name</th><th>Hire Date</th></tr>");

        while (!rsEmployee.EOF)
        {
            strMessage = "";

            // Start a new table row.
            strMessage = '<tr class="tbody">';

            // First column in row contains AbsolutePosition value.
            strMessage += "<td>" + rsEmployee.AbsolutePosition + " of " + rsEmployee.RecordCount + "</td>"

            // First and last name are in first column.
            strMessage += "<td>" + rsEmployee.Fields("FirstName") + " ";
            strMessage += rsEmployee.Fields("LastName") + " " + "</td>";

            // Hire date in second column.
            strMessage += "<td>" + rsEmployee.Fields("HireDate") + "</td>";

            // End the row.
            strMessage += "</tr>";

            // Write line to document.
            Response.Write(strMessage);

            // Get next record.
            rsEmployee.MoveNext;
        }

        // Finish writing document.
        Response.Write("</table>");
    }
    catch (e)
    {
        Response.Write(e.message);
    }
    finally
    {
        // 'clean up
        if (rsEmployee.State == adStateOpen)
            rsEmployee.Close;
        rsEmployee = null;
    }
%>

</html>
<!-- EndAbsolutePositionJS -->

Voir aussi

AbsolutePosition, propriété | CursorLocation, propriété | Recordset, objet


Exemple de propriété ActiveCommand (JScript)

Cet exemple utilise la propriété ActiveCommand. Coupez et collez le code suivant dans le Bloc-notes ou dans un autre éditeur de texte, puis nommez-le ActiveCommandJS.asp.

<!-- BeginActiveCommandJS -->
<%@LANGUAGE="JScript" %>
<%// use this meta tag instead of adojavas.inc%>
<!--METADATA TYPE="typelib" uuid="00000205-0000-0010-8000-00AA006D2EA4" -->

<%
    // user input
    strName = new String(Request.Form("ContactName"))
%>

<html>

<head>
<title>ActiveCommand Property Example (JScript)</title>
<style>
<!--
BODY {
   font-family: 'Verdana','Arial','Helvetica',sans-serif;
   BACKGROUND-COLOR:white;
   COLOR:black;
    }
-->
</style>
</head>

<body bgcolor="White">

<h1>ActiveCommand Property Example (JScript)</h1>

<%
if (strName.length > 0)
    {
        // connection and recordset variables
        var Cnxn = Server.CreateObject("ADODB.Connection")
        var strCnxn = "Provider='sqloledb';Data Source=" + Request.ServerVariables("SERVER_NAME") + ";" +
            "Initial Catalog='Northwind';Integrated Security='SSPI';";
        var cmdContact = Server.CreateObject("ADODB.Command");
        var rsContact = Server.CreateObject("ADODB.Recordset");
        // display variables
        var strMessage;

        try
        {
            // open connection
            Cnxn.Open(strCnxn);

            // Open a recordset using a command object
            cmdContact.CommandText = "SELECT ContactName FROM Customers WHERE City = ?";
            cmdContact.ActiveConnection = Cnxn;
            // create parameter and insert variable value
            cmdContact.Parameters.Append(cmdContact.CreateParameter("ContactName", adChar, adParamInput, 30, strName));

            rsContact = cmdContact.Execute();

            while(!rsContact.EOF){
                // start new line
                strMessage = "<P>";

                // get data
                strMessage += rsContact("ContactName")

                // end the line
                strMessage += "</P>";

                // show data
                Response.Write(strMessage);

                // get next record
                rsContact.MoveNext;
            }
        }
        catch (e)
        {
            Response.Write(e.message);
        }
        finally
        {
            // 'clean up
            if (rsContact.State == adStateOpen)
                rsContact.Close;
            if (Cnxn.State == adStateOpen)
                Cnxn.Close;
            rsContact = null;
            Cnxn = null;
        }
    }
%>

<hr>

<form method="POST" action="ActiveCommandJS.asp">
  <p align="left">Enter city of customer to find (e.g., Paris): <input type="text" name="ContactName" size="40" value=""></p>
  <p align="left"><input type="submit" value="Submit" name="B1"><input type="reset" value="Reset" name="B2"></p>
</form>
</body>

</html>
<!-- EndActiveCommandJS -->

ActiveCommand, propriété | Command, objet | Recordset, objet


Exemple de propriétés ActiveConnection, CommandText, CommandTimeout, CommandType, Size et Direction (JScript)

Cet exemple utilise les propriétés ActiveConnection, CommandText, CommandTimeout, CommandType, Size et Direction pour exécuter une procédure stockée. Coupez et collez le code suivant dans le Bloc-notes ou dans un autre éditeur de texte, puis nommez-le ActiveConnectionJS.asp.

<!-- BeginActiveConnectionJS -->
<%@LANGUAGE="JScript"%>
<%// use this meta tag instead of adojavas.inc%>
<!--METADATA TYPE="typelib" uuid="00000205-0000-0010-8000-00AA006D2EA4" -->

<html>
<head>
    <title>ActiveConnection, CommandText, CommandTimeout, CommandType, Size, and Direction Properties</title>
<style>
<!--
BODY {
   font-family: 'Verdana','Arial','Helvetica',sans-serif;
   BACKGROUND-COLOR:white;
   COLOR:black;
    }
.thead {
   background-color: #008080;
   font-family: 'Verdana','Arial','Helvetica',sans-serif;
   font-size: x-small;
   color: white;
   }
.thead2 {
   background-color: #800000;
   font-family: 'Verdana','Arial','Helvetica',sans-serif;
   font-size: x-small;
   color: white;
   }
.tbody {
   text-align: center;
   background-color: #f7efde;
   font-family: 'Verdana','Arial','Helvetica',sans-serif;
   font-size: x-small;
    }
-->
</style>
</head>

<body bgcolor="White">

<%
    var iRoyalty = parseInt(Request.Form("RoyaltyValue"));
    // check user input

    if (iRoyalty > -1)
    {
            // connection and recordset variables
        var Cnxn = Server.CreateObject("ADODB.Connection")
        var strCnxn = "Provider='sqloledb';Data Source=" + Request.ServerVariables("SERVER_NAME") + ";" +
            "Initial Catalog='pubs';Integrated Security='SSPI';";
        var cmdByRoyalty = Server.CreateObject("ADODB.Command");
        var rsByRoyalty = Server.CreateObject("ADODB.Recordset");
        var rsAuthor = Server.CreateObject("ADODB.Recordset");
        // display variables
        var filter, strMessage;

        try
        {
            // open connection
            Cnxn.Open(strCnxn);

            cmdByRoyalty.CommandText = "byroyalty";
            cmdByRoyalty.CommandType = adCmdStoredProc;
            cmdByRoyalty.CommandTimeOut = 15;

            // The stored procedure called above is as follows:
                //    CREATE PROCEDURE byroyalty
                //  @percentage int
                //    AS
                //  SELECT au_id from titleauthor
                //  WHERE titleauthor.royaltyper = @percentage
                //  GO

            prmByRoyalty = Server.CreateObject("ADODB.Parameter");
            prmByRoyalty.Type = adInteger;
            prmByRoyalty.Size = 3;
            prmByRoyalty.Direction = adParamInput;
            prmByRoyalty.Value = iRoyalty;
            cmdByRoyalty.Parameters.Append(prmByRoyalty);

            cmdByRoyalty.ActiveConnection = Cnxn;

            // recordset by Command - Execute
            rsByRoyalty = cmdByRoyalty.Execute();

            // recordset by Recordset - Open
            rsAuthor.Open("Authors", Cnxn);

            while (!rsByRoyalty.EOF)
            {
                // set filter
                filter = "au_id='" + rsByRoyalty("au_id")
                rsAuthor.Filter = filter + "'";

                // start new line
                strMessage = "<P>";

                // get data
                strMessage += rsAuthor("au_fname") + " ";
                strMessage += rsAuthor("au_lname") + " ";

                // end line
                strMessage += "</P>";

                // show data
                Response.Write(strMessage);

                // get next record
                rsByRoyalty.MoveNext;
            }
        }
        catch (e)
        {
            Response.Write(e.message);
        }
        finally
        {
            // clean up
            if (rsByRoyalty.State == adStateOpen)
                rsByRoyalty.Close;
            if (rsAuthor.State == adStateOpen)
                rsAuthor.Close;
            if (Cnxn.State == adStateOpen)
                Cnxn.Close;
            rsByRoyalty = null;
            rsAuthor = null;
            Cnxn = null;
        }
    }
%>

<hr>

<form method="POST" action="ActiveConnectionJS.asp">
  <p align="left">Enter royalty percentage to find (e.g., 40): <input type="text" name="RoyaltyValue" size="5"></p>
  <p align="left"><input type="submit" value="Submit" name="B1"><input type="reset" value="Reset" name="B2"></p>
</form>
&nbsp;

</body>

</html>
<!-- EndActiveConnectionJS -->

Voir aussi

ActiveCommand, propriété | Command, objet | CommandText, propriété | CommandTimeout, propriété | CommandType, propriété | Connection, objet | Direction, propriété | Parameter, objet | Record, objet | Recordset, objet | Size, propriété


Exemple de propriétés ActualSize et DefinedSize (JScript)

Cet exemple utilise les propriétés ActualSize et DefinedSize pour afficher la taille définie et la taille réelle d'un champ. Coupez et collez le code suivant dans le Bloc-notes ou dans un autre éditeur de texte, puis nommez-le ActualSizeJS.asp.

<!-- BeginActualSizeJS -->
<%@LANGUAGE="JScript" %>
<%// use this meta tag instead of adojavas.inc%>
<!--METADATA TYPE="typelib" uuid="00000205-0000-0010-8000-00AA006D2EA4" -->
<html>

<head>
    <title>ActualSize and DefinedSize Properties Example (JScript)</title>
<style>
<!--
body {
   font-family: 'Verdana','Arial','Helvetica',sans-serif;
   BACKGROUND-COLOR:white;
   COLOR:black;
    }
.thead2 {
   background-color: #800000;
   font-family: 'Verdana','Arial','Helvetica',sans-serif;
   font-size: x-small;
   color: white;
   }
.tbody {
   text-align: center;
   background-color: #f7efde;
   font-family: 'Verdana','Arial','Helvetica',sans-serif;
   font-size: x-small;
    }
-->
</style>
</head>

<body bgcolor="White">

<h1>ADO ActualSize and DefinedSize Properties (JScript)</h1>
<%
    // connection and recordset variables
    var Cnxn = Server.CreateObject("ADODB.Connection")
    var strCnxn = "Provider='sqloledb';Data Source=" + Request.ServerVariables("SERVER_NAME") + ";" +
            "Initial Catalog='Northwind';Integrated Security='SSPI';";
    var rsSuppliers = Server.CreateObject("ADODB.Recordset");
    // display variables
    var fld, strMessage;

    try
    {
        // open connection
        Cnxn.Open(strCnxn);

        // Open a recordset on the stores table
        rsSuppliers.Open("Suppliers", strCnxn);

        // build table headers
        Response.Write("<table>");
        Response.Write('<tr class="thead2"><th>Field Value</th>');
        Response.Write("<th>Defined Size</th>");
        Response.Write("<th>Actual Size</th></tr>");

        while (!rsSuppliers.EOF)
        {
            // start a new line
            strMessage = '<tr class="tbody">';

            // Display the contents of the chosen field with
            // its defined size and actual size
            fld = rsSuppliers("CompanyName");
            strMessage += '<td align="left">' + fld.Value + "</td>"
            strMessage += "<td>" + fld.DefinedSize + "</td>";
            strMessage += "<td>" + fld.ActualSize + "</td>";

            // end the line
            strMessage += "</tr>";

            // display data
            Response.Write(strMessage);

            // get next record
            rsSuppliers.MoveNext;

        }
         // close the table
        Response.Write("</table>");
    }
    catch (e)
    {
        Response.Write(e.message);
    }
    finally
    {
        // clean up
        if (rsSuppliers.State == adStateOpen)
            rsSuppliers.Close;
        if (Cnxn.State == adStateOpen)
            Cnxn.Close;
        rsSuppliers = null;
        Cnxn = null;
    }
%>

</body>

</html>
<!-- EndActualSizeJS -->

Voir aussi

ActualSize, propriété | DefinedSize, propriété | Field, objet


Exemple de méthode AddNew (JScript)

Cet exemple utilise la méthode AddNew pour créer un enregistrement portant le nom indiqué. Coupez et collez le code suivant dans le Bloc-notes ou un autre éditeur de texte, puis enregistrez-le sous AddNewJS.asp.

<!-- BeginAddNewJS -->
<%@LANGUAGE="JScript" %>
<!-- Include file for JScript ADO Constants -->
<%// use this meta tag instead of adojavas.inc%>
<!--METADATA TYPE="typelib" uuid="00000205-0000-0010-8000-00AA006D2EA4" -->

<html>

<head>
    <title>Add New Method Example (JScript)</title>
<style>
<!--
body {
   font-family: 'Verdana','Arial','Helvetica',sans-serif;
   BACKGROUND-COLOR:white;
   COLOR:black;
    }
-->
</style>
</head>

<body>
<h1>AddNew Method Example (JScript)</h1>

<%
    if (Request.Form("Addit") == "AddNew")
    {
        // connection and recordset variables
        var Cnxn = Server.CreateObject("ADODB.Connection")
        var strCnxn = "Provider='sqloledb';Data Source=" + Request.ServerVariables("SERVER_NAME") + ";" +
            "Initial Catalog='Northwind';Integrated Security='SSPI';";
        var rsEmployee = Server.CreateObject("ADODB.Recordset");
        //record variables
        var FName = String(Request.Form("FirstName"));
        var LName = String(Request.Form("LastName"));

        try
        {
            // open connection
            Cnxn.Open(strCnxn)

            // open Employee recordset using client-side cursor
            rsEmployee.CursorLocation = adUseClient;
            rsEmployee.Open("Employees", strCnxn, adOpenKeyset, adLockOptimistic, adCmdTable);

            rsEmployee.AddNew();
            rsEmployee("FirstName") = FName;
            rsEmployee("LastName") = LName;
            rsEmployee.Update;

            // of course, you would normally do error handling here
            Response.Write("New record added.")
        }
        catch (e)
        {
            Response.Write(e.message);
        }
        finally
        {
            // clean up
            if (rsEmployee.State == adStateOpen)
                rsEmployee.Close;
            if (Cnxn.State == adStateOpen)
                Cnxn.Close;
            rsEmployee = null;
            Cnxn = null;
        }
    }
%>

<form method="post" action="AddNewJS.asp" id=form1 name=form1>
<table>
<tr>
    <td colspan="2">
    <h4>Please enter the record to add:</h4>
    </td>
</tr>
<tr>
    <td>
        First Name:
    </td>
    <td>
        <input name="FirstName" maxLength=20>
    </td>
</tr>
<tr>
    <td>
        Last Name:
    </td>
    <td>
        <input name="LastName" size="30" maxLength=30>
    </td>
</tr>
<tr>
    <td align="right">
        <input type="submit" value="Submit" name="Submit">
    </td>
    <TD align="left">
        <INPUT type="reset" value="Reset" name="Reset">
    </TD>
</tr>
</table>
<INPUT type="hidden" value="AddNew" name="Addit">
</form>
</body>
</HTML>
<!-- EndAddNewJS -->

AddNew, méthode | Recordset, objet


Exemple de méthodes Append et CreateParameter (JScript)

Cet exemple utilise les méthodes Append et CreateParameter pour exécuter une procédure stockée avec un paramètres d'entrée. Coupez et collez le code suivant dans le Bloc-notes ou un autre éditeur de texte, puis enregistrez-le sous AppendJS.asp.

<!-- BeginAppendJS -->
<%@LANGUAGE="JScript" %>
<%// use this meta tag instead of adojavas.inc%>
<!--METADATA TYPE="typelib" uuid="00000205-0000-0010-8000-00AA006D2EA4" -->

<html>
<head>
    <title>Append and CreateParameter Methods Example (JScript)</title>
<style>
<!--
body {
   font-family: 'Verdana','Arial','Helvetica',sans-serif;
   BACKGROUND-COLOR:white;
   COLOR:black;
    }
-->
</style>
</head>

<body>
<h1>Append and CreateParameter Methods Example (JScript)</h1>
<%
    // verify user-input
    var iRoyalty = parseInt(Request.Form("RoyaltyValue"));
    if (iRoyalty > -1)
    {

        // connection, recordset and command variables
        var strCnxn = "Provider='sqloledb';Data Source=" + Request.ServerVariables("SERVER_NAME") + ";" +
            "Initial Catalog='pubs';Integrated Security='SSPI';";
        var Cnxn = Server.CreateObject("ADODB.Connection");
        var cmdByRoyalty = Server.CreateObject("ADODB.Command");
        var rsByRoyalty = Server.CreateObject("ADODB.Recordset");
        var rsAuthor = Server.CreateObject("ADODB.Recordset");
        // display variables
        var strMessage;

        try
        {
            // open connection and set cursor location
            Cnxn.Open(strCnxn);
            Cnxn.CursorLocation = adUseClient;

            // command object initial parameters
            cmdByRoyalty.CommandText = "byroyalty";
            cmdByRoyalty.CommandType = adCmdStoredProc;

            // create the new parameter and append to
            // the Command object's parameters collection
            var prmByRoyalty = cmdByRoyalty.CreateParameter("percentage", adInteger, adParamInput);
            cmdByRoyalty.Parameters.Append(prmByRoyalty);
            prmByRoyalty.Value = iRoyalty;

            cmdByRoyalty.ActiveConnection = Cnxn;

            // execute command
            rsByRoyalty = cmdByRoyalty.Execute();

            // display results
            rsAuthor.Open("Authors", Cnxn);

            while (!rsByRoyalty.EOF)
            {
                rsAuthor.Filter = "au_id='" + rsByRoyalty.Fields("au_id") + "'";

                // start new line
                strMessage = "<P>";

                // recordset data
                strMessage += rsAuthor.Fields("au_fname") + " ";
                strMessage += rsAuthor.Fields("au_lname") + " ";

                // end the line
                strMessage += "</P>";

                // show result
                Response.Write(strMessage);

                // et next record
                rsByRoyalty.MoveNext;
            }
        }
        catch (e)
        {
            Response.Write(e.message);
        }
        finally
        {
            // clean up
            if (rsByRoyalty.State == adStateOpen)
                rsByRoyalty.Close;
            if (rsAuthor.State == adStateOpen)
                rsAuthor.Close;
            if (Cnxn.State == adStateOpen)
                Cnxn.Close;
            rsByRoyalty = null;
            rsAuthor = null;
            Cnxn = null;
        }
    }
%>

<hr>

<form method="POST" action="AppendJS.asp" id=form1 name=form1>
  <p align="left">Enter royalty percentage to find (e.g., 40): <input type="text" name="RoyaltyValue" size="5"></p>
  <p align="left"><input type="submit" value="Submit" name="B1"><input type="reset" value="Reset" name="B2"></p>
</form>
&nbsp;

</body>

</html>
<!-- EndAppendJS -->

Voir aussi

Append, méthode | CreateParameter, méthode | Field, objet | Fields, collection | Parameter, objet


Exemple de propriété CacheSize (JScript)

Cet exemple utilise la propriété CacheSize pour illustrer l'amélioration des performances lorsque 30 enregistrements sont mis en mémoire cache durant une opération. Coupez et collez le code suivant dans le Bloc-notes ou dans un autre éditeur de texte, puis nommez-le CacheSizeJS.asp.

<!-- BeginCacheSizeJS -->
<%@ Language="JScript" %>
<%// use this meta tag instead of adojavas.inc%>
<!--METADATA TYPE="typelib" uuid="00000205-0000-0010-8000-00AA006D2EA4" -->

<HTML>
<HEAD>
<title>CacheSize Property Example (JScript)</title>
<style>
<!--
body {
   font-family: 'Verdana','Arial','Helvetica',sans-serif;
   BACKGROUND-COLOR:white;
   COLOR:black;
    }
.thead2 {
   background-color: #800000;
   font-family: 'Verdana','Arial','Helvetica',sans-serif;
   font-size: x-small;
   color: white;
   }
.tbody {
   text-align: center;
   background-color: #f7efde;
   font-family: 'Verdana','Arial','Helvetica',sans-serif;
   font-size: x-small;
    }
-->
</style>
</HEAD>
<BODY>
<h1>CacheSize Property Example (JScript)</h1>
<%
    // connection and recordset variables
    var Cnxn = Server.CreateObject("ADODB.Connection")
    var strCnxn = "Provider='sqloledb';Data Source=" + Request.ServerVariables("SERVER_NAME") + ";" +
            "Initial Catalog='Northwind';Integrated Security='SSPI';";
    var rsCustomer = Server.CreateObject("ADODB.Recordset");
    // caching variables
    var Now = new Date();
    var Start = Now.getTime();
    var End, Cache, NoCache

    try
    {
        // open connection
        Cnxn.Open(strCnxn)

        // open a recordset on the Employee table using client-side cursor
        rsCustomer.CursorLocation = adUseClient;
        rsCustomer.Open("Customers", strCnxn);

        // loop through the recordset 20 times
        for (var i=1; i<=20; i++)
        {
            rsCustomer.MoveFirst();
            while (!rsCustomer.EOF)
            {
                // do something with the record
                var strTemp = new String(rsCustomer("CompanyName"));
                rsCustomer.MoveNext();
            }
        }

        Now = new Date();
        End = Now.getTime();
        NoCache = End - Start;

        // cache records in groups of 30
        rsCustomer.MoveFirst();
        rsCustomer.CacheSize = 30;

        Now = new Date();
        Start = Now.getTime();

        // loop through the recordset 20 times
        for (var i=1; i<=20; i++)
        {
            rsCustomer.MoveFirst();
            while (!rsCustomer.EOF)
            {
                // do something with the record
                var strTemp = new String(rsCustomer("CompanyName"));
                rsCustomer.MoveNext();
            }
        }

        Now = new Date();
        End = Now.getTime();
        var Cache = End - Start;
    }
    catch (e)
    {
        Response.Write(e.message);
    }
    finally
    {
        // clean up
        if (rsCustomer.State == adStateOpen)
            rsCustomer.Close;
        if (Cnxn.State == adStateOpen)
            Cnxn.Close;
        rsCustomer = null;
        Cnxn = null;
    }
%>

    <table border="2">
        <tr class="thead2">
            <th>No Cache</th>
            <th>30 Record Cache</th>
        </tr>
        <tr class="tbody">
            <td><%=NoCache%></td>
            <td><%=Cache%></td>
        </tr>
    </table>

</BODY>
</HTML>
<!-- EndCacheSizeJS -->

CacheSize, propriété | Recordset, objet


Exemple de méthodes Execute, Requery et Clear (JScript)

Exemples relatifs à ADO 2.5

Exemple de méthodes Execute, Requery et Clear (VBScript)

Cet exemple illustre l'utilisation de la méthode Execute lorsqu'elle est exécutée à partir d'un objet Command et d'un objet Connection. Il utilise également la méthode Requery pour extraire les données actuelles d'un objet Recordset, ainsi que la méthode Clear pour effacer le contenu de la collection Errors. (La collection Errors est accessible via l'objet Connection de la propriété ActiveConnection de Recordset.) Nommez le fichier ExecuteJS.asp.

<!-- BeginExecuteJS -->
<%@LANGUAGE="JScript"%>
<%// use this meta tag instead of adojavas.inc%>
<!--METADATA TYPE="typelib" uuid="00000205-0000-0010-8000-00AA006D2EA4" -->

<%
    strLastName = new String(Request.Form("AuthorLName"));

    if (strLastName.indexOf("undefined") > -1)
        strLastName = "";
%>

<html>

<head>
<title>Execute, Requery and Clear Methods Example (JScript)</title>
<style>
<!--
BODY {
   font-family: 'Verdana','Arial','Helvetica',sans-serif;
   BACKGROUND-COLOR:white;
   COLOR:black;
    }
-->
</style>
</head>

<body bgcolor="White">
<h1>Execute, Requery and Clear Methods Example (JScript)</h1>
<%
    if (strLastName.length > 0)
    {
        // command and recordset variables
        var Connect = "Provider='sqloledb';Data Source=" + Request.ServerVariables("SERVER_NAME") + ";" +
            "Initial Catalog='pubs';Integrated Security='SSPI';";
        var Cnxn = Server.CreateObject("ADODB.Connection");
        var cmdAuthor = Server.CreateObject("ADODB.Command");
        var rsAuthor = Server.CreateObject("ADODB.Recordset");
        var rsAuthor2 = Server.CreateObject("ADODB.Recordset");
        var SQLAuthor2, strMessage, strMessage2;
        var Err, ErrCount;

        try
        {
            // open connection
            Cnxn.Open(Connect);

            // command object parameters
            cmdAuthor.CommandText = "SELECT * FROM Authors WHERE au_lname = ?";
            cmdAuthor.Parameters.Append(cmdAuthor.CreateParameter("Last Name", adChar, adParamInput, 20, strLastName));
            cmdAuthor.ActiveConnection = Cnxn;

            // recordset from command.execute
            rsAuthor = cmdAuthor.Execute();

            // recordset from connection.execute
            SQLAuthor2 = "SELECT * FROM Authors";
            rsAuthor2 = Cnxn.Execute(SQLAuthor2);

                // check for errors
                ErrCount = Cnxn.errors.count;
                if(ErrCount !== 0) //write the errors
                {
                    for(Err = 0; Err = ErrCount; Err++){
                        Err = Cnxn.errors.item;
                        Response.Write(Err);
                    }
                    // clean out any existing errors
                    Cnxn.Errors.Clear;
                }

                // show the data
            Response.Write("<HR><HR>");

                // first recordset
            Response.Write("<b>Command.Execute results</b>")
            while (!rsAuthor.EOF)
            {
                // build output string by starting a new line
                strMessage = "<P>";
                strMessage += "<br>";

                // recordset data
                strMessage += rsAuthor("au_fname") + " ";
                strMessage += rsAuthor("au_lname") + " ";

                // end the line
                strMessage += "</P>";

                // show the results
                Response.Write(strMessage);

                // get next record
                rsAuthor.MoveNext;
            }

            Response.Write("<HR><HR>");

            // second recordset
            Response.Write("<b>Connection.Execute results</b>")
            while (!rsAuthor2.EOF)
            {
                // start a new line
                strMessage2 = "<P>";

                // first and last name are in first column
                strMessage2 += rsAuthor2("au_fname") + " "
                strMessage2 += rsAuthor2("au_lname") + " ";

                // end the line
                strMessage2 += "</P>";

                // show results
                Response.Write(strMessage2);

                // get next record
                rsAuthor2.MoveNext;
            }
        }
        catch (e)
        {
            Response.Write(e.message);
        }
        finally
        {
            // clean up
            if (rsAuthor.State == adStateOpen)
                rsAuthor.Close;
            if (rsAuthor2.State == adStateOpen)
                rsAuthor2.Close;
            if (Cnxn.State == adStateOpen)
                Cnxn.Close;
            rsAuthor1 = null;
            rsAuthor2 = null;
            Cnxn = null;
        }
    }
%>

<hr>

<form method="POST" action="ExecuteJS.asp" id=form1 name=form1>
  <p align="left">Enter last name of author to find (e.g., Ringer): <input type="text" name="AuthorLName" size="40"></p>
  <p align="left"><input type="submit" value="Submit" name="B1"><input type="reset" value="Reset" name="B2"></p>
</form>
</body>

</html>
<!-- EndExecuteJS -->

Voir aussi

Clear, méthode | Command, objet | Connection, objet | Error, objet | Execute, méthode (objet ADO Command) | Execute, méthode (objet ADO Connection) | Recordset, objet | Requery, méthode


Exemple de propriétés Filter et RecordCount (JScript)

Cet exemple ouvre un objet Recordset sur la table Companies de la base de données Northwind, puis utilise la propriété Filter pour limiter les enregistrements visibles à ceux pour lesquels le champ CompanyName commence par la lettre D. Coupez et collez le code suivant dans le Bloc-notes ou dans un autre éditeur de texte, puis nommez-le FilterJS.asp.

<!-- BeginFilterJS -->
<%@  Language=JavaScript %>
<%// use this meta tag instead of adojavas.inc%>
<!--METADATA TYPE="typelib" uuid="00000205-0000-0010-8000-00AA006D2EA4" -->

<html>

<head>
<title>ADO Recordset.Filter Example</title>
<style>
<!--
BODY {
   font-family: 'Verdana','Arial','Helvetica',sans-serif;
   BACKGROUND-COLOR:white;
   COLOR:black;
    }
.thead {
   background-color: #008080;
   font-family: 'Verdana','Arial','Helvetica',sans-serif;
   font-size: x-small;
   color: white;
   }
.thead2 {
   background-color: #800000;
   font-family: 'Verdana','Arial','Helvetica',sans-serif;
   font-size: x-small;
   color: white;
   }
.tbody {
   text-align: center;
   background-color: #f7efde;
   font-family: 'Verdana','Arial','Helvetica',sans-serif;
   font-size: x-small;
    }
-->
</style>
</head>

<body bgcolor="White">

<h1>ADO Recordset.Filter Example</h1>
<!-- Page text goes here -->
<%
    // connection and recordset variables
    var Cnxn = Server.CreateObject("ADODB.Connection")
    var strCnxn = "Provider='sqloledb';Data Source=" + Request.ServerVariables("SERVER_NAME") + ";" +
            "Initial Catalog='Northwind';Integrated Security='SSPI';";
    var rsCustomers = Server.CreateObject("ADODB.Recordset");
    var SQLCustomers = "select * from Customers;";
    // record variables
    var fld, filter
    var showBlank = " ";
    var showNull = "-NULL-";

    try
    {
        //open connection
        Cnxn.Open(strCnxn);

        // create recordset client-side using object refs
        rsCustomers.ActiveConnection = Cnxn;
        rsCustomers.CursorLocation = adUseClient;
        rsCustomers.CursorType = adOpenKeyset;
        rsCustomers.LockType = adLockOptimistic;
        rsCustomers.Source = SQLCustomers;
        rsCustomers.Open();

        rsCustomers.MoveFirst();

        //set filter
        filter = "CompanyName LIKE 'b*'";
        rsCustomers.Filter = filter

        if (rsCustomers.RecordCount == 0) {
            Response.Write("No records matched ");
            Response.Write (SQLCustomers + "So cannot make table...");
            Cnxn.Close();
            Response.End
        }
        else {
        // show the data
            Response.Write('<table width="100%" border="2">');
            while(!rsCustomers.EOF) {
                Response.Write('<tr class="tbody">');
                for (var thisField = 0; thisField < rsCustomers.Fields.Count; thisField++) {
                    fld = rsCustomers(thisField);
                    fldValue = fld.Value;
                    if (fldValue == null)
                        fldValue = showNull;
                    if (fldValue == "")
                        thisField=showBlank;
                    Response.Write("<td>" + fldValue + "</td>")
                }
                rsCustomers.MoveNext();
                Response.Write("</tr>");
            }
            // close the table
            Response.Write("</table>");
        }
    }
    catch (e)
    {
        Response.Write(e.message);
    }
    finally
    {
        // clean up
        if (rsCustomers.State == adStateOpen)
            rsCustomers.Close;
        if (Cnxn.State == adStateOpen)
            Cnxn.Close;
        rsCustomers = null;
        Cnxn = null;
    }
%>

</body>

</html>
<!-- EndFilterJS -->

Voir aussi

Filter, propriété | RecordCount, propriété | Recordset, objet


Exemple de méthode Find (JScript)

Cet exemple utilise la méthode Find de l'objet Recordset pour localiser et afficher les sociétés de la base de données Les Comptoirs dont le nom commence par la lettre G. Coupez et collez le code suivant dans le Bloc-notes ou un autre éditeur de texte, puis enregistrez-le sous FindJS.asp.

<!-- BeginFindJS -->
<%@  Language=JavaScript %>
<%// use this meta tag instead of adojavas.inc%>
<!--METADATA TYPE="typelib" uuid="00000205-0000-0010-8000-00AA006D2EA4" -->

<html>

<head>
<title>ADO Recordset.Find Example</title>
<style>
<!--
BODY {
   font-family: 'Verdana','Arial','Helvetica',sans-serif;
   BACKGROUND-COLOR:white;
   COLOR:black;
    }
.thead {
   background-color: #008080;
   font-family: 'Verdana','Arial','Helvetica',sans-serif;
   font-size: x-small;
   color: white;
   }
.thead2 {
   background-color: #800000;
   font-family: 'Verdana','Arial','Helvetica',sans-serif;
   font-size: x-small;
   color: white;
   }
.tbody {
   text-align: center;
   background-color: #f7efde;
   font-family: 'Verdana','Arial','Helvetica',sans-serif;
   font-size: x-small;
    }
-->
</style>
</head>

<body bgcolor="white">

<h1>ADO Recordset.Find Example</h1>
<%
    // connection and recordset variables
    var Cnxn = Server.CreateObject("ADODB.Connection");
    var strCnxn = "Provider='sqloledb';Data Source=" + Request.ServerVariables("SERVER_NAME") + ";" +
            "Initial Catalog='Northwind';Integrated Security='SSPI';";
    var rsCustomers = Server.CreateObject("ADODB.Recordset");
        // display string
    var strMessage;
    var strFind;

    try
    {
            // open connection
        Cnxn.Open(strCnxn);

            //create recordset using object refs
        SQLCustomers = "select * from Customers;";

        rsCustomers.ActiveConnection = Cnxn;
        rsCustomers.CursorLocation = adUseClient;
        rsCustomers.CursorType = adOpenKeyset;
        rsCustomers.LockType = adLockOptimistic;
        rsCustomers.Source = SQLCustomers;

        rsCustomers.Open();
        rsCustomers.MoveFirst();

            //find criteria
        strFind = "CompanyName like 'g%'"
        rsCustomers.Find(strFind);

        if (rsCustomers.EOF) {
            Response.Write("No records matched ");
            Response.Write(SQLCustomers & "So cannot make table...");
            Cnxn.Close();
            Response.End();
        }
        else {
            Response.Write('<table width="100%" border="2">');
            Response.Write('<tr class="thead2">');
            // Put Headings On The Table for each Field Name
            for (thisField = 0; thisField < rsCustomers.Fields.Count; thisField++) {
                fieldObject = rsCustomers.Fields(thisField);
                Response.Write('<th width="' + Math.floor(100 / rsCustomers.Fields.Count) + '%">' + fieldObject.Name + "</th>");
            }
            Response.Write("</tr>");

            while (!rsCustomers.EOF) {
                Response.Write('<tr class="tbody">');
                for(thisField=0; thisField<rsCustomers.Fields.Count; thisField++) {
                    fieldObject = rsCustomers.Fields(thisField);
                    strField = fieldObject.Value;
                    if (strField == null)
                        strField = "-Null-";
                    if (strField == "")
                        strField = "";
                    Response.Write("<td>" + strField + "</td>");
                }
                rsCustomers.Find(strFind, 1, adSearchForward)
                Response.Write("</tr>");
            }
            Response.Write("</table>");
        }
    }
    catch (e)
    {
        Response.Write(e.message);
    }
    finally
    {
        // clean up
        if (rsCustomers.State == adStateOpen)
            rsCustomers.Close;
        if (Cnxn.State == adStateOpen)
            Cnxn.Close;
        rsCustomers = null;
        Cnxn = null;
    }
%>

</body>

</html>
<!-- EndFindJS -->

Find, méthode | Recordset, objet


Exemple de méthode GetRows (JScript)

Cet exemple utilise la méthode GetRows pour extraire toutes les lignes de la table Customers d'un objet Recordset et remplir un tableau avec les données obtenues. La méthode GetRows renvoie un nombre inférieur de lignes à celui désiré dans deux cas : EOF a été atteint ou GetRows a essayé d'extraire un enregistrement supprimé par un autre utilisateur. La fonction renvoie False uniquement dans le second cas. Coupez et collez le code suivant dans le Bloc-notes ou un autre éditeur de texte, puis enregistrez-le sous GetRowsJS.asp.

<!-- BeginGetRowsJS -->
<%@ LANGUAGE="JScript" %>
<%// use this meta tag instead of adojavas.inc%>
<!--METADATA TYPE="typelib" uuid="00000205-0000-0010-8000-00AA006D2EA4" -->

<html>

<head>
<title>ADO Recordset.GetRows Example (JScript)</title>
<style>
<!--
BODY {
   font-family: 'Verdana','Arial','Helvetica',sans-serif;
   BACKGROUND-COLOR:white;
   COLOR:black;
    }
.thead {
   background-color: #008080;
   font-family: 'Verdana','Arial','Helvetica',sans-serif;
   font-size: x-small;
   color: white;
   }
.thead2 {
   background-color: #800000;
   font-family: 'Verdana','Arial','Helvetica',sans-serif;
   font-size: x-small;
   color: white;
   }
.tbody {
   text-align: center;
   background-color: #f7efde;
   font-family: 'Verdana','Arial','Helvetica',sans-serif;
   font-size: x-small;
    }
-->
</style>
</head>

<body bgcolor="white">

<h1>ADO Recordset.GetRows Example (JScript)</h1>
    <!-- Page text goes here -->
<%
        var Connect = "Provider='sqloledb';Data Source=" + Request.ServerVariables("SERVER_NAME") + ";" +
            "Initial Catalog='Northwind';Integrated Security='SSPI';";
    var mySQL = "select * from customers;";
    var showblank = " ";
    var shownull = "-null-";

    var connTemp = Server.CreateObject("ADODB.Connection");

    try
    {
        connTemp.Open(Connect);
        var rsTemp = Server.CreateObject("ADODB.Recordset");
        rsTemp.ActiveConnection = connTemp;
        rsTemp.CursorLocation = adUseClient;
        rsTemp.CursorType = adOpenKeyset;
        rsTemp.LockType = adLockOptimistic;
        rsTemp.Open(mySQL);

        rsTemp.MoveFirst();

        if (rsTemp.RecordCount == 0)
        {
            Response.Write("No records matched ");
            Response.Write (mySQL & "So cannot make table...");
            connTemp.Close();
            Response.End();
        } else
        {
            Response.Write('<table width="100%" border="2">');
            Response.Write('<tr class="thead2">');

            //  Headings On The Table for each Field Name
            for (var i=0; i<rsTemp.Fields.Count; i++)
            {
                fieldObject = rsTemp.fields(i);
                Response.Write('<td width="' + Math.floor(100 / rsTemp.Fields.Count) + '%">' + fieldObject.name + "</td>");
            }

            Response.Write("</tr>");

            // JScript doesn't support multi-dimensional arrays
            // so we'll convert the returned array to a single
            // dimensional JScript array and then display the data.
            tempArray = rsTemp.GetRows();
            recArray = tempArray.toArray();

            var col = 1;
            var maxCols = rsTemp.Fields.Count;

            for (var thisField=0; thisField<recArray.length; thisField++)
            {
                if (col == 1)
                    Response.Write('<tr class="tbody">');
                if (recArray[thisField] == null)
                        recArray[thisField] = shownull;
                if (recArray[thisField] == "")
                        recArray[thisField] = showblank;
                Response.Write("<td>" + recArray[thisField] + "</td>");
                col++
                if (col > maxCols)
                {
                    Response.Write("</tr>");
                    col = 1;
                }
            }
            Response.Write("</table>");
        }
    }
    catch (e)
    {
        Response.Write(e.message);
    }
    finally
    {
        // clean up
        if (rsTemp.State == adStateOpen)
            rsTemp.Close;
        if (connTemp.State == adStateOpen)
            connTemp.Close;
        rsTemp = null;
        connTemp = null;
    }
%>

</body>

</html>
<!-- EndGetRowsJS -->

GetRows, méthode | Recordset, objet


Guide de référence de l'API RDS

Cette section de la documentation ADO contient des rubriques sur chaque objet, propriété, méthode et événement RDS. Pour plus d'informations, recherchez une rubrique particulière dans l'index ou consultez les rubriques suivantes :

  • Objets RDS
  • Propriétés RDS
  • Méthodes RDS
  • Événements RDS


Objets RDS

DataControl (RDS) | Relie un objet Recordset de requête de données à un ou plusieurs contrôles (par exemple une zone de texte, un contrôle Grid, une zone de liste modifiable) pour afficher les données de Recordset sur une page Web.
DataFactory (RDSServer) | Implémente des méthodes qui fournissent l'accès aux données en lecture/écriture à des sources de données spécifiées concernant des applications côté client.
DataSpace (RDS) | Crée des proxy côté client vers des objets Business personnalisés situés au niveau intermédiaire.


DataControl, objet (RDS)

Relie un objet Recordset de requête de données à un ou plusieurs contrôles (par exemple une zone de texte, un contrôle Grid, une zone de liste modifiable) pour afficher les données du Recordset sur une page Web.

Syntaxe

<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>

Remarques

L'ID de classe de l'objet RDS.DataControl est BD96C556-65A3-11D0-983A-00C04FC29E33.

Remarque Si vous rencontrez une erreur indiquant qu'un objet RDS.DataSpace ou RDS.DataControl ne se charge pas, vérifiez que vous utilisez l'ID de classe correct. En effet les ID de classe de ces objets ont changé entre les versions 1.0 et 1.1.

Dans un scénario de base, il vous suffit de définir les propriétés SQL, Connect et Server de l'objet RDS.DataControl qui appellent automatiquement l'objet Business par défaut : RDSServer.DataFactory.

Toutes les propriétés de l'objet RDS.DataControl sont facultatives car les objets Business personnalisés peuvent remplacer leurs fonctionnalités.

Remarque Si vous interrogez la base de données pour obtenir plusieurs résultats, seul le premier Recordset est renvoyé. Si vous avez besoin de plusieurs ensembles de résultats, affectez chacun à son propre objet DataControl. Voici un exemple de requête qui attend plusieurs résultats :
"Select * from Authors, Select * from Topics"

En ajoutant « DFMode=20 » à votre chaîne de connexion lorsque vous utilisez l'objet RDS.DataControl, vous pouvez améliorer considérablement les performances de votre serveur lors de la mise à jour des données. Grâce à ce paramètre, l'objet RDSServer.DataFactory résidant sur le serveur utilise un mode qui exige moins de ressources. Toutefois, les fonctionnalités suivantes ne sont pas disponibles dans cette configuration :

  • Utilisation de requêtes paramétrées.
  • Obtention d'informations sur les paramètres ou les colonnes avant l'appel de la méthode Execute.
  • Affectation de la valeur True à Transact Updates.
  • Obtention de l'état des lignes.
  • Appel de la méthode Resync.
  • Actualisation (explicite ou automatique) à l'aide de la propriété Update Resync.
  • Définition des propriétés d'un objet Command ou Recordset.
  • Utilisation de adCmdTableDirect.

Par défaut, l'objet RDS.DataControl s'exécute en mode asynchrone. Si vous avez besoin d'une exécution synchrone pour votre application, affectez au paramètre ExecuteOptions la valeur adcExecSync et au paramètre FetchOptions la valeur adcFetchUpFront, comme dans l'exemple suivant :

<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="1">
   <PARAM NAME="FetchOptions" VALUE="1">
</OBJECT>

Utilisez un seul objet RDS.DataControl pour lier les résultats d'une même requête à un ou plusieurs contrôles visuels. Par exemple, supposez que vous formulez une requête pour obtenir des données relatives aux clients, telles que leur nom, adresse, lieu de naissance, âge et état de priorité. Vous pouvez utiliser un objet RDS.DataControl unique pour afficher le nom, l'âge et l'adresse d'un client dans trois zones de texte différentes, son état de priorité dans une case à cocher et l'ensemble des informations dans un contrôle Grid.

Utilisez plusieurs objets RDS.DataControl pour lier les résultats de plusieurs requêtes à différents contrôles visuels. Par exemple, vous pouvez utiliser une requête pour rechercher des informations sur un client et un second type de requête pour obtenir des informations sur les produits achetés par ce client. Vous pouvez afficher les résultats de la première requête dans trois zones de texte différentes et une case à cocher, et d'autre part, afficher les résultats de la seconde requête dans un contrôle Grid. Si vous utilisez l'objet Business par défaut (RDSServer.DataFactory), vous devez procéder comme suit :

  • Ajoutez deux objets RDS.DataControl à votre page Web.
  • Écrivez deux requêtes, une pour chaque propriété SQL des deux objets RDS.DataControl. L'un des objets RDS.DataControl contiendra une requête SQL pour obtenir des informations sur le client, le second contiendra une requête pour obtenir la liste des marchandises achetées par le client.
  • Dans chaque balise OBJECT des contrôles dépendants, définissez la valeur DATAFLD pour établir les valeurs des données que vous voulez afficher dans chaque contrôle visuel.

Une page Web peut contenir un nombre illimité d'objets RDS.DataControl incorporés à l'aide de balises OBJECT.

Lorsque vous définissez un objet RDS.DataControl dans une page Web, utilisez des valeurs Height et Width non nulles, par exemple 1 (pour éviter l'ajout d'espace supplémentaire).

Les composants clients de Remote Data Service sont inclus lors de l'installation d'Internet Explorer 4.0 ; il n'est par conséquent pas nécessaire d'inclure un paramètre CODEBASE dans la balise de votre objet RDS.DataControl.

Internet Explorer 4.0 et les versions ultérieures permettent de lier des données à l'aide de contrôles HTML et de contrôles ActiveX® à condition que ceux-ci soient marqués en tant que contrôles à ordonnancement cloisonné.

Utilisateurs de Microsoft Visual Basic Les objets RDS.DataControl sont utilisés uniquement dans les applications Web. Ils ne sont pas nécessaires dans les applications clientes de Visual Basic.

Voir aussi

Exemple VBScript

Propriétés, méthodes et événements


Propriétés, méthodes et événements

Référence de l'API RDS 2.5

Propriétés, méthodes et événements de l'objet DataControl (RDS)

Propriétés

Connect, propriété (RDS)

ExecuteOptions, propriété (RDS)

FetchOptions, propriété (RDS)

FilterColumn, propriété (RDS)

FilterCriterion, propriété (RDS)

FilterValue, propriété (RDS)

Handler, propriété (RDS)

InternetTimeout, propriété (RDS)

ReadyState, propriété (RDS)

Recordset, SourceRecordset, propriétés (RDS)

Server, propriété (RDS)

SortColumn, propriété (RDS)

SortDirection, propriété (RDS)

SQL, propriété (RDS)

URL, propriété (RDS)

Méthodes

Cancel, méthode (RDS)

CancelUpdate, méthode (RDS)

CreateRecordset, méthode (RDS)

MoveFirst, MoveLast, MoveNext et MovePrevious, méthodes (RDS)

Refresh, méthode (RDS)

Reset, méthode (RDS)

SubmitChanges, méthode (RDS)

Événements

OnError, événement

OnReadyStateChange, événement

Voir aussi

S'applique à : DataControl, objet (RDS)


DataFactory, objet (RDSServer)

Cet objet Business côté serveur par défaut implémente des méthodes permettant l'accès en lecture/écriture aux données des sources de données spécifiées pour les applications côté client.

Remarques

L'objet RDSServer.DataFactory est conçu comme un objet Automation côté serveur qui reçoit les demandes clientes. Dans une application Internet, il réside sur un serveur Web et est instancié par le composant ADISAPI. L'objet RDSServer.DataFactory permet l'accès en lecture/écriture aux sources de données spécifiées, mais il ne comporte aucune logique de validation ni de logique professionnelle.

Si vous utilisez une méthode qui est disponible à la fois dans les objets RDSServer.DataFactory et RDS.DataControl, RDS (Remote Data Service) utilise par défaut la version RDS.DataControl. L'option par défaut suppose un scénario de programmation de base où l'objet RDSServer.DataFactory sert d'objet Business côté serveur générique.

Si vous voulez que votre application Web puisse gérer un traitement côté serveur spécifique pour chaque tâche, vous pouvez remplacer l'objet RDSServer.DataFactory par un objet Business personnalisé.

Vous avez la possibilité de créer des objets Business côté serveur qui appellent les méthodes de RDSServer.DataFactory telles que Query et CreateRecordset. Ceci est utile si vous voulez ajouter des fonctionnalités à vos objets Business tout en tirant parti de la technologie existante de Remote Data Service.

L'ID de classe de l'objet RDSServer.DataFactory est 9381D8F5-0288-11D0-9501-00AA00B911A5.

Voir aussi

Exemple VBScript

Propriétés, méthodes et événements


Propriétés, méthodes et événements

Référence de l'API RDS 2.5

Propriétés, méthodes et événements de l'objet DataFactory (RDSServer)

Propriétés

Aucune.

Méthodes

ConvertToString, méthode (RDS) | Convertit un jeu d'enregistrements en chaîne MIME64.
CreateRecordset, méthode (RDS) | Crée et renvoie un jeu d'enregistremenst vide.
Query, méthode (RDS) | Exécute la requête et crée un ensemble de lignes avancé.
SubmitChanges, méthode (RDS) | Dans un jeu d'enregistrements donné avec des modifications en attente, cette méthode soumet les modifications à la base de données identifiée dans la chaîne de connexion.

Événements

Aucun.

Voir aussi

S'applique à : DataFactory, objet (RDSServer)

© 1998-2002 Microsoft Corporation. Tous droits réservés.


DataSpace, objet (RDS)

Crée des proxies côté client vers des objets Business personnalisés situés au niveau intermédiaire.

Remarques

Remote Data Service requiert des proxies d'objets Business pour que les composants côté client soient en mesure de communiquer avec les objets Business du niveau intermédiaire. Les proxies facilitent l'empaquetage, le dépaquetage et le transport (marshaling) des données Recordset de l'application dans plusieurs processus ou sur plusieurs ordinateurs.

Remote Data Service utilise la méthode CreateObject de l'objet RDS.DataSpace pour créer des proxies d'objets Business. Le proxy d'un objet Business est créé de façon dynamique chaque fois qu'une occurrence de l'objet Business correspondant au niveau intermédiaire est créée. Remote Data Service prend en charge les protocoles suivants : HTTP, HTTPS (HTTP Secure Sockets), DCOM et « and in-process » (les composants clients et l'objet Business résident sur le même ordinateur).

Remarque RDS adopte un comportement « sans état » lorsque l'objet RDS.DataSpace utilise le protocole HTTP ou HTTPS. Autrement dit, toutes les informations internes sur une demande cliente sont supprimées une fois que le serveur a renvoyé une réponse.
Bien que l'objet Business semble exister pendant toute la durée de vie du proxy d'objet Business, il n'existe en réalité que jusqu'à l'envoi d'une réponse à une demande. Lorsqu'une demande est émise (c'est-à-dire qu'une méthode est invoquée sur l'objet Business), le proxy ouvre une nouvelle connexion au serveur et ce dernier crée une nouvelle instance de l'objet Business. Une fois que l'objet Business a répondu à la demande, le serveur le détruit et ferme la connexion.
Ce mécanisme implique que vous ne pouvez pas passer des données d'une demande à une autre en utilisant une propriété ou une variable d'objet Business. Vous devez recourir à d'autres moyens, par exemple un fichier ou un argument de méthode, pour rendre permanentes les données d'état.

L'ID de classe de l'objet RDS.DataSpace est BD96C556-65A3-11D0-983A-00C04FC29E36.

Voir aussi

Exemple VBScript

Propriétés, méthodes et événements


Propriétés, méthodes et événements

Référence de l'API RDS 2.5

Propriétés, méthodes et événements de l'objet DataSpace (RDS)

Propriétés

InternetTimeout, propriété (RDS)

Méthodes

CreateObject, méthode (RDS)

Événements

Aucun.

Voir aussi

S'applique à : DataSpace, objet (RDS)


Propriétés RDS

Connect (RDS) | Indique le nom de la base de données qui fera l'objet des opérations de requête et de mise à jour.
ExecuteOptions (RDS) | Indique si l'exécution asynchrone est activée.
FetchOptions (RDS) | Indique le type de recherche asynchrone.
FilterColumn (RDS) | Indique la colonne à laquelle appliquer le critère de filtre.
FilterCriterion (RDS) | Indique l'opérateur d'évaluation à utiliser dans la valeur du filtre.
FilterValue (RDS) | Indique la valeur de référence pour le filtrage des enregistrements.
Handler (RDS) | Indique le nom d'un programme de personnalisation côté serveur (gestionnaire) qui étend la fonctionnalité de RDSServer.DataFactory et tout paramètre utilisé par le gestionnaire.
InternetTimeout (RDS) | Indique le délai à respecter, en millisecondes, avant d'interrompre une requête.
ReadyState (RDS) | Indique la progression d'un objet DataControl qui récupère des données dans son objet Recordset.
Recordset et SourceRecordset (RDS) | Indique l'objet Recordset renvoyé à partir d'un objet Business personnalisé.
Server (RDS) | Indique le nom et le protocole de communication des services Internet (IIS).
SortColumn (RDS) | Indique la colonne selon laquelle trier les enregistrements.
SortDirection (RDS) | Indique si l'ordre de tri est croissant ou décroissant.
SQL (RDS) | Indique la chaîne de requête utilisée pour extraire l'objet Recordset.
URL (RDS) | Indique une chaîne qui contient une URL relative ou absolue.


Connect, propriété (RDS)

Indique le nom de la base de données qui fera l'objet des opérations de requête et de mise à jour.

Vous pouvez définir la propriété Connect au moment de la création dans les balises OBJECT de l'objet RDS.DataControl ou au moment de l'exécution dans le code de script (VBScript par exemple).

Syntaxe

Design time: <PARAM NAME="Connect" VALUE="ConnectionString">
Run time: DataControl.Connect = "ConnectionString"

Paramètres

ConnectionString
Chaîne de connexion valide. Pour plus d'informations d'ordre général sur les chaînes de connexion, consultez la propriété ConnectionString ou la documentation de votre fournisseur de données.
Remarque Si vous spécifiez MS Remote comme fournisseur pour RDS.DataControl, un scénario à quatre niveaux est créé. Les scénarios à plus de trois niveaux n'ont pas été testés et ne devraient pas être nécessaires.
DataControl
Variable objet qui représente un objet RDS.DataControl.

Voir aussi

Exemple VBScript

Query, méthode (RDS) | Refresh, méthode (RDS) | SubmitChanges, méthode (RDS)

S'applique à : DataControl, objet (RDS)


ExecuteOptions, propriété (RDS)

Indique si l'exécution asynchrone est activée.

Paramètres et valeurs renvoyées

Définit ou renvoie l'une des valeurs suivantes.

Constante | Description
adcExecSync | Exécute l'actualisation suivante de l'objet Recordset en mode synchrone.
adcExecAsync | Valeur par défaut. Exécute l'actualisation suivante de l'objet Recordset en mode asynchrone.
Remarque Chaque fichier exécutable côté client qui utilise ces constantes doit fournir les déclarations correspondantes. Vous pouvez couper et coller les déclarations de constantes dont vous avez besoin à partir du fichier Adcvbs.inc qui se trouve dans le répertoire C:\Program Files\Common Files\System\MSADC.

Remarques

Si la propriété ExecuteOptions a pour valeur adcExecAsync, l'appel suivant de la méthode Refresh pour actualiser la propriété Recordset de l'objet RDS.DataControl est exécuté en mode asynchrone.

Si vous tentez d'appeler la méthode Reset, Refresh, SubmitChanges, CancelUpdate ou Recordset alors qu'une autre opération asynchrone susceptible de modifier la propriété Recordset de l'objet RDS.DataControl est en cours d'exécution, une erreur se produit.

Si une erreur se produit pendant une opération asynchrone, la valeur ReadyState de l'objet RDS.DataControl passe de adcReadyStateLoaded à adcReadyStateComplete, et la valeur de la propriété Recordset reste égale à Rien.

Voir aussi

Exemple VBScript

Cancel, méthode (RDS)

S'applique à : DataControl, objet (RDS)


FetchOptions, propriété (RDS)

Indique le type de recherche asynchrone.

Paramètres et valeurs renvoyées

Définit ou renvoie l'une des valeurs suivantes.

Constante | Description
adcFetchUpFront | Tous les enregistrements de l'objet Recordset sont extraits avant que l'application ne reprenne le contrôle. Le Recordset est extrait intégralement avant que l'application ne puisse utiliser ce jeu d'enregistrements.
adcFetchBackground | Le contrôle peut être rendu à l'application dès que le premier lot d'enregistrements est extrait. Une lecture ultérieure du Recordset qui essaie d'accéder à un enregistrement non récupéré dans le premier lot est retardée jusqu'à l'extraction de cet enregistrement ; le contrôle est alors rendu à l'application.
adcFetchAsync | Valeur par défaut. Le contrôle est immédiatement rendu à l'application pendant que les enregistrements sont extraits en arrière-plan. Si l'application tente de lire un enregistrement qui n'a pas encore été récupéré, l'enregistrement le plus proche est lu et le contrôle est immédiatement renvoyé, indiquant que la fin temporaire du Recordset est atteinte. Par exemple, un appel à MoveLast positionne l'enregistrement actuel sur le dernier enregistrement effectivement extrait, bien que d'autres enregistrements continuent de remplir le Recordset.
Remarque Chaque fichier exécutable côté client qui utilise ces constantes doit fournir les déclarations correspondantes. Vous pouvez couper et coller les déclarations de constantes dont vous avez besoin à partir du fichier Adcvbs.inc qui se trouve dans le répertoire C:\Program Files\Common Files\System\MSADC.

Remarques

Avec une application Web, il est préférable d'utiliser adcFetchAsync (valeur par défaut) car les performances sont meilleures. Avec une application cliente compilée, il vaut généralement mieux utiliser la valeur adcFetchBackground.

Voir aussi

Exemple VBScript

Cancel, méthode (RDS)

S'applique à : DataControl, objet (RDS)


FilterColumn, propriété (RDS)

Indique la colonne à laquelle appliquer le critère de filtre.

Syntaxe

DataControl.FilterColumn = String

Paramètres

DataControl
Variable objet qui représente un objet RDS.DataControl.
String
Valeur de type String qui spécifie la colonne sur laquelle le critère de filtre sera évalué. Les critères de filtres sont spécifiés par la propriété FilterCriterion.

Remarques

Les propriétés SortColumn, SortDirection, FilterValue, FilterCriterion et FilterColumn fournissent des fonctionnalités de tri et de filtrage sur le cache côté client. La fonctionnalité Tri classe les enregistrements par valeur d'une colonne. La fonctionnalité Filtre affiche un sous-groupe d'enregistrements répondant à un critère de recherche, tandis que l'objet Recordset reste entier dans le cache. La méthode Reset exécute le critère et remplace le Recordset en cours par un Recordset modifiable.

Voir aussi

Exemple VBScript

FilterCriterion, propriété (RDS) | FilterValue, propriété (RDS) | SortColumn, propriété (RDS) | SortDirection, propriété (RDS)

S'applique à : DataControl, objet (RDS)


FilterCriterion, propriété (RDS)

Indique l'opérateur d'évaluation à utiliser dans la valeur du filtre.

Syntaxe

DataControl.FilterCriterion = String

Paramètres

DataControl
Variable objet qui représente un objet RDS.DataControl.
String
Valeur de type String qui spécifie l'opérateur d'évaluation de la valeur FilterValue à appliquer aux enregistrements. Il peut s'agir de l'un quelconque des symboles suivants : <, <=, >, >=, = ou <>.

Remarques

Les propriétés SortColumn, SortDirection, FilterValue, FilterCriterion et FilterColumn fournissent des fonctionnalités de tri et de filtrage sur le cache côté client. La fonctionnalité Tri classe les enregistrements par valeur d'une colonne. La fonctionnalité Filtre affiche un sous-groupe d'enregistrements répondant à un critère de recherche, tandis que l'objet Recordset reste entier dans le cache. La méthode Reset exécute le critère et remplace le Recordset en cours par un Recordset modifiable.

L'opérateur "!=" n'est pas valide avec la propriété FilterCriterion ; vous pouvez le remplacer par "<>".

Lorsque les deux propriétés filtre et tri sont définies et que vous appelez la méthode Reset, l'ensemble de lignes est d'abord filtré, puis trié. Pour les tris en ordre croissant, les valeurs nulles apparaissent en début de liste ; pour les tris en ordre décroissant, les valeurs nulles apparaissent en fin de liste (par défaut, l'ordre de tri est croissant).

Voir aussi

Exemple VBScript

FilterColumn, propriété (RDS) | FilterValue, propriété (RDS) | SortColumn, propriété (RDS) | SortDirection, propriété (RDS)

S'applique à : DataControl, objet (RDS)


FilterValue, propriété (RDS)

Indique la valeur de référence pour le filtrage des enregistrements.

Syntaxe

DataControl.FilterValue = String

Paramètres

DataControl
Variable objet qui représente un objet RDS.DataControl.
String
Valeur de type String qui représente une valeur de données pour filtrer les enregistrements (par exemple : 'Programmer' ou 125).

Remarques

Les propriétés SortColumn, SortDirection, FilterValue, FilterCriterion et FilterColumn fournissent des fonctionnalités de tri et de filtrage sur le cache côté client. La fonctionnalité Tri classe les enregistrements par valeur d'une colonne. La fonctionnalité Filtre affiche un sous-groupe d'enregistrements répondant à un critère de recherche, tandis que l'objet Recordset reste entier dans le cache. La méthode Reset exécute le critère et remplace le Recordset en cours par un Recordset modifiable.

Des valeurs nulles provoquent une erreur d'incompatibilité de type.

Voir aussi

Exemple VBScript

FilterColumn, propriété (RDS) | FilterCriterion, propriété (RDS) | SortColumn, propriété (RDS) | SortDirection, propriété (RDS)

S'applique à : DataControl, objet (RDS)


Handler, propriété (RDS)

Indique le nom d'un programme de personnalisation côté serveur ou gestionnaire (handler) qui étend la fonctionnalité de RDSServer.DataFactory et tout paramètre utilisé par le gestionnaire.

Syntaxe

DataControl.Handler = String

Paramètres

DataControl
Variable objet qui représente un objet RDS.DataControl.
String
Valeur de type String qui contient le nom du gestionnaire et les paramètres utilisés par ce dernier séparés par une virgule (par exemple, "handlerName,parm1,parm2,...,parm N").

Remarques

Cette propriété prend en charge la personnalisation, une fonctionnalité qui exige que la propriété CursorLocation ait la valeur adUseClient.

Le nom du gestionnaire (handler) et ses paramètres (le cas échéant) sont séparés par une virgule (« , »). Les résultats sont imprévisibles si un point-virgule (« ; ») apparaît dans le paramètre String. Vous pouvez écrire votre propre gestionnaire, à condition qu'il prenne en charge l'interface IDataFactoryHandler.

Le nom du gestionnaire par défaut est MSDFMAP.Handler et son paramètre par défaut est un fichier de personnalisation nommé MSDFMAP.INI. Utilisez cette propriété pour appeler d'autres fichiers de personnalisation créés par l'administrateur de votre serveur.

Si vous ne désirez pas définir la propriété Handler , vous pouvez simplement préciser un gestionnaire et des paramètres dans la propriété ConnectionString de la manière suivante : "Handler=handlerName,parm1,parm2,...;".

Voir aussi

Exemple Visual Basic

Personnalisation de DataFactory | DataFactory, objet (RDSServer)

S'applique à : DataControl, objet (RDS)


InternetTimeout, propriété (RDS)

Indique le délai à respecter, en millisecondes, avant d'interrompre une requête.

Paramètres et valeurs renvoyées

Définit ou renvoie une valeur de type Long qui représente le nombre de millisecondes au bout duquel une requête est abandonnée si elle n'a pas abouti.

Remarques

Cette propriété ne s'applique qu'aux requêtes envoyées avec les protocoles HTTP ou HTTPS.

Les requêtes effectuées en environnement indirect (serveurs distants) peuvent prendre plusieurs minutes. Utilisez cette propriété pour définir un délai supplémentaire pour les requêtes longues.

Voir aussi

Exemple Visual Basic | Exemple VC++ | Exemple VJ++

S'applique à : DataControl, objet (RDS) | DataSpace, objet (RDS)


ReadyState, propriété (RDS)

Indique la progression d'un objet DataControl qui extrait des données pour les placer dans son objet Recordset.

Paramètres et valeurs renvoyées

Définit ou renvoie l'une des valeurs suivantes.

Valeur | Description
adcReadyStateLoaded | La requête actuelle est encore en cours d'exécution et aucune ligne n'a été extraite. Le Recordset de l'objet DataControl ne peut pas être utilisé.
adcReadyStateInteractive | Un ensemble de lignes initial extrait par la requête en cours a été stocké dans le Recordset de l'objet DataControl et peut être utilisé. Les lignes restantes n'ont pas encore été extraites.
adcReadyStateComplete | Toutes les lignes extraites par la requête actuelle ont été enregistrées dans le Recordset de l'objet DataControl et peuvent être utilisées. Cet état existe aussi après l'abandon d'une opération à la suite d'une erreur ou si l'objet Recordset n'est pas initialisé.
Remarque Chaque fichier exécutable côté client qui utilise ces constantes doit fournir les déclarations correspondantes. Vous pouvez couper et coller les déclarations de constantes dont vous avez besoin à partir du fichier Adcvbs.inc qui se trouve dans le répertoire C:\Program Files\Common Files\System\MSADC.

Remarques

Utilisez l'événement onReadyStateChange pour effectuer le suivi des modifications de la propriété ReadyState pendant une opération de requête asynchrone. Cette procédure sera plus rapide que la vérification régulière de la valeur de la propriété.

Si une erreur se produit lors d'une opération asynchrone, la propriété ReadyState prend la valeur adcReadyStateComplete, la propriété State passe de la valeur adStateExecuting à adStateClosed et la propriété Value de l'objet Recordset conserve la valeur Rien.

Voir aussi

Exemple VBScript

Cancel, méthode (RDS) | ExecuteOptions, propriété (RDS)

S'applique à : DataControl, objet (RDS)


Recordset, SourceRecordset, propriétés (RDS)

Indique l'objet Recordset renvoyé par un objet Business personnalisé.

Syntaxe

DataControl.SourceRecordset = Recordset
Recordset = DataControl.Recordset

Paramètres

DataControl
Variable objet qui représente un objet RDS.DataControl.
Recordset
Variable objet qui représente un objet Recordset.

Remarques

Vous pouvez affecter comme valeur à la propriété SourceRecordset un objet Recordset renvoyé par un objet Business personnalisé.

Ces propriétés permettent à une application de gérer le processus de liaison par le biais de la personnalisation. Elles reçoivent un ensemble de lignes sous forme d'objet Recordset, de sorte que vous pouvez agir en interaction directe avec l'objet Recordset pour exécuter différentes tâches comme définir des propriétés ou répéter des actions dans l'objet Recordset.

Vous pouvez définir la propriété SourceRecordset ou lire la propriété Recordset au moment de l'exécution en code de script.

La propriété SourceRecordset est accessible en écriture seule, contrairement à la propriété Recordset qui est accessible en lecture seule.

Voir aussi

Exemple VBScript

CreateRecordset, méthode (RDS) | Query, méthode (RDS)

S'applique à : DataControl, objet (RDS)


Server, propriété (RDS)

Indique le nom et le protocole de communication des services Internet (IIS).

Vous pouvez définir la propriété Server au moment de la création dans les balises OBJECT de l'objet RDS.DataControl ou au moment de l'exécution dans le code de script.

Syntaxe

Protocole Syntaxe au moment de la création
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="">
Protocole Syntaxe à l'exécution
HTTP
DataControl.Server="http://awebsrvr:port"
HTTPS
DataControl.Server="https://awebsrvr:port"
DCOM
DataControl.Server="computername"
In-process
DataControl.Server=""

Paramètres

awebsrvr ou computername
Valeur de type String qui contient un chemin Internet ou intranet ou un nom d'ordinateur (si le serveur se trouve sur un ordinateur distant) ou une chaîne vide (si le serveur se trouve sur l'ordinateur local).
port
Valeur facultative. Port utilisé pour se connecter à un serveur IIS. Le numéro du port est défini dans Internet Explorer (dans le menu Affichage, cliquez sur Options, puis sélectionnez l'onglet Connection) ou dans IIS.
DataControl
Variable objet qui représente un objet RDS.DataControl.

Remarques

Le serveur est l'emplacement où la requête RDS.DataControl (interrogation ou mise à jour) est traitée. Par défaut, toutes les requêtes sont traitées par l'objet RDSServer.DataFactory, le composant MSDFMAP.Handler et le fichier MSDFMAP.INI du serveur spécifié. Souvenez-vous-en lorsque vous changez de serveur pour rapprocher les paramètres des anciens et des nouveaux fichiers MSDFMAP.INI. Des requêtes qui aboutissent sur certains serveurs peuvent échouer sur d'autres à cause de problèmes d'incompatibilité. Si la propriété Server a la valeur "", ces objets seront utilisés sur l'ordinateur local.

Voir aussi

Exemple VBScript

Connect, propriété (RDS) | SQL, propriété (RDS) | SubmitChanges, méthode (RDS)

S'applique à : DataControl, objet (RDS)


SortColumn, propriété (RDS)

Indique la colonne selon laquelle trier les enregistrements.

Syntaxe

DataControl.SortColumn = String

Paramètres

DataControl
Variable objet qui représente un objet RDS.DataControl.
String
Valeur de type String qui représente le nom ou l'alias de la colonne selon laquelle les enregistrements seront triés.

Remarques

Les propriétés SortColumn, SortDirection, FilterValue, FilterCriterion et FilterColumn fournissent des fonctionnalités de tri et de filtrage sur le cache côté client. La fonctionnalité Tri classe les enregistrements par valeur d'une colonne. La fonctionnalité Filtre affiche un sous-groupe d'enregistrements répondant à un critère de recherche, tandis que le Recordset reste entier dans le cache. La méthode Reset exécute le critère et remplace le Recordset en cours par un Recordset modifiable.

Avant de trier un objet Recordset, vous devez d'abord enregistrer toutes les modifications en attente. Si vous utilisez l'objet RDS.DataControl, vous pouvez faire appel à la méthode SubmitChanges. Par exemple, si votre objet RDS.DataControl porte le nom ADC1, vous écrivez le code ADC1.SubmitChanges. Si vous utilisez un objet Recordset ADO, vous pouvez recourir à sa méthode UpdateBatch. La méthode UpdateBatch est conseillée pour les objets Recordset créés avec la méthode CreateRecordset. Par exemple, votre code pourrait être myRS.UpdateBatch ou ADC1.Recordset.UpdateBatch.

Voir aussi

Exemple VBScript

Sort, propriété | SortDirection, propriété (RDS)

S'applique à : DataControl, objet (RDS)


SortDirection, propriété (RDS)

Indique si l'ordre de tri est croissant ou décroissant.

Syntaxe

DataControl.SortDirection = value

Paramètres

DataControl
Variable objet qui représente un objet RDS.DataControl.
Value
Valeur de type Boolean qui, si elle est égale à True, indique un ordre de tri croissant. False indique un ordre de tri décroissant.

Remarques

Les propriétés SortColumn, SortDirection, FilterValue, FilterCriterion et FilterColumn fournissent des fonctionnalités de tri et de filtrage sur le cache côté client. La fonctionnalité Tri classe les enregistrements par valeur d'une colonne. La fonctionnalité Filtre affiche un sous-groupe d'enregistrements répondant à un critère de recherche, tandis que le Recordset reste entier dans le cache. La méthode Reset exécute le critère et remplace le Recordset en cours par un Recordset modifiable.

Voir aussi

Exemple VBScript

Sort, propriété | SortColumn, propriété (RDS)

S'applique à : DataControl, objet (RDS)


SQL, propriété [ADO]

Référence de l'API RDS 2.5

SQL, propriété (RDS)

Indique la chaîne de requête utilisée pour extraire un objet Recordset.

Vous pouvez définir la propriété SQL au moment de la création dans les balises OBJECT de l'objet RDS.DataControl ou au moment de l'exécution dans le code de script.

Syntaxe

Design time: <PARAM NAME="SQL" VALUE="QueryString">
Run time: DataControl.SQL = "QueryString"

Paramètres

QueryString
Valeur de type String qui contient une requête de données SQL valide.
DataControl
Variable objet qui représente un objet RDS.DataControl.

Remarques

En général, il s'agit d'une instruction SQL (basée sur la langue du serveur de base de données) du type "Select * from NewTitles". Pour s'assurer que les enregistrements correspondent et sont mis à jour avec précision, une requête pouvant être mise à jour doit contenir un champ non binaire et non calculé.

La propriété SQL est facultative si un objet Business côté serveur extrait les données pour le client.

Voir aussi

Exemple VBScript

Connect, propriété (RDS) | Query, méthode (RDS) | Refresh, méthode (RDS) | SubmitChanges, méthode (RDS)

S'applique à : DataControl, objet (RDS)


URL, propriété (RDS)

Indique une chaîne qui contient une URL relative ou absolue.

Vous pouvez définir la propriété URL au moment de la création dans les balises OBJECT de l'objet DataControl ou au moment de l'exécution dans le code de script.

Syntaxe

Design time: <PARAM NAME="URL" VALUE="Server">
Run time: DataControl.URL="Server"

Paramètres

Server
Valeur de type String qui contient une URL valide.
DataControl
Variable objet qui représente un objet DataControl.

Remarques

L'adresse URL identifie généralement un fichier .asp (Active Server Page) qui peut produire et renvoyer un objet Recordset. L'utilisateur peut donc obtenir un objet Recordset sans invoquer l'objet DataFactory côté serveur ni programmer un objet Business personnalisé.

Si la propriété URL est définie, la méthode SubmitChanges soumet les modifications à l'emplacement spécifié par l'URL.

Voir aussi

Exemple VBScript

S'applique à : DataControl, objet (RDS)


Méthodes RDS

Cancel (RDS) | Annule l'exécution d'un appel de méthode asynchrone en attente.
CancelUpdate (RDS) | Annule les modifications que vous apportez à la ligne actuelle ou nouvelle d'un objet Recordset.
ConvertToString (RDS) | Convertit Recordset en une chaîne MIME représentant les données du jeu d'enregistrements.
CreateObject (RDS) | Crée le proxy de l'objet Business cible et renvoie un pointeur le désignant.
CreateRecordset (RDS) | Crée un objet Recordset vide, déconnecté.
MoveFirst, MoveLast, MoveNext, MovePrevious (RDS) | Opèrent un déplacement jusqu'au premier, dernier, prochain ou précédent enregistrement dans un objet Recordset spécifié.
Query (RDS) | Utilise une chaîne de requête SQL valide pour renvoyer un objet Recordset.
Refresh (RDS) | Interroge à nouveau la source de données spécifiée dans la propriété Connect et met à jour les résultats de la requête.
Reset (RDS) | Exécute le tri ou le filtrage sur un objet Recordset côté client, en fonction des propriétés de tri et de filtrage spécifiées.
SubmitChanges (RDS) | Soumet les modifications en attente de l'objet Recordset pouvant être actualisé et mis en mémoire cache locale à la source de données spécifiée dans la propriété Connect.

© 1998-2002 Microsoft Corporation. Tous droits réservés.


Cancel, méthode (RDS)

Annule l'exécution d'un appel de méthode asynchrone en attente.

Syntaxe

RDS.DataControl.Cancel

Remarques

Lorsque vous appelez la méthode Cancel, la valeur adcReadyStateLoaded est automatiquement affectée à la propriété ReadyState et l'objet Recordset est vide.

Voir aussi

Exemple VBScript

Cancel, méthode | CancelBatch, méthode | CancelUpdate, méthode | CancelUpdate, méthode (RDS) | ExecuteOptions, propriété (RDS)

S'applique à : DataControl, objet (RDS)


CancelUpdate, méthode (RDS)

Annule les modifications que vous apportez à la ligne en cours ou nouvelle d'un objet Recordset.

Syntaxe

DataControl.CancelUpdate

Paramètres

DataControl
Variable objet qui représente un objet RDS.DataControl.

Remarques

Le module Cursor Service pour OLE DB conserve à la fois une copie des valeurs d'origine et une copie en mémoire cache des modifications effectuées. Lorsque vous appelez CancelUpdate, la mémoire cache des modifications est réinitialisée, et les contrôles liés sont actualisés avec les données d'origine.

Voir aussi

Exemple VBScript

Boutons de commande du Carnet d'adresses | Cancel, méthode | Cancel, méthode (RDS) | CancelBatch, méthode | CancelUpdate, méthode | Refresh, méthode (RDS) | SubmitChanges, méthode (RDS)

S'applique à : DataControl, objet (RDS)


ConvertToString, méthode (RDS)

Convertit Recordset en une chaîne MIME représentant les données du jeu d'enregistrements.

Syntaxe

DataFactory.ConvertToString(Recordset)

Paramètres

DataFactory
Variable objet représentant un objet RDSServer.DataFactory.
Recordset
Variable objet représentant un objet Recordset.

Remarques

Avec les fichiers .asp, utilisez ConvertToString pour incorporer Recordset dans une page HTML générée sur le serveur, afin de la déplacer vers un ordinateur client.

ConvertToString charge d'abord Recordset dans les tables du service Cursor Service, puis génère un flux au format MIME.

Côté client, le service RDS peut reconvertir la chaîne MIME en Recordset entièrement opérationnel. Il fonctionne parfaitement pour le traitement de moins de 400 lignes de données avec 1 024 octets au maximum par ligne. Vous ne devez pas l'utiliser pour le flux constant des données BLOB et les jeux volumineux de résultats sur HTTP. Aucune compression filaire n'est effectuée sur la chaîne, de sorte que le transport de jeux volumineux de données prend un temps considérable sur HTTP par rapport au format « tablegram optimisé filaire » défini et déployé par le service RDS (Remote Data Service) comme format de protocole de transport natif.

Remarque Si vous utilisez des pages ASP (Active Server Pages) pour incorporer la chaîne MIME obtenue dans une page HTML du client, sachez que les versions de VBScript antérieures à la version 2.0 limitent la taille de la chaîne à 32 Ko. En cas de dépassement de cette limite, une erreur est renvoyée. Conservez une requête de portée relativement petite lorsque vous utilisez l'incorporation MIME via des fichiers .asp. Pour y remédier, téléchargez la dernière version de VBScript à partir du site Web Microsoft Windows Script Technologies.

Voir aussi

Exemple Visual Basic | Exemple VBScript

S'applique à : DataFactory, objet (RDSServer)


CreateObject, méthode (RDS)

Crée le proxy de l'objet Business cible et renvoie un pointeur le désignant. Le proxy conditionne les données et effectue un « marshaling » de ces dernières pour le stub côté serveur afin que les communications avec l'objet Business envoient des demandes et des données via Internet. Pour les objets composants in-process, aucun proxy n'est utilisé, mais simplement un pointeur de l'objet est fourni.

Syntaxe

RDS prend en charge les protocoles suivants : HTTP, HTTPS (HTTP sur Secure Socket Layer), DCOM et in-process.

Protocole Syntaxe
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", "")

Paramètres

Objet
Variable objet correspondant à un objet qui est le type spécifié dans ProgID.
DataSpace
Variable objet représentant un objet RDS.DataSpace utilisé pour créer une instance du nouvel objet.
ProgID
Valeur de type String contenant le nom de classe qui spécifie un objet Business côté serveur chargé de l'implémentation des règles d'entreprise de votre application.
awebsrvr ou computername
Valeur de type String qui représente une adresse URL identifiant le serveur Web IIS (Internet Information Services) où une instance de l'objet business serveur est créée.

Remarques

Le protocole HTTP est le protocole Web standard ; le protocole HTTPS est un protocole Web sécurisé. Utilisez le protocole DCOM lors de l'exécution d'un réseau local sans HTTP. Le protocole in-process est une bibliothèque de liaison dynamique (DLL) locale ; il n'utilise pas de réseau.

Voir aussi

Exemple d'objet DataFactory et de méthodes Query et CreateObject (VBScript) | Exemple d'objet DataSpace et de méthode CreateObject (VBScript)

CreateRecordset, méthode (RDS)

S'applique à : DataSpace, objet (RDS)


CreateRecordset, méthode (RDS)

Crée un objet Recordset vide, déconnecté.

Syntaxe

object.CreateRecordset(ColumnInfos)

Paramètres

Objet
Variable objet représentant un objet RDSServer.DataFactory ou RDS.DataControl.
ColumnsInfos
Tableau d'attributs de type Variant qui définit chaque colonne dans le Recordset créé. Chaque définition de colonne contient un tableau de quatre attributs obligatoires et un attribut facultatif.
Attribut | Description
Nom | Nom de l'en-tête de colonne.
Type | Entier du type de données.
Size | Entier de la largeur en caractères, indépendamment du type de données.
Nullability | Valeur de type Boolean.
Scale
(Facultatif) 		Cet attribut facultatif définit l'échelle des champs numériques. Si cette valeur n'est pas spécifiée, les valeurs numériques sont tronquées selon une échelle de trois. La précision n'est pas affectée, mais le nombre de chiffres après la virgule est tronqué pour être ramené à trois.

Le jeu de tableaux de colonnes est ensuite regroupé en un tableau, qui définit le Recordset.

Remarques

L'objet Business côté serveur peut remplir le Recordset résultant avec des données issues d'un fournisseur de données non-OLE DB, tel qu'un fichier système contenant des cours boursiers.

Le tableau suivant répertorie les valeurs DataTypeEnum prises en charge par la méthode CreateRecordset. Le numéro indiqué est le numéro de référence utilisé pour définir les champs.

Chaque type de données a une longueur fixe ou variable. Les types de longueur fixe doivent être définis avec une taille de –1, car la taille est prédéterminée et une définition de la taille est toujours requise. Les types de données de longueur variable autorisent une taille comprise entre 1 et 32767.

Pour certains types de données variables, le type peut être forcé au type indiqué dans la colonne Remplacement. Vous ne verrez les remplacements qu'une fois le Recordset créé et rempli. Vous pouvez ensuite vérifier le type réel des données, si nécessaire.

Longueur | Constante | Numéro | Remplacement
Fixe | adTinyInt | 16 |
Fixe | adSmallInt | 2 |
Fixe | adInteger | 3 |
Fixe | adBigInt | 20 |
Fixe | adUnsignedTinyInt | 17 |
Fixe | adUnsignedSmallInt | 18 |
Fixe | adUnsignedInt | 19 |
Fixe | adUnsignedBigInt | 21 |
Fixe | adSingle | 4 |
Fixe | adDouble | 5 |
Fixe | adCurrency | 6 |
Fixe | adDecimal | 14 |
Fixe | adNumeric | 131 |
Fixe | adBoolean | 11 |
Fixe | adError | 10 |
Fixe | adGuid | 72 |
Fixe | adDate | 7 |
Fixe | adDBDate | 133 |
Fixe | adDBTime | 134 |
Fixe | adDBTimestamp | 135 | 7
Variable | adBSTR | 8 | 130
Variable | adChar | 129 | 200
Variable | adVarChar | 200 |
Variable | adLongVarChar | 201 | 200
Variable | adWChar | 130 |
Variable | adVarWChar | 202 | 130
Variable | adLongVarWChar | 203 | 130
Variable | adBinary | 128 |
Variable | adVarBinary | 204 |
Variable | adLongVarBinary | 205 | 204

Voir aussi

Exemple Visual Basic | Exemple VBScript

CreateObject, méthode (RDS)

S'applique à : DataControl, objet (RDS) | DataFactory, objet (RDSServer)


MoveFirst, MoveLast, MoveNext et MovePrevious, méthodes (RDS)

Opèrent un déplacement jusqu'au premier, dernier, prochain ou précédent enregistrement dans un objet Recordset spécifié.

Syntaxe

DataControl.Recordset.{MoveFirst | MoveLast | MoveNext | MovePrevious}

Paramètres

DataControl
Variable objet représentant un objet RDS.DataControl.

Remarques

Vous pouvez utiliser les méthodes Move avec l'objet RDS.DataControl pour parcourir les enregistrements de données affichés dans les contrôles dépendants d'une page Web. Par exemple, supposez que vous affichez un objet Recordset dans un contrôle Grid en le liant à un objet RDS.DataControl. Vous pouvez ensuite insérer des boutons Premier, Dernier, Suivant et Précédent sur lesquels les utilisateurs pourront cliquer pour se rendre sur le premier, le dernier, le prochain ou le précédent enregistrement dans l'objet Recordset affiché. Pour ce faire, vous appelez les méthodes MoveFirst, MoveLast, MoveNext et MovePrevious de l'objet RDS.DataControl dans les procédures onClick pour les boutons Premier, Dernier, Suivant et Précédent, respectivement. La rubrique Boutons de navigation de l'application Carnet d'adresses montre comment procéder.

Voir aussi

Move, méthode | MoveFirst, MoveLast, MoveNext et MovePrevious, méthodes | MoveRecord, méthode

S'applique à : DataControl, objet (RDS)


Query, méthode (RDS)

Utilise une chaîne de requête SQL valide pour renvoyer un objet Recordset.

Syntaxe

Set Recordset = DataFactory.Query(Connection, Query)

Paramètres

Recordset
Variable objet qui représente un objet Recordset.
DataFactory
Variable objet qui représente un objet RDSServer.DataFactory.
Connection
Valeur de type String qui contient les informations de connexion du serveur. Cette valeur correspond à la propriété Connect.
Query
Valeur de type String qui contient la requête SQL.

Remarques

La requête doit utiliser le langage SQL du serveur de base de données. Un état des résultats est renvoyé si la requête exécutée provoque une erreur. La méthode Query n'effectue aucune vérification de syntaxe sur la chaîne Query.

Voir aussi

Exemple VBScript

S'applique à l'objet DataFactory (RDSServer)


Refresh, méthode (RDS)

Interroge à nouveau la source de données spécifiée dans la propriété Connect et met à jour les résultats de la requête.

Syntaxe

DataControl.Refresh

Paramètres

DataControl
Variable objet qui représente un objet RDS.DataControl.

Remarques

Vous devez définir les propriétés Connect, Server et SQL avant d'utiliser la méthode Refresh. Tous les contrôles liés aux données de la feuille associés à un objet RDS.DataControl reflètent le nouveau jeu d'enregistrements. Tout objet Recordset préexistant est libéré et toutes les modifications non enregistrées sont annulées. La méthode Refresh définit automatiquement le premier enregistrement comme enregistrement actuel.

Il est judicieux d'appeler la méthode Refresh périodiquement lorsque vous travaillez avec des données. Si vous laissez les données un certain temps sur votre ordinateur client après les avoir extraites, il est probable qu'elles vont devenir périmées. Il est possible que les modifications que vous effectuez échouent parce qu'un autre utilisateur a pu modifier l'enregistrement et soumettre ses modifications avant vous.

Voir aussi

Exemple Visual Basic | Exemple VBScript

Boutons de commande du Carnet d'adresses | CancelUpdate, méthode (RDS) | Refresh, méthode | SubmitChanges, méthode (RDS)

S'applique à : DataControl, objet (RDS)


Reset, méthode (RDS)

Exécute le tri ou le filtrage sur un objet Recordset côté client en fonction des propriétés de tri et de filtrage spécifiées.

Syntaxe

DataControl.Reset(value)

Paramètres

DataControl
Variable objet qui représente un objet RDS.DataControl.
value
Facultatif. Valeur de type Boolean qui est True (valeur par défaut) si vous souhaitez filtrer l'ensemble de lignes en cours « filtré ». False indique que vous filtrez l'ensemble de lignes original, en supprimant ainsi toutes les options précédentes du filtre.

Remarques

Les propriétés SortColumn, SortDirection, FilterValue, FilterCriterion et FilterColumn fournissent des fonctionnalités de tri et de filtrage sur le cache côté client. La fonctionnalité Tri classe les enregistrements par valeur d'une colonne. La fonctionnalité Filtre affiche un sous-groupe d'enregistrements répondant à un critère de recherche, tandis que le Recordset reste entier dans le cache. La méthode Reset exécute le critère et remplace le Recordset en cours par un Recordset modifiable.

Si certaines modifications apportées aux données originales n'ont pas encore été soumises, la méthode Reset échoue. Utilisez au préalable la méthode SubmitChanges pour enregistrer toutes les modifications apportées à un objet Recordset en lecture/écriture, puis utilisez la méthode Reset pour trier ou filtrer les enregistrements.

Si vous souhaitez procéder à plusieurs filtrages sur un ensemble de lignes, vous pouvez utiliser l'argument facultatif Boolean avec la méthode Reset. Pour ce faire, suivez l'exemple ci-après :

ADC.SQL = "Select au_lname from authors"
ADC.Refresh    ' Get the new rowset.

ADC.FilterColumn = "au_lname"
ADC.FilterCriterion = "<"
ADC.FilterValue = "'M'"
ADC.Reset         ' Rowset now has all Last Names < "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 now has all Last
                    ' Names < "M" and > "F".

ADC.FilterCriterion = ">"
ADC.FilterValue = "'T'"
' Filter on the original rowset, throwing out the
' previous filter options.
ADC.Reset(FALSE)   ' Rowset now has all Last Names > "T".

Voir aussi

Exemple VBScript

SubmitChanges, méthode (RDS)

S'applique à : DataControl, objet (RDS)


SubmitChanges, méthode (RDS)

Soumet les modifications en attente de l'objet Recordset en mémoire cache locale pouvant être mis à jour à la source de données spécifiée dans la propriété Connect ou URL.

Syntaxe

DataControl.SubmitChanges
DataFactory.SubmitChanges Connection, Recordset

Paramètres

DataControl
Variable objet qui représente un objet RDS.DataControl.
DataFactory
Variable objet qui représente un objet RDSServer.DataFactory.
Connection
Valeur de type String qui représente la connexion créée à l'aide de la propriété Connect de l'objet RDS.DataControl.
Recordset
Variable objet qui représente un objet Recordset.

Remarques

Vous devez définir les propriétés Connect, Server et SQL avant d'utiliser la méthode SubmitChanges avec l'objet RDS.DataControl.

Si vous appelez la méthode CancelUpdate après avoir appelé la méthode SubmitChanges pour le même objet Recordset, l'appel de CancelUpdate échoue car les modifications ont déjà été validées.

Seuls les enregistrements modifiés sont envoyés pour modification, et la réussite ou bien l'échec des modifications porte sur l'ensemble de celles-ci.

Vous ne pouvez utiliser la méthode SubmitChanges qu'avec l'objet RDSServer.DataFactory par défaut. Les objets Business personnalisés ne peuvent pas utiliser cette méthode.

Si la propriété URL est définie, la méthode SubmitChanges soumet les modifications à l'emplacement spécifié par l'URL.

Voir aussi

Exemple VBScript

Boutons de commande du Carnet d'adresses | CancelUpdate, méthode (RDS) | Refresh, méthode

S'applique à : DataControl, objet (RDS) | DataFactory, objet (RDSServer)


Événements RDS

onError (RDS) | Appelé à chaque fois qu'une erreur survient au cours d'une opération.
onReadyStateChange (RDS) | Appelé à chaque modification de la valeur de la propriété ReadyState.


onError, événement (RDS)

L'événement onError est appelé chaque fois qu'une erreur se produit pendant une opération.

Syntaxe

onError SCode, Description, Source, CancelDisplay

Paramètres

SCode
Entier qui indique le code d'état de l'erreur.
Description
Valeur de type String qui contient la description de l'erreur.
Source
Valeur de type String qui contient la requête ou la commande ayant déclenché l'erreur.
CancelDisplay
Valeur de type Boolean. Lorsque True est affecté à cette valeur, l'erreur n'est pas affichée dans une boîte de dialogue.

Voir aussi

Exemple Visual C++

Résumé du gestionnaire d'événements ADO

S'applique à : DataControl, objet (RDS)


onReadyStateChange, événement (RDS)

L'événement onReadyStateChange est appelé à chaque modification de la valeur de la propriété ReadyState.

Syntaxe

onReadyStateChange

Paramètres

Aucun.

Remarques

La propriété ReadyState reflète la progression d'un objet RDS.DataControl lorsqu'il récupère, de façon asynchrone, des données dans son objet Recordset. Utilisez l'événement onReadyStateChange pour surveiller les modifications de la propriété ReadyState chaque fois qu'elles surviennent. C'est une procédure plus efficace que la vérification périodique de la valeur de la propriété.

Voir aussi

Exemple Visual C++

Résumé du gestionnaire d'événements ADO

S'applique à : DataControl, objet (RDS)


Exemples de code RDS

Utilisez les exemples de code suivants pour apprendre à utiliser les objets, méthodes, propriétés et événements RDS.

Remarque Collez entièrement les exemples de code dans votre éditeur de code. L'exemple risque de ne pas fonctionner correctement si des copies partielles d'exemple sont utilisées ou si la mise en forme des paragraphes est perdue.
  • Exemples de code RDS en Microsoft Visual Basic
  • Exemples de code RDS en Microsoft Visual Basic Scripting Edition
  • Exemples de code RDS en Microsoft Visual C++
  • Exemples de code RDS en Microsoft Visual J++


Exemples de code RDS en Microsoft Visual Basic

Utilisez les exemples de code suivants pour apprendre à utiliser les propriétés RDS lorsque vous programmez en Visual Basic.

Remarque Collez l'exemple de code dans sa totalité, de Sub à End Sub, dans votre éditeur de code. L'exemple risque de ne pas fonctionner correctement si des copies partielles d'exemple sont utilisées ou si la mise en forme des paragraphes est perdue.

Propriétés

  • Exemple de propriété Handler
  • Exemple de propriété InternetTimeout


Exemple de propriété Handler (VB)

Cet exemple utilise la propriété Handler de l'objet DataControl RDS. (Pour plus de détails, consultez Personnalisation de DataFactory.)

Supposons que les sections suivantes dans le fichier des paramètres, Msdfmap.ini, se trouvent sur le serveur :

[connect AuthorDataBase]
Access=ReadWrite
Connect="DSN=Pubs"
[sql AuthorById]
SQL="SELECT * FROM Authors WHERE au_id = ?"

Votre code ressemblerait à ce qui suit. La commande attribuée à la propriété SQL correspondra à l'identificateur AuthorById et extraira une ligne pour l'auteur Michael O'Leary. La propriété Recordset de l'objet DataControl est affectée à un objet Recordset déconnecté, tout simplement pour les besoins de codage.

'BeginHandlerVB

Public Sub Main()

On Error GoTo ErrorHandler

Dim dc As New DataControl

Dim rst As ADODB.Recordset

dc.Handler = "MSDFMAP.Handler"

dc.ExecuteOptions = 1

dc.FetchOptions = 1

dc.Server = "http://MyServer"

dc.Connect = "Data Source=AuthorDataBase"

dc.SQL = "AuthorById('267-41-2394')"

dc.Refresh 'Retrieve the record

Set rst = dc.Recordset 'Use another Recordset as a convenience

Debug.Print "Author is '" & rst!au_fname & " " & rst!au_lname & "'"

' clean up

If rst.State = adStateOpen Then rst.Close

Set rst = Nothing

Set dc = Nothing

Exit Sub

ErrorHandler:

' clean up

If Not rst Is Nothing Then

If rst.State = adStateOpen Then rst.Close

End If

Set rst = Nothing

Set dc = Nothing

If Err <> 0 Then

MsgBox Err.Source & "-->" & Err.Description, , "Error"

End If

End Sub

'EndHandlerVB

Voir aussi

DataControl, objet (RDS) | Handler, propriété (RDS)


Exemple de propriété InternetTimeout (VB)

Cet exemple met en application la propriété InternetTimeout, qui existe sur les objets DataControl et DataSpace. Il utilise l'objet DataControl et le délai d'expiration est fixé à 20 secondes.

'BeginInternetTimeoutVB

Public Sub Main()

On Error GoTo ErrorHandler

Dim dc As RDS.DataControl

Dim rst As ADODB.Recordset

Set dc = New RDS.DataControl

dc.Server = "http://MyServer"

dc.ExecuteOptions = 1

dc.FetchOptions = 1

dc.Connect = "Provider='sqloledb';Data Source='MySqlServer';" & _

"Initial Catalog='Pubs';Integrated Security='SSPI';"

dc.SQL = "SELECT * FROM Authors"

' Wait at least 20 seconds

dc.InternetTimeout = 200

dc.Refresh

' Use another Recordset as a convenience

Set rst = dc.Recordset

Do While Not rst.EOF

Debug.Print rst!au_fname & " " & rst!au_lname

rst.MoveNext

Loop

If rst.State = adStateOpen Then rst.Close

Set rst = Nothing

Set dc = Nothing

Exit Sub

ErrorHandler:

' clean up

If Not rst Is Nothing Then

If rst.State = adStateOpen Then rst.Close

End If

Set rst = Nothing

Set dc = Nothing

If Err <> 0 Then

MsgBox Err.Source & "-->" & Err.Description, , "Error"

End If

End Sub

'EndInternetTimeoutVB

Voir aussi

DataControl, objet (RDS) | DataSpace, objet (RDS) | InternetTimeout, propriété (RDS)


Exemples de code RDS en Microsoft Visual Basic Scripting Edition

Utilisez les exemples de code suivants pour apprendre à utiliser les objets, méthodes et propriétés RDS lorsque vous programmez en Microsoft Visual Basic Scripting Edition (VBScript).

Remarque Collez entièrement les exemples de code dans votre éditeur de code. L'exemple risque de ne pas fonctionner correctement si des copies partielles d'exemple sont utilisées ou si la mise en forme des paragraphes est perdue.

Objets

  • Exemple d'objet DataControl
  • Exemple d'objet DataSpace
  • Exemple d'objet DataFactory

Méthodes

  • Exemple de méthode Cancel
  • Exemple de méthode CancelUpdate
  • Exemple de méthode ConvertToString
  • Exemple de méthode CreateObject
  • Exemple de méthode CreateRecordset
  • Exemple de méthode Query
  • Exemple de méthode Refresh
  • Exemple de méthode Reset
  • Exemple de méthode SubmitChanges

Propriétés

  • Exemple de propriété Connect
  • Exemple de propriétés ExecuteOptions et FetchOptions
  • Exemple de propriétés FilterColumn, FilterCriterion, FilterValue, SortColumn et SortDirection
  • Exemple de propriété ReadyState
  • Exemple de propriétés Recordset et SourceRecordset
  • Exemple de propriété Server
  • Exemple de propriété SQL
  • Exemple de propriété URL


Exemple de méthode Cancel (VBScript)

L'exemple suivant montre comment lire la méthode Cancel au moment de l'exécution. Coupez et collez le code suivant dans le Bloc-notes ou un autre éditeur de texte, puis enregistrez-le sous CancelVBS.asp. Pour afficher le résultat, vous pouvez recourir à n'importe quel navigateur client.

<!-- BeginCancelVBS -->

<Script Language="VBScript">

<!--

Sub cmdCancelAsync_OnClick

' Terminates currently running AsyncExecute,

' ReadyState property set to adcReadyStateLoaded,

' Recordset set to Nothing

ADC.Cancel

End Sub

Sub cmdRefreshTable_OnClick

ADC.Refresh

End Sub

-->

</Script>

<OBJECT CLASSID="clsid:BD96C556-65A3-11D0-983A-00C04FC29E33" ID="ADC">

.

<PARAM NAME="SQL" VALUE="Select FirstName, LastName from Employees">

<PARAM NAME="CONNECT" VALUE="Provider='sqloledb';Integrated Security='SSPI';Initial Catalog='Northwind'">

<PARAM NAME="Server" VALUE="http://<%=Request.ServerVariables("SERVER_NAME")%>">

.

</OBJECT>

<TABLE DATASRC=#ADC>

<TBODY>

<TR>

<TD><SPAN DATAFLD="FirstName"></SPAN></TD>

<TD><SPAN DATAFLD="LastName"></SPAN></TD>

</TR>

</TBODY>

</TABLE>

<FORM>

<INPUT type="button" value="Refresh" id=cmdRefreshTable name=cmdRefreshTable>

<INPUT type="button" value="Cancel" id=cmdCancelAsync name=cmdCancelAsync>

</FORM>

<!-- EndCancelVBS -->

Cancel, méthode


Exemple de méthode CancelUpdate (VBScript)

Pour tester cet exemple, coupez et collez ce code entre les balises <Body> et </Body> d'un document HTML ordinaire, puis nommez ce dernier CancelUpdateVBS.asp. Le script ASP identifiera votre serveur Internet. Vous devrez modifier le nom du serveur pour refléter votre propre configuration. Remplacez simplement la valeur de la chaîne de connexion MyServer par le nom de votre installation SQL Server.

<!-- BeginCancelUpdateVBS -->

<%@Language=VBScript%>

<%'Option Explicit%>

<% 'use the following META tag instead of adovbs.inc%>

<!--METADATA TYPE="typelib" uuid="00000205-0000-0010-8000-00AA006D2EA4" -->

<HTML>

<HEAD>

<META NAME="GENERATOR" Content="Microsoft Visual Studio 6.0">

<TITLE></TITLE>

</HEAD>

<BODY>

<CENTER>

<H1>Remote Data Service</H1>

<H2>SubmitChanges and CancelUpdate Methods</H2>

<% ' to integrate/test this code replace the Server property value and

' the Data Source value in the Connect property with appropriate values%>

<HR>

<OBJECT ID=RDS classid="clsid:BD96C556-65A3-11D0-983A-00C04FC29E33" HEIGHT=1 WIDTH=1></OBJECT>

<SCRIPT Language="VBScript">

'set RDS properties for control just created

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

RDS.SQL = "Select * from Employees"

RDS.Connect = "Provider='sqloledb';Integrated Security='SSPI';Initial Catalog='Northwind';"

RDS.Refresh

</SCRIPT>

<TABLE DATASRC=#RDS>

<THEAD>

<TR ID="ColHeaders">

<TH>ID</TH>

<TH>FName</TH>

<TH>LName</TH>

<TH>Title</TH>

<TH>Hire Date</TH>

<TH>Birth Date</TH>

<TH>Extension</TH>

<TH>Home Phone</TH>

</TR>

</THEAD>

<TBODY>

<TR>

<TD> <INPUT DATAFLD="EmployeeID" size=4> </TD>

<TD> <INPUT DATAFLD="FirstName" size=10> </TD>

<TD> <INPUT DATAFLD="LastName" size=10> </TD>

<TD> <INPUT DATAFLD="Title" size=10> </TD>

<TD> <INPUT DATAFLD="HireDate" size=10> </TD>

<TD> <INPUT DATAFLD="BirthDate" size=10> </TD>

<TD> <INPUT DATAFLD="Extension" size=10> </TD>

<TD> <INPUT DATAFLD="HomePhone" 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 on the grid. Move off that Row. <BR>

Submit the Changes to your DBMS or cancel the updates. </H4>

</CENTER>

<SCRIPT Language="VBScript">

Sub SubmitChange_OnClick

msgbox "Changes will be made"

RDS.SubmitChanges

RDS.Refresh

End Sub

Sub CancelChange_OnClick

msgbox "Changes will be cancelled"

RDS.CancelUpdate

RDS.Refresh

End Sub

-->

</SCRIPT>

</BODY>

</HTML>

<!-- EndCancelUpdateVBS -->

CancelUpdate, méthode


Exemple de propriété Connect (VBScript)

Ce code illustre comment définir la propriété Connect au moment de la création :

<OBJECT CLASSID="clsid:BD96C556-65A3-11D0-983A-00C04FC29E33" ID="ADC1">
.
   <PARAM NAME="SQL" VALUE="Select * from Sales">
   <PARAM NAME="CONNECT" VALUE="Provider=SQLOLEDB;Integrated Security=SSPI;Initial Catalog=Pubs">
   <PARAM NAME="Server" VALUE="http://MyWebServer">
.
</OBJECT>

L'exemple suivant illustre comment définir la propriété Connect lors de la création à l'aide de code VBScript.

Pour tester cet exemple, coupez et collez le code ci-dessous entre les balises <Body> et </Body> d'un document HTML ordinaire, et nommez-le ConnectVBS.asp. Le script ASP identifiera votre serveur.

<!-- BeginConnectVBS -->

<%@ Language=VBScript %>

<HTML>

<HEAD>

<title>Propriété ADO Connect</title>

<%' feuille de style locale utilisée pour l'affichage%>

<STYLE>

<!--

BODY {

font-family: 'Verdana','Arial','Helvetica',sans-serif;

BACKGROUND-COLOR:white;

COLOR:black;

}

.tbody {

text-align: center;

background-color: #f7efde;

font-family: 'Verdana','Arial','Helvetica',sans-serif;

font-size: x-small;

}

-->

</STYLE>

</HEAD>

<BODY>

<h1>Propriété ADO Connect (RDS)</h1>

<HR>

<H3>Définir la propriété Connect au moment de l'exécution</H3>

<% ' RDS.DataControl sans paramètres définis lors de la conception %>

<OBJECT classid="clsid:BD96C556-65A3-11D0-983A-00C04FC29E33" ID=RDS HEIGHT=1 WIDTH=1></OBJECT>

<% ' Lier les tables pour contrôler l'affichage des données %>

<TABLE DATASRC=#RDS>

<TBODY>

<TR class="tbody">

<TD><SPAN DATAFLD="FirstName"></SPAN></TD>

<TD><SPAN DATAFLD="LastName"></SPAN></TD>

</TR>

</TBODY>

</TABLE>

<FORM name="frmInput">

SERVER: <INPUT Name="txtServer" Size="103" Value="http://<%=Request.ServerVariables("SERVER_NAME")%>"><BR>

DATA SOURCE: <INPUT Name="txtDataSource" Size="93" Value="<%=Request.ServerVariables("SERVER_NAME")%>"><BR>

CONNECT: <INPUT Name="txtConnect" Size="100"><BR>

SQL: <INPUT Name="txtSQL" Size="110" Value="Select FirstName, LastName from Employees">

<BR>

<INPUT TYPE=BUTTON NAME="Exécuter" VALUE="Exécuter">

<h4>

Pour afficher la grille de données et la chaîne de connexion dans la zone de texte ci-dessus, cliquez sur 'Exécuter'.

</h4>

</FORM>

<Script Language="VBScript">

' Définir les paramètres de l'objet RDS.DataControl au moment de l'exécution

Sub Run_OnClick

Dim Cnxn

' build connection string

Cnxn = "Provider='sqloledb';"

Cnxn = Cnxn & "Data Source="

Cnxn = Cnxn & document.frmInput.txtDataSource.value & ";"

Cnxn = Cnxn & "Initial Catalog='Northwind';"

Cnxn = Cnxn & "Integrated Security='SSPI';"

' affecter la valeur

document.frmInput.txtConnect.value = Cnxn

MsgBox "Here we go!"

' définir les propriétés RDS

RDS.Server = document.frmInput.txtServer.value

RDS.SQL = document.frmInput.txtSQL.value

RDS.Connect = document.frmInput.txtConnect.value

RDS.Refresh

End Sub

</Script>

</BODY>

</HTML>

<!-- EndConnectVBS -->

Voir aussi

Connect, propriété (RDS)


Exemple de méthode ConvertToString (VBScript)

L'exemple suivant montre comment convertir un objet Recordset en chaîne MIME à l'aide de la méthode RDSServer.DataFactory ConvertToString. Il indique ensuite comment la chaîne peut être reconvertie en Recordset. Coupez et collez le code suivant dans le Bloc-notes ou un autre éditeur de texte, puis enregistrez-le sous ConvertToString.htm.

<!-- BeginConvertToStringVBS -->

<HTML>

<HEAD><TITLE>ConvertToString Example</TITLE><HEAD>

<BODY>

<SCRIPT LANGUAGE=VBSCRIPT>

Sub ConvertToStringX()

Dim objRs, objDF, strServer, vString

Const adcExecSync = 1

Const adcFetchUpFront = 1

' Replace value below with your server name to use without ASP.

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

Set objDF = RDS1.CreateObject("RDSServer.DataFactory", strServer)

Set objRs = objDF.Query(txtConnect.Value,txtQueryRecordset.Value)

' convert Recordset to MIME encoded string

vString = objDF.ConvertToString(objRs)

' display MIME string for demo purposes

txtRS.value = vString

' convert MIME string back to useable ADO Recordset

' using RDS.DataControl

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;Integrated Security='SSPI';">

<BR>

Query:

<INPUT TYPE=Text NAME=txtQueryRecordset SIZE=50

VALUE="select * from authors">

<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>

<!-- EndConvertToStringVBS -->

ConvertToString, méthode (RDS) | Recordset, objet


Exemple de méthode CreateRecordset (VBScript)

Cet exemple de code crée un objet Recordset côté serveur. Il a deux colonnes de quatre lignes chacune. Coupez et collez le code suivant dans le Bloc-notes ou un autre éditeur de texte, puis enregistrez-le sous CreateRecordsetVBS.

<!-- BeginCreateRecordsetVBS -->

<%@ Language=VBScript %>

<html>

<head>

<meta name="VI60_DefaultClientScript" content=VBScript>

<meta name="GENERATOR" content="Microsoft Visual Studio 6.0">

<title>CreateRecordset Method Example (VBScript)</title>

<style>

<!--

body {

font-family: 'Verdana','Arial','Helvetica',sans-serif;

BACKGROUND-COLOR:white;

COLOR:black;

}

.thead {

background-color: #008080;

font-family: 'Verdana','Arial','Helvetica',sans-serif;

font-size: x-small;

color: white;

}

.thead2 {

background-color: #800000;

font-family: 'Verdana','Arial','Helvetica',sans-serif;

font-size: x-small;

color: white;

}

.tbody {

text-align: center;

background-color: #f7efde;

font-family: 'Verdana','Arial','Helvetica',sans-serif;

font-size: x-small;

}

-->

</style>

</head>

<body>

<OBJECT classid=clsid:BD96C556-65A3-11D0-983A-00C04FC29E33 height=1 id=DC1 width=1>

</OBJECT>

<h1>CreateRecordset Method Example (VBScript)</h1>

<script language = "vbscript">

' use the RDS.DataControl to create an empty recordset;

' takes an array of variants where every element is itself another

' array of variants, one for every column required in the recordset

' the elements of the inner array are the column's

' name, type, size, and nullability

Sub GetRS()

Dim Record(2)

Dim Field1(3)

Dim Field2(3)

Dim Field3(3)

' for each field, specify the name type, size, and nullability

Field1(0) = "Name" ' Column name.

Field1(1) = CInt(129) ' Column type.

Field1(2) = CInt(40) ' Column size.

Field1(3) = False ' Nullable?

Field2(0) = "Age"

Field2 (1) = CInt(3)

Field2 (2) = CInt(-1)

Field2 (3) = True

Field3 (0) = "DateOfBirth"

Field3 (1) = CInt(7)

Field3 (2) = CInt(-1)

Field3 (3) = True

' put all fields into an array of arrays

Record(0) = Field1

Record(1) = Field2

Record(2) = Field3

Dim NewRs

Set NewRS = DC1.CreateRecordset(Record)

Dim fields(2)

fields(0) = Field1(0)

fields(1) = Field2(0)

fields(2) = Field3(0)

' Populate the new recordset with data values.

Dim fieldVals(2)

' Use AddNew to add the records.

fieldVals(0) = "Joe"

fieldVals(1) = 5

fieldVals(2) = CDate(#1/5/96#)

NewRS.AddNew fields, fieldVals

fieldVals(0) = "Mary"

fieldVals(1) = 6

fieldVals(2) = CDate(#6/5/94#)

NewRS.AddNew fields, fieldVals

fieldVals(0) = "Alex"

fieldVals(1) = 13

fieldVals(2) = CDate(#1/6/88#)

NewRS.AddNew fields, fieldVals

fieldVals(0) = "Susan"

fieldVals(1) = 13

fieldVals(2) = CDate(#8/6/87#)

NewRS.AddNew fields, fieldVals

NewRS.MoveFirst

' Set the newly created and populated Recordset to

' the SourceRecordset property of the

' RDS.DataControl to bind to visual controls

Set DC1.SourceRecordset = NewRS

End Sub

</script>

<table datasrc="#DC1" align="center">

<thead>

<tr id="ColHeaders" class="thead2">

<th>Name</th>

<th>Age</th>

<th>D.O.B.</th>

</tr>

</thead>

<tbody class="tbody">

<tr>

<td><input datafld="Name" size=15 id=text1 name=text1> </td>

<td><input datafld="Age" size=25 id=text2 name=text2> </td>

<td><input datafld="DateOfBirth" size=25 id=text3 name=text3> </td>

</tr>

</tbody>

</table>

<input type = "button" onclick = "GetRS()" value="Go!">

</body>

</html>

<!-- EndCreateRecordsetVBS -->

CreateRecordset, méthode (RDS) | Recordset, objet


Exemple d'objet DataControl (VBScript)

L'exemple suivant montre comment définir les paramètres RDS.DataControl au moment de la création et comment les associer à un contrôle lié aux bases de données. Coupez ce code et collez-le entre les balises <Body> et </Body> d'un document HTML normal que vous nommerez DataControlDesignVBS.asp. Le script ASP identifiera votre serveur.

<!-- BeginDataControlDesignVBS -->

<%@ Language=VBScript %>

<HTML>

<HEAD>

<META name="VI60_DefaultClientScript" content=VBScript>

<META NAME="GENERATOR" Content="Microsoft Visual Studio 6.0">

<title>RDS DataControl</title>

<%' local style sheet used for display%>

<STYLE>

<!--

BODY {

font-family: 'Verdana','Arial','Helvetica',sans-serif;

BACKGROUND-COLOR:white;

COLOR:black;

}

.thead {

background-color: #008080;

font-family: 'Verdana','Arial','Helvetica',sans-serif;

font-size: x-small;

color: white;

}

.thead2 {

background-color: #800000;

font-family: 'Verdana','Arial','Helvetica',sans-serif;

font-size: x-small;

color: white;

}

.tbody {

text-align: center;

background-color: #f7efde;

font-family: 'Verdana','Arial','Helvetica',sans-serif;

font-size: x-small;

}

-->

</STYLE>

</HEAD>

<BODY>

<H2>Exemple de code de l'API RDS</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 Service avec les paramètres définis au moment de la conception -->

<OBJECT classid="clsid:BD96C556-65A3-11D0-983A-00C04FC29E33"

ID=RDS>

<PARAM NAME="SQL" VALUE="Select * from Employees for browse">

<PARAM NAME="SERVER" VALUE="http://<%=Request.ServerVariables("SERVER_NAME")%>">

<PARAM NAME="CONNECT" VALUE="Provider='sqloledb';Integrated Security='SSPI';Initial Catalog='Northwind'">

</OBJECT>

</BODY>

</HTML>

<!-- EndDataControlDesignVBS -->

L'exemple suivant montre comment définir les paramètres appropriés de l'objet RDS.DataControl au moment de l'exécution. Pour tester cet exemple, coupez et collez le code ci-dessous entre les balises <Body> et </Body> d'un document HTML ordinaire, et nommez-le DataControlRuntimeVBS.asp. Le script ASP identifiera votre serveur.

<!-- BeginDataControlRuntimeVBS -->

<%@ Language=VBScript %>

<html>

<head>

<meta name="VI60_DefaultClientScript" content=VBScript>

<meta name="GENERATOR" content="Microsoft Visual Studio 6.0">

<title>Exemple d'objet Data Control (VBScript)</title>

<%' local style sheet used for display%>

<style>

<!--

body {

font-family: 'Verdana','Arial','Helvetica',sans-serif;

BACKGROUND-COLOR:white;

COLOR:black;

}

.thead {

background-color: #008080;

font-family: 'Verdana','Arial','Helvetica',sans-serif;

font-size: x-small;

color: white;

}

.thead2 {

background-color: #800000;

font-family: 'Verdana','Arial','Helvetica',sans-serif;

font-size: x-small;

color: white;

}

.tbody {

text-align: center;

background-color: #f7efde;

font-family: 'Verdana','Arial','Helvetica',sans-serif;

font-size: x-small;

}

-->

</style>

</head>

<body>

<h1>Exemple d'objet Data Control (VBScript)</h1>

<H2>Exemple de code de l'API RDS</H2>

<HR>

<H3>Remote Data Service Run Time</H3>

<TABLE DATASRC=#RDS>

<TBODY>

<TR>

<TD><SPAN DATAFLD="au_lname"></SPAN></TD>

<TD><SPAN DATAFLD="au_fname"></SPAN></TD>

</TR>

</TBODY>

</TABLE>

<% ' RDS.DataControl sans paramètres définis lors de la conception %>

<OBJECT classid="clsid:BD96C556-65A3-11D0-983A-00C04FC29E33" ID=RDS HEIGHT=1 WIDTH=1></OBJECT>

<FORM name="frmInput">

<HR>

<Input Size="70" Name="txtServer" Value="http://<%=Request.ServerVariables("SERVER_NAME")%>"><BR>

<Input Size="100" Name="txtConnect" Value="Provider='sqloledb';Data Source=<%=Request.ServerVariables("SERVER_NAME")%>;Initial Catalog='Pubs';Integrated Security='SSPI';">

<BR>

<Input Size="70" Name="txtSQL" Value="Select * from Authors">

<HR>

<INPUT TYPE="BUTTON" NAME="Run" VALUE="Run"><BR>

<H4>Affichez la grille avec ces valeurs ou modifiez-les pour afficher les données d'une autre source de données ODBC sur votre serveur</H4>

</FORM>

<Script Language="VBScript">

' Définir les paramètres de l'objet RDS.DataControl au moment de l'exécution

Sub Run_OnClick

RDS.Server = document.frmInput.txtServer.Value

RDS.Connect = document.frmInput.txtConnect.Value

RDS.SQL = document.frmInput.txtSQL.Value

RDS.Refresh

End Sub

</Script>

</body>

</html>

<!-- EndDataControlRuntimeVBS -->

Voir aussi

DataControl, objet (RDS)


Exemple d'objet DataSpace et de méthode CreateObject (VBScript)

Cet exemple montre comment utiliser la méthode CreateObject de l'objet RDS.DataSpace avec l'objet Business par défaut, RDSServer.DataFactory. Pour tester cet exemple, coupez et collez le code ci-dessous entre les balises <Body> et </Body> d'un document HTML ordinaire, et nommez-le DataSpaceVBS.asp. Le script ASP identifiera votre serveur.

<!-- BeginDataSpaceVBS -->

<html>

<head>

<!--utiliser la balise META suivante à la place de adovbs.inc-->

<!--METADATA TYPE="typelib" uuid="00000205-0000-0010-8000-00AA006D2EA4" -->

<meta name="VI60_DefaultClientScript" content=VBScript>

<meta name="GENERATOR" content="Microsoft Visual Studio 6.0">

<title>Exemple d'objet DataSpace et de méthode CreateObject (VBScript)</title>

<style>

<!--

body {

font-family: 'Verdana','Arial','Helvetica',sans-serif;

BACKGROUND-COLOR:white;

COLOR:black;

}

.thead {

background-color: #008080;

font-family: 'Verdana','Arial','Helvetica',sans-serif;

font-size: x-small;

color: white;

}

.thead2 {

background-color: #800000;

font-family: 'Verdana','Arial','Helvetica',sans-serif;

font-size: x-small;

color: white;

}

.tbody {

text-align: center;

background-color: #f7efde;

font-family: 'Verdana','Arial','Helvetica',sans-serif;

font-size: x-small;

}

-->

</style>

</head>

<body>

<h1>Exemple d'objet DataSpace et de méthode CreateObject (VBScript)</h1>

<H2>Exemple de code de l'API RDS</H2>

<HR>

<H3>Utilisation de la méthode Query de l'objet RDSServer.DataFactory</H3>

<!-- RDS.DataSpace ID rdsDS-->

<OBJECT ID="rdsDS" WIDTH=1 HEIGHT=1

CLASSID="CLSID:BD96C556-65A3-11D0-983A-00C04FC29E36">

</OBJECT>

<!-- RDS.DataControl avec les paramètres définis au moment de l'exécution -->

<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="Exécuter" VALUE="Exécuter">

<H4>Cliquez sur Exécuter -

La méthode <i>CreateObject</i> de l'objet RDS.DataSpace crée une instance de l'objet RDSServer.DataFactory.

La méthode <i>Query</i> de l'objet RDSServer.DataFactory permet de récupérer un objet Recordset.</H4>

<Script Language="VBScript">

Dim rdsDF

Dim strServer

Dim strCnxn

Dim strSQL

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

strCnxn = "Provider='sqloledb';Data Source=" & _

"<%=Request.ServerVariables("SERVER_NAME")%>" & ";" & _

"Integrated Security='SSPI';Initial Catalog='Northwind';"

strSQL = "Select FirstName, LastName from Employees"

Sub Run_OnClick()

Dim rs

' Création de l'objet Data Factory

Set rdsDF = rdsDS.CreateObject("RDSServer.DataFactory", strServer)

' Obtention de l'objet Recordset

Set rs = rdsDF.Query(strCnxn, strSQL)

' Utiliser l'objet RDS.DataControl pour associer l'objet Recordset à la table de données ci-avant

RDS.SourceRecordset = rs

End Sub

</Script>

</body>

</html>

<!-- EndDataSpaceVBS -->

L'exemple suivant montre comment utiliser la méthode CreateObject pour créer une instance d'un objet Business personnalisé, VbBusObj.VbBusObjCls. Il utilise également le traitement de script ASP (Active Server Pages) pour identifier le nom du serveur Web.

Pour afficher l'exemple complet, ouvrez le sélecteur des applications exemple. Dans la colonne Niveau client, sélectionnez VBScript dans Internet Explorer. Dans la colonne Niveau intermédiaire, sélectionnez Objet Business personnalisé Visual Basic.

Sub Window_OnLoad()
   strServer = "http://<%=Request.ServerVariables("SERVER_NAME")%>"
   Set BO = ADS1.CreateObject("VbBusObj.VbBusObjCls", strServer)
   txtConnect.Value = "dsn=Pubs;uid=MyUserId;pwd=MyPassword;"
   txtGetRecordset.Value = "Select * From authors for Browse"
End Sub

Voir aussi

CreateObject, méthode (RDS) | DataSpace, objet (RDS)


Exemple d'objet DataFactory, de méthode Query et de méthode CreateObject (VBScript)

Cet exemple montre comment créer un objet RDSServer.DataFactory en utilisant la méthode CreateObject de l'objet RDS.DataSpace. Pour tester cet exemple, coupez et collez le code ci-dessous entre les balises <Body> et </Body> d'un document HTML ordinaire, et nommez-le DataFactoryVBS.asp. Le script ASP identifiera votre serveur.

<!-- BeginDataFactoryVBS -->

<HTML>

<HEAD>

<!--utiliser la balise META suivante à la place de adovbs.inc-->

<!--METADATA TYPE="typelib" uuid="00000205-0000-0010-8000-00AA006D2EA4" -->

<META name="VI60_DefaultClientScript" Content="VBScript">

<META NAME="GENERATOR" Content="Microsoft Visual Studio 6.0">

<TITLE>Exemple d'objet DataFactory, de méthode Query et

de méthode CreateObject (VBScript)</TITLE>

<style>

<!--

body {

font-family: 'Verdana','Arial','Helvetica',sans-serif;

BACKGROUND-COLOR:white;

COLOR:black;

}

.thead {

background-color: #008080;

font-family: 'Verdana','Arial','Helvetica',sans-serif;

font-size: x-small;

color: white;

}

.thead2 {

background-color: #800000;

font-family: 'Verdana','Arial','Helvetica',sans-serif;

font-size: x-small;

color: white;

}

.tbody {

text-align: center;

background-color: #f7efde;

font-family: 'Verdana','Arial','Helvetica',sans-serif;

font-size: x-small;

}

-->

</style>

</HEAD>

<BODY>

<h1>Exemple d'objet DataFactory, de méthode Query et

de méthode CreateObject (VBScript)</h1>

<H2>Exemple de code de l'API RDS</H2>

<HR>

<H3>Utilisation de la méthode RDSServer.DataFactory</H3>

<!-- RDS.DataSpace ID RDS1-->

<OBJECT ID="RDS1" WIDTH=1 HEIGHT=1

CLASSID="CLSID:BD96C556-65A3-11D0-983A-00C04FC29E36">

</OBJECT>

<!-- RDS.DataControl avec les paramètres

définis au moment de l'exécution -->

<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="Exécuter" VALUE="Exécuter">

<BR>

<H4>Cliquez sur Exécuter -

La méthode <i>CreateObject</i> de l'objet RDS.DataSpace crée

une instance de l'objet RDSServer.DataFactory;

La méthode <i>Query</i> de l'objet RDSServer.DataFactory permet

de récupérer un objet Recordset. </H4>

<Script Language="VBScript">

Dim rdsDF

Dim strServer

Dim strCnxn

Dim strSQL

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

strCnxn = "Provider='sqloledb';Integrated Security='SSPI';Initial Catalog='Northwind';"

strSQL = "Select FirstName, LastName from Employees"

Sub Run_OnClick()

' Création de l'objet RDSServer.DataFactory

Dim rs

' Obtention de l'objet Recordset

Set DF = RDS1.CreateObject("RDSServer.DataFactory", strServer)

Set rs = DF.Query(strCnxn, strSQL)

' Définir les paramètres de l'objet RDS.DataControl au moment de l'exécution

RDS.Server = strServer

RDS.SQL = strSQL

RDS.Connect = strCnxn

RDS.Refresh

End Sub

</Script>

</BODY>

</HTML>

<!-- EndDataFactoryVBS -->

Voir aussi

CreateObject, méthode (RDS) | DataFactory, objet (RDSServer) | DataSpace, objet (RDS) | Query, méthode (RDS)


Exemple de propriétés ExecuteOptions et FetchOptions (VBScript)

Le code suivant illustre comment définir les propriétés ExecuteOptions et FetchOptions au moment de la création. Si la propriété ExecuteOptions n'est pas définie, elle correspond à adcExecSync par défaut. Ce paramétrage indique que lorsque la méthode RDS.Refresh est appelée, elle est appliquée au thread d'appel en cours, c'est-à-dire de manière synchrone. Coupez et collez le code suivant dans le Bloc-notes ou dans un autre éditeur de texte, puis nommez-le ExecuteOptionsDesignVBS.asp.

<!-- BeginExecuteOptionsDesignVBS -->

<%@ Language=VBScript %>

<html>

<head>

<meta name="VI60_DefaultClientScript" content=VBScript>

<meta name="GENERATOR" content="Microsoft Visual Studio 6.0">

<title>Exemple de propriétés ExecuteOptions et FetchOptions définies au moment de la création</title>

<style>

<!--

body {

font-family: 'Verdana','Arial','Helvetica',sans-serif;

BACKGROUND-COLOR:white;

COLOR:black;

}

.thead {

background-color: #008080;

font-family: 'Verdana','Arial','Helvetica',sans-serif;

font-size: x-small;

color: white;

}

.thead2 {

background-color: #800000;

font-family: 'Verdana','Arial','Helvetica',sans-serif;

font-size: x-small;

color: white;

}

.tbody {

text-align: center;

background-color: #f7efde;

font-family: 'Verdana','Arial','Helvetica',sans-serif;

font-size: x-small;

}

-->

</style>

</head>

<body>

<h2>Exemple de propriétés ExecuteOptions et FetchOptions définies au moment de la création</h2>

<OBJECT CLASSID="clsid:BD96C556-65A3-11D0-983A-00C04FC29E33" ID=RDS height=1 width=1>

<PARAM NAME="SQL" VALUE="SELECT FirstName, LastName FROM Employees ORDER BY LastName">

<PARAM NAME="Connect" VALUE="Provider='sqloledb';Data Source=<%=Request.ServerVariables("SERVER_NAME")%>;Integrated Security='SSPI';Initial Catalog='Northwind'">

<PARAM NAME="Server" VALUE="http://<%=Request.ServerVariables("SERVER_NAME")%>">

<PARAM NAME="ExecuteOptions" VALUE="1">

<PARAM NAME="FetchOptions" VALUE="3">

</OBJECT>

<TABLE DATASRC=#RDS>

<TBODY>

<TR class="thead2">

<TH>First Name</TH>

<TH>Last Name</TH>

</TR>

<TR class="tbody">

<TD><SPAN DATAFLD="FirstName"></SPAN></TD>

<TD><SPAN DATAFLD="LastName"></SPAN></TD>

</TR>

</TBODY>

</TABLE>

</body>

</html>

<!-- EndExecuteOptionsDesignVBS -->

L'exemple suivant indique comment définir les propriétés ExecuteOptions et FetchOptions au moment de l'exécution en langage VBScript. Consultez la méthode Refresh pour un exemple d'utilisation de ces propriétés. Coupez et collez le code suivant dans le Bloc-notes ou dans un autre éditeur de texte, puis nommez-le ExecuteOptionsRuntimeVBS.asp.

<!-- BeginExecuteOptionsRuntimeVBS -->

<%@ Language=VBScript %>

<html>

<head>

<meta name="VI60_DefaultClientScript" content=VBScript>

<meta name="GENERATOR" content="Microsoft Visual Studio 6.0">

<title>Exemple de propriétés ExecuteOptions et FetchOptions définies au moment de l'exécution</title>

<style>

<!--

body {

font-family: 'Verdana','Arial','Helvetica',sans-serif;

BACKGROUND-COLOR:white;

COLOR:black;

}

.thead {

background-color: #008080;

font-family: 'Verdana','Arial','Helvetica',sans-serif;

font-size: x-small;

color: white;

}

.thead2 {

background-color: #800000;

font-family: 'Verdana','Arial','Helvetica',sans-serif;

font-size: x-small;

color: white;

}

.tbody {

text-align: center;

background-color: #f7efde;

font-family: 'Verdana','Arial','Helvetica',sans-serif;

font-size: x-small;

}

-->

</style>

</head>

<body>

<h2>Exemple de propriétés ExecuteOptions et FetchOptions définies au moment de l'exécution</h2>

<OBJECT CLASSID="clsid:BD96C556-65A3-11D0-983A-00C04FC29E33" ID=RDS height=1 width=1>

<PARAM NAME="SQL" VALUE="SELECT FirstName, LastName FROM Employees ORDER BY LastName">

<PARAM NAME="Connect" VALUE="Provider='sqloledb';Data Source=<%=Request.ServerVariables("SERVER_NAME")%>;Integrated Security='SSPI';Initial Catalog='Northwind'">

<PARAM NAME="Server" VALUE="http://<%=Request.ServerVariables("SERVER_NAME")%>">

</OBJECT>

<TABLE DATASRC=#RDS>

<TBODY>

<TR class="thead2">

<TH>First Name</TH>

<TH>Last Name</TH>

</TR>

<TR class="tbody">

<TD><SPAN DATAFLD="FirstName"></SPAN></TD>

<TD><SPAN DATAFLD="LastName"></SPAN></TD>

</TR>

</TBODY>

</TABLE>

<Script Language="VBScript">

Const adcExecSync = 1

Const adcFetchAsynch = 3

Sub ExecuteHow

' définir les propriétés RDS au moment de l'exécution

RDS1.ExecuteOptions = adcExecSync

RDS1.FetchOptions = adcFetchAsynch

RDS.Refresh

End Sub

</Script>

</body>

</html>

<!-- EndExecuteOptionsRuntimeVBS -->

Voir aussi

ExecuteOptions, propriété (RDS) | FetchOptions, propriété (RDS)


Exemple de propriétés FilterColumn, FilterCriterion, FilterValue, SortColumn et SortDirection, et de méthode Reset (VBScript)

L'exemple suivant montre comment définir le paramètre Server RDS.DataControl au moment de la création et comment l'associer à une table HTML liée aux bases de données à l'aide d'une source de données. Coupez et collez le code suivant dans le Bloc-notes ou dans un autre éditeur de texte, puis nommez-le FilterColumnVBS.asp.

<!-- BeginFilterColumnVBS -->

<%@ Language=VBScript %>

<HTML>

<HEAD>

<META name="VI60_DefaultClientScript" Content="VBScript">

<META NAME="GENERATOR" Content="Microsoft Visual Studio 6.0">

<TITLE>Exemple de propriétés FilterColumn, FilterCriterion, FilterValue, SortColumn, SortDirection

et de méthode Reset (VBScript)</TITLE>

</HEAD>

<BODY>

<h1>Exemple de propriétés FilterColumn, FilterCriterion, FilterValue, SortColumn, SortDirection

et de méthode Reset (VBScript)</h1>

<OBJECT classid="clsid:BD96C556-65A3-11D0-983A-00C04FC29E33" ID=RDS HEIGHT=1 WIDTH=1>

<PARAM NAME="SQL" VALUE="Select FirstName, LastName, Title, ReportsTo, Extension from Employees">

<PARAM NAME="Connect" VALUE="Provider='sqloledb';Data Source=<%=Request.ServerVariables("SERVER_NAME")%>;Integrated Security='SSPI';Initial Catalog='Northwind'">

<PARAM NAME="Server" VALUE="http://<%=Request.ServerVariables("SERVER_NAME")%>">

</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=Title>ReportsTo</OPTION>

<OPTION VALUE=Phone>Extension</OPTION>

</SELECT>

<br>

Sort Direction: <SELECT NAME="cboSortDir">

<OPTION VALUE=""></OPTION>

<OPTION VALUE=TRUE>Ascending</OPTION>

<OPTION VALUE=FALSE>Descending</OPTION>

</SELECT>

<HR WIDTH="25%">

Filter Column: <SELECT NAME="cboFilterColumn">

<OPTION VALUE=""></OPTION>

<OPTION VALUE=FirstName>FirstName</OPTION>

<OPTION VALUE=LastName>LastName</OPTION>

<OPTION VALUE=Title>Title</OPTION>

<OPTION VALUE=Room>ReportsTo</OPTION>

<OPTION VALUE=Phone>Extension</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>FirstName</TH>

<TH>LastName</TH>

<TH>Title</TH>

<TH>Reports To</TH>

<TH>Extension</TH>

</TR>

</THEAD>

<TBODY>

<TR>

<TD><SPAN DATAFLD="FirstName"></SPAN></TD>

<TD><SPAN DATAFLD="LastName"></SPAN></TD>

<TD><SPAN DATAFLD="Title"></SPAN></TD>

<TD><SPAN DATAFLD="ReportsTo"></SPAN></TD>

<TD><SPAN DATAFLD="Extension"></SPAN></TD>

</TR>

</TBODY>

</TABLE>

<Script Language="VBScript">

<!--

Const adFilterNone = 0

Sub SortFilter_OnClick

Dim vCriterion

Dim vSortDir

Dim vSortCol

Dim vFilterCol

' La valeur de SortColumn sera celle

' sélectionnée par l'utilisateur dans

' la zone cboSortColumn.

vSortCol = cboSortColumn.options(cboSortColumn.selectedIndex).value

If(vSortCol <> "") then

RDS.SortColumn = vSortCol

End If

' La valeur de SortDirection sera celle

' spécifiée par l'utilisateur dans la

' zone cboSortdirection.

If (vSortCol <> "") then

vSortDir = cboSortDir.options(cboSortDir.selectedIndex).value

If (vSortDir = "") then

MsgBox "Sélectionnez un ordre de tri."

Exit Sub

Else

If vSortDir = "Croissant" Then vSortDir = "TRUE"

If vSortDir = "Décroissant" Then vSortDir = "FALSE"

RDS.SortDirection = vSortDir

End If

End If

' La valeur de FilterColumn sera celle

' spécifiée par l'utilisateur dans la

' zone cboFilterColumn.

vFilterCol = cboFilterColumn.options(cboFilterColumn.selectedIndex).value

If(vFilterCol <> "") then

RDS.FilterColumn = vFilterCol

End If

' La valeur de FilterCriterion sera celle

' spécifiée par l'utilisateur dans la

' zone cboCriterion.

vCriterion = cboCriterion.options(cboCriterion.selectedIndex).value

If (vCriterion <> "") Then

RDS.FilterCriterion = vCriterion

End If

' txtFilterValue est un contrôle de zone

' de texte. La valeur de FilterValue sera celle

' spécifiée par l'utilisateur dans la

' zone txtFilterValue.

If (txtFilterValue.value <> "") Then

RDS.FilterValue = txtFilterValue.value

End If

' Exécute le tri et le filtrage sur un Recordset

' côté client en fonction des propriétés de tri et de filtre

' spécifiées. En appelant la méthode Reset vous actualisez les résultats

' affichés dans les contrôles liés aux données afin

' d'afficher le jeu d'enregistrements filtré et trié.

RDS.Reset

End Sub

Sub Clear_onClick()

'supprime les contrôles d'entrée HTML

cboSortColumn.selectedIndex = 0

cboSortDir.selectedIndex = 0

cboFilterColumn.selectedIndex = 0

cboCriterion.selectedIndex = 0

txtFilterValue.value = ""

'supprime le filtre

RDS.FilterCriterion = ""

RDS.Reset(FALSE)

End Sub

-->

</Script>

</BODY>

</HTML>

<!-- EndFilterColumnVBS -->

Voir aussi

DataControl, objet (RDS) | FilterColumn, propriété (RDS) | FilterCriterion, propriété (RDS) | FilterValue, propriété (RDS) | Reset, méthode (RDS) | SortColumn, propriété (RDS) | SortDirection, propriété (RDS)


Exemple de propriété ReadyState (VBScript)

L'exemple ci-après montre comment lire la propriété ReadyState de l'objet RDS.DataControl à l'exécution dans le code VBScript. ReadyState est une propriété en lecture seule.

Pour tester cet exemple, coupez le code et collez-le entre les balises <Body> et </Body> d'un document HTML normal, puis nommez-le RDSReadySt.asp. Utilisez la méthode Find pour localiser le fichier Adovbs.inc et placez-le dans votre répertoire de travail. Le script ASP identifiera votre serveur.

<!-- BeginReadyStateVBS -->

<%@ Language=VBScript %>

<% 'use the following META tag instead of adovbs.inc%>

<!--METADATA TYPE="typelib" uuid="00000205-0000-0010-8000-00AA006D2EA4" -->

<html>

<head>

<meta name="VI60_DefaultClientScript" content=VBScript>

<meta name="GENERATOR" content="Microsoft Visual Studio 6.0">

<title>RDS.DataControl ReadyState Property</title>

<style>

<!--

body {

font-family: 'Verdana','Arial','Helvetica',sans-serif;

BACKGROUND-COLOR:white;

COLOR:black;

}

.thead {

background-color: #008080;

font-family: 'Verdana','Arial','Helvetica',sans-serif;

font-size: x-small;

color: white;

}

.thead2 {

background-color: #800000;

font-family: 'Verdana','Arial','Helvetica',sans-serif;

font-size: x-small;

color: white;

}

.tbody {

text-align: center;

background-color: #f7efde;

font-family: 'Verdana','Arial','Helvetica',sans-serif;

font-size: x-small;

}

-->

</style>

</head>

<body>

<H1>Propriété ReadyState d'un objet RDS.DataControl</H1>

<H2>Exemples de code de l'API RDS</H2>

<HR>

<!-- RDS.DataControl avec les paramètres définis au moment de la création -->

<OBJECT classid="clsid:BD96C556-65A3-11D0-983A-00C04FC29E33" ID=RDS>

<PARAM NAME="SQL" VALUE="Select * from Orders">

<PARAM NAME="SERVER" VALUE="http://<%=Request.ServerVariables("SERVER_NAME")%>">

<PARAM NAME="CONNECT" VALUE="Provider='sqloledb';Integrated Security='SSPI';Initial Catalog='Northwind'">

<PARAM NAME="ExecuteOptions" VALUE="2">

<PARAM NAME="FetchOptions" VALUE="3">

</OBJECT>

<TABLE DATASRC=#RDS>

<TBODY>

<TR>

<TD><SPAN DATAFLD="OrderID"></SPAN></TD>

</TR>

</TBODY>

</TABLE>

<Script Language="VBScript">

Sub Window_OnLoad

Select Case RDS.ReadyState

case 2 'adcReadyStateLoaded

MsgBox "Exécution de la requête"

case 3 'adcReadyStateInteractive

MsgBox "Extraction des enregistrements à l'arrière-plan"

case 4 'adcReadyStateComplete

MsgBox "Tous les enregistrements ont été extraits"

End Select

End Sub

</Script>

</body>

</html>

<!-- EndReadyStateVBS -->

Voir aussi

DataControl, objet (RDS) | ReadyState, propriété (RDS)


Exemple de propriétés Recordset et SourceRecordset (VBScript)

L'exemple ci-après montre comment définir les paramètres requis pour l'objet Business par défaut RDSServer.DataFactory au moment de l'exécution.

Pour tester cet exemple, coupez et collez le code ci-dessous entre les balises <Body> and </Body> d'un document HTML ordinaire, et nommez-le RecordsetVBS.asp. Le script ASP identifiera votre serveur.

<!-- BeginRecordSetVBS -->

<%@ Language=VBScript %>

<html>

<head>

<meta name="VI60_DefaultClientScript" content=VBScript>

<meta name="GENERATOR" content="Microsoft Visual Studio 6.0">

<title>Exemple de propriétés Recordset et SourceRecordset (VBScript)</title>

<style>

<!--

body {

font-family: 'Verdana','Arial','Helvetica',sans-serif;

BACKGROUND-COLOR:white;

COLOR:black;

}

.thead {

background-color: #008080;

font-family: 'Verdana','Arial','Helvetica',sans-serif;

font-size: x-small;

color: white;

}

.thead2 {

background-color: #800000;

font-family: 'Verdana','Arial','Helvetica',sans-serif;

font-size: x-small;

color: white;

}

.tbody {

text-align: center;

background-color: #f7efde;

font-family: 'Verdana','Arial','Helvetica',sans-serif;

font-size: x-small;

}

-->

</style>

</head>

<body>

<h1>Exemple de propriétés Recordset et SourceRecordset (VBScript)</h1>

<Center>

<H2>Exemple de code de l'API RDS</H2>

<HR>

<H3>Utilisation des propriétés SourceRecordset et Recordset avec l'objet RDSServer.DataFactory</H3>

<!-- RDS.DataSpace ID RDS1 -->

<OBJECT ID="RDS1" WIDTH=1 HEIGHT=1

CLASSID="CLSID:BD96C556-65A3-11D0-983A-00C04FC29E36">

</OBJECT>

<!-- RDS.DataControl avec les paramètres définis au moment de l'exécution -->

<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></TD>

</TR>

</TABLE>

<HR>

<Input Size=70 Name="txtServer" Value="http://<%=Request.ServerVariables("SERVER_NAME")%>"><BR>

<Input Size=70 Name="txtConnect" Value="Provider='sqloledb';Integrated Security='SSPI';Initial Catalog='Northwind'"><BR>

<Input Size=70 Name="txtSQL" Value="SELECT FirstName, LastName FROM Employees">

<HR>

<INPUT TYPE=BUTTON NAME="Exécuter" VALUE="Exécuter"><BR>

</Center>

<Script Language="VBScript">

Dim rdsDF

Dim strServer

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

Sub Run_OnClick()

Dim rs

' Création de l'objet RDSServer.DataFactory

Set rdsDF = RDS1.CreateObject("RDSServer.DataFactory", strServer)

' Obtention de l'objet Recordset

Set rs = rdsDF.Query(txtConnect.Value,txtSQL.Value)

' Définition des paramètres de l'objet RDS.DataControl au moment de l'exécution

RDC.Server = txtServer.Value

RDC.SQL = txtSQL.Value

RDC.Connect = txtConnect.Value

RDC.Refresh

End Sub

</Script>

</body>

</html>

<!-- EndRecordsetVBS -->

Voir aussi

DataFactory, objet (RDSServer) | Recordset, SourceRecordset, propriétés (RDS)


Exemple de méthode Refresh (VBScript)

L'exemple ci-après montre comment définir les paramètres requis pour l'objet RDS.DataControl au moment de l'exécution. La manière selon laquelle un objet Recordset est extrait à l'aide de la méthode Refresh est déterminée par les paramètres des propriétés ExecuteOptions et FetchOptions. Pour tester cet exemple, coupez le code et collez-le dans un document ASP normal, puis nommez-le RefreshVBS.asp. Utilisez la méthode Find pour localiser le fichier Adovbs.inc et placez-le dans votre répertoire de travail. Le script ASP identifiera votre serveur.

<!-- BeginRefreshVBS -->

<%@ Language=VBScript %>

<!--utiliser la balise META à la place de adovbs.inc-->

<!--METADATA TYPE="typelib" uuid="00000205-0000-0010-8000-00AA006D2EA4" -->

<html>

<head>

<meta name="VI60_DefaultClientScript" content=VBScript>

<meta name="GENERATOR" content="Microsoft Visual Studio 6.0">

<title>Exemple de méthode Refresh (VBScript)</title>

<style>

<!--

body {

font-family: 'Verdana','Arial','Helvetica',sans-serif;

BACKGROUND-COLOR:white;

COLOR:black;

}

.thead {

background-color: #008080;

font-family: 'Verdana','Arial','Helvetica',sans-serif;

font-size: x-small;

color: white;

}

.thead2 {

background-color: #800000;

font-family: 'Verdana','Arial','Helvetica',sans-serif;

font-size: x-small;

color: white;

}

.tbody {

text-align: center;

background-color: #f7efde;

font-family: 'Verdana','Arial','Helvetica',sans-serif;

font-size: x-small;

}

-->

</style>

</head>

<body>

<h1>Exemple de méthode Refresh (VBScript)</h1>

<H2>Exemples de code de l'API RDS</H2>

<HR>

<TABLE DATASRC=#RDC>

<TR>

<TD> <INPUT DATAFLD="FirstName" SIZE=15> </TD>

<TD> <INPUT DATAFLD="LastName" SIZE=15> </TD>

<TD> <INPUT DATAFLD="Title" SIZE=15> </TD>

<TD> <INPUT DATAFLD="HireDate" SIZE=15> </TD>

</TR>

</TABLE>

<!-- Paramètres de RDS.DataControl non définis au moment de la création -->

<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';Integrated Security='SSPI';Initial Catalog='Northwind'"><BR>

SQL: <Input Size=70 Name="txtSQL" Value="Select * from Employees">

<HR>

<TABLE BORDER=1 WIDTH="60%">

<TR>

<TD COLSPAN=3 BGCOLOR=silver>

Choisissez si vous voulez que l'objet Recordset soit synchrone dans le

thread d'appel en cours ou asynchrone dans un autre thread.

</TD>

</TR>

<TR>

<TD>Synchrone: <BR>

<Input Type="Radio" Name="optExecuteOptions" Checked OnClick="SetExO('adcExecSync')">

</TD>

<TD>Asynchrone: <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" 'Default value

FO = "adcFetchBackground" 'Default value

Sub SetExO(NewEO)

EO = NewEO

End Sub

Sub SetFO(NewFO)

FO = NewFO

End Sub

' Définir les paramètres de l'objet RDS.DataControl au moment de l'exécution

Sub Run_OnClick

RDC.Server = txtServer.Value

RDC.SQL = txtSQL.Value

RDC.Connect = txtConnect.Value

If EO = "adcExecSync" Then 'Déterminer la méthode ExecuteOption choisie

RDC.ExecuteOptions = adcExecSync

MsgBox "Recordset synchronisé dans le thread de l'appel en cours"

Else

RDC.ExecuteOptions = adcExecAsync

MsgBox "Recordset asynchrone dans un autre thread"

End If

If FO = "adcFetchBackground" Then 'Déterminer ‘la méthode FetchOption choisie

RDC.FetchOptions = adcFetchBackground

MsgBox "Le contrôle revient à l'utilisateur après le renvoi du premier lot d'enregistrements"

ElseIf FO = " adcFetchUpFront" Then

RDC.FetchOptions = adcFetchUpFront

MsgBox "Tous les enregistrements sont renvoyés avant que le contrôle ne revienne à l'utilisateur"

Else

RDC.FetchOptions = adcFetchAsync

MsgBox "Le contrôle revient immédiatement à l'utilisateur"

End If

RDC.Refresh

End Sub

-->

</Script>

</body>

</html>

<!-- EndRefreshVBS -->

Voir aussi

DataControl, objet (RDS) | ExecuteOptions, propriété (RDS) | FetchOptions, propriété (RDS) | Recordset, objet | Refresh, méthode


Exemple de propriété Server (VBScript)

L'exemple suivant montre comment définir le paramètre RDS.DataControl au moment de la création et comment l'associer à un contrôle lié aux bases de données à l'aide d'un fournisseur SQLOLEDB. Pour tester cet exemple, coupez le code et collez-le dans un document ASP normal, puis nommez-le ServerDesignVBS.asp. Le script identifiera votre serveur.

<!-- BeginServerDesignVBS -->

<%@ Language=VBScript %>

<html>

<head>

<meta name="VI60_DefaultClientScript" content=VBScript>

<meta name="GENERATOR" content="Microsoft Visual Studio 6.0">

<title>Exemple de propriété Server (VBScript)</title>

<style>

<!--

body {

font-family: 'Verdana','Arial','Helvetica',sans-serif;

BACKGROUND-COLOR:white;

COLOR:black;

}

.thead {

background-color: #008080;

font-family: 'Verdana','Arial','Helvetica',sans-serif;

font-size: x-small;

color: white;

}

.thead2 {

background-color: #800000;

font-family: 'Verdana','Arial','Helvetica',sans-serif;

font-size: x-small;

color: white;

}

.tbody {

text-align: center;

background-color: #f7efde;

font-family: 'Verdana','Arial','Helvetica',sans-serif;

font-size: x-small;

}

-->

</style>

</head>

<body>

<h1>Exemple de propriété Server (VBScript)</h1>

<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 Service avec les paramètres définis au moment de la conception -->

<OBJECT classid="clsid:BD96C556-65A3-11D0-983A-00C04FC29E33"

ID=RDS HEIGHT=1 WIDTH=1>

<PARAM NAME="SQL" VALUE="Select * from Employees">

<PARAM NAME="SERVER" VALUE="http://<%=Request.ServerVariables("SERVER_NAME")%>">

<PARAM NAME="CONNECT" VALUE="Provider='sqloledb';Integrated Security='SSPI';Initial Catalog='Northwind'">

</OBJECT>

</body>

</html>

<!-- EndServerDesignVBS -->

L'exemple suivant montre comment définir les paramètres appropriés de l'objet RDS.DataControl à l'exécution. Pour tester cet exemple, coupez le code et collez-le dans un document ASP normal, puis nommez-le ServerRuntimeVBS.asp. Le script ASP identifiera votre serveur.

<!-- BeginServerRuntimeVBS -->

<%@ Language=VBScript %>

<html>

<head>

<meta name="VI60_DefaultClientScript" content=VBScript>

<meta name="GENERATOR" content="Microsoft Visual Studio 6.0">

<title>Exemple de propriété Server (VBScript)</title>

<style>

<!--

body {

font-family: 'Verdana','Arial','Helvetica',sans-serif;

BACKGROUND-COLOR:white;

COLOR:black;

}

.thead {

background-color: #008080;

font-family: 'Verdana','Arial','Helvetica',sans-serif;

font-size: x-small;

color: white;

}

.thead2 {

background-color: #800000;

font-family: 'Verdana','Arial','Helvetica',sans-serif;

font-size: x-small;

color: white;

}

.tbody {

text-align: center;

background-color: #f7efde;

font-family: 'Verdana','Arial','Helvetica',sans-serif;

font-size: x-small;

}

-->

</style>

</head>

<body>

<h1>Exemple de propriété Server (VBScript)</h1>

<H2>Exemple de code de l'API RDS</H2>

<H3>Propriété Server de Remote Data Service définie au moment de l'exécution</H3>

<!-- Paramètres de RDS.DataControl non définis au moment de la création -->

<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';Integrated Security='SSPI';Initial Catalog='Northwind'">

<BR>

<Input Size=70 Name="txtSQL" Value="Select * from Employees">

<HR>

<INPUT TYPE=BUTTON NAME="Exécuter" VALUE="Exécuter"><BR>

<Script Language="VBScript">

<!--

' Définir les paramètres de l'objet RDS.DataControl au moment de l'exécution

Sub Run_OnClick

RDC.Server = txtServer.Value

RDC.SQL = txtSQL.Value

RDC.Connect = txtConnect.Value

RDC.Refresh

End Sub

-->

</Script>

</body>

</html>

<!-- EndServerRuntimeVBS -->

DataControl, objet (RDS) | Server, propriété (RDS)


Exemple de propriété SQL (VBScript)

Le code ci-après montre comment définir le paramètre SQL de l'objet RDS.DataControl au moment de la création et comment l'associer à un contrôle lié aux bases de données à l'aide de la base de données appelée Pubs, livrée avec Microsoft® SQL Server™. Pour tester cet exemple, coupez le code ci-après et collez-le dans un document ASP normal, puis nommez-le SQLDesignVBS.asp sur votre serveur Web.

<!-- BeginSQLDesignVBS -->

<%@ Language=VBScript %>

<html>

<head>

<meta name="VI60_DefaultClientScript" content=VBScript>

<meta name="GENERATOR" content="Microsoft Visual Studio 6.0">

<title>Exemple de propriété SQL (VBScript)</title>

<style>

<!--

body {

font-family: 'Verdana','Arial','Helvetica',sans-serif;

BACKGROUND-COLOR:white;

COLOR:black;

}

.thead {

background-color: #008080;

font-family: 'Verdana','Arial','Helvetica',sans-serif;

font-size: x-small;

color: white;

}

.thead2 {

background-color: #800000;

font-family: 'Verdana','Arial','Helvetica',sans-serif;

font-size: x-small;

color: white;

}

.tbody {

text-align: center;

background-color: #f7efde;

font-family: 'Verdana','Arial','Helvetica',sans-serif;

font-size: x-small;

}

-->

</style>

</head>

<body>

<h1>Exemple de propriété SQL (VBScript)</h1>

<!-- RDS.DataControl -->

<OBJECT classid="clsid:BD96C556-65A3-11D0-983A-00C04FC29E33" ID=RDC HEIGHT=1 WIDTH=1>

<PARAM NAME="SQL" VALUE="Select FirstName, LastName from Employees">

<PARAM NAME="SERVER" VALUE="http://<%=Request.ServerVariables("SERVER_NAME")%>">

<PARAM NAME="CONNECT" VALUE="Provider='sqloledb';Initial Catalog='Northwind';Integrated Security='SSPI';">

</OBJECT>

<!-- Data Table -->

<TABLE DATASRC=#RDC BORDER=1>

<TR>

<TD> <SPAN DATAFLD="FirstName"></SPAN> </TD>

<TD> <SPAN DATAFLD="LastName"></SPAN> </TD>

</TR>

</TABLE>

</body>

</html>

<!-- EndSQLDesignVBS -->

L'exemple suivant montre comment définir les paramètres appropriés de l'objet RDS.DataControl à l'exécution. Pour tester cet exemple, coupez le code et collez-le dans un document ASP normal, puis nommez-le SQLRuntimeVBS.asp. Le script ASP identifiera votre serveur.

<!-- BeginServerRuntimeVBS -->

<%@ Language=VBScript %>

<html>

<head>

<meta name="VI60_DefaultClientScript" content=VBScript>

<meta name="GENERATOR" content="Microsoft Visual Studio 6.0">

<title>Exemple de propriété Server (VBScript)</title>

<style>

<!--

body {

font-family: 'Verdana','Arial','Helvetica',sans-serif;

BACKGROUND-COLOR:white;

COLOR:black;

}

.thead {

background-color: #008080;

font-family: 'Verdana','Arial','Helvetica',sans-serif;

font-size: x-small;

color: white;

}

.thead2 {

background-color: #800000;

font-family: 'Verdana','Arial','Helvetica',sans-serif;

font-size: x-small;

color: white;

}

.tbody {

text-align: center;

background-color: #f7efde;

font-family: 'Verdana','Arial','Helvetica',sans-serif;

font-size: x-small;

}

-->

</style>

</head>

<body>

<h1>Exemple de propriété Server (VBScript)</h1>

<H2>Exemple de code de l'API RDS</H2>

<H3>Propriété Server de Remote Data Service définie au moment de l'exécution</H3>

<!-- Paramètres de RDS.DataControl non définis au moment de la création -->

<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';Integrated Security='SSPI';Initial Catalog='Northwind'">

<BR>

<Input Size=70 Name="txtSQL" Value="Select * from Employees">

<HR>

<INPUT TYPE=BUTTON NAME="Exécuter" VALUE="Exécuter"><BR>

<Script Language="VBScript">

<!--

' Définir les paramètres de l'objet RDS.DataControl au moment de l'exécution

Sub Run_OnClick

RDC.Server = txtServer.Value

RDC.SQL = txtSQL.Value

RDC.Connect = txtConnect.Value

RDC.Refresh

End Sub

-->

</Script>

</body>

</html>

<!-- EndServerRuntimeVBS -->

Voir aussi

DataControl, objet (RDS) | SQL, propriété (RDS)


Exemple de méthode SubmitChanges (VBScript)

Le fragment de code ci-dessous illustre l'utilisation de la méthode SubmitChanges avec un objet RDS.DataControl.

Pour tester cet exemple, coupez le code et collez-le dans un document ASP normal, puis nommez-le SubmitChangesCtrlVBS.asp.Le script ASP identifiera votre serveur.

<!-- BeginCancelUpdateVBS -->

<%@Language=VBScript%>

<%'Option Explicit%>

<% 'utiliser la balise META suivante à la place de adovbs.inc%>

<!--METADATA TYPE="typelib" uuid="00000205-0000-0010-8000-00AA006D2EA4" -->

<HTML>

<HEAD>

<META NAME="GENERATOR" Content="Microsoft Visual Studio 6.0">

<TITLE></TITLE>

</HEAD>

<BODY>

<CENTER>

<H1>Remote Data Service</H1>

<H2>Méthodes SubmitChanges et CancelUpdate</H2>

<% ' pour intégrer/tester ce code remplacez la valeur de la propriété Server et

' la valeur Data Source dans la propriété Connect par les valeurs appropriées%>

<HR>

<OBJECT ID=RDS classid="clsid:BD96C556-65A3-11D0-983A-00C04FC29E33" HEIGHT=1 WIDTH=1></OBJECT>

<SCRIPT Language="VBScript">

'définir les propriétés RDS pour le contrôle créé

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

RDS.SQL = "Select * from Employees"

RDS.Connect = "Provider='sqloledb';Integrated Security='SSPI';Initial Catalog='Northwind';"

RDS.Refresh

</SCRIPT>

<TABLE DATASRC=#RDS>

<THEAD>

<TR ID="ColHeaders">

<TH>ID</TH>

<TH>FName</TH>

<TH>LName</TH>

<TH>Title</TH>

<TH>Hire Date</TH>

<TH>Birth Date</TH>

<TH>Extension</TH>

<TH>Home Phone</TH>

</TR>

</THEAD>

<TBODY>

<TR>

<TD> <INPUT DATAFLD="EmployeeID" size=4> </TD>

<TD> <INPUT DATAFLD="FirstName" size=10> </TD>

<TD> <INPUT DATAFLD="LastName" size=10> </TD>

<TD> <INPUT DATAFLD="Title" size=10> </TD>

<TD> <INPUT DATAFLD="HireDate" size=10> </TD>

<TD> <INPUT DATAFLD="BirthDate" size=10> </TD>

<TD> <INPUT DATAFLD="Extension" size=10> </TD>

<TD> <INPUT DATAFLD="HomePhone" 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>Modifier une entrée en cours dans la grille. Supprimer cette ligne. <BR>

Soumettre les modifications au système de gestion de la base de données ou annuler les mises à jour. </H4>

</CENTER>

<SCRIPT Language="VBScript">

Sub SubmitChange_OnClick

msgbox "Les modifications vont être effectuées"

RDS.SubmitChanges

RDS.Refresh

End Sub

Sub CancelChange_OnClick

msgbox "Les modifications vont être annulées"

RDS.CancelUpdate

RDS.Refresh

End Sub

-->

</SCRIPT>

</BODY>

</HTML>

<!-- EndCancelUpdateVBS -->

Voir aussi

DataControl, objet (RDS) | SubmitChanges, méthode (RDS)


Exemple de propriété URL (VBScript)

Le code suivant montre comment définir la propriété URL côté client pour spécifier un fichier .ASP, qui à son tour gère la présentation des modifications apportées à la source de données.

<!-- BeginURLClientVBS -->

<%@ Language=VBScript %>

<html>

<head>

<meta name="VI60_DefaultClientScript" content=VBScript>

<meta name="GENERATOR" content="Microsoft Visual Studio 6.0">

<title>Exemple de propriété URL (VBScript)</title>

<style>

<!--

body {

font-family: 'Verdana','Arial','Helvetica',sans-serif;

BACKGROUND-COLOR:white;

COLOR:black;

}

.thead {

background-color: #008080;

font-family: 'Verdana','Arial','Helvetica',sans-serif;

font-size: x-small;

color: white;

}

.thead2 {

background-color: #800000;

font-family: 'Verdana','Arial','Helvetica',sans-serif;

font-size: x-small;

color: white;

}

.tbody {

text-align: center;

background-color: #f7efde;

font-family: 'Verdana','Arial','Helvetica',sans-serif;

font-size: x-small;

}

-->

</style>

</head>

<body onload=Getdata()>

<h1>Exemple de propriété URL (VBScript)</h1>

<OBJECT classid=clsid:BD96C556-65A3-11D0-983A-00C04FC29E33 height=1 id=ADC width=1>

</OBJECT>

<table datasrc="#ADC" align="center">

<thead>

<tr id="ColHeaders" class="thead2">

<th>FirstName</th>

<th>LastName</th>

<th>Extension</th>

</tr>

</thead>

<tbody class="tbody">

<tr>

<td><input datafld="FirstName" size=15> </td>

<td><input datafld="LastName" size=25> </td>

<td><input datafld="Extension" size=15> </td>

</tr>

</tbody>

</table>

<script Language="VBScript">

Sub Getdata()

msgbox "getdata"

ADC.URL = "http://<%=Request.ServerVariables("SERVER_NAME")%>/URLServerVBS.asp"

ADC.Refresh

End Sub

</script>

</body>

</html>

<!-- EndURLClientVBS -->

Le code côté serveur existant dans URLServerVBS.asp soumet l'objet Recordset mis à jour à la source de données.

<!-- BeginURLServerVBS -->

<%@ Language=VBScript %>

<%

' XML output req's

Response.ContentType = "text/xml"

const adPersistXML = 1

' recordset vars

Dim strSQL, rsEmployees

Dim strCnxn, Cnxn

strCnxn = "Provider='sqloledb';Data Source=" & _

Request.ServerVariables("SERVER_NAME") & ";" & _

"Integrated Security='SSPI';Initial Catalog='Northwind';"

Set Cnxn = Server.CreateObject("ADODB.Connection")

Set rsEmployees = Server.CreateObject("ADODB.Recordset")

strSQL = "SELECT FirstName, LastName, Extension FROM Employees"

Cnxn.Open strCnxn

rsEmployees.Open strSQL, Cnxn

' output as XML

rsEmployees.Save Response, adPersistXML

' Clean up

rsEmployees.Close

Cnxn.Close

Set rsEmployees = Nothing

Set Cnxn = Nothing

%>

<!-- EndURLServerVBS -->

Voir aussi

URL, propriété (RDS)


Exemples de code RDS en Microsoft Visual C++

Utilisez les exemples de code suivants pour apprendre à utiliser les propriétés RDS lorsque vous programmez en Microsoft Visual C++.

Remarque Collez l'exemple de code dans sa totalité, du début à la fin, dans votre éditeur de code. L'exemple risque de ne pas fonctionner correctement si des copies partielles d'exemple sont utilisées ou si la mise en forme des paragraphes est perdue.
  • Exemple de propriété Handler
  • Exemple de propriété InternetTimeout


Exemple de propriété Handler (VC++)

Cet exemple utilise la propriété Handler de l'objet DataControl RDS. (Pour plus de détails, consultez Personnalisation de DataFactory.)

Supposons les sections suivantes dans le fichier des paramètres, Msdfmap.ini, qui se trouve sur le serveur :

[connect AuthorDataBase]
Access=ReadWrite
Connect="DSN=Pubs"
[sql AuthorById]
SQL="SELECT * FROM Authors WHERE au_id = ?"

Votre code ressemblerait à ce qui suit. La commande attribuée à la propriété SQL correspondra à l'identificateur AuthorById et extraira une ligne pour l'auteur Michael O'Leary. Bien que la propriété Connect dans le code spécifie la source de données Les Comptoirs, cette dernière sera remplacée par la section connect du fichier Msdfmap.ini. La propriété Recordset de l'objet DataControl est affectée à un objet Recordset déconnecté, tout simplement pour les besoins de codage.

// BeginHandlerCpp

#import "c:\Program Files\Common Files\System\ADO\msado15.dll" \

no_namespace rename("EOF", "EndOfFile")

#import "C:\Program Files\Common Files\System\MSADC\msadco.dll"

#include <ole2.h>

#include <stdio.h>

#include <conio.h>

// Function declarations

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 Function //

// //

//////////////////////////////////////////////////////////

void main()

{

HRESULT hr = S_OK;

hr = ::CoInitialize(NULL);

if (SUCCEEDED(hr))

{

HandlerX();

printf("Press any key to continue...");

getch();

::CoUninitialize();

}

}

//////////////////////////////////////////////////////////

// //

// HandlerX Function //

// //

//////////////////////////////////////////////////////////

void HandlerX(void)

{

HRESULT hr = S_OK;

// Define ADO object pointers.

// Initialize pointers on define.

// These are in the ADODB:: namespace.

_RecordsetPtr pRst = NULL;

//Define RDS object pointers.

RDS::IBindMgrPtr dc;

try

{

TESTHR(hr = dc.CreateInstance(__uuidof(RDS::DataControl)));

dc->Handler = "MSDFMAP.Handler";

dc->Server = "http://MyServer";

dc->Connect = "Data Source=AuthorDatabase";

dc->SQL = "AuthorById('267-41-2394')";

// Retrieve the record.

dc->Refresh();

// Use another Recordset as a convenience.

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();

} // End Try statement.

catch (_com_error &e)

{

PrintProviderError(pRst->GetActiveConnection());

PrintComError(e);

}

}

//////////////////////////////////////////////////////////

// //

// PrintProviderError Function //

// //

//////////////////////////////////////////////////////////

void PrintProviderError(_ConnectionPtr pConnection)

{

// Print Provider Errors from Connection object.

// pErr is a record object in the Connection's Error collection.

ErrorPtr pErr = NULL;

long nCount = 0;

long i = 0;

if( (pConnection->Errors->Count) > 0)

{

nCount = pConnection->Errors->Count;

// Collection ranges from 0 to nCount -1.

for(i = 0; i < nCount; i++)

{

pErr = pConnection->Errors->GetItem(i);

printf("\t Error number: %x\t%s", pErr->Number, pErr->Description);

}

}

}

//////////////////////////////////////////////////////////

//

// PrintComError Function //

// //

//////////////////////////////////////////////////////////

void PrintComError(_com_error &e)

{

_bstr_t bstrSource(e.Source());

_bstr_t bstrDescription(e.Description());

// Print Com errors.

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);

}

// EndHandlerCpp

Voir aussi

DataControl, objet (RDS) | Handler, propriété (RDS)


Exemple de propriété InternetTimeout (VC++)

Cet exemple met en application la propriété InternetTimeout, qui existe sur les objets DataControl et DataSpace. En ce cas, la propriété InternetTimeout s'applique à l'objet DataControl et le délai d'attente est fixé à 20 secondes.

// BeginInternetTimeoutCpp

#import "c:\Program Files\Common Files\System\ADO\msado15.dll" \

no_namespace rename("EOF", "EndOfFile")

#import "C:\Program Files\Common Files\System\MSADC\msadco.dll"

#include <ole2.h>

#include <stdio.h>

#include <conio.h>

// Function declarations

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 Function //

// //

//////////////////////////////////////////////////////////

void main()

{

if(FAILED(::CoInitialize(NULL)))

return;

InternetTimeOutX();

::CoUninitialize();

}

//////////////////////////////////////////////////////////

// //

// InternetTimeOutX Function //

// //

//////////////////////////////////////////////////////////

void InternetTimeOutX(void)

{

HRESULT hr = S_OK;

// Define ADO object pointers.

// Initialize pointers on define.

// These are in the ADODB:: namespace.

_RecordsetPtr pRst = NULL;

//Define RDS object pointers

RDS::IBindMgrPtr dc ;

try

{

TESTHR(dc.CreateInstance(__uuidof(RDS::DataControl)));

dc->Server = "http://MyServer";

dc->Connect = "Data Source='AuthorDatabase'";

dc->SQL = "SELECT * FROM Authors";

// Wait at least 20 seconds.

dc->InternetTimeout = 20000;

dc->Refresh();

// Use another Recordset as a convenience

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 Function //

// //

//////////////////////////////////////////////////////////

void PrintProviderError(_ConnectionPtr pConnection)

{

// Print Provider Errors from Connection object.

// pErr is a record object in the Connection's Error collection.

ErrorPtr pErr = NULL;

if( (pConnection->Errors->Count) > 0)

{

long nCount = pConnection->Errors->Count;

// Collection ranges from 0 to 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 Function //

// //

//////////////////////////////////////////////////////////

void PrintComError(_com_error &e)

{

_bstr_t bstrSource(e.Source());

_bstr_t bstrDescription(e.Description());

// Print Com errors.

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);

}

// EndInternetTimeoutCpp

Voir aussi

InternetTimeout, propriété (RDS)


Exemples de code RDS en Microsoft Visual J++

Utilisez les exemples de code suivants pour apprendre à utiliser les propriétés RDS lorsque vous programmez en Microsoft Visual J++.

Remarque Collez l'exemple de code dans sa totalité, du début à la fin, dans votre éditeur de code. L'exemple risque de ne pas fonctionner correctement si des copies partielles d'exemple sont utilisées ou si la mise en forme des paragraphes est perdue.
  • Exemple de propriété Handler
  • Exemple de propriété InternetTimeout


Exemple de propriété Handler (VJ++)

Cet exemple utilise la propriété Handler de l'objet DataControl RDS. (Pour plus de détails, consultez Personnalisation de DataFactory.)

Supposons les sections suivantes dans le fichier des paramètres, Msdfmap.ini, qui se trouve sur le serveur :

[connect AuthorDataBase]
Access=ReadWrite
Connect="DSN=Pubs"
[sql AuthorById]
SQL="SELECT * FROM Authors WHERE au_id = ?"

Votre code ressemblerait à ce qui suit. La commande attribuée à la propriété SQL correspondra à l'identificateur AuthorById et extraira une ligne pour l'auteur Michael O'Leary. Bien que la propriété Connect dans le code spécifie la source de données Les Comptoirs, cette dernière sera remplacée par la section connect du fichier Msdfmap.ini. La propriété Recordset de l'objet DataControl est affectée à un objet Recordset déconnecté, tout simplement pour les besoins de codage.

// BeginHandlerJ

import com.ms.wfc.data.*;

import com.ms.wfc.data.rds.*;

import java.io.* ;

public class HandlerX

{

// The main entry point for the application.

public static void main (String[] args)

{

HandlerX();

System.exit(0);

}

// HandlerX function

static void HandlerX()

{

// Define ADO Objects.

Recordset rstAuthors = null;

// Declarations.

BufferedReader in =

new BufferedReader (new InputStreamReader(System.in));

int intCount = 0;

int intDisplaysize = 15;

try

{

IBindMgr dc = (IBindMgr) new DataControl();

dc.setServer("MyServer");

dc.setConnect("Data Source=Northwind");

dc.setSQL("AuthorById(267-41-2394)");

dc.Refresh(); // Retrieve the record.

// Use another recordset as a convenience.

rstAuthors = (Recordset)dc.getRecordset();

System.out.println("Author is '" +

rstAuthors.getField("au_fname").getString() +

" " +

rstAuthors.getField("au_lname").getString() +

"'");

System.out.println("\nPress <Enter> to continue..");

in.readLine();

}

catch( AdoException ae )

{

// Notify user of any errors that result from ADO.

// As passing a Recordset, check for null pointer first.

if (rstAuthors != null)

{

PrintProviderError(rstAuthors.getActiveConnection());

}

else

{

System.out.println("Exception: " + ae.getMessage());

}

}

// System read requires this catch.

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.");

}

finally

{

// Cleanup objects before exit.

if (rstAuthors != null)

if (rstAuthors.getState() == 1)

rstAuthors.close();

}

}

// PrintProviderError Function

static void PrintProviderError( Connection Cnn1 )

{

// Print Provider errors from Connection object.

// ErrItem is an item object in the Connection’s Errors collection.

com.ms.wfc.data.Error ErrItem = null;

long nCount = 0;

int i = 0;

nCount = Cnn1.getErrors().getCount();

// If there are any errors in the collection, print them.

if( nCount > 0);

{

// Collection ranges from 0 to 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 Function

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");

}

}

// EndHandlerJ

Voir aussi

DataControl, objet (RDS) | Handler, propriété (RDS)


Exemple de propriété InternetTimeout (VJ++)

Cet exemple met en application la propriété InternetTimeout, qui existe sur les objets DataControl et DataSpace. En ce cas, la propriété InternetTimeout s'applique à l'objet DataControl et le délai d'attente est fixé à 20 secondes.

// BeginInternetTimeoutJ

// The WFC class includes the ADO objects.

import com.ms.wfc.data.*;

import com.ms.wfc.data.rds.*;

import java.io.* ;

public class InternetTimeoutX

{

// The main entry point for the application.

public static void main (String[] args)

{

InternetTimeoutX();

System.exit(0);

}

// InternetTimeoutX function

static void InternetTimeoutX()

{

// Define ADO Objects.

Recordset rstAuthors = null;

// Declarations.

BufferedReader in =

new BufferedReader (new InputStreamReader(System.in));

int intCount = 0;

int intDisplaysize = 15;

try

{

IBindMgr dc = (IBindMgr) new DataControl();

dc.setServer("http://MyServer");

dc.setConnect("DSN=pubs");

dc.setSQL("SELECT * FROM Authors");

dc.setInternetTimeout(20000); // Wait at least 20 seconds.

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();

}

System.out.println("\nPress <Enter> to continue..");

in.readLine();

}

catch( AdoException ae )

{

// Notify user of any errors that result from ADO.

// As passing a Recordset, check for null pointer first.

if (rstAuthors != null)

{

PrintProviderError(rstAuthors.getActiveConnection());

}

else

{

System.out.println("Exception: " + ae.getMessage());

}

}

// System read requires this catch.

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.");

}

finally

{

// Cleanup objects before exit.

if (rstAuthors != null)

if (rstAuthors.getState() == 1)

rstAuthors.close();

}

}

// PrintProviderError Function

static void PrintProviderError( Connection Cnn1 )

{

// Print Provider errors from Connection object.

// ErrItem is an item object in the Connection’s Errors collection.

com.ms.wfc.data.Error ErrItem = null;

long nCount = 0;

int i = 0;

nCount = Cnn1.getErrors().getCount();

// If there are any errors in the collection, print them.

if( nCount > 0);

{

// Collection ranges from 0 to 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 Function

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");

}

}

// EndInternetTimeoutJ

Voir aussi

InternetTimeout, propriété (RDS)


Référence API ADO MD

Cette section de la documentation ADO MD contient des rubriques concernant chaque objet, collection, méthode et propriété ADO MD, ainsi que des exemples de code lorsque cela est utile. Pour plus d'informations, recherchez une rubrique particulière dans l'index ou consultez les rubriques suivantes :

  • Objets ADO MD
  • Collections ADO MD
  • Propriétés ADO MD
  • Méthodes ADO MD
  • Constantes énumérées ADO MD
  • Exemples ADO MD

Voir aussi

Exemples de code ADO MD | Collections ADO MD | Constantes énumérées ADO MD | Méthodes ADO MD | Modèle d'objet ADO MD | Objets ADO MD | Propriétés ADO MD


Modèle d'objet ADO MD

Le diagramme suivant montre comment ces objets sont représentés et leur relation avec ADO MD.

Les objets Axis et Cell ont chacun une collection Positions.

Les objets Level et Position ont chacun une collection Members.

Les objets Axis, Cell, Cellset, CubeDef, Dimension, Hierarchy, Level et Member possède chacun une collection Properties ADO standard.

Voir aussi

Référence API ADO MD | Exemples de code ADO MD | Collections ADO MD | Constantes énumérées ADO MD | Méthodes ADO MD | Objets ADO MD | Propriétés ADO MD | Guide de référence du programmeur de Microsoft ADO MD | Vue d'ensemble des schémas et des données multidimensionnels | Utilisation des données multidimensionnelles


Objets ADO MD

Axis | Représente un axe de position ou de filtre d'un jeu de cellules, contenant des membres sélectionnés, d'une ou plusieurs dimensions.
Catalog | Contient des informations sur les schémas multidimensionnels (les cubes et leurs dimensions sous-jacentes, les hiérarchies, les niveaux et les membres) propres au fournisseur de données multidimensionnelles (MDP).
Cell | Représente les données contenues dans un jeu de cellules, à l'intersection des coordonnées des axes.
Cellset | Représente les résultats d'une requête multidimensionnelle. C'est une collection de cellules sélectionnées parmi des cubes ou d'autres jeux de cellules.
CubeDef | Représente un cube d'un schéma multidimensionnel, contenant un jeu de dimensions associées.
Dimension | Représente une des dimensions d'un cube multidimensionnel et contient une hiérarchie de membres (ou plusieurs).
Hierarchy | Représente une façon par laquelle les membres d'une dimension peuvent être regroupés ou « déroulés ». Une dimension peut être reliée sur une ou plusieurs hiérarchies.
Level | Contient un jeu de membres occupant chacun le même rang au sein de la hiérarchie.
Member | Représente un membre d'un niveau dans un cube, les enfants d'un membre d'un niveau ou un membre ayant une position sur l'axe d'un jeu de cellules.
Position | Représente un jeu d'un ou plusieurs membres de dimensions différentes qui définissent un point sur un axe.

De même, l'objet Catalog est connecté à un objet ADO Connection, inclus dans la bibliothèque ADO standard :

Objet | Description
Connection | Représente une connexion ouverte à une source de données.

Les relations entre ces objets sont représentées dans le Modèle d'objet ADO MD.

De nombreux objets ADO MD peuvent être compris dans une collection correspondante. Par exemple, un objet CubeDef peut être contenu dans une collection CubeDefs d'un Catalog. Pour plus d'informations, consultez Collections ADO MD.

Voir aussi

Référence API ADO MD | Exemples de code ADO MD | Collections ADO MD | Constantes énumérées ADO MD | Méthodes ADO MD | Modèle d'objet ADO MD | Propriétés ADO MD


Axis, objet (ADO MD)

Référence API ADO 2.5 MD

Axis, objet

Représente un axe de position ou de filtre d'un jeu de cellules, contenant des membres sélectionnés, d'une ou plusieurs dimensions.

Remarques

Un objet Axis peut être conservé dans une collection Axes ou renvoyé par la propriété FilterAxis d'un Cellset.

Avec les collections et propriétés d'un objet Axis, vous pouvez :

  • identifier l'objet Axis à l'aide de la propriété Name ;
  • itérer sur chaque position sur un Axis à l'aide de la collection Positions ;
  • obtenir le nombre de dimensions sur l'Axis à l'aide de la propriété DimensionCount ;
  • obtenir les attributs de l'Axis propres à un fournisseur avec la collection ADO standard Properties.

Voir aussi

Exemple de VBScript

Propriétés, méthodes et événements | Axes, collection | Positions, collection | Properties, collection


Propriétés, méthodes et événements

Référence API ADO 2.5 MD

Propriétés, méthodes et événements de l'objet Axis

Propriétés/Collections

DimensionCount, propriété

Name, propriété

Positions, collection

Properties, collection

Méthodes

Aucune.

Événements

Aucun.

S'applique à : Axis, objet


Catalog, objet (ADO MD)

Référence API ADO 2.5 MD

Catalog, objet

Contient des informations sur les schémas multidimensionnels (les cubes et leurs dimensions sous-jacentes, les hiérarchies, les niveaux et les membres) propres au fournisseur de données multidimensionnelles (MDP).

Remarques

Avec les collections et propriétés d'un objet Catalog, vous pouvez :

  • ouvrir le catalogue en affectant la propriété ActiveConnection à un objet ADO Connection standard ou à une chaîne de connexion valide ;
  • identifier l'objet Catalog à l'aide de la propriété Name ;
  • itérer dans un catalogue à travers les cubes à l'aide de la collection CubeDefs.

Voir aussi

Exemple pour Visual Basic

Propriétés, méthodes et événements | Connection, objet | CubeDefs, collection


Propriétés, méthodes et événements

Référence API ADO 2.5 MD

Propriétés, méthodes et événements de l'objet Catalog

Propriétés/Collections

ActiveConnection, propriété

CubeDefs, collection

Name, propriété

Méthodes

Aucune.

Événements

Aucun.

S'applique à : Catalog, objet


Cell, objet (ADO MD)

Référence API ADO 2.5 MD

Cell, objet

Représente les données à l'intersection des coordonnées d'axes, contenues dans un jeu de cellules.

Remarques

Un objet Cell est renvoyé par la propriété Item d'un objet Cellset.

Avec les collections et propriétés d'un objet Cell, vous pouvez :

  • renvoyer les données de l'objet Cell avec la propriété Value ;
  • renvoyer la chaîne représentant l'affichage mis en forme de la propriété Value avec la propriété FormattedValue ;
  • renvoyer la valeur ordinale de l'objet Cell contenue dans le Cellset avec la propriété Ordinal ;
  • déterminer la position de l'objet Cell à l'intérieur du CubeDef avec la collection Positions ;
  • extraire d'autres informations concernant le Cell avec la collection ADO standard Properties.

La collection Properties contient des propriétés en provenance du fournisseur. Le tableau suivant liste les propriétés vraisemblablement disponibles. La liste de propriétés effective peut différer de celle-ci selon l'installation du fournisseur. Consultez votre documentation pour la liste plus complète des propriétés disponibles.

Nom | Description
BackColor | Couleur de l'arrière-plan à l'affichage de la cellule.
FontFlags | Masque binaire détaillant les effets sur la police.
FontName | Police utilisée pour l'affichage de la valeur d'une cellule.
FontSize | Dimension de la police pour l'affichage de la valeur de la cellule.
ForeColor | Couleur de premier plan pour l'affichage de la valeur de la cellule.
FormatString | Valeur dans une chaîne formatée.

Voir aussi

Exemple de VBScript

Propriétés, méthodes et événements | Cellset, objet | Positions, collection | Properties, collection


Propriétés, méthodes et événements

Référence API ADO 2.5 MD

Propriétés, méthodes et événements de l'objet Cell

Propriétés/Collections

FormattedValue, propriété

Ordinal, propriété (Cell)

Positions, collection

Properties, collection

Value, propriété

Méthodes

Aucune.

Événements

Aucun.

S'applique à : Cell, objet


Cellset, objet (ADO MD)

Référence API ADO 2.5 MD

Cellset, objet

Représente les résultats d'une requête multidimensionnelle. Collection de cellules sélectionnées parmi des cubes ou d'autres jeux de cellules.

Remarques

Les données d'un Cellset sont extraites par accès direct. Vous pouvez rechercher un membre particulier pour obtenir des données le concernant. Par exemple, le code suivant renvoie la saisie du premier membre en première position sur le premier axe d'un jeu de cellules (cellset) intitulé cst :

cst.Axes(0).Positions(0).Members(0).Caption

Dans un jeu de cellules, il n'existe pas de notion de cellule active. À la place, la propriété Item extrait du jeu de cellules (cellset) un objet Cell particulier. Les arguments de la propriété Item déterminent quelle cellule est extraite. Vous pouvez spécifier la valeur ordinale individuelle d'une cellule. Vous pouvez aussi extraire des cellules à l'aide de leur numéro de position sur chaque axe du jeu de cellules (cellset). Pour plus d'informations sur l'extraction de cellules, consultez la propriété Item.

Avec les collections, méthodes et propriétés d'un objet Cellset, vous pouvez :

  • associer une connexion ouverte à un objet Cellset en définissant sa propriété ActiveConnection ;
  • exécuter et extraire les résultats d'une requête multidimensionnelle à l'aide de la méthode Open ;
  • extraire un objet Cell du jeu de cellules Cellset qui a la propriété Item ;
  • renvoyer les objets Axis qui définissent le Cellset à l'aide de la collection Axes ;
  • extraire des informations sur les dimensions utilisées pour filtrer les données dans le Cellset à l'aide de la propriété FilterAxis ;
  • renvoyer ou spécifier la requête utilisée pour définir le Cellset à l'aide de la propriété Source ;
  • renvoyer l'état actuel du Cellset (ouvert, fermé, en cours d'exécution ou de connexion) à l'aide de la propriété State ;
  • fermer un Cellset ouvert à l'aide de la méthode Close ;
  • extraire des informations spécifiques au fournisseur sur le Cellsetavec la collection ADO standard Properties.

Voir aussi

Exemple pour Visual Basic

Propriétés, méthodes et événements | Axes, collection | Cell, objet | Connection, objet | Properties, collection


Propriétés, méthodes et événements

Référence API ADO 2.5 MD

Propriétés, méthodes et événements de l'objet Cellset

Propriétés/Collections

ActiveConnection, propriété

Axes, collection

FilterAxis, propriété

Item, propriété (Cellset)

Properties, collection

Source, propriété

State, propriété

Méthodes

Close, méthode

Open, méthode

Événements

Aucun.

S'applique à : Cellset, objet


CubeDef, objet (ADO MD)

Référence API ADO 2.5 MD

CubeDef, objet

Représente un cube d'un schéma multidimensionnel, contenant un jeu de dimensions associées.

Remarques

Avec les collections et propriétés d'un objet CubeDef, vous pouvez :

  • identifier un CubeDef à l'aide de la propriété Name ;
  • renvoyer une chaîne décrivant le cube à l'aide de la propriété Description ;
  • renvoyer les dimensions qui constituent le cube à l'aide de la collection Dimensions ;
  • obtenir des informations supplémentaires sur le CubeDef à l'aide de la collection ADO standard Properties.

La collection Properties contient des propriétés en provenance du fournisseur. Le tableau suivant liste les propriétés vraisemblablement disponibles. La liste de propriétés effective peut différer de celle-ci selon l'installation du fournisseur. Consultez votre documentation pour la liste plus complète des propriétés disponibles.

Nom | Description
CatalogName | Nom du catalogue auquel appartient ce cube.
CreatedOn | Date et heure de la création du cube
CubeGUID | Identificateur universel unique (GUID) du cube.
CubeName | Nom du cube.
CubeType | Type du cube.
DataUpdatedBy | ID d'utilisateur du responsable de la dernière mise à jour des données.
Description | Description significative du cube.
LastSchemaUpdate | Date et heure de la dernière mise à jour du schéma.
SchemaName | Nom du schéma auquel appartient ce cube.
SchemaUpdatedBy | ID d'utilisateur du responsable de la dernière mise à jour du schéma.

Voir aussi

Exemple de VBScript

Propriétés, méthodes et événements | Catalog, objet | CubeDefs, collection | Dimensions, collection | Properties, collection


Propriétés, méthodes et événements

Référence API ADO 2.5 MD

Propriétés, méthodes et événements de l'objet CubeDef

Propriétés/Collections

Description, propriété

Dimensions, collection

Name, propriété

Properties, collection

Événements

Aucun.

Voir aussi

S'applique à : CubeDef, objet

© 1998-2002 Microsoft Corporation. Tous droits réservés.


Dimension, objet (ADO MD)

Référence API ADO 2.5 MD

Dimension, objet

Représente une des dimensions d'un cube multidimensionnel et contient une ou plusieurs hiérarchies de membres.

Remarques

Avec les collections et propriétés d'un objet Dimension, vous pouvez :

  • identifier l'objet Dimension à l'aide des propriétés Name et UniqueName ;
  • renvoyer une chaîne significative décrivant l'objet Dimension à l'aide de la propriété Description ;
  • renvoyer les objets Hierarchy qui constituent l'objet Dimension à l'aide de la collection Hierarchies ;
  • utiliser la collection ADO standard Properties pour obtenir des informations complémentaires sur l'objet Dimension.

La collection Properties contient des propriétés en provenance du fournisseur. Le tableau suivant liste les propriétés vraisemblablement disponibles. La liste de propriétés effective peut différer de celle-ci selon l'installation du fournisseur. Consultez votre documentation pour la liste plus complète des propriétés disponibles.

Nom | Description
CatalogName | Nom du catalogue auquel appartient ce cube.
CubeName | Nom du cube.
DefaultHierarchy | Nom unique de la hiérarchie par défaut.
Description | Description significative du cube.
DimensionCaption | Étiquette ou légende associée à la dimension.
DimensionCardinality | Nombre de membres dans la dimension.
DimensionGUID | Identificateur universel unique (GUID) de la dimension.
DimensionName | Nom de la dimension.
DimensionOrdinal | Nombre ordinal de la dimension parmi le groupe de dimensions constituant le cube.
DimensionType | Type de dimension.
DimensionUniqueName | Nom sans équivoque de la dimension.
SchemaName | Nom du schéma auquel appartient ce cube.

Voir aussi

Exemple de VBScript

Propriétés, méthodes et événements | CubeDef, objet | Dimensions, collection | Hierarchies, collection | Properties, collection


Propriétés, méthodes et événements

Référence API ADO 2.5 MD

Propriétés, méthodes et événements de l'objet Dimension

Propriétés/Collections

Description, propriété

Hierarchies, collection

Name, propriété

Properties, collection

UniqueName, propriété

Méthodes

Aucune.

Événements

Aucun.

S'applique à : Dimension, objet


Hierarchy, objet (ADO MD)

Référence API ADO 2.5 MD

Hierarchy, objet

Représente une façon par laquelle les membres d'une dimension peuvent être regroupés ou « enroulés ». Une dimension peut être regroupée conjointement à une ou plusieurs hiérarchies.

Remarques

Avec les collections et propriétés d'un objet Hierarchy, vous pouvez :

  • identifier l'objet Hierarchy à l'aide des propriétés Name et UniqueName ;
  • renvoyer une chaîne significative décrivant l'objet Hierarchy à l'aide de la propriété Description ;
  • renvoyer les objets Level qui constituent l'objet Hierarchy à l'aide de la collection Levels ;
  • utiliser la collection ADO standard Properties pour obtenir des informations complémentaires sur l'objet Hierarchy.

La collection Properties contient des propriétés en provenance du fournisseur. Le tableau suivant liste les propriétés vraisemblablement disponibles. La liste de propriétés effective peut différer de celle-ci selon l'installation du fournisseur. Consultez votre documentation pour la liste plus complète des propriétés disponibles.

Nom | Description
AllMember | Membre au plus haut niveau de l'échelle dans la hiérarchie.
CatalogName | Nom du catalogue auquel appartient ce cube.
CubeName | Nom du cube.
DefaultMember | Nom exclusif du membre par défaut de cette hiérarchie.
Description | Description significative de la hiérarchie.
DimensionType | Type de dimension à laquelle appartient cette hiérarchie.
DimensionUniqueName | Nom sans équivoque de la dimension.
HierarchyCaption | Étiquette ou légende associée à la hiérarchie.
HierarchyCardinality | Nombre de membres dans la hiérarchie.
HierarchyGUID | Identificateur universel unique (GUID) de la hiérarchie.
HierarchyName | Nom de la hiérarchie.
HierarchyUniqueName | Nom sans équivoque de la hiérarchie.
SchemaName | Nom du schéma auquel appartient ce cube.

Voir aussi

Exemple de VBScript

Propriétés, méthodes et événements | Dimension, objet | Hierarchies, collection | Levels, collection | Properties, collection


Propriétés, méthodes et événements

Référence API ADO 2.5 MD

Propriétés, méthodes et événements de l'objet Hierarchy

Propriétés/Collections

Description, propriété

Levels, collection

Name, propriété

Properties, collection

UniqueName, propriété

Méthodes

Aucune.

Événements

Aucun.

S'applique à : Hierarchy, objet


Level, objet (ADO MD)

Référence API ADO 2.5 MD

Level, objet

Contient un jeu de membres occupant chacun le même rang au sein de la hiérarchie.

Remarques

Avec les collections et propriétés d'un objet Level, vous pouvez :

  • identifier l'objet Level à l'aide des propriétés Name et UniqueName ;
  • renvoyer la chaîne à utiliser pour l'affichage de l'objet Level à l'aide de la propriété Caption ;
  • renvoyer une chaîne significative décrivant l'objet Level à l'aide de la propriété Description ;
  • renvoyer les objets Member qui constituent l'objet Level à l'aide de la collection Members ;
  • renvoyer le nombre de niveaux à partir de la racine de l'objet Level à l'aide de la propriété Depth ;
  • utiliser la collection ADO standard Properties pour obtenir des informations complémentaires sur l'objet Level.

La collection Properties contient des propriétés en provenance du fournisseur. Le tableau suivant liste les propriétés vraisemblablement disponibles. La liste de propriétés effective peut différer de celle-ci selon l'installation du fournisseur. Consultez votre documentation pour la liste plus complète des propriétés disponibles.

Nom | Description
CatalogName | Nom du catalogue auquel appartient ce cube.
CubeName | Nom du cube.
Description | Description significative du niveau.
DimensionUniqueName | Nom sans équivoque de la dimension.
HierarchyUniqueName | Nom sans équivoque de la hiérarchie.
LevelCaption | Étiquette ou légende associée au niveau.
LevelCardinality | Nombre de membres dans le niveau.
LevelGUID | Identificateur universel unique (GUID) du niveau.
LevelName | Nom du niveau.
LevelNumber | Distance entre le niveau et la racine de la hiérarchie.
LevelType | Type de niveau.
LevelUniqueName | Nom sans équivoque du niveau.
SchemaName | Nom du schéma auquel appartient ce cube.

Voir aussi

Exemple de VBScript

Propriétés, méthodes et événements | Hierarchy, objet | Levels, collection | Members, collection | Properties, collection


Propriétés, méthodes et événements

Référence API ADO 2.5 MD

Propriétés, méthodes et événements de l'objet Level

Propriétés/Collections

Caption, propriété

Depth, propriété

Description, propriété

Members, collection

Name, propriété

Properties, collection

UniqueName, propriété

Méthodes

Aucune.

Événements

Aucun.

S'applique à : Level, objet


Member, objet (ADO MD)

Référence API ADO 2.5 MD

Member, objet

Représente un membre d'un niveau dans un cube, les enfants d'un membre d'un niveau ou un membre ayant une position sur l'axe d'un jeu de cellules.

Remarques

Les propriétés d'un Member diffèrent selon le contexte de son utilisation. Un Member d'un Level d'un CubeDef a une propriété Children qui renvoie les Members sur le niveau hiérarchique inférieur suivant par rapport à celui du Member courant. Pour un Member d'une Position, la collection Children est toujours vide. De même, la propriété Type s'applique uniquement aux Members d'un Level.

Un Member de Position a deux propriétés—DrilledDown et ParentSameAsPrev—qui sont utiles lors de l'affichage du Cellset. Il se produit une erreur en cas d'accès à ces propriétés sur un Member d'un Level.

Avec les collections et propriétés d'un objet Member d'un Level, vous pouvez :

  • identifier l'objet Member à l'aide des propriétés Name et UniqueName ;
  • renvoyer la chaîne à utiliser pour l'affichage de l'objet Member à l'aide de la propriété Caption ;
  • renvoyer une chaîne significative décrivant un Member mesure ou formule à l'aide de la propriété Description ;
  • déterminer la nature de l'objet Member à l'aide de la propriété Type ;
  • obtenir des informations sur le Level du Member à l'aide des propriétés LevelDepth et LevelName ;
  • obtenir les Members apparentés au sein d'une Hierarchy à l'aide des propriétés Parent et Children.
  • compter les enfants d'un Member à l'aide de la propriété ChildCount ;
  • utiliser la collection ADO standard Properties pour obtenir des informations complémentaires sur l'objet Level.

Avec les collections et propriétés d'un Member ayant une Position sur un Axis, vous pouvez :

  • identifier l'objet Member à l'aide des propriétés Name et UniqueName ;
  • renvoyer la chaîne à utiliser pour l'affichage de l'objet Member à l'aide de la propriété Caption ;
  • renvoyer une chaîne significative décrivant un Member mesure ou formule à l'aide de la propriété Description ;
  • obtenir des informations sur le Level du Member à l'aide des propriétés LevelDepth et LevelName ;
  • compter les enfants d'un Member à l'aide de la propriété ChildCount ;
  • utiliser la propriété DrilledDown pour déterminer s'il existe au moins un enfant sur l'Axis suivant immédiatement ce Member ;
  • utiliser la propriété ParentSameAsPrev pour déterminer si le parent de ce Member est le même que celui du Member qui le précède immédiatement ;
  • utiliser la collection ADO standard Properties pour obtenir des informations complémentaires sur l'objet Level.

La collection Properties contient des propriétés en provenance du fournisseur. Le tableau suivant liste les propriétés vraisemblablement disponibles. La liste de propriétés effective peut différer de celle-ci selon l'installation du fournisseur. Consultez votre documentation pour la liste plus complète des propriétés disponibles.

Nom | Description
CatalogName | Nom du catalogue auquel appartient ce cube.
ChildrenCardinality | Nombre d'enfants du membre.
CubeName | Nom du cube.
Description | Description significative du membre.
DimensionUniqueName | Nom sans équivoque de la dimension.
HierarchyUniqueName | Nom sans équivoque de la hiérarchie.
LevelNumber | Distance entre le niveau et la racine de la hiérarchie.
LevelUniqueName | Nom sans équivoque du niveau.
MemberCaption | Étiquette ou légende associée au membre.
MemberGUID | Identificateur universel unique (GUID) du membre.
MemberName | Nom du membre.
MemberOrdinal | Nombre ordinal du membre.
MemberType | Type du membre.
MemberUniqueName | Nom sans équivoque du membre.
ParentCount | Comptage du nombre de parents de ce membre.
ParentLevel | Numéro du niveau des parents du membre.
ParentUniqueName | Nom sans équivoque des parents du membre.
SchemaName | Nom du schéma auquel appartient ce cube.

Voir aussi

Exemple pour Visual Basic

Propriétés, méthodes et événements | Members, collection | Properties, collection


Propriétés, méthodes et événements

Référence API ADO 2.5 MD

Propriétés, méthodes et événements de l'objet Member

Propriétés/Collections

Caption, propriété

ChildCount, propriété

Children, propriété

Description, propriété

DrilledDown, propriété

LevelDepth, propriété

LevelName, propriété

Name, propriété

Parent, propriété

ParentSameAsPrev, propriété

Properties, collection

Type, propriété

UniqueName, propriété

Méthodes

Aucune.

Événements

Aucun.

S'applique à : Member, objet


Position, objet (ADO MD)

Référence API ADO 2.5 MD

Position, objet

Représente un jeu d'un ou plusieurs membres de dimensions différentes qui définissent un point sur un axe.

Remarques

Avec les propriétés et collections d'un objet Position, vous pouvez :

  • utiliser la propriété Ordinal pour renvoyer la position ordinale de la Position sur l'Axis ;
  • utiliser la collection Members pour renvoyer les membres qui constituent la position sur l'Axis.

Voir aussi

Exemple de VBScript

Propriétés, méthodes et événements | Axis, objet | Cell, objet | Members, collection | Positions, collection


Propriétés, méthodes et événements

Référence API ADO 2.5 MD

Propriétés, méthodes et événements de l'objet Position

Propriétés/Collections

Members, collection

Ordinal, propriété (Position)

Méthodes

Aucune.

Événements

Aucun.

S'applique à : Position, objet


Collections ADO MD

Axes | Contient les objets Axis qui définissent un jeu de cellules.
CubeDef | Contient les objets CubeDef qui représentent un cube d'un catalogue multidimensionnel.
Dimensions | Contient les objets Dimension qui composent un cube.
Hiérarchies | Contient les objets Hierarchy définis d'une dimension.
Niveaux | Contient les objets Level qui composent une hiérarchie.
Membres | Contient les objets Member d'un niveau ou d'une position sur un axe.
Positions | Contient les objets Position qui définissent un point sur un axe.

Voir aussi

Référence API ADO MD | Exemples de code ADO MD | Constantes énumérées ADO MD | Méthodes ADO MD | Modèle d'objet ADO MD | Objets ADO MD | Propriétés ADO MD


Axes, collection [ADO MD]

Référence API ADO 2.5 MD

Axes, collection

Contient les objets Axis qui définissent un jeu de cellules.

Remarques

Un objet Cellset contient une collection Axes. Une fois que l'objet Cellset est ouvert, cette collection contient au moins un objet Axis. Pour plus d'informations sur l'utilisation des objets Axis, consultez l'objet Axis.

Note L'axe de filtre d'un Cellset n'est pas contenu dans la collection Axes. Pour plus d'informations, consultez la propriété FilterAxis.

Axes est une collection ADO standard. Avec les propriétés et méthodes d'une collection, vous pouvez exécuter les opérations suivantes :

  • obtenir le nombre d'objets contenus dans la collection à l'aide de la propriété Count ;
  • renvoyer un objet de la collection avec la propriété Item par défaut ;
  • mettre à jour les objets de la collection du fournisseur à l'aide de la méthode Refresh.

Voir aussi

Exemple pour Visual Basic

Propriétés, méthodes et événements | Axis, objet


Propriétés, méthodes et événements de la collection Axes

Propriétés

Count, propriété

Item, propriété

Méthodes

Refresh, méthode

Événements

Aucun.

S'applique à : Axes, collection


CubeDefs, collection (ADO MD)

Référence API ADO 2.5 MD

CubeDefs, collection

Contient les objets CubeDef qui représentent un cube d'un catalogue multidimensionnel.

Remarques

CubeDefs est une collection ADO standard. Avec les propriétés et méthodes d'une collection, vous pouvez exécuter les opérations suivantes :

  • obtenir le nombre d'objets contenus dans la collection à l'aide de la propriété Count ;
  • renvoyer un objet de la collection avec la propriété Item par défaut ;
  • mettre à jour les objets de la collection du fournisseur à l'aide de la méthode Refresh.

Voir aussi

Exemple pour Visual Basic

Propriétés, méthodes et événements | Catalog, objet | CubeDef, objet


Propriétés, méthodes et événements de la collection CubeDefs

Propriétés

Count, propriété

Item, propriété

Méthodes

Refresh, méthode

Événements

Aucun.

S'applique à : CubeDefs, collection


Dimensions, collection (ADO MD)

Référence API ADO 2.5 MD

Dimensions, collection

Contient les objets Dimension qui composent un cube.

Remarques

Dimensions est une collection ADO standard. Avec les propriétés et méthodes d'une collection, vous pouvez exécuter les opérations suivantes :

  • obtenir le nombre d'objets contenus dans la collection à l'aide de la propriété Count ;
  • renvoyer un objet de la collection avec la propriété Item par défaut ;
  • mettre à jour les objets de la collection du fournisseur à l'aide de la méthode Refresh.

Voir aussi

Exemple pour Visual Basic

Propriétés, méthodes et événements | CubeDef, objet | Dimension, objet


Propriétés, méthodes et événements de la collection Dimensions

Propriétés

Count, propriété

Item, propriété

Méthodes

Refresh, méthode

Événements

Aucun.

S'applique à : Dimensions, collection


Hierarchies, collection (ADO MD)

Référence API ADO 2.5 MD

Hierarchies, collection

Contient les objets Hierarchy définis d'une dimension.

Remarques

Hierarchies est une collection ADO standard. Avec les propriétés et méthodes d'une collection, vous pouvez exécuter les opérations suivantes :

  • obtenir le nombre d'objets contenus dans la collection à l'aide de la propriété Count ;
  • renvoyer un objet de la collection avec la propriété Item par défaut ;
  • mettre à jour les objets de la collection du fournisseur à l'aide de la méthode Refresh.

Voir aussi

Exemple pour Visual Basic

Propriétés, méthodes et événements | Dimension, objet | Hierarchy, objet


Propriétés, méthodes et événements de la collection Hierarchies

Propriétés

Count, propriété

Item, propriété

Méthodes

Refresh, méthode

Événements

Aucun.

S'applique à : Hierarchies, collection


Levels, collection (ADO MD)

Référence API ADO 2.5 MD

Levels, collection

Contient les objets Level qui composent une hiérarchie.

Remarques

Levels est une collection ADO standard. Avec les propriétés et méthodes d'une collection, vous pouvez exécuter les opérations suivantes :

  • obtenir le nombre d'objets contenus dans la collection à l'aide de la propriété Count ;
  • renvoyer un objet de la collection avec la propriété Item par défaut ;
  • mettre à jour les objets de la collection du fournisseur à l'aide de la méthode Refresh.

Voir aussi

Exemple pour Visual Basic

Propriétés, méthodes et événements | Hierarchy, objet | Level, objet


Propriétés, méthodes et événements de la collection Levels

Propriétés

Count, propriété

Item, propriété

Méthodes

Refresh, méthode

Événements

Aucun.

S'applique à : Levels, collection


Members, collection (ADO MD)

Référence API ADO 2.5 MD

Members, collection

Contient les objets Member d'un niveau ou d'une position sur un axe.

Remarques

Une collection Members contient les types de membres suivants :

  • Les membres qui composent un niveau dans un cube. Ils sont contenus dans la collection Members d'un objet Level. Dans le cas de l'exemple présenté dans Vue d'ensemble des données et des schémas multidimensionnels, les quatre membres du niveau Pays sont les suivants : Canada, États-Unis, Royaume-Uni et Allemagne.
  • Les membres qui sont les enfants d'un membre donné au sein d'une hiérarchie. Ces membres sont renvoyés par la propriété Children de l'objet Member parent. Dans le même exemple, les deux enfants du membre Canada sont Est du Canada et Ouest du Canada.
  • Les membres qui définissent une position précise sur un axe d'un jeu de cellules. En reprenant l'exemple du jeu de cellules présenté dans Utilisation des données multidimensionnelles, les deux membres de la première position sur l'axe X sont Valentine et Seattle. Ces membres sont contenus dans la collection Members d'un objet Position.

Members est une collection ADO standard. Avec les propriétés et méthodes d'une collection, vous pouvez exécuter les opérations suivantes :

  • obtenir le nombre d'objets contenus dans la collection à l'aide de la propriété Count ;
  • renvoyer un objet de la collection avec la propriété Item par défaut ;
  • mettre à jour les objets de la collection du fournisseur à l'aide de la méthode Refresh.

Voir aussi

Exemple de VBScript

Propriétés, méthodes et événements | Member, objet


Propriétés, méthodes et événements de la collection Members

Propriétés

Count, propriété

Item, propriété

Méthodes

Refresh, méthode

Événements

Aucun.

S'applique à : Members, collection


Positions, collection (ADO MD)

Référence API ADO 2.5 MD

Positions, collection

Contient les objets Position qui définissent un point sur un axe.

Remarques

Positions est une collection ADO standard. Avec les propriétés et méthodes d'une collection, vous pouvez exécuter les opérations suivantes :

  • obtenir le nombre d'objets contenus dans la collection à l'aide de la propriété Count ;
  • renvoyer un objet de la collection avec la propriété Item par défaut ;
  • mettre à jour les objets de la collection du fournisseur à l'aide de la méthode Refresh.

Voir aussi

Exemple pour Visual Basic

Propriétés, méthodes et événements | Axis, objet | Cell, objet | Position, objet


Propriétés, méthodes et événements de la collection Positions

Propriétés

Count, propriété

Item, propriété

Méthodes

Refresh, méthode

Événements

Aucun.

S'applique à : Positions, collection


Propriétés ADO MD

ActiveConnection | Indique l'objet Connection ADO auquel appartient actuellement le jeu de cellules (cellset) ou le catalogue en cours.
Caption | Indique la légende texte à utiliser à l'affichage d'un objet Level ou Member.
ChildCount | Indique le nombre de membres dont l'objet Member actif est le parent dans une hiérarchie.
Children | Renvoie une collection de Members dont le Member actif est le parent dans la hiérarchie.
Count | Indique le nombre d'objets dans une collection.
Depth | Indique le nombre de niveaux entre le Level et le niveau de la racine de la hiérarchie.
Description | Renvoie une explication en texte clair de l'objet actif.
DimensionCount | Indique le nombre de dimensions sur un axe.
DrilledDown | Indique si aucun enfant ne suit immédiatement le membre sur l'axe.
FilterAxis | Fournit des informations de filtre pour le jeu de cellules (cellset) actuel.
Item | Extrait une cellule d'un jeu de cellules (cellset) à l'aide de ses coordonnées.
Item | Renvoie un membre donné d'une collection, désigné par son nom ou son numéro d'ordre.
FormattedValue | Indique l'affichage formaté de la valeur d'une cellule.
LevelDepth | Indique le nombre de niveaux entre la racine de la hiérarchie et un membre.
LevelName | Indique le nom du niveau d'un membre.
Nom | Indique le nom d'un objet.
Ordinal (Cell) | Identifie une cellule de façon unique par sa position dans un jeu de cellules.
Ordinal (Position) | Identifie de façon exclusive la position sur un axe.
Parent | Indique, dans une hiérarchie, le membre parent du membre actuel.
ParentSameAsPrev | Indique si le parent du membre de cette position est le même que le parent du membre qui le précède immédiatement.
Source | Indique la source des données du jeu de cellules.
State | Indique l'état actuel du jeu de cellules.
Type | Indique le type du membre actuel.
UniqueName | Indique un nom sans équivoque pour l'objet actif.
Value | Indique la valeur de la cellule active.

Voir aussi

Référence API ADO MD | Exemples de code ADO MD | Collections ADO MD | Constantes énumérées ADO MD | Méthodes ADO MD | Modèle d'objet ADO MD | Objets ADO MD


ActiveConnection, propriété (ADO MD)

Référence API ADO 2.5 MD

ActiveConnection, propriété

Indique l'objet Connection ADO auquel appartient actuellement le jeu de cellules (cellset) ou le catalogue en cours.

Paramètres et valeurs renvoyées

Définit ou renvoie une valeur de type Variant contenant une chaîne qui définit une connexion ou un objet Connection. La valeur est vide par défaut.

Remarques

Vous pouvez affecter cette propriété à un objet Connection ADO valide ou à une chaîne de connexion valide. Lorsque cette propriété est affectée à une chaîne de connexion, le fournisseur crée, à l'aide de cette définition, un objet Connection et ouvre la connexion.

Si, pour ouvrir un objet Cellset, vous utilisez l'argument ActiveConnection de la méthode Open, la propriété ActiveConnection prend la valeur de l'argument.

Si vous attribuez la valeur Nothing à la propriété ActiveConnection d'un Catalog, vous libérez les données associées, y compris les données de la collection CubeDefs et tous les objets Dimension, Hierarchy, Level et Member associés. La fermeture d'un objet Connection utilisé pour ouvrir un Catalog a le même effet que l'attribution de la valeur Nothing à la propriété ActiveConnection.

Changer la base de données par défaut de la connexion référencée par la propriété ActiveConnection d'un objet Catalog invalide le contenu du Catalog.

Une erreur se produit si vous essayez de changer la propriété ActiveConnection d'un objet Cellset ouvert.

Note Dans Visual Basic, lorsque vous affectez la propriété ActiveConnection à un objet Connection, pensez à utiliser le mot-clé Set. Si vous omettez le mot-clé Set, vous attribuez en réalité à la propriété ActiveConnection la valeur de la propriété par défaut de l'objet Connection, ConnectionString. Le code fonctionnera, mais vous créerez une connexion supplémentaire avec la source des données, ce qui peut avoir des conséquences négatives.

Si vous utilisez le fournisseur de données MSOLAP, passez la source de données dans une chaîne de connexion sur le nom d'un serveur et donnez au catalogue initial le nom d'un catalogue de la source de données. Pour connecter un fichier cube qui n'est pas connecté à un serveur, indiquez comme emplacement la totalité du chemin du fichier .CUB. Dans les deux cas, mettez comme fournisseur le nom du fournisseur. Par exemple, la chaîne suivante se connecte sur un catalogue nommé Bobs Video Store, sur un serveur nommé Servername, avec MSOLAP comme fournisseur :

"Data Source=Servername;Initial Catalog=Bobs Video Store;Provider=msolap"

La chaîne suivante établit la connexion à un fichier cube local, à l'emplacement C:\MSDASDK\samples\oledb\olap\data\bobsvid.cub:

"Location=C:\MSDASDK\samples\oledb\olap\data\bobsvid.cub;Provider=msolap"

Voir aussi

Exemple pour Visual Basic

Connection, objet | Open, méthode

S'applique à : Catalog, objet | Cellset, objet


Caption, propriété (ADO MD)

Référence API ADO 2.5 MD

Caption, propriété

Indique la légende texte à utiliser à l'affichage d'un objet Level ou Member.

Valeurs renvoyées

Renvoie une valeur de type String, en lecture seule.

Voir aussi

Exemple pour Visual Basic

Description, propriété

S'applique à : Level, objet | Member, objet


ChildCount, propriété (ADO MD)

Référence API ADO 2.5 MD

ChildCount, propriété

Indique le nombre de membres dont l'objet Member actif est le parent dans une hiérarchie.

Valeurs renvoyées

Renvoie un entier de type Long, en lecture seule.

Remarques

Utilisez la propriété ChildCount pour renvoyer une estimation du nombre d'enfants de Member. Le nombre exact d'enfants d'un Member peut être renvoyé à l'aide de la propriété Children.

Pour les objets Member d'un objet Position, le nombre maximal renvoyé est 65 536. Si le nombre réel d'enfants dépasse 65 536, la valeur renvoyée sera toujours 65 536. Par conséquent, l'application doit considérer un ChildCount de 65 536 comme égal ou supérieur à 65 536 enfants.

Pour les objets Member d'un objet Level et pour déterminer le nombre exact d'enfants, appliquez la propriété Count de collection ADO à la collection Children. La détermination du nombre exact d'enfants peut prendre du temps si le nombre d'enfants de la collection est important.

Voir aussi

Children, propriété | Count, propriété | Members, collection

S'applique à : Member, objet


Children, propriété (ADO MD)

Référence API ADO 2.5 MD

Children, propriété

Renvoie une collection Members par rapport à laquelle le Member courant est le parent dans la hiérarchie.

Valeurs renvoyées

Renvoie une collection Members, en lecture seule.

Remarques

La propriété Children comprend une collection Members dont le Member actif est le parent hiérarchique. Les objets Member de niveau inférieur (feuille) n'ont pas de membres enfants dans la collection Members. Cette propriété n'est prise en charge que pour les objets Member appartenant à un objet Level. Une erreur se produit lorsque cette propriété est invoquée par des objets Member appartenant à un objet Position.

Voir aussi

ChildCount, propriété

S'applique à : Member, objet


Depth, propriété (ADO MD)

Référence API ADO 2.5 MD

Depth, propriété

Indique le nombre de niveaux entre le Level et le niveau de la racine de la hiérarchie.

Valeurs renvoyées

Renvoie un nombre entier, en lecture seule.

Remarques

Un Level à la racine de la hiérarchie a une valeur Depth de zéro (0).

Voir aussi

LevelDepth, propriété

S'applique à : Level, objet


Description, propriété (ADO MD)

Référence API ADO 2.5 MD

Description, propriété

Renvoie une explication en texte clair de l'objet actif.

Valeurs renvoyées

Renvoie une valeur de type String, en lecture seule.

Remarques

Pour les objets Member, Description ne s'applique qu'aux membres mesure et formule. Pour tous les autres types de membres, Description renvoie une chaîne vide (""). Consultez la propriété Type pour plus d'informations sur les différents types de membres.

Cette propriété n'est prise en charge que pour les objets Member appartenant à un objet Level. Une erreur se produit lorsque cette propriété est invoquée par des objets Member appartenant à un objet Position.

Voir aussi

S'applique à : CubeDef, objet | Dimension, objet | Hierarchy, objet | Level, objet | Member, objet


DimensionCount, propriété (ADO MD)

Référence API ADO 2.5 MD

DimensionCount, propriété

Indique le nombre de dimensions sur un axe.

Valeurs renvoyées

Renvoie un entier de type Long, en lecture seule.

Voir aussi

Exemple de VBScript

Dimension, objet

S'applique à : Axis, objet


DrilledDown, propriété (ADO MD)

Référence API ADO 2.5 MD

DrilledDown, propriété

Indique si aucun enfant ne suit immédiatement le membre sur l'axe.

Valeurs renvoyées

Renvoie une valeur de type Boolean, en lecture seule. La propriété DrilledDown renvoie True s'il n'y a pas de membres enfant du membre actuel sur l'axe. La propriété DrilledDown renvoie False s'il se trouve un ou plusieurs membres enfants du membre actuel sur l'axe.

Remarques

Utilisez la propriété DrilledDown pour déterminer s'il existe au moins un enfant de ce membre sur l'axe suivant immédiatement ce membre. Cette information est utile lors de l'affichage du membre.

Cette propriété n'est prise en charge que pour les objets Member appartenant à un objet Position. Une erreur se produit lorsque cette propriété est invoquée par des objets Member appartenant à un objet Level.

Voir aussi

ParentSameAsPrev, propriété

S'applique à : Member, objet


FilterAxis, propriété (ADO MD)

Référence API ADO 2.5 MD

FilterAxis, propriété

Fournit des informations de filtre concernant le jeu de cellules (cellset) actuel.

Valeurs renvoyées

Renvoie un objet Axis, en lecture seule.

Remarques

Utilisez la propriété FilterAxis pour renvoyer des informations sur les dimensions utilisées pour répartir les données. La propriété DimensionCount de l'Axis renvoie le nombre de dimensions de répartition. Habituellement, cet axe n'a qu'une seule ligne.

L'Axis renvoyé par FilterAxis n'est pas contenu dans la collection Axes d'un objet Cellset.

Voir aussi

Axis, objet | Dimension, objet | DimensionCount, propriété

S'applique à : Cellset, objet


FormattedValue, propriété (ADO MD)

Référence API ADO 2.5 MD

FormattedValue, propriété

Indique l'affichage formaté de la valeur d'une cellule.

Valeurs renvoyées

Renvoie une valeur de type String, en lecture seule.

Remarques

Utilisez la propriété FormattedValue pour obtenir la valeur d'affichage formatée de la propriété Value d'un objet Cell. Par exemple, si la valeur d'une cellule est 1056.87 et si cette valeur représente un montant en dollars, FormattedValue est égale à $1,056.87.

Voir aussi

Exemple pour Visual Basic

Value, propriété

S'applique à : Cell, objet


Item, propriété (ADO MD Cellset)

Référence API ADO 2.5 MD

Item, propriété (Cellset)

Extrait une cellule d'un jeu de cellules (cellset) à l'aide de ses coordonnées.

Syntaxe

Set Cell = Cellset.Item ( Positions )

Paramètres

Positions
Ensemble de valeurs de type Variant qui spécifient de façon unique chaque cellule. Les Positions peuvent avoir l'une des significations suivantes :
  • Un ensemble de nombres de positions
  • Un ensemble de noms de membres
  • La position ordinale

Remarques

Utilisez la propriété Item pour renvoyer un objet Cell à l'intérieur d'un objet Cellset. Si la propriété Item ne peut pas trouver la cellule correspondant à l'argument Positions, une erreur se produit.

La propriété Item est la propriété par défaut de l'objet Cellset. Les formes de syntaxe suivantes sont interchangeables :

Cellset.Item ( Positions )
Cellset ( Positions )

L'argument Positions précise quelle cellule doit être renvoyée. Vous pouvez spécifier la cellule par sa position ordinale ou par sa position sur chaque axe. Lorsque vous spécifiez la cellule selon sa position sur les axes, vous pouvez spécifier la valeur numérique de la position ou les noms des membres pour chaque position.

La position ordinale est un nombre qui identifie une cellule dans le Cellset de manière unique. Conceptuellement, les cellules sont numérotées dans un cellset comme si le cellset était un ensemble p-dimensionnel, où p est égal au nombre d'axes. Les cellules sont atteintes dans l'ordre du plus grand rang. La formule de calcul du nombre ordinal d'une cellule est la suivante :

Si les noms des membres sont passés à Item sous forme de chaînes, les membres doivent être listés dans l'ordre croissant des identificateurs numériques des axes. Sur un axe, les membres doivent être listés dans l'ordre croissant de l'imbrication de leur dimension ; ce qui signifie que le membre de la dimension la plus externe vient le premier, suivi par les membres de dimensions plus internes. Chaque dimension doit être représentée par une chaîne séparée et la liste de la chaîne des membres doit être séparée par des virgules.

Note Il se peut que votre fournisseur de données ne prenne pas en charge l'extraction de cellules par nom de membre. Pour plus d'informations, reportez-vous à la documentation de votre fournisseur.

Voir aussi

Cell, objet

S'applique à : Cellset, objet


LevelDepth, propriété (ADO MD)

Référence API ADO 2.5 MD

LevelDepth, propriété

Indique le nombre de niveaux entre la racine de la hiérarchie et un membre.

Valeurs renvoyées

Renvoie un entier de type Long, en lecture seule.

Remarques

Utilisez la propriété LevelDepth pour déterminer la distance de l'objet Member depuis le niveau de la racine de la hiérarchie. La profondeur LevelDepth d'un membre au niveau de la racine est de 0. Cela correspond à la propriété Depth d'un objet Level.

Voir aussi

Depth, propriété | Level, objet

S'applique à : Member, objet


LevelName, propriété (ADO MD)

Référence API ADO 2.5 MD

LevelName, propriété

Indique le nom du niveau d'un membre.

Valeurs renvoyées

Renvoie une valeur de type String, en lecture seule.

Remarques

Utilisez la propriété LevelName pour extraire le nom du niveau auquel appartient un membre. Cela correspond à la propriété Name d'un objet Level.

Voir aussi

Level, objet | Name, propriété

S'applique à : Member, objet


Name, propriété (ADO MD)

Référence API ADO 2.5 MD

Name, propriété

Indique le nom d'un objet.

Valeurs renvoyées

Renvoie une valeur de type String, en lecture seule.

Remarques

Vous pouvez extraire la propriété Name d'un objet au moyen d'une référence ordinale, après quoi vous pouvez faire directement référence à l'objet par le nom. Par exemple, si cdf.CubeDefs(0).Name donne « Bobs Video Store », vous pouvez faire référence à cet objet CubeDef en tant que cdf.CubeDefs("Bobs Video Store").

Voir aussi

Exemple pour Visual Basic

Caption, propriété | Description, propriété | UniqueName, propriété

S'applique à : Axis, objet | Catalog, objet | CubeDef, objet | Dimension, objet | Hierarchy, objet | Level, objet | Member, objet


Ordinal, propriété (ADO MD Cell)

Référence API ADO 2.5 MD

Ordinal, propriété (Cell)

Identifie une cellule de façon unique par sa position dans un jeu de cellules.

Valeurs renvoyées

Renvoie un entier de type Long, en lecture seule.

Remarques

La valeur ordinale de la cellule identifie la cellule de façon exclusive dans un jeu de cellules (cellset). Conceptuellement, les cellules sont numérotées dans un jeu de cellules comme si celui-ci était un ensemble p-dimensionnel, où p est égal au nombre d'axes. Les cellules sont numérotées à partir de zéro, selon l'ordre d'importance de la ligne. Voici la formule pour calculer le numéro ordinal d'une cellule :

La valeur ordinale de la cellule peut être utilisée avec la propriété Item de l'objet Cellset pour une extraction rapide de la Cell.

Voir aussi

Exemple de VBScript

Cellset, objet | Item, propriété (Cellset) | Ordinal, propriété (Position)

S'applique à : Cell, objet


Ordinal, propriété (ADO MD Position)

Référence API ADO 2.5 MD

Ordinal, propriété (Position)

Identifie de façon exclusive la position sur un axe.

Valeurs renvoyées

Renvoie un entier de type Long, en lecture seule.

Remarques

L'Ordinal d'un objet Position correspond à l'index de la Position dans la collection Positions.

Une cellule peut être extraite rapidement à l'aide de l'Ordinal de la Position le long de chaque axe avec la propriété Item de l'objet Cellset.

Voir aussi

Cellset, objet | Item, propriété (Cellset) | Ordinal, propriété (Cell)

S'applique à : Position, objet


Parent, propriété (ADO MD)

Référence API ADO 2.5 MD

Parent, propriété

Indique, dans une hiérarchie, le membre parent du membre actuel.

Valeurs renvoyées

Renvoie un objet Member en lecture seule.

Remarques

Un membre qui est au sommet de la hiérarchie (la racine) n'a pas de parent. Cette propriété n'est prise en charge que pour les objets Member appartenant à un objet Level. Une erreur est provoquée lorsque cette propriété est invoquée par des objets Member appartenant à un objet Position.

Voir aussi

Children, propriété

S'applique à : Member, objet


ParentSameAsPrev, propriété (ADO MD)

Référence API ADO 2.5 MD

ParentSameAsPrev, propriété

Indique si le parent du membre de cette position est le même que le parent du membre qui le précède immédiatement.

Valeurs renvoyées

Renvoie une valeur de type Boolean, en lecture seule.

Remarques

Cette propriété n'est prise en charge que pour les objets Member appartenant à un objet Position. Une erreur se produit lorsque cette propriété est invoquée par des objets Member appartenant à un objet Level.

Voir aussi

DrilledDown, propriété

S'applique à : Member, objet


Source, propriété (ADO MD)

Référence API ADO 2.5 MD

Source, propriété

Indique la source des données du jeu de cellules.

Paramètres et valeurs renvoyées

Définit ou renvoie une valeur de type Variant en lecture/écriture pour des objets Cellset fermés et en lecture seule pour des objets Cellset ouverts. La valeur de type Variant doit contenir une String valide, par exemple une requête MDX.

Voir aussi

Exemple pour Visual Basic

ActiveConnection, propriété | Open, méthode

S'applique à : Cellset, objet


State, propriété (ADO MD)

Référence API ADO 2.5 MD

State, propriété

Indique l'état actuel du jeu de cellules.

Valeurs renvoyées

Renvoie un entier de type Long indiquant la condition actuelle de l'objet Cellset, en lecture seule. Les valeurs suivantes sont valides : adStateClosed (0) et adStateOpen (1).

Remarques

Pour utiliser les noms des constantes ObjectStateEnum, une bibliothèque de type ADO doit être référencée dans votre projet. Pour plus d'informations, consultez Utilisation d'ADO avec ADO MD.

Voir aussi

Close, méthode | Open, méthode

S'applique à : Cellset, objet


Type, propriété (ADO MD)

Référence API ADO 2.5 MD

Type, propriété

Indique le type du membre actuel.

Valeurs renvoyées

Renvoie une valeur MemberTypeEnum, en lecture seule.

Remarques

Cette propriété n'est prise en charge que pour les objets Member appartenant à un objet Level. Une erreur se produit lorsque cette propriété est invoquée par des objets Member appartenant à un objet Position.

S'applique à : Member, objet


UniqueName, propriété (ADO MD)

Référence API ADO 2.5 MD

UniqueName, propriété

Indique un nom sans équivoque pour l'objet actif.

Valeurs renvoyées

Renvoie une valeur de type String, en lecture seule.

Voir aussi

Name, propriété

S'applique à : Dimension, objet | Hierarchy, objet | Level, objet | Member, objet


Value, propriété (ADO MD)

Référence API ADO 2.5 MD

Value, propriété

Indique la valeur de la cellule active.

Valeurs renvoyées

Renvoie une valeur de type Variant, en lecture seule.

Voir aussi

FormattedValue, propriété

S'applique à : Cell, objet


Méthodes ADO MD

Close | Ferme un jeu de cellules (cellset) ouvert.
Open | Extrait les résultats d'une requête multidimensionnelle et les renvoie à un jeu de cellules.

Voir aussi

Référence API ADO MD | Exemples de code ADO MD | Collections ADO MD | Constantes énumérées ADO MD | Modèle d'objet ADO MD | Objets ADO MD | Propriétés ADO MD

© 1998-2002 Microsoft Corporation. Tous droits réservés.


Close, méthode (ADO MD)

Référence API ADO 2.5 MD

Close, méthode

Ferme un jeu de cellules (cellset) ouvert.

Syntaxe

Cellset.Close

Remarques

L'utilisation de la méthode Close pour fermer un objet Cellset libère les données associées, notamment les données dans tous les objets Cell, Axis, Position ou Member. La fermeture d'un Cellset ne le supprime pas de la mémoire. Vous pouvez modifier les paramètres de sa propriété et l'ouvrir à nouveau ultérieurement. Pour éliminer définitivement un objet de la mémoire, affectez la valeur Nothing à la variable objet.

Vous pouvez ultérieurement appeler la méthode Open pour rouvrir le Cellset à l'aide de la même ou d'une autre chaîne source. Tant que l'objet Cellset est fermé, l'extraction de toute propriété ou l'appel de toute méthode faisant référence aux données ou métadonnées sous-jacentes provoque une erreur.

Voir aussi

Axis, objet | Cell, objet | Member, objet | Open, méthode | Position, objet | State, propriété

S'applique à : Cellset, objet


Open, méthode (ADO MD)

Référence API ADO 2.5 MD

Open, méthode

Extrait les résultats d'une requête multidimensionnelle et les renvoie à un jeu de cellules.

Syntaxe

Cellset.Open Source, ActiveConnection

Paramètres

Source
Facultatif. Valeur de type Variant correspondant à une requête multidimensionnelle valide, telle qu'une requête d'expression multidimensionnelle (MDX). L'argument Source correspond à la propriété Source. Pour plus d'informations sur MDX, consultez la documentation OLE DB for OLAP dans le Kit de développement Microsoft Data Access Components (SDK).
ActiveConnection
Facultatif. Valeur de type Variant qui envoie une chaîne spécifiant soit un nom de variable d'objet ADO Connection valide, soit la définition d'une connexion. L'argument ActiveConnection spécifie la connexion dans laquelle doit être ouvert l'objet Cellset. Si vous passez une définition de connexion à cet argument, ADO ouvre une nouvelle connexion à l'aide des paramètres spécifiés. L'argument ActiveConnection correspond à la propriété ActiveConnection.

Remarques

La méthode Open génère une erreur en cas d'omission de l'un quelconque de ses paramètres et si la valeur correspondante de la propriété n'a pas été définie avant la tentative d'ouverture du Cellset.

Voir aussi

Exemple pour Visual Basic

ActiveConnection, propriété | Close, méthode | Connection, objet | Source, propriété | State, propriété

S'applique à : Cellset, objet


Constantes énumérées ADO MD

Pour faciliter le débogage, les constantes énumérées ADO MD indiquent une valeur pour chaque constante. Cependant, cette valeur est purement indicative et peut varier d'une version ADO MD à une autre. Votre code doit dépendre uniquement du nom des constantes énumérées et non de leur valeur réelle.

L'énumération suivante est définie.

  • MemberTypeEnum

Voir aussi

Référence API ADO MD | Exemples de code ADO MD | Collections ADO MD | Méthodes ADO MD | Modèle d'objet ADO MD | Objets ADO MD | Propriétés ADO MD


MemberTypeEnum

Spécifie le paramétrage de la propriété Type d'un objet Member.

Constante | Valeur | Description
adMemberAll | 4 | Indique que l'objet Member représente tous les membres de ce niveau.
adMemberFormula | 3 | Indique que l'objet Member est calculé à l'aide d'une formule d'expression.
adMemberMeasure | 2 | Indique que l'objet Member appartient à la dimension Mesures et représente un attribut quantitatif.
adMemberRegular | 1 | Valeur par défaut. L'objet Member représente une instance de l'entité Business.
adMemberUnknown | 0 | Impossible de déterminer le type du membre.


Exemples de code ADO MD

Utilisez les exemples de code suivants pour apprendre à utiliser les objets, les méthodes et les propriétés ADO MD. Ces exemples font partie des applications exemples installées avec Microsoft SQL Server OLAP Services pour SQL Server 7.0.

Ces exemples utilisent le fournisseur MSOLAP OLE DB et s'exécutent sur un hôte local de Microsoft SQL Server OLAP Services. Ils sont, cependant, destinés à illustrer les techniques fondamentales de programmation ADO MD, et doivent s'adapter aisément à d'autres fournisseurs ou sources de données.

  • Exemples de code ADO MD en Microsoft Visual Basic
  • Exemples de code ADO MD en Visual Basic, Scripting Edition

Voir aussi

Référence API ADO MD | Collections ADO MD | Constantes énumérées ADO MD | Méthodes ADO MD | Modèle d'objet ADO MD | Objets ADO MD | Propriétés ADO MD


Exemples de code ADO MD en Microsoft Visual Basic

Les exemples ci-dessous nécessitent Microsoft Visual Basic version 5.0 avec Service Pack 3 ou Visual Basic version 6.0.

Note Collez l'exemple de code dans sa totalité, du début à la fin, dans votre éditeur de code. L'exemple risque de ne pas fonctionner correctement si des copies partielles d'exemple sont utilisées ou si la mise en forme des paragraphes est perdue.
  • Exemple Cellset
  • Exemple Catalog


Exemple Cellset (VB)

Ce projet Visual Basic illustre les principes de base de l'utilisation des techniques ADO MD pour accéder aux données cube. Il affiche les légendes des membres pour les en-têtes des colonnes et des lignes, puis affiche les valeurs formatées de cellules spécifiques dans le jeu de cellules (cellset).

Sub cmdCellSettoDebugWindow_Click()
    On Error GoTo Error_cmdCellSettoDebugWindow_Click

    Dim cat As New ADOMD.Catalog
    Dim cst As New ADOMD.CellSet
    Dim strServer As String
    Dim strSource As String
    Dim strColumnHeader As String
    Dim strRowText As String
    Dim i As Integer
    Dim j As Integer
    Dim k As Integer

    Screen.MousePointer = vbHourglass

    '*-----------------------------------------------------------------------
    '* Set Server to Local Host
    '*-----------------------------------------------------------------------
    strServer = "localhost"

    '*-----------------------------------------------------------------------
    '* Set MDX query string Source
    '*-----------------------------------------------------------------------
    strSource = "SELECT {[Measures].members} ON COLUMNS," & _
        "NON EMPTY [Store].[Store City].members ON ROWS FROM Sales"

    '*-----------------------------------------------------------------------
    '* Set Active Connection
    '*-----------------------------------------------------------------------
    cat.ActiveConnection = "Data Source=" & strServer & ";Provider=msolap;"

    '*-----------------------------------------------------------------------
    '* Set Cell Set source to MDX query string
    '*-----------------------------------------------------------------------
    cst.Source = strSource

    '*-----------------------------------------------------------------------
    '* Set Cell Sets active connection to current connection
    '*-----------------------------------------------------------------------
    Set cst.ActiveConnection = cat.ActiveConnection

    '*-----------------------------------------------------------------------
    '* Open Cell Set
    '*-----------------------------------------------------------------------
    cst.Open

    '*-----------------------------------------------------------------------
    '* Allow space for Row Header Text
    '*-----------------------------------------------------------------------
    strColumnHeader = vbTab & vbTab & vbTab & vbTab & vbTab & vbTab

    '*-----------------------------------------------------------------------
    '* Loop through Column Headers
    '*-----------------------------------------------------------------------
    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

    '*-----------------------------------------------------------------------
    '* Loop through Row Headers and Provide data for each row
    '*-----------------------------------------------------------------------
    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
   Set cat = Nothing
   Set cst = Nothing
   MsgBox "The Following Error has occurred:" & vbCrLf & _
      Err.Description, vbCritical, " Error!"
   Exit Sub
End Sub


Exemple Catalog (VB)

Ce projet Visual Basic crée un cube à l'aide de MDX. Ensuite, il documente la structure d'un cube dans un document Microsoft Word.

Sub cmdCreateDocForCube_Click()
    On Error GoTo Error_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

    '*-----------------------------------------------------------------------
    '* The following code builds a cube file then documents the properties
    '* with an OLE Connection to Word 8.0
    '*-----------------------------------------------------------------------

    '*-----------------------------------------------------------------------
    '* Add Provider to the connection string.
    '*-----------------------------------------------------------------------
    strProvider = "PROVIDER=MSOLAP"

    '*-----------------------------------------------------------------------
    '* Add DataSource, the name of the file we will create.
    '*-----------------------------------------------------------------------

    strDataSource = "DATA SOURCE=c:\DocumentCube.cub"

    '*-----------------------------------------------------------------------
    '* Add Source DSN, the connection string for where the data comes from.
    '* We need to quote the value so it is parsed as one value.
    '* This can either be an ODBC connection string or an OLE DB connection
    '* string. (As returned by the Data Source Locator component.)
    '*-----------------------------------------------------------------------
    strSourceDSN = "SOURCE_DSN=FoodMart 2000"

    '*-----------------------------------------------------------------------
    '* Add CREATE CUBE.  This defines the structure of the cube, but not the
    '* data in it. The BNF for is documented in the OLE DB for OLAP
    '* Programmer's Reference. Note that we can quote names with either
    '* double quotes or square brackets.
    '*-----------------------------------------------------------------------
    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 '#.#')"
    '*-----------------------------------------------------------------------
    '* Add INSERT INTO.  This defines where the data comes from, and how it
    '* maps into the already-defined cube structure.  Note that the SELECT
    '* clause might just be passed through to the relational database.
    '* So I could pass in a stored procedure, for example.  If we needed to,
    '* we could quote this whole thing.  Note that the columns in the SELECT
    '* can be in any order.  One merely has to adjust the ordering of the
    '* list of level/measure names to match the SELECT ordering.
    '*-----------------------------------------------------------------------
    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] )"
    '*-----------------------------------------------------------------------
    '* Add some options to the INSERT INTO if we need to.  These can control
    '* if the SELECT clause is analyzed or just passed through, and if the
    '* storage mode is MOLAP or ROLAP (DEFER_DATA).
    '* strInsertInto = strInsertInto & " OPTIONS ATTEMPT_ANALYSIS"
    '*-----------------------------------------------------------------------

    '*-----------------------------------------------------------------------
    '* Add the SELECT clause of the INSERT INTO statement.  Note that it is
    '* merely concatenated onto the end of the INSERT INTO statement.  OLAP
    '* Services will pass this through to the source database if unable to
    '* parse it.  Note that for OLAP Services to analyze the SELECT clause,
    '* each column must be qualified with the table name.
    '*-----------------------------------------------------------------------

    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]"

    '*-----------------------------------------------------------------------
    '* Create the cube by passing connection string to Open.
    '*-----------------------------------------------------------------------

    Set cn = New ADODB.Connection
    s = strProvider & ";" & strDataSource & ";" & strSourceDSN & ";" & _
        strCreateCube & ";" & strInsertInto & ";"
    Screen.MousePointer = vbHourglass
    cn.Open s

    '*-----------------------------------------------------------------------
    '* Cube file is written to hard drive a Word Document can be produced by
    '* automating Word with VB
    '*-----------------------------------------------------------------------

    Dim cat As New ADOMD.Catalog
    Dim cdf As ADOMD.CubeDef
    Dim i As Integer
    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
    Dim appWord As Object
    '*-----------------------------------------------------------------------
    '* Connection is made to cube file
    '*-----------------------------------------------------------------------
    cat.ActiveConnection = "DATA SOURCE=c:\DocumentCube.cub;Provider=msolap;"

    '*-----------------------------------------------------------------------
    '* Cube Definition is set to Name of Cube in cube file
    '*-----------------------------------------------------------------------
    Set cdf = cat.CubeDefs("Sample")

    '*-----------------------------------------------------------------------
    '* Object is created to hold Word
    '*-----------------------------------------------------------------------
    Set appWord = CreateObject("Word.Application")

    '*-----------------------------------------------------------------------
    '* Create the document variable
    '*-----------------------------------------------------------------------
    Set docWord = appWord.Documents.Add()

    Set rngCurrent = docWord.Content

    SenCount = 0

    '*-----------------------------------------------------------------------
    '* Cube Title and Header written to Document
    '*-----------------------------------------------------------------------
    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

        '*-----------------------------------------------------------------------
        '* Properties of Cube are written to Document
        '*-----------------------------------------------------------------------
        Debug.Print "Properties of Cube are written to Document"
        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

        '*-----------------------------------------------------------------------
        '* Dimension Name(s) written to Document
        '*-----------------------------------------------------------------------
        Debug.Print "Dimension Name(s) written to Document"
        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

            '*-----------------------------------------------------------------------
            '* Properties of Dimension are written to Document
            '*-----------------------------------------------------------------------
            Debug.Print "Properties of Dimension are written to Document"
            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

            '*-----------------------------------------------------------------------
            '* Hierarchy Name(s) written to Document
            '*-----------------------------------------------------------------------
            Debug.Print "Hierarchy Name(s) written to Document"
            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

                '*-----------------------------------------------------------------------
                '* Properties of Hierarchy are written to Document
                '*-----------------------------------------------------------------------
                Debug.Print "Properties of Hierarchy are written to Document"
                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

                '*-----------------------------------------------------------------------
                '* Level Name(s) written to Document
                '*-----------------------------------------------------------------------
                Debug.Print "Level Name(s) written to Document"
                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

                    '*-----------------------------------------------------------------------
                    '* Properties of Level are written to Document
                    '*-----------------------------------------------------------------------
                    Debug.Print "Properties of Level are written to Document"
                    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

        '*-----------------------------------------------------------------------
        '* Set Word Document to visible
        '*-----------------------------------------------------------------------
        Debug.Print "Set Word Document to visible"
        appWord.Visible = True
    End With

    Screen.MousePointer = vbDefault

    '*-----------------------------------------------------------------------
    '* Set Word Object to nothing to drop OLE connection
    '*-----------------------------------------------------------------------
    Set appWord = Nothing
Exit Sub

Error_cmdCreateDocForCube_Click:
    cn.Cancel
    Set cn = Nothing
    Screen.MousePointer = vbDefault
    MsgBox Err.Description
End Sub


Exemples de code ADO MD en Visual Basic, Scripting Edition

Les exemples suivants exigent Microsoft Active Server Pages (ASP) pour Microsoft Internet Information Server 4.0.

Note Collez l'exemple de code dans sa totalité, du début à la fin, dans votre éditeur de code. L'exemple risque de ne pas fonctionner correctement si des copies partielles d'exemple sont utilisées ou si la mise en forme des paragraphes est perdue.
  • Exemple Axis
  • Exemple Members
  • Exemple CubeDef


Exemple Axis (VBScript)

Cette page ASP (Active Server Page) affiche les données OLAP d'une chaîne de requête MDX et écrit le jeu de cellules (cellset) obtenu dans une structure de tableau HTML.

<%@ Language=VBScript %>
<%
'************************************************************************
'*** Active Server Page displays OLAP data from default
'*** MDX Query string and writes resulting cell set to HTML table
'*** structure.
'************************************************************************
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

'************************************************************************
'*** Set Connection Objects for Multidimensional Catalog and Cellset
'************************************************************************
Set cat = Server.CreateObject("ADOMD.Catalog")
Set cst = Server.CreateObject("ADOMD.CellSet")

'************************************************************************
'*** Use default settings of a known OLAP Server
'*** for Server Name for Connection Set Server Name Session Object
'*** to default value
'************************************************************************
'*** Must set OLAPServerName to OLAP Server that is
'*** present on network
'************************************************************************
   OLAPServerName = "Please set to present OLAP Server"
   cat.ActiveConnection = "Data Source='" & OLAPServerName & _
      "';Initial Catalog='FoodMart';Provider='msolap';"

'************************************************************************
'*** Use default MDX Query string of a known query that works
'*** with default server Set MDXQuery Session Object to default value
'************************************************************************
   strSource = strSource & "SELECT "
   strSource = strSource & "{[Measures].members} ON COLUMNS,"
   strSource = strSource & _
      "NON EMPTY [Store].[Store City].members ON ROWS"
   strSource = strSource & " FROM Sales"

'************************************************************************
'*** Set Cell Set Source property to strSource to be passed on cell set '*** open method
'************************************************************************
    cst.Source = strSource

'************************************************************************
'*** Set Cell Sets Active connection to use the current Catalogs Active
'*** connection
'************************************************************************
Set cst.ActiveConnection = cat.ActiveConnection

'************************************************************************
'*** Using Open method, Open cell set
'************************************************************************
cst.Open

'************************************************************************
'*** Set Dimension Counts minus 1 for Both Axes to intDC0, intDC1
'*** Set Position Counts minus 1 for Both Axes to intPC0, intPC1
'************************************************************************
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

'************************************************************************
'*** Create HTML Table structure to hold MDX Query return Record set
'************************************************************************
      Response.Write "<Table width=100% border=1>"

'************************************************************************
'*** Loop to create Column header
'************************************************************************
      For h=0 to intDC0
         Response.Write "<TR>"

'************************************************************************
'*** Loop to create spaces in front of Column headers
'*** to align with Row header
'************************************************************************
         For c=0 to intDC1
            Response.Write "<TD></TD>"
         Next

'************************************************************************
'*** Iterate through Axes(0) Positions writing member captions to table
'*** header
'************************************************************************
         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
'************************************************************************
'*** Use Array values for row header formatting to provide
'*** spaces under beginning row header titles
'************************************************************************
      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>


Exemple Members (VBScript)

Cet exemple utilise une chaîne de requête MDX pour extraire des données OLAP et écrire le jeu de cellules (cellset) obtenu dans une structure de tableau HTML à l'aide des fonctions de développement des colonnes pour les jeux de cellules multidimensions.

<%@ Language=VBScript %>
<%
'************************************************************************
'*** Active Server Page displays OLAP data from default or provided
'*** MDX Query string and writes resulting cell set to HTML table
'*** structure. This ASP provides colspan features for multiple
'*** dimension cell sets.
'************************************************************************
Response.Buffer=True
Response.Expires=0
%>
<html>
<head>
</head>
<body bgcolor="Ivory">
<font FACE="Verdana">

<%

Dim cat,cst,i,j,strSource,csw,LevelValue,intDC0,intDC1,intPC0, intPC1
'************************************************************************
'*** Gather Server Name and MDX Query Strings from text box and
'*** text area and assign them to Session Objects of same name
'************************************************************************
Session("ServerName")=Request.Form("strServerName")
Session("InitialCatalog")=Request.Form("strInitialCatalog")
Session("MDXQuery")=Request.Form("MDXQuery")

'************************************************************************
'*** Set Connection Objects for Multi dimensional Catalog and Cell Set
'************************************************************************
Set cat = Server.CreateObject("ADOMD.Catalog")
Set cst = Server.CreateObject("ADOMD.CellSet")

'************************************************************************
'*** Check to see if the Session Object Server Name is present
'*** If present then: Create Active Connection using Server Name
'*** and MSOLAP as connection Provider
'*** If not present then: Use default settings of a known OLAP Server
'*** for Server Name for Connection Set Server Name Session Object
'*** to default value
'************************************************************************
If Len(Session("ServerName")) > 0 Then
   cat.ActiveConnection = "Data Source='" & Session("ServerName") & _
      "';Initial Catalog='" & Session("InitialCatalog") & _
      "';Provider='msolap';"
Else

'************************************************************************
'*** Must set OLAPServerName to OLAP Server that is
'*** present on network
'************************************************************************
   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
'************************************************************************
'*** Check to see if the Session Object MDXQuery is present
'*** If present then: Set strSource using MDXQuery Session Object
'*** If not present then: Use default MDX Query string of a known query
'*** that works with default server Set MDXQuery Session Object to
'*** default value
'************************************************************************
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

'************************************************************************
'*** Set Cell Set Source property to strSource to be passed on cell set
'*** open method
'************************************************************************
   cst.Source = strSource

'************************************************************************
'*** Set Cell Sets Active connection to use the current Catalogs Active
'*** connection
'************************************************************************
Set cst.ActiveConnection = cat.ActiveConnection

'************************************************************************
'*** Using Open method, Open cell set
'************************************************************************
cst.Open

'************************************************************************
'*** Standard HTML to collect Server Name and MDX Query Information
'*** Note that post action posts back to same page to process
'*** thus using state of Session Variables to change look of page
'************************************************************************
%>
<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>
<%
'************************************************************************
'*** Set Dimension Counts minus 1 for Both Axes to intDC0, intDC1
'*** Set Position Counts minus 1 for Both Axes to intPC0, intPC1
'************************************************************************
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

'************************************************************************
'*** Create HTML Table structure to hold MDX Query return Record set
'************************************************************************
Response.Write "<Table width=100% border=1>"

'************************************************************************
'*** Loop to create Column header for all Dimensions based
'*** on Count of Dimensions for Axes(0)
'************************************************************************
For h=0 to intDC0
   Response.Write "<TR>"

'************************************************************************
'*** Loop to create spaces in front of Column headers
'*** to align with Row headers
'************************************************************************
   For c=0 to intDC1
      Response.Write "<TD></TD>"
   Next

'************************************************************************
'*** Check current dimension to see if equal to Last Dimension
'*** If True: Write Table header titles normally to HTML output with out
'*** ColSpan value
'*** If False: Write Table header titles with ColSpan values to HTML
'*** output
'************************************************************************
   If h = intDC0 then

'************************************************************************
'*** Iterate through Axes(0) Positions writing member captions to table
'*** header
'************************************************************************
      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

'************************************************************************
'*** Iterate through Axes(0) Positions writing member captions to table
'*** header taking into account for the span of columns for duplicate
'*** member captions
'************************************************************************
      CaptionCount = 1
      LastCaption = cst.Axes(0).Positions(0).Members(h).Caption
      Response.Write "<TH"
      For t=1 to intPC0

'************************************************************************
'*** Check to see if LastCaption is equal to current members caption
'*** If True: Add one to CaptionCount to increase Colspan value
'*** If False: Write Table header titles with ColSpan values to HTML
'*** output using current CaptionCount for Colspan and LastCaption for
'*** header string
'************************************************************************
         If LastCaption = _
            cst.Axes(0).Positions(t).Members(h).Caption then
            CaptionCount = CaptionCount+1

'************************************************************************
'*** Check if at last position
'*** If True: Write HTML to finish table row using current
'*** CaptionCount and LastCaption
'************************************************************************
            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

'************************************************************************
'*** Iterate through Axes(1) Positions first writing member captions
'*** to table row headers then writing cell set data to table structure
'************************************************************************
      Dim aryRows()
      Dim intArray,Marker
      intArray=0

'************************************************************************
'*** Set value of Array for row header formatting
'************************************************************************
      For a=1 To intDC1
         intArray = intArray+(intPC1+1)
      Next
      intArray = intArray-1
      ReDim aryRows(intArray)
      Marker=0

'************************************************************************
'*** Use Array values for row header formatting to provide
'*** spaces under beginning row header titles
'************************************************************************
      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

'************************************************************************
'*** Alternates Cell background color
'************************************************************************
         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>"

'************************************************************************
'*** FormattedValue property pulls data
'************************************************************************
            Response.Write cst(k, j).FormattedValue
            Response.Write "</FONT>"
            Response.Write "</TD>"
         Next
         Response.Write "</TR>"
      Next
      Response.Write "</Table>"

%>
</font>
</body>
</html>


Exemple CubeDef (VBScript)

Cet exemple affiche des métadonnées cube sur une page Web.

<%@ 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

'************************************************************************
'*** Set Session Variables
'************************************************************************
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")

'************************************************************************
'*** Create Catalog Object
'************************************************************************************
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
'************************************************************************************
'*** Must set OLAPServerName to OLAP Server that is
'*** present on network
'************************************************************************
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

'************************************************************************
'*** Collect Information in HTML Form
'************************************************************************
%>
<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>
<%

'************************************************************************
'*** Start of Report
'************************************************************************
Response.Write "<H3>Report for " & Session("CubeName") & " Cube</H3>"
Response.Write "<OL TYPE='i'>"

'************************************************************************
'*** Show properties of Cube
'************************************************************************
            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'>"
 '************************************************************************
'*** Loop to display Dimension Name and Properties if Check box is
'*** Checked
'************************************************************************
      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'>"
'************************************************************************
'*** Loop to display Hierarchy Name and Properties if Check box is
'*** Checked
'************************************************************************
         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'>"
'************************************************************************
'*** Loop to display Level Name and Properties if Check box is Checked
'************************************************************************
      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>


Référence de l'API ADOX

Cette partie de la documentation ADOX contient une rubrique pour chaque objet, collection, méthode et propriété ADOX, ainsi qu'un exemple de code lorsque cela est utile. Pour plus d'informations, recherchez une rubrique particulière dans l'index ou consultez les rubriques suivantes :

  • Objets ADOX
  • Collections ADOX
  • Propriétés ADOX
  • Méthodes ADOX
  • Constantes énumérées ADOX
  • Exemples de code ADOX

Voir aussi

Référence API ADO | Référence API ADO MD | Exemples de code ADOX | Collections ADOX | Constantes énumérées ADOX | Méthodes ADOX | Modèle d'objet ADOX | Objets ADOX | Propriétés ADOX


Modèle d'objet ADOX

Le diagramme suivant montre comment les objets sont représentés et reliés dans ADOX. Pour plus d'informations sur un objet ou une collection, consultez la rubrique de référence concernée, ou Objets ADOX et Collections ADOX.

Chacun des objets Table, Index et Column possède également une collection ADO standard Properties.

Voir aussi

Référence de l'API ADOX | Exemples de code ADOX | Collections ADOX | Constantes énumérées ADOX | Méthodes ADOX | Objets ADOX | Propriétés ADOX | Guide de référence du programmeur Microsoft ADOX


Objets ADOX

Résumé des objets ADOX

Objet | Description
Catalog | Contient des collections qui décrivent le catalogue schématique d'une source de données.
Column | Représente une colonne d'une table, d'un index ou d'une clé.
Group | Représente un compte de groupe possédant des autorisations d'accès à l'intérieur d'une base de données protégée.
Index | Représente un index d'une table de base de données.
Key | Représente un champ clé, primaire, étrangère ou unique dans une table de base de données.
Procedure | Représente une procédure stockée.
Table | Représente une table de base de données, comprenant des colonnes, des index et des clés.
User | Représente un compte d'utilisateur possédant des autorisations d'accès à l'intérieur d'une base de données protégée.
View | Représente un ensemble filtré d'enregistrements ou une table virtuelle.

Les relations entre ces objets sont représentées dans le Modèle d'objet ADOX.

Chaque objet peut être contenu dans sa collection correspondante. Par exemple, un objet Table peut être contenu dans une collection Tables. Pour plus d'informations, consultez Collections ADOX ou la rubrique de la collection concernée.

Voir aussi

Référence de l'API ADOX | Collections ADOX | Modèle d'objet ADOX | Guide de référence du programmeur Microsoft ADOX


Catalog, objet (ADOX)

Référence de l'API ADOX 2.5

Catalog, objet

Contient des collections (Tables, Views, Users, Groups et Procedures) qui décrivent le catalogue schématique d'une source de données.

Remarques

Vous pouvez modifier l'objet Catalog en lui ajoutant ou en lui retirant des objets, ou encore en y modifiant des objets existants. Certains fournisseurs ne prennent pas en charge la totalité des objets Catalog ou ne gèrent que les informations concernant les schémas de vue.

Avec les propriétés et les méthodes d'un objet Catalog, vous pouvez :

  • Ouvrir le catalogue en affectant la propriété ActiveConnection à un objet Connection ADO ou à une chaîne de connexion valide.
  • Créer un catalogue au moyen de la méthode Create.
  • Déterminer les propriétaires des objets d'un Catalog à l'aide des méthodes GetObjectOwner et SetObjectOwner.

Voir aussi

Exemple de propriété Catalog ActiveConnection (VB) | Exemple de propriétés Command et CommandText (VB) | Exemple de méthode Connection Close, et de propriété Table Type (VB) | Exemple de méthode Create (VB) | Exemple de méthode Keys Append, et de propriétés Key Type, RelatedColumn, RelatedTable et UpdateRule (VB) | Exemple de collection Parameters et de propriété Command (VB) | Exemple de propriété ParentCatalog (VB) | Exemple de méthode Procedures Append (VB) | Exemple de méthode Procedures Delete (VB) | Exemple de méthode Procedures Refresh (VB) | Exemple de collections Views et Fields (VB) | Exemple de méthode Views Append (VB) | Exemple de collection Views et de propriété CommandText (VB) | Exemple de méthode Views Delete (VB) | Exemple de méthode Views Refresh (VB)

Propriétés, méthodes et événements | Groups, collection | Procedures, collection | Tables, collection | Users, collection | Views, collection


Propriétés, méthodes et événements

Référence de l'API ADOX 2.5

Propriétés, méthodes et événements de l'objet Catalog

Propriétés/Collections

ActiveConnection, propriété

Groups, collection

Procedures, collection

Tables, collection

Users, collection

Views, collection

Méthodes

Create, méthode

GetObjectOwner, méthode

SetObjectOwner, méthode

Événements

Aucun.

S'applique à : Catalog, objet


Catalog, objet (ADOX)

Référence de l'API ADOX 2.5

Column, objet

Représente une colonne d'une table, d'un index ou d'une clé.

Remarques

Le code suivant crée une Column :

Dim obj As New Column

Avec les propriétés et les collections d'un objet Column, vous pouvez :

  • Identifier la colonne à l'aide de la propriété Name.
  • Spécifier le type de données de la colonne à l'aide de la propriété Type.
  • Déterminer à l'aide de la propriété Attributes si la colonne possède une longueur fixe ou si elle peut contenir des valeurs nulles.
  • Spécifier la taille maximale de la colonne à l'aide de la propriété DefinedSize.
  • Pour les valeurs numériques, spécifier l'échelle grâce à la propriété NumericScale.
  • Pour les valeurs numériques, spécifier la précision maximale au moyen de la propriété Precision.
  • Spécifier le Catalog qui possède la colonne grâce à la propriété ParentCatalog.
  • Pour les colonnes clés, spécifier le nom de la colonne correspondante dans la table correspondante à l'aide de la propriété RelatedColumn.
  • Pour les colonnes index, préciser si l'ordre de tri est croissant ou décroissant grâce à la propriété SortOrder.
  • Accéder aux propriétés spécifiques au fournisseur grâce à la collection Properties.
Note Il se peut que votre fournisseur de données ne prenne pas en charge tous les objets Column. Une erreur se produit si vous attribuez une valeur à une propriété que le fournisseur ne prend pas en charge. Pour les nouveaux objets Column, l'erreur se produit lorsque l'objet est ajouté dans la collection. Pour des objets existants, l'erreur se produit lors de la définition de la propriété.
Lors de la création d'objets Column, l'existence d'une valeur par défaut appropriée pour une propriété facultative ne garantit pas que votre fournisseur prend en charge cette propriété. Pour plus d'informations sur les propriétés que votre fournisseur prend en charge, consultez la documentation qui s'y rapporte.

Voir aussi

Exemple de méthodes Columns et Tables Append, et de propriété Name (VB) | Exemple de méthode Connection Close, et de propriété Table Type (VB) | Exemple de méthode Keys Append, et de propriétés Key Type, RelatedColumn, RelatedTable et UpdateRule (VB) | Exemple de propriétés NumericScale et Precision (VB) | Exemple de propriété ParentCatalog (VB) Exemple de propriété SortOrder (VB)

Propriétés, méthodes et événements | Columns, collection | Properties, collection


Propriétés, méthodes et événements

Référence de l'API ADOX 2.5

Propriétés, méthodes et événements de l'objet Column

Propriétés/Collections

Attributes, propriété

DefinedSize, propriété

Name, propriété

NumericScale, propriété

ParentCatalog, propriété

Precision, propriété

Properties, collection

RelatedColumn, propriété

SortOrder, propriété

Type, propriété (Column)

Méthodes

Aucune.

Événements

Aucun.

S'applique à : Column, objet


Group, objet (ADOX)

Référence de l'API ADOX 2.5

Group, objet

Représente un compte de groupe possédant des autorisations d'accès à l'intérieur d'une base de données protégée.

Remarques

La collection Groups d'un objet Catalog représente tous les comptes de groupe de ce catalogue. La collection Groups d'un objet User représente seulement le groupe auquel appartient l'utilisateur.

À l'aide des propriétés, collections et méthodes d'un objet Group, vous pouvez :

  • Identifier le groupe à l'aide de la propriété Name.
  • Déterminer si un groupe possède les autorisations de lecture, d'écriture ou de suppression à l'aide des méthodes GetPermissions et SetPermissions.
  • Accéder aux comptes d'utilisateur qui font partie du groupe à l'aide de la collection Users.
  • Accéder aux propriétés spécifiques au fournisseur grâce à la collection Properties.

Voir aussi

Propriétés, méthodes et événements | Groups, collection | Users, collection


Propriétés, méthodes et événements

Référence de l'API ADOX 2.5

Propriétés, méthodes et événements de l'objet Group

Propriétés/Collections

Name, propriété

Properties, collection

Users, collection

Méthodes

GetPermissions, méthode

SetPermissions, méthode

Événements

Aucun.

S'applique à : Group, objet


Index, objet (ADOX)

Référence de l'API ADOX 2.5

Index, objet

Représente un index d'une table de base de données.

Remarques

Le code suivant crée un Index :

Dim obj As New Index

Avec les propriétés et les collections d'un objet Index, vous pouvez :

  • Identifier l'index à l'aide de la propriété Name.
  • Accéder aux colonnes de base de données de l'index à l'aide de la collection Columns.
  • Préciser si les clés d'index doivent être uniques à l'aide de la propriété Unique.
  • Préciser si l'index est la clé primaire d'une table à l'aide de la propriété PrimaryKey.
  • Préciser si les enregistrements qui ont des valeurs nulles dans leurs champs d'index possèdent des entrées d'index, à l'aide de la propriété IndexNulls.
  • Préciser si l'index est regroupé à l'aide de la propriété Clustered.
  • Accéder aux propriétés d'index spécifiques au fournisseur grâce à la collection Properties.
Notes Une erreur se produit si vous ajoutez un objet Column à la collection Columns d'un Index alors que l'objet Column n'existe pas dans un objet Table déjà ajouté à la collection Tables.
Il se peut que votre fournisseur de données ne prenne pas en charge toutes les propriétés des objets Index. Une erreur se produit si vous attribuez une valeur à une propriété que le fournisseur ne prend pas en charge. Pour les nouveaux objets Index, l'erreur se produit lorsque l'objet est ajouté dans la collection. Pour des objets existants, l'erreur se produit lors de la définition de la propriété.
Lors de la création d'objets Index, l'existence d'une valeur par défaut appropriée pour une propriété facultative ne garantit pas que votre fournisseur prend en charge cette propriété. Pour plus d'informations sur les propriétés que votre fournisseur prend en charge, consultez la documentation qui s'y rapporte.

Voir aussi

Exemple de méthode Indexes Append (VB) | Exemple de propriété IndexNulls (VB) | Exemple de propriétés PrimaryKey et Unique (VB) | Exemple de propriété SortOrder (VB)

Propriétés, méthodes et événements | Columns, collection | Indexes, collection | Properties, collection


Propriétés, méthodes et événements

Référence de l'API ADOX 2.5

Propriétés, méthodes et événements de l'objet Index

Propriétés/Collections

Clustered, propriété

Columns, collection

IndexNulls, propriété

Name, propriété

PrimaryKey, propriété

Properties, collection

Unique, propriété

Méthodes

Aucune.

Événements

Aucun.

S'applique à : Index, objet


Key, objet (ADOX)

Référence de l'API ADOX 2.5

Key, objet

Représente un champ clé, primaire, étrangère ou unique dans une table de base de données.

Remarques

Le code suivant crée un objet Key :

Dim obj As New Key

Avec les propriétés et les collections d'un objet Key, vous pouvez :

  • Identifier la clé grâce à la propriété Name.
  • Déterminer si la clé est primaire, étrangère ou unique à l'aide de la propriété Type.
  • Accéder aux colonnes de base de données de la clé à l'aide de la collection Columns.
  • Préciser le nom de la table concernée à l'aide de la propriété RelatedTable.
  • Déterminer l'action accomplie lors d'une suppression ou d'une mise à jour d'une clé primaire grâce aux propriétés DeleteRule et UpdateRule.

Voir aussi

Exemple de méthode Keys Append, et de propriétés Key Type, RelatedColumn, RelatedTable et UpdateRule (VB)

Propriétés, méthodes et événements | Columns, collection | Keys, collection


Propriétés, méthodes et événements

Référence de l'API ADOX 2.5

Propriétés, méthodes et événements de l'objet Key

Propriétés/Collections

Columns, collection

DeleteRule, propriété

Name, propriété

RelatedTable, propriété

Type, propriété (Key)

UpdateRule, propriété

Méthodes

Aucune.

Événements

Aucun.

S'applique à : Key, objet


Procedure, objet (ADOX)

Référence de l'API ADOX 2.5

Procedure, objet

Représente une procédure stockée. Utilisé en conjonction avec l'objet Command ADO, l'objet Procedure permet d'ajouter, de supprimer ou de modifier des procédures stockées.

Remarques

L'objet Procedure permet de créer une procédure stockée sans avoir à utiliser, ni même à connaître, la syntaxe « CRÉATION DE PROCÉDURE » du fournisseur.

Avec les propriétés d'un objet Procedure, vous pouvez :

  • Identifier la procédure à l'aide de la propriété Name.
  • Spécifier l'objet Command ADO qui peut être utilisé pour créer ou exécuter la procédure à l'aide de la propriété Command.
  • Renvoyer des informations sur la date à l'aide des propriétés DateCreated et DateModified.

Voir aussi

Exemple de propriétés Command et CommandText (VB) | Exemple de collection Parameters et de propriété Command (VB) | Exemple de méthode Procedures Append (VB) | Exemple de méthode Procedures Delete (VB)

Propriétés, méthodes et événements | Procedures, collection


Propriétés, méthodes et événements

Référence de l'API ADOX 2.5

Propriétés, méthodes et événements de l'objet Procedure

Propriétés

Command, propriété

DateCreated, propriété

DateModified, propriété

Name, propriété

Méthodes

Aucune.

Événements

Aucun.

S'applique à : Procedure, objet


Table, objet (ADOX)

Référence de l'API ADOX 2.5

Table, objet

Représente une table de base de données, avec ses colonnes, index et clés.

Remarques

Le code suivant crée une Table :

Dim obj As New Table

Avec les propriétés et les collections d'un objet Table, vous pouvez :

  • Identifier la table grâce à la propriété Name.
  • Déterminer le type de table à l'aide la propriété Type.
  • Accéder aux colonnes de base de données de la table à l'aide de la collection Columns.
  • Accéder aux index de la table au moyen de la collection Indexes.
  • Accéder aux clés de la table à l'aide de la collection Keys.
  • Spécifier le Catalog qui possède la table grâce à la propriété ParentCatalog.
  • Renvoyer des informations sur la date à l'aide des propriétés DateCreated et DateModified.
  • Accéder aux propriétés de table spécifiques au fournisseur grâce à la collection Properties.
Note Il se peut que votre fournisseur de données ne prenne pas en charge toutes les propriétés des objets Table. Une erreur se produit si vous attribuez une valeur à une propriété que le fournisseur ne prend pas en charge. Pour les nouveaux objets Table, l'erreur se produit lorsque l'objet est ajouté dans la collection. Pour des objets existants, l'erreur se produit lors de la définition de la propriété.
Lors de la création d'objets Table, l'existence d'une valeur par défaut appropriée pour une propriété facultative ne garantit pas que votre fournisseur prend en charge cette propriété. Pour plus d'informations sur les propriétés que votre fournisseur prend en charge, consultez la documentation qui s'y rapporte.

Voir aussi

Exemple de propriété Catalog ActiveConnection (VB) | Exemple de méthodes Columns et Tables Append, et de propriété Name (VB) | Exemple de propriété Table Type et de méthode Connection Close (VB) | Exemple de méthode Keys Append, et de propriétés Key Type, RelatedColumn, RelatedTable et UpdateRule (VB) | Exemple de propriété ParentCatalog (VB)

Propriétés, méthodes et événements | Columns, collection | Indexes, collection | Keys, collection | Properties, collection | Tables, collection


Propriétés, méthodes et événements

Référence de l'API ADOX 2.5

Propriétés, méthodes et événements de l'objet Table

Propriétés/Collections

DateCreated, propriété

DateModified, propriété

Indexes, collection

Keys, collection

Name, propriété

ParentCatalog, propriété

Type, propriété (Table)

Méthodes

Aucune.

Événements

Aucun.

S'applique à : Table, objet


User, objet (ADOX)

Référence de l'API ADOX 2.5

User, objet

Représente un compte d'utilisateur possédant des autorisations d'accès à l'intérieur d'une base de données protégée.

Remarques

La collection Users d'un objet Catalog représente la totalité des utilisateurs du catalogue. La collection Users d'un objet Group représente seulement les utilisateurs du groupe spécifique.

À l'aide des propriétés, collections et méthodes d'un objet User, vous pouvez :

  • Identifier l'utilisateur grâce à la propriété Name.
  • Changer le mot de passe d'un utilisateur à l'aide de la méthode ChangePassword.
  • Déterminer si un utilisateur possède les autorisations de lecture, d'écriture ou de suppression à l'aide des méthodes GetPermissions et SetPermissions.
  • Accéder aux groupes auxquels appartient un utilisateur à l'aide de la collection Groups.
  • Accéder aux propriétés spécifiques au fournisseur grâce à la collection Properties.

Voir aussi

Exemple de méthodes GetPermissions et SetPermissions (VB)

Propriétés, méthodes et événements | Groups, collection | Users, collection


Propriétés, méthodes et événements

Référence de l'API ADOX 2.5

Propriétés, méthodes et événements de l'objet User

Propriétés/Collections

Groups, collection

Name, propriété

Properties, collection

Méthodes

ChangePassword, méthode

GetPermissions, méthode

SetPermissions, méthode

Événements

Aucun.

S'applique à : User, objet


View, objet (ADOX)

Référence de l'API ADOX 2.5

View, objet

Représente un ensemble filtré d'enregistrements ou une table virtuelle. Utilisé en conjonction avec l'objet Command ADO, l'objet View permet d'ajouter, de supprimer ou de modifier des vues.

Remarques

Une vue est une table virtuelle, créée à partir de tables ou de vues d'une autre base de données. L'objet View permet de créer une vue sans avoir à utiliser, ni même à connaître, la syntaxe « CRÉER UNE VUE » du fournisseur.

Avec les propriétés d'un objet View, vous pouvez :

  • Identifier la vue à l'aide de la propriété Name.
  • Spécifier l'objet Command ADO qui peut être utilisé pour ajouter, supprimer ou modifier des vues à l'aide de la propriété Command.
  • Renvoyer des informations sur la date à l'aide des propriétés DateCreated et DateModified.

Voir aussi

Exemple de collections Views et Fields (VB) | Exemple de méthode Views Append (VB) | Exemple de collection Views et de propriété CommandText (VB) | Exemple de méthode Views Delete (VB)

Propriétés, méthodes et événements | Views, collection


Propriétés, méthodes et événements

Référence de l'API ADOX 2.5

Propriétés, méthodes et événements de l'objet View

Propriétés

Command, propriété

DateCreated, propriété

DateModified, propriété

Name, propriété

Méthodes

Aucune.

Événements

Aucun.

S'applique à : View, objet


Collections ADOX

Columns | Contient tous les objets Column d'une table, d'un index ou d'une clé.
Groups | Contient tous les objets Group d'un catalogue ou d'un utilisateur.
Indexes | Contient tous les objets Index d'une table.
Keys | Contient tous les objets Key d'une table.
Procedures | Contient tous les objets Procedure d'un catalogue.
Tables | Contient tous les objets Table d'un catalogue.
Users | Contient tous les objets User d'un catalogue ou d'un groupe.
Views | Contient tous les objets View d'un catalogue.

Voir aussi

Référence de l'API ADOX | Modèle d'objet ADOX | Objets ADOX | Guide de référence du programmeur Microsoft ADOX


Columns, collection (ADOX)

Référence de l'API ADOX 2.5

Columns, collection

Contient tous les objets Column d'une table, d'un index ou d'une clé.

Remarques

La méthode Append d'une collection Columns est unique dans ADOX. Elle permet l'opération suivante :

  • Ajouter une nouvelle colonne à la collection à l'aide de la méthode Append.

Les autres propriétés et méthodes sont standard aux collections ADO. Elles permettent les opérations suivantes :

  • Accéder à une colonne de la collection à l'aide de la propriété Item.
  • Obtenir le nombre de colonnes de la collection à l'aide de la propriété Count.
  • Supprimer une colonne de la collection à l'aide de la méthode Delete.
  • Mettre à jour les objets de la collection pour refléter le schéma de la base de données active, grâce à la méthode Refresh.
Note Une erreur se produit si vous ajoutez un objet Column à la collection Columns d'un Index si l'objet Column n'existe pas dans une Table qui appartient déjà à la collection Tables.

Voir aussi

Exemple de méthodes Columns et Tables Append, et de propriété Name (VB) | Exemple de méthode Connection Close, et de propriété Table Type (VB) | Exemple de méthode Keys Append, et de propriétés Key Type, RelatedColumn, RelatedTable et UpdateRule (VB) | Exemple de propriété ParentCatalog (VB) | Exemple de propriété SortOrder (VB)

Propriétés, méthodes et événements | Column, objet


Propriétés, méthodes et événements de la collection Columns

Propriétés

Count, propriété

Item, propriété

Méthodes

Append, méthode (Columns)

Delete, méthode (Collections)

Refresh, méthode

Événements

Aucun.

S'applique à : Columns, collection


Groups, collection (ADOX)

Référence de l'API ADOX 2.5

Groups, collection

Contient tous les objets Group d'un catalogue ou d'un utilisateur.

Remarques

La collection Groups d'un objet Catalog représente tous les comptes de groupe de ce catalogue. La collection Groups d'un objet User représente seulement le groupe auquel appartient l'utilisateur.

La méthode Append d'une collection Groups est unique dans ADOX. Elle permet l'opération suivante :

  • Ajouter un nouveau groupe sécurité à la collection à l'aide de la méthode Append.

Les autres propriétés et méthodes sont standard aux collections ADO. Elles permettent les opérations suivantes :

  • Accéder à un groupe de la collection à l'aide de la propriété Item.
  • Renvoyer le nombre de groupes de la collection à l'aide de la propriété Count.
  • Supprimer un groupe de la collection à l'aide de la méthode Delete.
  • Mettre à jour les objets de la collection pour refléter le schéma de la base de données active, grâce à la méthode Refresh.
Remarque Avant d'ajouter un objet Group à la collection Groups d'un objet User, un objet Group portant le même nom que celui devant être ajouté doit déjà figurer dans la collection Groups du catalogue.

Voir aussi

Propriétés, méthodes et événements | Catalog, objet | Group, objet


Propriétés, méthodes et événements de la collection Groups

Propriétés

Count, propriété

Item, propriété

Méthodes

Append, méthode (Groups)

Delete, méthode (Collections)

Refresh, méthode

Événements

Aucun.

S'applique à : Groups, collection


Indexes, collection (ADOX)

Référence de l'API ADOX 2.5

Indexes, collection

Contient tous les objets Index d'une table.

Remarques

La méthode Append d'une collection Indexes est unique dans ADOX. Elle permet l'opération suivante :

  • Ajouter un nouvel index à la collection à l'aide la méthode Append.

Les autres propriétés et méthodes sont standard aux collections ADO. Elles permettent les opérations suivantes :

  • Accéder à un index de la collection à l'aide de la propriété Item.
  • Renvoyer le nombre d'index de la collection à l'aide de la propriété Count.
  • Supprimer un index de la collection à l'aide de la méthode Delete.
  • Mettre à jour les objets de la collection pour refléter le schéma de la base de données active, grâce à la méthode Refresh.

Voir aussi

Exemple de méthode Indexes Append (VB)

Propriétés, méthodes et événements | Index, objet


Propriétés, méthodes et événements de la collection Indexes

Propriétés

Count, propriété

Item, propriété

Méthodes

Append, méthode (Indexes)

Delete, méthode (Collections)

Refresh, méthode

Événements

Aucun.

S'applique à : Indexes, collection


Keys, Collection (ADOX)

Référence de l'API ADOX 2.5

Keys, collection

Contient tous les objets Key d'une table.

Remarques

La méthode Append d'une collection Keys est unique dans ADOX. Elle permet l'opération suivante :

  • Ajouter une nouvelle clé à la collection à l'aide de la méthode Append.

Les autres propriétés et méthodes sont standard aux collections ADO. Elles permettent les opérations suivantes :

  • Accéder à une clé de la collection à l'aide de la propriété Item.
  • Renvoyer le nombre de clés de la collection à l'aide de la propriété Count.
  • Supprimer une clé de la collection à l'aide de la méthode Delete.
  • Mettre à jour les objets de la collection pour refléter le schéma de la base de données active, grâce à la méthode Refresh.

Voir aussi

Exemple de méthode Keys Append, et de propriétés Key Type, RelatedColumn, RelatedTable et UpdateRule (VB)

Propriétés, méthodes et événements | Key, objet


Propriétés, méthodes et événements de la collection Keys

Propriétés

Count, propriété

Item, propriété

Méthodes

Append, méthode (Keys)

Delete, méthode (Collections)

Refresh, méthode

Événements

Aucun.

S'applique à : Keys, collection


Procedures, collection (ADOX)

Référence de l'API ADOX 2.5

Procedures, collection

Contient tous les objets Procedure d'un catalogue.

Remarques

La méthode Append d'une collection Procedures est unique dans ADOX. Elle permet l'opération suivante :

  • Ajouter une nouvelle procédure à la collection à l'aide de la méthode Append.

Les autres propriétés et méthodes sont standard aux collections ADO. Elles permettent les opérations suivantes :

  • Accéder à une procédure de la collection à l'aide de la propriété Item.
  • Renvoyer le nombre de procédures de la collection à l'aide de la propriété Count.
  • Supprimer une procédure de la collection à l'aide de la méthode Delete.
  • Mettre à jour les objets de la collection de manière à refléter le schéma de la base de données courante à l'aide de la méthode Refresh.

Voir aussi

Exemple de propriétés Command et CommandText (VB) | Exemple de collection Parameters et de propriété Command (VB) | Exemple de méthode Procedures Append (VB) | Exemple de méthode Procedures Delete (VB) | Exemple de méthode Procedures Refresh (VB)

Propriétés, méthodes et événements | Catalog, objet | Procedure, objet


Propriétés, méthodes et événements de la collection Procedures

Propriétés

Count, propriété

Item, propriété

Méthodes

Append, méthode (Procedures)

Delete, méthode (Collections)

Refresh, méthode

Événements

Aucun.

S'applique à : Procedures, collection


Tables, collection (ADOX)

Référence de l'API ADOX 2.5

Tables, collection

Contient tous les objets Table d'un catalogue.

Remarques

La méthode Append d'une collection Tables est unique dans ADOX. Elle permet l'opération suivante :

  • Ajouter une nouvelle table à la collection à l'aide de la méthode Append.

Les autres propriétés et méthodes sont standard aux collections ADO. Elles permettent les opérations suivantes :

  • Accéder à une table de la collection à l'aide de la propriété Item.
  • Renvoyer le nombre de tables de la collection à l'aide de la propriété Count.
  • Supprimer une table de la collection à l'aide de la méthode Delete.
  • Mettre à jour les objets de la collection de manière à refléter le schéma de la base de données active, grâce à la méthode Refresh.

Certains fournisseurs peuvent renvoyer d'autres objets de schémas, tels qu'une vue, dans la collection Tables. Par conséquent, certaines collections ADOX peuvent contenir des références au même objet. Si vous supprimez l'objet d'une collection, ce changement n'apparaîtra dans une autre collection faisant référence à l'objet supprimé que lorsque la méthode Refresh sera appelée pour la collection. Par exemple, avec le fournisseur OLE DB pour Microsoft Jet, les vues sont renvoyées avec la collection Tables. Si vous renoncez à une vue, vous devez actualiser la collection Tables pour que la collection reflète le changement.

Voir aussi

Exemple de propriété Catalog ActiveConnection (VB) | Exemple de méthodes Columns et Tables Append, et de propriété Name (VB) | Exemple de propriété Table Type et de méthode Connection Close (VB) | Exemple de méthode Keys Append, et de propriétés Key Type, RelatedColumn, RelatedTable et UpdateRule (VB)

Propriétés, méthodes et événements | Catalog, objet | Table, objet


Propriétés, méthodes et événements de la collection Tables

Propriétés

Count, propriété

Item, propriété

Méthodes

Append, méthode (Tables)

Delete, méthode (Collections)

Refresh, méthode

Événements

Aucun.

S'applique à : Tables, collection


Users, collection (ADOX)

Référence de l'API ADOX 2.5

Users, collection

Contient tous les objets User d'un catalogue ou d'un groupe.

Remarques

La collection Users d'un objet Catalog représente la totalité des utilisateurs du catalogue. La collection Users d'un objet Group représente seulement les utilisateurs qui sont membres de ce groupe.

La méthode Append d'une collection Users est unique dans ADOX. Elle permet l'opération suivante :

  • Ajouter un nouvel utilisateur à la collection à l'aide de la méthode Append.

Les autres propriétés et méthodes sont standard aux collections ADO. Elles permettent les opérations suivantes :

  • Accéder à un utilisateur de la collection à l'aide de la propriété Item.
  • Renvoyer le nombre d'utilisateurs contenus dans la collection à l'aide de la propriété Count.
  • Supprimer un utilisateur de la collection à l'aide de la méthode Delete.
  • Mettre à jour les objets de la collection de manière à refléter le schéma de la base de données active, grâce à la méthode Refresh.
Note Avant d'ajouter un objet User à la collection Users d'un objet Group, un objet User portant le même nom que celui devant être ajouté doit déjà figurer dans la collection Users du catalogue.

Voir aussi

Exemple de méthodes GetPermissions et SetPermissions (VB)

Propriétés, méthodes et événements | Catalog, objet | User, objet


Propriétés, méthodes et événements de la collection Users

Propriétés

Count, propriété

Item, propriété

Méthodes

Append, méthode (Users)

Delete, méthode (Collections)

Refresh, méthode

Événements

Aucun.

S'applique à : Users, collection


Views, collection (ADOX)

Référence de l'API ADOX 2.5

Views, collection

Contient tous les objets View d'un catalogue.

Remarques

La méthode Append d'une collection Views est unique dans ADOX. Elle permet l'opération suivante :

  • Ajouter une nouvelle vue à la collection à l'aide de la méthode Append.

Les autres propriétés et méthodes sont standard aux collections ADO. Elles permettent les opérations suivantes :

  • Accéder à une vue de la collection à l'aide de la propriété Item.
  • Renvoyer le nombre de vues de la collection à l'aide de la propriété Count.
  • Supprimer une vue de la collection à l'aide de la méthode Delete.
  • Mettre à jour les objets de la collection de manière à refléter le schéma de la base de données active, grâce à la méthode Refresh.

Voir aussi

Exemple de collections Views et Fields (VB) | Exemple de méthode Views Append (VB) | Exemple de collection Views et de propriété CommandText (VB) | Exemple de méthode Views Delete (VB) | Exemple de méthode Views Refresh (VB)

Propriétés, méthodes et événements | Catalog, objet | View, objet


Propriétés, méthodes et événements de la collection Views

Propriétés

Count, propriété

Item, propriété

Méthodes

Append, méthode (Views)

Delete, méthode (Collections)

Refresh, méthode

Événements

Aucun.

S'applique à : Views, collection


Propriétés ADOX

ActiveConnection | Désigne l'objet Connection ADO auquel appartient le catalogue.
Attributes | Décrit les caractéristiques de la colonne.
Clustered | Précise si l'index est regroupé en clusters.
Command | Désigne un objet Command ADO pouvant être utilisé pour créer ou exécuter la procédure.
Count | Indique le nombre d'objets dans une collection.
DateCreated | Indique la date de création de l'objet.
DateModified | Indique la date de la dernière modification apportée à l'objet.
DefinedSize | Indique la taille maximale imposée pour la colonne.
DeleteRule | Précise l'action accomplie lorsqu'une clé primaire est supprimée.
IndexNulls | Précise si les enregistrements ayant des valeurs nulles dans leurs champs d'index possèdent des entrées d'index.
Item | Indique un membre particulier d'une collection, par son nom ou par son numéro d'ordre.
Nom | Indique le nom de l'objet.
NumericScale | Indique l'échelle pour une valeur numérique de la colonne.
ParentCatalog | Spécifie le catalogue parent d'une table ou d'une colonne devant assurer l'accès aux propriétés spécifiques au fournisseur.
Precision | Indique la précision maximale des valeurs dans la colonne.
PrimaryKey | Précise si l'index représente la clé primaire de la table.
RelatedColumn | Indique le nom de la colonne correspondante dans la table correspondante (colonnes clés uniquement).
RelatedTable | Indique le nom de la table correspondante.
SortOrder | Précise l'ordre de tri pour la colonne (colonnes index uniquement).
Type (Column) | Indique le type de données d'une colonne.
Type (Key) | Indique le type de données de la clé.
Type (Table) | Indique le type d'une table.
Unique | Précise si les clés d'index doivent être uniques.
UpdateRule | Précise l'action accomplie lorsqu'une clé primaire est mise à jour.

Voir aussi

Référence de l'API ADOX | Guide de référence du programmeur Microsoft ADOX


ActiveConnection, propriété (ADOX)

Référence de l'API ADOX 2.5

ActiveConnection, propriété

Désigne l'objet Connection ADO auquel appartient le Catalog.

Paramètres et valeurs renvoyées

Définit un objet Connection ou une String contenant la définition d'une connexion. Renvoie l'objet Connection actif.

Remarques

La valeur par défaut est la référence d'objet Null.

Voir aussi

Exemple de propriété Catalog ActiveConnection (VB) | Exemple de propriétés Command et CommandText (VB) | Exemple de propriété Table Type et de méthode Connection Close (VB) | Exemple de collection Parameters et de propriété Command (VB) | Exemple de méthode Procedures Append (VB) | Exemple de méthode Procedures Delete (VB) | Exemple de méthode Procedures Refresh (VB) | Exemple de collections Views et Fields (VB) | Exemple de méthode Views Append (VB) | Exemple de collection Views et de propriété CommandText (VB) | Exemple de méthode Views Refresh (VB)

Create, méthode

S'applique à : Catalog, objet


Attributes, propriété (ADOX)

Référence de l'API ADOX 2.5

Attributes, propriété

Décrit les caractéristiques de la colonne.

Paramètres et valeurs renvoyées

Définit ou renvoie une valeur de type Long. La valeur précise les caractéristiques de la table représentée par l'objet Column et peut être une combinaison des constantes ColumnAttributesEnum. La valeur par défaut est zéro (0), qui signifie ni adColFixed ni adColNullable.

Voir aussi

Exemple de propriété Attributes (VB)

S'applique à : Column, objet | Property, objet


Clustered, propriété (ADOX)

Référence de l'API ADOX 2.5

Clustered, propriété

Précise si l'index est regroupé en clusters.

Paramètres et valeurs renvoyées

Définit et retourne une valeur de type Boolean.

Remarques

La valeur par défaut est False.

Cette propriété est en lecture seule pour les objets Index déjà ajoutés dans une collection.

Voir aussi

Exemple de propriété Clustered (VB)

S'applique à : Index, objet


Command, propriété (ADOX)

Référence de l'API ADOX 2.5

Command, propriété

Désigne un objet Command ADO pouvant être utilisé pour créer ou exécuter la procédure.

Paramètres et valeurs renvoyées

Définit ou renvoie un objet Command ADO correct.

Remarques

Une erreur se produit lors de la lecture ou du paramétrage de cette propriété si le fournisseur ne gère pas les commandes persistantes.

Voir aussi

Exemple de propriétés Command et CommandText (VB) | Exemple de collection Parameters et de propriété Command (VB) | Exemple de collections Views et Fields (VB) | Exemple de collection Views et de propriété CommandText (VB)

S'applique à : Procedure, objet | View, objet


DateCreated, propriété (ADOX)

Référence de l'API ADOX 2.5

DateCreated, propriété

Indique la date de création de l'objet.

Valeurs renvoyées

Renvoie une valeur de type Variant indiquant la date de création. La valeur est Null si DateCreated n'est pas gérée par le fournisseur.

Remarques

La propriété DateCreated est nulle pour les objets nouvellement ajoutés. Après l'ajout d'un nouvel objet View ou Procedure, vous devez appeler la méthode Refresh de la collection Views ou Procedures pour obtenir les valeurs de la propriété DateCreated.

Voir aussi

Exemple de propriétés DateCreated et DateModified (VB)

DateModified, propriété

S'applique à : Procedure, objet | Table, objet | View, objet


DateModified, propriété (ADOX)

Référence de l'API ADOX 2.5

DateModified, propriété

Indique la date de la dernière modification apportée à l'objet.

Valeurs renvoyées

Renvoie une valeur de type Variant indiquant la date de modification. La valeur est Null si DateModified n'est pas gérée par le fournisseur.

Remarques

La propriété DateModified est nulle pour les objets nouvellement ajoutés. Après l'ajout d'un nouvel objet View ou Procedure, vous devez appeler la méthode Refresh de la collection Views ou Procedures pour obtenir les valeurs de la propriété DateModified.

Voir aussi

Exemple de propriétés DateCreated et DateModified (VB)

DateCreated, propriété

S'applique à : Procedure, objet | Table, objet | View, objet


DefinedSize, propriété (ADOX)

Référence de l'API ADOX 2.5

DefinedSize, propriété

Indique la taille maximale imposée pour la colonne.

Paramètres et valeurs renvoyées

Définit et renvoie une valeur de type Long indiquant la longueur maximale des données, en nombre de caractères.

Remarques

La valeur par défaut est zéro (0).

Cette propriété est en lecture seule pour les objets Column déjà ajoutés dans une collection.

Voir aussi

Exemple de propriété DefinedSize (VB)

S'applique à : Column, objet


DeleteRule, propriété (ADOX)

Référence de l'API ADOX 2.5

DeleteRule, propriété

Précise l'action accomplie lorsqu'une clé primaire est supprimée.

Paramètres et valeurs renvoyées

Définit et renvoie une valeur de type Long pouvant être l'une des constantes RuleEnum. La valeur par défaut est adRINone.

Remarques

Cette propriété est en lecture seule pour les objets Key déjà ajoutés dans une collection.

Voir aussi

Exemple de propriété DeleteRule (VB)

S'applique à : Key, objet


IndexNulls, propriété (ADOX)

Référence de l'API ADOX 2.5

IndexNulls, propriété

Précise si les enregistrements ayant des valeurs nulles dans leurs champs d'index possèdent des entrées d'index.

Paramètres et valeurs renvoyées

Définit et renvoie une valeur AllowNullsEnum. La valeur par défaut est adIndexNullsDisallow.

Remarques

Cette propriété est en lecture seule pour les objets Index déjà ajoutés dans une collection.

Voir aussi

Exemple de propriété IndexNulls (VB)

S'applique à : Index, objet


Name, propriété (ADOX)

Référence de l'API ADOX 2.5

Name, propriété

Indique le nom de l'objet.

Paramètres et valeurs renvoyées

Définit ou renvoie une valeur de type String.

Remarques

Les noms ne sont pas nécessairement uniques dans une même collection.

La propriété Name est en lecture/écriture pour les objets Column, Group, Key, Index, Table et User. La propriété Name est en lecture seule pour les objets Catalog, Procedure et View.

Pour les objets en lecture/écriture (Column, Group, Key, Index, Table et User), la valeur par défaut est une chaîne vide ("").

Notes Pour les clés, cette propriété est en lecture seule pour les objets Key déjà ajoutés dans une collection.
Pour les tables, cette propriété est en lecture seule pour les objets Table déjà ajoutés dans une collection.

Voir aussi

Exemple de méthodes Columns et Tables Append, et de propriété Name (VB) | Exemple de méthode Keys Append, et de propriétés Key Type, RelatedColumn, RelatedTable et UpdateRule (VB) | Exemple de propriété ParentCatalog (VB)

S'applique à : Column, objet | Group, objet | Index, objet | Key, objet | Procedure, objet | Property, objet | Table, objet | User, objet | View, objet


NumericScale, propriété (ADOX)

Référence de l'API ADOX 2.5

NumericScale, propriété

Indique l'échelle pour une valeur numérique de la colonne.

Paramètres et valeurs renvoyées

Définit et renvoie une valeur de type Byte qui est l'échelle des valeurs de la colonne quand la propriété Type est adNumeric ou adDecimal. La propriété NumericScale est ignorée pour tous les autres types de données.

Remarques

La valeur par défaut est zéro (0).

NumericScale est en lecture seule pour les objets Column déjà ajoutés dans une collection.

Voir aussi

Exemple de propriétés NumericScale et Precision (VB)

Type, propriété (Column)

S'applique à : Column, objet


ParentCatalog, propriété (ADOX)

Référence de l'API ADOX 2.5

ParentCatalog, propriété

Spécifie le catalogue parent d'une table ou d'une colonne pour permettre l'accès aux propriétés spécifiques du fournisseur.

Paramètres et valeurs renvoyées

Définit et renvoie un objet Catalog. L'attribution de ParentCatalog à un Catalog ouvert permet d'accéder aux propriétés spécifiques au fournisseur avant d'intégrer une table ou une colonne dans une collection Catalog.

Remarques

Certains fournisseurs de données ne permettent l'écriture de propriétés spécifiques au fournisseur qu'au moment de la création (quand une table ou une colonne est ajoutée dans sa collection Catalog). Pour accéder à ces propriétés avant d'intégrer ces objets dans un Catalog, spécifiez d'abord le Catalog dans la propriété ParentCatalog.

Une erreur se produit lorsque la table ou la colonne est ajoutée dans un Catalog différent du ParentCatalog.

Voir aussi

Exemple de propriété ParentCatalog (VB)

S'applique à : Column, objet | Table, objet


Precision, propriété (ADOX)

Référence de l'API ADOX 2.5

Precision, propriété

Indique la précision maximale des valeurs dans la colonne.

Paramètres et valeurs renvoyées

Définit et renvoie une valeur de type Long qui représente la précision maximale des données de la colonne quand la propriété Type désigne un type numérique. Pour tous les autres types de données, Precision est ignorée.

Remarques

La valeur par défaut est zéro (0).

Cette propriété est en lecture seule pour les objets Column déjà ajoutés dans une collection.

Voir aussi

Exemple de propriétés NumericScale et Precision (VB)

Type, propriété (Column)

S'applique à : Column, objet


PrimaryKey, propriété (ADOX)

Référence de l'API ADOX 2.5

PrimaryKey, propriété

Précise si l'index représente la clé primaire de la table.

Paramètres et valeurs renvoyées

Définit et retourne une valeur de type Boolean.

Remarques

La valeur par défaut est False.

Cette propriété est en lecture seule pour les objets Index déjà ajoutés dans une collection.

Voir aussi

Exemple de propriétés PrimaryKey et Unique (VB)

S'applique à : Index, objet


RelatedColumn, propriété (ADOX)

Référence de l'API ADOX 2.5

RelatedColumn, propriété

Indique le nom de la colonne correspondante dans la table correspondante (colonnes clés uniquement).

Paramètres et valeurs renvoyées

Définit et renvoie une valeur de type String qui est le nom de la colonne correspondante dans la table correspondante.

Remarques

La valeur par défaut est la chaîne vide ("").

Cette propriété est en lecture seule pour les objets Column déjà ajoutés dans une collection.

Voir aussi

Exemple de méthode Keys Append, et de propriétés Key Type, RelatedColumn, RelatedTable et UpdateRule (VB)

Key, objet

S'applique à : Column, objet


RelatedTable, propriété (ADOX)

Référence de l'API ADOX 2.5

RelatedTable, propriété

Indique le nom de la table correspondante.

Paramètres et valeurs renvoyées

Définit et renvoie une valeur de type String.

Remarques

La valeur par défaut est la chaîne vide ("").

Si la clé est une clé étrangère, alors RelatedTable est le nom de la table qui contient la clé.

Voir aussi

Exemple de méthode Keys Append, et de propriétés Key Type, RelatedColumn, RelatedTable et UpdateRule (VB)

S'applique à : Key, objet


SortOrder, propriété (ADOX)

Référence de l'API ADOX 2.5

SortOrder, propriété

Précise l'ordre de tri pour la colonne (colonnes index uniquement).

Paramètres et valeurs renvoyées

Définit et renvoie une valeur de type Long pouvant être l'une des constantes SortOrderEnum. La valeur par défaut est adSortAscending.

Remarques

Cette propriété s'applique uniquement aux objets Column dans la collection Columns d'un Index.

Voir aussi

Exemple de propriété SortOrder (VB)

Columns, collection | Index, objet

S'applique à : Column, objet


Type, propriété (Column) (ADOX)

Référence de l'API ADOX 2.5

Type, propriété (Column)

Indique le type de données d'une colonne.

Paramètres et valeurs renvoyées

Définit ou renvoie une valeur de type Long pouvant être l'une des constantes DataTypeEnum. La valeur par défaut est adVarWChar.

Remarques

Cette propriété est en lecture/écriture jusqu'à ce que l'objet Column soit ajouté dans une collection ou dans un autre objet, après quoi elle passe en lecture seule.

Voir aussi

Exemple de propriété ParentCatalog (VB)

Type, propriété (Key) | Type, propriété (Table)

S'applique à : Column, objet


Type, propriété (Key) (ADOX)

Référence de l'API ADOX 2.5

Type, propriété (Key)

Indique le type de la clé.

Paramètres et valeurs renvoyées

Définit ou renvoie une valeur de type Long pouvant être l'une des constantes KeyTypeEnum. La valeur par défaut est adKeyPrimary.

Remarques

Cette propriété est en lecture seule pour les objets Key déjà ajoutés dans une collection.

Voir aussi

Exemple de méthode Keys Append, et de propriétés Key Type, RelatedColumn, RelatedTable et UpdateRule (VB)

Type, propriété (Column) | Type, propriété (Table)

S'applique à : Key, objet


Type, propriété (Table) (ADOX)

Référence de l'API ADOX 2.5

Type, propriété (Table)

Indique le type d'une table.

Valeurs renvoyées

Renvoie une valeur de type String qui précise le type de la table ; par exemple, « TABLE », « SYSTEM TABLE » ou « GLOBAL TEMPORARY ».

Remarques

Cette propriété est en lecture seule.

Voir aussi

Exemple de propriété Catalog ActiveConnection (VB) | Exemple de méthode Connection Close, et de propriété Table Type (VB)

Type, propriété (Column) | Type, propriété (Key)

S'applique à : Table, objet


Unique, propriété (ADOX)

Référence de l'API ADOX 2.5

Unique, propriété

Précise si les clés d'index doivent être uniques.

Paramètres et valeurs renvoyées

Définit et retourne une valeur de type Boolean.

Remarques

La valeur par défaut est False.

Cette propriété est en lecture seule pour les objets Index déjà ajoutés dans une collection.

Voir aussi

Exemple de propriétés PrimaryKey et Unique (VB)

Key, objet

S'applique à : Index, objet


UpdateRule, propriété (ADOX)

Référence de l'API ADOX 2.5

UpdateRule, propriété

Précise l'action accomplie lorsqu'une clé primaire est mise à jour.

Paramètres et valeurs renvoyées

Définit et renvoie une valeur de type Long pouvant être l'une des constantes RuleEnum. La valeur par défaut est adRINone.

Remarques

Cette propriété est en lecture seule pour les objets Key déjà ajoutés dans la collection.

Voir aussi

Exemple de méthode Keys Append, et de propriétés Key Type, RelatedColumn, RelatedTable et UpdateRule (VB)

S'applique à : Key, objet


Méthodes ADOX

Append (Columns) | Ajoute un nouvel objet Column à la collection Columns.
Append (Groups) | Ajoute un nouvel objet Group à la collection Groups.
Append (Indexes) | Ajoute un nouvel objet Index à la collection Indexes.
Append (Keys) | Ajoute un nouvel objet Key à la collection Keys.
Append (Procedures) | Ajoute un nouvel objet Procedure à la collection Procedures.
Append (Tables) | Ajoute un nouvel objet Table à la collection Tables.
Append (Users) | Ajoute un nouvel objet User à la collection Users.
Append (Views) | Ajoute un nouvel objet View à la collection Views.
ChangePassword | Change le mot de passe d'un compte d'utilisateur.
Create | Crée un catalogue.
Delete | Supprime un objet d'une collection.
GetObjectOwner | Renvoie le propriétaire d'un objet dans un catalogue.
GetPermissions | Renvoie les autorisations concernant un objet, pour un groupe ou un utilisateur.
SetObjectOwner | Spécifie le propriétaire d'un objet dans un catalogue.
SetPermissions | Spécifie les autorisations concernant un objet, pour un groupe ou un utilisateur.

Voir aussi

Référence de l'API ADOX | Guide de référence du programmeur Microsoft ADOX


Append, méthode (ADOX Columns)

Référence de l'API ADOX 2.5

Append, méthode (Columns)

Ajoute un nouvel objet Column à la collection Columns.

Syntaxe

Columns.Append Column [, Type] [, DefinedSize]

Paramètres

Column
L'objet Column à ajouter ou le nom de la colonne à créer et à ajouter.
Type
Facultatif. Valeur de type Long indiquant le type de données de la colonne. Le paramètre Type correspond à la propriété Type d'un objet Column.
DefinedSize
Facultatif. Valeur de type Long indiquant la taille de la colonne. Le paramètre DefinedSize correspond à la propriété DefinedSize d'un objet Column.
Note Une erreur se produit si vous ajoutez un objet Column à la collection Columns d'un Index si l'objet Column n'existe pas dans une Table qui appartient déjà à la collection Tables.

Voir aussi

Exemple de méthodes Columns et Tables Append, et de propriété Name (VB) | Exemple de méthode Keys Append, et de propriétés Key Type, RelatedColumn, RelatedTable et UpdateRule (VB) | Exemple de propriété ParentCatalog (VB)

Append, méthode (Groups) | Append, méthode (Indexes) | Append, méthode (Keys) | Append, méthode (Procedures) | Append, méthode (Tables) | Append, méthode (Users) | Append, méthode (Views)

S'applique à : Columns, collection


Append, méthode (ADOX Groups)

Référence de l'API ADOX 2.5

Append, méthode (Groups)

Ajoute un nouvel objet Group à la collection Groups.

Syntaxe

Groups.Append Group

Paramètres

Group
L'objet Group à ajouter ou le nom du groupe à créer et à ajouter.

Remarques

La collection Groups d'un objet Catalog représente tous les comptes de groupe de ce catalogue. La collection Groups d'un objet User représente seulement le groupe auquel appartient l'utilisateur.

Une erreur se produit si le fournisseur ne gère pas la création de groupes.

Note Avant d'ajouter un objet Group à la collection Groups d'un objet User, un objet Group portant le même nom que celui devant être ajouté doit déjà figurer dans la collection Groups du catalogue.

Voir aussi

Exemple de méthodes Groups et Users Append, ChangePassword (VB)

Append, méthode (Columns) | Append, méthode (Indexes) | Append, méthode (Keys) | Append, méthode (Procedures) | Append, méthode (Tables) | Append, méthode (Users) | Append, méthode (Views)

S'applique à : Groups, collection


Append, méthode (ADOX Indexes)

Référence de l'API ADOX 2.5

Append, méthode (Indexes)

Ajoute un nouvel objet Index à la collection Indexes.

Syntaxe

Indexes.Append Index [, Columns]

Paramètres

Index
L'objet Index à ajouter ou le nom de l'index à créer et à ajouter.
Columns
Facultatif. Valeur de type Variant spécifiant le nom de la ou des colonnes devant être indexées. Le paramètre Columns correspond à la ou aux valeurs de la propriété Name d'un ou de plusieurs objets Column.

Remarques

Le paramètre Columns peut prendre comme valeur soit le nom d'une colonne, soit un tableau de noms de colonnes.

Une erreur se produit si le fournisseur ne gère pas la création d'index.

Voir aussi

Exemple de méthode Indexes Append (VB)

Append, méthode (Columns) | Append, méthode (Groups) | Append, méthode (Keys) | Append, méthode (Procedures) | Append, méthode (Tables) | Append, méthode (Users) | Append, méthode (Views)

S'applique à : Indexes, collection


Append, méthode (ADOX Keys)

Référence de l'API ADOX 2.5

Append, méthode (Keys)

Ajoute un nouvel objet Key à la collection Keys.

Syntaxe

Keys.Append Key [, KeyType] [, Column] [, RelatedTable] [, RelatedColumn]

Paramètres

Key
L'objet Key à ajouter ou le nom de la clé à créer et à ajouter.
KeyType
Facultatif. Valeur de type Long indiquant le type de la clé. Le paramètre Key correspond à la propriété Type d'un objet Key.
Column
Facultatif. Valeur de type String spécifiant le nom de la colonne devant être indexée. Le paramètre Columns correspond à la valeur de la propriété Name d'un objet Column.
RelatedTable
Facultatif. Valeur de type String spécifiant le nom de la table associée. Le paramètre RelatedTable correspond à la valeur de la propriété Name d'un objet Table.
RelatedColumn
Facultatif. Valeur de type String spécifiant le nom de la colonne correspondante pour une clé étrangère. Le paramètre RelatedColumn correspond à la valeur de la propriété Name d'un objet Column.

Remarques

Le paramètre Columns peut prendre comme valeur soit le nom d'une colonne, soit un tableau de noms de colonnes.

Voir aussi

Exemple de méthode Keys Append, et de propriétés Key Type, RelatedColumn, RelatedTable et UpdateRule (VB)

Append, méthode (Columns) | Append, méthode (Groups) | Append, méthode (Indexes) | Append, méthode (Procedures) | Append, méthode (Tables) | Append, méthode (Users) | Append, méthode (Views)

S'applique à : Keys, collection


Append, méthode (ADOX Procedures)

Référence de l'API ADOX 2.5

Append, méthode (Procedures)

Ajoute un nouvel objet Procedure à la collection Procedures.

Syntaxe

Procedures.Append Name, Command

Paramètres

Nom
Valeur de type String spécifiant le nom de la procédure à créer et à ajouter.
Command
Objet Command ADO qui représente la procédure à créer et à ajouter.

Remarques

Cette méthode crée une procédure dans la source de données qui possède le nom et les attributs spécifiés dans l'objet Command.

Si le texte de la commande que l'utilisateur spécifie représente une vue, et non une procédure, le comportement dépend alors du fournisseur utilisé. Append échoue si le fournisseur ne gère pas les commandes persistantes.

Note Si vous utilisez le fournisseur OLE DB pour Microsoft Jet, la méthode Append de la collection Procedures vous permettra de spécifier un objet View plutôt qu'un objet Procedure dans le paramètre Command. L'objet View sera ajouté dans la source de données et dans la collection Procedures. Après la méthode Append, si les collections Procedures et Views sont actualisées, l'objet View n'appartiendra plus à la collection Procedures et figurera dans la collection Views.

Voir aussi

Exemple de méthode Procedures Append (VB)

Append, méthode (Columns) | Append, méthode (Groups) | Append, méthode (Indexes) | Append, méthode (Keys) | Append, méthode (Tables) | Append, méthode (Users) | Append, méthode (Views)

S'applique à : Procedures, collection


Append, méthode (ADOX Tables)

Référence de l'API ADOX 2.5

Append, méthode (Tables)

Ajoute un nouvel objet Table à la collection Tables.

Syntaxe

Tables.Append Table

Paramètres

Table
Valeur de type Variant contenant une référence à l'objet Table à ajouter ou le nom de la table à créer et à ajouter.

Remarques

Une erreur se produit si le fournisseur ne gère pas la création de tables.

Voir aussi

Exemple de méthodes Columns et Tables Append, et de propriété Name (VB) | Exemple de propriété ParentCatalog (VB)

Append, méthode (Columns) | Append, méthode (Groups) | Append, méthode (Indexes) | Append, méthode (Keys) | Append, méthode (Procedures) | Append, méthode (Users) | Append, méthode (Views)

S'applique à : Tables, collection


Append, méthode (ADOX Users)

Référence de l'API ADOX 2.5

Append, méthode (Users)

Ajoute un nouvel objet User à la collection Users.

Syntaxe

Users.Append User[, Password]

Paramètres

User
Valeur de type Variant contenant l'objet User à ajouter ou le nom de l'utilisateur à créer et à ajouter.
Password
Facultatif. Valeur de type String contenant le mot de passe de l'utilisateur. Le paramètre Password correspond à la valeur spécifiée par la méthode ChangePassword d'un objet User.

Remarques

La collection Users d'un objet Catalog représente la totalité des utilisateurs du catalogue. La collection Users d'un objet Group représente seulement les utilisateurs qui sont membres de ce groupe.

Une erreur se produit si le fournisseur ne gère pas la création d'utilisateurs.

Note Avant d'ajouter un objet User à la collection Users d'un objet Group, un objet User portant le même nom que celui devant être ajouté doit déjà figurer dans la collection Users du catalogue.

Voir aussi

Exemple de méthodes Groups et Users Append, ChangePassword (VB)

Append, méthode (Columns) | Append, méthode (Groups) | Append, méthode (Indexes) | Append, méthode (Keys) | Append, méthode (Procedures) | Append, méthode (Tables) | Append, méthode (Views)

S'applique à : Users, collection


Append, méthode (ADOX Views)

Référence de l'API ADOX 2.5

Append, méthode (Views)

Crée un nouvel objet View et l'ajoute à la collection Views.

Syntaxe

Views.Append Name, Command

Paramètres

Nom
Valeur de type String spécifiant le nom de la vue à créer.
Command
Objet Command ADO qui représente la vue à créer.

Remarques

Cette méthode crée une vue dans la source de données qui possède le nom et les attributs spécifiés dans l'objet Command.

Si le texte de la commande que l'utilisateur spécifie représente une procédure, et non une vue, le comportement dépend alors du fournisseur utilisé. Append échoue si le fournisseur ne gère pas les commandes persistantes.

Note Si vous utilisez le fournisseur OLE DB pour Microsoft Jet, la méthode Append de la collection Views vous permettra de spécifier un objet Procedure plutôt qu'un objet View dans le paramètre Command. L'objet Procedure sera ajouté dans la source de données et dans la collection Views. Après la méthode Append, si les collections Procedures et Views sont actualisées, l'objet Procedure n'appartiendra plus à la collection Views et figurera dans la collection Procedures.

Voir aussi

Exemple de méthode Views Append (VB)

Append, méthode (Columns) | Append, méthode (Groups) | Append, méthode (Indexes) | Append, méthode (Keys) | Append, méthode (Procedures) | Append, méthode (Tables) | Append, méthode (Users)

S'applique à : Views, collection


ChangePassword, méthode (ADOX)

Référence de l'API ADOX 2.5

ChangePassword, méthode

Change le mot de passe d'un compte d'utilisateur.

Syntaxe

User.ChangePassword OldPassword, NewPassword

Paramètres

OldPassword
Valeur de type String spécifiant le mot de passe de l'utilisateur. Si l'utilisateur n'a pas de mot de passe, utilisez une chaîne vide ("") pour OldPassword.
NewPassword
Valeur de type String spécifiant le nouveau mot de passe.

Remarques

Pour des raisons de sécurité, l'ancien mot de passe doit être indiqué en plus du nouveau mot de passe.

Une erreur se produit si le fournisseur ne prend pas en charge la gestion des procédures de vérification d'identité et d'accréditation.

Voir aussi

Exemple de méthodes Groups et Users Append, ChangePassword (VB)

S'applique à : User, objet


Create, méthode (ADOX)

Référence de l'API ADOX 2.5

Create, méthode

Crée un catalogue.

Syntaxe

Catalog.Create ConnectString

Paramètres

ConnectString
Valeur de type String utilisée pour se connecter à la source de données.

Remarques

La méthode Create crée et ouvre un nouvel objet Connection ADO à la source de données spécifiée dans ConnectString. Si l'opération réussit, le nouvel objet Connection est affecté à la propriété ActiveConnection.

Une erreur se produit si le fournisseur ne gère pas la création de nouveaux catalogues.

Voir aussi

Exemple de méthode Create (VB)

ActiveConnection, propriété

S'applique à : Catalog, objet


Delete, méthode (ADOX Collections)

Référence de l'API ADOX 2.5

Delete, méthode (Collections)

Supprime un objet d'une collection.

Syntaxe

Collection.Delete Name

Paramètres

Nom
Valeur de type Variant spécifiant le nom ou la position ordinale (index) de l'objet à supprimer.

Remarques

Une erreur se produit si la propriété Name n'existe pas dans la collection.

Dans le cas des collections Tables et Users, une erreur se produit si le fournisseur ne gère pas, respectivement, la suppression des tables ou des utilisateurs. Dans le cas des collections Procedures et Views, la méthode Delete échoue si le fournisseur ne gère pas les commandes persistantes.

Voir aussi

Exemple de méthode Procedures Delete (VB) | Exemple de méthode Views Delete (VB)

S'applique à : Columns, collection | Groups, collection | Indexes, collection | Keys, collection | Procedures, collection | Tables, collection | Users, collection | Views, collection


GetObjectOwner, méthode (ADOX)

Référence de l'API ADOX 2.5

GetObjectOwner, méthode

Renvoie le propriétaire d'un objet dans un objet Catalog.

Syntaxe

Owner = Catalog.GetObjectOwner(ObjectName, ObjectType [, ObjectTypeId])

Valeur renvoyée

Renvoie une valeur de type String qui spécifie la propriété Name de l'objet User ou Group qui possède cet objet.

Paramètres

ObjectName
Valeur de type String spécifiant le nom de l'objet dont le propriétaire doit être renvoyé.
ObjectType
Valeur de type Long pouvant correspondre à l'une des constantes ObjectTypeEnum, qui spécifie le type de l'objet dont le propriétaire doit être renvoyé.
ObjectTypeId
Facultatif. Valeur de type Variant spécifiant l'identificateur universel unique (GUID) pour un type objet fournisseur non défini dans les spécifications OLE DB. Ce paramètre est obligatoire si ObjectType est défini comme adPermObjProviderSpecific ; sinon, il n'est pas utilisé.

Remarques

Une erreur se produit si le fournisseur ne gère pas le renvoi de propriétaires d'objet.

Voir aussi

Exemple de méthodes GetObjectOwner et SetObjectOwner (VB)

SetObjectOwner, méthode

S'applique à : Catalog, objet


GetPermissions, méthode (ADOX)

Référence de l'API ADOX 2.5

GetPermissions, méthode

Renvoie les autorisations concernant un objet ou un conteneur objet, pour un groupe ou un utilisateur.

Syntaxe

ReturnValue = GroupOrUser.GetPermissions(Name, ObjectType
   [, ObjectTypeId])

Valeur renvoyée

Renvoie une valeur de type Long qui spécifie un masque binaire contenant les autorisations que le groupe ou l'utilisateur possède sur l'objet. Cette valeur peut correspondre à une ou plusieurs constantes RightsEnum.

Paramètres

Nom
Valeur de type Variant spécifiant le nom de l'objet pour lequel des autorisations doivent être définies. Attribuez une valeur nulle à Name si vous voulez obtenir les autorisations pour le conteneur objet.
ObjectType
Valeur de type Long pouvant correspondre à l'une des constantes ObjectTypeEnum, qui spécifie le type de l'objet dont vous devez obtenir les autorisations.
ObjectTypeId
Facultatif. Valeur de type Variant spécifiant l'identificateur universel unique (GUID) pour un type objet fournisseur non défini dans les spécifications OLE DB. Ce paramètre est obligatoire si ObjectType est défini comme adPermObjProviderSpecific ; sinon, il n'est pas utilisé.

Voir aussi

Exemple de méthodes GetPermissions et SetPermissions (VB)

Name, propriété | SetPermissions, méthode

S'applique à : Group, objet | User, objet


SetObjectOwner, méthode [ADOX]

Référence de l'API ADOX 2.5

SetObjectOwner, méthode

Spécifie le propriétaire d'un objet dans un Catalog.

Syntaxe

Catalog.SetObjectOwner ObjectName, ObjectType , OwnerName [, ObjectTypeId]

Paramètres

ObjectName
Valeur de type String qui spécifie le nom de l'objet pour lequel spécifier le propriétaire.
ObjectType
Valeur de type Long pouvant correspondre à l'une des constantes ObjectTypeEnum, qui spécifie le type de propriétaire.
OwnerName
Valeur de type String qui spécifie la propriété Name de l'objet User ou Group qui possède l'objet.
ObjectTypeId
Facultatif. Valeur de type Variant spécifiant l'identificateur universel unique (GUID) pour un type objet fournisseur non défini dans les spécifications OLE DB. Ce paramètre est obligatoire si ObjectType est défini comme adPermObjProviderSpecific ; sinon, il n'est pas utilisé.

Remarques

Une erreur se produit si le fournisseur ne gère pas la désignation de propriétaires d'objet.

Voir aussi

Exemple de méthodes GetObjectOwner et SetObjectOwner (VB)

GetObjectOwner, méthode

S'applique à : Catalog, objet


SetPermissions, méthode (ADOX)

Référence de l'API ADOX 2.5

SetPermissions, méthode

Spécifie les autorisations concernant un objet, pour un groupe ou un utilisateur.

Syntaxe

GroupOrUser.SetPermissions Name, ObjectType, Action, Rights [, Inherit]
   [, ObjectTypeId]

Paramètres

Nom
Valeur de type String spécifiant le nom de l'objet pour lequel des autorisations doivent être définies.
ObjectType
Valeur de type Long pouvant correspondre à l'une des constantes ObjectTypeEnum, qui spécifie le type de l'objet dont vous devez obtenir les autorisations.
Action
Valeur de type Long pouvant correspondre à l'une des constantes ActionEnum, qui spécifie le type d'action à effectuer lors de la définition des autorisations.
Rights
Valeur de type Long pouvant être un masque binaire d'une ou de plusieurs constantes RightsEnum, qui indique les droits à définir.
Inherit
Facultatif. Valeur de type Long pouvant correspondre à l'une des constantes InheritTypeEnum, qui spécifie comment des objets hériteront de ces autorisations. La valeur par défaut est adInheritNone.
ObjectTypeId
Facultatif. Valeur de type Variant qui spécifie l'identificateur universel unique (GUID) pour un type objet fournisseur non défini dans les spécifications OLE DB. Ce paramètre est obligatoire si ObjectType est défini comme adPermObjProviderSpecific ; sinon, il n'est pas utilisé.

Remarques

Une erreur se produit si le fournisseur ne gère pas la définition des droits d'accès pour les groupes ou les utilisateurs.

Note Lorsque vous appelez SetPermissions, la définition de Actions sur adAccessRevoke remplace toutes les valeurs du paramètre Rights. N'attribuez pas Actions à adAccessRevoke si vous voulez que les droits spécifiés dans le paramètre Rights prennent effet.

Voir aussi

Exemple de méthodes GetPermissions et SetPermissions (VB)

GetPermissions, méthode | Name, propriété

S'applique à : Group, objet | User, objet


Constantes énumérées ADOX

Pour faciliter le débogage, les constantes énumérées ADOX indiquent une valeur pour chaque constante. Cependant, cette valeur est purement indicative et peut varier d'une version ADOX à une autre. Votre code doit dépendre seulement du nom des constantes énumérées et non de leur valeur réelle.

Les constantes énumérées sont définies ci-dessous.

Énumération | Description
ActionEnum | Indique le type d'action à exécuter lors de l'appel à SetPermissions.
AllowNullsEnum | Indique si les enregistrements ayant des valeurs nulles sont indexés.
ColumnAttributesEnum | Indique les caractéristiques d'une Column.
DataTypeEnum | Indique le type de données d'un objet Field, Parameter ou Property.
InheritTypeEnum | Indique comment les objets hériteront des autorisations définies à l'aide de SetPermissions.
KeyTypeEnum | Indique le type de Key : primaire, étrangère ou unique.
ObjectTypeEnum | Indique le type d'objet base de données pour lequel il faut définir les autorisations ou le propriétaire.
RightsEnum | Spécifie les droits ou les autorisations concernant un objet, pour un groupe ou un utilisateur.
RuleEnum | Indique la règle à suivre lors de la suppression d'une Key.
SortOrderEnum | Indique l'ordre de tri d'une colonne indexée.

Voir aussi

Référence de l'API ADOX | Guide de référence du programmeur Microsoft ADOX


ActionEnum

Indique le type d'action à exécuter lors de l'appel à SetPermissions.

Constante | Valeur | Description
adAccessDeny | 3 | Le groupe ou l'utilisateur n'aura pas les autorisations demandées.
adAccessGrant | 1 | Le groupe ou l'utilisateur aura au moins les autorisations demandées.
adAccessRevoke | 4 | Tous les droits d'accès explicites que possède le groupe ou l'utilisateur seront annulés.
adAccessSet | 2 | Le groupe ou l'utilisateur aura exactement les autorisations demandées.


AllowNullsEnum

Indique si les enregistrements ayant des valeurs nulles sont indexés.

Constante | Valeur | Description
adIndexNullsAllow | 0 | L'index autorise les entrées dans lesquelles les colonnes clés sont nulles. Si une valeur nulle est entrée dans une colonne clé, l'entrée est insérée dans l'index.
adIndexNullsDisallow | 1 | Valeur par défaut. L'index n'autorise pas les entrées dans lesquelles les colonnes clés sont nulles. Si une valeur nulle est entrée dans une colonne clé, une erreur se produira.
adIndexNullsIgnore | 2 | L'index n'insère pas les entrées contenant des clés nulles. Si une valeur nulle est entrée dans une colonne clé, l'entrée est ignorée et aucune erreur ne se produit.
adIndexNullsIgnoreAny | 4 | L'index n'insère pas les entrées où l'une des colonnes clés a une valeur nulle. Si, dans un index ayant une clé multicolonne, une valeur nulle est entrée dans l'une des colonnes, l'entrée est ignorée et aucune erreur ne se produit.

S'applique à : IndexNulls, propriété


ColumnAttributesEnum

Indique les caractéristiques d'une Column.

Constante | Valeur | Description
adColFixed | 1 | La colonne a une longueur fixe.
adColNullable | 2 | La colonne peut contenir des valeurs nulles.

S'applique à : Attributes, propriété


InheritTypeEnum

Indique comment les objets hériteront des autorisations définies à l'aide de SetPermissions.

Constante | Valeur | Description
adInheritBoth | 3 | Les objets et les autres conteneurs figurant dans l'objet primaire héritent tous de l'entrée.
adInheritContainers | 2 | Les autres conteneurs figurant dans l'objet primaire héritent de l'entrée.
adInheritNone | 0 | Valeur par défaut. Pas d'héritage.
adInheritNoPropagate | 4 | Les indicateurs adInheritObjects et adInheritContainers ne se propagent pas jusqu'à une entrée héritée.
adInheritObjects | 1 | Les objets non-conteneur inclus dans le conteneur héritent des autorisations.

S'applique à : SetPermissions, méthode


KeyTypeEnum

Indique le type de Key : primaire, étrangère ou unique.

Constante | Valeur | Description
adKeyPrimary | 1 | Valeur par défaut. La clé est une clé primaire.
adKeyForeign | 2 | La clé est une clé étrangère.
adKeyUnique | 3 | La clé est unique.

Voir aussi

S'applique à : Type, propriété (Key)


ObjectTypeEnum

Indique le type d'objet base de données pour lequel il faut définir les autorisations ou le propriétaire.

Constante | Valeur | Description
adPermObjColumn | 2 | L'objet est une colonne.
adPermObjDatabase | 3 | L'objet est une base de données.
adPermObjProcedure | 4 | L'objet est une procédure.
adPermObjProviderSpecific | -1 | L'objet est un type défini par le fournisseur. Une erreur se produira si le paramètre ObjectType est adPermObjProviderSpecific alors qu'un ObjectTypeId n'est pas fourni.
adPermObjTable | 1 | L'objet est une table.
adPermObjView | 5 | L'objet est une vue.

Voir aussi

S'applique à : GetObjectOwner, méthode | GetPermissions, méthode | SetObjectOwner, méthode | SetPermissions, méthode


RightsEnum

Spécifie les droits ou les autorisations concernant un objet, pour un groupe ou un utilisateur.

Constante | Valeur | Description
adRightCreate | 16384 (&H4000) | L'utilisateur ou le groupe a l'autorisation de créer de nouveaux objets de ce type.
adRightDelete | 65536 (&H10000) | L'utilisateur ou le groupe a l'autorisation de supprimer des données d'un objet. Pour des objets tels que des Tables, l'utilisateur a l'autorisation de supprimer des valeurs de données dans les enregistrements.
adRightDrop | 256 (&H100) | L'utilisateur ou le groupe a l'autorisation de retirer des objets du catalogue. Par exemple, les Tables peuvent être supprimées par une commande DROP TABLE SQL.
adRightExclusive | 512 (&H200) | L'utilisateur ou le groupe a l'autorisation d'accéder à l'objet de façon exclusive.
adRightExecute | 536870912 (&H20000000) | L'utilisateur ou le groupe a l'autorisation d'exécuter l'objet.
adRightFull | 268435456 (&H10000000) | L'utilisateur ou le groupe a toutes les autorisations concernant l'objet.
adRightInsert | 32768 (&H8000) | L'utilisateur ou le groupe a l'autorisation d'insérer l'objet. Pour des objets tels que les Tables, l'utilisateur a l'autorisation d'insérer des données dans la table.
adRightMaximumAllowed | 33554432 (&H2000000) | L'utilisateur ou le groupe possède le nombre maximal d'autorisations permis par le fournisseur. Les autorisations spécifiques dépendent du fournisseur.
adRightNone | 0 | L'utilisateur ou le groupe n'a aucune autorisation concernant l'objet.
adRightRead | -2147483648 (&H80000000) | L'utilisateur ou le groupe a une autorisation de lecture de l'objet. Pour des objets tels que les Tables, l'utilisateur a l'autorisation de lire les données de la table.
adRightReadDesign | 1024 (&H400) | L'utilisateur ou le groupe a l'autorisation de lire la conception de l'objet.
adRightReadPermissions | 131072 (&H20000) | L'utilisateur ou le groupe peut afficher, mais non modifier, les autorisations spécifiques d'un objet du catalogue.
adRightReference | 8192 (&H2000) | L'utilisateur ou le groupe a l'autorisation de référencer l'objet.
adRightUpdate | 1073741824 (&H40000000) | L'utilisateur ou le groupe a l'autorisation de mettre à jour l'objet. Pour des objets tels que les Tables, l'utilisateur a l'autorisation de mettre à jour les données de la table.
adRightWithGrant | 4096 (&H1000) | L'utilisateur ou le groupe a l'autorisation d'accorder des autorisations concernant l'objet.
adRightWriteDesign | 2048 (&H800) | L'utilisateur ou le groupe a l'autorisation de modifier la conception de l'objet.
adRightWriteOwner | 524288 (&H80000) | L'utilisateur ou le groupe a l'autorisation de modifier le propriétaire de l'objet.
adRightWritePermissions | 262144 (&H40000) | L'utilisateur ou le groupe peut modifier les autorisations spécifiques d'un objet du catalogue.

Voir aussi

S'applique à : GetPermissions, méthode | SetPermissions, méthode


RuleEnum

Indique la règle à suivre lors de la suppression d'une Key.

Constante | Valeur | Description
adRICascade | 1 | Modifications en cascade.
adRINone | 0 | Valeur par défaut. Aucune action n'est prise.
adRISetDefault | 3 | La clé étrangère prend la valeur par défaut.
adRISetNull | 2 | La clé étrangère prend une valeur nulle.

S'applique à : DeleteRule, propriété


SortOrderEnum

Indique l'ordre de tri d'une colonne indexée.

Constante | Valeur | Description
adSortAscending | 1 | Valeur par défaut. L'ordre de tri de la colonne est croissant.
adSortDescending | 2 | L'ordre de tri de la colonne est décroissant.

S'applique à : SortOrder, propriété


Exemples de code ADOX

Utilisez les exemples de code suivants pour apprendre à utiliser les objets, les méthodes, les propriétés et les événements ADOX.

Remarque Collez entièrement les exemples de code dans votre éditeur de code. L'exemple risque de ne pas fonctionner correctement si des copies partielles d'exemple sont utilisées ou si la mise en forme des paragraphes est perdue.
  • Exemples de code ADOX en Microsoft Visual Basic
  • Exemples de code ADOX en Microsoft Visual C++

Voir aussi

Exemple de propriété Catalog ActiveConnection (VB) | Exemple de méthodes Columns et Tables Append, et de propriété Name (VB) | Exemple de propriétés Command et CommandText (VB) | Exemple de méthode Connection Close, et de propriété Table Type (VB) | Exemple de méthodes GetPermissions et SetPermissions (VB) | Exemple de méthode Indexes Append (VB) | Exemple de méthode Keys Append, et de propriétés Key Type, RelatedColumn, RelatedTable et UpdateRule (VB) | Guide de référence du programmeur Microsoft ADOX | Exemple de propriété Command et de collection Parameters (VB) | Exemple de propriété ParentCatalog (VB) | Exemple de méthode Procedures Append (VB) | Exemple de méthode Procedures Delete (VB) | Exemple de méthode Procedures Refresh (VB) | Exemple de collections Views et Fields (VB) | Exemple de méthode Views Append (VB) | Exemple de collection Views et de propriété CommandText (VB) | Exemple de méthode Views Delete (VB) | Exemple de méthode Views Refresh (VB)


Exemples de code ADOX en Microsoft Visual Basic

Les rubriques ci-dessous proposent des exemples de code qui vous permettront de comprendre l'utilisation d'ADOX. Tous les exemples de code sont écrits en Microsoft Visual Basic.

Remarque Collez l'exemple de code dans sa totalité, depuis Sub jusqu'à End Sub, dans votre éditeur de code. Si vous utilisez des parties d'exemple ou si la mise en forme des paragraphes est perdue, l'exemple risque de ne pas fonctionner correctement.

Méthodes

  • Exemple de méthodes Columns et Tables Append, et de propriété Name (VB)
  • Exemple de méthode Connection Close, et de propriété Table Type (VB)
  • Exemple de méthode Create (VB)
  • Exemple de méthodes GetObjectOwner et SetObjectOwner (VB)
  • Exemple de méthodes GetPermissions et SetPermissions (VB)
  • Exemple de méthodes Groups et Users Append, ChangePassword (VB)
  • Exemple de méthode Indexes Append (VB)
  • Exemple de méthode Keys Append, et de propriétés Key Type, RelatedColumn, RelatedTable et UpdateRule (VB)
  • Exemple de méthode Procedures Append (VB)
  • Exemple de méthode Procedures Delete (VB)
  • Exemple de méthode Procedures Refresh (VB)
  • Exemple de méthode Views Append (VB)
  • Exemple de méthode Views Delete (VB)
  • Exemple de méthode Views Refresh (VB)

Propriétés

  • Exemple de propriété Attributes (VB)
  • Exemple de propriété Catalog ActiveConnection (VB)
  • Exemple de propriété Clustered (VB)
  • Exemple de propriétés Command et CommandText (VB)
  • Exemple de collection Parameters et de propriété Command (VB)
  • Exemple de propriété CommandText et de collection Views (VB)
  • Exemple de propriétés DateCreated et DateModified (VB)
  • Exemple de propriété DefinedSize (VB)
  • Exemple de propriété DeleteRule (VB)
  • Exemple de propriété IndexNulls (VB)
  • Exemple de propriétés Key Type, RelatedColumn, RelatedTable et UpdateRule, et de méthode Keys Append (VB)
  • Exemple de propriété Name, et de méthodes Columns et Tables Append (VB)
  • Exemple de propriétés NumericScale et Precision (VB)
  • Exemple de propriété ParentCatalog (VB)
  • Exemple de propriétés PrimaryKey et Unique (VB)
  • Exemple de propriété SortOrder (VB)
  • Exemple de propriété Table Type et de méthode Connection Close (VB)

Collections

  • Exemple de collection Parameters et de propriété Command (VB)
  • Exemple de collections Views et Fields (VB)
  • Exemple de collection Views et de propriété CommandText (VB)


Exemple de propriété Attributes (VB)

Cet exemple montre comment utiliser la propriété Attributes d'un objet Column. Quand elle a pour valeur adColNullable, cette propriété permet d'attribuer une chaîne vide comme valeur à un Field de Recordset. Dans cette situation, l'utilisateur peut distinguer un enregistrement où les données ne sont pas connues d'un enregistrement où les données ne s'appliquent pas.

' BeginAttributesVB
Sub Main()
    On Error GoTo AttributesXError

    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
    Dim tblEmp As ADOX.Table

    ' Connect the catalog.
    cnn.Open "Provider='Microsoft.Jet.OLEDB.4.0';data source=" & _
        "'c:\Program Files\Microsoft Office\Office\Samples\Northwind.mdb';"
    Set cat.ActiveConnection = cnn

    Set tblEmp = cat.Tables("Employees")

    ' Create a new Field object and append it to the Fields
    ' collection of the Employees table.
    colTemp.Name = "FaxPhone"
    colTemp.Type = adVarWChar
    colTemp.DefinedSize = 24
    colTemp.Attributes = adColNullable
    cat.Tables("Employees").Columns.Append colTemp.Name, adWChar, 24

    ' Open the Employees table for updating as a Recordset
    rstEmployees.Open "Employees", cnn, adOpenKeyset, adLockOptimistic, adCmdTable

    With rstEmployees
        ' Get user input.
        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

            ' Print report.
            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

    'Clean up
    tblEmp.Columns.Delete colTemp.Name
    cnn.Close
    Set rstEmployees = Nothing
    Set cat = Nothing
    Set colTemp = Nothing
    Set cnn = Nothing
    Exit Sub

AttributesXError:

    If Not rstEmployees Is Nothing Then
        If rstEmployees.State = adStateOpen Then rstEmployees.Close
    End If
    Set rstEmployees = Nothing

    If Not tblEmp Is Nothing Then tblEmp.Columns.Delete colTemp.Name

    Set cat = Nothing
    Set colTemp = Nothing

    If Not cnn Is Nothing Then
        If cnn.State = adStateOpen Then cnn.Close
    End If
    Set cnn = Nothing

    If Err <> 0 Then
        MsgBox Err.Source & "-->" & Err.Description, , "Error"
    End If

End Sub
' EndAttributesVB

Attributes, propriété | Catalog, objet | Column, objet


Exemple de propriété Catalog ActiveConnection (VB)

Lorsque vous affectez la propriété ActiveConnection à une connexion ouverte valide, le catalogue « s'ouvre ». À partir d'un catalogue ouvert, il est possible d'accéder aux objets schéma contenus dans ce catalogue.

' BeginOpenConnectionVB
Sub OpenConnection()
    On Error GoTo OpenConnectionError

    Dim cnn As New ADODB.Connection
    Dim cat As New ADOX.Catalog

    cnn.Open "Provider='Microsoft.Jet.OLEDB.4.0';" & _
        "Data Source= 'c:\Program Files\Microsoft Office\" & _
        "Office\Samples\Northwind.mdb';"
    Set cat.ActiveConnection = cnn
    Debug.Print cat.Tables(0).Type

    'Clean up
    cnn.Close
    Set cat = Nothing
    Set cnn = Nothing
    Exit Sub

OpenConnectionError:

    Set cat = Nothing

    If Not cnn Is Nothing Then
        If cnn.State = adStateOpen Then cnn.Close
    End If
    Set cnn = Nothing

    If Err <> 0 Then
        MsgBox Err.Source & "-->" & Err.Description, , "Error"
    End If
End Sub
' EndOpenConnectionVB

Lorsque vous affectez la propriété ActiveConnection à une chaîne de connexion valide, le catalogue « s'ouvre » également.

' BeginOpenConnection2VB
Sub Main()
    On Error GoTo OpenConnectionWithStringError
    Dim cat As New ADOX.Catalog

    cat.ActiveConnection = "Provider='Microsoft.Jet.OLEDB.4.0';" & _
        "Data Source='c:\Program Files\Microsoft Office\" & _
        "Office\Samples\Northwind.mdb';"
    Debug.Print cat.Tables(0).Type

    'Clean up
    Set cat.ActiveConnection = Nothing
    Exit Sub

OpenConnectionWithStringError:
    Set cat = Nothing

    If Err <> 0 Then
        MsgBox Err.Source & "-->" & Err.Description, , "Error"
    End If
End Sub
' EndOpenConnection2VB

Voir aussi

ActiveConnection, propriété | Catalog, objet | Table, objet | Tables, collection | Type, propriété (Table)


Exemple de propriété Clustered (VB)

Cet exemple montre comment utiliser la propriété Clustered d'un objet Index. Les bases de données Microsoft Jet ne prennent pas en charge les index ordonnés en clusters, de sorte que cet exemple renverra la valeur False pour la propriété Clustered de tous les index dans la base de données Northwind.

' BeginClusteredVB
Sub Main()
    On Error GoTo ClusteredXError

    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='MySqlServer';Initial Catalog='pubs';" & _
        "Integrated Security='SSPI';"
    ' Connect the catalog.
    cnn.Open strCnn
    cat.ActiveConnection = cnn

    ' Enumerate Tables
    For Each tblLoop In cat.Tables
        'Enumerate Indexes
        For Each idxLoop In tblLoop.Indexes
            Debug.Print tblLoop.Name & " " & _
                idxLoop.Name & " " & idxLoop.Clustered
        Next idxLoop
    Next tblLoop

    'Clean up
    cnn.Close
    Set cat = Nothing
    Set cnn = Nothing
    Exit Sub

ClusteredXError:

    Set cat = Nothing

    If Not cnn Is Nothing Then
        If cnn.State = adStateOpen Then cnn.Close
    End If
    Set cnn = Nothing

    If Err <> 0 Then
        MsgBox Err.Source & "-->" & Err.Description, , "Error"
    End If
End Sub
' EndClusteredVB

Voir aussi

Catalog, objet | Clustered, propriété | Index, objet | Table, objet


Exemple de méthodes Columns et Tables Append, et de propriété Name (VB)

Le code suivant indique comment créer une table.

' BeginCreateTableVB
Sub Main()
    On Error GoTo CreateTableError

    Dim tbl As New Table
    Dim cat As New ADOX.Catalog

    ' Open the Catalog.
    cat.ActiveConnection = "Provider='Microsoft.Jet.OLEDB.4.0';" & _
        "Data Source='c:\Program Files\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
    Debug.Print "Table 'MyTable' is added."

    'Delete the table as this is a demonstration.
    cat.Tables.Delete tbl.Name
    Debug.Print "Table 'MyTable' is deleted."

    'Clean up
    Set cat.ActiveConnection = Nothing
    Set cat = Nothing
    Set tbl = Nothing
    Exit Sub

CreateTableError:

    Set cat = Nothing
    Set tbl = Nothing

    If Err <> 0 Then
        MsgBox Err.Source & "-->" & Err.Description, , "Error"
    End If
End Sub
' EndCreateTableVB

Voir aussi

Append, méthode (Columns) | Append, méthode (Tables) | Column, objet | Columns, collection | Name, propriété | Table, objet | Tables, collection


Exemple de propriétés Command et CommandText (VB)

Le code suivant indique comment utiliser la propriété Command pour mettre à jour le texte d'une procédure.

' BeginProcedureTextVB
Sub Main()
    On Error GoTo ProcedureTextError

    Dim cnn As New ADODB.Connection
    Dim cat As New ADOX.Catalog
    Dim cmd As New ADODB.Command

    ' Open the Connection
    cnn.Open "Provider='Microsoft.Jet.OLEDB.4.0';" & _
        "Data Source='c:\Program Files\Microsoft Office\" & _
        "Office\Samples\Northwind.mdb';"

    ' Open the catalog
    Set cat.ActiveConnection = cnn

    ' Get the Command
    Set cmd = cat.Procedures("CustomerById").Command

    ' Update the CommandText
    cmd.CommandText = "Select CustomerId, CompanyName, ContactName " & _
        "From Customers " & _
        "Where CustomerId = [CustId]"

    ' Update the Procedure
    Set cat.Procedures("CustomerById").Command = cmd

    'Clean up
    cnn.Close
    Set cat = Nothing
    Set cmd = Nothing
    Set cnn = Nothing
    Exit Sub

ProcedureTextError:
    Set cat = Nothing
    Set cmd = Nothing

    If Not cnn Is Nothing Then
        If cnn.State = adStateOpen Then cnn.Close
    End If
    Set cnn = Nothing

    If Err <> 0 Then
        MsgBox Err.Source & "-->" & Err.Description, , "Error"
    End If
End Sub
' EndProcedureTextVB

Voir aussi

ActiveConnection, propriété | Catalog, objet | Command, propriété | Procedure, objet | Procedures, collection


Exemple de méthode Connection Close, et de propriété Table Type (VB)

Lorsque la valeur Nothing est affectée à la propriété ActiveConnection, le catalogue « se ferme ». Les collections associées sont vides. Les objets créés à partir d'objets schéma du catalogue sont orphelins. Les propriétés de ces objets qui ont été mises en cache restent disponibles, mais les tentatives de lire des propriétés qui requièrent l'appel du fournisseur échouent.

' BeginCloseConnectionVB
Sub Main()
    On Error GoTo CloseConnectionByNothingError

    Dim cnn As New ADODB.Connection
    Dim cat As New ADOX.Catalog
    Dim tbl As ADOX.Table

    cnn.Open "Provider='Microsoft.Jet.OLEDB.4.0';" & _
        "Data Source= 'c:\Program Files\Microsoft Office\" & _
        "Office\Samples\Northwind.mdb';"
    Set cat.ActiveConnection = cnn
    Set tbl = cat.Tables(0)
    Debug.Print tbl.Type    ' Cache tbl.Type info
    Set cat.ActiveConnection = Nothing
    Debug.Print tbl.Type    ' tbl is orphaned
    ' Previous line will succeed if this was cached
    Debug.Print tbl.Columns(0).DefinedSize
    ' Previous line will fail if this info has not been cached

    'Clean up
    cnn.Close
    Set cat = Nothing
    Set cnn = Nothing
    Exit Sub

CloseConnectionByNothingError:
    Set cat = Nothing

    If Not cnn Is Nothing Then
        If cnn.State = adStateOpen Then cnn.Close
    End If
    Set cnn = Nothing

    If Err <> 0 Then
        MsgBox Err.Source & "-->" & Err.Description, , "Error"
    End If
End Sub
' EndCloseConnectionVB

La fermeture d'un objet Connection utilisé pour « ouvrir » le catalogue a le même effet que l'attribution de la valeur Nothing à la propriété ActiveConnection.

Sub CloseConnection()
    On Error GoTo CloseConnectionError

    Dim cnn As New ADODB.Connection
    Dim cat As New ADOX.Catalog
    Dim tbl As ADOX.Table

    cnn.Open "Provider='Microsoft.Jet.OLEDB.4.0';" & _
        "Data Source= 'c:\Program Files\Microsoft Office\" & _
        "Office\Samples\Northwind.mdb';"
    Set cat.ActiveConnection = cnn
    Set tbl = cat.Tables(0)
    Debug.Print tbl.Type    ' Cache tbl.Type info
    cnn.Close
    Debug.Print tbl.Type    ' tbl is orphaned
    ' Previous line will succeed if this was cached
    Debug.Print tbl.Columns(0).DefinedSize
    ' Previous line will fail if this info has not been cached

    'Clean up
    Set cat = Nothing
    Set cnn = Nothing
    Exit Sub

CloseConnectionError:

    Set cat = Nothing

    If Not cnn Is Nothing Then
        If cnn.State = adStateOpen Then cnn.Close
    End If
    Set cnn = Nothing

    If Err <> 0 Then
        MsgBox Err.Source & "-->" & Err.Description, , "Error"
    End If
End Sub
' EndCloseConnection2VB

Voir aussi

ActiveConnection, propriété | Catalog, objet | Column, objet | Columns, collection | Table, objet | Tables, collection | Type (Table), propriété


Exemple de méthode Create (VB)

Le code suivant indique comment créer une base de données Microsoft Jet au moyen de la méthode Create.

' BeginCreateDatabseVB
Sub CreateDatabase()
    On Error GoTo CreateDatabaseError

    Dim cat As New ADOX.Catalog
    cat.Create "Provider='Microsoft.Jet.OLEDB.4.0';Data Source='c:\new.mdb'"

    'Clean up
    Set cat = Nothing
    Exit Sub

CreateDatabaseError:
    Set cat = Nothing

    If Err <> 0 Then
        MsgBox Err.Source & "-->" & Err.Description, , "Error"
    End If
End Sub
' EndCreateDatabaseVB

Catalog, objet | Create, méthode


Exemple de propriétés DateCreated et DateModified (VB)

Cet exemple montre comment les propriétés DateCreated et DateModified sont utilisées par l'ajout d'un nouvel objet Column à une Table existante et la création d'une nouvelle Table. La procédure DateOutput est nécessaire à l'exécution de cet exemple.

' BeginDateCreatedVB
Sub Main()
    On Error GoTo DateCreatedXError

    Dim cat As New ADOX.Catalog
    Dim tblEmployees As ADOX.Table
    Dim tblNewTable As ADOX.Table

    ' Connect the catalog.
    cat.ActiveConnection = "Provider='Microsoft.Jet.OLEDB.4.0';" & _
        "Data Source='c:\Program Files\" & _
        "Microsoft Office\Office\Samples\Northwind.mdb';"

    With cat
        Set tblEmployees = .Tables("Employees")

        ' Print current information about the Employees table.
        DateOutput "Current properties", tblEmployees

        ' Create and append column to the Employees table.
        tblEmployees.Columns.Append "NewColumn", adInteger
        .Tables.Refresh

        ' Print new information about the Employees table.
        DateOutput "After creating a new column", tblEmployees

        ' Delete new column because this is a demonstration.
        tblEmployees.Columns.Delete "NewColumn"

        ' Create and append new Table object to the Northwind database.
        Set tblNewTable = New ADOX.Table
        tblNewTable.Name = "NewTable"
        tblNewTable.Columns.Append "NewColumn", adInteger
        .Tables.Append tblNewTable
        .Tables.Refresh

        ' Print information about the new Table object.
        DateOutput "After creating a new table", .Tables("NewTable")

        ' Delete new Table object because this is a demonstration.
        .Tables.Delete tblNewTable.Name
    End With

    'Clean up
    Set cat.ActiveConnection = Nothing
    Set cat = Nothing
    Exit Sub

DateCreatedXError:
    Set cat = Nothing

    If Err <> 0 Then
        MsgBox Err.Source & "-->" & Err.Description, , "Error"
    End If

End Sub

Sub DateOutput(strTemp As String, tblTemp As ADOX.Table)
    ' Print DateCreated and DateModified information about
    ' specified Table object.
    Debug.Print strTemp
    Debug.Print "    Table: " & tblTemp.Name
    Debug.Print "        DateCreated = " & tblTemp.DateCreated
    Debug.Print "        DateModified = " & tblTemp.DateModified
    Debug.Print
End Sub
' EndDateCreatedVB

Voir aussi

DateCreated, propriété | DateModified, propriété | Procedure, objet | Procedures, collection | View, objet | Views, collection


Exemple de propriété DefinedSize (VB)

Cet exemple montre comment utiliser la propriété DefinedSize d'un objet Column. Le code redéfinit la taille de la colonne FirstName de la table Employees dans la base de données Northwind. Ensuite, il affiche les modifications intervenues dans les valeurs du Field FirstName d'un Recordset basé sur la table Employees. Le champ FirstName devient, par défaut, rempli d'espaces après la redéfinition de la propriété DefinedSize.

' BeginDefinedSizeVB
Public Sub Main()
    On Error GoTo DefinedSizeXError

    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:\Program Files\" & _
             "Microsoft Office\Office\Samples\Northwind.mdb';"

    ' Open a Recordset for the Employees table.
    Set rstEmployees = New ADODB.Recordset
    rstEmployees.Open "Employees", strCnn, adOpenKeyset, , adCmdTable
    ReDim aryFirstName(rstEmployees.RecordCount)

    ' Open a Catalog for the Northwind database,
    ' using same connection as rstEmployees
    Set catNorthwind.ActiveConnection = rstEmployees.ActiveConnection

    ' Loop through the recordset displaying the contents
    ' of the FirstName field, the field's defined size,
    ' and its actual size.
    ' Also store FirstName values in aryFirstName array.
    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
            If Not rstEmployees!FirstName = Null Then
                aryFirstName(i) = rstEmployees!FirstName
            End If
        rstEmployees.MoveNext
        i = i + 1
    Loop
    rstEmployees.Close

    ' Redefine the DefinedSize of FirstName in the catalog
    Set colFirstName = catNorthwind.Tables("Employees").Columns("FirstName")
    colNewFirstName.Name = colFirstName.Name
    colNewFirstName.Type = colFirstName.Type
    colNewFirstName.DefinedSize = colFirstName.DefinedSize + 1

    ' Append new FirstName column to catalog
    catNorthwind.Tables("Employees").Columns.Delete colFirstName.Name
    catNorthwind.Tables("Employees").Columns.Append colNewFirstName

    ' Open Employee table in Recordset for updating
    rstEmployees.Open "Employees", catNorthwind.ActiveConnection, _
        adOpenKeyset, adLockOptimistic, adCmdTable

    ' Loop through the recordset displaying the contents
    ' of the FirstName field, the field's defined size,
    ' and its actual size.
    ' Also restore FirstName values from aryFirstName.
    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

    ' Restore original FirstName column to catalog
    catNorthwind.Tables("Employees").Columns.Delete colNewFirstName.Name
    catNorthwind.Tables("Employees").Columns.Append colFirstName

    ' Restore original FirstName values to Employees table
    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

    'Clean up
    Set catNorthwind = Nothing
    Set colNewFirstName = Nothing
    Set colFirstName = Nothing
    Set rstEmployees = Nothing
    Exit Sub

DefinedSizeXError:
    Set catNorthwind = Nothing
    Set colNewFirstName = Nothing
    Set colFirstName = Nothing

    If Not rstEmployees Is Nothing Then
        If rstEmployees.State = adStateOpen Then rstEmployees.Close
    End If
    Set rstEmployees = Nothing

    If Err <> 0 Then
        MsgBox Err.Source & "-->" & Err.Description, , "Error"
    End If

End Sub
' EndDefinedSizeVB

Column, objet | DefinedSize, propriété


Exemple de propriété DeleteRule (VB)

Cet exemple montre comment utiliser la propriété DeleteRule d'un objet Key. Le code ajoute une nouvelle Table puis définit une nouvelle clé primaire, en attribuant la valeur adRICascade à DeleteRule.

' BeginDeleteRuleVB
Sub Main()
    On Error GoTo DeleteRuleXError

    Dim kyPrimary As New ADOX.Key
    Dim cat As New ADOX.Catalog
    Dim tblNew As New ADOX.Table

    ' Connect the catalog
    cat.ActiveConnection = "Provider='Microsoft.Jet.OLEDB.4.0';" & _
                     "data source='c:\Program Files\" & _
                     "Microsoft Office\Office\Samples\Northwind.mdb';"

    ' Name new table
    tblNew.Name = "NewTable"

    ' Append a numeric and a text field to new table.
    tblNew.Columns.Append "NumField", adInteger, 20
    tblNew.Columns.Append "TextField", adVarWChar, 20

    ' Append the new table
    cat.Tables.Append tblNew

    ' Define the Primary key
    kyPrimary.Name = "NumField"
    kyPrimary.Type = adKeyPrimary
    kyPrimary.RelatedTable = "Customers"
    kyPrimary.Columns.Append "NumField"
    kyPrimary.Columns("NumField").RelatedColumn = "CustomerId"
    kyPrimary.DeleteRule = adRICascade

    ' Append the primary key
    cat.Tables("NewTable").Keys.Append kyPrimary
    Debug.Print "The primary key is appended."

    'Delete the table as this is a demonstration.
    cat.Tables.Delete tblNew.Name
    Debug.Print "The primary key is deleted."

    'Clean up
    Set cat.ActiveConnection = Nothing
    Set cat = Nothing
    Set kyPrimary = Nothing
    Set tblNew = Nothing
    Exit Sub

DeleteRuleXError:

    Set cat = Nothing
    Set kyPrimary = Nothing
    Set tblNew = Nothing

    If Err <> 0 Then
        MsgBox Err.Source & "-->" & Err.Description, , "Error"
    End If

End Sub
' EndDeleteRuleVB

DeleteRule, propriété | Key, objet


Exemple de méthodes GetObjectOwner et SetObjectOwner (VB)

Cet exemple met en application les méthodes GetObjectOwner et SetObjectOwner. Le fragment de code ci-après suppose l'existence du groupe Accounting (consultez Exemple de méthodes Groups et Users Append, ChangePassword pour apprendre comment ajouter ce groupe au système). Le propriétaire de la table Categories est défini à Accounting.

' BeginOwnersVB
Sub Main()
    On Error GoTo OwnersXError

    Dim tblLoop As New ADOX.Table
    Dim cat As New ADOX.Catalog
    Dim strOwner As String

    ' Open the Catalog.
    cat.ActiveConnection = "Provider='Microsoft.Jet.OLEDB.4.0';" & _
        "Data Source='c:\Program Files\" & _
        "Microsoft Office\Office\Samples\Northwind.mdb';" & _
        "jet oledb:system database=" & _
        "'c:\Program Files\Microsoft Office\Office\system.mdw'"

    ' Print the original owner of Categories
    strOwner = cat.GetObjectOwner("Categories", adPermObjTable)
    Debug.Print "Owner of Categories: " & strOwner

    ' Set the owner of Categories to Accounting
    cat.SetObjectOwner "Categories", adPermObjTable, "Accounting"

    ' List the owners of all tables and columns in the catalog.
    For Each tblLoop In cat.Tables
        Debug.Print "Table: " & tblLoop.Name
        Debug.Print "   Owner: " & _
            cat.GetObjectOwner(tblLoop.Name, adPermObjTable)
    Next tblLoop

    ' Restore the original owner of Categories
    cat.SetObjectOwner "Categories", adPermObjTable, strOwner

    'Clean up
    Set cat.ActiveConnection = Nothing
    Set cat = Nothing
    Exit Sub

OwnersXError:

    Set cat = Nothing

    If Err <> 0 Then
        MsgBox Err.Source & "-->" & Err.Description, , "Error"
    End If

End Sub
' EndOwnersVB

Voir aussi

Catalog, objet | GetObjectOwner, méthode | SetObjectOwner, méthode


Exemple de méthodes GetPermissions et SetPermissions (VB)

Cet exemple met en application les méthodes GetPermissions et SetPermissions. Le code suivant donne à l'utilisateur Admin l'accès intégral à la table Orders.

' BeginGrantPermissionsVB
Sub GrantPermissions()
    On Error GoTo GrantPermissionsError

    Dim cnn As New ADODB.Connection
    Dim cat As New ADOX.Catalog
    Dim lngPerm As Long

    ' Opens a connection to the northwind database
    ' using the Microsoft Jet 4.0 provider
    cnn.Provider = "Microsoft.Jet.OLEDB.4.0"
    cnn.Open "Data Source='c:\Program Files\" & _
        "Microsoft Office\Office\Samples\Northwind.mdb';" & _
        "jet oledb:system database=" & _
        "'c:\Program Files\Microsoft Office\Office\system.mdw'"

    Set cat.ActiveConnection = cnn

    ' Retrieve original permissions
    lngPerm = cat.Users("admin").GetPermissions("Orders", adPermObjTable)
    Debug.Print "Original permissions: " & Str(lngPerm)

    ' Revoke all permissions
    cat.Users("admin").SetPermissions "Orders", adPermObjTable, _
        adAccessRevoke, adRightFull

    ' Display permissions
    Debug.Print "Revoked permissions: " & _
        Str(cat.Users("admin").GetPermissions("Orders", adPermObjTable))

    ' Give the Admin user full rights on the orders object
    cat.Users("admin").SetPermissions "Orders", adPermObjTable, _
        adAccessSet, adRightFull

    ' Display permissions
    Debug.Print "Full permissions: " & _
        Str(cat.Users("admin").GetPermissions("Orders", adPermObjTable))

    ' Restore original permissions
    cat.Users("admin").SetPermissions "Orders", adPermObjTable, _
        adAccessSet, lngPerm

    ' Display permissions
    Debug.Print "Final permissions: " & _
        Str(cat.Users("admin").GetPermissions("Orders", adPermObjTable))

    'Clean up
    cnn.Close
    Set cat = Nothing
    Set cnn = Nothing
    Exit Sub

GrantPermissionsError:

    Set cat = Nothing

    If Not cnn Is Nothing Then
        If cnn.State = adStateOpen Then cnn.Close
    End If
    Set cnn = Nothing

    If Err <> 0 Then
        MsgBox Err.Source & "-->" & Err.Description, , "Error"
    End If

End Sub

' EndGrantPermissionsVBVoir aussi

Catalog, objet | GetPermissions, méthode | SetPermissions, méthode | User, objet | Users, collection


Exemple de méthodes Groups et Users Append, ChangePassword (VB)

Cet exemple illustre l'utilisation de la méthode Append de Groups, ainsi que la méthode Append de Users en ajoutant un nouvel objet Group et un nouvel objet User au système. Le nouvel objet Group est ajouté à la collection Groups du nouvel objet User. Par conséquent, le nouvel objet User est ajouté au Group. De plus, la méthode ChangePassword est utilisée pour spécifier le mot de passe User.

' BeginGroupVB
Sub Main()
    On Error GoTo GroupXError

    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:\Program Files\" & _
        "Microsoft Office\Office\Samples\Northwind.mdb';" & _
        "jet oledb:system database=" & _
        "'c:\Program Files\Microsoft Office\Office\system.mdw'"

    With cat
        'Create and append new group with a string.
        .Groups.Append "Accounting"

        ' Create and append new user with an object.
        Set usrNew = New ADOX.User
        usrNew.Name = "Pat Smith"
        usrNew.ChangePassword "", "Password1"
        .Users.Append usrNew

        ' Make the user Pat Smith a member of the
        ' Accounting group by creating and adding the
        ' appropriate Group object to the user's Groups
        ' collection. The same is accomplished if a User
        ' object representing Pat Smith is created and
        ' appended to the Accounting group Users collection
        usrNew.Groups.Append "Accounting"

        ' Enumerate all User objects in the
        ' catalog's Users collection.
        For Each usrLoop In .Users
            Debug.Print "  " & usrLoop.Name
            Debug.Print "    Belongs to these groups:"
            ' Enumerate all Group objects in each User
            ' object's Groups collection.
            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

        ' Enumerate all Group objects in the default
        ' workspace's Groups collection.
        For Each grpLoop In .Groups
            Debug.Print "  " & grpLoop.Name
            Debug.Print "    Has as its members:"
            ' Enumerate all User objects in each Group
            ' object's Users collection.
            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

        ' Delete new User and Group objects because this
        ' is only a demonstration.
        ' These two line are commented out because the sub "OwnersX" uses
        ' the group "Accounting".
'        .Users.Delete "Pat Smith"
'        .Groups.Delete "Accounting"

    End With

    'Clean up
    Set cat.ActiveConnection = Nothing
    Set cat = Nothing
    Set usrNew = Nothing
    Exit Sub

GroupXError:

    Set cat = Nothing
    Set usrNew = Nothing

    If Err <> 0 Then
        MsgBox Err.Source & "-->" & Err.Description, , "Error"
    End If
End Sub
' EndGroupVB

Voir aussi

Append, méthode (Groups) | Append, méthode (Users) | Catalog, objet | ChangePassword, méthode | Group, objet | Groups, collection | User, objet | Users, collection


Exemple de méthode Indexes Append (VB)

Le code suivant indique comment créer un index. L'index occupe deux colonnes de la table.

' BeginCreateIndexVB
Sub Main()
    On Error GoTo CreateIndexError

    Dim tbl As New Table
    Dim idx As New ADOX.Index
    Dim cat As New ADOX.Catalog

    'Open the catalog.
    ' Open the Catalog.
    cat.ActiveConnection = "Provider='Microsoft.Jet.OLEDB.4.0';" & _
        "Data Source='c:\Program Files\Microsoft Office\" & _
        "Office\Samples\Northwind.mdb';"

    ' Define the table and append it to the catalog
    tbl.Name = "MyTable"
    tbl.Columns.Append "Column1", adInteger
    tbl.Columns.Append "Column2", adInteger
    tbl.Columns.Append "Column3", adVarWChar, 50
    cat.Tables.Append tbl
    Debug.Print "Table 'MyTable' is added."

    ' Define a multi-column index
    idx.Name = "multicolidx"
    idx.Columns.Append "Column1"
    idx.Columns.Append "Column2"

    ' Append the index to the table
    tbl.Indexes.Append idx
    Debug.Print "The index is appended to table 'MyTable'."

    'Delete the table as this is a demonstration
    cat.Tables.Delete tbl.Name
    Debug.Print "Table 'MyTable' is deleted."

    'Clean up
    Set cat.ActiveConnection = Nothing
    Set cat = Nothing
    Set tbl = Nothing
    Set idx = Nothing
    Exit Sub

CreateIndexError:
    Set cat = Nothing
    Set tbl = Nothing
    Set idx = Nothing

    If Err <> 0 Then
        MsgBox Err.Source & "-->" & Err.Description, , "Error"
    End If
End Sub
' EndCreateIndexVB

Voir aussi

Append, méthode (Indexes) | Index, objet | Indexes, collection


Exemple de propriété IndexNulls (VB)

Cet exemple montre comment utiliser la propriété IndexNulls d'un Index. Le code crée un index et définit la valeur de IndexNulls à partir d'une entrée utilisateur (à partir d'une zone de liste nommée Liste1). Cet Index est, ensuite, ajouté dans la Table Employees du Catalog Northwind. Le nouvel Index est appliqué à un Recordset en fonction de la table Employees, et le Recordset est ouvert. Un nouvel enregistrement est ajouté à la table Employees, avec une valeur Null dans le champ indexé. Ce nouvel enregistrement est affiché ou non, selon la définition de la propriété IndexNulls.

' IndexNullsVB
Sub Main()
    On Error GoTo IndexNullsXError

    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

    ' Connect the catalog.
    cnn.Open "Provider='Microsoft.Jet.OLEDB.4.0';" & _
        "Data Source='c:\Program Files\" & _
        "Microsoft Office\Office\Samples\Northwind.mdb';"

    Set catNorthwind.ActiveConnection = cnn

    ' Append Country column to new index
    idxNew.Columns.Append "Country"
    idxNew.Name = "NewIndex"

    Dim Response
    Response = MsgBox("Allow 'Null' index? Otherwise ignore 'Null' index.", vbYesNo)
    '"Allow 'Null' index? Otherwise ignore 'Null' index."
    ', vbYesNo + vbCritical + vbDefaultButton2,,,,
    If Response = vbYes Then   ' User chose Yes.
       idxNew.IndexNulls = adIndexNullsAllow
    Else   ' User chose No.
       idxNew.IndexNulls = adIndexNullsIgnore
    End If

    'Append new index to Employees table
    catNorthwind.Tables("Employees").Indexes.Append idxNew

    rstEmployees.Index = idxNew.Name
    rstEmployees.Open "Employees", cnn, adOpenKeyset, _
        adLockOptimistic, adCmdTableDirect

    With rstEmployees
        ' Add a new record to the Employees table.
        .AddNew
        !FirstName = "Gary"
        !LastName = "Haarsager"
        .Update

        ' Bookmark the newly added record
        varBookmark = .Bookmark

        ' Use the new index to set the order of the records.
        .MoveFirst

        Debug.Print "Index = " & .Index & _
            ", IndexNulls = " & idxNew.IndexNulls
        Debug.Print "  Country - Name"

        ' Enumerate the Recordset. The value of the
        ' IndexNulls property will determine if the newly
        ' added record appears in the output.
        Do While Not .EOF
            Debug.Print "    " & _
                IIf(IsNull(!Country), "[Null]", !Country) & _
                " - " & !FirstName & " " & !LastName
            .MoveNext
        Loop

        ' Delete new record because this is a demonstration.
        .Bookmark = varBookmark
        .Delete

        .Close
    End With

    'Clean up
    Set rstEmployees = Nothing
    catNorthwind.Tables("Employees").Indexes.Delete idxNew.Name
    cnn.Close
    Set cnn = Nothing
    Set catNorthwind = Nothing
    Set idxNew = Nothing
    Exit Sub

IndexNullsXError:

    If Not rstEmployees Is Nothing Then
        If rstEmployees.State = adStateOpen Then rstEmployees.Close
    End If
    Set rstEmployees = Nothing

    ' Delete new Index because this is a demonstration.
    If Not catNorthwind Is Nothing Then
        catNorthwind.Tables("Employees").Indexes.Delete idxNew.Name
    End If

    If Not cnn Is Nothing Then
        If cnn.State = adStateOpen Then cnn.Close
    End If
    Set cnn = Nothing

    Set catNorthwind = Nothing
    Set idxNew = Nothing

    If Err <> 0 Then
        MsgBox Err.Source & "-->" & Err.Description, , "Error"
    End If

End Sub
' EndIndexNullsVB

Index, objet | IndexNulls, propriété


Exemple de méthode Keys Append, et de propriétés Key Type, RelatedColumn, RelatedTable et UpdateRule (VB)

Le code suivant indique comment créer une clé étrangère. Il suppose l'existence de deux tables (Customers et Orders).

' BeginCreateKeyVB
Sub Main()
    On Error GoTo CreateKeyError

    Dim kyForeign As New ADOX.Key
    Dim cat As New ADOX.Catalog

    ' Connect the catalog
    cat.ActiveConnection = "Provider='Microsoft.Jet.OLEDB.4.0';" & _
        "Data Source='c:\Program Files\Microsoft Office\" & _
        "Office\Samples\Northwind.mdb';"

    ' Define the foreign key
    kyForeign.Name = "CustOrder"
    kyForeign.Type = adKeyForeign
    kyForeign.RelatedTable = "Customers"
    kyForeign.Columns.Append "CustomerId"
    kyForeign.Columns("CustomerId").RelatedColumn = "CustomerId"
    kyForeign.UpdateRule = adRICascade

    ' Append the foreign key
    cat.Tables("Orders").Keys.Append kyForeign

    'Delete the Key as this is a demonstration
    cat.Tables("Orders").Keys.Delete kyForeign.Name

    'Clean up
    Set cat.ActiveConnection = Nothing
    Set cat = Nothing
    Set kyForeign = Nothing
    Exit Sub

CreateKeyError:
    Set cat = Nothing
    Set kyForeign = Nothing

    If Err <> 0 Then
        MsgBox Err.Source & "-->" & Err.Description, , "Error"
    End If

End Sub
' EndCreateKeyVB

Voir aussi

Append, méthode (Columns) | Append, méthode (Keys) | Catalog, objet | Column, objet | Columns, collection | Key, objet | Keys, collection | Name, propriété | RelatedColumn, propriété | RelatedTable, propriété | Table, objet | Tables, collection | Type, propriété (Key) | UpdateRule, propriété


Exemple de propriétés NumericScale et Precision (VB)

Cet exemple illustre comment utiliser les propriétés NumericScale et Precision de l'objet Column. Ce code indique leur valeur pour la table Order Details de la base de données Northwind.

' BeginNumericScalePrecVB
Sub Main()
    On Error GoTo NumericScalePrecXError

    Dim cnn As New ADODB.Connection
    Dim cat As New ADOX.Catalog
    Dim tblOD As ADOX.Table
    Dim colLoop As ADOX.Column

    ' Connect the catalog.
    cnn.Open "Provider='Microsoft.Jet.OLEDB.4.0';" & _
        "data source='c:\Program Files\" & _
        "Microsoft Office\Office\Samples\Northwind.mdb';"
    Set cat.ActiveConnection = cnn

    ' Retrieve the Order Details table
    Set tblOD = cat.Tables("Order Details")

    ' Display numeric scale and precision of
    ' small integer fields.
    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

    'Clean up
    cnn.Close
    Set cat = Nothing
    Set cnn = Nothing
    Exit Sub

NumericScalePrecXError:
    Set cat = Nothing

    If Not cnn Is Nothing Then
        If cnn.State = adStateOpen Then cnn.Close
    End If
    Set cnn = Nothing

    If Err <> 0 Then
        MsgBox Err.Source & "-->" & Err.Description, , "Error"
    End If
End Sub
' EndNumericScalePrecVB

Voir aussi

Column, objet | NumericScale, propriété | Precision, propriété


Exemple de collection Parameters et de propriété Command (VB)

Le code suivant indique comment utiliser la propriété Command avec l'objet Command pour extraire les informations de paramètres de la procédure.

' BeginParametersVB
Sub Main()
    On Error GoTo ProcedureParametersError

    Dim cnn As New ADODB.Connection
    Dim cmd As ADODB.Command
    Dim prm As ADODB.Parameter
    Dim cat As New ADOX.Catalog

    ' Open the Connection
    cnn.Open _
        "Provider='Microsoft.Jet.OLEDB.4.0';" & _
        "Data Source='c:\Program Files\Microsoft Office\" & _
        "Office\Samples\Northwind.mdb';"

    ' Open the catalog
    Set cat.ActiveConnection = cnn

    ' Get the command object
    Set cmd = cat.Procedures("CustomerById").Command

    ' Retrieve Parameter information
    cmd.Parameters.Refresh
    For Each prm In cmd.Parameters
        Debug.Print prm.Name & ":" & prm.Type
    Next

    'Clean up
    cnn.Close
    Set cat = Nothing
    Set cmd = Nothing
    Set cnn = Nothing
    Exit Sub

ProcedureParametersError:

    Set cat = Nothing
    Set cmd = Nothing

    If Not cnn Is Nothing Then
        If cnn.State = adStateOpen Then cnn.Close
    End If
    Set cnn = Nothing

    If Err <> 0 Then
        MsgBox Err.Source & "-->" & Err.Description, , "Error"
    End If
End Sub
' EndParametersVB

Voir aussi

ActiveConnection, propriété | Catalog, objet | Command, propriété | Procedure, objet | Procedures, collection


Exemple de propriété ParentCatalog (VB)

Le code suivant indique comment utiliser la propriété ParentCatalog pour accéder à une propriété spécifique d'un fournisseur avant d'ajouter une table à un catalogue. Cette propriété est AutoIncrement, qui crée un champ AutoIncrement dans une base de données Microsoft Jet.

' BeginCreateAutoIncrColumnVB
Sub Main()
    On Error GoTo CreateAutoIncrColumnError

    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:\Program Files\" & _
        "Microsoft Office\Office\Samples\Northwind.mdb';"
    Set cat.ActiveConnection = cnn

    With tbl
        .Name = "MyContacts"
        Set .ParentCatalog = cat
        ' Create fields and append them to the new Table object.
        .Columns.Append "ContactId", adInteger
        ' Make the ContactId column and auto incrementing column
        .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
    Debug.Print "Table 'MyContacts' is added."

    ' Delete the table as this is a demonstration.
    cat.Tables.Delete tbl.Name
    Debug.Print "Table 'MyContacts' is delete."

    'Clean up
    cnn.Close
    Set cat = Nothing
    Set tbl = Nothing
    Set cnn = Nothing
    Exit Sub

CreateAutoIncrColumnError:

    Set cat = Nothing
    Set tbl = Nothing

    If Not cnn Is Nothing Then
        If cnn.State = adStateOpen Then cnn.Close
    End If
    Set cnn = Nothing

    If Err <> 0 Then
        MsgBox Err.Source & "-->" & Err.Description, , "Error"
    End If

End Sub
' EndCreateAutoIncrColumnVB

Voir aussi

Append, méthode (Columns) | Append, méthode (Tables) | Catalog, objet | Column, objet | Columns, collection | Name, propriété | ParentCatalog, propriété | Table, objet | Type, propriété (Column)


Exemple de propriétés PrimaryKey et Unique (VB)

Cet exemple montre comment utiliser les propriétés PrimaryKey et Unique d'un Index. Le code crée une table avec deux colonnes. Les propriétés PrimaryKey et Unique sont utilisées pour faire d'une colonne la clé primaire pour laquelle les valeurs dupliquées ne sont pas autorisées.

' BeginPrimaryKeyVB
Sub Main()
    On Error GoTo PrimaryKeyXError

    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

    ' Connect the catalog
    catNorthwind.ActiveConnection = "Provider='Microsoft.Jet.OLEDB.4.0';" & _
        "Data Source='c:\Program Files\" & _
        "Microsoft Office\Office\Samples\Northwind.mdb';"

    ' Name new table
    tblNew.Name = "NewTable"

    ' Append a numeric and a text field to new table.
    tblNew.Columns.Append "NumField", adInteger, 20
    tblNew.Columns.Append "TextField", adVarWChar, 20

    ' Append new Primary Key index on NumField column
    ' to new table
    idxNew.Name = "NumIndex"
    idxNew.Columns.Append "NumField"
    idxNew.PrimaryKey = True
    idxNew.Unique = True
    tblNew.Indexes.Append idxNew

    ' Append an index on Textfield to new table.
    ' Note the different technique: Specifying index and
    ' column name as parameters of the Append method
    tblNew.Indexes.Append "TextIndex", "TextField"

    ' Append the new table
    catNorthwind.Tables.Append tblNew

    With tblNew
        Debug.Print tblNew.Indexes.Count & " Indexes in " & _
            tblNew.Name & " Table"

        ' Enumerate Indexes collection.
        For Each idxLoop In .Indexes
            With idxLoop
                Debug.Print "Index " & .Name
                Debug.Print "   Primary key = " & .PrimaryKey
                Debug.Print "   Unique = " & .Unique

                ' Enumerate Columns collection of each Index
                ' object.
                Debug.Print "    Columns"
                For Each colLoop In .Columns
                    Debug.Print "       " & colLoop.Name
                Next colLoop
            End With
        Next idxLoop

    End With

    ' Delete new table as this is a demonstration.
    catNorthwind.Tables.Delete tblNew.Name

    'Clean up
    Set catNorthwind.ActiveConnection = Nothing
    Set catNorthwind = Nothing
    Set tblNew = Nothing
    Set idxNew = Nothing
    Set idxLoop = Nothing
    Set colLoop = Nothing
    Exit Sub

PrimaryKeyXError:

    Set catNorthwind = Nothing
    Set tblNew = Nothing
    Set idxNew = Nothing
    Set idxLoop = Nothing
    Set colLoop = Nothing

    If Err <> 0 Then
        MsgBox Err.Source & "-->" & Err.Description, , "Error"
    End If
End Sub
' EndPrimaryKeyVB

Index, objet | PrimaryKey, propriété | Unique, propriété


Exemple de méthode Procedures Append (VB)

Le code suivant indique comment utiliser un objet Command et la méthode Append de la collection Procedures pour créer une procédure dans la source de données sous-jacente.

' BeginCreateProcedureVB
Sub Main()
    On Error GoTo CreateProcedureError

    Dim cnn As New ADODB.Connection
    Dim cmd As New ADODB.Command
    Dim prm As ADODB.Parameter
    Dim cat As New ADOX.Catalog

    ' Open the Connection
    cnn.Open _
        "Provider='Microsoft.Jet.OLEDB.4.0';" & _
        "Data Source='c:\Program Files\Microsoft Office\" & _
        "Office\Samples\Northwind.mdb';"

    ' Create the parameterized command (Microsoft Jet specific)
    Set cmd.ActiveConnection = cnn
    cmd.CommandText = "PARAMETERS [CustId] Text;" & _
    "Select * From Customers Where CustomerId = [CustId]"

    ' Open the Catalog
    Set cat.ActiveConnection = cnn

    ' Create the new Procedure
    cat.Procedures.Append "CustomerById", cmd

    'Clean
    cnn.Close
    Set cat = Nothing
    Set cmd = Nothing
    Set cnn = Nothing
    Exit Sub

CreateProcedureError:
    Set cat = Nothing
    Set cmd = Nothing

    If Not cnn Is Nothing Then
        If cnn.State = adStateOpen Then cnn.Close
    End If
    Set cnn = Nothing

    If Err <> 0 Then
        MsgBox Err.Source & "-->" & Err.Description, , "Error"
    End If
End Sub
' EndCreateProcedureVB

Voir aussi

ActiveConnection, propriété | Append, méthode (Procedures) | Catalog, objet | Procedure, objet | Procedures, collection


Exemple de méthode Procedures Delete (VB)

Le code suivant indique comment supprimer une procédure à l'aide de la méthode Delete de la collection Procedures.

' BeginDeleteProcedureVB
Sub Main()
    On Error GoTo DeleteProcedureError

    Dim cat As New ADOX.Catalog

    ' Open the Catalog.
    cat.ActiveConnection = _
        "Provider='Microsoft.Jet.OLEDB.4.0';" & _
        "Data Source='c:\Program Files\Microsoft Office\" & _
        "Office\Samples\Northwind.mdb';"

    ' Delete the Procedure.
    cat.Procedures.Delete "CustomerById"

    'Clean up
    Set cat.ActiveConnection = Nothing
    Set cat = Nothing
    Exit Sub

DeleteProcedureError:
    Set cat = Nothing

    If Err <> 0 Then
        MsgBox Err.Source & "-->" & Err.Description, , "Error"
    End If
End Sub
' EndDeleteProcedureVB

Voir aussi

ActiveConnection, propriété | Catalog, objet | Delete, méthode (Collections) | Procedure, objet | Procedures, collection


Exemple de méthode Procedures Refresh (VB)

Le code suivant indique comment actualiser la collection Procedures d'un objet Catalog. Cette opération est nécessaire pour l'accès aux objets Procedure à partir du Catalog.

' BeginProceduresRefreshVB
Sub Main()
    On Error GoTo ProcedureRefreshError

    Dim cat As New ADOX.Catalog

    ' Open the Catalog
    cat.ActiveConnection = _
        "Provider='Microsoft.Jet.OLEDB.4.0';" & _
        "Data Source='c:\Program Files\" & _
        "Microsoft Office\Office\Samples\Northwind.mdb';"

    ' Refresh the Procedures collection
    cat.Procedures.Refresh

    'Clean up
    Set cat.ActiveConnection = Nothing
    Set cat = Nothing
    Exit Sub

ProcedureRefreshError:
    Set cat = Nothing

    If Err <> 0 Then
        MsgBox Err.Source & "-->" & Err.Description, , "Error"
    End If
End Sub
' EndProceduresRefreshVB

Catalog, objet | Procedures, collection | Refresh, méthode


Exemple de propriété SortOrder (VB)

Cet exemple illustre l'utilisation de la propriété SortOrder d'une Column déjà ajoutée à la collection Columns d'un Index. Le code ajoute l'index trié dans un ordre croissant à la colonne Country dans la table Employees, puis affiche les enregistrements. Le code ajoute ensuite l'index trié dans un ordre décroissant à la colonne Country dans la table Employees puis affiche de nouveau les enregistrements. La différence entre les index croissant et décroissant est indiquée.

' BeginSortOrderVB
Sub Main()
    On Error GoTo SortOrderXError

    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

    ' Connect the catalog.
    cnn.Open "Provider='Microsoft.Jet.OLEDB.4.0';" & _
        "Data Source='c:\Program Files\" & _
        "Microsoft Office\Office\Samples\Northwind.mdb';"
    Set catNorthwind.ActiveConnection = cnn

    ' Append Country column to new index
    idxAscending.Columns.Append "Country"
    idxAscending.Columns("Country").SortOrder = adSortAscending
    idxAscending.Name = "Ascending"
    idxAscending.IndexNulls = adIndexNullsAllow

    'Append new index to Employees table
    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"

        ' Enumerate the Recordset. The value of the
        ' IndexNulls property will determine if the newly
        ' added record appears in the output.
        Do While Not .EOF
            Debug.Print "    " & !Country & " - " & _
                !FirstName & " " & !LastName
            .MoveNext
        Loop

        .Close
    End With

    ' Append Country column to new index
    idxDescending.Columns.Append "Country"
    idxDescending.Columns("Country").SortOrder = adSortDescending
    idxDescending.Name = "Descending"
    idxDescending.IndexNulls = adIndexNullsAllow

    'Append descending index to Employees table
    catNorthwind.Tables("Employees").Indexes.Append idxDescending

    rstEmployees.Index = idxDescending.Name
    rstEmployees.Open "Employees", cnn, adOpenKeyset, _
        adLockOptimistic, adCmdTableDirect

    With rstEmployees
        .MoveFirst
        Debug.Print "Index = " & .Index
        Debug.Print "  Country - Name"

        ' Enumerate the Recordset. The value of the
        ' IndexNulls property will determine if the newly
        ' added record appears in the output.
        Do While Not .EOF
            Debug.Print "    " & !Country & " - " & _
                !FirstName & " " & !LastName
            .MoveNext
        Loop

        .Close
    End With

    ' Delete new Indexes because this is a demonstration.
    catNorthwind.Tables("Employees").Indexes.Delete idxAscending.Name
    catNorthwind.Tables("Employees").Indexes.Delete idxDescending.Name

    'Clean up
    cnn.Close
    Set catNorthwind = Nothing
    Set idxAscending = Nothing
    Set idxDescending = Nothing
    Set rstEmployees = Nothing
    Set cnn = Nothing
    Exit Sub

SortOrderXError:

    Set catNorthwind = Nothing
    Set idxAscending = Nothing
    Set idxDescending = Nothing

    If Not rstEmployees Is Nothing Then
        If rstEmployees.State = adStateOpen Then rstEmployees.Close
    End If
    Set rstEmployees = Nothing

    If Not cnn Is Nothing Then
        If cnn.State = adStateOpen Then cnn.Close
    End If
    Set cnn = Nothing

    If Err <> 0 Then
        MsgBox Err.Source & "-->" & Err.Description, , "Error"
    End If
End Sub
' EndSortOrderVB

Voir aussi

Column, objet | Columns, collection | Index, objet | SortOrder, propriété


Exemple de collections Views et Fields (VB)

Le code suivant indique comment utiliser la propriété Command et l'objet Recordset pour extraire des informations de champ pour l'affichage.

' BeginViewFieldsVB
Sub ViewFields()
    On Error GoTo ViewFieldsError

    Dim cnn As New ADODB.Connection
    Dim rst As New ADODB.Recordset
    Dim fld As ADODB.Field
    Dim cat As New ADOX.Catalog

    ' Open the Connection
    cnn.Open _
        "Provider='Microsoft.Jet.OLEDB.4.0';" & _
        "Data Source='c:\Program Files\Microsoft Office\" & _
        "Office\Samples\Northwind.mdb';"

    ' Open the catalog
    Set cat.ActiveConnection = cnn

    ' Set the Source for the Recordset
    Set rst.Source = cat.Views("AllCustomers").Command

    ' Retrieve Field information
    rst.Fields.Refresh
    For Each fld In rst.Fields
        Debug.Print fld.Name & ":" & fld.Type
    Next

    'Clean up
    cnn.Close
    Set cat = Nothing
    Set rst = Nothing
    Set cnn = Nothing
    Exit Sub

ViewFieldsError:

    If Not cnn Is Nothing Then
        If cnn.State = adStateOpen Then cnn.Close
    End If

    Set cat = Nothing
    Set rst = Nothing
    Set cnn = Nothing

    If Err <> 0 Then
        MsgBox Err.Source & "-->" & Err.Description, , "Error"
    End If

End Sub
' EndViewFieldsVB

Voir aussi

ActiveConnection, propriété | Catalog, objet | Command, propriété | View, objet | Views, collection


Exemple de méthode Views Append (VB)

Le code suivant indique comment utiliser un objet Command et la méthode Append de la collection Views pour créer une vue dans la source de données sous-jacente.

' BeginCreateViewVB
Sub Main()
    On Error GoTo CreateViewError

    Dim cmd As New ADODB.Command
    Dim cat As New ADOX.Catalog

    ' Open the Catalog
    cat.ActiveConnection = _
        "Provider='Microsoft.Jet.OLEDB.4.0';" & _
        "Data Source='c:\Program Files\Microsoft Office\" & _
        "Office\Samples\Northwind.mdb';"

    ' Create the command representing the view.
    cmd.CommandText = "Select * From Customers"

    ' Create the new View
    cat.Views.Append "AllCustomers", cmd

    'Clean up
    Set cat.ActiveConnection = Nothing
    Set cat = Nothing
    Set cmd = Nothing
    Exit Sub

CreateViewError:

    Set cat = Nothing
    Set cmd = Nothing

    If Err <> 0 Then
        MsgBox Err.Source & "-->" & Err.Description, , "Error"
    End If
End Sub
' EndCreateViewVB

Voir aussi

ActiveConnection, propriété | Append, méthode (Views) | Catalog, objet | View, objet | Views, collection


Exemple de collection Views et de propriété CommandText (VB)

Le code suivant indique comment utiliser la propriété Command pour mettre à jour le texte d'une vue.

' BeginViewsCollectionVB
Sub Main()
    On Error GoTo ViewTextError

    Dim cnn As New ADODB.Connection
    Dim cat As New ADOX.Catalog
    Dim cmd As New ADODB.Command

    ' Open the Connection
    cnn.Open _
        "Provider='Microsoft.Jet.OLEDB.4.0';" & _
        "Data Source='c:\Program Files\Microsoft Office\" & _
        "Office\Samples\Northwind.mdb';"

    ' Open the catalog
    Set cat.ActiveConnection = cnn

    ' Get the command
    Set cmd = cat.Views("AllCustomers").Command

    ' Update the CommandText of the Command
    cmd.CommandText = _
    "Select CustomerId, CompanyName, ContactName From Customers"

    ' Update the View
    Set cat.Views("AllCustomers").Command = cmd

    'Clean up
    cnn.Close
    Set cat = Nothing
    Set cmd = Nothing
    Set cnn = Nothing
    Exit Sub

ViewTextError:

    Set cat = Nothing
    Set cmd = Nothing

    If Not cnn Is Nothing Then
        If cnn.State = adStateOpen Then cnn.Close
    End If
    Set cnn = Nothing

    If Err <> 0 Then
        MsgBox Err.Source & "-->" & Err.Description, , "Error"
    End If
End Sub
' EndViewsCollectionVB

Voir aussi

ActiveConnection, propriété | Catalog, objet | Command, propriété | View, objet | Views, collection


Exemple de méthode Views Delete (VB)

Le code suivant indique comment utiliser la méthode Delete pour supprimer une vue du catalogue.

' BeginDeleteViewVB
Sub Main()
    On Error GoTo DeleteViewError

    Dim cat As New ADOX.Catalog

    ' Open the catalog
    cat.ActiveConnection = "Provider='Microsoft.Jet.OLEDB.4.0';" & _
        "Data Source='c:\Program Files\Microsoft Office\" & _
        "Office\Samples\Northwind.mdb';"

    'Delete the View
    cat.Views.Delete "AllCustomers"

    'Clean up
    Set cat.ActiveConnection = Nothing
    Set cat = Nothing
    Exit Sub

DeleteViewError:
    Set cat = Nothing

    If Err <> 0 Then
        MsgBox Err.Source & "-->" & Err.Description, , "Error"
    End If
End Sub
' EndDeleteViewVB

Delete, méthode (Collections) | Views, collection


Exemple de méthode Views Refresh (VB)

Le code suivant indique comment actualiser la collection Views d'un objet Catalog. Cette opération est nécessaire pour l'accès aux objets Views à partir du Catalog.

' BeginViewsRefreshVB
Sub Main()
    On Error GoTo ProcedureViewsRefreshError

    Dim cat As New ADOX.Catalog

    ' Open the Catalog
    cat.ActiveConnection = "Provider='Microsoft.Jet.OLEDB.4.0';" & _
        "Data Source='c:\Program Files\" & _
        "Microsoft Office\Office\Samples\Northwind.mdb';"

    ' Refresh the Procedures collection
    cat.Views.Refresh

    'Clean up
    Set cat = Nothing
    Exit Sub

ProcedureViewsRefreshError:

    If Not cat Is Nothing Then
        Set cat = Nothing
    End If

    If Err <> 0 Then
        MsgBox Err.Source & "-->" & Err.Description, , "Error"
    End If
End Sub
' EndViewsRefreshVB

Refresh, méthode | Views, collection


Exemples de code ADOX en Microsoft Visual C++

Les rubriques ci-dessous proposent des exemples de code qui vous permettront de comprendre l'utilisation d'ADOX. Tous les exemples de code sont écrits en Microsoft Visual C++.

Note Collez l'exemple de code dans sa totalité, du début à la fin, dans votre éditeur de code. Si vous utilisez des parties d'exemple ou si la mise en forme des paragraphes est perdue, l'exemple risque de ne pas fonctionner correctement.

Méthodes

  • Exemple de méthodes Columns et Tables Append, et de propriété Name (VC++)
  • Exemple de méthode Connection Close, et de propriété Table Type (VC++)
  • Exemple de méthode Create (VC++)
  • Exemple de méthodes GetObjectOwner et SetObjectOwner (VC++)
  • Exemple de méthodes GetPermissions et SetPermissions (VC++)
  • Exemple de méthodes Groups et Users Append, ChangePassword (VC++)
  • Exemple de méthode Indexes Append (VC++)
  • Exemple de méthode Keys Append, et de propriétés Key Type, RelatedColumn, RelatedTable et UpdateRule (VC++)

Propriétés

  • Exemple de propriété Attributes (VC++)
  • Exemple de propriété Catalog ActiveConnection (VC++)
  • Exemple de propriété Clustered (VC++)
  • Exemple de propriétés Command et CommandText (VC++)
  • Exemple de collection Parameters et de propriété Command (VC++)
  • Exemple de propriétés DateCreated et DateModified (VC++)
  • Exemple de propriété DefinedSize (VC++)
  • Exemple de propriété DeleteRule (VC++)
  • Exemple de propriété IndexNulls (VC++)
  • Exemple de propriétés Key Type, RelatedColumn, RelatedTable, UpdateRule et de méthode Keys Append (VC++)
  • Exemple de propriété Name et de méthodes Columns et Tables Append (VC++)
  • Exemple de propriétés NumericScale et Precision (VC++)
  • Exemple de propriété ParentCatalog (VC++)
  • Exemple de propriétés PrimaryKey et Unique (VC++)
  • Exemple de propriété Table Type et de méthode Connection Close (VC++)

Collections

  • Exemple de collection Parameters et de propriété Command (VC++)


Exemple de propriété Attributes (VC++)

Cet exemple montre comment utiliser la propriété Attributes d'un objet Column. Quand elle a pour valeur adColNullable, cette propriété permet d'attribuer une chaîne vide comme valeur à un Field de Recordset. Dans cette situation, l'utilisateur peut distinguer un enregistrement où les données ne sont pas connues d'un enregistrement où les données ne s'appliquent pas.

// BeginAttributesCpp
#import "c:\Program Files\Common Files\system\ado\msado15.dll"
#import "c:\Program Files\Common Files\system\ado\msadox.dll" \
    no_namespace

#include "iostream.h"
#include "stdio.h"
#include "conio.h"
#include "ADOXAttributesX.h"

//Function declarations
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void AttributesX(void);
inline char* mygets(char* strDest, int n)
{
    char strExBuff[10];
    char* pstrRet = fgets(strDest, n, stdin);

    if (pstrRet == NULL)
        return NULL;

    if (!strrchr(strDest, '\n'))
        // Exhaust the input buffer.
        do
        {
            fgets(strExBuff, sizeof(strExBuff), stdin);
        }while (!strrchr(strExBuff, '\n'));
    else
        // Replace '\n' with '\0'
        strDest[strrchr(strDest, '\n') - strDest] = '\0';

    return pstrRet;
}

//////////////////////////////////////////////////////////
//                                                      //
//         Main Function                                //
//                                                      //
//////////////////////////////////////////////////////////
void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    AttributesX();

    ::CoUninitialize();
}

//////////////////////////////////////////////////////////
//                                                      //
//        AttributesX Function                          //
//                                                      //
//////////////////////////////////////////////////////////
void AttributesX(void)
{
    HRESULT hr = S_OK;

    // Define ADOX object pointers.
    // Initialize pointers on define.
    // These are in the ADOX::  namespace.
    _CatalogPtr m_pCatalog  = NULL;
    _ColumnPtr m_pColumn  = NULL;
    _TablePtr m_pTable  = NULL;

    // Define ADODB object pointers
    ADODB::_ConnectionPtr m_pCnn         = NULL;
    ADODB::_RecordsetPtr m_pRstEmployees  = NULL;

    IADORecordBinding *picRs  = NULL;   // Interface Pointer Declared
    CEmployeeRs emprs;            // C++ Class Object

    // Define string variables.
    _bstr_t strcnn("Provider='Microsoft.JET.OLEDB.4.0';"
        "Data Source= 'c:\\Program Files\\Microsoft Office\\"
        "Office\\Samples\\Northwind.mdb';");

    try
    {
        // Connect the catalog.
        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");

        // Create a new Field object and append it to the Fields
        // collection of the Employees table.
        m_pColumn->Name = "FaxPhone";
        m_pColumn->Type = adVarWChar;
        m_pColumn->DefinedSize = 24;
        m_pColumn->Attributes = adColNullable;

        m_pCatalog->Tables->GetItem("Employees")->Columns->
            Append(m_pColumn->Name, adVarWChar, 24);
            //Append("FaxPhone",adVarWChar,24);

        // Open the Employees table for updating as a Recordset.
        m_pRstEmployees->Open("Employees",
            _variant_t((IDispatch *) m_pCnn),
            ADODB::adOpenKeyset,ADODB::adLockOptimistic,
            ADODB::adCmdTable);

        // Get user input.
        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];
        mygets(strInput, 10);
        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();

            // Open an IADORecordBinding interface pointer which
            // we will use for binding Recordset to a class
            TESTHR(hr = m_pRstEmployees->QueryInterface(
                __uuidof(IADORecordBinding),(LPVOID*)&picRs));

            // Bind the Recordset to a C++ class here
            TESTHR(hr = picRs->BindToRecordset(&emprs));

            // Print report.
            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]\n");
            else if (strcmp((LPSTR)emprs.m_szemp_Faxphone,"") == 0)
                printf("- [Has no fax]\n");
            else
                printf("- %s\n",emprs.m_szemp_Faxphone);

        }

        // Delete new field because this is a demonstration.
        //m_pTable->Columns->Delete(m_pColumn->Name);
    }
    catch(_com_error &e)
    {
        // Notify the user of errors if any.
        _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 AttributesX...."<< endl;
    }

    if (m_pRstEmployees)
        if (m_pRstEmployees->State == 1)
            m_pRstEmployees->Close();

    // Delete new field because this is a demonstration.
    if (m_pTable != NULL)
        m_pTable->Columns->Delete(m_pColumn->Name);

    if (m_pCnn)
        if (m_pCnn->State == 1)
            m_pCnn->Close();

    // Release the IADORecordset Interface here
    if(picRs)
        picRs->Release();

}
// EndAttributesCpp

ADOXAttributesX.h

// BeginAttributesH
#include "icrsint.h"

//This class extracts LastName, FirstName, FaxPhone from Employees table

class CEmployeeRs : public CADORecordBinding
{
BEGIN_ADO_BINDING(CEmployeeRs)

        // Column LastName is the 2nd field in the table
        ADO_VARIABLE_LENGTH_ENTRY2(2,adVarChar,m_szemp_LastName,
            sizeof(m_szemp_LastName),lemp_LastNameStatus,TRUE)

        // Column FirstName is the 17th field in the table
        ADO_VARIABLE_LENGTH_ENTRY2(17,adVarChar,m_szemp_FirstName,
            sizeof(m_szemp_FirstName),lemp_FirstNameStatus,TRUE)

        // Column FaxPhone is the 18th field in the table
        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;
};
// EndAttributesH

Attributes, propriété | Column, objet


Exemple de propriété Catalog ActiveConnection (VC++)

Lorsque vous affectez la propriété ActiveConnection à une connexion ouverte valide, le catalogue « s'ouvre ». À partir d'un catalogue ouvert, il est possible d'accéder aux objets schéma contenus dans ce catalogue.

// BeginActiveConnectionCpp
#import "c:\Program Files\Common Files\system\ado\msado15.dll"
#import "c:\Program Files\Common Files\system\ado\msadox.dll" \
    no_namespace

#include "iostream.h"
#include "stdio.h"
#include "conio.h"

// Function declarations
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void OpenConnectionX(void);
void OpenConnectionWithStringX(void);

//////////////////////////////////////////////////////////
//                                                      //
//         Main Function                                //
//                                                      //
//////////////////////////////////////////////////////////
void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    OpenConnectionX();

    OpenConnectionWithStringX();

    ::CoUninitialize();
}

//////////////////////////////////////////////////////////
//                                                      //
//     OpenConnectionX Function                         //
//                                                      //
//////////////////////////////////////////////////////////
void OpenConnectionX(void)
{
   HRESULT   hr = S_OK;

    // Define ADOX object pointers.
    // Initialize pointers on define.
    // These are in the ADOX::  namespace.
    _CatalogPtr m_pCatalog = NULL;

    //Define ADODB object pointers
    ADODB::_ConnectionPtr m_pCnn   = NULL;

    // Define string variables.
    _bstr_t strcnn("Provider='Microsoft.JET.OLEDB.4.0';"
        "Data source = 'c:\\Program Files\\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;
    }
    catch(_com_error &e)
    {
        // Notify the user of errors if any.
        _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 OpenConnectionX...."<< endl;
    }

    if (m_pCnn)
        if (m_pCnn->State == 1)
            m_pCnn->Close();
}

//////////////////////////////////////////////////////////
//                                                      //
//         OpenConnectionWithStringX Function           //
//                                                      //
//////////////////////////////////////////////////////////
void OpenConnectionWithStringX(void)
{
    HRESULT   hr = S_OK;

    // Define ADOX object pointers.
    // Initialize pointers on define.
    // These are in the ADOX::  namespace.
    _CatalogPtr m_pCatalog = NULL;

    // Define string variables.
    _bstr_t strcnn("Provider='Microsoft.JET.OLEDB.4.0';"
                "Data source = 'c:\\Program Files\\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)
    {
        // Notify the user of errors if any.
        _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 OpenConnectionWithStringX...."<< endl;
    }
}
// EndActiveConnectionCpp

ActiveConnection, propriété


Exemple de propriété Clustered (VC++)

Cet exemple montre comment utiliser la propriété Clustered d'un objet Index. Les bases de données Microsoft Jet ne prennent pas en charge les index ordonnés en clusters, de sorte que cet exemple renverra la valeur False pour la propriété Clustered de tous les index dans la base de données Northwind.

// BeginClusteredCpp
#import "c:\Program Files\Common Files\system\ado\msadox.dll" \
    no_namespace

#include "iostream.h"
#include "stdio.h"
#include "conio.h"

//Function declarations
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void ClusteredX(void);

//////////////////////////////////////////////////////////
//                                                      //
//     Main Function                                    //
//                                                      //
//////////////////////////////////////////////////////////
void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    ClusteredX();

    ::CoUninitialize();
}

//////////////////////////////////////////////////////////
//                                                      //
//       ClusteredX Function                            //
//                                                      //
//////////////////////////////////////////////////////////
void ClusteredX()
{
    HRESULT hr = S_OK;

    // Define ADOX object pointers.
    // Initialize pointers on define.
    // These are in the ADOX::  namespace.
    _CatalogPtr m_pCatalog = NULL;
    _TablePtr m_pTable = NULL;
    _IndexPtr m_pIndex = NULL;

    //Define other variables here
    _variant_t vIndex;
    try
    {
        TESTHR(hr = m_pCatalog.CreateInstance(__uuidof(Catalog)));

        // Connect to the catalog.
        m_pCatalog->PutActiveConnection(
            "Provider='Microsoft.JET.OLEDB.4.0';data source="
            "'c:\\Program Files\\Microsoft Office\\Office\\Samples"
            "\\Northwind.mdb';");

        int iLineCnt = 1;
        //Enumerate Tables.
        for(short iTable = 0;iTable < m_pCatalog->Tables->Count;iTable++)
        {
            vIndex = iTable;
            m_pTable = m_pCatalog->Tables->GetItem(vIndex);

            //Enumerate Indexes.
            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)
    {
        // Notify the user of errors if any.
        _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 ClusteredX...."<< endl;
    }
}
// EndClusteredCpp

Clustered, propriété | Index, objet


Exemple de méthodes Columns et Tables Append, et de propriété Name (VC++)

Le code suivant indique comment créer une table.

// BeginCreateTableCpp
#import "c:\Program Files\Common Files\system\ado\msadox.dll" \
    no_namespace

#include "iostream.h"
#include "stdio.h"
#include "conio.h"

//Function declarations
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void CreateTableX(void);

//////////////////////////////////////////////////////////
//                                                      //
//       Main Function                                  //
//                                                      //
//////////////////////////////////////////////////////////
void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    CreateTableX();

    ::CoUninitialize();
}

//////////////////////////////////////////////////////////
//                                                      //
//       CreateTableX Function                          //
//                                                      //
//////////////////////////////////////////////////////////
void CreateTableX()
{
        HRESULT hr = S_OK;

        // Define ADOX object pointers.
        // Initialize pointers on define.
        // These are in the ADOX::  namespace.
        _CatalogPtr m_pCatalog = NULL;
        _TablePtr m_pTable = NULL;

        try
        {
            TESTHR(hr = m_pCatalog.CreateInstance(__uuidof(Catalog)));

            //Open the catalog
            m_pCatalog->PutActiveConnection(
                "Provider='Microsoft.JET.OLEDB.4.0';" \
                "data source='c:\\Program Files\\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));
            printf("Table 'MyTable' is added.\n");

            // Delete the table as this is a demonstration.
            m_pCatalog->Tables->Delete("MyTable");
            printf("Table 'MyTable' is deleted.\n");
        }

    catch(_com_error &e)
    {
        // Notify the user of errors if any.
        _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;
    }
}
// EndCreateTableCpp

Voir aussi

Append, méthode (Columns) | Append, méthode (Tables) | Name, propriété


Exemple de propriétés Command et CommandText (VC++)

Le code suivant indique comment utiliser la propriété Command pour mettre à jour le texte d'une procédure.

// BeginCommandTextCpp
// This sample runs correctly only if procedure 'CustomerById'
// exists. If the procedure doesn't exist, please use
// 'ADOXProceduresAppend.cpp' to creat it.

#import "c:\Program Files\Common Files\system\ado\msadox.dll" \
    no_namespace
#import "c:\Program Files\Common Files\system\ado\msado15.dll"

#include "iostream.h"
#include "stdio.h"
#include "conio.h"

//Function declarations
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void ProcedureTextX(void);

//////////////////////////////////////////////////////////
//                                                      //
//      Main Function                                   //
//                                                      //
//////////////////////////////////////////////////////////
void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    ProcedureTextX();

    ::CoUninitialize();
}

//////////////////////////////////////////////////////////
//                                                      //
//       ProcedureTextX Function                        //
//                                                      //
//////////////////////////////////////////////////////////
void ProcedureTextX()
{
    HRESULT hr = S_OK;

    // Define ADOX object pointers.
    // Initialize pointers on define.
    // These are in the ADOX::  namespace.
    _CatalogPtr m_pCatalog = NULL;

    // Define ADODB object pointers.
    ADODB::_ConnectionPtr m_pCnn = NULL;
    ADODB::_CommandPtr m_pCommand = NULL;

    try
    {
        //Open the Connection
        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:\\Program Files\\Microsoft Office"
            "\\Office\\Samples\\Northwind.mdb';","","",NULL);

        // Open the catalog
        m_pCatalog->PutActiveConnection(_variant_t((IDispatch *)m_pCnn));

        // Get the Command
        m_pCommand = m_pCatalog->Procedures->GetItem("CustomerById")->GetCommand();

        // Update the CommandText
        m_pCommand->PutCommandText("PARAMETERS [CustId] Text;select "
            "CustomerId, CompanyName, ContactName "
            "from Customers where CustomerId = [CustId]");
        printf("CommandText is updated.\n");

        // Update the Procedure
        m_pCatalog->Procedures->GetItem("CustomerById")->PutCommand(
            _variant_t((IDispatch *)m_pCommand));
        printf("Procedure 'CustomerById' is updated.\n");
    }
    catch(_com_error &e)
    {
        // Notify the user of errors if any.
        _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 ProcedureTextX...."<< endl;
    }
}
// EndCommandTextCpp

Command, propriété


Exemple de méthode Connection Close, et de propriété Table Type (VC++)

Lorsque la valeur Nothing est affectée à la propriété ActiveConnection, le catalogue « se ferme ». Les collections associées sont vides. Les objets créés à partir d'objets schéma du catalogue sont orphelins. Les propriétés de ces objets qui ont été mises en cache restent disponibles, mais les tentatives de lire des propriétés qui requièrent l'appel du fournisseur échouent.

// BeginCloseConnectionCpp
#import "c:\Program Files\Common Files\system\ado\msadox.dll" \
    no_namespace
#import "c:\Program Files\Common Files\system\ado\msado15.dll"

#include "iostream.h"
#include "stdio.h"
#include "conio.h"

//Function declarations
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void CloseConnectionByNothingX(void);
void CloseConnectionX(void);

//////////////////////////////////////////////////////////
//                                                      //
//     Main Function                                    //
//                                                      //
//////////////////////////////////////////////////////////
void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    CloseConnectionByNothingX();
    CloseConnectionX();

    ::CoUninitialize();
}

//////////////////////////////////////////////////////////
//                                                      //
//        CloseConnectionByNothingX Function            //
//                                                      //
//////////////////////////////////////////////////////////
void CloseConnectionByNothingX(void)
{
    HRESULT hr = S_OK;

    // Define ADOX object pointers.
    // Initialize pointers on define.
    // These are in the ADOX::  namespace.

    _CatalogPtr m_pCatalog = NULL;
    _TablePtr m_pTable = NULL;

    //Define ADODB object pointers
    ADODB::_ConnectionPtr m_pCnn = NULL;

    //Define other variables
    _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:\\Program Files\\Microsoft Office\\"
            "Office\\Samples\\Northwind.mdb';","","",NULL);

        m_pCatalog->PutActiveConnection(_variant_t((IDispatch *)m_pCnn));

        m_pTable = m_pCatalog->Tables->GetItem(vIndex);

        // Cache m_pTable.Type info
        cout << m_pTable->Type << endl;

        _variant_t vCnn;
        vCnn.vt = VT_DISPATCH;
        vCnn.pdispVal = NULL;
        m_pCatalog->PutActiveConnection(vCnn);

        // m_pTable is orphaned
        cout << m_pTable->Type << endl;
        // Previous line will succeed if this was cached

        cout << m_pTable->Columns->GetItem(vIndex)->DefinedSize << endl;
        // Previous line will fail if this info has not been cached
    }
    catch(_com_error &e)
    {
        // Notify the user of errors if any.
        _bstr_t bstrSource(e.Source());
        _bstr_t bstrDescription(e.Description());

        printf("\nError\n\tSource :  %s \n\tdescription : %s \n",
            (LPCSTR)bstrSource,(LPCSTR)bstrDescription);
    }
    catch(...)
    {
        cout << "Error occured in CloseConnectionByNothingX...."<< endl;
    }
}

//////////////////////////////////////////////////////////
//                                                      //
//     CloseConnectionX Function                        //
//                                                      //
//////////////////////////////////////////////////////////
void CloseConnectionX()
{
    HRESULT hr = S_OK;

    // Define ADOX object pointers.
    // Initialize pointers on define.
    // These are in the ADOX::  namespace.

    _CatalogPtr m_pCatalog = NULL;
    _TablePtr m_pTable = NULL;

    //Define ADODB object pointers
    ADODB::_ConnectionPtr m_pCnn = NULL;

    //Define other variables
    _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:\\Program Files\\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);

        // Cache m_pTable.Type info
        cout << m_pTable->Type << endl;

        m_pCnn->Close();

        // m_pTable is orphaned
        cout << m_pTable->Type << endl;
        // Previous line will succeed if this was cached

        cout << m_pTable->Columns->GetItem(vIndex)->DefinedSize << endl;
        // Previous line will fail if this info has not been cached
    }
    catch(_com_error &e)
    {
        // Notify the user of errors if any.
        _bstr_t bstrSource(e.Source());
        _bstr_t bstrDescription(e.Description());

        printf("\nError\n\tSource :  %s \n\tdescription : %s \n",
            (LPCSTR)bstrSource,(LPCSTR)bstrDescription);
    }
    catch(...)
    {
        cout << "Error occured in CloseConnectionX...."<< endl;
    }
}
// EndCloseConnectionCpp

ActiveConnection, propriété


Exemple de méthode Create (VC++)

Le code suivant indique comment créer une base de données Microsoft Jet au moyen de la méthode Create.

// BeginCreateDatabaseCpp
#import "c:\Program Files\Common Files\system\ado\msadox.dll" no_namespace
#import "c:\Program Files\Common Files\system\ado\msado15.dll"

#define TESTHR(x) if FAILED(x) _com_issue_error(x);

#include "iostream.h"
#include "stdio.h"
#include "conio.h"

//Function declarations
void CreateDatabaseX(void);

//------------------------------------------------------------//
//Main Function
//Purpose:  Test Driver
//------------------------------------------------------------//
void main()
{
    HRESULT hr = S_OK;

    hr = ::CoInitialize(NULL);
    if(SUCCEEDED(hr))
    {
        CreateDatabaseX();

        //Wait here for the user to see the output
        printf("Press any key to continue...");
        getch();

        ::CoUninitialize();
    }
}

//------------------------------------------------------------//
//CreateDatabaseX
//Purpose:  create a new Jet database with the Create method
//------------------------------------------------------------//
void CreateDatabaseX()
{
    HRESULT hr = S_OK;

    // Define ADOX object pointers.
    // Initialize pointers on define.
    // These are in the ADOX::  namespace.

    _CatalogPtr m_pCatalog = NULL;

    //Set ActiveConnection of Catalog to this string
    _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);
        printf("Database 'c:\\new.mdb' is created.\n");
    }
    catch(_com_error &e)
    {
        // Notify the user of errors if any.
        _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 CreateDatabaseX...."<< endl;
    }

}
// EndCreateDatabaseCpp

Create, méthode


Exemple de propriétés DateCreated et DateModified (VC++)

Cet exemple montre comment les propriétés DateCreated et DateModified sont utilisées par l'ajout d'un nouvel objet Column à une Table existante et la création d'une nouvelle Table. La procédure DateOutput est nécessaire à l'exécution de cet exemple.

// BeginDateCreatedCpp
#import "c:\Program Files\Common Files\system\ado\msadox.dll" \
    no_namespace
#import "c:\Program Files\Common Files\system\ado\msado15.dll"

#include "iostream.h"
#include "stdio.h"
#include "conio.h"

//Function declarations
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void DateCreatedX(void);
void DateOutPut(_bstr_t strTemp , _TablePtr tblTemp);

//////////////////////////////////////////////////////////
//                                                      //
//        Main Function                                 //
//                                                      //
//////////////////////////////////////////////////////////
void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    DateCreatedX();

    ::CoUninitialize();
}

//////////////////////////////////////////////////////////
//                                                      //
//       DateCreatedX Function                          //
//                                                      //
//////////////////////////////////////////////////////////
void DateCreatedX()
{
    HRESULT hr = S_OK;

    // Define ADOX object pointers.
    // Initialize pointers on define.
    // These are in the ADOX::  namespace.
    _CatalogPtr m_pCatalog = NULL;
    _TablePtr m_pTblEmployees = NULL;
    _TablePtr m_pTblNew = NULL;

    //Set ActiveConnection of Catalog to this string
    _bstr_t strCnn("Provider='Microsoft.JET.OLEDB.4.0';"
        "Data Source= 'c:\\Program Files\\Microsoft Office\\"
        "Office\\Samples\\Northwind.mdb';");

    try
    {
        TESTHR(hr = m_pCatalog.CreateInstance(__uuidof (Catalog)));

        // Connect the catalog.
        m_pCatalog->PutActiveConnection(strCnn);

        m_pTblEmployees = m_pCatalog->Tables->GetItem("Employees");

        // Print current information about the Employees table.
        DateOutPut((_bstr_t)"Current properties", m_pTblEmployees);

        // Create and append column to the Employees table.
        m_pTblEmployees->Columns->Append("NewColumn", adInteger,0);

        m_pCatalog->Tables->Refresh();

        // Print new information about the Employees table.
        DateOutPut((_bstr_t)"After creating a new column",
            m_pTblEmployees);

        // Delete new column because this is a demonstration.
        m_pTblEmployees->Columns->Delete("NewColumn");

        // Create and append new Table object to the Northwind database.
        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();

        //Print information about the new Table object.
        DateOutPut((_bstr_t)"After creating a new table", m_pCatalog->
            Tables->GetItem("NewTable"));

        // Delete new Table object because this is a demonstration.
        m_pCatalog->Tables->Delete(m_pTblNew->Name);
    }

    catch(_com_error &e)
    {
        // Notify the user of errors if any.
        _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 Function                           //
//                                                      //
//////////////////////////////////////////////////////////
void DateOutPut(_bstr_t strTemp , _TablePtr tblTemp)
{
    // Print DateCreated and DateModified information about
    // specified Table object.
    cout << strTemp << endl;
    cout << "    Table: " << tblTemp->GetName() << endl;
    cout << "        DateCreated = " << (_bstr_t)tblTemp->
        GetDateCreated() << endl;
    cout << "        DateModified = " << (_bstr_t)tblTemp->
        GetDateModified() << endl;
}
// EndDateCreatedCpp

Voir aussi

Column, objet | DateCreated, propriété | DateModified, propriété | Table, objet


Exemple de propriété DefinedSize (VC++)

Cet exemple montre comment utiliser la propriété DefinedSize d'un objet Column. Le code redéfinit la taille de la colonne FirstName de la table Employees dans la base de données Northwind. Ensuite, il affiche les modifications intervenues dans les valeurs du Field FirstName d'un Recordset basé sur la table Employees. Le champ FirstName devient, par défaut, rempli d'espaces après la redéfinition de la propriété DefinedSize.

// BeginDefinedSizeCpp
#import "c:\Program Files\Common Files\system\ado\msadox.dll" \
    no_namespace
#import "C:\Program Files\Common Files\System\ADO\msado15.dll" \
     rename("EOF", "EndOfFile")

#include "iostream.h"
#include "stdio.h"
#include "conio.h"

// Function declarations
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void DefinedSizeX(void);

//////////////////////////////////////////////////////////
//                                                      //
//      Main Function                                   //
//                                                      //
//////////////////////////////////////////////////////////
void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    DefinedSizeX();

    ::CoUninitialize();
}

//////////////////////////////////////////////////////////
//                                                      //
//      DefinedSizeX Function                           //
//                                                      //
//////////////////////////////////////////////////////////
void DefinedSizeX(void)
{
    HRESULT hr = S_OK;

    // Define ADOX object pointers.
    // Initialize pointers on define.
    // These are in the ADOX::  namespace.
    _CatalogPtr m_pCatNorthwind   = NULL;
    _ColumnPtr m_pColFirstName    = NULL;
    _ColumnPtr m_pColNewFirstName = NULL;

    // Define ADODB object pointers
    ADODB::_RecordsetPtr m_pRstEmployees  = NULL;

    // Define string variables.
    _bstr_t strCnn("Provider='Microsoft.JET.OLEDB.4.0';data source="
        "'c:\\Program Files\\Microsoft Office\\Office\\Samples\\"
        "Northwind.mdb';");
    _bstr_t aryFirstName[10];

    try
    {
        // Open a Recordset for the Employees table.
        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];

        // Open a catalog for the Northwind database,
        // using same connection as rstEmployees.
        m_pCatNorthwind->PutActiveConnection(m_pRstEmployees->
            GetActiveConnection());

        // Loop through the recordset displaying the contents,
        // of the FirstName field, the field's defined size,
        // and its actual size.
        // Also store FirstName values in aryFirstName array.
        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();

        // Redefine the DefinedSize of FirstName in the catalog.
        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;

        // Append new FirstName column to catalog.
        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);

        // Open Employee table in Recordset for updating.
        m_pRstEmployees->Open("Employees",m_pCatNorthwind->
            GetActiveConnection(),ADODB::adOpenKeyset,
            ADODB::adLockOptimistic,ADODB::adCmdTable);

        // Loop through the recordset displaying the contents
        // of the FirstName field,the field's defined size,
        // and its actual size.
        // Also restore FirstName values from aryFirstName.
        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();

        // Restore original FirstName column to catalog
        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);

        // Restore original FirstName values to Employees table.
        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++;
        }
    }
    catch(_com_error &e)
    {
        // Notify the user of errors if any.
        _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 DefinedSizeX...."<< endl;
    }

    if (m_pRstEmployees)
        if (m_pRstEmployees->State == 1)
            m_pRstEmployees->Close();

    m_pCatNorthwind = NULL;
}
// EndDefinedSizeCpp

Column, objet | DefinedSize, propriété


Exemple de propriété DeleteRule (VC++)

Cet exemple montre comment utiliser la propriété DeleteRule d'un objet Key. Le code ajoute une nouvelle Table puis définit une nouvelle clé primaire, en attribuant la valeur adRICascade à DeleteRule.

// BeginDeleteRuleCpp
#import "c:\Program Files\Common Files\system\ado\msadox.dll" \
    no_namespace
#import "c:\Program Files\Common Files\system\ado\msado15.dll"

#include "iostream.h"
#include "stdio.h"
#include "conio.h"

//Function declarations
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void DeleteRuleX(void);

//////////////////////////////////////////////////////////
//                                                      //
//      Main Function                                   //
//                                                      //
//////////////////////////////////////////////////////////
void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    DeleteRuleX();

    ::CoUninitialize();
}

//////////////////////////////////////////////////////////
//                                                      //
//       DeleteRuleX Function                           //
//                                                      //
//////////////////////////////////////////////////////////
void DeleteRuleX(void)
{
    HRESULT hr = S_OK;

    // Define ADOX object pointers.
    // Initialize pointers on define.
    // These are in the ADOX::  namespace.
    _KeyPtr m_pKeyPrimary = NULL;
    _CatalogPtr m_pCatalog   = NULL;
    _TablePtr m_pTblNew  = NULL;

    // Define string variables.
    _bstr_t strcnn("Provider='Microsoft.JET.OLEDB.4.0';"
                "Data source = 'c:\\Program Files\\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)));

        // Connect the catalog.
        m_pCatalog->PutActiveConnection(strcnn);

        // Name new table.
        m_pTblNew->Name = "NewTable";

        // Append a numeric and a text field to new table.
        m_pTblNew->Columns->Append("NumField",adInteger,20);
        m_pTblNew->Columns->Append("TextField",adVarWChar,20);

        // Append the new table.
        m_pCatalog->Tables->Append(_variant_t((IDispatch*)m_pTblNew));
        printf("Table 'NewTable' is added.\n");

        // Define the Primary key.
        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;

        //to pass an optional column parameter to Key's Apppend method
        _variant_t vOptional;
        vOptional.vt = VT_ERROR;
        vOptional.scode = DISP_E_PARAMNOTFOUND;

        // Append the primary key.
        m_pCatalog->Tables->GetItem("NewTable")->Keys->Append(
            _variant_t((IDispatch*)m_pKeyPrimary),
            adKeyPrimary,vOptional,L"",L"");

        // Delete the table as this is a demonstration.
        m_pCatalog->Tables->Delete(m_pTblNew->Name);
        printf("Table 'NewTable' is deleted.\n");
    }

    catch(_com_error &e)
    {
        // Notify the user of errors if any.
        _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;
    }
}
// EndDeleteRuleCpp

DeleteRule, propriété | Key, objet


Exemple de méthodes GetObjectOwner et SetObjectOwner (VC++)

Cet exemple met en application les méthodes GetObjectOwner et SetObjectOwner. Le fragment de code ci-après suppose l'existence du groupe Accounting (consultez Exemple de méthodes Groups et Users Append, ChangePassword (VC++) pour apprendre comment ajouter ce groupe au système). Le propriétaire de la table Categories est défini à Accounting.

// BeginOwnersCpp
#import "c:\Program Files\Common Files\system\ado\msadox.dll" no_namespace

#include "iostream.h"
#include "stdio.h"
#include "conio.h"

//Function declarations
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void OwnersX(void);

//////////////////////////////////////////////////////////
//                                                      //
//        Main Function                                 //
//                                                      //
//////////////////////////////////////////////////////////
void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    OwnersX();

        ::CoUninitialize();
}

//////////////////////////////////////////////////////////
//                                                      //
//      OwnersX Function                                //
//                                                      //
//////////////////////////////////////////////////////////
void OwnersX()
{
    HRESULT hr = S_OK;

    // Define ADOX object pointers.
    // Initialize pointers on define.
    // These are in the 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)));

        //Open the Catalog.
        m_pCatalog->PutActiveConnection(
            "Provider='Microsoft.JET.OLEDB.4.0';" \
            "data source='c:\\Program Files\\Microsoft Office\\"
            "Office\\Samples\\Northwind.mdb';"
            "jet oledb:system database='c:\\Program Files\\Microsoft Office\\"
            "Office\\system.mdw'");

        //Print the original owner of Categories
        _bstr_t strOwner = m_pCatalog->GetObjectOwner("Categories",
            adPermObjTable);
        cout << "Owner of Categories: " << strOwner << "\n" << endl;
        int iLineCnt = 2;

        //Create and append new group with a string.
        m_pCatalog->Groups->Append("Accounting");

        //Set the owner of Categories to Accounting.
        m_pCatalog->SetObjectOwner("Categories",
            adPermObjTable,"Accounting");

        _variant_t vIndex;
        //List the owners of all tables and columns in the catalog.
        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;
        }

        //Restore the original owner of Categories
        m_pCatalog->SetObjectOwner("Categories",adPermObjTable,strOwner);

        //Delete Accounting
        m_pCatalog->Groups->Delete("Accounting");
    }
    catch(_com_error &e)
    {
        // Notify the user of errors if any.
        _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;
    }
}
// EndOwnersCpp


Exemple de méthodes GetPermissions et SetPermissions (VC++)

Cet exemple met en application les méthodes GetPermissions et SetPermissions. Le code suivant donne à l'utilisateur Admin l'accès intégral à la table Orders.

// BeginGrantPermissionCpp
#import "c:\Program Files\Common Files\system\ado\msado15.dll"
#import "c:\Program Files\Common Files\system\ado\msadox.dll" \
    no_namespace

#include "iostream.h"
#include "stdio.h"
#include "conio.h"

//Function declarations
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void GrantPermissionsX(void);

//////////////////////////////////////////////////////////
//                                                      //
//     Main Function                                    //
//                                                      //
//////////////////////////////////////////////////////////
void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    GrantPermissionsX();

    ::CoUninitialize();
}

//////////////////////////////////////////////////////////
//                                                      //
//    GrantPermissionsX Function                        //
//                                                      //
//////////////////////////////////////////////////////////
void GrantPermissionsX()
{
    HRESULT hr = S_OK;

    // Define ADOX object pointers.
    // Initialize pointers on define.
    // These are in the ADOX::  namespace.
    _CatalogPtr m_pCatalog = NULL;

    //Define ADODB object pointers;
    ADODB::_ConnectionPtr m_pCnn = NULL;

    //Define other variables here.
    try
    {
        TESTHR(hr = m_pCnn.CreateInstance(__uuidof(ADODB::Connection)));

        //Opens a connection to the northwind database
        //using the Microsoft Jet 4.0 provider
        m_pCnn->PutProvider("Microsoft.Jet.OLEDB.4.0");
        m_pCnn->Open("data source='c:\\Program Files\\"  \
        "Microsoft Office\\Office\\Samples\\Northwind.mdb';"  \
        "jet oledb:system database='c:\\Program Files\\Microsoft Office\\Office\\system.mdw'",
            "","",NULL);

        TESTHR(hr = m_pCatalog.CreateInstance(__uuidof(Catalog)));

        m_pCatalog->PutActiveConnection(_variant_t((IDispatch *)m_pCnn));

        //Retrieve original permissions
        long lngPerm = m_pCatalog->Users->GetItem("admin")->
            GetPermissions("Orders",adPermObjTable);
        long lngOrgPerm = lngPerm;
        cout << "Original Permissions: " << lngPerm << "\n" << endl;

        //Revoke all permissions
        m_pCatalog->Users->GetItem("admin")->SetPermissions("Orders",
            adPermObjTable,adAccessRevoke,adRightFull,adInheritNone);

        //Display permissions
        lngPerm = m_pCatalog->Users->GetItem("admin")->
            GetPermissions("Orders",adPermObjTable);
        cout << "Revoked permissions: " << lngPerm << "\n" << endl;

        //Give the Admin user full rights on the orders object
        m_pCatalog->Users->GetItem("admin")->SetPermissions("Orders",
            adPermObjTable,adAccessSet,adRightFull,adInheritNone);

        //Display permissions
        lngPerm = m_pCatalog->Users->GetItem("admin")->
            GetPermissions("Orders",adPermObjTable);
        cout << "Full permissions: " << lngPerm << "\n" << endl;

        //Restore original permissions
        m_pCatalog->Users->GetItem("admin")->SetPermissions("Orders",
            adPermObjTable,adAccessSet,(RightsEnum) lngOrgPerm,
            adInheritNone);

        //Display permissions
        lngPerm = m_pCatalog->Users->GetItem("admin")->
            GetPermissions("Orders",adPermObjTable);
        cout << "Final permissions: " << lngPerm << "\n" << endl;
    }
    catch(_com_error &e)
    {
        // Notify the user of errors if any.
        _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 GrantPermissionsX...."<< endl;
    }
}
// EndGrantPermissionCpp


Exemple de méthodes Groups et Users Append, ChangePassword (VC++)

Cet exemple illustre l'utilisation de la méthode Append de Groups, ainsi que la méthode Append de Users par l'ajout d'un nouvel objet Group et d'un nouvel objet User au système. Le nouvel objet Group est ajouté à la collection Groups du nouvel objet User. Par conséquent, le nouvel objet User est ajouté au Group. De plus, la méthode ChangePassword est utilisée pour spécifier le mot de passe User.

// BeginGroupCpp
#import "c:\Program Files\Common Files\system\ado\msadox.dll" no_namespace

#include "iostream.h"
#include "stdio.h"
#include "conio.h"

//Function declarations
void GroupX(void);
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};

//////////////////////////////////////////////////////////
//                                                      //
//      Main Function                                   //
//                                                      //
//////////////////////////////////////////////////////////
void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    GroupX();

    ::CoUninitialize();
}

//////////////////////////////////////////////////////////
//                                                      //
//         GroupX Function                              //
//                                                      //
//////////////////////////////////////////////////////////
void GroupX(void)
{
    HRESULT hr = S_OK;

    // Define ADOX object pointers.
    // Initialize pointers on define.
    // These are in the ADOX::  namespace.
    _CatalogPtr m_pCatalog   = NULL;
    _UserPtr m_pUserNew   = NULL;
    _UserPtr m_pUser  = NULL;
    _GroupPtr m_pGroup = NULL;

    // Define String Variables.
    _bstr_t strCnn("Provider='Microsoft.JET.OLEDB.4.0';"
        "Data source = 'c:\\Program Files\\Microsoft Office\\"
        "Office\\Samples\\Northwind.mdb';"
        "jet oledb:system database='c:\\Program Files\\Microsoft Office\\"
        "Office\\system.mdw'");

    try
    {
        TESTHR(hr = m_pCatalog.CreateInstance(__uuidof (Catalog)));
        m_pCatalog->PutActiveConnection(strCnn);

        // Create and append new group with a string.
        m_pCatalog->Groups->Append("Accounting");

        // Create and append new user with an object.
        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),"");

        // Make the user Pat Smith a member of the
        // Accounting group by creating and adding the
        // appropriate Group object to the user's Groups
        // collection.The same is accomplished if a User
        // object representing Pat Smith is created and
        // appended to the Accounting group Users collection
        m_pUserNew->Groups->Append("Accounting");

        // Enumerate all User objects in the
        // catalog's Users collection.
        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;

            // Enumerate all Group objects in each User
            // object's Groups collection.
            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;
        }

        // Enumerate all Group objects in the default
        // workspace's Groups collection.
        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;

            // Enumerate all User objects in each Group
            // object's Users Collection.
            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;
        }

        // Delete new User and Group object because this
        // is only a demonstration.
        m_pCatalog->Users->Delete("Pat Smith");
        m_pCatalog->Groups->Delete("Accounting");
    }
    catch(_com_error &e)
    {
        // Notify the user of errors if any.
        _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;
    }
}
// EndGroupCpp


Exemple de méthode Indexes Append (VC++)

Le code suivant indique comment créer un index. L'index occupe deux colonnes de la table.

// BeginCreateIndexCpp
#import "c:\Program Files\Common Files\system\ado\msadox.dll" no_namespace

#include "iostream.h"
#include "stdio.h"
#include "conio.h"

// Function declarations
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void CreateIndexX(void);

//////////////////////////////////////////////////////////
//                                                      //
//      Main Function                                   //
//                                                      //
//////////////////////////////////////////////////////////
void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    CreateIndexX();

    ::CoUninitialize();
}

//////////////////////////////////////////////////////////
//                                                      //
//        CreateIndexX Function                         //
//                                                      //
//////////////////////////////////////////////////////////
void CreateIndexX(void)
{
    HRESULT hr = S_OK;

    // Define ADOX object pointers.
    // Initialize pointers on define.
    // These are in the ADOX::  namespace.
    _TablePtr m_pTable   = NULL;
    _IndexPtr m_pIndex    = NULL;
    _CatalogPtr m_pCatalog = NULL;

    //Define other variables
    _bstr_t strcnn("Provider='Microsoft.JET.OLEDB.4.0';"
        "Data source = 'c:\\Program Files\\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)));

        // Open the catalog.
        m_pCatalog->PutActiveConnection(strcnn);

        // Define the table and append it to the catalog.
        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));
        printf("Table 'MyTable' is appended.\n");

        // Define a multi-column index.
        m_pIndex->Name = "multicolidx";
        m_pIndex->Columns->Append("Column1",adInteger,0);
        m_pIndex->Columns->Append("Column2",adInteger,0);

        // Append the index to the table.
        m_pTable->Indexes->Append(_variant_t((IDispatch *)m_pIndex));
        printf("Index 'multicolidx' is appended.\n");

        // Delete the table.
        m_pCatalog->Tables->Delete("MyTable");
        printf("Table 'MyTable' is deleted.\n");
    }
    catch(_com_error &e)
    {
        // Notify the user of errors if any.
        _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 CreateIndexX...."<< endl;
    }
}
// EndCreateIndexCpp


Exemple de propriété IndexNulls (VC++)

Cet exemple montre comment utiliser la propriété IndexNulls d'un Index. Le code crée un index et définit la valeur de IndexNulls à partir d'une entrée utilisateur. Cet Index est, ensuite, ajouté dans la Table Employees du Catalog Northwind. Le nouvel Index est appliqué à un Recordset en fonction de la table Employees, et le Recordset est ouvert. Un nouvel enregistrement est ajouté à la table Employees, avec une valeur Null dans le champ indexé. Ce nouvel enregistrement est affiché ou non, selon la définition de la propriété IndexNulls.

// BeignIndexNullCpp
#import "C:\Program Files\Common Files\System\ADO\msado15.dll" \
    rename("EOF", "EndOfFile")
#import "c:\Program Files\Common Files\system\ado\msadox.dll" \
    no_namespace

#include "iostream.h"
#include "stdio.h"
#include "conio.h"
#include "ADOXIndexNullsX.h"

// Function declarations
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void IndexNullsX(_bstr_t);

//////////////////////////////////////////////////////////
//                                                      //
//      Main Function                                   //
//                                                      //
//////////////////////////////////////////////////////////
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 Function                            //
//                                                      //
//////////////////////////////////////////////////////////
void IndexNullsX(_bstr_t strSel)
{
    HRESULT hr = S_OK;

    // Define ADOX object pointers.
    // Initialize pointers on define.
    // These are in the ADOX::  namespace.
    _CatalogPtr m_pCatalog     = NULL;
    _IndexPtr m_pIndexNew      = NULL;

    // Define ADODB object pointers
    ADODB::_ConnectionPtr m_pCnn           = NULL;
    ADODB::_RecordsetPtr  m_pRstEmployees  = NULL;

    // Define other variables
    IADORecordBinding *picRs  = NULL;  // Interface Pointer Declared
    CEmployeeRs emprs;          // C++ Class Object

    // Define string variable.
    _bstr_t strCnn("Provider='Microsoft.JET.OLEDB.4.0';"
        "data source='c:\\Program Files\\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)));

        // Connect the catalog.
        m_pCnn->Open(strCnn,"","",NULL);
        m_pCatalog->PutActiveConnection(_variant_t((IDispatch *)m_pCnn));

        // Append Country column to new index.
        m_pIndexNew->Columns->Append("Country",adVarWChar,0);
        m_pIndexNew->Name = "NewIndex";

        // Set IndexNulls based on user input
        if(strcmp((LPSTR)strSel,"Allow")==0)
        {
            m_pIndexNew->IndexNulls = adIndexNullsAllow;
        }
        else if(strcmp((LPSTR)strSel,"Ignore")==0)
        {
            m_pIndexNew->IndexNulls = adIndexNullsIgnore;
        }

        // Append new index to Employees table
        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);

        // Add a new record to the Employees table.
        m_pRstEmployees->AddNew();
        m_pRstEmployees->Fields->GetItem("FirstName")->Value =
             (_bstr_t) "Gary";
        m_pRstEmployees->Fields->GetItem("LastName")->Value =
             (_bstr_t) "Haarsager";
        m_pRstEmployees->Update();

        // Bookmark the newly added record.
        _variant_t varBookmark = m_pRstEmployees->Bookmark;

        // Use the new index to set the order of the records.
        m_pRstEmployees->MoveFirst();
        printf("\n\nIndex = %s,",(LPSTR) m_pRstEmployees->Index);
        printf("IndexNulls = %d\n\n",m_pIndexNew->IndexNulls);
        cout<<"Country            -        Name"<<endl;

        // Open an IADORecordBinding interface pointer which
        // we will use for binding Recordset to a class
        TESTHR(hr = m_pRstEmployees->QueryInterface(
            __uuidof(IADORecordBinding),(LPVOID*)&picRs));

        // Bind the Recordset to a C++ class here
        TESTHR(hr = picRs->BindToRecordset(&emprs));

        // Enumerate the Recordset.The value of the
        // IndexNulls property will determine if the newly
        // added record appears in the output.
        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();
        }

        // Delete new record because this is a demonstration.
        m_pRstEmployees->Bookmark = varBookmark;
        m_pRstEmployees->Delete(ADODB::adAffectCurrent);
    }
    catch(_com_error &e)
    {
        // Notify the user of errors if any.
        _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;
    }

    if (m_pRstEmployees)
    {
        if (m_pRstEmployees->State == 1)
        {
            m_pRstEmployees->Close();
            m_pRstEmployees = NULL;
        }
    }

    // Delete new Index because this is a demonstration.
    if (m_pCatalog)
        m_pCatalog->Tables->GetItem("Employees")->Indexes->
            Delete(m_pIndexNew->Name);

    if (m_pCnn)
    {
        if (m_pCnn->State == 1)
        {
            m_pCnn->Close();
            m_pCnn = NULL;
        }
    }

    m_pCatalog = NULL;
}
// EndIndexNullCpp

IndexNullX.h

// BeginIndexNullsH
// IndexNullsX.h

#include "icrsint.h"

//This class extracts LastName,Country,FirstName from Employees table

class CEmployeeRs : public CADORecordBinding
{
BEGIN_ADO_BINDING(CEmployeeRs)
        // Column LastName is the 2nd field in the table
        ADO_VARIABLE_LENGTH_ENTRY2(2,adVarChar,m_szemp_LastName,
            sizeof(m_szemp_LastName),lemp_LastNameStatus,TRUE)
        // Column Country is the 11th field in the table
        ADO_VARIABLE_LENGTH_ENTRY2(11,adVarChar,m_szemp_Country,
            sizeof(m_szemp_Country),lemp_CountryStatus,TRUE)
            // Column Country is the 17th field in the table
        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;
};
// EndIndexNullsH


Exemple de méthode Keys Append, et de propriétés Key Type, RelatedColumn, RelatedTable et UpdateRule (VC++)

Le code suivant indique comment créer une clé étrangère. Il suppose l'existence de deux tables (Customers et Orders).

// BeginCreateKeyCpp
#import "c:\Program Files\Common Files\system\ado\msadox.dll" \
    no_namespace
#import "c:\Program Files\Common Files\system\ado\msado15.dll"

#include "iostream.h"
#include "stdio.h"
#include "conio.h"

//Function declarations
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void CreateKeyX(void);

//////////////////////////////////////////////////////////
//                                                      //
//      Main Function                                   //
//                                                      //
//////////////////////////////////////////////////////////
void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    CreateKeyX();

    ::CoUninitialize();
}

//////////////////////////////////////////////////////////
//                                                      //
//        CreateKeyX Function                           //
//                                                      //
//////////////////////////////////////////////////////////
void CreateKeyX(void)
{
    HRESULT hr = S_OK;

    // Define ADOX object pointers.
    // Initialize pointers on define.
    // These are in the ADOX::  namespace.
    _KeyPtr m_pKeyForeign = NULL;
    _CatalogPtr m_pCatalog   = NULL;

    //Define other variables
    _bstr_t strcnn("Provider='Microsoft.JET.OLEDB.4.0';"
                "Data source = 'c:\\Program Files\\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);

        // Define the foreign key.
        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;

        // To pass as column parameter to Key's Apppend method
        _variant_t vOptional;
        vOptional.vt = VT_ERROR;
        vOptional.scode = DISP_E_PARAMNOTFOUND;

        // Append the foreign key.
        m_pCatalog->Tables->GetItem("Orders")->Keys->
            Append(_variant_t((IDispatch *)m_pKeyForeign),
            adKeyPrimary,vOptional,L"",L"");
        printf("Foreign key 'CustOrder' is added.\n");

        // Delete the key as this is a demonstration.
        m_pCatalog->Tables->GetItem("Orders")->Keys->
            Delete(m_pKeyForeign->Name);
        printf("Foreign key 'CustOrder' is deleted.\n");
    }

    catch(_com_error &e)
    {
        // Notify the user of errors if any.
        _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;
    }
}
// EndCreateKeyCpp


Exemple de propriétés NumericScale et Precision (VC++)

Cet exemple illustre comment utiliser les propriétés NumericScale et Precision de l'objet Column. Ce code indique leur valeur pour la table Order Details de la base de données Northwind.

// BeginNumericScalePrecCpp
#import "c:\Program Files\Common Files\system\ado\msadox.dll" \
    no_namespace
#import "c:\Program Files\Common Files\system\ado\msado15.dll"

#include "iostream.h"
#include "stdio.h"
#include "conio.h"

//Function declarations
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void NumericScalePrecX(void);

//////////////////////////////////////////////////////////
//                                                      //
//       Main Function                                  //
//                                                      //
//////////////////////////////////////////////////////////
void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    NumericScalePrecX();

    ::CoUninitialize();
}

//////////////////////////////////////////////////////////
//                                                      //
//          NumericScalePrecX Function                  //
//                                                      //
//////////////////////////////////////////////////////////
void NumericScalePrecX(void)
{
    HRESULT hr = S_OK;

    // Define ADOX object pointers.
    // Initialize pointers on define.
    // These are in the ADOX::  namespace.
    _CatalogPtr m_pCatalog = NULL;
    _TablePtr m_pTable = NULL;
    _ColumnPtr m_pColumn = NULL;

    //Define ADODB object pointers
    ADODB::_ConnectionPtr m_pCnn = NULL;

    //Declare string variables
    _bstr_t strCnn("Provider='Microsoft.JET.OLEDB.4.0';"
        "Data Source='c:\\Program Files\\Microsoft Office\\"
        "Office\\Samples\\Northwind.mdb';");
    try
    {
        TESTHR(hr = m_pCnn.CreateInstance(__uuidof(ADODB::Connection)));

        TESTHR(hr = m_pCatalog.CreateInstance(__uuidof (Catalog)));

        // Connect the catalog.
        m_pCnn->Open (strCnn, "", "", NULL);

        m_pCatalog->PutActiveConnection(variant_t((IDispatch *)m_pCnn));

        // Retrieve the Order Details table
        m_pTable = m_pCatalog->Tables->GetItem("Order Details");

        // Display numeric scale and precision of
        // small integer fields.
        _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)
    {
        // Notify the user of errors if any.
        _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 NumericScalePrecX...."<< endl;
    }
}
// EndNumericScalePrecCpp


Exemple de propriété Command, collection Parameters (VC++)

Le code suivant indique comment utiliser la propriété Command avec l'objet Command pour extraire les informations de paramètres de la procédure.

// This sample runs correctly only if procedure 'CustomerById'
// exists. If the procedure doesn't exist, please use
// 'ADOXProceduresAppend.cpp' to creat it.

// BeginProcedureParametersCpp
#import "c:\Program Files\Common Files\system\ado\msadox.dll" \
    no_namespace
#import "c:\Program Files\Common Files\system\ado\msado15.dll"

#include "iostream.h"
#include "stdio.h"
#include "conio.h"

//Function declarations
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void ProcedureParametersX(void);

//////////////////////////////////////////////////////////
//                                                      //
//    Main Function                                     //
//                                                      //
//////////////////////////////////////////////////////////
void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    ProcedureParametersX();

    ::CoUninitialize();
}

//////////////////////////////////////////////////////////
//                                                      //
//      ProcedureParametersX Function                   //
//                                                      //
//////////////////////////////////////////////////////////
void ProcedureParametersX()
{
    HRESULT hr = S_OK;

    // Define ADOX object pointers.
    // Initialize pointers on define.
    // These are in the ADOX::  namespace.
    _CatalogPtr m_pCatalog = NULL;

    //Define ADODB object pointers.
    ADODB::_ConnectionPtr m_pCnn = NULL;
    ADODB::_CommandPtr m_pCommand = NULL;
    ADODB::_ParameterPtr m_pParameter = NULL;

    try
    {
        TESTHR(hr = m_pCnn.CreateInstance(__uuidof(ADODB::Connection)));

        //Open the Connection
        m_pCnn->Open("Provider='Microsoft.JET.OLEDB.4.0';"
                "Data Source='c:\\Program Files\\Microsoft Office\\"
                "Office\\Samples\\Northwind.mdb';","","",NULL);

        TESTHR(hr = m_pCatalog.CreateInstance(__uuidof(Catalog)));

        //Open the catalog
        m_pCatalog->PutActiveConnection(_variant_t((IDispatch *)m_pCnn));

        //Get the command object
        m_pCommand = m_pCatalog->Procedures->GetItem("CustomerById")->
            GetCommand();

        _variant_t vIndex;

        //Retrieve Parameter information
        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)
    {
        // Notify the user of errors if any.
        _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 ProcedureParametersX...."<< endl;
    }
}
// EndProcedureParametersCpp


Exemple de propriété ParentCatalog (VC++)

Le code suivant indique comment utiliser la propriété ParentCatalog pour accéder à une propriété spécifique d'un fournisseur avant d'ajouter une table à un catalogue. Cette propriété est AutoIncrement, qui crée un champ AutoIncrement dans une base de données Microsoft Jet.

// BeginCreateAutoIncrColumnCpp
#import "c:\Program Files\Common Files\system\ado\msadox.dll" \
    no_namespace
#import "c:\Program Files\Common Files\system\ado\msado15.dll"

#include "iostream.h"
#include "stdio.h"
#include "conio.h"

//Function declarations
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void CreateAutoIncrColumnX(void);

//////////////////////////////////////////////////////////
//                                                      //
//      Main Function                                   //
//                                                      //
//////////////////////////////////////////////////////////
void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    CreateAutoIncrColumnX();

     ::CoUninitialize();
}

//////////////////////////////////////////////////////////
//                                                      //
//       CreateAutoIncrColumnX Function                 //
//                                                      //
//////////////////////////////////////////////////////////
void CreateAutoIncrColumnX(void)
{
    HRESULT hr = S_OK;

    // Define ADOX object pointers.
    // Initialize pointers on define.
    // These are in the ADOX::  namespace.
    _CatalogPtr m_pCatalog = NULL;
    _TablePtr m_pTable = NULL;

    // Define ADODB object pointers.
    ADODB::_ConnectionPtr m_pCnn = NULL;

    //Define string variables
    _bstr_t strCnn("Provider='Microsoft.JET.OLEDB.4.0';"
        "Data Source='c:\\Program Files\\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)));

        // Connect the catalog.
        m_pCnn->Open (strCnn, "", "", NULL);

        m_pCatalog->PutActiveConnection(variant_t((IDispatch *)m_pCnn));

        m_pTable->Name="MyContacts";
        m_pTable->ParentCatalog = m_pCatalog;

        // Create fields and append them to the new Table object.
        m_pTable->Columns->Append("ContactId", adInteger,0);

        // Make the ContactId column and auto incrementing column
        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));

        // Refresh the database.
        m_pCatalog->Tables->Refresh();

        printf("Table 'MyContacts' is added.\n");

        // Delete new table, since this is only an example
        m_pCatalog->Tables->Delete("MyContacts");

        printf("Table 'MyContacts' is deleted.\n");
    }
    catch(_com_error &e)
    {
        // Notify the user of errors if any.
        _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 CreateAutoIncrColumnX...."<< endl;
    }

    m_pCatalog = NULL;
}
// EndCreateAutoIncrColumnCpp


Exemple de propriétés PrimaryKey et Unique (VC++)

Cet exemple montre comment utiliser les propriétés PrimaryKey et Unique d'un Index. Le code crée une table avec deux colonnes. Les propriétés PrimaryKey et Unique sont utilisées pour faire d'une colonne la clé primaire pour laquelle les valeurs dupliquées ne sont pas autorisées.

// BeginPrimaryKeyCpp
#import "c:\program files\common files\system\ado\msadox.dll" \
    no_namespace
#import "c:\program files\common files\system\ado\msado15.dll"

#include "iostream.h"
#include "stdio.h"
#include "conio.h"

//Function Declarations
inline void TESTHR(HRESULT x) {if FAILED(x) _com_issue_error(x);};
void PrimaryKeyX(void);

//////////////////////////////////////////////////////////
//                                                      //
//    Main Function                                     //
//                                                      //
//////////////////////////////////////////////////////////
void main()
{
    if(FAILED(::CoInitialize(NULL)))
        return;

    PrimaryKeyX();

    ::CoUninitialize();
}

//////////////////////////////////////////////////////////
//                                                      //
//        PrimaryKeyX Function                          //
//                                                      //
//////////////////////////////////////////////////////////
void PrimaryKeyX()
{
    HRESULT hr = S_OK;

    // Define ADOX object pointers.
    // Initialize pointers on define.
    // These are in the ADOX::  namespace.
    _CatalogPtr m_pCatalog = NULL;
    _TablePtr m_pTableNew = NULL;
    _IndexPtr m_pIndexNew  = NULL;
    _IndexPtr m_pIndex  = NULL;
    _ColumnPtr m_pColumn = NULL;

    //Define string variable
    _bstr_t strcnn("Provider='Microsoft.JET.OLEDB.4.0';"
        "Data Source = 'c:\\Program Files\\"
        "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)));

        // Connect the catalog
        m_pCatalog->PutActiveConnection(strcnn);

        // Name new table
        m_pTableNew->Name = "NewTable";

        // Append a numeric and a text field to new table.
        m_pTableNew->Columns->Append("NumField", adInteger, 20);
        m_pTableNew->Columns->Append("TextField", adVarWChar, 20);

        // Append new Primary Key index on NumField column
        // to new table
        m_pIndexNew->Name = "NumIndex";
        m_pIndexNew->Columns->Append("NumField",adInteger,0);
        // here "-1" is required instead of "true".
        m_pIndexNew->PutPrimaryKey(-1);
        m_pIndexNew->PutUnique(-1);
        m_pTableNew->Indexes->Append(
            _variant_t ((IDispatch*)m_pIndexNew));

        // Append an index on Textfield to new table.
        // Note the different technique: Specifying index and
        // column name as parameters of the Append method
        m_pTableNew->Indexes->Append("TextIndex", "TextField");

        // Append the new table
        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;
        // Enumerate Indexes collection.
        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;

            // Enumerate Columns collection of each Index
            // object.
            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;
            }
        }

        // Delete new table as this is a demonstration
        m_pCatalog->Tables->Delete(m_pTableNew->Name);
    }
    catch(_com_error &e)
    {
        // Notify the user of errors if any.
        _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 PrimaryKeyX...."<< endl;
    }

    m_pCatalog = NULL;
}
// EndPrimaryKeyCpp


Informations légales et relatives au droit d'auteur

ADO 2.5

Informations légales et relatives au droit d'auteur
Microsoft ActiveX Data Objects (ADO)

Les informations contenues dans ce document, y compris les adresses URL et autres références à des sites Web Internet, peuvent être modifiées sans préavis. Sauf indication contraire, les noms de sociétés, d'organisations, de produits, de noms de domaines, les adresses électroniques, logos, personnes, endroits ou événements mentionnés dans les exemples sont fictifs. Toute ressemblance avec des noms de sociétés, d'organisations, de produits, de noms de domaines, des adresses électroniques, des logos, des personnes, des endroits ou des événements réels est purement fortuite et involontaire. L'utilisateur est tenu d'observer la réglementation relative aux droits d'auteur applicable dans son pays. Aucune partie de ce document ne peut être reproduite, stockée ou introduite dans un système de restitution, ou transmise à quelque fin ou par quelque moyen que ce soit (électronique, mécanique, photocopie, enregistrement ou autre) sans la permission expresse et écrite de Microsoft Corporation.

Microsoft peut détenir des brevets, avoir déposé des demandes d’enregistrement de brevets ou être titulaire de marques, droits d’auteur ou autres droits de propriété intellectuelle portant sur tout ou partie des éléments qui font l’objet du présent document. Sauf stipulation expresse contraire d’un contrat de licence écrit de Microsoft, la fourniture de ce document n’a pas pour effet de vous concéder une licence sur ces brevets, marques, droits d’auteur ou autres droits de propriété intellectuelle.

1998-2003 Microsoft Corporation. Tous droits réservés.

Microsoft, Windows, Windows NT, ActiveX, Developer Studio, FoxPro, JScript, MSDN, Visual Basic, Visual C++, Visual InterDev, Visual J++, Visual Studio et Win32 sont soit des marques de Microsoft Corporation, soit des marques déposées de Microsoft Corporation, aux États-Unis d’Amérique et/ou dans d’autres pays.

Apple est une marque déposée de Apple Computer, Inc.

Intel est une marque déposée de Intel Corporation.

Les noms de produits et de sociétés réels mentionnés dans la présente documentation sont des marques de leurs propriétaires respectifs.


SchemaObjectTypeEnum

Spécifie le type d'objet devant être récupéré par la méthode GetSchemaObject.

Constante | Valeur | Description
adObjectTypeDimension | 1 | Objet Dimension.
adObjectTypeHierarchy | 2 | Objet Hierarchy.
adObjectTypeLevel | 3 | Objet Level.
adObjectTypeMember | 4 | Objet Member

© 1998-2002 Microsoft Corporation. Tous droits réservés.


GetSchemaObject, méthode

Extrait un objet de schéma ADO MD (Dimension, Hierarchy, Level ou Member) par son UniqueName.

Syntaxe

Set object = CubeDef.GetSchemaObject (ObjType, UniqueName)

Paramètres

ObjType
Valeur SchemaObjectTypeEnum spécifiant le type de l'objet de schéma (Dimension, Hierarchy, Level ou Member) à extraire.
UniqueName
Chaîne spécifiant la valeur de la propriété UniqueName de l'objet à extraire.

Remarques

La méthode GetSchemaObject extrait les objets à l'aide de leur nom unique, comme spécifié par la propriété UniqueName. Il n'est pas obligatoire que le nom des objets parents soit connu, ou que les collections parentes soient remplies pour extraire un objet de schéma.

Voir aussi

S'applique à : CubeDef, objet

© 1998-2002 Microsoft Corporation. Tous droits réservés.


Composants déconseillés

Chacun des composants suivants est considéré comme obsolète. Même si ces composants sont encore pris en charge par cette version des composants MDAC (Microsoft Data Access Components), ils peuvent ne pas l'être à l'avenir. Si vous écrivez de nouvelles applications, il est recommandé d'éviter d'utiliser ces composants datés. Si vous modifiez des applications existantes, nous vous encourageons vivement à éliminer tout lien de dépendance vis-à-vis de ces composants.

Fournisseur ODBC (MSDASQL)

Nous vous encourageons vivement à utiliser un des fournisseurs OLE DB natifs, à la place du fournisseur ODBC (Microsoft Open Database Connectivity). Les fournisseurs OLE DB natifs offrent de meilleurs niveaux de stabilité et de performances. En outre, ils continueront à être pris en charge à l'avenir, alors que MSDASQL ne contiendra aucune nouvelle fonctionnalité, ne sera pas disponible en 64 bits et ne sera pas accessible à partir du fournisseur de données OLE DB NET.

Remote Data Services (RDS)

Les services RDS (Remote Data Services) sont un mécanisme propriétaire Microsoft d'accès à des données distantes par Internet ou intranet. Microsoft fournit désormais le kit Microsoft Simple Object Access Protocol (SOAP) Toolkit 2.0 qui vous permet d'accéder à des données distantes par le biais d'une norme XML ouverte. Au vu de la disponibilité du kit SOAP Toolkit 2.0, il est recommandé de migrer de RDS vers SOAP. Le kit SOAP 2.0 Toolkit 2.0 comprend également des exemples de code permettant d'accéder à distance à des Recordsets Microsoft ActiveX Data Objects (ADO).

Jet and Replication Objects (JRO)

Le Fournisseur OLE DB Microsoft pour Jet et d'autres composants associés ne figurent plus dans l'édition 2.6 des composants MDAC. Microsoft cesse d'utiliser le moteur Microsoft Jet Engine, et ne prévoit aucune nouvelle version ou service pack pour ce composant. Par conséquent, le JRO (Jet and Replication Objects) est déconseillé dans cette version et ne sera pas disponible dans les versions futures des composants MDAC.

Bibliothèques réseau SQL AppleTalk et Banyan Vines

Si vous utilisez les bibliothèques réseau SQL AppleTalk ou Banyan Vines, nous vous recommandons de modifier vos applications de sorte qu'elles utilisent une autre bibliothèque réseau SQL, telle que TCP/IP. Les bibliothèques réseau SQL AppleTalk et Banyan Vines sont déconseillées dans cette version et ne figureront pas dans les prochaines versions de MDAC.

Prise en charge ODBC 16 bits

Si vous utilisez encore des sources de données 16 bits, vous devez migrer vers une source de données 32 bits. La fonctionnalité 16 bits est déconseillée dans cette version et ne figurera pas dans les prochaines versions de MDAC.

© 1998-2002 Microsoft Corporation. Tous droits réservés.


Souhaitez-vous faire part de vos commentaires sur la documentation MDAC ?

L'équipe de documentation MDAC vous invite à lui faire part de vos suggestions et commentaires sur notre documentation et nos exemples. Vous pouvez nous faire parvenir vos commentaires rapidement et directement par courrier électronique ou via le site Web Universal Data Access. Nombre de vos suggestions ont été prises en compte dans cette version de la documentation.

Note Si vous avez besoin d'assistance technique, consultez Obtention d'aide auprès du Support technique Microsoft. L'équipe de documentation MDAC n'est pas en mesure de répondre aux questions relevant du support technique, mais accueillera volontiers vos remarques sur la présentation, l'exactitude et l'exhaustivité de la documentation, ainsi que vos suggestions sur de possibles améliorations à apporter.

Courrier électronique

La documentation MDAC contient désormais un bouton intitulé Commentaires sur la documentation dans la partie supérieure de chaque rubrique. Ce bouton vous permet d'envoyer un commentaire par courrier électronique à l'équipe de documentation MDAC. Les adresses de chaque section de la documentation MDAC sont également indiquées ci-dessous.

Documentation | Adresse
Vue d'ensemble de MDAC | mdacdoc@microsoft.com
ADO | adodoc@microsoft.com
OLE DB et fournisseurs | oledbdoc@microsoft.com
ODBC et pilotes | odbcdoc@microsoft.com
Articles techniques MDAC | datech@microsoft.com
Exemples MDAC | dacode@microsoft.com

Site Web Universal Data Access

Pour envoyer vos commentaires sur un produit ou sa documentation, utilisez le formulaire qui vous est fourni sur le site site Web Universal Data Access. Ce formulaire est spécifiquement conçu pour recevoir des commentaires relatifs au site Web, mais toute remarque sur la documentation ou les exemples sera transmise à l'équipe appropriée.


Dépannage

Si vous rencontrez des difficultés avec les technologies MDAC, essayez les ressources suivantes pour obtenir de l'aide avant de contacter les services de support technique Microsoft.

  • Articles techniques MDAC Vous trouverez plusieurs articles techniques sur le MDAC dans le Kit de développement de plate-forme Microsoft (Platform SDK).
  • Sites Web Le site Web Universal Data Access et la bibliothèque MSDN contiennent des articles et des informations techniques susceptibles de vous aider.
  • Base de connaissances Microsoft Les articles de cette base de données apportent des solutions spécifiques, des astuces techniques ainsi que des informations pertinentes sur les composants MDAC (Microsoft Data Access Components).
  • Groupes de discussion publics : microsoft.public.data.ado et autres.


Installation et redistribution d'ADO

Ayant fait son apparition en même temps que Windows 2000, MDAC est désormais une partie intégrante du système d'exploitation. Les prochaines versions du système d'exploitation contiendront des composants MDAC. Le SDK MDAC se trouve dans le Kit de développement de plate-forme Microsoft (Platform SDK). La redistribution des composants Microsoft Data Access Components en anglais et dans 18 autres langues est disponible au téléchargement sur le site Web Microsoft Universal Data Access.

Pour mettre à jour Windows 95, Windows 98, Windows NT 4.0, Windows 2000 ou Windows Millennium Edition en MDAC 2.7, le programme d'installation redistribuable Mdac_typ.exe est accessible sur le site Web UDA. MDAC 2.7 est également installé en tant que partie de SQL Server 2000. Le fichier redistribuable Mdac_typ.exe se trouve sur le CD-ROM SQL Server 2000. Ce programme se charge d'installer tous les fichiers dont vos applications ont besoin pour utiliser les technologies dans MDAC. Le programme redistribuable n'offre pas l'option de sélectionner les composants à installer. Il les installe tous ensemble ou pas du tout. De cette manière, tous les composants sont installés dans la même configuration que celle dans laquelle ils ont été testés avant de quitter Microsoft, ce qui réduit les problèmes d'incompatibilité de versions entre les DLL.

MDAC est un composant système et l'installation de MDAC s'apparente à une mise à niveau du système. Vous ne pouvez pas supprimer MDAC sans remplacer de fichiers système qui ont été mis à niveau par le programme d'installation de MDAC. De nombreuses applications, telles que Microsoft Internet Explorer, Visual Studio, SQL Server et Office utilisent MDAC pour la liaison de données et d'autres fonctions d'application. La suppression de MDAC aura un impact néfaste sur ces applications. Toutefois, dans certaines circonstances, les Services de support technique Microsoft peuvent vous aider à résoudre des problèmes d'installation et de comportement. Pour plus d'informations, consultez Installing MDAC Q&A (en anglais) sur le site Web Microsoft Universal Data Access.

© 1998-2002 Microsoft Corporation. Tous droits réservés.


Référencement des bibliothèques ADO

Comme avec toute bibliothèque qui fournit une bibliothèque type, vous devez définir une référence à la bibliothèque ADO que vous voulez utiliser dans votre projet Visual Basic. La bibliothèque type pour la version courante d'ADO est contenue dans la DLL ADO, msado15.dll. (Pour répondre aux besoins de certaines applications écrites dans des versions plus anciennes, des version plus anciennes de la bibliothèque type peuvent être également référencées par l'intermédiaire des fichiers msado20.tlb, msado21.tlb et msado25.tlb fournis.)

Pour référencer la bibliothèque ADO dans votre projet Visual Basic, ouvrez le menu Project et cliquez sur References. Faites défiler la liste vers le bas et sélectionnez Microsoft ActiveX Data Objects 2.7 Library. Si une application compilée sur un système avec ADO 2.5 doit s'exécuter sur un ordinateur où est installée une version précédente d'ADO, l'application doit utiliser une des bibliothèques type à compatibilité ascendante. Ajoutez une référence au fichier .tlb approprié à la place du fichier msado15.dll.

© 1998-2002 Microsoft Corporation. Tous droits réservés.


Exécution du script SQL de l'application Carnet d'adresses

Vous devez utiliser soit l'utilitaire de ligne de commande ISQL/Analyseur de requêtes soit SQL Server Enterprise Manager pour exécuter le script SQL inclus (Sampleemp.sql) permettant d'effectuer les opérations suivantes :

  • créer la base de données AddrBookDB sur le périphérique par défaut ;
  • se connecter à la base de données AddrBookDB ;
  • créer une table Employee ;
  • charger les données de l'exemple dans la table ;
  • exécuter une instruction SELECT élémentaire pour vérifier que le chargement dans la table a été effectué correctement ;
  • définir le compte d'utilisateur « adcdemo » avec le mot de passe « adcdemo ».

Pour exécuter le script Sampleemp.sql

Dans Microsoft SQL Server 6.5 :

  1. Cliquez sur Démarrer, pointez sur Programmes, puis sur Microsoft SQL Server 6.5. Cliquez sur SQL Enterprise Manager.
  2. Dans le menu Outils, cliquez sur Outil de requête SQL.
  3. Cliquez sur Charger un script SQL et sélectionnez à l'aide du bouton Parcourir c:\Platform SDK\Samples\DataAccess\RDS\AddressBook.
  4. Sélectionnez le fichier Sampleemp.sql. Cliquez sur Ouvrir.
  5. Cliquez sur le bouton Exécuter une requête (symbolisé par une flèche verte dans la barre d'outils).
  6. Fermez les fenêtres Requête et Enterprise Manager, une fois le script exécuté.

Dans Microsoft SQL Server 7.0 :

  1. Cliquez sur Démarrer, pointez sur Programmes, puis sur Microsoft SQL Server 7.0. Cliquez sur Enterprise Manager.
  2. Vérifiez que la version de SQL Server à utiliser figure dans la liste des serveurs inscrits dans Enterprise Manager.
  3. Dans le menu Outils, cliquez sur Analyseur de requête SQL Server.
  4. Cliquez sur le bouton Charger un script SQL (symbolisé par le dossier ouvert dans la barre d'outils) et sélectionnez à l'aide du bouton Parcourir c:\Platform SDK\Samples\DataAccess\RDS\AddressBook.
  5. Sélectionnez le fichier Sampleemp.sql. Cliquez sur Ouvrir.
  6. Cliquez sur le bouton Exécuter une requête (symbolisé par une flèche verte dans la barre d'outils) ou appuyez sur la touche F5.
  7. Fermez les fenêtres Requête, Analyseur de requête et Enterprise Manager, une fois le script exécuté.

Voir aussi

Exécution de l'application exemple Carnet d'adresses

© 1998-2002 Microsoft Corporation. Tous droits réservés.


Exemples d'applications

Des exemples d'applications sont inclus dans le Kit de développement MDAC pour ADO et RDS. Ces exemples ont pour but d'aider les clients à apprendre à utiliser ADO et RDS ; ils ne sont pas destinés à être déployés sur des serveurs de production.

Remarque Sauf indication contraire, les sociétés, noms et donnés présentés dans les exemples sont fictifs.

ADO comprend plusieurs exemples d'applications. À partir du dossier racine du Kit de développement Microsoft Platform SDK, ils sont installés dans C:\Program Files\Microsoft Platform SDK\Samples\DataAccess. Pour plus d'informations sur l'installation et la localisation des éléments du Kit de développement Platform SDK, consultez Localisation des composants MDAC.

Pour utiliser les exemples d'applications ADO et RDS, ouvrez default.htm à partir des dossiers d'exemples ADO et RDS, respectivement. Ces fichiers décrivent chaque exemple d'application disponible et montrent comment configurer les exemples, comment les exécuter et comment parcourir le code source des exemples.

Voir aussi

Exemples de code ADO | Exemples de code ADO en Microsoft Visual Basic | Exemples de code ADO en Microsoft Visual Basic Scripting Edition | Exemples de code ADO en Microsoft Visual C++ | Exemples de code ADO en Microsoft Visual J++

© 1998-2002 Microsoft Corporation. Tous droits réservés.


Flux de commandes

ADO a toujours pris en charge les entrées de commandes sous forme de chaînes via la propriété CommandText. En remplacement, avec ADO 2.5, vous pouvez également utiliser un flux d'informations pour l'entrée de commandes en affectant le flux à la propriété CommandStream. Vous pouvez affecter un objet ADO Stream, ou tout autre objet prenant en charge l'interface COM IStream.

Le contenu du flux de commandes est simplement transmis de ADO à votre fournisseur, de sorte que ce dernier doit prendre en charge l'entrée de commandes par flux pour rendre cette fonctionnalité opérationnelle. Par exemple, SQL Server 2000 prend en charge les requêtes sous forme de modèles XML ou d'extensions OpenXML de Transact-SQL. Pour plus d'informations sur la prise en charge de commandes de flux dans SQL Server, consultez la rubrique sur la prise en charge ADO des fonctionnalités XML de SQL Server, dans la documentation en ligne de SQL Server.

Dans la mesure où les détails du flux doivent être interprétés par le fournisseur, vous devez spécifier le dialecte des commandes en définissant la propriété Dialect. La valeur de Dialect est une chaîne contenant un GUID, lequel est défini par votre fournisseur. Pour plus d'informations sur les valeurs valides de Dialect prises en charge par votre fournisseur, consultez la documentation relative à ce dernier. Pour plus d'informations sur les dialectes pris en charge par SQL Server 2000, consultez la rubrique sur l'utilisation de flux pour l'entrée de commandes, dans la documentation en ligne de SQL Server.

Exemple de requête basée sur un modèle XML

L'exemple suivant est écrit en VBScript dans la base de données SQL Server 2000 intitulée Les Comptoirs.

Au préalable, initialisez et ouvrez l'objet Stream qui contiendra le flux de requêtes :

Dim adoStreamQuery
Set adoStreamQuery = Server.CreateObject("ADODB.Stream")
adoStreamQuery.Open

Le contenu du flux de requêtes sera une requête basée sur un modèle XML. Pour plus d'informations sur les requêtes basées sur un modèle XML, consultez le Kit de développement XML SDK.

La requête du modèle requiert une référence à l'espace de noms XML identifié par le préfixe sql: de la balise <sql:query>. Une instruction SQL SELECT est incluse dans le contenu du modèle XML et est affectée à une variable chaîne de la manière suivante :

sQuery = "<ROOT xmlns:sql='urn:schemas-microsoft-com:xml-sql'>
<sql:query> SELECT * FROM PRODUCTS ORDER BY PRODUCTNAME </sql:query>
</ROOT>"

Écrivez ensuite la chaîne dans le flux :

adoStreamQuery.WriteText sQuery, adWriteChar
adoStreamQuery.Position = 0

Affectez adoStreamQuery à la propriété CommandStream d'un objet ADO Command :

Dim adoCmd
Set adoCmd  = Server.CreateObject("ADODB.Command"")
adoCmd.CommandStream = adoStreamQuery

Spécifiez le dialecte du langage de commandes, qui indique la manière dont le fournisseur SQL Server OLE DB doit interpréter le flux de commandes. Voici le dialecte défini par le GUID spécifique à un fournisseur :

adoCmd.Dialect = "{5D531CB2-E6Ed-11D2-B252-00C04F681B71}"

Enfin, exécutez la requête et renvoyez les résultats dans un objet Recordset :

Set objRS = adoCmd.Execute

© 1998-2002 Microsoft Corporation. Tous droits réservés.


Scénario RDS

L'application Carnet d'adresses est un scénario qui illustre l'utilisation de Remote Data Service (RDS) pour créer une application Web simple, de gestion des données : un carnet d'adresses professionnel en ligne. Ce scénario s'adresse d'une part aux programmeurs en langage Microsoft Visual Basic Scripting Edition (VBScript) et COM, qui souhaitent s'initier à l'utilisation des contrôles ActiveX de gestion des données avec RDS, et d'autre part aux développeurs d'applications plus expérimentés qui désirent créer des applications Web basées sur les données.

Ce scénario suppose que vous êtes déjà familiarisé avec l'utilisation des balises de mise en page HTML élémentaires, le maniement des techniques de liaison de données DHTML et la programmation à l'aide de contrôles ActiveX.

Si vous avez installé le Kit de développement Platform SDK, le code source complet de l'application exemple Carnet d'adresses se trouve dans <lecteur>:\Platform SDK\samples\dataaccess\rds\AddressBook\AddressBook.asp. Pour afficher le scénario relatif au Carnet d'adresses, dans Internet Explorer 4.0 ou une version ultérieure, tapez http://webserver/RDS/AddressBook/AddressBook.asp où webserver représente le nom donné à votre serveur Web Windows NT 4.0 ou Windows 2000 exécutant Internet Information Services (IIS) et ASP.

Introduction à l'application Carnet d'adresses

L'application exemple Carnet d'adresses est un carnet d'adresses en ligne que vous pouvez utiliser pour publier un annuaire consultable sur un intranet. Ce carnet d'adresses permet à un utilisateur de renseigner un ou plusieurs champs afin de rechercher des informations concernant des employés. Pour illustrer les fonctionnalités de base du service RDS, la taille de l'application exemple est volontairement réduite au minimum d'objets et de champs de recherche.

L'interface de l'application comprend les éléments suivants :

  • Un objet de liaison de données non visuel, RDS.DataControl, utilisé par le client pour se connecter à la base de données.
  • Des zones de texte HTML destinées à la saisie des critères de recherche des attributs concernant les employés.
  • Des boutons de commande HTML permettant de créer des requêtes, d'effacer des champs de recherche, de mettre à jour des informations concernant les employés dans la base de données, d'annuler des modifications en attente et de naviguer parmi les lignes de données affichées dans la grille.
  • La liaison de données DHTML, qui permet d'afficher les données renvoyées par des requêtes portant sur une base de données principale (via l'objet de liaison de données RDS.DataControl) dans une table.
  • Des routines VBScript qui connectent tous les éléments ci-dessus et leur permettent d'interagir. Le code VBScript est également utilisé pour initialiser l'objet RDS.DataControl et créer de façon dynamique les en-têtes de colonnes dans la table HTML, à partir des noms des champs du jeu d'enregistrements RDS.DataControl.

Suivez les liens reliant les différentes étapes pour configurer et exécuter le scénario afin de vous familiariser davantage avec son mode de fonctionnement.

Voir aussi

Configuration système requise pour l'application Carnet d'adresses | Page de démarrage des objets de données ActiveX | Notions fondamentales relatives à RDS | Didacticiel RDS

© 1998-2002 Microsoft Corporation. Tous droits réservés.


Extraction de résultats dans des objets Stream

Au lieu de recevoir des résultats dans le traditionnel objet Recordset, ADO peut extraire les résultats d'une requête dans un flux. L'objet ADO Stream (ou tout autre objet prenant en charge l'interface COM IStream, par exemple les objets ASP Request et Response) peuvent être utilisés pour contenir ces résultats. L'une de buts de cette fonctionnalité est d'extraire les résultats au format XML. Avec SQL Server 2000, par exemple, les résultats XML peuvent être renvoyés de multiples façons, par exemple en utilisant la clause FOR XML avec une requête SQL SELECT ou en utilisant une requête XPath.

Pour recevoir des résultats de requête dans un format de flux plutôt que dans Recordset, vous devez spécifier la constante adExecuteStream à partir de ExecuteOptionEnum en tant que paramètre de la méthode Execute d'un objet Command. Si votre fournisseur prend en charge cette fonctionnalité, les résultats sont renvoyés dans un flux lors de l'exécution. Vous pouvez être amené à définir des propriétés supplémentaires spécifiques au fournisseur avant que le code ne s'exécute. Par exemple, avec Microsoft OLE DB Provider for SQL Server, il est nécessaire de spécifier des propriétés telles que Output Stream de la collection Properties de l'objet Command. Pour plus d'informations sur les propriétés dynamiques SQL Server associées à cette fonctionnalité, consultez la rubrique sur les propriétés liées au code XML dans la documentation en ligne de SQL Server.

Exemple de requête FOR XML

L'exemple suivant est écrit en VBScript dans la base de données SQL Server 2000 intitulée Les Comptoirs.

<!-- BeginRecordAndStreamVBS -->
<%@ LANGUAGE = VBScript %>
<%  Option Explicit      %>

<HTML>
<HEAD>
<META NAME="GENERATOR" Content="Microsoft Developer Studio"/>
<META HTTP-EQUIV="Content-Type" content="text/html"; charset="iso-8859-1">
<TITLE>FOR XML Query Example</TITLE>

<STYLE>
   BODY
   {
      FONT-FAMILY: Tahoma;
      FONT-SIZE: 8pt;
      OVERFLOW: auto
   }

   H3
   {
      FONT-FAMILY: Tahoma;
      FONT-SIZE: 8pt;
      OVERFLOW: auto
   }
</STYLE>

<!-- #include file="adovbs.inc" -->
<%
   Response.Write "<H3>Server-side processing</H3>"

   Response.Write "Page Generated @ " & Now() & "<BR/>"

   Dim adoConn
   Set adoConn = Server.CreateObject("ADODB.Connection")

   Dim sConn
   sConn = "Provider=SQLOLEDB;Data Source=BWILLETT1;Initial Catalog=Northwind;Integrated Security=SSPI;"

   Response.write "Connect String = " & sConn & "<BR/>"

   adoConn.ConnectionString = sConn
   adoConn.CursorLocation = adUseClient

   adoConn.Open

   Response.write "ADO Version = " & adoConn.Version & "<BR/>"
   Response.write "adoConn.State = " & adoConn.State & "<BR/>"

   Dim adoCmd
   Set adoCmd = Server.CreateObject("ADODB.Command")
   Set adoCmd.ActiveConnection = adoConn

   Dim sQuery
   sQuery = "<ROOT xmlns:sql='urn:schemas-microsoft-com:xml-sql'><sql:query>SELECT * FROM PRODUCTS WHERE ProductName='Gumbr Gummibrchen' FOR XML AUTO</sql:query></ROOT>"

   Response.write "Query String = " & sQuery & "<BR/>"

   Dim adoStreamQuery
   Set adoStreamQuery = Server.CreateObject("ADODB.Stream")
   adoStreamQuery.Open
   adoStreamQuery.WriteText sQuery, adWriteChar
   adoStreamQuery.Position = 0

   adoCmd.CommandStream = adoStreamQuery
   adoCmd.Dialect = "{5D531CB2-E6Ed-11D2-B252-00C04F681B71}"

   Response.write "Pushing XML to client for processing "  & "<BR/>"

   adoCmd.Properties("Output Stream") = Response
   Response.write "<XML ID='MyDataIsle'>"
   adoCmd.Execute , , 1024
   Response.write "</XML>"

%>

<SCRIPT language="VBScript" For="window" Event="onload">
   Dim xmlDoc
   Set xmlDoc = MyDataIsle.XMLDocument
   xmlDoc.resolveExternals=false
   xmlDoc.async=false

   If xmlDoc.parseError.Reason <> "" then
      Msgbox "parseError.Reason = " & xmlDoc.parseError.Reason
   End If

   Dim root, child
   Set root = xmlDoc.documentElement
   For each child in root.childNodes
      dim OutputXML
      OutputXML = document.all("log").innerHTML
      document.all("log").innerHTML = OutputXML & "<LI>" & child.getAttribute("ProductName") & "</LI>"
   Next
</SCRIPT>

</HEAD>

<BODY>

   <H3>Client-side processing of XML Document MyDataIsle</H3>
   <UL id=log>
   </UL>

</BODY>
</HTML>
<!-- EndRecordAndStreamVBS -->

Une nouvelle clause FOR XML est ajoutée à l'instruction SELECT dans SQL Server 2000. La clause FOR XML indique à SQL Server de renvoyer les données sous la forme d'un document XML. Pour plus d'informations sur les requêtes FOR XML dans SQL Server, consultez la rubrique sur l'extraction de données XML à l'aide de FOR XML, dans la documentation en ligne de SQL Server.

Syntaxe de FOR XML

FOR XML [RAW|AUTO|EXPLICIT]

FOR XML RAW génère des éléments de ligne avec des valeurs de colonne en tant qu'attributs. FOR XML AUTO utilise des informations heuristiques pour générer une arborescence hiérarchique comprenant des noms d'élément basés sur des noms de table. FOR XML EXPLICIT génère une table universelle dont les relations sont complètement décrites par les métadonnées.

Voici un exemple d'instruction SQL SELECT FOR XML :

SELECT * FROM PRODUCTS ORDER BY PRODUCTNAME FOR XML AUTO

La commande peut être spécifiée dans une chaîne comme indiqué ci-dessus, être affectée à CommandText ou se présenter sous la forme d'une requête de modèle XML affectée à CommandStream. Pour plus d'informations sur les requêtes basées sur un modèle XML, consultez Flux de commandes dans ADO ou la rubrique sur l'utilisation de flux pour l'entrée de commandes dans la documentation en ligne de SQL Server.

En tant que requête basée sur un modèle XML, FOR XML se présente comme suit :

<sql:query> SELECT * FROM PRODUCTS ORDER BY PRODUCTNAME FOR XML AUTO </sql:query>

Cet exemple définit l'objet ASP Response pour la propriété Output Stream :

adoCmd.Properties("Output Stream") = Response

Spécifiez ensuite le paramètre adExecuteStream de Execute. Cet exemple enveloppe le flux dans des balises XML afin de créer un îlot de données XML. Pour plus d'informations sur les îlots de données XML, consultez le Kit de développement XML SDK.

Response.write "<XML ID=MyDataIsle>"
adoCmd.Execute , , adExecuteStream
Response.write "</XML>"

À ce stade, le code XML est incorporé dans un flux envoyé au navigateur client et est prêt à être affiché. Cela est rendu possible en utilisant du code VBScript côté client pour lier le document XML à une instance de DOM et en effectuant une boucle sur chaque nœud enfant, afin de construire une liste Products en langage HTML.

© 1998-2002 Microsoft Corporation. Tous droits réservés.


Execute, méthode (RDS)

Exécute la demande et crée un jeu d'enregistrements ADO à utiliser dans ADO 2.5 et les versions ultérieures.

Syntaxe

object.Execute(ConnectionString As String, HandlerString As String, QueryString As String, lMarshalOptions As Long, Properties, TableId, lExecuteOptions As Long, pParameters, [lcid As Long], [pInformation])

Paramètres

ConnectionString
Chaîne utilisée pour la connexion au fournisseur OLE DB où la demande est envoyée pour exécution. Si un gestionnaire est spécifiée à l'aide de HandlerString, il peut modifier ou remplacer la chaîne de connexion.
HandlerString
Chaîne qui identifie le gestionnaire à utiliser lors de cette exécution. La chaîne se compose de deux parties. La première partie contient le nom (ProgID) du gestionnaire à utiliser. La seconde partie contient les arguments à transmettre au gestionnaire. L'interprétation de la chaîne des arguments dépend du gestionnaire. Les deux parties sont séparées par la première instance d'une virgule dans la chaîne (toutefois, la chaîne des arguments peut contenir des virgules supplémentaires). Les arguments sont facultatifs.
QueryString
Commande du langage de commande pris en charge par le fournisseur OLE DB identifié dans la chaîne de connexion. Pour les fournisseurs SQL, il peut s'agir d'une instruction de commande T-SQL, alors que pour les fournisseurs non-SQL (par exemple MSDataShape) il ne peut s'agir d'une instruction de requête T-SQL.

Si un gestionnaire est utilisé, il peut modifier ou remplacer la valeur spécifiée dans QueryString. Par exemple, le gestionnaire remplace généralement QueryString par une chaîne de requête à partir de son fichier .ini. Par défaut, le fichier Msdfmap.ini est utilisé.

Remarque L'utilisation d'un gestionnaire est fortement recommandée. Pour plus d'informations sur l'utilisation du gestionnaire de personnalisation de RDS, consultez l'article technique « Using the Customization Handler in RDS 2.1 » (en anglais).
lMarshalOptions
Sert à définir les options de marshaling sur l'ensemble de lignes ou le jeu d'enregistrements renvoyé.
TableID
Variant de type VT_EMPTY ou VT_BSTR. Si cette valeur est de type VT_EMPTY, elle est ignorée. Si elle est de type VT_BSTR, le jeu d'enregistrements est créé via adCmdTableDirect, d'après la valeur spécifiée ici ; en outre le paramètre QueryString est ignoré.
lExecuteOptions
Masque de bits des options d'exécution suivantes :
  • 1=ReadOnly – Le jeu d'enregistrements est ouvert à l'aide de adLockReadOnly.
  • 2=NoBatch – Le jeu d'enregistrements est ouvert à l'aide de adLockOptimistic.
  • 4=AllParamInfoSupplied - L'appelant garantit que les informations relatives à tous les paramètres sont fournies dans pParameters.
  • 8=GetInfo – Les informations de paramètre liées à la requête sont obtenues auprès du fournisseur OLE DB et renvoyées dans le paramètre pParameters. La requête n'est pas exécutée et aucun jeu d'enregistrements n'est renvoyé.
  • 16=GetHiddenColumns – Le jeu d'enregistrements est ouvert à l'aide de adLockBatchOptimistic ; en outre, les colonnes masquées sont incluses dans le jeu d'enregistrements.

Bien que ReadOnly, NoBatch et GetHiddenColumns soient des options mutuellement exclusives, la définition de plusieurs d'entre elles n'est pas une erreur. Si plusieurs options sont définies, l'option GetHiddenColumns a la priorité sur toutes les autres, suivie de ReadOnly. Si aucune option n'est spécifiée, par défaut, le jeu d'enregistrements est ouvert à l'aide de adLockBatchOptimistic mais les colonnes masquées ne sont pas incluses dans celui-ci.

pParameters
Variant contenant un tableau sécurisé de définitions de paramètres. Si l'option GetInfo est spécifiée dans lExecuteOptions, ce paramètre sert à retourner les définitions de paramètres obtenues auprès du fournisseur OLE DB. Dans le cas contraire, ce paramètre peut être vide.
lcid
LCID utilisé pour générer les erreurs renvoyées dans pInformation.
pInformation
Pointeur vers une information d'erreur renvoyée par Execute. Si la valeur est NULL, aucune information d'erreur n'est renvoyée.

Remarques

Le paramètre HandlerString peut avoir la valeur NULL. Ce qui a lieu dans ce type de situation dépend du mode de configuration du serveur RDS. Une chaîne de gestionnaire de « MSDFMAP.handler » indique que le gestionnaire fourni par Microsoft (Msdfmap.dll) doit être utilisé. Une chaîne de gestionnaire de « MASDFMAP.handler,sample.ini » indique que le gestionnaire Msdfmap.dll doit être utilisé et que l'argument « sample.ini » doit être passé au gestionnaire. MSDFMAP.dll interprète l'argument comme une instruction visant à utiliser sample.ini pour vérifier les chaînes de connexion et de requête.

Voir aussi

S'applique à : DataFactory, objet (RDSServer)

© 1998-2002 Microsoft Corporation. Tous droits réservés.


Execute21, méthode (RDS)

Exécute la demande et crée un jeu d'enregistrements ADO à utiliser dans ADO 2.1 et les versions ultérieures.

Syntaxe

object.Execute21(ConnectionString As String, HandlerString As String, QueryString As String, lMarshalOptions As Long, Properties, TableId, lExecuteOptions As Long, pParameters)

Paramètres

ConnectionString
Chaîne utilisée pour la connexion au fournisseur OLE DB où la demande est envoyée pour exécution. Si un gestionnaire est spécifiée à l'aide de HandlerString, il peut modifier ou remplacer la chaîne de connexion.
HandlerString
Chaîne qui identifie le gestionnaire à utiliser lors de cette exécution. La chaîne se compose de deux parties. La première partie contient le nom (ProgID) du gestionnaire à utiliser. La seconde partie contient les arguments à transmettre au gestionnaire. L'interprétation de la chaîne des arguments dépend du gestionnaire. Les deux parties sont séparées par la première instance d'une virgule dans la chaîne (toutefois, la chaîne des arguments peut contenir des virgules supplémentaires). Les arguments sont facultatifs.
QueryString
Commande du langage de commande pris en charge par le fournisseur OLE DB identifié dans la chaîne de connexion. Pour les fournisseurs SQL, il peut s'agir d'une instruction de commande T-SQL, alors que pour les fournisseurs non-SQL (par exemple MSDataShape) il ne peut s'agir d'une instruction de requête T-SQL.

Si un gestionnaire est utilisé, il peut modifier ou remplacer la valeur spécifiée dans QueryString. Par exemple, le gestionnaire remplace généralement QueryString par une chaîne de requête à partir de son fichier .ini. Par défaut, le fichier Msdfmap.ini est utilisé.

Remarque L'utilisation d'un gestionnaire est fortement recommandée. Pour plus d'informations sur l'utilisation du gestionnaire de personnalisation de RDS, consultez l'article technique « Using the Customization Handler in RDS 2.1 » (en anglais).
lMarshalOptions
Sert à définir les options de marshaling sur l'ensemble de lignes ou le jeu d'enregistrements renvoyé.
TableID
Variant de type VT_EMPTY ou VT_BSTR. Si cette valeur est de type VT_EMPTY, elle est ignorée. Si elle est de type VT_BSTR, le jeu d'enregistrements est créé via adCmdTableDirect, d'après la valeur spécifiée ici ; en outre le paramètre QueryString est ignoré.
lExecuteOptions
Masque de bits des options d'exécution suivantes :
  • 1=ReadOnly – Le jeu d'enregistrements est ouvert à l'aide de adLockReadOnly.
  • 2=NoBatch – Le jeu d'enregistrements est ouvert à l'aide de adLockOptimistic.
  • 4=AllParamInfoSupplied - L'appelant garantit que les informations relatives à tous les paramètres sont fournies dans pParameters.
  • 8=GetInfo – Les informations de paramètre liées à la requête sont obtenues auprès du fournisseur OLE DB et renvoyées dans le paramètre pParameters. La requête n'est pas exécutée et aucun jeu d'enregistrements n'est renvoyé.
  • 16=GetHiddenColumns – Le jeu d'enregistrements est ouvert à l'aide de adLockBatchOptimistic ; en outre, les colonnes masquées sont incluses dans le jeu d'enregistrements.

    Bien que ReadOnly, NoBatch et GetHiddenColumns soient des options mutuellement exclusives, la définition de plusieurs d'entre elles n'est pas une erreur. Si plusieurs options sont définies, l'option GetHiddenColumns a la priorité sur toutes les autres, suivie de ReadOnly. Si aucune option n'est spécifiée, par défaut, le jeu d'enregistrements est ouvert à l'aide de adLockBatchOptimistic mais les colonnes masquées ne sont pas incluses dans celui-ci.

pParameters
Variant contenant un tableau sécurisé de définitions de paramètres. Si l'option GetInfo est spécifiée dans lExecuteOptions, ce paramètre sert à retourner les définitions de paramètres obtenues auprès du fournisseur OLE DB. Dans le cas contraire, ce paramètre peut être vide.

Remarques

Le paramètre HandlerString peut avoir la valeur NULL. Ce qui a lieu dans ce type de situation dépend du mode de configuration du serveur RDS. Une chaîne de gestionnaire de « MSDFMAP.handler » indique que le gestionnaire fourni par Microsoft (Msdfmap.dll) doit être utilisé. Une chaîne de gestionnaire de « MASDFMAP.handler,sample.ini » indique que le gestionnaire Msdfmap.dll doit être utilisé et que l'argument « sample.ini » doit être passé au gestionnaire. MSDFMAP.dll interprète l'argument comme une instruction visant à utiliser sample.ini pour vérifier les chaînes de connexion et de requête.

Remarque La méthode Execute21 est simplement une version de la Execute, méthode (RDS). Lorsque vous avez besoin d'utiliser la méthode Execute pour communiquer avec ADO 2.1, la méthode Execute21 peut être appelée en remplacement. Les fonctionnalités de la méthode Execute dans ADO 2.5 et les versions ultérieures sont un sur-ensemble des fonctionnalités fournies par la même méthode dans ADO 2.1.

Voir aussi

S'applique à : DataFactory, objet (RDSServer)

© 1998-2002 Microsoft Corporation. Tous droits réservés.


Synchronize, méthode (RDS)

Synchronise un jeu d'enregistrements donné avec la base de données spécifiée par la chaîne de connexion en vue d'une utilisation avec ADO 2.5 et version ultérieure.

Syntaxe

object.Synchronize(ConnectionString As String, HandlerString As String, lSynchronizeOptions As Long, ppRecordset As Object, pStatusArray, [lcid As Long], [pInformation)

Paramètres

ConnectionString
Chaîne utilisée pour se connecter au fournisseur OLE DB auquel la requête sera envoyée. Si un gestionnaire est utilisé, ce dernier peut modifier ou remplacer la chaîne de connexion.
HandlerString
Chaîne identifiant le gestionnaire à utiliser avec cette exécution. Cette chaîne comporte deux parties. La première contient le nom (ProgID) du gestionnaire à utiliser et la seconde les arguments à passer au gestionnaire. L'interprétation de la chaîne d'arguments varie en fonction du gestionnaire. Ces deux parties sont séparées par la première virgule contenue dans la chaîne (même si les arguments peuvent contenir des virgules supplémentaires). Les arguments sont facultatifs.
lSynchronizeOptions
Masque de bits des options de synchronisation suivantes :
  • 1=UpdateTransact – Les mises à jour de la base de données s'effectuent sous forme de transaction. La transaction est annulée si l'une des mises à jour échoue.
  • 2=RefreshWithUpdate – Les états des lignes sont renvoyés si les options de synchronisation Refresh et RefreshConflicts ne sont pas définies.
  • 4=Refresh – Le jeu d'enregistrements est actualisé avec les données en cours de la base de données. Les mises à jour en attente ne sont pas passées à la base de données. Si le bit n'est pas défini, le jeu d'enregistrements n'est pas actualisé et les mises à jour en attente sont passées à la base de données.
  • 8=RefreshConflicts – La mise à jour des lignes avec des modifications en attente échoue. Les lignes qui ne sont pas mises à jour sont actualisées avec les données de la base de données.
ppRecordset
Pointeur vers un pointeur du jeu d'enregistrements à synchroniser.
pStatusArray
Valeur de type Variant utilisée pour renvoyer un tableau d'états de lignes pour les lignes auxquelles s'applique la méthode Synchronize. Cette valeur n'est pas définie si aucune des options de synchronisation suivantes n'est définie : RefreshWithUpdate, Refresh ou RefreshConflicts.
lcid
LCID utilisé pour générer les erreurs renvoyées dans pInformation.
pInformation
Pointeur vers des erreurs renvoyées par la méthode Execute. Si la valeur est NULL, aucune information sur l'erreur n'est renvoyée.

Remarques

Le paramètre HandlerString peut être NULL. Ce qui se passe dans ce cas varie en fonction de la configuration du serveur RDS. La chaîne de gestionnaire « MSDFMAP.handler » indique que le gestionnaire fourni par Microsoft (Msdfmap.dll) doit être utilisé. La chaîne de gestionnaire « MASDFMAP.handler,sample.ini » indique que le gestionnaire Msdfmap.dll doit être utilisé et que l'argument « sample.ini » doit être passé au gestionnaire. Msdfmap.dll interprétera ensuite l'argument comme une instruction pour utiliser l'argument sample.ini pour vérifier les chaînes de connexion et de requête.

Voir aussi

S'applique à : DataFactory, objet (RDSServer)

© 1998-2002 Microsoft Corporation. Tous droits réservés.


Synchronize21, méthode (RDS)

Synchronise un jeu d'enregistrements donné avec la base de données spécifiée par la chaîne de connexion en vue d'une utilisation avec ADO 2.1.

Syntaxe

object.Synchronize21(ConnectionString As String, HandlerString As String, lSynchronizeOptions As Long, ppRecordset As Object, pStatusArray)

Paramètres

ConnectionString
Chaîne utilisée pour se connecter au fournisseur OLE DB auquel la requête sera envoyée. Si un gestionnaire est utilisé, ce dernier peut modifier ou remplacer la chaîne de connexion.
HandlerString
Chaîne identifiant le gestionnaire à utiliser avec cette exécution. Cette chaîne comporte deux parties. La première contient le nom (ProgID) du gestionnaire à utiliser et la seconde les arguments à passer au gestionnaire. L'interprétation de la chaîne d'arguments varie en fonction du gestionnaire. Ces deux parties sont séparées par la première virgule contenue dans la chaîne (même si les arguments peuvent contenir des virgules supplémentaires). Les arguments sont facultatifs.
lSynchronizeOptions
Masque de bits des options de synchronisation suivantes :
  • 1=UpdateTransact – Les mises à jour de la base de données s'effectuent sous forme de transaction. La transaction est annulée si l'une des mises à jour échoue.
  • 2=RefreshWithUpdate – Les états des lignes sont renvoyés si les options de synchronisation Refresh et RefreshConflicts ne sont pas définies.
  • 4=Refresh – Le jeu d'enregistrements est actualisé avec les données en cours de la base de données. Les mises à jour en attente ne sont pas passées à la base de données. Si le bit n'est pas défini, le jeu d'enregistrements n'est pas actualisé et les mises à jour en attente sont passées à la base de données.
  • 8=RefreshConflicts – La mise à jour des lignes avec des modifications en attente échoue. Les lignes qui ne sont pas mises à jour sont actualisées avec les données de la base de données.
ppRecordset
Pointeur vers un pointeur du jeu d'enregistrements à synchroniser.
pStatusArray
Valeur de type Variant utilisée pour renvoyer un tableau d'états de lignes pour les lignes auxquelles s'applique la méthode Synchronize. Cette valeur n'est pas définie si aucune des options de synchronisation suivantes n'est définie : RefreshWithUpdate, Refresh ou RefreshConflicts.

Remarques

Le paramètre HandlerString peut être NULL. Ce qui se passe dans ce cas varie en fonction de la configuration du serveur RDS. La chaîne de gestionnaire « MSDFMAP.handler » indique que le gestionnaire fourni par Microsoft (Msdfmap.dll) doit être utilisé. La chaîne de gestionnaire « MASDFMAP.handler,sample.ini » indique que le gestionnaire Msdfmap.dll doit être utilisé et que l'argument « sample.ini » doit être passé au gestionnaire. Msdfmap.dll interprétera ensuite l'argument comme une instruction pour utiliser l'argument sample.ini pour vérifier les chaînes de connexion et de requête.

Remarque La méthode Synchronize21 est une version de la méthode Synchronize (RDS). Si vous devez utiliser la méthode Synchronize pour communiquer avec ADO 2.1, vous pouvez appeler la méthode Synchronize21 à la place. Les possibilités de la méthode Synchronize dans ADO 2.5 et version ultérieure sont un jeu optimisé des possibilités fournies pour la même méthode dans ADO 2.1.

Voir aussi

S'applique à : DataFactory, objet (RDSServer)

© 1998-2002 Microsoft Corporation. Tous droits réservés.


CommandStream, propriété (ADO)

Référence de l'API ADO 2.5

CommandStream, propriété

Indique le flux utilisé comme saisie d'un objet Command.

Paramètres et valeurs renvoyées

Définit ou renvoie le flux utilisé comme saisie d'un objet Command. Le format de ce flux est spécifique au fournisseur. Pour plus d'informations, consultez la documentation de votre fournisseur. Cette propriété est similaire à la propriété CommandText utilisée pour spécifier une chaîne pour la saisie d'un objet Command.

Remarques

Les propriétés CommandStream et CommandText sont mutuellement exclusives. Si vous définissez la propriété CommandStream, la propriété CommandText a une valeur de chaîne vide (""). Si vous définissez la propriété CommandString, la propriété CommandStream a la valeur Rien.

Le comportement des méthodes Command.Parameters.Refresh et Command.Prepare est défini par le fournisseur. Les valeurs des paramètres d'un flux peuvent ne pas être actualisées.

Le flux d'entrée n'est pas disponible pour les autres objets ADO qui renvoient la source d'un objet Command. Par exemple, si la propriété Source d'un objet Recordset est définie sur un objet Command qui dispose d'un flux en tant qu'entrée, Recordset.Source continue à renvoyer la propriété CommandText qui contient une chaîne vide (""), à la place du contenu du flux de la propriété CommandStream.

Lorsque vous utilisez un flux de commande (spécifié par la propriété CommandStream), les seules valeurs CommandTypeEnum valides pour la propriété CommandType sont les valeurs adCmdText et adCmdUnknown. Les autres valeurs entraînent une erreur.

Voir aussi

CommandText, propriété | Dialect, propriété | CommandTypeEnum

S'applique à : Command, objet

© 1998-2002 Microsoft Corporation. Tous droits réservés.


Dialect, propriété (ADO)

Référence de l'API ADO 2.5

Dialect, propriété

Indique le dialecte des propriétés CommandText ou CommandStream. Le dialecte définit la syntaxe et les règles générales utilisées par le fournisseur pour analyser la chaîne ou le flux.

Paramètres et valeurs renvoyées

La propriété Dialect contient un GUID valide qui représente le dialecte du texte ou du flux de la commande. La valeur par défaut est {C8B521FB-5CF3-11CE-ADE5-00AA0044773D}. Cette valeur indique que le fournisseur doit choisir comment interpréter le texte ou le flux de la commande.

Remarques

ADO n'interroge pas le fournisseur si vous lisez la valeur de cette propriété ; il renvoie la représentation d'une chaîne de la valeur actuellement stockée dans l'objet Command.

Lorsque vous définissez la propriété Dialect, ADO valide le GUID et génère une erreur si la valeur fournie ne correspond pas à un GUID valide. Consultez la documentation de votre fournisseur pour déterminer les valeurs de GUID prises en charge par la propriété Dialect.

Voir aussi

CommandStream, propriété | CommandText, propriété | Execute, méthode (Command ADO)

S'applique à : Command

© 1998-2002 Microsoft Corporation. Tous droits réservés.


NamedParameters, propriété (ADO)

Référence de l'API ADO 2.5

NamedParameters, propriété

Indique si les noms de paramètres doivent être passés au fournisseur.

Remarques

Lorsque cette propriété a la valeur True, ADO passe la valeur de la propriété Name de chaque paramètre dans la collection Parameters de l'objet Command. Le fournisseur utilise un nom de paramètre pour faire correspondre les paramètres dans la propriété CommandText ou CommandStream. Si cette propriété a la valeur False (valeur par défaut), les noms de paramètres sont ignorés et le fournisseur utilise l'ordre des paramètres pour faire correspondre des valeurs aux paramètres dans la propriété CommandText ou CommandStream.

Voir aussi

CommandText, propriété | CommandStream, propriété | Parameters, collection

S'applique à : Command, objet

© 1998-2002 Microsoft Corporation. Tous droits réservés.


Microsoft OLE DB Simple Provider

Le fournisseur Microsoft OLE DB Simple Provider (OSP) permet à ADO d'accéder aux données pour lesquelles un fournisseur a été écrit à l'aide de la trousse à outils OLE DB Simple Provider Toolkit. Les fournisseurs simples permettent d'accéder aux sources de données qui requièrent uniquement une prise en charge OLE DB de base, notamment dans les tableaux en mémoire ou dans les documents XML.

Paramètres de la chaîne de connexion

Pour vous connecter à la DLL OLE DB Simple Provider, affectez à l'argument Provider de la propriété ConnectionString la valeur suivante :

MSDAOSP

Cette valeur peut également être définie ou lue à l'aide de la propriété Provider.

Vous pouvez vous connecter à des fournisseurs simples qui ont été enregistrés en tant que fournisseurs OLE DB complets en utilisant le nom du fournisseur enregistré, déterminé par le rédacteur du fournisseur.

Chaîne de connexion typique

Voici un exemple de chaîne de connexion pour ce fournisseur :

"Provider=MSDAOSP;Data Source=serverName"

Cette chaîne comprend les mots clés suivants :

Mot-clé | Description
Provider | Spécifie le fournisseur OLE DB Provider pour SQL Server.
Data Source | Spécifie le nom d'un serveur.

Exemple de document XML

Le fournisseur OLE DB Simple Provider (OSP) a été amélioré dans MDAC 2.7 pour prendre en charge l'ouverture d'objets Recordsets ADO hiérarchiques sur des fichiers XML arbitraires. Ces fichiers XML peuvent contenir un schéma de persistance XML ADO, mais cela n'est pas nécessaire. Cela a été mis en œuvre en connectant le fournisseur OSP à MSXML2.DLL, c'est pourquoi MSXML2.DLL ou version ultérieure est requis.

Le fichier portfolio.xml utilisé dans l'exemple ci-après présente l'arborescence suivante :

Portfolio
   Stock
      Shares
      Symbol
      Price
      Info
         Company Name
         WebSite

Le DSO XML utilise des modèles heuristiques intégrés pour convertir les nœuds de l'arborescence XML en chapitres dans un objet Recordset hiérarchique.

À l'aide de ces modèles heuristiques intégrés, l'arborescence XML est convertie en objet Recordset hiérarchique à deux niveaux de la forme suivante :

Parent Recordset
Shares, Symbol, Price, $Text
   Child Recordset
      Company Name, WebSite, $Text

Notez que les balises Portfolio et Info ne sont pas représentées dans l'objet Recordset hiérarchique. Pour plus d'informations sur la conversion des arborescences XML en objets Recordset par le DSO XML, consultez les règles ci-après. La colonne $Text est présentée ci-après.

Règles d'affectation d'éléments XML et d'attributs aux colonnes et lignes

Le DSO XML suit une procédure pour affecter des éléments et des attributs aux colonnes et aux lignes dans les applications liées aux données. XML est modelé comme une arborescence à une balise contenant la hiérarchie entière. Par exemple, la description XML d'un livre peut comporter des balises de chapitres, figures et sections. Le niveau supérieur est représenté par la balise du livre qui contient les sous-éléments chapitre, figure et section. Lorsque le DSO XML mappe les éléments XML sur les lignes et colonnes, les sous-éléments et non pas le niveau supérieur, sont convertis.

Le DSO XML utilise la procédure suivante pour convertir les sous-éléments :

  • Chaque sous-élément et attribut correspond à une colonne dans un objet Recordset de la hiérarchie.
  • Le nom de la colonne est identique à celui du sous-élément ou de l'attribut, sauf si l'élément parent comporte un attribut et un sous-élément du même nom. Dans ce cas, "!" est ajouté au nom de la colonne du sous-élément.
  • Chaque colonne est soit une colonne simple contenant des valeurs scalaires (généralement des chaînes), soit une colonne Recordset contenant les objets Recordset enfants.
  • Les colonnes d'attributs sont toujours des colonnes simples.
  • Les colonnes de sous-éléments sont des colonnes Recordset si le sous-élément dispose de ses propres sous-éléments et/ou attributs, ou si le parent du sous-élément comporte plusieurs instances du sous-élément en tant qu'enfant. Dans le cas contraire, il s'agit d'une colonne simple.
  • Lorsque plusieurs instances d'un sous-élément (sous différents parents) existent, la colonne de ce sous-élément est une colonne Recordset si l'une des instances implique une colonne Recordset ; la colonne est une colonne simple uniquement si toutes les instances impliquent une colonne simple.
  • Tous les objets Recordset comportent une colonne supplémentaire nommée $Text.

Pour plus d'informations sur le DSO XML, consultez le kit de développement XML.

Le code requis pour créer un objet Recordset se présente comme suit :

   Dim adoConn as ADODB.Connection
   Dim adoRS as ADODB.Recordset

   Set adoRS = New ADODB.Connection
   Set adoRS = New ADODB.Recordset

   adoConn.Open "Provider=MSDAOSP; Data Source=MSXML2.DSOControl.2.6;"
   adoRS.Open "http://WebServer/VRoot/portfolio.xml, adoConn
Remarque Vous pouvez spécifier le chemin d'accès au fichier de données en utilisant quatre conventions de dénomination.
   'HTTP://
   adoRS.Open "http://WebServer/VRoot/portfolio.xml", adoConn
   'FILE://
   adoRS.Open "file:/// C:\\Directory\\portfolio.xml", adoConn
   'UNC Path
   adoRS.Open "\\ComputerName\ShareName\portfolio.xml", adoConn
   'Full DOS Path
   adoRS.Open "C:\Directory\portfolio.xml", adoConn

Après avoir ouvert l'objet Recordset, vous pouvez utiliser les commandes de navigation habituelles de l'objet Recordset ADO.

Limitations liées aux objets Recordset générés par le fournisseur OSP :

  • Les curseurs clients (adUseClient) ne sont pas pris en charge.
  • Les objets Recordset hiérarchiques créés sur des fichiers XML arbitraires ne peuvent pas être enregistrés de façon permanente à l'aide de la méthode Recordset.Save.
  • Les objets Recordset créés avec le fournisseur OSP sont accessibles en lecture seule.
  • Le DSO XML ajoute une colonne de données ($Text) à chaque objet Recordset de la hiérarchie.

Pour plus d'informations sur le fournisseur OLE DB Simple Provider, consultez la trousse à outils OLE DB Simple Provider Toolkit dans la section OLE DB de la documentation du kit de développement MDAC.

Exemple de code

L'exemple Visual Basic suivant illustre l'ouverture d'un fichier XML arbitraire, la construction d'un objet Recordset hiérarchique et l'écriture récursive de chaque enregistrement d'un objet Recordset dans la fenêtre de débogage.

Voici un fichier XML simple contenant des cours d'actions. Cet exemple utilise ce fichier pour construire un objet Recordset à deux niveaux.

<portfolio>
   <stock>
      <shares>100</shares>
      <symbol>MSFT</symbol>
      <price>$70.00</price>
      <info>
         <companyname>Microsoft Corporation</companyname>
         <website>http://www.microsoft.com</website>
      </info>
   </stock>
   <stock>
      <shares>100</shares>
      <symbol>AAPL</symbol>
      <price>$107.00</price>
      <info>
         <companyname>Apple Computer, Inc.</companyname>
         <website>http://www.apple.com</website>
      </info>
   </stock>
   <stock>
      <shares>100</shares>
      <symbol>DELL</symbol>
      <price>$50.00</price>
      <info>
         <companyname>Dell Corporation</companyname>
         <website>http://www.dell.com</website>
      </info>
    </stock>
    <stock>
       <shares>100</shares>
       <symbol>INTC</symbol>
       <price>$115.00</price>
       <info>
          <companyname>Intel Corporation</companyname>
          <website>http://www.intel.com</website>
       </info>
   <stock>
</portfolio>

Voici deux exemples de sous-procédures Visual Basic. La première crée l'objet Recordset et le passe à la sous-procédure WalkHier, qui récursivement parcourt la hiérarchie et écrit chaque objet Field dans chaque enregistrement de l'objet Recordset dans la fenêtre de débogage.

Private Sub BrowseHierRecordset()
' Add ADO 2.5 to Project/References
' No need to add MSXML2, ADO just passes the ProgID through to the OSP.

    Dim adoConn As ADODB.Connection
    Dim adoRS As ADODB.Recordset
    Dim adoChildRS As ADODB.Recordset

    Set adoConn = New ADODB.Connection
    Set adoRS = New ADODB.Recordset
    Set adoChildRS = ADODB.Recordset

    adoConn.Open "Provider=MSDAOSP; Data Source=MSXML2.DSOControl.2.6;"
    adoRS.Open "http://bwillett3/Kowalski/portfolio.xml", adoConn

    Dim iLevel As Integer
    iLevel = 0
    WalkHier iLevel, adoRS

End Sub

Sub WalkHier(ByVal iLevel As Integer, ByVal adoRS As ADODB.Recordset)
    iLevel = iLevel + 1
    PriorLevel = iLevel
    While Not adoRS.EOF
        For ndx = 0 To adoRS.Fields.Count - 1
            If adoRS.Fields(ndx).Name <> "$Text" Then
                If adoRS.Fields(ndx).Type = adChapter Then
                    Set adoChildRS = adoRS.Fields(ndx).Value
                    WalkHier iLevel, adoChildRS
                Else
                    Debug.Print iLevel & ": adoRS.Fields(" & ndx & _
                       ") = " & adoRS.Fields(ndx).Name & " = " & _
                       adoRS.Fields(ndx).Value
                End If
            End If
        Next ndx
        adoRS.MoveNext
    Wend
    iLevel = PriorLevel
End Sub

© 1998-2002 Microsoft Corporation. Tous droits réservés.


Obtention d'aide auprès du Support technique Microsoft

Si la documentation Microsoft Data Access Components (MDAC) ne répond pas à toutes vos questions, vous pouvez résoudre rapidement vos problèmes en accédant au site Web Support technique Microsoft à l'adresse suivante : http://www.microsoft.com/support.

Pour obtenir des informations et des ressources supplémentaires sur le développement à l'aide des produits et technologies Microsoft, visitez le site MSDN à l'adresse suivante : http://msdn.microsoft.com.