我想创建一个.Net DLL基本上作为数据库连接的抽象层;它将取代我们拥有的用VB6编写的当前DLL,并且我试图尽可能地匹配当前的功能。通过COM接口将.NET DataTable属性公开给VBA
不管怎么说,我有必要的问题是,我不能找到一个办法让.NET类像DataColumnCollection或DataColumn中的VBA解释器显示 - 它可能会说,例如,“列”与键入“MarshalByValueComponent”,但值将为“无变量”。
如果我完全重新创建两个类(即Fields作为字段的集合,从DataColumn继承,然后为这两个接口定义接口),我可以使它工作,但是好像增加了很多开销为什么(应该是?)一个非常简单的想法。我觉得我只是想用编组器处理DataColumn类的方式丢失一些非常简单的东西。
我在网上找到的很多东西是关于如何将DataTable或DataReader转换为遗留的ADODB Recordset,但这也会增加很多开销......我宁愿将它作为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
注:我最初试图属性列,其中DataColumnCollection返回MyBase.Columns。这是作为Object而不是MarshalByValueComponent传递的,但也是空的。我知道MyBase.Column(0)有一个值,因为我可以把Msgbox(MyBase.Columns(0).ColumnName)放在get的返回之上,它弹出正常(不要判断;这样比使用一个调试器)...
我不介意只是定义它们两个,但我不能继承DataColumnCollection和COM接口已经很烂处理泛型。有没有其他解决方法,而不需要重新发明轮子?
感谢您的帮助!
您是否考虑过使用.NET DAO 3.6 Object Library? – 2013-03-12 15:31:39
您的意思是使用DAO Recordset而不是DataTable,还是有一些方法可以使用DAO类来公开DataTable的成员?我不知道如何将DataTable.Columns转换为DAO.Fields,而不是遍历它们... – Karter 2013-03-12 15:44:54
我想我只是不清楚当前DLL在数据库接口方面做了什么。 VBA应用程序是Excel还是Access? – 2013-03-12 16:01:26