我熟悉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
答案 0 :(得分:7)
我怀疑问题与您管理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
。