2

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

但是,查询服务器、循环查看结果并在 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
4

1 回答 1

7

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

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

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

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

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

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 函数是该类私有的。在此数据层之外不会发生任何数据库访问。
于 2009-02-27T21:01:57.703 回答