StarOffice 8 Programmierhandbuch für BASIC
검색에만이 책은
PDF로 이 문서 다운로드 (1551 KB)

Kapitel 10 Datenbankzugriff

StarOffice verfügt über eine integrierte, systemunabhängige Datenbankschnittstelle namens Star Database Connectivity (SDBC). Ziel bei der Entwicklung der Schnittstelle war es, Zugriff auf möglichst viele unterschiedliche Datenquellen zu gewähren.

Um dies zu ermöglichen, erfolgt der Zugriff auf Datenquellen über Treiber. Woher die Treiber ihre Daten beziehen, ist aus Sicht eines SDBC-Anwenders unerheblich. Einige Treiber greifen auf dateibasierte Datenbanken zu und entnehmen ihnen die Daten direkt. Andere verwenden Standardschnittstellen wie JDBC oder ODBC. Es existieren aber auch Spezialtreiber, die beispielsweise auf das MAPI-Adressbuch, LDAP-Verzeichnisse oder StarOffice-Tabellendokumente als Datenquellen zugreifen.

Da die Treiber auf UNO-Komponenten basieren, ist es möglich, weitere Treiber zu entwickeln und so abermals neue Datenquellen zu erschließen. Detailinformationen zu diesem Thema finden Sie im StarOffice Developer's Guide.


Hinweis –

SDBC ist vom Konzept her mit den in VBA vorhandenen Bibliotheken ADO beziehungsweise DAO vergleichbar. Es gestattet einen Highlevel-Zugriff auf Datenbanken, unabhängig von den darunter liegenden Datenbank-Backends.



Hinweis –

Die Datenbankschnittstelle von StarOffice ist mit der Veröffentlichung von StarOffice 8 umfangreicher geworden. Zwar wurde in der Vergangenheit primär unter Verwendung einer Reihe von Methoden des Application-Objekts auf Datenbanken zugegriffen, ist die Schnittstelle von StarOffice 7 in mehrere Objekte untergliedert. Als Stammobjekt für die Datenbankfunktionen dient ein DatabaseContext.


SQL als Abfragesprache

Als Abfragesprache steht den Anwendern von SDBC die Sprache SQL zur Verfügung. Um die Unterschiede verschiedener SQL-Dialekte auszugleichen besitzt die SDBC-Komponente von StarOffice einen eigenen SQL-Parser. Dieser prüft die über das Abfragefenster eingegebenen SQL-Befehle und korrigiert einfache Syntaxfehler, etwa im Zusammenhang mit der Groß- und Kleinschreibung.

Ermöglicht ein Treiber Zugriff auf eine Datenquelle, die kein SQL unterstützt, so muss er die übergebenen SQL-Befehle eigenständig auf den notwendigen nativen (systemeigenen) Zugriff umsetzen.


Hinweis –

Die SQL-Implementation von SDBC orientiert sich am SQL-ANSI-Standard. Microsoft-spezifische Erweiterungen wie das INNER JOIN-Konstrukt werden nicht unterstützt. Diese sind durch Standard-Befehle zu ersetzen (INNER JOIN beispielsweise durch eine entsprechende WHERE-Klausel).


Arten von Datenbankzugriff

Die Datenbankschnittstelle von StarOffice steht in den Anwendungen StarOffice Writer und StarOffice Calc sowie in den Datenbankformularen zur Verfügung.

In StarOffice Writer ist es möglich, Serienbriefe unter Zuhilfenahme von SDBC-Datenquellen zu erzeugen und diese auszudrucken. Außerdem besteht die Möglichkeit, Daten über Drag & Drop aus dem Datenbankfenster in Textdokumente zu übernehmen.

Zieht der Anwender eine Datenbanktabelle in ein Tabellendokument, so erzeugt StarOffice einen Tabellenbereich, der sich bei Änderungen der Originaldaten per Mausklick aktualisieren lässt. Umgekehrt ist es möglich, Tabellendokumentdaten auf eine Datenbanktabelle zu ziehen und so einen Datenbank-Import durchzuführen.

Schließlich stellt StarOffice einen Mechanismus für datenbankbasierte Formulare zur Verfügung. Hierzu erstellt der Anwender zunächst ein Standardformular in StarOffice Writer oder StarOffice Calc und verknüpft die Felder anschließend mit einer Datenbank.

Alle genannten Möglichkeiten bedienen sich dabei ausschließlich der Benutzeroberfläche von StarOffice. Zur Verwendung der entsprechenden Funktionen sind keinerlei Programmierkenntnisse erforderlich.

In diesem Kapitel geht es jedoch weniger um die genannten Funktionen. Viel mehr steht die Programmierschnittstelle von SDBC im Vordergrund, die eine automatisierte Abfrage von Datenbanken gestattet und so eine noch viel größere Bandbreite an Anwendungen ermöglicht.

Für das Verständnis der folgenden Seiten sind Grundkenntnisse über die Funktionsweise von Datenbanken sowie die Abfragesprache SQL notwendig.

Datenquellen

Die Einbindung einer Datenbank in StarOffice erfolgt über die Erstellung einer sogenannten Datenquelle. Die Benutzeroberfläche stellt im Menü Extras eine entsprechende Möglichkeit zum Erstellen von Datenquellen zur Verfügung. Sie sind jedoch auch in der Lage, Datenquellen zu erstellen und mit ihnen in StarOffice Basic zu arbeiten.

Ausgangspunkt für den Zugriff auf eine Datenquelle bildet ein Datenbankkontext-Objekt, das mit der Funktion createUnoService erstellt wird. Es basiert auf dem Dienst com.sun.star.sdb.DatabaseContext und stellt das Stammobjekt für alle Datenbankoperationen dar.

Das folgende Beispiel zeigt, wie sich ein Datenbankkontext erstellen und zur Ermittlung der Namen aller verfügbaren Datenquellen verwenden lässt. Es gibt die Namen in einem Meldungsfenster aus.

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

Die einzelnen Datenquellen basieren auf dem Dienst com.sun.star.sdb.DataSource und lassen sich aus dem Datenbankkontext mit der Methode getByName ermitteln:

Dim DatabaseContext As Object
Dim DataSource As Object

DatabaseContext = createUnoService("com.sun.star.sdb.DatabaseContext")
DataSource = DatabaseContext.getByName("Customers")

Das Beispiel erstellt ein DataSource-Objekt für eine Datenquelle namens Customers.

Datenquellen stellen eine Reihe von Eigenschaften zur Verfügung, die allgemeine Informationen über den Ursprung der Daten sowie Informationen über die Zugriffsmöglichkeiten liefern. Die Eigenschaften lauten:

  • Name (String): Name der Datenquelle.

  • URL (String): URL der Datenquelle in der Form jdbc: subprotocol : subname oder sdbc: subprotocol : subname.

  • Info (Array): ein Array mit PropertyValue-Paaren, die die Verbindungsparameter enthalten (normalerweise zumindest Benutzername und Passwort).

  • User (String): Name des Benutzers.

  • Password (String): Passwort des Benutzers (wird nicht gespeichert).

  • IsPasswordRequired (Boolean): das Passwort ist erforderlich und wird interaktiv vom Benutzer abgefragt.

  • IsReadOnly (Boolean): ermöglicht schreibgeschützten Zugriff auf die Datenbank (nur Lesen).

  • NumberFormatsSupplier (Object): Objekt mit den für die Datenbank verfügbaren Zahlenformaten (unterstützt die Schnittstelle com.sun.star.util.XNumberFormatsSupplier, siehe Abschnitt Zahlen-, Datums- und Textformat).

  • TableFilter (Array): Liste der anzuzeigenden Tabellennamen.

  • TableTypeFilter (Array): Liste der anzuzeigenden Tabellentypen. Mögliche Werte sind TABLE, VIEW und SYSTEM TABLE.

  • SuppressVersionColumns (Boolean): unterdrückt die Anzeige von Spalten, die der Versionsverwaltung dienen.


Hinweis –

Die Datenquellen von StarOffice sind nicht 1:1 mit den Datenquellen in ODBC vergleichbar. Während eine ODBC-Datenquelle ausschließlich Informationen über den Ursprung der Daten umfasst, enthält eine Datenquelle in StarOffice darüber hinaus eine Reihe von Informationen zur Darstellung der Daten innerhalb des Datenbankfensters von StarOffice.


Abfragen

Einer Datenquelle lassen sich vordefinierte Abfragen zuordnen. StarOffice merkt sich die SQL-Befehle der Abfragen, so dass sie zu jedem Zeitpunkt zur Verfügung stehen. Abfragen dienen zur Vereinfachung der Arbeit mit Datenbanken, da sie sich mit einem einfachen Mausklick öffnen lassen und auch Anwendern ohne SQL-Kenntnisse die Möglichkeit zum Absetzen von SQL-Befehlen ermöglichen.

Hinter einer Abfrage verbirgt sich ein Objekt, das den Dienst com.sun.star.sdb.QueryDefinition unterstützt. Der Zugriff auf die Abfragen erfolgt über die Methode QueryDefinitions der Datenquelle.

Im folgenden Beispiel werden die Namen der Datenquellenabfragen, die gebildet werden können, in einem Meldungsfenster aufgelistet.

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

Neben der im Beispiel verwendeten Name-Eigenschaft hält com.sun.star.sdb.QueryDefinition eine ganze Reihe weiterer Eigenschaften bereit. Dies sind:

  • Name (String): Name der Abfrage.

  • Command (String): SQL-Befehl (normalerweise ein SELECT-Befehl).

  • UpdateTableName (String): für Abfragen, die auf mehreren Tabellen basieren: Name der Tabelle, in der Wertänderungen möglich sind.

  • UpdateCatalogName (String): Name des Update-Tabellenkatalogs.

  • UpdateSchemaName (String): Name des Update-Tabellenschemas.

Das folgende Beispiel zeigt, wie sich ein Abfrageobjekt programmgesteuert erstellen und einer Datenquelle zuweisen lässt.

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)

Das Abfrageobjekt wird zunächst über den Aufruf createUnoService erzeugt, anschließend initialisiert und dann mit insertByName in das QueryDefinitions-Objekt eingefügt.

Verknüpfungen mit Datenbankformularen

Um die Arbeit mit Datenquellen zu vereinfachen, bietet StarOffice eine Möglichkeit, die Datenquellen mit Datenbankformularen zu verknüpfen. Die Verknüpfungen stehen über die Methode getBookmarks() zur Verfügung. Sie gibt einen benannten Container (com.sun.star.sdb.DefinitionContainer) zurück, der alle Verknüpfungen der Datenquelle enthält. Ein Zugriff auf die Lesezeichen ist wahlweise über Name oder Index möglich.

Das folgende Beispiel ermittelt den URL des Lesezeichens 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

Datenbankzugriff

Für den Zugriff auf eine Datenbank ist eine Datenbankverbindung notwendig. Dabei handelt es sich um einen Übertragungskanal, der eine direkte Kommunikation mit der Datenbank ermöglicht. Im Gegensatz zu den im vorigen Abschnitt vorgestellten Datenquellen muss die Datenbankverbindung daher bei jedem Programmstart neu hergestellt werden.

StarOffice bietet verschiedene Arten, um Datenbankverbindungen herzustellen. Im Folgenden wird eine Methode erklärt, die eine vorhandene Datenquelle voraussetzt.

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

Der Beispielcode prüft zunächst, ob die Datenbank passwortgeschützt ist. Wenn nicht, erzeugt er die notwendige Datenbankverbindung mit dem Aufruf GetConnection. Die beiden leeren Zeichenfolgen in der Befehlszeile stehen dabei für den Benutzernamen und das Passwort.

Ist die Datenbank passwortgeschützt, so erzeugt das Beispiel einen InteractionHandler und öffnet die Datenbankverbindung mit der Methode ConnectWithCompletion. Der InteractionHandler sorgt dafür, dass StarOffice den Benutzer nach den erforderlichen Anmeldedaten fragt.

Iterieren von Tabellen

Der Zugriff auf eine Tabelle erfolgt in StarOffice normalerweise über das ResultSet-Objekt. Ein ResultSet ist eine Art Markierung, die einen aktuellen Satz von Daten innerhalb einer mit dem SELECT-Befehl erhaltenen Ergebnismenge kennzeichnet.

Das Beispiel zeigt, wie sich mit einem ResultSet Werte aus einer Datenbanktabelle abfragen lassen.

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

Nachdem die Datenbankverbindung hergestellt wurde, erzeugt der Beispielcode zunächst über den Aufruf Connection.createObject ein Statement-Objekt. Dieses Statement-Objekt gibt dann über den Aufruf executeQuery den eigentlichen ResultSet zurück. Der Programmcode prüft dann, ob der ResultSet tatsächlich vorhanden ist, und geht die Datensätze mittels eine Schleife durch. Die erforderlichen Werte (im Beispiel aus dem Feld CustomerNumber) werden von dem ResultSet mit der Methode getString zurückgegeben, wobei der Parameter 1 festlegt, dass sich der Aufruf auf die Werte der ersten Spalte bezieht.


Hinweis –

Das ResultSet-Objekt von SDBC ist mit dem Recordset-Objekt von DAO beziehungsweise ADO vergleichbar, das ebenfalls einen iterativen Zugriff auf eine Datenbank gewährt.



Hinweis –

Der eigentliche Datenbankzugriff erfolgt in StarOffice 8 über ein ResultSet-Objekt. Es gibt den Inhalt einer Tabelle beziehungsweise das Ergebnis eines SQL-SELECT-Befehls wieder. Das ResultSet-Objekt stellte bisher im Application-Objekt angesiedelte Methoden zur Navigation innerhalb der Daten zur Verfügung (z. B. DataNextRecord).


Typspezifische Methoden zum Abrufen von Werten

Wie aus dem Beispiel des vorangegangenen Abschnitts ersichtlich, stellt StarOffice für den Zugriff auf Tabelleninhalte eine getString-Methode zur Verfügung. Die Methode gibt das Ergebnis in Form einer Zeichenfolge zurück. Folgende get-Methoden stehen zur Verfügung:

  • getByte(): unterstützt die SQL-Datentypen für Zahlen, Zeichen und Zeichenfolgen.

  • getShort(): unterstützt die SQL-Datentypen für Zahlen, Zeichen und Zeichenfolgen.

  • getInt(): unterstützt die SQL-Datentypen für Zahlen, Zeichen und Zeichenfolgen.

  • getLong(): unterstützt die SQL-Datentypen für Zahlen, Zeichen und Zeichenfolgen.

  • getFloat(): unterstützt die SQL-Datentypen für Zahlen, Zeichen und Zeichenfolgen.

  • getDouble(): unterstützt die SQL-Datentypen für Zahlen, Zeichen und Zeichenfolgen.

  • getBoolean(): unterstützt die SQL-Datentypen für Zahlen, Zeichen und Zeichenfolgen.

  • getString(): unterstützt alle SQL-Datentypen.

  • getBytes(): unterstützt die SQL-Datentypen für Binärwerte.

  • getDate(): unterstütz die SQL-Datentypen für Zahlen, Zeichenfolgen, Datum und Zeitstempel (Timestamp).

  • getTime(): unterstütz die SQL-Datentypen für Zahlen, Zeichenfolgen, Datum und Zeitstempel (Timestamp).

  • getTimestamp(): unterstütz die SQL-Datentypen für Zahlen, Zeichenfolgen, Datum und Zeitstempel (Timestamp).

  • getCharacterStream(): unterstützt die SQL-Datentypen für Zahlen, Zeichenfolgen und Binärwerte.

  • getUnicodeStream(): unterstützt die SQL-Datentypen für Zahlen, Zeichenfolgen und Binärwerte.

  • getBinaryStream(): Binärwerte.

  • getObject(): unterstützt alle SQL-Datentypen.

In allen Fällen sollte die Anzahl der Spalten, deren Werte abgefragt werden sollen, als Parameter angegeben werden.

Die ResultSet-Varianten

Bei Datenbankzugriffen ist die Geschwindigkeit häufig ein kritischer Faktor. StarOffice bietet daher einige Möglichkeiten, ResultSets zu optimieren und so die Zugriffsgeschwindigkeit zu steuern. Je mehr Funktionen von einem ResultSet zur Verfügung gestellt werden, um so komplexer ist dessen Implementierung in der Regel und umso langsamer arbeiten aus diesem Grund die Funktionen.

Ein einfacher ResultSet, so wie im Abschnitt "Iterieren von Tabellen" vorgestellt, bietet den kleinst möglichen Funktionsumfang. Er gestattet ausschließlich das vorwärts Iterieren sowie das Abfragen von Werten. Umfassendere Navigationsmöglichkeiten, wie beispielsweise das Ändern von Werten, gehören daher nicht zum Funktionsumfang.

Das für die Erzeugung des ResultSet verwendete Statement-Objekt bietet einige Eigenschaften, die es ermöglichen, Einfluss auf die Funktionen des ResultSet zu nehmen:

  • ResultSetConcurrency (Const): Festlegungen, ob Änderungen der Daten möglich sind (Festlegung gemäß com.sun.star.sdbc.ResultSetConcurrency).

  • ResultSetType (Const): Festlegungen des Typs der ResultSets (Festlegung gemäß com.sun.star.sdbc.ResultSetType).

Die in com.sun.star.sdbc.ResultSetConcurrency definierten Werte lauten:

  • UPDATABLE: ResultSet lässt Änderungen der Werte zu.

  • READ_ONLY: ResultSet lässt keine Änderungen zu.

Die Konstantengruppe com.sun.star.sdbc.ResultSetConcurrency stellt folgende Festlegungen zur Verfügung:

  • FORWARD_ONLY: ResultSet lässt nur Vorwärtsnavigation zu.

  • SCROLL_INSENSITIVE: ResultSet lässt jeden Navigationstyp zu, Änderungen der Originaldaten bleiben jedoch ohne Auswirkung.

  • SCROLL_SENSITIVE: ResultSet lässt jeden Navigationstyp zu, Änderungen der Originaldaten wirken sich auf ResultSet aus.


Hinweis –

Ein ResultSet mit den Eigenschaften READ_ONLY und SCROLL_INSENSITIVE entspricht einem Recordset des Typs Snapshot in ADO beziehungsweise DAO.

Bei Verwendung der ResultSet-Eigenschaften UPDATEABLE und SCROLL_SENSITIVE ist der Funktionsumfang eines ResultSet mit einem Recordset des Typs Dynaset aus ADO beziehungsweise DAO vergleichbar.


Methoden zur Navigation in ResultSets

Hat ein ResultSet den Typ SCROLL_INSENSITIVE oder SCROLL_SENSITIVE, so unterstützt er eine ganze Reihe von Methoden zur Navigation im Datenbestand. Die zentralen Methoden lauten:

  • next(): Navigation zum nächsten Datensatz.

  • previous(): Navigation zum vorangehenden Datensatz.

  • first(): Navigation zum ersten Datensatz.

  • last(): Navigation zum letzten Datensatz.

  • beforeFirst(): Navigation bis vor den ersten Datensatz.

  • afterLast(): Navigation bis hinter den letzten Datensatz.

Alle Methoden geben einen booleschen Parameter zurück, der angibt, ob die Navigation erfolgreich war.

Zur Ermittlung der aktuellen Cursor-Position stehen folgende Prüfmethoden zur Verfügung, die alle einen booleschen Wert zurückgeben:

  • isBeforeFirst(): ResultSet steht vor dem ersten Datensatz.

  • isAfterLast(): ResultSet steht hinter dem letzten Datensatz.

  • isFirst(): ResultSet ist der erste Datensatz.

  • isLast(): ResultSet ist der letzte Datensatz.

Ändern von Datensätzen

Wurde ein ResultSet mit dem Wert ResultSetConcurrency = UPDATEABLE erzeugt, so kann sein Inhalt bearbeitet werden. Dies gilt nur so lange, wie der SQL-Befehl prinzipbedingt ein Rückschreiben der Daten in die Datenbank zulässt. Bei komplexen SQL-Befehlen mit verknüpften Spalten oder akkumulierten Werten ist dies beispielsweise nicht möglich.

Für das Ändern von Werten bietet das ResultSet-Objekt Update-Methoden, die analog zu den get-Methoden zum Abrufen von Werten aufgebaut sind. Die updateString-Methode gestattet beispielsweise das Schreiben einer Zeichenfolge (String).

Nach dem Ändern müssen die Werte durch einen Aufruf der updateRow()-Methode in die Datenbank übertragen werden. Der Aufruf muss vor dem nächsten Navigationsbefehl erfolgen, da die Werte ansonsten verloren gehen.

Unterläuft bei den Änderungen ein Fehler, so lassen sich diese durch den Aufruf der cancelRowUpdates()-Methode verwerfen. Dieser Aufruf steht jedoch nur so lange zur Verfügung, wie die Daten nicht mit updateRow() in die Datenbank zurück geschrieben wurden.