【发布时间】:2013-03-12 15:16:14
【问题描述】:
我正在尝试创建一个 .Net DLL,基本上作为数据库连接的抽象层;它将替换我们用 VB6 编写的当前 DLL,我正在尝试尽可能地匹配当前功能。
无论如何,我遇到的基本问题是我找不到一种方法来让 DataColumnCollection 或 DataColumn 等 .Net 类显示在 VBA 解释器中——例如,它可能会说“列”的类型“MarshalByValueComponent”,但值将是“无变量”。
如果我完全重新创建两个类(即字段作为字段的集合,它继承自 DataColumn,然后为两者定义一个接口),我可以让它工作,但这似乎增加了很多开销什么(应该是?)一个非常简单的想法。我觉得我只是在编组器处理 DataColumn 类的方式上遗漏了一些非常简单的东西。
我在网上找到的很多内容都是关于如何将 DataTable 或 DataReader 转换为旧版 ADODB 记录集,但这也会增加很多开销...我宁愿将其保留为 DataTable 并创建一个允许 VBA 与之交互的 COM 接口;这样,例如,如果他们想将表写入 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 中的返回正上方并且它弹出很好(不要判断;这比为此使用调试器)...
我不介意同时定义它们,但我不能继承 DataColumnCollection 并且 COM 接口在处理泛型方面已经很烂了。在不重新发明轮子的情况下,有没有其他方法可以解决这个问题?
感谢您的帮助!
【问题讨论】:
-
您是否考虑过使用 .NET DAO 3.6 对象库?
-
您的意思是使用 DAO 记录集而不是 DataTable,还是有某种方法可以使用 DAO 类来公开 DataTable 的成员?我不确定我是否了解如何将 DataTable.Columns 转换为 DAO.Fields,而不是遍历它们...
-
我想我只是不清楚当前 DLL 在 DB 接口方面做了什么。 VBA 应用程序是 Excel 还是 Access?
-
它在 Excel、Access 和 VBScript 中使用(这完全是另一个问题..);但是如果很容易将数据读取器/数据集/数据表加载到 DAO,我可以在任何/所有这些中使用 DAO 对象模型?
标签: vb.net vba excel com interop