使用.NET以编程方式管理Microsoft Access Attachment类型字段

Access在2007版本中添加了新数据类型 – 附件类型。 我们目前正在开发一个使用Access 2007数据库的.NET 3.5(C#)的WinForms应用程序。 我们希望能够通过WinForms界面添加新附件。 我似乎无法找到有关如何使用.NET插入或选择附件数据的任何信息。 我确实尝试使用DAO(版本12)但它似乎没有在这里讨论的SaveToFile或LoadFromFile方法: http : //msdn.microsoft.com/en-us/library/bb258184.aspx

那么,我如何使用.NET获取附件?

我终于使用对Microsoft.Office.Interop.Access.Dao的引用在C#中使用了它。

DBEngine dbe = new DBEngine(); Database db = dbe.OpenDatabase("C:\\SomeDatabase.accdb", false, false, ""); Recordset rs = db.OpenRecordset("SELECT * FROM TableWithAttachmentField", RecordsetTypeEnum.dbOpenDynaset, 0, LockTypeEnum.dbOptimistic); rs.MoveFirst(); rs.Edit(); Recordset2 rs2 = (Recordset2)rs.Fields["AttachmentFieldName"].Value; rs2.AddNew(); Field2 f2 = (Field2)rs2.Fields["FileData"]; f2.LoadFromFile("C:\\test.docx"); rs2._30_Update(); rs2.Close(); rs._30_Update(); rs.Close(); 

这会将test.docx添加到表“TableWithAttachmentField”中的Attachment字段“AttachmentFieldName”中。 需要注意的一件事是,尝试两次添加相同的文件会引发错误。

有趣的问题。 我不使用A2007,但安装了运行时,所以我使用Access对象浏览器来查看其中的内容。 我发现了一些非常奇怪的东西 – 有两个FIELD对象,Field和Field2。 附件函数是Field2的成员,但不是Field。 所以,我的建议是,你需要做的就是转换它:

 Recordset.Fields("FileData").LoadFromFile() 

这样的事情:

 Dim rs As DAO.Recordset Dim fld2 As DAO.Field2 Set rs = CurrentDb.OpenRecordset("[SQL]") Set fld2 = Recordset.Fields("FileData") fld2.LoadFromFile() rs.Close Set fld2=Nothing 

现在,我不知道这是否能为你解决问题,但在我看来,给定两个具有不同属性/方法/成员的Field对象,你需要明确你正在使用哪个Field对象。 您引用的代码示例专门用于Access,也许Access可以自动解决两个对象之间的差异(默认情况下,非ACCDB数据库使用Field对象,ACCDB文件使用Field2对象)。

看看这篇关于Access团队博客的文章它基本上有大卫的建议,有点扭曲。 它将Recordset2类型对象设置为等于附件字段的值。 然后将记录附加到该记录集,并将文件内容放入该新记录中。

我一直在努力尝试做同样的事情。 您可以在项目中包含一个引用“Microsoft.Office.Interop.Access.Dao”,它将为您提供Recordset2和Field2接口,但没有实现类。

这就是我已经得到的,如果我弄明白的话,我会发布更多一次…

我无法在C#中使用它,因此我转向了另一种解决方案。 如果有人知道的话,我很想知道如何做到这一点。