从记录集中循环数据:从 VBA 切换到 VB.net

Looping data from a recordset: switch from VBA to VB.net

我已经(自己)学习了一些 VBA 现在我正在尝试在 VB.net

中传输一些代码

为了从 mySql 数据库中提取数据,我修改了这段代码:

Cn.Open("Driver={MySQL ODBC 5.3 Unicode Driver};Server=" & Server_Name & _
    ";Database=" & Database_Name & ";Uid=" & UserDB & ";Pwd=" & Password & ";")
SQLStr = "SELECT * FROM errlog WHERE Data > NOW()-100000"
rs.CursorLocation = ADODB.CursorLocationEnum.adUseClient
rs.Open(SQLStr, Cn, ADODB.CursorTypeEnum.adOpenStatic)
If rs.RecordCount > 0 Then mRS_Result = rs.GetRows()
If rs.State Then rs.Close()

因此,要循环提取记录的一列中的所有数据,我通常:

NumCol = 0
For NumRow = 0 to mRS_Result.GetUpperBound(1)
    myValue = mRS_Result(NumCol, NumRow)
Next NumRow

根据收到的建议,我将方法更改为 .net 方式,现在我正在使用此代码:

cnString = "datasource=" + Server_Name + ";username= " + UserDB + _
    ";password=" + Password + ";database=" + Database_Name + ""
sqlQRY = "SELECT * FROM errlog WHERE Data > NOW()-100000"
conn = New MySqlConnection(cnString)
Try
    conn.Open()
    da = New MySqlDataAdapter(sqlQRY, conn)
    Dim cb As MySqlCommandBuilder = New MySqlCommandBuilder(da)
    da.Fill(ds, "" + TextBox3.Text + "")
Catch ex As Common.DbException
    MsgBox(ex.ToString)
Finally
    conn.Close()
End Try

因此,要循环提取记录的一列中的所有数据,我使用以下代码:

NumCol = 0
For NumRow = 0 to ds.Tables(0).Rows.count -1
    myValue = ds.Tables(0).Rows(NumRow ).item(NumCol).tostring
Next NumRow

我的问题是:

这是正确的 .net 方式吗?

".ToString" 有用吗?还有当数据是数字时?

虽然此代码接缝良好(它会按预期编译和工作),但您不应该使用 .NET 执行此操作

我建议进行一些改进。

  • MySQL 连接器有一个 Helper class,这是使用 lib
  • 的推荐方式
  • 对像 DataSet 或 MySqlConnection 这样的一次性对象使用 Using 关键字(并避免关闭连接) using 基本上是 Try obj = ... Finally obj.Dispose() End Try
  • 的快捷方式
  • 使用 ForEach 而不是 For 外观
  • 不要循环 DataTable.Rows 但 DataTable.DefaultView
  • 按名称而不是按索引访问列
  • 除非你想要一个字符串,否则不要使用 ToString(),更喜欢强制转换为适当的类型

所以你的代码应该是这样的

Dim connectionString As String = "..."
Dim query as String = "..."

Using ds As DataSet = MySqlHelper.ExecuteDataset(connectionString, query)
    For Each row As DataRowView In ds.Tables(0).DefaultView
        Dim value As Integer = CType(row("name"), Integer)
        ' Or if column can be null, use a Nullable<integer>
        Dim value As Integer? = If(DBNull.Value.Equals(row("name")), Nothing, CType(row("name"), Integer?))
    Next
End Using