【问题标题】: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。
干杯