私は非常に大きく持って.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
それが関連している場合は、デルファイを使用して構築されています。
これは、OLE2オブジェクト認識できないように、私の特定のケースでは、すべての「OLE」フィールドは、実際のBLOBであることが判明します。
この条件jackcessで返すEnum OleBlob.ContentType.UNKNOWN
タイプと、この場合には、アクセスBLOBコンテンツ(に拒否しますOleBlob.content.getBytes()
戻りますnull
)。
アクセス記憶されたデータにするために直接使用することが必要であるColumn.getBytes(name)
(完全OLEサブシステムをバイパスします)。
なぜ、この状態では、ucanaccess
代わりに失敗を、(;コメントは歓迎し、おそらく私は、バグレポートを提出しなければならない)私を超えている、無効な値を返します。
「フォーマットされたテキストは」デルファイのいくつかのカスタムシリアライズはそうしながら、画像データは、プレーンなJPEG形式のファイルであるTRichText
私が解析する方法がわからないウィジェットが、それは別の問題です。
使用してjackcess
Column.getBytes(name)
、私は私が必要なデータを取得することができました。