【问题标题】:How to retrieve files from an MS Access "Attachment" field via JDBC?如何通过 JDBC 从 MS Access“附件”字段中检索文件?
【发布时间】:2013-03-12 16:00:58
【问题描述】:

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

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

根据几个网站的建议,我尝试调用 .getBytes().getBinaryStream() 方法,但两者都只返回附件的文件名,而不是它的内容。

【问题讨论】:

标签: java ms-access jdbc odbc blob


【解决方案1】:

UCanAccess JDBC 驱动程序可以从 Access 数据库的附件字段中提取文件。对于名为 [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

【讨论】:

    【解决方案2】:

    在某些情况下,我发现了一个肮脏的解决方法...

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

    如果您处于舒适的环境中,那么您就完成了。如果您必须定期而不是实时执行此操作,您可以尝试使用 .ExportXML API 访问描述的here

    干杯

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2016-12-09
        • 2013-01-06
        • 2017-06-12
        • 1970-01-01
        • 1970-01-01
        • 2010-12-14
        • 1970-01-01
        • 2022-12-07
        • 1970-01-01
        相关资源
        最近更新 更多