我可以使用哪个 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,可以读取 Postgres
、Oracle
和 OleDb
。
为了允许这个 DLL 执行一些 SQL 命令,我将一个 Connection
对象传递给它,然后我用它来执行一些 SQL SELECT
命令。
我现在的问题是我想传递包含在 GridView
对象中的所有数据,该对象包含在 EXE 程序(而不是 DLL)中使用 SQL
命令获得的数据 那个用户可能已经改变了。
考虑到以下限制,我可以传递哪种类型的对象?
- 传递的参数不能是 WinForm 控件,因为
DataGridView
(DLL 中没有 Winform 对象)
- 另一个数据库的 table 无法填充
DataGridView
内容(性能不佳)
- class 使用的必须是 .Net 程序集的一部分(不是
COM
,技术太旧)
到目前为止,找到的唯一解决方案包括使用 ADO
或 Microsoft 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
用户提出的解决方案。
我想提取除 Edit
和 PDF
列之外的所有列,并且我需要根据 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)
此代码的第一部分初始化列,第二部分初始化行。
此代码在我的程序中运行良好。
我开发了一个 VB.Net
DLL,可以读取 Postgres
、Oracle
和 OleDb
。
为了允许这个 DLL 执行一些 SQL 命令,我将一个 Connection
对象传递给它,然后我用它来执行一些 SQL SELECT
命令。
我现在的问题是我想传递包含在 GridView
对象中的所有数据,该对象包含在 EXE 程序(而不是 DLL)中使用 SQL
命令获得的数据 那个用户可能已经改变了。
考虑到以下限制,我可以传递哪种类型的对象?
- 传递的参数不能是 WinForm 控件,因为
DataGridView
(DLL 中没有 Winform 对象) - 另一个数据库的 table 无法填充
DataGridView
内容(性能不佳) - class 使用的必须是 .Net 程序集的一部分(不是
COM
,技术太旧)
到目前为止,找到的唯一解决方案包括使用 ADO
或 Microsoft 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
用户提出的解决方案。
我想提取除 Edit
和 PDF
列之外的所有列,并且我需要根据 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)
此代码的第一部分初始化列,第二部分初始化行。
此代码在我的程序中运行良好。