vb.net - 通过 COM 接口(interface)向 VBA 公开 .NET DataTable 属性

标签 vb.net vba excel com interop

我正在尝试创建一个.Net DLL,基本上作为数据库连接的抽象层;它将取代我们当前用 VB6 编写的 DLL,我正在尝试尽可能匹配当前的功能。

无论如何,我遇到的基本问题是我无法找到一种方法来让 .Net 类(例如 DataColumnCollection 或 DataColumn)在 VBA 解释器中显示 - 例如,它可能会显示类型为“Column”的内容“MarshalByValueComponent”,但值将为“无变量”。

如果我完全重新创建这两个类(即 Fields 作为字段的集合,它继承自 DataColumn,然后为两者定义一个接口(interface)),我就可以让它工作,但这似乎增加了很多开销什么(应该是什么?)一个非常简单的想法。我觉得我只是错过了编码器处理 DataColumn 类的一些非常简单的东西。

我在网上找到的很多内容都是关于如何将 DataTable 或 DataReader 转换为旧版 ADODB Recordset,但这也会增加大量开销...我宁愿将其保留为 DataTable 并创建允许 VBA 与之交互的 COM 接口(interface);这样,例如,如果他们想要将表写入 Excel 工作表,我就不会重复工作(转换为 ADODB 记录集,然后读/写到 Excel 工作表。您需要迭代整个表两次。 ..)

对于书本长度的解释感到抱歉——我觉得这个问题需要一些澄清,因为根本原因是试图匹配遗留功能。以下是我当前无法使用的界面的示例:

Public Interface IDataTable
    ReadOnly Property Column As DataColumn
End Interface

<ClassInterface(ClassInterfaceType.None)> _
<System.ComponentModel.DesignerCategory("")> _
<ComDefaultInterface(GetType(Recordset.IDataTable))> _
<Guid("E7AFBBB6-CB20-44EC-9CD2-BC70B94CD8B7")> _
Public Class Recordset : Inherits Data.DataTable : Implements IDataTable

Public ReadOnly Property Column As DataColumn Implements IDataTable.Column
    Get
        Return MyBase.Columns(0)
    End Get
End Property

注意:我最初尝试将属性 Columns 作为 DataColumnCollection,它返回 MyBase.Columns。它作为一个对象而不是 MarshalByValueComponent 出现,但也是空的。我知道 MyBase.Column(0) 有一个值,因为我可以将 Msgbox(MyBase.Columns(0).ColumnName) 放在 get 中返回值的正上方,它会弹出很好(不要判断;这比为此使用调试器)...

我不介意只定义它们,但我无法继承 DataColumnCollection 并且 COM 接口(interface)在处理泛型方面已经很糟糕了。有没有其他方法可以解决这个问题而无需重新发明轮子?

感谢您的帮助!

最佳答案

过去 3 周我刚刚做了一些极其相似的事情。

我最终制作了两个 .NET 程序集:

  1. 与数据存储区通信的纯 .NET 程序集(供 .NET 应用程序使用)。
  2. 一个“COM Interop”程序集,它包装第一个程序集并添加 COM 开销(ADODB 引用和 COM 可见接口(interface))。

我使用 VSTO“AddIn.Object”属性从 Excel VBA 调用第二个程序集。

正如您提到的,我最终将 System.Data.DataTables 转换为 ADODB.Recordsets。让 .NET 和 VBA 谈论除原始类型之外的任何事情对我来说都是非常令人沮丧的。事实上,我最终将一些对象序列化为 JSON,以便两个世界可以通信。

这看起来确实很疯狂,但我重新发明了轮子。


  • 我关注了这个MSDN文章让我的 .NET 代码可由 VBA 调用。
  • 我用过这个Code Project文章(我相信您已经看过)转换为 Recordset*。
  • 我让框架处理字符串、整数等。
  • 对于我使用的所有其他数据类型 Json.Net和一个自定义 VBA 类来执行 JSON 序列化。

    *将文章转换为 VB.Net 并添加了一些额外的错误处理。

关于vb.net - 通过 COM 接口(interface)向 VBA 公开 .NET DataTable 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15365065/

相关文章:

regex - 从字符串中分离字符和数字,vb.net

c - VB6/VC6 项目转换为 VB.NET/C --> 共享内存

excel - 在电子表格中仅查找和保留重复项

vb.net - AccessViolationException 未处理?

vba - 处理某些内容时是否可以卡住 Excel?

excel - VBA excel用剪贴板内容填充Listobject

arrays - 粘贴 VBA 数组在特定行后返回 #NA

excel - 使用 VBScript 将 xls/xlsx 文件(所有工作表)转换为 csv(以分号分隔)

vba - Excel 宏将数据插入下一行

vb.net - VB.net-同时音频