0

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

4

5 回答 5

1

我认为使用 conruct 会更好地为你完成任务......

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(读取数据后自动关闭连接)

CloseConnection - 执行命令时,在关闭关联的 DataReader 对象时关闭关联的 Connection 对象。

于 2012-04-11T11:21:27.587 回答
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函数(而不在内部创建一个新函数),然后手动关闭连接。

于 2012-04-11T11:24:17.750 回答
0

我认为您应该将 SqlConnection 类的对象作为参数传递给您之前创建的 Close 函数。然后在该函数中使用该对象。

于 2012-04-11T11:24:36.100 回答
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
于 2012-04-11T13:12:24.787 回答
0

我已经通过 Pranay Rana 回复解决了我的问题。

在我的代码中添加了 CommandBehavior.CloseConnection。

选择功能的最终代码:

   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

于 2012-04-12T12:24:26.067 回答