代码之家  ›  专栏  ›  技术社区  ›  Jeff Davis

net循环查询结果

  •  2
  • Jeff Davis  · 技术社区  · 16 年前

    我熟悉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 回复  |  直到 16 年前
        1
  •  7
  •   Joel Coehoorn    16 年前

    我怀疑问题与你如何管理你的工作有关 gconIntegration 联系你太努力了,无法继续使用相同的连接。看看它住在哪里会很有帮助。

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

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

    Nothing

    以下是我从datatable中提取datatable的常规方法:

    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函数是该类的私有函数。在此数据层之外不会发生数据库访问。