(今更)JDBCでMS-Accessにアクセス

自分は普段Enterprise Architectというモデリングツール(有名?)を使ってER図なんかを書いてます。で、EAはモデルからDDLを作成してくれるんですけど、残念ながらテーブルの論理名をDDLのコメントとして出力する機能がなぜかないんです。しかもJavaソースコード出力だとテンプレートでいじれるようになってるのに、DDLはなぜか内部に隠蔽されてて手の出しようがない。しょうがないのでEAのファイルに直アクセスしてやるかー、ってことでJDBCからEAファイル(中身はMS-Accessそのまま)にアクセスしたときのメモ。

まずMS-Access用のPure Java JDBCドライバというものは商用しかありません。そこでJDKについてるJDBC-ODBCブリッジを使ってODBC経由でアクセスします。んでこのSun標準実装のJDBC-ODBCブリッジ実装(sun.jdbc.odbc.JdbcOdbcDriver)ってやつを使うんですが、昔(j2sdk1.4)はマルチバイト文字列を扱えなくて、いちいち new String(rs.getBytes(i), "MS932"); とかやってたんですが、JDK5から charSet プロパティが設けられて、マルチバイトを正しく扱えるようになってました(知らんかった)。

Seasarjdbc.diconだとこんな感じ。

<component name="xaDataSource"
    class="org.seasar.extension.dbcp.impl.XADataSourceImpl">
    <property name="driverClassName">
        "sun.jdbc.odbc.JdbcOdbcDriver"
    </property>
    <property name="URL">
        "jdbc:odbc:ODBC-NAME"
    </property>
    <property name="user">"sa"</property><!-- 何か入れておく -->
    <property name="password">""</property>
    <initMethod name="addProperty">
        <arg>"charSet"</arg>
        <arg>"MS932"</arg>
    </initMethod>
</component>

1点注意で、XADataSourceImplの実装は、userプロパティに値がないと DriverManager.getConnection() するときにPropertiesを渡さないので(狙ってやってるのかは不明)、嘘でもいいから何かしら値をセットしないとcharSet指定が効きません。