如何通过JDBC从MS Access“附件”字段中检索文件?

时间:2013-03-22 17:24:28

标签: java ms-access jdbc odbc blob

我编写了一个小型Java应用程序来读取Access 2007数据库中的数据。我可以阅读所有字段,但不能阅读包含照片的字段。字段类型为“附件”。

当我调用.getBlob()对象的ResultSet方法时,我遇到了“UnsupportedOperationException”。

正如我在多个网站上所建议的那样,我尝试调用.getBytes().getBinaryStream()方法,但两者都只返回附件的文件名,但不是内容。

3 个答案:

答案 0 :(得分:1)

UCanAccess JDBC驱动程序可以从Access数据库的Attachment字段中提取文件。对于名为[AttachmentsTable]的表

ID - 自动编号,主键
说明 - 文字(255)
附件 - 附件

以下代码将提取ID为1的记录的[附件]字段中的所有文件:

import java.io.File;
import java.sql.*;
import net.ucanaccess.complex.Attachment;

...

String dbFileSpec = "C:/Users/Public/AttachmentsDB.accdb";
String connStr = "jdbc:ucanaccess://" + dbFileSpec;
try (Connection conn = DriverManager.getConnection(connStr)) {
    try (Statement s = conn.createStatement()) {
        try (ResultSet rs = s.executeQuery(
                "SELECT Attachments FROM AttachmentsTable WHERE ID=1")) {
            rs.next();
            // retrieve array of net.ucanaccess.complex.Attachment objects
            Attachment[] atts = (Attachment[]) rs.getObject(1);
            for (Attachment att : atts) {
                System.out.println(att.getName());
                org.apache.commons.io.FileUtils.writeByteArrayToFile(
                        new File("C:/Users/Gord/Desktop/" + att.getName()), 
                        att.getData());
            }
        }
    }
}

有关使用UCanAccess JDBC驱动程序的更多信息,请参阅

Manipulating an Access database from Java without ODBC

答案 1 :(得分:0)

HXTT Access可以获得未压缩的附件数据,但不支持压缩的附件数据。

答案 2 :(得分:0)

我在某些情况下找到了一个肮脏的解决方法......

表的XML导出包含用一些额外数据编码的base64图片。使用stax XML API的Java应用程序可以轻松处理这些数据。它几乎是直接的,但二进制数据开头的20字节开销必须被截断。 Read this!

如果你处于可以忍受的状态,那么只有你完成了。如果您必须定期但不是实时执行此操作,则可以从here描述的访问中尝试.ExportXML API。

欢呼声