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

时间:2009-04-22 21:01:04

标签: c# .net ms-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获取附件?

4 个答案:

答案 0 :(得分:5)

我终于使用对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”中。需要注意的一件事是,尝试两次添加相同的文件会引发错误。

答案 1 :(得分:1)

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

Recordset.Fields("FileData").LoadFromFile(<filename>)

这样的事情:

Dim rs As DAO.Recordset
Dim fld2 As DAO.Field2

Set rs = CurrentDb.OpenRecordset("[SQL]")
Set fld2 = Recordset.Fields("FileData")
fld2.LoadFromFile(<filename>)

rs.Close
Set fld2=Nothing

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

答案 2 :(得分:0)

看看Access team blog上的这篇文章。它基本上与大卫的建议略有不同。它将Recordset2类型对象设置为等于附件字段的值。然后将记录附加到该记录集,并将文件内容放入该新记录中。

答案 3 :(得分:0)

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

就我所知,我会发布更多一次/如果我弄清楚...

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