将VB6迁移到VB.net记录集和数据表

时间:2019-02-13 18:10:23

标签: vb.net vb6-migration

我在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>

1 个答案:

答案 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更新语句。