0

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

我意识到这个问题被发布了很多次,虽然我已经研究了它并尝试了几乎所有的东西,但我仍然无法解决如何解决问题。我所看到的一切都表明要关闭我的联系,但我觉得我已经以多种不同的方式做到了这一点。我不知道这是否是我的编码问题(请给我指点或建议),还是服务器配置问题(我不知道如何检查)。好像一旦我遇到错误,其他页面在一段时间内都无法工作。如果多个用户同时点击一个页面,这种情况会继续发生——它实际上会使整个网站瘫痪。如果我打开其他浏览器并打开页面,我可以自己重新创建。

我可以在这段代码中做些什么来确保连接已关闭,以便其他人可以重用?和/或是否有另一种方法来处理错误,以便用户可以再试一次而不是把所有东西都搞砸?

谢谢你们!

下面的示例是我所拥有的外壳,但它会导致问题。它们略有不同,因为我尝试了各种方法来从本网站上的示例开始工作。

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

后面的代码:

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>
4

2 回答 2

0

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

此外,dataadapter.fill如果连接尚未打开,该方法将为您打开连接,如果它为您打开连接,则将其关闭,因此您不需要(也不应该)显式打开连接。

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

于 2013-09-26T19:13:31.060 回答
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 编码技能很差,所以语法可能不正确,但它能够传达基本思想。您甚至应该考虑在将来使用单例模式进行连接。

于 2013-09-26T20:05:31.997 回答