【问题标题】:Closing an SqlDataReader关闭 SqlDataReader
【发布时间】:2012-10-25 10:05:17
【问题描述】:

我有一个使用 SQL Server 2008 的 ASP.Net 2.0 Web 窗体应用程序。该应用程序有一个 UI 层和数据访问层。我使用 Enterprise Libray 5.0 来保存数据。

最近我的网站运行速度非常慢,尤其是在可能有 15-20 次从数据库单独读取的页面上。我非常担心我的 SqlDataReader 数据库连接没有正确关闭。下面是代码如何工作的示例。如果您发现任何与泄漏连接有关的问题,请查看并告诉我。

数据访问类

Public Class DataAccess

    Private db As Database = DatabaseFactory.CreateDatabase()

    Public Function ExecuteDataReader(ByVal params() As SqlParameter, ByVal SProc As String) As SqlDataReader

        Dim i As Integer
        Dim dr As SqlDataReader = Nothing
        Dim cmd As DbCommand

        cmd = db.GetStoredProcCommand(SProc)
        cmd.CommandTimeout = 120

        For i = 0 To params.Length - 1
            db.AddInParameter(cmd, params(i).ParameterName.ToString, params(i).DbType, params(i).Value)
        Next

        dr = TryCast(DirectCast(db.ExecuteReader(cmd), RefCountingDataReader).InnerReader, SqlDataReader)

        Return dr

    End Function

页面背后的 UI 代码

Dim drSource As SqlDataReader = Nothing
        Try
            Dim params(0) As SqlParameter
            params(0) = New SqlParameter("@applicant_id", Session("ApplicantID"))
            drSource = DataAccess.ExecuteDataReader(params, "sp_get_date_last_login")
            If drSource.HasRows Then
                drSource.Read()
                'Do code
            End If
        Finally
            If Not (drSource Is Nothing) Then
                drSource.Close()
            End If
        End Try

我试图将下面的代码放入我的 ExecuteDataReader 方法中,但这会在 SqlDataReader 有机会进行读取之前关闭

if (cmd.Connection.State == ConnectionState.Open)
            cmd.Connection.Close();

有人可以看看上面的代码,让我知道如何正确关闭我的数据库连接,或者我已经在这样做了吗?

感谢您的帮助。

【问题讨论】:

    标签: vb.net database-connection enterprise-library sqldatareader


    【解决方案1】:

    您是否尝试过对 ExecuteReader 进行底层调用以获取 CommandBehavior.CloseConnection 参数?至少这将确保在 DataReader 也关闭时关闭连接。这将依赖从 ExecuteDataReader() 传回的 DataReader 的使用者来显式关闭它或通过 Using 块进行处理。

    或者,尝试将以下代码添加到 drSource.Close() 行后面的代码中:

     drSource.Connection.Close()
    

    【讨论】:

    • 这么说,我刚刚通过 EnterpriseLibrary 帮助查看了 ExecuteReader() 方法的帮助,但没有办法按照我的建议去做。该方法的每个重载都有以下警告:“调用者有责任在完成后关闭连接和读取器。”您需要直接访问 ADO.NET 来执行我的建议。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-04
    • 2011-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-10
    相关资源
    最近更新 更多