连接未关闭。连接的当前状态是打开的
我意识到这个问题被多次发布,虽然我已将其研究成死亡并尝试了大部分内容,但我还是无法解决如何修复问题。我所看到的一切都说要关闭我的联系,但我觉得我已经用很多不同的方式做到了。我不知道这是不是我的编码问题(请给我指点或建议),或者是否是服务器配置问题(我不知道如何检查)。似乎一旦我遇到错误,其他页面就无法工作一段时间。如果多个用户同时点击某个页面,这种情况将继续发生 - 这实际上会占用整个网站。如果我打开其他浏览器并打开页面,我可以自己重新创建。我无法通过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>
答案 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编码技巧非常糟糕,因此语法可能不正确,但它能够传达基本思想。您甚至应该考虑在将来使用单例模式进行连接。