代码之家  ›  专栏  ›  技术社区  ›  Eric Weilnau

Using语句和Lazy Initialized属性出错

  •  0
  • Eric Weilnau  · 技术社区  · 16 年前

    下面的代码将引发InvalidOperationException:ConnectionString属性尚未初始化。在Load方法中调用Connection.Open()的行处引发异常。如果我使用try finally语句而不是using语句,则一切正常。有谁能解释一下using语句为什么会发生异常吗?

    Public Class SomeEntity
        Private _Connection As SqlClient.SqlConnection
        Private _ConnectionString As String
    
        Protected ReadOnly Property Connection() As SqlClient.SqlConnection
            Get
                If _Connection Is Nothing Then
                    _Connection = New SqlClient.SqlConnection(_ConnectionString)
                End If
                Return _Connection
            End Get
        End Property
    
        Public Sub New(ByVal connectionString As String)
            _ConnectionString = connectionString
        End Sub
    
        Public Sub Load(ByVal key As Integer)
            Using Connection
                Connection.Open()
                ...
            End Using
        End Sub
    End Class
    
    2 回复  |  直到 16 年前
        1
  •  1
  •   Dewayne Christensen    16 年前

    您没有提到一条关键信息:它在第一次调用Load()时成功,但在调用之后永远失败。

    使用using时,当using块退出时,将对used变量调用Dispose()。所以在你的场景中:

    1. Using语句调用连接属性的Get
    2. _连接设置为新的SqlConnection并返回
    3. 返回的连接被打开并正常使用

    1. _连接仍然指向一个(无用的)SqlConnection对象,因此它不是空的,并且没有设置为新的SqlConnection对象
    2. 对处于不可用状态的连接调用Open()并触发InvalidOperationException

    在连接管理方面,您混合了各种冲突的方法。保持连接对象作为类的成员存在意味着您希望在SomeEntity对象的生命周期内保持连接的活动性,但是使用using意味着您希望在每次使用时动态创建和销毁连接。

        2
  •  0
  •   user65628 user65628    16 年前

    Connection 在你的 Using

    Public Sub Load(ByVal key As Integer)
        Using myConnection as SqlClient.SqlConnection = Me.Connection
            Connection.Open()
                ...
        End Using
    End Sub
    
    推荐文章