【问题标题】:vb.net cycle through query resultsvb.net 循环查询结果
【发布时间】: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

【问题讨论】:

    标签: sql vb.net iteration


    【解决方案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 在后台为您池连接,因此无需保持全局连接。
    • 是的,注入是桌面应用程序中的一个问题。用户仍然可以在文本字段中输入不好的内容。
    • 即使使用桌面应用程序,您仍然不需要全局连接对象。从数据库中检索数据可能会非常慢,因此您希望能够并行执行。
    猜你喜欢
    • 2012-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-20
    • 1970-01-01
    • 2019-01-11
    • 2016-11-18
    相关资源
    最近更新 更多