我在VB6中有一部分代码正在尝试转换为VB.net。特别是记录集。
这是VB6代码的一部分:
Data19.RecordSource = "select id from headers where type=12"
Data19.Refresh
If Data19.Recordset.RecordCount > 0 Then
Data6.RecordSource = "select sum(left * right) from footers where type=12"
Data6.Refresh
ss = Format(Data6.Recordset.Fields(0), "0.00")
Data19.Recordset.MoveLast
a = Data19.Recordset.RecordCount - 1
Data19.Recordset.MoveFirst
For i = 0 To a
If i > 0 Then Data19.Recordset.MoveNext
Data22.RecordSource = "select * from documents where type=12"
Data19.Recordset.Fields(0)
Data22.Refresh
With Data22.Recordset
If .RecordCount > 0 Then
.MoveLast
b = .RecordCount - 1
.MoveFirst
For j = 0 To b
If j > 0 Then .MoveNext
If .Fields("link1") < ra And .Fields("code") <> "00" Then
.Edit
.Fields("link1") = ra
.Fields("pc") = Format(.Fields("dpc") * (100 - ra) / 100, "0.00")
.Fields("total") = Format(.Fields("amount") * .Fields("dpc") * (100 - ra) / 100, "0.00")
.Update
End If
Next
End If
End With
Next
End If
我对.MoveLast
,.MoveFirst
,.Recordset
感到困惑。
在我的VB.net代码中,我一直在使用此函数从数据库中获取所需的表:
Public Function returnTable(ByVal queryString As String)
Dim query1 As String = queryString
'Console.WriteLine(query1)
Dim table As New DataTable
Using connection As New MySqlConnection(connection)
Using adapter As New MySqlDataAdapter(query1, connection)
Dim cmb As New MySqlCommandBuilder(adapter)
table.Clear()
adapter.Fill(table)
Return table
End Using
End Using
End Function
因此,如果我没记错的话,带有记录源的部分应该是这样的:
Dim data19 as new datatable
Data19 = returnTable("select id from headers where type=12")
但是后来,在代码中,我无法弄清楚如何将等效物写到.MoveLast
,.MoveFirst
,.Recordset
,.MoveNext
等... < / p>
答案 0 :(得分:2)
您似乎正在尝试将等效的VB.Net编写为VB6 .MoveLast, .MoveFirst, .Recordset, .MoveNext
等。
。记录集
您使用创建的returnTable函数非常接近您的解决方案。数据表只是DataRow对象的集合,这与VB6中的记录集对象有些不同。您使用.Net函数创建了一个DataTable:
Dim data19 as new datatable
Data19 = returnTable("select id from headers where type=12")
在这种情况下,Data19是一个DataTable,它代替了VB6示例中的记录集。
.MoveLast
在您的VB6示例中,使用.MoveLast
的原因是公开记录集中的记录数。直到您移动到最后一条记录,记录的数量才知道。
移动到最后一条记录后,可以将计数加载到变量中。
有了ADO.Net,您不需要使用.MoveLast
来获得计数。您可以像这样简单地获取行数:
Dim row_count As Integer = Data19.Rows.Count
您将在下面看到转换为.Net时不需要此变量。您可以在VB6中使用它来了解要循环遍历多少条记录(以及何时停止)。在.Net中,您将使用For Each.. Next
来达到相同的目的。
.MoveFirst
在您的示例中,仅使用.MoveFirst
是因为您使用.MoveLast
来获取记录计数。为了遍历记录集,您必须返回到第一条记录。
由于您不再需要在.Net中使用.MoveLast
,因此您也不需要使用.MoveFirst
。
.MoveNext
在您的VB6示例中,.MoveNext
用于遍历记录集并在每一行上执行一些操作。要遍历您创建的DataTable,可以执行以下操作:
Dim my_row as DataRow
For Each my_row in Data19.Rows
If my_row("link1") < ra And my_row("code") <> "00" Then
.. do some actions
End If
Next
这将以类似的方式遍历记录集。要考虑的一件事是,当您使用DataTable时,您正在使用断开连接的记录集。当您进入VB6过程的.Edit
和.Update
部分时,可能需要使用参数化查询对所有记录执行实际更新。这将使用命令对象和.ExecuteNonQuery()
方法来执行SQL更新语句。