2017年1月14日土曜日

LibreOffice(calc) マクロで MariaDB にアクセスする


LibreOffice(calc)のマクロで、MariaDBにアクセスしてみます。
LibreOfficeの動作環境は以下のとおり。
  • Windows10
  • LibreOffice5
  • OracleJRE1.7

1.MariaDBの用意


まず、LibreOfficeからアクセスするMariaDBを用意します。
とりあえず、動けばいいので CentOS7の docker コンテナを使いました。
[root@centos0702 ~]# docker run --name mariadb -e MYSQL_ROOT_PASSWORD=p@ssw0rd -p 3306:3306 -d mariadb:latest
2cfc7f734fb1a23a93a22f282c01544bf4f722e47d2bd2376664a818ae4ef865
[root@centos0702 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
2cfc7f734fb1        mariadb:latest      "docker-entrypoint.sh"   13 seconds ago      Up 11 seconds       0.0.0.0:3306->3306/tcp   mariadb

これで、MariaDBが動いたので、試しに、root/p@assw0rd でログインしてみます。
[root@centos0702 ~]# mysql -h 192.168.56.101 -uroot -pp@ssw0rd
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 2
Server version: 10.1.20-MariaDB-1~jessie mariadb.org binary distribution

Copyright (c) 2000, 2016, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]>

ログインできれば準備完了です。

2. MariaDBのJDBCドライバのダウンロード


LibreOffice のマクロで MariaDBにアクセスするには、JDBCドライバが必要です。
下記URLから MariaDB のJDBCドライバを入手しました。
https://downloads.mariadb.org/connector-java/
ダウンロードした jar ファイル (mariadb-java-client-1.5.6.jar) を適当なフォルダに格納します。
今回は、下記フォルダに格納しました。
C:\workspace\LibreOfficeマクロ\mariadb-java-client-1.5.6.jar
この jar ファイルを LibreOffice に認識させます。
LibreOffice(calc)を起動して、[ツール] > [オプション] で下図の画面を表示したら
[LibreOffice] > [詳細] をクリックして、[クラスパス]ボタンをクリックします。


[アーカイブを追加]ボタンをクリックして、jar ファイルを追加します。


3. マクロの作成


MariaDBにアクセスして、mysql の user テーブルを参照してみます。
1件入力して、ユーザ名をメッセジーボックスで表示します。
ソースコードは以下のとおり。[ツール] > [マクロ] で保存します。
Sub MariaDBTest

    Dim DatabaseContext as Object
    Dim DataSource as Object
    Dim Connection as Object
    Dim Statement as Object
    Dim sSQL as String
    Dim oResultSet as Object
    Dim nDlgResult As Integer
    Dim sURL as String
    Dim oProps(2) as new com.sun.star.beans.PropertyValue
    
    ' DB コネクションのオープン
    DatabaseContext=createUnoService("com.sun.star.sdbc.DriverManager") 
    sURL = "jdbc:mysql://192.168.56.101:3306/mysql?useUnicode=true&characterEncoding=UTF-8"
    oProps(0).Name = "user"
    oProps(0).value = "root"
    oProps(1).Name = "password"
    oProps(1).value = "p@ssw0rd"
    oProps(2).name = "JavaDriverClass"
    oProps(2).value = "org.mariadb.jdbc.Driver"
    Connection = DatabaseContext.getConnectionWithInfo(sURL, oProps())

    ' SQL select 実行
    Statement = Connection.createStatement()
    oResultSet = Statement.executeQuery("SELECT user FROM user;")
    ' 1件読み込んで表示
    oResultSet.Next
    Msgbox(oResultSet.getString(1))

    'nResult = Statement.executeUpdate("INSERT INTO sample (id,item,ymd VALUES (1, 'demo','2016/01/01')")

    ' DB コネクションのクローズ
    Statement.Close()
    Connection.Close()
    Connection.Dispose()

End Sub

4. 実行


[ツール] > [マクロ] > [マクロの実行] でマクロを実行します。
成功すると、下図のようにメッセージボックスに ユーザ名(root)が表示されます。