かつてやった、とっても怖いVisualBasicのお話。
Imports System.Data.SqlClient
Module Module1
Sub Main()
Dim constr As String = "なんか接続文字列があると思ってv"
Dim getTb As New DataTable
Using sqcm As SqlCommand = New SqlConnection(constr).CreateCommand
sqcm.CommandText = "select * from hoge"
Using myad As New SqlDataAdapter(sqcm)
myad.Fill(getTb)
End Using
End Using
End Sub
End Module
これのusingが終わった時、実は、生成されていたSQLConnectionが破棄されずに残ってしまう、という現象が起きたの。かなり、かなり、当時、悩んだ。
実はここにその答えがあって、
Using ステートメント (Visual Basic)
http://msdn.microsoft.com/ja-jp/library/htd05whh(v=VS.100).aspx
resourceexpression
必ず指定します。resourcetype の要件を満たすシステム リソースを参照する変数または式です。2 番目の構文を使用する場合は、制御を Using ステートメントに渡す前にリソースを取得する必要があります。
と書かれている2番目の構文、がさっきの10行目の構文。つまり、Usingに使用する前に必ずリソースを取得しておく、ってところがミソ。
Imports System.Data.SqlClient
Module Module1
Sub Main()
Dim constr As String = "なんか接続文字列があると思ってv"
Dim getTb As New DataTable
Using sqcon As New SqlConnection(constr)
Using sqcm As SqlCommand = sqcon.CreateCommand
sqcm.CommandText = "select * from hoge"
Using myad As New SqlDataAdapter(sqcm)
myad.Fill(getTb)
End Using
End Using
End Using
End Sub
End Module
こうすれば、usingステートメントで綺麗にオブジェクトは破棄されまする。
ちょっとした事なんだけどね。
Usingって聞いて、ちょっと、思い出した。