MS-AccessからODBC経由でFirebirdのテーブルにアクセスは大変
あるユーザーのシステムで、Ccu労組会計のデータをMS-Accessからアクセスして処理することになりました。それで、ODBC経由で接続することにしたのですが、…私の覚えを兼ねて、ここに書いておきます。
1.ODBCって、マルチバイト文字は正しく処理できない!
1.1 DBファイル、クライアントdllへのパスにマルチバイト文字があると接続できない
まず、上図のようにしたら、接続時にエラーとなってしまいました。各パスを確認したところ、後ろの方が切れてしまっている。どうも「会計」とあるのがいけないらしい。「会計」は4バイトだけど2文字なので2バイトと判断して、差額の2バイトはカットしてしまうものと思われる。
これは、英数字と空白だけのフォルダを作って、そこにコピーして事無きを得ました。
1.2 テーブルの中身もマルチバイト文字があると…
これは、私(平石)ではなく、一緒に仕事をしている組合員が見つけた現象です。
下図は、RKA23というテーブルの内容を、フリーソフトを使って見たものです。
ところが、同じものをMS-Accessで見ると、データ内容に余計な文字が付加されている。
どうも、Shift-JISでのバイト数が項目長と一致するときに、この現象が起きるらしい(このときは、項目長を超えるデータができてしまうかのように見えますが、MS-Accessで見るときの項目長はバイト数ではなくて文字数なので、これらのケースでは、項目長を超えていません)。
データのShift-JISでのバイト数を求める関数を作り、そのバイト数が項目長を超えている分はカットするようにして、対処できました。
2.DAO.TableDef.Connectを書き換えるとReadOnlyになってしまう
実は、上記1.1に書いた、「DBファイル、クライアントdllへのパス」については、DAO.TableDef.Connectに、その情報があるので、これを書き換えて対処できるのではないかとやってみたのです。
読むだけなら、うまく行きました。パスに「会計」などのマルチバイト文字があってもちゃんと読めます(ODBCの設定ではマルチバイト文字の無いパスを指定して、あとから書き換えます)。
ところが、内容を更新しようとすると、ReadOnlyである旨のメッセージが出てダメでした。