StarSuite 8 Basic プログラミングガイド
この本のみを検索
PDF 文書ファイルをダウンロードする (1383 KB)

第 10 章 データベースアクセス

StarSuite には、Star Database Connectivity (SDBC) という名称の統合データベースインターフェースが用意されています (すべてのシステムから独立して存在)。こうしたインターフェースが開発された主な目的は、可能な限り広範なデータソースへのアクセスを可能にするためです。

このような目的を達成する一環として、データソースのアクセスにはドライバを使用しています。データソースからのデータ取得をこれらドライバに担当させることで、データソースと SDBC ユーザーとの関係を分離させることができます。こうしたドライバの中には、ファイルベースのデータベースにアクセスして、直接データを引き出すものがあります。その他のドライバは、JDBC や ODBC などの標準インターフェースを利用します。また MAPI アドレスブック、LDAP ディレクトリ、StarSuite 表計算ドキュメントをデータソースとしてアクセスする特殊なドライバもあります。

こうしたドライバは UNO コンポーネントをベースに使用しているため、ドライバを新規開発して新たなデータソースを使用することもできます。必要な詳細情報については、StarSuite の『開発ガイド』を参照してください。


注 –

SDBC の概念は、VBA の ADO および DAO ライブラリに相当するものです。これを利用することで、データベースのバックエンドに影響されることなく、ハイレベルなデータベースアクセスが行えます。



注 –

StarSuite のデータベースインターフェースは、StarSuite 8 の開発を通じて発展してきました。ただし従来は、主として Application オブジェクトの各種メソッドを用いてデータベースアクセスを行っていたため、StarSuite 7 のインターフェースも、いくつかのオブジェクトに細分されています。データベース関連の機能でルートオブジェクトとして用いられるものは、DatabaseContext です。


SQL: クエリー言語

SDBC 用のクエリー言語としては、SQL 言語が利用されています。一口に SQL といっても言語ごとに細かな相違点が存在するため、SDBC コンポーネントには StarSuite 独自の SQL パーサー (構文解析プログラム) が装備されています。これはクエリーウィンドウを用いて入力される SQL コマンドをチェックし、大文字と小文字の入力ミスなどに対する簡単なチェックを行います。

SQL をサポートしていないデータソースに対するアクセスをドライバが許可した場合、転送されてきた SQL コマンドに対して、アクセスに必要な変換が独自に行われます。


注 –

SDBC の使用する SQL は、SQL-ANSI 標準をベースとして実装されています。そのため Microsoft が独自に拡張した INNER JOIN コンストラクトなどはサポートされていません。このようなコマンドに関しては、該当する標準コマンドに置き換える必要があります (たとえば INNER JOINWHERE 句を用いた構文で記述可能)。


データベースアクセスの種類

StarSuite のデータベースインターフェースは、StarSuite Writer と StarSuite Calc の各アプリケーションおよび、データベースフォームから利用できます。

たとえば StarSuite Writer の場合、SDBC データソースを利用してレターを作成し、印刷できます。データベースウィンドウから文書ドキュメントへのデータの移動には、ドラッグ&ドロップも使用できます。

データベーステーブルから StarSuite の表計算ドキュメントにデータを移動した場合に作成される表は、オリジナルのデータに変更があった場合に、マウスクリックにより更新されます。また逆に、表計算ドキュメント側のデータをデータベーステーブルに移動することにより、データベースへのインポートを行うことも可能です。

StarSuite では、データベース内部のデータを、フォームの形式で利用することもできます。この処理を行うには、まず StarSuite Writer または StarSuite Calc 上でフォームを作成して、その上にデータベースとリンクしたフィールドを配置します。

これまでに説明した処理は、すべて StarSuite のユーザーインターフェースを利用しています。これらの機能のみを使用するだけであれば、プログラミングに関する特別な知識は不要です。

ただし本章では、このようなユーザーインターフェースに関する説明は最小限にとどめ、SDBC 用のプログラミングインターフェースに焦点を当て、データベースの自動検索処理をはじめとした、各種の操作法を説明します。

また、これらの説明を完全に理解するに当たっては、データベースの機能および SQL のクエリー言語に関する基本的な知識が必要です。

データソース

データベースの StarSuite への組み込みは、いわゆる データソース と呼ばれるものを作成することにより実施できます。ユーザーインターフェースのデータソース作成用オプションは、メニュー ツールに用意されています。また、StarSuite Basic 上からもデータソースの作成および操作が行えます。

データソースへのアクセスを行う場合、まず最初に createUnoService 関数によるデータベースコンテキストオブジェクトの作成を行う必要があります。これはデータベース処理のルートオブジェクトとして機能するもので、その操作には com.sun.star.sdb.DatabaseContext サービスを利用します。

以下のサンプルコードでは、データベースコンテキストの作成方法、および使用可能なすべてのデータソースの取得方法を示します。ここで取得した名前は、逐次メッセージボックスに表示します。

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

個々のデータソースは com.sun.star.sdb.DataSource サービスをベースとしており、データベースコンテキストに getByName メソッドを適用することで各データソースを個別に指定できます。

Dim DatabaseContext As Object
Dim DataSource As Object

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

上記のサンプルコードでは、Customers というデータソース名を指定して、その DataSource オブジェクトを作成しています。

データソースには各種の属性が用意されており、これらを通じてデータの出自やアクセス方式などの一般的な情報を取得することができます。以下にこれらの属性を 示します。

  • Name (文字列) – データソースの名前。

  • URL (文字列) – データソースの URL (フォーマットは jdbc:サブプロトコル:サブネーム または sdbc:サブプロトコル:サブネーム)。

  • Info (配列)PropertyValue の値に接続パラメータを収めた配列 (通常はユーザー名とパスワードが最低必要)。

  • User (文字列) – ユーザーの名前。

  • Password (文字列) – ユーザーのパスワード (保存はされない)。

  • IsPasswordRequired (ブール値) – ユーザーに対してパスワードを要求する指定。

  • IsReadOnly (ブール値) – データベースアクセスを読み取り専用とする指定。

  • NumberFormatsSupplier (オブジェクト) – データベースで使用する数の書式を収めたオブジェクト (com.sun.star.util.XNumberFormatsSupplier インターフェースをサポート。詳細情報は「数値、日付、テキストの表示書式」を参照)。

  • TableFilter (配列) – 表示するテーブル名のリスト。

  • TableTypeFilter (配列) – 表示するテーブルタイプのリスト。指定可能な値は TABLEVIEWSYSTEM TABLE

  • SuppressVersionColumns (ブール値) – バージョン管理用の列を非表示とする指定。


注 –

StarSuite のデータソースと ODBC のデータソースは、一対一に対応するわけではありません。ODBC のデータソースがデータの出自のみを対象としているのに対して、StarSuite のデータソースでは、StarSuite のデータベースウィンドウでのデータ表示といった、より広範な情報も格納しています。


クエリー

データソースに対しては、事前定義されたクエリーを利用できます。StarSuite は、SQL のクエリーコマンドを記録して、随時利用できるようにしています。クエリーとは、データベースの利用を簡単化する目的で開発されたもので、SQL に関する専門的な知識をもたないユーザーでも、マウスによるクリック操作のみで SQL コマンドの実行に必要な各種オプションを指定できます。

クエリーを使用する場合、com.sun.star.sdb.QueryDefinition サービスをサポートしたオブジェクトを直接操作する必要はありません。クエリーへのアクセスは、該当するデータソースに対して QueryDefinitions メソッドを適用することにより実行できます。

以下のサンプルコードでは、データソースに記録されているクエリー名の一覧を取得して、逐次メッセージボックスに表示します。

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

com.sun.star.sdb.QueryDefinition サービスには、上記のサンプルコードで使用した Name 属性をはじめとする各種の属性が用意されています。以下にその属性を示します。

  • Name (文字列) – クエリーの名前。

  • Command (文字列) – SQL コマンド (SELECT などのコマンド)。

  • UpdateTableName (文字列) – 複数テーブルを用いるクエリーに対する、データ更新が可能なテーブル名の指定。

  • UpdateCatalogName (文字列) – 更新テーブルのカタログ名。

  • UpdateSchemaName (文字列) – 更新テーブルのダイアグラム名。

以下のサンプルコードは、プログラム制御によるクエリーオブジェクトの作成およびデータソースへの登録を行う場合の例です。

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)

この場合の処理の流れは、まず最初に createUnoService を用いてクエリーオブジェクトを作成し、次にその初期化を行い、最後に insertByName メソッドにより QueryDefinitions オブジェクトへ追加します。

データベースフォームとのリンク

StarSuite には、データソース操作を簡易化するため、データソースをデータベースフォームにリンクするオプションが用意されています。こうしたリンクの構築には getBookmarks() メソッドを使用します。実行後の戻り値としては、データソースとのリンクがすべて格納されたコンテナ (com.sun.star.sdb.DefinitionContainer) が返されます。ブックマークに対しては、名前またはインデックスによりアクセスできます。

以下のサンプルコードでは、MyBookmark というブックマークの URL を取得します。

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

データベースアクセス

データベースへのアクセスを行うには、該当するデータベース接続を確立しておく必要があります。これは、データベースとの直接的な交信を行うための転送チャネルが確保された状態を意味します。前節で説明したデータソースとは異なり、こうしたデータベース接続は、プログラムを起動するごとに確立し直す必要があります。

StarSuite でのデータベース接続の確立は、各種の方法で実施できます。以下のサンプルコードでは、既存のデータソースを利用した方法します。

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

上記のサンプルコードでは、まず最初にデータベースがパスワード保護されているかをチェックしています。パスワード保護されていない場合は、GetConnection を使用して必要なデータベース接続を確立します。コマンド行内の 2 つの空白文字列は、ここでのユーザー名とパスワードに該当します。

データベースがパスワード保護されている場合、このサンプルコードでは、InteractionHandler を作成し、ConnectWithCompletion メソッドを使用してデータベース接続を確立しています。この InteractionHandler は、StarSuite 側からユーザーに対して、ログイン情報の入力を求める際に使用します。

テーブルからのデータの取得

通常 StarSuite は、ResultSet オブジェクトを通じて、テーブルへアクセスします。この ResultSet とは一種のマーカーで、SELECT コマンドにより得られた多量のデータに対して、現在のデータセットを示すために使用します。

以下のサンプルコードは、ResultSet を用いてデータベーステーブルに対するクエリー処理を行う方法を示します。

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

このサンプルコードでは、データベース接続の確立後、まず最初に Connection.createObject を使用して Statement オブジェクトを作成しています。次にこの Statement オブジェクトに対して executeQuery を実施して、その結果を ResultSet に格納しています。こうして得られた ResultSet については、その内容が空でないかをチェックした後ループに入り、個々のレコード情報を取り出します。レコード情報 (上記のサンプルコードでは CustomerNumber フィールドの値) の取得は、ResultSet に対して getString メソッドを適用することで行っていますが、その際のパラメータ値の 1 は、第 1 列の値を取り出すことを指定しています。


注 –

SDBC を利用した場合の ResultSet オブジェクトは、データベースへのインタラクティブなアクセスを行うものであり、DAO ないし ADO を利用した場合の Recordset オブジェクトに相当します。



注 –

StarSuite 8 でのデータベースアクセスは、ResultSet オブジェクトを通じて行います。この中には、テーブル内の登録データまたは、SQL の SELECT コマンドの実行結果が格納されます。従来の ResultSet オブジェクトは、Application オブジェクトのデータナビゲーション用メソッド (DataNextRecord など) を提供するものでした。


種類別データの取得

前節のサンプルコードでも触れたように、StarSuite にはテーブルからのデータ取得用に getString メソッドが用意されています。このメソッドの実行結果は、文字列の形で返されます。同様のメソッドとしては、以下のものが利用できます。

  • getByte() – サポートする SQL のデータ型は、数値、文字、文字列。

  • getShort() – サポートする SQL のデータ型は、数値、文字、文字列。

  • getInt() – サポートする SQL のデータ型は、数値、文字、文字列。

  • getLong() – サポートする SQL のデータ型は、数値、文字、文字列。

  • getFloat() – サポートする SQL のデータ型は、数値、文字、文字列。

  • getDouble() – サポートする SQL のデータ型は、数値、文字、文字列。

  • getBoolean() – サポートする SQL のデータ型は、数値、文字、文字列。

  • getString() – サポートする SQL のデータ型は、すべてのデータ型。

  • getBytes() – サポートする SQL のデータ型は、バイナリデータ。

  • getDate() – サポートする SQL のデータ型は、数値、文字列、日付と時刻のタイムスタンプ。

  • getTime() – サポートする SQL のデータ型は、数値、文字列、日付と時刻のタイムスタンプ。

  • getTimestamp() – サポートする SQL のデータ型は、数値、文字列、日付と時刻のタイムスタンプ。

  • getCharacterStream() – サポートする SQL のデータ型は、数値、文字列、バイナリデータ。

  • getUnicodeStream() – サポートする SQL のデータ型は、数値、文字列、バイナリデータ。

  • getBinaryStream() – バイナリデータ。

  • getObject()– サポートする SQL のデータ型は、すべてのデータ型。

いずれのメソッドを用いる場合でも、データを取得する列の番号をパラメータとして指定します。

ResultSet のバリエーション

データベースへのアクセス処理には、かなりの時間を要する場合があります。このため StarSuite には ResultSets の処理を最適化する各種の方法が用意されており、アクセス速度を制御できるようになっています。ResultSet の機能が豊富になるほど、その実装は複雑化する傾向にあり、その分だけ処理速度が低下します。

たとえば「テーブルからのデータの取得」の節のサンプルコードで見たような単純な処理の場合、ResultSet は最小限の機能のみを使用しています。この場合、テーブル内でのデータ検索は順方向にのみ進行し、必要なデータも順次取得するだけです。そのため、データ更新などのより複雑なナビゲーションが必要となっても、このままでは対処できません。

ResultSet の作成に用いた Statement オブジェクトには、ResultSet の機能に関係するいくつかのオプションが用意されています。

  • ResultSetConcurrency (定数) – データの変更を許可する指定 (com.sun.star.sdbc.ResultSetConcurrency に定められた定数値)。

  • ResultSetType (定数)ResultSets のタイプに関する指定 (com.sun.star.sdbc.ResultSetType に定められた定数値)。

以下に com.sun.star.sdbc.ResultSetConcurrency に定められた定数を示します。

  • UPDATABLE - ResultSet でのデータ更新を許可する。

  • READ_ONLYResultSet でのデータ更新を許可しない。

com.sun.star.sdbc.ResultSetConcurrency に定められた定数では、以下の指定を行えます。

  • FORWARD_ONLYResultSet に対し順方向のナビゲーションのみを許可する。

  • SCROLL_INSENSITIVEResultSet にすべてのナビゲーションを許可するが、オリジナルデータへの変更は記録しない。

  • SCROLL_SENSITIVEResultSet にすべてのナビゲーションを許可し、オリジナルデータへの変更による ResultSet への影響を認める。


注 –

READ_ONLYSCROLL_INSENSITIVE 属性が指定された ResultSet は、ADO および DAO の Snapshot タイプに相当します。

UPDATEABLESCROLL_SENSITIVE 属性が指定された ResultSet は、ADO および DAO の Dynaset タイプ Recordset に相当します。


ResultSets のナビゲーション用メソッド

SCROLL_INSENSITIVE または SCROLL_SENSITIVE が指定された ResultSet は、すべてのデータナビゲーション用メソッドを利用できます。以下に主要なメソッドを示します。

  • next() – 次のデータレコードへ移動。

  • previous() – 前のデータレコードへ移動。

  • first() – 最初のデータレコードへ移動。

  • last() – 最後のデータレコードへ移動。

  • beforeFirst() – 最初のデータレコードの前へ移動。

  • afterLast() – 最後のデータレコードの次へ移動。

いずれのメソッドを実行した場合も、その戻り値として、ナビゲーションが正常に終了したかを示すブール値が返されます。

現在のカーソル位置を確認するには、以下のテスト用メソッドを使用して、戻り値として返されるブール値から判定します。

  • isBeforeFirst()ResultSet が最初のデータレコードの前にあるかを判定。

  • isAfterLast()ResultSet が最後のデータレコードの次にあるかを判定。

  • isFirst()ResultSet が最初のデータレコードにあるかを判定。

  • isLast()ResultSet が最後のデータレコードにあるかを判定。

データレコードの変更

ResultSet の作成時に ResultSetConcurrency = UPDATEABLE と指定した場合、データレコードを変更することができます。このような状況は、基本的に SQL コマンドがデータベースへのデータの書き換えを許可している場合のみ有効です。ただし、列のリンクや累積計算を行う複雑な SQL コマンドなどに対しては、この状況は当てはまりません。

ResultSet オブジェクトには、データ変更用に Update メソッドが用意されていますが、その構成はデータ取得用の get メソッドと基本的に同じです。たとえば文字列の書き換えを許可するには updateString メソッドを使用します。

必要な変更を行なったデータは、updateRow() メソッドを用いてデータベースに再転送する必要があります。このメソッド呼び出しは、次のナビゲーション用コマンドの実行前に実行しておく必要があり、実行しないと、変更した値は失われます。

データ変更時に何らかのエラーが発生した場合、cancelRowUpdates() メソッドを使用することで、これらの処理を取り消すことができます。ただしこのような処理の取り消しが行えるのは、pdateRow() によってデータベース上のデータを書き直す前の段階だけです。