vb.net 循环查询结果

Posted

技术标签:

【中文标题】vb.net 循环查询结果【英文标题】:vb.net cycle through query results 【发布时间】:2009-02-27 20:50:38 【问题描述】:

我熟悉 VB6 ADO 处理 SQL 查询和循环遍历记录集结果的方式。

但是,查询服务器、循环查看结果以及在 VB.Net 中处理我的查询的正确方法是什么?我一直使用的所有方式似乎都不稳定,随机崩溃。

我一直在使用以下代码:

Public Function GetSQLTable(ByVal strSQL As String) As DataTable
    Dim table As New DataTable
    Dim adapt As SqlDataAdapter

    Try
        adapt = New SqlDataAdapter(strSQL, gconIntegration)
        adapt.Fill(table)
    Catch ex As Exception
        LogError("GetSQLTable: " & ex.ToString(), "SQL: " & strSQL)
    End Try

    Return table
End Function

并像这样使用它:

 Dim dt As DataTable
 Dim lngRow As Long
 Dim current As DataRow
 Dim lngContact As long

 Try
        dt = GetSQLTable(strSQL)
        For lngRow = 0 To dt.Rows.Count - 1
            current = dt.Rows.Item(lngRow)
            lngContact = current.Item("indvid") 
            DoSomething(lngContact)
        Next
Catch ex As Exception
    LogError("FindContact: " & ex.ToString(), "SQL: " & strSQL)
    lngContact = -1     
 Finally
    current = nothing
    dt = nothing

【问题讨论】:

【参考方案1】:

我怀疑问题与您管理gconIntegration 连接的方式有关。您正在努力保持使用相同的连接。看看它住在哪里会很有帮助。

最好从池中获取“新”连接,让 .Net 为您担心。

此外,您的通用“GetSQLTable”代码缺少一个重要部分:它不允许设置参数,这告诉我您正在将它们直接构建到查询字符串中。这是灾难的根源:它会导致 Sql 注入安全漏洞。

还有一件事:不要在 .Net 中将对象设置为 Nothing。如果需要,要么处置它们,要么让它们自行超出范围。

这是我从数据表中拉回数据表的常规方法:

Function GetSomeData(ByVal Table2ID As Integer)
    Dim result As New DataTable

    Dim sql As String = "SELECT Column1,Column2 FROM [Table1] WHERE Table2ID= @Table2ID"

    Using cn As New SqlConnection( GetConnectionString() ), _
    Using cmd As New SqlCommand(sql, cn)

        cmd.Parameters.Add("@Table2ID", SqlDbType.Int).Value = Table2ID

        Using rdr As SqlDataReader = cmd.ExecuteReader()
           result.Load(rdr)
        End Using
    End Using
    return result
End Function

关于该代码的一些注释:

Using 语句将保证关联的对象被放置在相应的End Using。 查询参数保持强类型,并且从不直接替换到查询字符串中,即使它们被传输到服务器。 Sql 数据和 Sql 代码永远不会混用。 对于需要发送的每个查询,您确实需要一个单独的函数。这确实是一件好事,因为它会导致为您的数据库构建强类型接口。理想情况下,所有这些函数都在同一个类中,并且 GetConnectionString 函数是该类私有的。在此数据层之外不会发生任何数据库访问。

【讨论】:

gconIntegration 是一个全局连接。所以你是说我所有阅读和写作的单一连接不是最佳方式? 当 SQL 注入不是 Web 应用程序(这实际上是一个已编译的 exe)时,它并不是真正值得关注的问题 正确 - 设计迫使您以串行方式完成所有数据库工作。这对于所有请求都在同一个应用程序中的网站来说尤其糟糕。 .Net 在后台为您池连接,因此无需保持全局连接。 是的,注入是桌面应用程序中的一个问题。用户仍然可以在文本字段中输入不好的内容。 即使使用桌面应用程序,您仍然不需要全局连接对象。从数据库中检索数据可能会非常慢,因此您希望能够并行执行。

以上是关于vb.net 循环查询结果的主要内容,如果未能解决你的问题,请参考以下文章

VB.NET 中 IsNumeric() 的错误结果

如何在不知道查询结果类型的情况下在 EF/VB.net 中运行存储过程?

vb.net sql查询出来的结果怎么赋值到TEXT?

Datatable 正在从我为 Windows 10 构建的 VB.NET 应用程序中的 SQL 查询结果中接收 (01\dd\yyyy) 格式的日期

vb net 将多个数据读取器结果存储到一个字符串变量中

VB.net windows 应用程序根据多个唯一行值检索值