我正在尝试创建一个.Net DLL,基本上作为数据库连接的抽象层;它将替换我们用 VB6 编写的当前 DLL,我正在尝试尽可能地匹配当前功能。
无论如何,我遇到的基本问题是我找不到一种方法来让像 DataColumnCollection 或 DataColumn 这样的 .Net 类显示在 VBA 解释器中——例如,它可能会说,类型为“MarshalByValueComponent”的“Column”, ”,但值为“无变量”。
如果我完全重新创建两个类(即字段作为字段的集合,它继承自 DataColumn,然后为两者定义一个接口),我可以让它工作,但这似乎增加了很多开销(应该是?)一个非常简单的想法。我觉得我只是在编组器处理 DataColumn 类的方式上遗漏了一些非常简单的东西。
我在网上找到的很多东西都是关于如何将 DataTable 或 DataReader 转换为旧版 ADODB 记录集,但这也会增加很多开销......我宁愿将它保留为 DataTable 并创建一个 COM 接口允许 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 接口在处理泛型方面已经很烂了。在不重新发明轮子的情况下,有没有其他方法可以解决这个问题?
谢谢你的帮助!