基本的にデータベース接続の抽象化レイヤーとして.Net DLLを作成しようとしています。VB6 で記述された現在の DLL を置き換える予定であり、現在の機能に可能な限り一致させようとしています。
とにかく、私が抱えている本質的な問題は、DataColumnCollection や DataColumn などの .Net クラスを取得して VBA インタープリターに表示する方法が見つからないことです。 」ですが、値は「変数なし」になります。
両方のクラスを完全に再作成すれば動作させることができます (つまり、DataColumn から継承するフィールドのコレクションとして Fields を作成し、両方のインターフェイスを定義します)。 ?) かなり単純なアイデアです。マーシャラーが DataColumn クラスを処理する方法で、非常に単純なものが欠けているように感じます。
私がオンラインで見つけているものの多くは、DataTable または DataReader を従来の ADODB Recordset に変換する方法に関するものですが、それによっても多くのオーバーヘッドが追加されます... DataTable のままにして COM インターフェイスを作成したいと思いますVBA がそれと対話できるようにします。そうすれば、たとえば、テーブルを Excel シートに書き込みたい場合、作業を複製することはありません (ADODB レコードセットに変換してから、Excel シートに読み書きする必要があります。テーブル全体を 2 回繰り返す必要があります。 ..)
本の長さの説明で申し訳ありません-根本的な原因はレガシー機能と一致させようとしているため、問題を少し明確にする必要があると感じました。動作しない現在のインターフェイスの例を次に示します。
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
注: 最初に、MyBase.Columns を返す DataColumnCollection としてプロパティ Columns を試しました。これは、MarshalByValueComponent ではなくオブジェクトとして渡されましたが、空でもありました。Msgbox(MyBase.Columns(0).ColumnName) を get の return のすぐ上に置くことができるので、MyBase.Column(0) に値があることはわかっています。これにはデバッガを使用します)...
両方を定義するだけでもかまいませんが、DataColumnCollection を継承することはできず、COM インターフェイスはジェネリックを扱うのが苦手です。車輪を再発明することなく、これを回避する他の方法はありますか?
ご協力いただきありがとうございます!