C# 使用.NET以编程方式管理Microsoft Access附件类型字段

C# 使用.NET以编程方式管理Microsoft Access附件类型字段,c#,.net,ms-access,attachment,C#,.net,Ms Access,Attachment,Access在2007版本中添加了一种新的数据类型--附件类型。我们目前正在使用.NET3.5(C#)开发一个WinForms应用程序,该应用程序使用Access 2007数据库。我们希望能够通过WinForms接口添加新附件。我似乎找不到有关如何使用.NET插入或选择附件数据的任何信息。我确实尝试过使用DAO(版本12),但它似乎没有这里讨论的SaveToFile或LoadFromFile方法: 那么,如何使用.NET获取附件呢?这是一个有趣的问题。我不使用A2007,但安装了运行时,所以我使

Access在2007版本中添加了一种新的数据类型--附件类型。我们目前正在使用.NET3.5(C#)开发一个WinForms应用程序,该应用程序使用Access 2007数据库。我们希望能够通过WinForms接口添加新附件。我似乎找不到有关如何使用.NET插入或选择附件数据的任何信息。我确实尝试过使用DAO(版本12),但它似乎没有这里讨论的SaveToFile或LoadFromFile方法:


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

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

Recordset.Fields("FileData").LoadFromFile(<filename>)
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(<filename>)

rs.Close
Set fld2=Nothing
Dim rs作为DAO.Recordset
将fld2调暗为DAO.Field2
Set rs=CurrentDb.OpenRecordset(“[SQL]”)
Set fld2=Recordset.Fields(“文件数据”)
fld2.LoadFromFile()
rs.Close
设置fld2=无

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

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

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

就我所知,我会再发一次/如果我弄明白的话


我无法在C#中实现这一点,因此我转向了另一种解决方案。我很想知道如果有人知道怎么做。

我终于在C#中通过引用Microsoft.Office.Interop.Access.Dao实现了这一点

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”中的附件字段“AttachmentFieldName”。需要注意的一点是,尝试两次添加同一个文件会引发错误。

尝试这样限定每个实例:--DAO.DBEngine db=new DAO.DBEngine();