gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 20:00:32 25 4
gpt4 key购买 nike

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

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

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

我在网上找到的很多东西都是关于如何将 DataTable 或 DataReader 转换为旧版 ADODB 记录集,但这也会增加很多开销......我宁愿将它保留为 DataTable 并创建一个 COM 接口(interface)允许 VBA 与之交互;这样,例如,如果他们想将表写入 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 作为返回 MyBase.Columns 的 DataColumnCollection。它以对象的形式出现,而不是 MarshalByValueComponent,但也是空的。我知道 MyBase.Column(0) 有一个值,因为我可以将 Msgbox(MyBase.Columns(0).ColumnName) 放在 get 中的 return 正上方,它会很好地弹出(不要判断;这比为此使用调试器)...

我不介意同时定义它们,但我不能继承 DataColumnCollection 并且 COM 接口(interface)在处理泛型方面已经很烂了。在不重新发明轮子的情况下,有没有其他方法可以解决这个问题?

谢谢你的帮助!

最佳答案

在过去的 3 周里,我刚刚做了一些非常相似的事情。

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

  • 与数据存储区对话的纯 .NET 程序集(供 .NET 应用程序使用)。
  • 包装第一个程序集并添加 COM 开销(ADODB 引用和 COM-Visible 接口(interface))的“COM 互操作”程序集。

  • 我使用 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/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com