UCanAccessはGetBytesメソッドを使用してOLEオブジェクトの列を読み取ることができませんようです()

ZioByte:

私は非常に大きく持って.mdb、私はLinuxでそれを使用しSQLite3のに変換するアクセスデータベースを。

私は、任意の転送することができませんBLOB秒(主に画像を含む)私が持っています。ここではサンプルテストプログラムは次のとおりです。

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class prova {
        public static void main(String[] args) {
                String url = "jdbc:ucanaccess://data/BookDB-201810.mdb";
                try {
                        Connection c = DriverManager.getConnection(url);
                        PreparedStatement ps;
                        ResultSet rs;
                        String q = "SELECT * FROM PersonImage";
                        ps = c.prepareStatement(q);
                        rs = ps.executeQuery();
                        while (rs.next()) {
                                byte[] i = rs.getBytes("Image");
                                String fn = String.format("data/img/i%05d.%d.jpg", rs.getInt("PersonId"), rs.getInt("Index"));
                                try (FileOutputStream fos = new FileOutputStream(fn)) {
                                        fos.write(i);
                                } catch (FileNotFoundException e) {
                                        e.printStackTrace();
                                } catch (IOException e) {
                                        e.printStackTrace();
                                }
                        }
                } catch (SQLException e) {
                        e.printStackTrace();
                }
        }
}

プログラムがエラーなしで実行されますが、作成されたファイルは、(確かではない画像)「奇妙」です。

$ ls -l i00072.1.jpg 
-rw-r--r-- 1 mcon mcon 369 Nov 23 11:38 i00072.1.jpg
$ file i00072.1.jpg 
i00072.1.jpg: Java serialization data, version 5

それらをint探し、私はこれを見つけます:

....sr..net.ucanaccess.jdbc.BlobKey...........L.
columnNamet..Ljava/lang/String;L..keyt..Ljava/util/HashMap;L.   tableNameq.~..xpt..Imagesr..java.util.HashMap......`....F.
loadFactorI.    [email protected].⠤...8...I..valuexr..java.lang.Number...........xp...
Ht..Indexsr..java.lang.ShorthM7.4`.R...S..valuexq.~.  ..xt..PersonImage

何が私が間違っているのでしょうか?

アップデートは:私の目的は帳データベースを変換することであるので、(廃止されたプログラムの使用して.MDBとして、ネット上で維持BookCAT私が見つけた歴史的な理由のために)AccessConverter法案を合わせているようです。残念ながらそれには二つの問題は基本的にあります。

  • ;私のデータベースでは、いくつかの列はSQLiteのための予約語である「インデックス」、(その他、どうやらないMS-Access用)と命名されています >「IDX」 - これは自明のフィルタ「インデックス」を挿入固定されています。
  • 翻訳がありswitch (type) { case xxx: ...、より従来のSQLite3のタイプにさまざまなMS-アクセスの種類を変換するには、上のブレークポイントdefault:私は(@ErikvonAsmuthが正しく推測される)未処理の存在を発見したラベルOLEタイプ。私はそれらをどのように扱うかについては考えています。

プログラム(BookCAT)では、これらのフィールドは、データの2つの種類が含まれています。

  • 画像
  • フォーマットされたテキスト

重複した「平文」バージョン(また、フォーマットされたバージョンを取得するにはいいだろう、しかし、が...)いつもありますので、後者はそれほど重要ではありません。

私は本当にかかわらず、画像を抽出できるようにしたいと思います。

画像データでは常に(私は間違っていない場合)は、それらがなければならないことを意味している「2」に設定コンパニオン「IMAGETYPE」欄がある.jpeg画像。

私が取得するために何ができるのOLE使用可能な形式でデータを?

注: AccessConverter使用しないucanaccess、それが直接、基本的な使用com.healthmarketscience.jackcessの代わりにlibが。

注2:それはそうBookCATそれが関連している場合は、デルファイを使用して構築されています。

ZioByte:

これは、OLE2オブジェクト認識できないように、私の特定のケースでは、すべての「OLE」フィールドは、実際のBLOBであることが判明します。

この条件jackcessで返すEnum OleBlob.ContentType.UNKNOWNタイプと、この場合には、アクセスBLOBコンテンツ(に拒否しますOleBlob.content.getBytes()戻りますnull)。

アクセス記憶されたデータにするために直接使用することが必要であるColumn.getBytes(name)(完全OLEサブシステムをバイパスします)。

なぜ、この状態では、ucanaccess代わりに失敗を、(;コメントは歓迎し、おそらく私は、バグレポートを提出しなければならない)私を超えている、無効な値を返します。

「フォーマットされたテキストは」デルファイのいくつかのカスタムシリアライズはそうしながら、画像データは、プレーンなJPEG形式のファイルであるTRichText私が解析する方法がわからないウィジェットが、それは別の問題です。

使用してjackcess Column.getBytes(name)、私は私が必要なデータを取得することができました。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=280832&siteId=1