连接没有关闭。连接的当前状态是打开的 - 尝试关闭所有内容

时间:2013-09-26 17:58:45

标签: sql asp.net vb.net ado.net

连接未关闭。连接的当前状态是打开的

我意识到这个问题被多次发布,虽然我已将其研究成死亡并尝试了大部分内容,但我还是无法解决如何修复问题。我所看到的一切都说要关闭我的联系,但我觉得我已经用很多不同的方式做到了。我不知道这是不是我的编码问题(请给我指点或建议),或者是否是服务器配置问题(我不知道如何检查)。似乎一旦我遇到错误,其他页面就无法工作一段时间。如果多个用户同时点击某个页面,这种情况将继续发生 - 这实际上会占用整个网站。如果我打开其他浏览器并打开页面,我可以自己重新创建。我无法通过Visual Studio在本地工作时重新创建(这就是为什么我想知道它是否是IIS配置的东西)。

我可以在此代码中执行任何操作以确保连接已关闭,以便其他人可以重复使用吗?和/或是否有另一种方法来处理错误,以便用户可以再次尝试而不是将所有内容都关闭?

谢谢大家!

以下示例是我拥有的shell,但它会导致问题。它们略有不同,因为我尝试了各种方法来从这个网站上的例子开始工作。

=============================================== ===================

代码背后:

Imports System.Data.SqlClient
Imports System.Data
Imports System.Web.UI.WebControls.DataControlField

Partial Class test_testConnections
    Inherits System.Web.UI.Page

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        If Not Page.IsPostBack Then

            LoadMetricDatesToDropDown()
            loadMetricWorkstreamsToDropDown()
        End If
    End Sub
    Sub LoadMetricDatesToDropDown()
        Dim draftbit As Boolean = False
        ddlDtSelector.Items.Clear()
        Using oConn As New SqlConnection(ConfigurationManager.ConnectionStrings("aid1564conn").ConnectionString)
            Using cmd As New SqlCommand("usp_DSBR_Date_Selections", oConn)
                cmd.CommandType = CommandType.StoredProcedure
                oConn.Open()
                Using dr As SqlDataReader = cmd.ExecuteReader()
                    If dr.HasRows Then
                        While dr.Read
                            Dim li As New ListItem()
                            If dr("dt_status").ToString.ToUpper = "DRAFT" Then
                                li.Text = dr("Metric_Dt") & " (draft)"
                                draftbit = True
                            Else
                                li.Text = dr("metric_dt")
                            End If
                            li.Value = dr("Metric_dt")
                            ddlDtSelector.Items.Add(li)
                        End While
                    End If
                End Using
            End Using
        End Using
        If draftbit = True Then ddlDtSelector.SelectedIndex = 1
    End Sub


    Sub loadMetricWorkstreamsToDropDown()
        Using oConn As New SqlConnection(ConfigurationManager.ConnectionStrings("aid1564conn").ConnectionString)
            Using cmd As New SqlCommand("usp_DSBR_Get_Workstreams", oConn)
                cmd.CommandType = CommandType.StoredProcedure
                oConn.Open()
                Using dr As SqlDataReader = cmd.ExecuteReader()
                    If dr.HasRows Then
                        While dr.Read
                            Dim li As New ListItem()
                            li.Text = dr("workstream_Name")
                            li.Value = dr("workstream_id")
                            workstreams.Items.Add(li)
                        End While
                    End If
                End Using
            End Using
        End Using
    End Sub


End Class

=============================================== ===================

<%@ Page Language="VB" AutoEventWireup="false" CodeFile="testConnections.aspx.vb" Inherits="Test_testConnections" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
    <asp:DropDownList ID="ddlDtSelector" runat="server" AutoPostBack="true"></asp:DropDownList>
    <asp:DropDownList ID="workstreams" runat="server" AutoPostBack="true"></asp:DropDownList>
    <a href="testConnections.aspx">go</a>
    </div>
    </form>
</body>
</html>

2 个答案:

答案 0 :(得分:0)

可能不是您正在寻找的答案,但如果您切换到使用数据集而不是数据加载器,则在开始迭代行之前连接将关闭。这应该可以让您了解此错误。

此外,dataadapter.fill方法将为您打开连接(如果尚未打开),然后在为您打开连接时将其关闭,因此您不需要(也不应该)明确打开连接。

这里可能会发生更大的事情,但这就是我要做的事情。

答案 1 :(得分:0)

既然你提到你已经尝试了很多东西,那么你可能已经尝试了但是如果你没有尝试过,这里有一个示例,其中我添加了一些防御性编码:

If oConn==null THEN Using oConn As New SqlConnection(ConfigurationManager.ConnectionStrings("aid1564conn").ConnectionString)
        Using cmd As New SqlCommand("usp_DSBR_Get_Workstreams", oConn)
            cmd.CommandType = CommandType.StoredProcedure
    if oConn.State != ConnectionState.Open
                oConn.Open()
            Using dr As SqlDataReader = cmd.ExecuteReader()
                If dr.HasRows Then
                    While dr.Read
                        Dim li As New ListItem()
                        li.Text = dr("workstream_Name")
                        li.Value = dr("workstream_id")
                        workstreams.Items.Add(li)
                    End While
                End If
            End Using
        End Using
    End Using

我的VB编码技巧非常糟糕,因此语法可能不正确,但它能够传达基本思想。您甚至应该考虑在将来使用单例模式进行连接。