データベースアクセス

From Apache OpenOffice Wiki
Jump to: navigation, search
doc OOo
Book.png


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

Apache OpenOffice でのデータベース接続の確立は、各種の方法で実施できます。次のサンプルコードは、既存のデータソースへの接続方法の例です。

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 は、Apache OpenOffice 側からユーザーに対して、ログイン情報の入力を求める際に使用します。

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

通常 Apache OpenOffice は、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 列の値を取り出すことを指定しています。

Documentation note.png SDBC を利用した場合の ResultSet オブジェクトは、データベースへのインタラクティブなアクセスを行うものであり、DAO ないし ADO を利用した場合の Recordset オブジェクトに相当します。
Documentation note.png Apache OpenOffice でのデータベースアクセスは、ResultSet オブジェクトを通じて行います。この中には、テーブル内の登録データまたは、SQL の SELECT コマンドの実行結果が格納されます。従来の ResultSet オブジェクトは、Application オブジェクトのデータナビゲーション用メソッド (DataNextRecord など) を提供するものでした。

種類別データの取得

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

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 のバリエーション

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

簡単な ResultSet で、最低限の関数が利用できます。この場合、テーブル内でのデータ検索は順方向にのみ進行し、必要なデータも順次取得するだけです。そのため、データ更新などのより複雑なナビゲーションが必要となっても、このままでは対処できません。

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

ResultSetConcurrency (const)
データが変更可能かどうかの指定 (com.sun.star.sdbc.ResultSetConcurrency に一致する指定)。
ResultSetType (const)
ResultSets のタイプに関する指定 (com.sun.star.sdbc.ResultSetType に一致する指定)。

com.sun.star.sdbc.ResultSetConcurrency では、次の値が定義されます。

UPDATABLE
ResultSet でのデータ更新を許可する。
READ_ONLY
ResultSet でのデータ更新を許可しない。

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

FORWARD_ONLY
ResultSet に対し順方向のナビゲーションのみを許可する。
SCROLL_INSENSITIVE
ResultSet にすべてのナビゲーションを許可するが、オリジナルデータへの変更は記録しない。
SCROLL_SENSITIVE
ResultSet にすべてのナビゲーションを許可し、オリジナルデータへの変更による ResultSet への影響を認める。
Documentation note.png READ_ONLYSCROLL_INSENSITIVE 属性が指定された ResultSet は、ADO および DAO の Snapshot タイプに相当します。

ResultSet's 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() メソッドを使用することで、これらの処理を取り消すことができます。ただしこのような処理の取り消しが行えるのは、updateRow() によってデータベース上のデータを書き直す前の段階だけです。


Content on this page is licensed under the Public Documentation License (PDL).
Personal tools