8

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

4 回答 4

6

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

于 2009-11-17T18:37:03.083 回答
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 会自动解决两个对象之间的差异(也许它默认使用 Field 对象用于非 ACCDB 数据库和 Field2 对象用于 ACCDB 文件)。

于 2009-04-22T23:51:03.363 回答
0

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

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

我无法在 C# 中使用它,所以我转向了不同的解决方案。我很想知道如何做到这一点,但如果有人弄清楚的话。

于 2009-06-23T14:11:10.013 回答
0

看看Access 团队博客上的这篇文章 ,它基本上包含了 David 的建议,但略有不同。它设置一个 Recordset2 类型的对象等于附件字段的值。然后将一条记录附加到该记录集,然后将文件内容放入该新记录中。

于 2009-06-22T12:51:57.947 回答