【问题标题】:Looping data from a recordset: switch from VBA to VB.net从记录集中循环数据:从 VBA 切换到 VB.net
【发布时间】:2015-05-26 09:43:28
【问题描述】:

我已经(自己)学习了一点 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" 有用吗?还有当数据是数字时?

【问题讨论】:

    标签: mysql vb.net recordset


    【解决方案1】:

    虽然这段代码没有问题(它会按预期编译和工作),但这不是您应该使用 .NET 执行此操作的方式

    我会建议一些改进。

    • MySQL 连接器有一个 Helper 类,这是使用 lib 的推荐方式
    • 对 DataSet 或 MySqlConnection 等一次性对象使用 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
    

    【讨论】:

    • 谢谢,我会研究一下建议。只是一个愚蠢的问题(我的知识有限):我如何访问 HelperClass?
    • @genespos MySql.Data.MySqlClient.MySqlHelper - 它是MySql.Data.dll 中的一个类,带有一些静态方法。虽然对于来自 VBA 的人来说,不保持与数据库的永久连接可能看起来很奇怪,但在 .NET 中,使用这种模式 Create Connection -&gt; Open -&gt; Make your query -&gt; Close connection 是很常见的。 MySqlHelper 本身为您隐藏了这个逻辑,只返回数据。 MySql 连接器本身默认在后台保持连接打开,这些连接被回收,请参阅dev.mysql.com/doc/connector-net/en/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-04
    • 1970-01-01
    • 2011-04-26
    • 2015-07-02
    • 2013-11-25
    • 2014-01-15
    • 1970-01-01
    相关资源
    最近更新 更多