我写了一个小型的Java应用程序来读取Access 2007数据库中的数据。我可以阅读所有字段,但不能包含照片。字段类型是“附件”。如何通过JDBC从MS Access“附件”字段中检索文件?
当我打电话对象的.getBlob()
方法时,我发现“UnsupportedOperationException”。
正如几个网站上的建议,我试图拨打.getBytes()
和.getBinaryStream()
方法,但都只返回附件的文件名,但不是它的内容。
我写了一个小型的Java应用程序来读取Access 2007数据库中的数据。我可以阅读所有字段,但不能包含照片。字段类型是“附件”。如何通过JDBC从MS Access“附件”字段中检索文件?
当我打电话对象的.getBlob()
方法时,我发现“UnsupportedOperationException”。
正如几个网站上的建议,我试图拨打.getBytes()
和.getBinaryStream()
方法,但都只返回附件的文件名,但不是它的内容。
的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驱动看到
HXTT Access可以获取未压缩的附件数据,但不支持压缩的附件数据。
我发现某些情况下,一个肮脏的解决办法...
表的XML导出包含一些额外的数据编码的图片的base64。使用stax XML API的Java应用程序可以轻松处理这些数据。这几乎是直截了当的,但二进制数据开始时的20字节开销必须被截断。 Read this!
如果你处于一个非常艰难的境地,那么只有你完成了。如果您必须定期执行此操作,但不是实时执行此操作,则可以从描述为here的访问中尝试.ExportXML API。
欢呼
附接的数据类型包含可与ADO或DAO可以读取的记录集。这里有笔记,可能会给你一些线索http://stackoverflow.com/questions/14223266/how-to-copy-the-contents-of-an-attached-file-from-an-ms-access-db-到-A-VBA-VAR/14235764#14235764 – Fionnuala 2013-03-22 20:23:02