データベースアクセス
Template:EN/Documentation/BASICGuideTOC/v2
▼データベースへのアクセスを行うには、該当するデータベース接続を確立しておく必要があります。▼これは、データベースとの直接的な交信を行うための転送チャネルが確保された状態を意味します。▼前節で説明したデータ\'83\'5cースとは異なり、こうしたデータベース接続は、プログラムを起動するごとに確立し直す必要があります。
Apache OpenOffice ▼ でのデータベース接続の確立は、各種の方法で実\'8e\'7bできます。以下のサンプルコードは、既存のデータソースへの接続方法の例です。
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 を使用して必要なデータベース接続を確立します。▼コ\'83\'7dンド行内の 2 つの空白文字列は、ここでのユーザー名とパスワードに該当します。
データベースがパスワード保護されている場合、このサンプルコードでは、InteractionHandler を作成し、ConnectWithCompletion メソッドを使用してデータベース接続を確立しています。▼この InteractionHandler は、Apache OpenOffice 側からユーザーに対して、ログイン情報の入力を求める際に使用します。
▼テーブルからのデータの取得
通常 Apache OpenOffice は、ResultSet オブジェクトを通じて、テーブルへアクセスします。▼この ResultSet とは一種の\'83\'7dーカーで、SELECT コ\'83\'7dンドにより得られた多量のデータに対して、現在のデータセットを示すために使用します。
以下のサンプルコードは、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 メ\'83\'5cッドを適用することで行っていますが、その際のパラメータ値の 1 は、第 1 列の値を取り出すことを指定しています。
▼種類別データの取得
前節のサンプルコードでも触れたように、Apache OpenOffice にはテーブルからのデータ取得用に getString メソッドが用意されています。▼このメ\'83\'5cッドの実行結果は、文字列の形で返されます。以下の 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 のデータ型は、すべてのデータ型。
▼いずれのメ\'83\'5cッドを用いる場合でも、データを取得する列の番号をパラメータとして指定します。
▼ResultSet のバリエーション
▼データベースへのアクセス処理には、かなりの時間を要する場合があります。このため Apache OpenOffice には ResultSets の処理を最適化する各種の方法が用意されており、アクセス速度を制御できるようになっています。▼ResultSet の機\'94\'5cが豊富になるほど、その実装は複雑化する傾向にあり、その分だけ処理速度が低下します。
簡単な 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 への影響を認める。
ResultSet's UPDATEABLE と SCROLL_SENSITIVE 属性が指定された ResultSet は、ADO および DAO の Dynaset タイプ Recordset に相当します。
▼ResultSets のナビゲーション用メ\'83\'5cッド
ResultSet または SCROLL_INSENSITIVE が指定された SCROLL_SENSITIVE は、すべてのデータナビゲーション用メソッドを利用できます。▼以下に主要なメ\'83\'5cッドを示します。
- next()
- 次のデータレコードへ移動。
- previous()
- 前のデータレコードへ移動。
- first()
- 最初のデータレコードへ移動。
- last()
- 最後のデータレコードへ移動。
- beforeFirst()
- 最初のデータレコードの前へ移動。
- afterLast()
- 最後のデータレコードの次へ移動。
▼いずれのメ\'83\'5cッドを実行した場合も、その戻り値として、ナビゲーションが正常に終了したかを示すブール値が返されます。
▼現在のカー\'83\'5cル位置を確認するには、以下のテスト用メ\'83\'5cッドを使用して、戻り値として返されるブール値から判定します。
- isBeforeFirst()
- ResultSet が最初のデータレコードの前にあるかを判定。
- isAfterLast()
- ResultSet が最後のデータレコードの次にあるかを判定。
- isFirst()
- ResultSet が最初のデータレコードにあるかを判定。
- isLast()
- ResultSet が最後のデータレコードにあるかを判定。
▼データレコードの変更
ResultSet の作成時に ResultSetConcurrency = UPDATEABLE と指定した場合、データレコードを変更することができます。▼このような状況は、基\'96\'7b的に SQL コ\'83\'7dンドがデータベースへのデータの書き換えを許可している場合のみ有効です。▼ただし、列のリンクや累積計算を行う複雑な SQL コ\'83\'7dンドなどに対しては、この状況は当てはまりません。
ResultSet オブジェクトには、データ変更用に Update メソッドが用意されていますが、その構成はデータ取得用の get メソッドと基本的に同じです。▼たとえば文字列の書き換えを許可するには updateString メ\'83\'5cッドを使用します。
必要な変更を行なったデータは、()updateRow() メ\'83\'5cッドを用いてデータベースに再転送する必要があります。▼このメ\'83\'5cッド呼び出しは、次のナビゲーション用コ\'83\'7dンドの実行前に実行しておく必要があり、実行しないと、変更した値は失われます。
データ変更時に何らかのエラーが発生した場合、()cancelRowUpdates() メ\'83\'5cッドを使用することで、これらの処理を取り消すことができます。ただしこのような処理の取り消しが行えるのは、updateRow() によってデータベース上のデータを書き直す前の段階だけです。
| Content on this page is licensed under the Public Documentation License (PDL). |