有人能告诉我如何关闭函数内部打开的SQL连接吗?
我称之为选择函数:
Function Selec(ByVal SQLStr As String) As SqlDataReader
Dim SQLConn As New SqlConnection()
Dim SQLCmd As New SqlCommand()
SQLConn.ConnectionString = Session("bd")
SQLConn.Open()
SQLCmd.Connection = SQLConn
SQLCmd.CommandText = SQLStr
Selec = SQLCmd.ExecuteReader
End Function
在另一个页面中,我使用While方法来检索这样的数据:
(注意:BDcon.BD是具有函数的类的名称)
Dim write as New BDcon.BD
Dim menu As SqlDataReader = writeBD.Selec("SELECT something from Table")
While menu.Read
'Do something
End While
menu.Close 'This close just the DataReader and not the SqlConnection
最后,我希望按功能关闭我的SQL连接:
Function Close() As SqlConnection
Dim SQLConn As New SqlConnection()
SQLConn.ConnectionString = Session("bd")
SQLConn.Close()
End Function
我认为问题出在Close()
函数上,我想关闭连接,但我不知道如何调用我的Opened Conneciton。
答案 0 :(得分:1)
我认为使用consruct更好会为你完成任务......
using cn as new system.data.sqlclient.sqlconnection()
cn.open
'{do a bunch of other stuff with commands and datareaders here}
cn.close
end using
或
您还可以使用CommandBehavior Enumeration
请阅读:ExecuteReader with CommanBehavior ( automatically close connection after reading data)
CloseConnection - 执行命令时,关闭关联的DataReader对象时关闭关联的Connection对象。
答案 1 :(得分:0)
在我看来,您应该更改功能以返回DataTable并立即关闭连接 一个例子可能是
Function Select(ByVal SQLStr As String) As DataTable
Dim SQLConn As New SqlConnection(Session("bd"))
Dim SQLCmd As New SqlCommand(SQLStr, SQLConn)
Dim SQLAdapt As New SqlDataAdapter(SQLCmd)
Dim SQLDt As New DataTable()
SQLAdapt.Fill(SQLDt)
SQLConn.Close()
Return SQLDt
End Function
或者您可以使用函数GetConnection
创建并返回SQLConnection,将其传递给Select
函数(不在其中创建新函数),然后手动关闭连接。
答案 2 :(得分:0)
我认为您应该将SqlConnection类的对象作为参数传递给您之前创建的Close函数。 然后在该函数中使用该对象。
答案 3 :(得分:0)
在原始代码中,您无法关闭原始连接,因为连接对象的范围仅适用于创建它的函数(它只能从您创建它的函数内部访问)。我同意Marco的回答,你应该返回一个DataTable而不是一个SQLDataReader。这是一种稍微不同的方法,不需要SQLDataAdapter:
Function Selec(ByVal SQLStr As String) As DataTable
Dim SQLConn As New SqlConnection(Session("bd"))
Dim SQLCmd As New SqlCommand(SQLStr, SQLConn)
Dim SQLDt As New DataTable()
SQLConn.Open()
SQLDt.Load(SQLCmd.ExecuteReader)
'Close the connection as soon as it is no longer needed
SQLConn.Close()
Return SQLDt
End Function
对于使用返回的表,您可以通过这种方式遍历DataRows集合:
Sub DoSomthing()
Dim menu As DataTable = Selec("SELECT * FROM SomeTable")
For Each row As DataRow In menu.Rows
' do something
Next
End Sub
另一种方法是在返回的DataTable上创建一个DataTableReader,虽然除了它与原始代码更相似之外我没有看到任何优势:
Sub AlternateDoSomething()
Dim dt As DataTable = Selec("SELECT * FROM SomeTable")
Dim menu As DataTableReader = dt.CreateDataReader
While menu.Read
'Do something
End While
menu.Close()
End Sub
答案 4 :(得分:0)
我用Pranay Rana的回复解决了我的问题。
将CommandBehavior.CloseConnection添加到我的代码中。
Selec功能的最终代码:
Function Selec(ByVal SQLStr As String) As SqlDataReader
Dim SQLConn As New SqlConnection()
Dim SQLCmd As New SqlCommand()
SQLConn.ConnectionString = Session("bd")
SQLConn.Open()
SQLCmd.Connection = SQLConn
SQLCmd.CommandText = SQLStr
Selec = SQLCmd.ExecuteReader(CommandBehavior.CloseConnection)
End Function
再次感谢你! :d