首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不允许更改'ConnectionString‘属性。连接的当前状态为打开

不允许更改'ConnectionString‘属性。连接的当前状态为打开
EN

Stack Overflow用户
提问于 2009-05-06 10:49:01
回答 3查看 12.1K关注 0票数 2

第一次使用stackoverflow,但我一直关注它在Coding Horror上的发展。

我对上面的错误感到非常头疼。我已经安装了ELMAH和Google Analytics,随着网站流量的增加,我看到这个错误的次数也增加了。

在整个开发过程中,我已经尽了最大努力遵循微软的原则:http://msdn.microsoft.com/en-us/library/ms971481.aspx,并且我已经根据网络上的各种建议尽可能地优化了我的代码。

我在公开课上有我的SqlConnection;

代码语言:javascript
复制
Public Class pitstop
Public Shared oConn As New System.Data.SqlClient.SqlConnection
    Public Shared Sub doConnect()
    If oConn.State = ConnectionState.Closed Then
        oConn.ConnectionString = System.Configuration.ConfigurationManager.ConnectionStrings("pitstopConnectionString").ConnectionString
        oConn.Open()
    End If
End Sub
Public Shared Sub doGarbage()
    oConn.Dispose()
End Sub
' /// other code ///
End Class

在我的主应用程序页面中,我执行的操作与以下内容大致相同:

代码语言:javascript
复制
 Private Sub doPump()
    pitstop.doConnect()
    Dim cmd As New System.Data.SqlClient.SqlCommand("doGetCategory", pitstop.oConn)
    Dim dt As New DataTable
    Dim dr As SqlDataReader

    cmd.Parameters.Add("@cat", SqlDbType.Int)
    cmd.Parameters("@cat").Value = CType(Request.QueryString("id"), Integer)

    cmd.CommandType = CommandType.StoredProcedure

    dr = cmd.ExecuteReader()
    While dr.Read()
        If dr.HasRows = True Then
            litCategory.Text = dr("category")
            litCategoryDesc.Text = pitstop.doMakeReadyForHTML(dr("desc"))
        End If
    End While
    cmd = Nothing
    dr.Close()
    pitstop.doGarbage()
End Sub

我自始至终都在使用这种方法,而且大多数时候效果都很好,但现在这个网站变得非常忙碌,戏剧已经开始了!有谁有什么想法吗?

我不希望重写堆积如山的代码,但我对建议持开放态度。

:)

克里斯

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-05-06 10:54:23

分享你的连接是个问题。

不需要共享连接,也不会像您现在遇到的那样产生问题。.NET的连接池处理幕后真实连接的共享。

只需在doPump()中创建一个新连接

代码语言:javascript
复制
Private Sub doPump()
    Using Dim conn As New SqlConnection(ConfigurationManager.ConnectionStrings("pitstopConnectionString").ConnectionString)
        Using Dim cmd As New SqlCommand("doGetCategory", conn)
        cmd.CommandType = CommandType.StoredProcedure
        cmd.Parameters.AddWithValue("@cat", CType(Request.QueryString("id"), Integer))
        conn.Open()
        Using Dim dr as SqlDataReader = cmd.ExecuteReader()
            While dr.Read()
                    litCategory.Text = dr("category")
                    litCategoryDesc.Text = pitstop.doMakeReadyForHTML(dr("desc"))
            End While
            dr.Close()
        End Using
    End Using
End Sub
票数 7
EN

Stack Overflow用户

发布于 2009-05-06 10:56:22

您的SqlConnection对象是Shared。这是一个web应用程序,它的本质是多线程的。

您的数据库访问逻辑位于代码隐藏页中。

如果在调用pitstop.doGarbage()之前发生异常怎么办?连接要么永远不会关闭,要么会被挂起并导致各种各样的bug。

就您当前的代码而言:取消Shared您的连接,将您的数据访问逻辑移动到一个单独的类,正确地管理资源(考虑Using语句)。

票数 1
EN

Stack Overflow用户

发布于 2009-05-06 11:43:22

我添加了以下代码,将“共享”连接从pitstop类中删除。Pitstop被称为“pitstop”,因为这是项目的名称。这是不合适的吗?你们用什么惯例?

我已经取消了doGarbage()函数,现在调用连接和可处置的“内联”,如下所示;

代码语言:javascript
复制
  Private Sub doPump()
    Dim oConn As New SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings("pitstopConnectionString").ConnectionString)
    Dim cmd As New System.Data.SqlClient.SqlCommand("doGetCategory", oConn)
    oConn.Open()

    Dim dt As New DataTable
    Dim dr As SqlDataReader

    cmd.Parameters.Add("@cat", SqlDbType.Int)
    cmd.Parameters("@cat").Value = CType(Request.QueryString("id"), Integer)

    cmd.CommandType = CommandType.StoredProcedure

    dr = cmd.ExecuteReader()
    While dr.Read()
        If dr.HasRows = True Then
            litCategory.Text = dr("category")
            litCategoryDesc.Text = pitstop.doMakeReadyForHTML(dr("desc"))
        End If
    End While
    cmd = Nothing
    dr.Close()

    oConn.Dispose()
End Sub

这是正确的吗?

此外,Anton提到在类中拥有功能是不正确的-我也会阅读他链接的文档-但是为什么它是错误的,有没有快速的答案?

非常感谢所有的回复-你们都非常有帮助。

克里斯

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/829051

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档