【问题标题】:Programmatically managing Microsoft Access Attachment-typed field with .NET使用 .NET 以编程方式管理 Microsoft Access 附件类型字段
【发布时间】:2010-10-21 05:19:44
【问题描述】:

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 获取附件?

【问题讨论】:

    标签: c# .net ms-access attachment


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      有趣的问题。我不使用 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 文件)。

      【讨论】:

        【解决方案3】:

        看看Access team blog 上的这篇文章,它基本上符合 David 的建议,但有点扭曲。它设置一个 Recordset2 类型的对象等于附件字段的值。然后将一条记录附加到该记录集,然后将文件内容放入该新记录中。

        【讨论】:

          【解决方案4】:

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

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

          我无法在 C# 中实现此功能,因此我转向了不同的解决方案。不过,如果有人弄清楚了,我很想知道如何做到这一点。

          【讨论】:

          • 尝试像这样限定每个实例:--- DAO.DBEngine db = new DAO.DBEngine();
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-04-26
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多