vb.net 循环查询结果
Posted
技术标签:
【中文标题】vb.net 循环查询结果【英文标题】:vb.net cycle through query results 【发布时间】: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
【问题讨论】:
【参考方案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 在后台为您池连接,因此无需保持全局连接。 是的,注入是桌面应用程序中的一个问题。用户仍然可以在文本字段中输入不好的内容。 即使使用桌面应用程序,您仍然不需要全局连接对象。从数据库中检索数据可能会非常慢,因此您希望能够并行执行。以上是关于vb.net 循环查询结果的主要内容,如果未能解决你的问题,请参考以下文章
如何在不知道查询结果类型的情况下在 EF/VB.net 中运行存储过程?
Datatable 正在从我为 Windows 10 构建的 VB.NET 应用程序中的 SQL 查询结果中接收 (01\dd\yyyy) 格式的日期