0

以下のコードは、InvalidOperationException をスローします: ConnectionString プロパティが初期化されていません。Load メソッドの Connection.Open() を呼び出す行で例外がスローされます。using ステートメントの代わりに try-finally ステートメントを使用すると、すべてが正しく機能します。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
4

2 に答える 2

1

重要な情報に言及できませんでした。最初に Load() が呼び出されたときは成功しますが、その後は永遠に失敗します。

Using を使用すると、Using ブロックの終了時に、使用されている変数に対して Dispose() が呼び出されます。あなたのシナリオでは:

  1. Load() が呼び出される
  2. Using ステートメントは、Connection プロパティの Get を呼び出します。
  3. _Connection は新しい SqlConnection に設定され、返されます
  4. 返された接続は開かれ、通常どおり使用されます
  5. Using ブロックが終了し、接続で Dispose() が呼び出されます

この時点で、SqlConnection オブジェクトはまだ存在し、_Connection によってポイントされています。ただし、Dispose() されているため、使用可能な状態ではなくなりました。Load() への 2 回目の呼び出しが行われると、次のようになります。

  1. Load() が呼び出される
  2. Using ステートメントは、Connection プロパティの Get を呼び出します。
  3. _Connection はまだ (役に立たない) SqlConnection オブジェクトを指しているため、Nothing ではなく、新しい SqlConnection オブジェクトに設定されません。
  4. (役に立たない)接続が返されます
  5. Open() は、使用できない状態にある接続で呼び出され、InvalidOperationException をトリガーします。

接続管理に対して競合するアプローチを混在させています。接続オブジェクトをクラスのメンバーとして保持することは、SomeEntity オブジェクトの存続期間中、接続を維持することを意味しますが、Using を使用することは、使用ごとにオンザフライで接続を作成および破棄することを意味します。

于 2009-12-01T22:02:15.483 に答える
0

ConnectionあなたのUsingステートメントでは、初期化または宣言されていません。コードは次のようになります。

Public Sub Load(ByVal key As Integer)
    Using myConnection as SqlClient.SqlConnection = Me.Connection
        Connection.Open()
            ...
    End Using
End Sub
于 2009-12-01T21:20:25.773 に答える