内に含まその他のドキュメントサポート リソース | PDF 文書ファイルをダウンロードする (1328 KB)
Chapitre 10 Accès aux bases de donnéesStarOffice possède une interface de base de données intégrée (indépendante de tout système) nommée Star Database Connectivity (SDBC). Cette interface a été développée dans le but d'offrir l'accès au plus grand nombre possible de sources de données différentes. Dans cet objectif, l'accès aux sources de données s'effectue via des pilotes. Les sources à partir desquelles les pilotes récupèrent leurs données n'ont pas d'importance pour un utilisateur SDBC. Certains pilotes accèdent aux bases de données de fichiers et y récupèrent directement les données. D'autres utilisent des interfaces standard telles que JDBC ou ODBC. Toutefois, il existe également des pilotes spéciaux qui utilisent le carnet d'adresses MAPI, les annuaires LDAP ou les feuilles de calcul StarOffice comme sources de données. Les pilotes étant basés sur des composants UNO, il est possible de développer d'autres pilotes et, par conséquent, d'ouvrir de nouvelles sources de données. Le document StarOffice Developer's Guide contient de plus amples informations à ce sujet. Remarque – En termes de concept, SDBC est comparable aux bibliothèques ADO et DAO disponibles dans VBA. Il permet l'accès de haut niveau aux bases de données, quels que soient les serveurs de base de données sous-jacents. Remarque – L'interface de base de données de StarOffice s'est développée lors du lancement de StarOffice 8. Par le passé, on accédait aux bases de données principalement à l'aide d'un ensemble de méthodes de l'objet Application, mais l'interface de StarOffice 7 se subdivise en plusieurs objets. Un service DatabaseContext sert d'objet racine pour les fonctions de base de données. SQL : un langage dédié aux requêtesLe langage SQL permet aux utilisateurs de SDBC d'effectuer des requêtes. Pour comparer les différences entre les divers langages SQL, les composants SDBC de StarOffice ont leur propre analyseur SQL. La fenêtre de requête permet de vérifier les commandes SQL saisies et de corriger les erreurs de syntaxe simples, comme celles qui sont associées aux caractères majuscules et minuscules. Si un pilote autorise l'accès à une source de données qui ne prend pas en charge SQL, il doit convertir indépendamment les commandes SQL transférées vers l'accès natif requis. Remarque – L'implémentation SQL à partir de SDBC est orientée vers la norme SQL-ANSI. Les extensions spécifiques à Microsoft, telles que la construction INNER JOIN ne sont pas prises en charge. Elles doivent être remplacées par des commandes standard (ainsi INNER JOIN devra être remplacée par la clause WHERE correspondante). Types d'accès aux bases de donnéesL'interface de base de données de StarOffice est disponible dans les applications StarOffice Writer et StarOffice Calc, ainsi que dans les formulaires de base de données. Dans StarOffice Writer, les lettres standard peuvent être créées à l'aide de sources de données SDBC puis imprimées. Il existe également une option permettant de déplacer les données de la fenêtre de la base de données dans des documents texte à l'aide de la fonction glisser-déposer. Si l'utilisateur insère une table de base de données dans une feuille de calcul, StarOffice crée une zone de table qui peut être mise à jour par un clic de souris si les données d'origine ont été modifiées. À l'inverse, il est possible de déplacer les données d'une feuille de calcul vers une table de base de données et d'importer une base de données. Enfin, StarOffice offre un mécanisme pour les formulaires basés sur des bases de données. Pour cela, l'utilisateur doit d'abord créer un formulaire standard StarOffice Writer ou StarOffice Calc, puis lier les champs à une base de données. Toutes les options indiquées ici sont basées sur l'interface utilisateur de StarOffice. Aucune connaissance en programmation n'est nécessaire pour utiliser les fonctions correspondantes. Cependant, ce chapitre fournit peu d'informations concernant les fonctions spécifiées : il concerne principalement l'interface de programmation à partir de SDBC, qui permet l'automatisation des requêtes aux bases de données et offre de ce fait une plus grande variété d'applications. Il est toutefois nécessaire de posséder une connaissance élémentaire du fonctionnement des bases de données et du langage de requête SQL pour bien comprendre les sections qui suivent. Sources de donnéesUne base de données peut être intégrée à StarOffice en créant ce que l'on nomme couramment une source de données. L'interface utilisateur offre une option correspondante pour créer des sources de données dans le menu Extras. Vous pouvez également créer des sources de données pour les utiliser dans StarOffice Basic. Un objet de contexte de base de données créé à l'aide de la fonction createUnoService sert de point de départ pour accéder à une source de données. Il est basé sur le service com.sun.star.sdb.DatabaseContext et sert d'objet racine pour toutes les opérations de la base de données. L'exemple suivant montre comment un objet de contexte de base de données peut être créé, puis utilisé pour déterminer les noms de toutes les sources de données disponibles. Il affiche les noms dans une boîte de message. Dim DatabaseContext As Object
Dim Names
Dim I As Integer
DatabaseContext = createUnoService("com.sun.star.sdb.DatabaseContext")
Names = DatabaseContext.getElementNames()
For I = 0 To UBound(Names())
MsgBox Names(I)
Next I
Les sources de données individuelles sont basées sur le service com.sun.star.sdb.DataSource et peuvent être déterminées à partir du contexte de la base de données en utilisant la méthode getByName : Dim DatabaseContext As Object
Dim DataSource As Object
DatabaseContext = createUnoService("com.sun.star.sdb.DatabaseContext")
DataSource = DatabaseContext.getByName("Customers")
Cet exemple crée un objet DataSource pour une source de données nommée Customers. Les sources de données offrent un ensemble de propriétés qui, à leur tour, fournissent des renseignements d'ordre général concernant l'origine des données et des informations concernant les méthodes d'accès. Ces propriétés sont les suivantes :
Remarque – Les sources de données de StarOffice ne sont pas comparables une à une avec les sources de données ODBC. Une source de données ODBC ne recouvre que les informations concernant l'origine des données, tandis qu'une source de données de StarOffice inclut également un ensemble d'informations relatives à l'affichage des données dans les fenêtres de base de données de StarOffice. RequêtesIl est possible d'assigner des requêtes prédéfinies à une source de données. StarOffice note les commandes SQL des requêtes afin qu'elles soient disponibles à tout moment. Les requêtes simplifient l'utilisation des bases de données car elles peuvent s'ouvrir d'un simple clic de souris. Elles permettent ainsi aux novices d'employer les commandes SQL. Un objet prenant en charge le service com.sun.star.sdb.QueryDefinition se trouve derrière une requête. L'accès aux requêtes s'effectue grâce à la méthode QueryDefinitions de la source de données. L'exemple suivant énumère les noms des requêtes à la source de données qui peuvent être établies dans un message. Dim DatabaseContext As Object
Dim DataSource As Object
Dim QueryDefinitions As Object
Dim QueryDefinition As Object
Dim I As Integer
DatabaseContext = createUnoService("com.sun.star.sdb.DatabaseContext")
DataSource = DatabaseContext.getByName("Customers")
QueryDefinitions = DataSource.getQueryDefinitions()
For I = 0 To QueryDefinitions.Count() - 1
QueryDefinition = QueryDefinitions(I)
MsgBox QueryDefinition.Name
Next I
Outre la propriété Name utilisée dans cet exemple, com.sun.star.sdb.QueryDefinition offre de nombreuses autres propriétés. Ces méthodes sont les suivantes :
L'exemple qui suit montre comment un objet Query peut être créé par programmation et assigné à une source de données. Dim DatabaseContext As Object
Dim DataSource As Object
Dim QueryDefinitions As Object
Dim QueryDefinition As Object
Dim I As Integer
DatabaseContext = createUnoService("com.sun.star.sdb.DatabaseContext")
DataSource = DatabaseContext.getByName("Customers")
QueryDefinitions = DataSource.getQueryDefinitions()
QueryDefinition = createUnoService("com.sun.star.sdb.QueryDefinition")
QueryDefinition.Command = "SELECT * FROM Customer"
QueryDefinitions.insertByName("NewQuery", QueryDefinition)
L'objet Query est d'abord créé en utilisant l'appel createUnoService, initialisé, puis inséré dans l'objet QueryDefinitions à l'aide de insertByName. Liaisons avec des formulaires de base de donnéesPour simplifier l'utilisation des sources de base de données, StarOffice fournit une option permettant de lier les sources de données et les formulaires de base de données. Ces liaisons sont disponibles par l'intermédiaire de la méthodegetBookmarks() . Celle-ci retourne un conteneur nommé (com.sun.star.sdb.DefinitionContainer) contenant toutes les liaisons de la source de données. Les repères de texte sont accessibles par l'intermédiaire de Name ou Index. L'exemple suivant détermine l'URL du repère de texte MyBookmark. Dim DatabaseContext As Object
Dim DataSource As Object
Dim Bookmarks As Object
Dim URL As String
Dim I As Integer
DatabaseContext = createUnoService("com.sun.star.sdb.DatabaseContext")
DataSource = DatabaseContext.getByName("Customers")
Bookmarks = DataSource.Bookmarks()
URL = Bookmarks.getByName("MyBookmark")
MsgBox URL
Accès à la base de donnéesPour accéder à une base de données, il faut y être connecté. Une voie de transfert est donc utilisée pour permettre la communication directe avec la base de données. Contrairement aux sources de données présentées dans la section précédente, la connexion à la base de données doit donc être rétablie à chaque fois que le programme est relancé. StarOffice offre différentes manières d'établir des connexions à la base de données. La méthode basée sur une source de données existante est illustrée ci-dessous. Dim DatabaseContext As Object
Dim DataSource As Object
Dim Connection As Object
Dim InteractionHandler as Object
DatabaseContext = createUnoService("com.sun.star.sdb.DatabaseContext")
DataSource = DatabaseContext.getByName("Customers")
If Not DataSource.IsPasswordRequired Then
Connection = DataSource.GetConnection("","")
Else
InteractionHandler = createUnoService("com.sun.star.sdb.InteractionHandler")
Connection = DataSource.ConnectWithCompletion(InteractionHandler)
End If
Le code utilisé dans cet exemple commence par vérifier si la base de données est protégée par mot de passe. Dans le cas contraire, il crée la connexion à la base de données requise à l'aide de l'appel GetConnection. Les deux chaînes vides de la ligne de commande correspondent au nom et au mot de passe de l'utilisateur. Si la base de données est protégée par mot de passe, l'exemple crée un objet InteractionHandler et ouvre la connexion à la base de données à l'aide la méthode ConnectWithCompletion. L'InteractionHandler garantit que StarOffice demande les données de connexion requises à l'utilisateur. Itération de tablesDans StarOffice, pour accéder à une table, on utilise généralement l'objet ResultSet. Un objet ResultSet est un ensemble courant de données issues d'un volume de résultats, obtenu à l'aide de la commande SELECT. L'exemple montre l'utilisation d'un objet ResultSet pour interroger les valeurs à partir d'une table de base de données. Dim DatabaseContext As Object
Dim DataSource As Object
Dim Connection As Object
Dim InteractionHandler as Object
Dim Statement As Object
Dim ResultSet As Object
DatabaseContext = createUnoService("com.sun.star.sdb.DatabaseContext")
DataSource = DatabaseContext.getByName("Customers")
If Not DataSource.IsPasswordRequired Then
Connection = DataSource.GetConnection("","")
Else
InteractionHandler = createUnoService("com.sun.star.sdb.InteractionHandler")
Connection = DataSource.ConnectWithCompletion(InteractionHandler)
End If
Statement = Connection.createStatement()
ResultSet = Statement.executeQuery("SELECT CustomerNumber FROM Customer")
If Not IsNull(ResultSet) Then
While ResultSet.next
MsgBox ResultSet.getString(1)
Wend
End If
Une fois la connexion à la base de données établie, l'exemple crée un objet Statement via l'appel Connection.createStatement. Cet objet Statement utilise ensuite l'appel executeQuery pour retourner l'objet ResultSet courant. Le programme vérifie alors si l'objet ResultSet existe et, le cas échéant, parcourt les enregistrements de données à l'aide d'une boucle. Les valeurs requises (dans notre exemple, celles du champ CustomerNumber) retournent l'objet ResultSet en utilisant la méthode getString, selon laquelle le paramètre 1 détermine que l'appel se relie aux valeurs de la première colonne. Remarque – L'objet ResultSet de SDBC est comparable à l'objet Recordset de DAO et ADO, car il offre également l'accès itératif à une base de données. Remarque – L'accès à la base de données s'effectue en réalité dans StarOffice 8 par l'intermédiaire d'un objet ResultSet. Celui-ci reflète le contenu d'une table ou le résultat d'une commande SQL-SELECT. Dans les versions précédentes, la navigation au sein des données s'effectuait grâce aux méthodes résidentes telles que DataNextRecord fournies par l'objet ResultSet dans l'objet Application. Méthodes de récupération des valeurs en fonction du typeComme le montre l'exemple de la section précédente, StarOffice offre une méthode getString pour accéder au contenu des tables. Cette méthode retourne le résultat sous la forme d'une chaîne. Les méthodes get suivantes sont disponibles :
Dans tous les cas, le nombre de colonnes doit apparaître comme un paramètre dont les valeurs doivent être interrogées. Variantes de l'objet ResultSetLa rapidité d'accès aux bases de données est souvent critique. C'est la raison pour laquelle StarOffice offre plusieurs moyens pour optimiser les objets ResultSet et ainsi contrôler la vitesse d'accès. Plus un objet ResultSet offre de fonctions, plus son implémentation est généralement complexe et plus lentes sont les fonctions. Un objet ResultSet simple, tel que celui présenté à la section "Itération de tables", offre les fonctions minimales. Il ne permet l'application de l'itération que vers l'avant, et pour les valeurs à interroger. Par conséquent, d'autres options de navigation plus complexes, telles que la modification des valeurs, ne sont pas incluses. L'objet Statement utilisé pour créer l'objet ResultSet offre certaines propriétés qui permettent d'influer sur les fonctions de celui-ci :
Les valeurs définies dans com.sun.star.sdbc.ResultSetConcurrency sont les suivantes :
Le groupe de constantes com.sun.star.sdbc.ResultSetConcurrency fournit les spécifications suivantes :
Remarque – Un objet ResultSet contenant les propriétés READ_ONLY et SCROLL_INSENSITIVE correspond à un jeu d'enregistrements du type Snapshot dans ADO et DAO. Lorsque vous utilisez les propriétés UPDATEABLE et SCROLL_SENSITIVE de l'objet ResultSet, celui-ci possède des fonctions d'étendue comparable à un objet Recordset de type Dynaset dans ADO et DAO. Méthodes de navigation dans les objets ResultSetsSi un objet ResultSet est de type SCROLL_INSENSITIVE ou SCROLL_SENSITIVE, il prend en charge un ensemble de méthodes de navigation dans le stock de données. Les méthodes centrales sont les suivantes :
Toutes les méthodes retournent un paramètre de type Boolean qui spécifie si la navigation a réussi ou non. Pour déterminer la position courante du curseur, les méthodes de test suivantes sont fournies et toutes retournent une valeur de type Boolean :
Modification des enregistrements de donnéesSi un objet ResultSet a été créé avec la valeur ResultSetConcurrency = UPDATEABLE, son contenu est modifiable. Ceci s'applique seulement tant que la commande SQL permet la réécriture des données dans la base de données (dépend du principe). Par exemple, ceci n'est pas possible pour les commandes SQL complexes avec des colonnes liées ou des valeurs cumulées. L'objet ResultSet fournit des méthodes update pour modifier les valeurs. Elles sont structurées de la même manière que les méthodes get qui permettent de récupérer des valeurs. La méthode updateString, par exemple, permet l'écriture d'une chaîne. Après modification, les valeurs doivent être transférées dans la base de données à l'aide de la méthodeupdateRow(). L'appel doit intervenir avant la prochaine commande de navigation, sinon les valeurs sont perdues. Une erreur faite pendant les modifications peut être annulée à l'aide de la méthodecancelRowUpdates(). Cet appel n'est possible que si les données n'ont pas été réécrites dans la base de données à l'aide de la méthodeupdateRow(). |