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

时间:2015-05-26 09:43:28

标签: mysql vb.net recordset

我(我自己)学到了一点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”有用吗?当数据是数字时?

1 个答案:

答案 0 :(得分:0)

虽然这段代码接口正常(它会按预期编译和工作)但这不是你应该如何使用.NET

我建议有一些改进。

  • MySQL连接器有一个Helper类,这是使用lib
  • 的推荐方法
  • 使用DataSet或MySqlConnection等Disposable对象的Using Keyword(并避免关闭连接) 使用基本上是Try obj = ... Finally obj.Dispose() End Try
  • 的快捷方式
  • 使用ForEach而不是For look
  • 不要遍历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