|
分類:[VB.NET/VB2005 以降]
SqlDataAdapter.Dispose はリソースリークの観点から呼び出す必要があるのか
お教えいただきたいです。
次のようなプログラムを記述しました。
・SqlDataAdapter.Fill にてデータを取得する。
・Connection.Open は明示的に呼ばない。
・Connection の状態が変わったら Connection の状態を出力する。
・SqlDataAdapter.Dispose は呼ばない。
Imports System.Data
Imports System.Data.SqlClient
Imports System.Threading
Module Module1
Sub Main()
AddHandler Thread.GetDomain().UnhandledException, AddressOf ApplicationUnhandledException
Dim adapter As New SqlDataAdapter("Select * From [test]", "connectionString")
AddHandler adapter.SelectCommand.Connection.StateChange, AddressOf ConnectionStateChange
Dim table As New DataTable()
adapter.Fill(table)
Console.ReadKey()
End Sub
Sub ConnectionStateChange(ByVal sender As Object, ByVal e As StateChangeEventArgs)
Console.WriteLine("Connection {0}", e.CurrentState.ToString())
End Sub
Sub ApplicationUnhandledException(ByVal sender As Object, ByVal e As UnhandledExceptionEventArgs)
Console.WriteLine(DirectCast(e.ExceptionObject, Exception).Message)
End Sub
End Module
SqlDataAdapter.Fill は明示的に接続を開いていない場合、自動的に接続を開いて自動的
に閉じるので例外が発生しない場合の出力は
Connection Open
Connection Closed
になりました。
さらに、 存在しないテーブルを SQL に記述して例外(SqlException)が発生した場合も
接続は閉じられるようで、このように出力されました。
Connection Open
オブジェクト名 'test2' が無効です。
Connection Closed
SqlDataAdapter.Dispose は呼ばなくて善いような気がしているのですが、呼ばないこと
によるリソースリークの危険性はあるのか、例外の発生タイミングによってはまずいかも
などありましたら、お教えいただきたい次第です。
|