ASP.NET(VB) - 关闭Function中打开的SQL连接

时间:2012-04-11 11:16:04

标签: .net sql vb.net connection

有人能告诉我如何关闭函数内部打开的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。

5 个答案:

答案 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