从记录集中循环数据:从 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
我已经(自己)学习了一些 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