11 May 2008

OpenOffice BaseからMySQLサーバに接続 (その2)

OpenOffice 2.3のCalcからBASICを用いて、OpenOffice Base 経由でMySQLサーバに接続する。

OpenOffice Calc を起動して、マクロ(Open Office BASIC)を用いてプログラムを行う。

(1)データベースにSELECTコマンドを発行(全データ読み込み)

MySQLへの接続設定したDBファイルを、MySQL-Test.odbとする。また、MySQLを利用するためのユーザ名を「testuser」、パスワードを「****」とする。


Sub Sheet3_MySQLConnect

Dim Sheet As Object

Dim DatabaseContext as object
Dim DataSource as Object
Dim Connection as Object
Dim Statement as Object
Dim ResultSet as Object

Dim i As Integer

' ***** データベースのコネクション  *****
DatabaseContext=createUnoService("com.sun.star.sdb.DatabaseContext")
' カレントフォルダの DataBase-Test01.odb というBASEファイルを開く
DataSource=DatabaseContext.getByName("MySQL-Test")
' ユーザ名、パスワードを空白で接続
Connection = DataSource.GetConnection("testuser","****")

' ***** SQLの実行  *****
Statement = Connection.createStatement()
ResultSet= Statement.executeQuery("Select * From TBL_MAIN")

' ***** レコードの表示  *****
Sheet = ThisComponent.currentController.ActiveSheet

i = 0
If IsNull(ResultSet) Then
MsgBox("レコードがありません")
Else
' 1行目にカラム名を表示
Sheet.getCellByPosition(0, 0).String = ResultSet.Columns.ElementNames(0)
Sheet.getCellByPosition(1, 0).String = ResultSet.Columns.ElementNames(1)
Sheet.getCellByPosition(2, 0).String = ResultSet.Columns.ElementNames(2)
Sheet.getCellByPosition(3, 0).String = ResultSet.Columns.ElementNames(3)
Sheet.getCellByPosition(4, 0).String = ResultSet.Columns.ElementNames(4)

While ResultSet.next
Sheet.getCellByPosition(0, 1+i).String = ResultSet.getString(1)
Sheet.getCellByPosition(1, 1+i).String = ResultSet.getString(2)
Sheet.getCellByPosition(2, 1+i).String = ResultSet.getString(3)
Sheet.getCellByPosition(3, 1+i).String = ResultSet.getString(4)
Sheet.getCellByPosition(4, 1+i).String = ResultSet.getString(5)
i = i + 1
Wend

End If

Statement.Close()
Connection.Close()
End Sub

(2)データベースにSELECTコマンドを発行(WHEREで条件設定)


ResultSet= Statement.executeQuery("Select * From TBL_MAIN WHERE mode = 1")

書き換えの必要な場所は、例えばこんな感じになる

(3)データベースにINSERTコマンドを発行


Dim nResult As Long
nResult= Statement.executeUpdate("INSERT INTO TBL_MAIN (mode, date, time, data_str) VALUES(4, '2008-05-01', '13:45:28', 'テスト')")

(4)データベースにUPDATEコマンドを発行


Dim nResult As Long
nResult= Statement.executeUpdate("UPDATE TBL_MAIN SET mode=0 WHERE mode <> 0")

ちなみに、OpenOffice Base のクエリ画面では、SELECT文しか受け付けないようだ。ツール メニュー → SQL のダイアログでのみ、INSERTやUPDATE文が受け付けられる。

不思議な仕様