2009-02-27 189 views
2

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

但是,什么是正确的方式来查询服务器,遍历结果,并在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 

回答

7

我怀疑问题与您管理gconIntegration连接做。你正在努力继续使用相同的连接。看看它的位置会很有帮助。

更好地从池中获得“新”连接并让.NET为您担心。

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

还有一件事:不要在.Net中将对象设置为Nothing。要么根据需要处理它们,要么让它们自己掉到范围之外。

这是我从一个数据表中拉回来一个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函数对于该类是私有的。在这个数据层之外没有数据库访问发生。
+0

gconIntegration是一个全局连接。所以你说我所有阅读和写作的单一连接并不是最佳途径? – 2009-02-27 21:11:56