jam*_*lia 7 .net c# 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获取附件?
我终于使用对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();
Run Code Online (Sandbox Code Playgroud)
这会将test.docx添加到表"TableWithAttachmentField"中的Attachment字段"AttachmentFieldName"中.需要注意的一件事是,尝试两次添加相同的文件会引发错误.
有趣的问题。我没有使用 A2007,但安装了运行时,所以我使用 Access 对象浏览器来查看其中的内容。我发现了一些非常奇怪的事情——有两个 FIELD 对象,Field 和 Field2。附加函数是 Field2 的成员,但不是 Field。所以,我的建议是,也许你需要做的就是转换它:
Recordset.Fields("FileData").LoadFromFile(<filename>)
Run Code Online (Sandbox Code Playgroud)
像这样的事情:
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
Run Code Online (Sandbox Code Playgroud)
现在,我不知道这是否会解决您的问题,但在我看来,鉴于两个具有不同属性/方法/成员的 Field 对象,您需要明确您正在使用哪个 Field 对象。您引用的代码示例专门用于 Access,也许 Access 会做一些事情来自动解决两个对象之间的差异(也许它默认使用非 ACCDB 数据库的 Field 对象和 ACCDB 文件的 Field2 对象)。