我可以使用哪个 class 在 WinForm VB.Net EXE 程序和 classes DLL 之间传递 "RecordSet"?

Which class can I use to pass a "RecordSet" between an WinForm VB.Net EXE program and a classes DLL?

我开发了一个 VB.Net DLL,可以读取 PostgresOracleOleDb

为了允许这个 DLL 执行一些 SQL 命令,我将一个 Connection 对象传递给它,然后我用它来执行一些 SQL SELECT 命令。

我现在的问题是我想传递包含在 GridView 对象中的所有数据,该对象包含在 EXE 程序(而不是 DLL)中使用 SQL 命令获得的数据 那个用户可能已经改变了。

考虑到以下限制,我可以传递哪种类型的对象?

  1. 传递的参数不能是 WinForm 控件,因为 DataGridView(DLL 中没有 Winform 对象)
  2. 另一个数据库的 table 无法填充 DataGridView 内容(性能不佳)
  3. class 使用的必须是 .Net 程序集的一部分(不是 COM,技术太旧)

到目前为止,找到的唯一解决方案包括使用 ADOMicrosoft ActiveX Data Object Record Set,但此 class 不是 .Net 程序集,而在 DataBase Journal 上找到的解决方案确实如此无法正常工作,因为 Field class 的 Items 属性 是只读的。

这是我的代码

    Dim rstADO As ADODB.Recordset
    rstADO = New ADODB.Recordset
    With rstADO
        .Fields.Append("EmployeeID", ADODB.DataTypeEnum.adInteger, 0, ADODB.FieldAttributeEnum.adFldKeyColumn)
        .Fields.Append("FirstName", ADODB.DataTypeEnum.adVarChar, 10, ADODB.FieldAttributeEnum.adFldMayBeNull)

        .CursorType = ADODB.CursorTypeEnum.adOpenKeyset
        .CursorLocation = ADODB.CursorLocationEnum.adUseClient
        .LockType = ADODB.LockTypeEnum.adLockPessimistic
        .Open()

        For Each row As DataGridViewRow In grid.Rows
            .AddNew()
            For i = 0 To grid.Columns.Count - 1
                .Fields(i) = row.Cells(i).Value
            Next i
            .Update()
        Next row
    End With

.Fields(i)显示以下错误 BC30526: 'Item' 属性 是 'ReadOnly'.

我可以使用哪个class?

您可以使用 .Net DataTable 对象。

这是一些代码行

Dim dt As New DataTable

dt.Columns.Add("EmployeeID", GetType(Integer))
dt.Columns.Add("FirstName", GetType(String))

For Each row As DataGridViewRow In grid.Rows
    dt.Rows.Add(row.Cells(0), row.Cells(1))
Next row

当它被填充时,你可以将它传递给你的 DLL

SetDataTable(dt)

我使用了 tramex 用户提出的解决方案。

我想提取除 EditPDF 列之外的所有列,并且我需要根据 DataGridView 中存在的另一列添加一个名为 cash 的特殊列。

这是我的代码

Dim dt As New DataTable
Dim sName As String
Dim type As Type

Dim oSKipList() As String = {"Edit", "PDF"}
For Each col As DataGridViewColumn In grid.Columns
    sName = col.Name.Replace("Col_", "")
    If Not oSKipList.Contains(sName) Then
        type = col.CellTemplate.FormattedValueType
        dt.Columns.Add(sName, type)
    End If
Next col
dt.Columns.Add("cash", Type.GetType("System.String"))

For Each row As DataGridViewRow In grid.Rows
    Dim dr As DataRow = dt.NewRow
    Dim n = 0
    For Each col As DataGridViewColumn In grid.Columns
        sName = col.Name.Replace("Col_", "")
        If Not oSKipList.Contains(sName) Then
            Dim i = col.Index
            dr(n) = row.Cells(i).Value
            n += 1
        End If
    Next col
    dr(n) = IIf(dr("Account") = "-", "CASH", "")
    dt.Rows.Add(dr)
Next row

oExcelReport.SetDataTable(dt)

此代码的第一部分初始化列,第二部分初始化行。

此代码在我的程序中运行良好。