2013-03-22 45 views
1

我写了一个小型的Java应用程序来读取Access 2007数据库中的数据。我可以阅读所有字段,但不能包含照片。字段类型是“附件”。如何通过JDBC从MS Access“附件”字段中检索文件?

当我打电话对象的.getBlob()方法时,我发现“UnsupportedOperationException”。

正如几个网站上的建议,我试图拨打.getBytes().getBinaryStream()方法,但都只返回附件的文件名,但不是它的内容。

+0

附接的数据类型包含可与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

回答

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

0

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

0

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

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

如果你处于一个非常艰难的境地,那么只有你完成了。如果您必须定期执行此操作,但不是实时执行此操作,则可以从描述为here的访问中尝试.ExportXML API。

欢呼