2009-12-01 3 views
0

아래 코드는 InvalidOperationException을 throw합니다. ConnectionString 속성이 초기화되지 않았습니다. 예외는 Load 메서드의 Connection.Open()을 호출하는 줄에서 throw됩니다. using 문 대신 try-finally 문을 사용하면 모든 것이 올바르게 작동합니다. 누구든지 예외를 사용하여 왜 발생하는지 설명 할 수 있습니까? 당신의 Using 문에Using Statement 및 Lazy Initialized 속성의 오류

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 

답변

0

Connection 초기화 또는 선언되지 않습니다. 코드는 더 같이 읽어야 : 당신은 정보의 핵심 부분을 언급하는 데 실패

Public Sub Load(ByVal key As Integer) 
    Using myConnection as SqlClient.SqlConnection = Me.Connection 
     Connection.Open() 
      ... 
    End Using 
End Sub 
+0

사실, 그렇습니다. SomeEntity 클래스의 protected Connection 속성을 참조합니다. –

1

: 그것은 처음 호출로드() 성공,하지만 영원히 후 실패합니다.

Using을 사용하면 Using 블록이 종료 될 때 Dispose()가 사용 된 변수에서 호출됩니다. 그래서 시나리오 :

  1. 로드() 연결 속성의이
  2. _Connection이 새도록 SqlConnection로 설정됩니다 받기
  3. using 문을 호출 전화를 반환됩니다
  4. 연결 열고 일반적으로 사용됩니다 반환
  5. 은 Using 블록 종료하면,이 시점에서 연결

의 경우 SQLConnection objec에 폐기()를 호출 t는 여전히 존재하며 _Connection에 의해 여전히 가리 킵니다. Dispose()이므로 d는 더 이상 사용할 수있는 상태가 아닙니다. d.()로드 할 수있는 두 번째 전화가 올 때 :

  • using 문을 호출되는) (

    1. 로드 호출 연결 속성의는
    2. 가 _Connection 여전히 (쓸모없는) SqlConnection 개체를 가리키는
    3. 는, 그러므로 그것의 받기 사용할 수없는 상태입니다 - -하지 아무것도, 그리고은 (쓸모없는) 연결이 연결에서 호출되는
    4. 열기를() 반환됩니다
    5. 새로운 SqlConnection 개체로 설정되지 않고 InvalidOperationException이 트리거

    연결 관리에 대해 서로 상충되는 방식을 혼합하고 있습니다. 클래스의 멤버로서 연결 객체를 유지하는 것은 SomeEntity 객체의 수명 동안 연결을 유지하려고 함을 의미하지만 Using을 사용하면 각 사용법에 따라 연결을 생성하고 파기하려고한다는 것을 의미합니다.