次の例を見てください...
Using cn As New SqlConnection(ConnectionString)
Try
Dim cmd As SqlCommand = New SqlCommand
With cmd
.Connection = cn
.Connection.Open()
.CommandText = "dbo.GetCustomerByID"
.CommandType = CommandType.StoredProcedure
.Parameters.Add("@CustomerID", SqlDbType.Int, 4)
.Parameters("@CustomerID").Value = CustomerID
End With
da = New SqlDataAdapter(cmd)
da.Fill(ds, "Customer")
Catch ex As Exception
End Try
End Using
今日の私の調査によると、これは基本的には問題ないように聞こえますが、SqlCommandは破棄されていません。
質問->次の例のどれがこれに対処するための最良の方法ですか?
例2-手動で廃棄する
Using cn As New SqlConnection(ConnectionString)
Try
Dim cmd As SqlCommand = New SqlCommand
With cmd
.Connection = cn
.Connection.Open()
.CommandText = "dbo.GetCustomerByID"
.CommandType = CommandType.StoredProcedure
.Parameters.Add("@CustomerID", SqlDbType.Int, 4)
.Parameters("@CustomerID").Value = CustomerID
End With
da = New SqlDataAdapter(cmd)
cmd.Dispose()
da.Fill(ds, "Customer")
Catch ex As Exception
End Try
End Using
例3-Usingステートメントを使用した自動破棄
Using cn As New SqlConnection(ConnectionString)
Try
Using cmd As New SqlCommand
With cmd
.Connection = cn
.Connection.Open()
.CommandText = "dbo.GetCustomerByID"
.CommandType = CommandType.StoredProcedure
.Parameters.Add("@CustomerID", SqlDbType.Int, 4)
.Parameters("@CustomerID").Value = CustomerID
End With
da = New SqlDataAdapter(cmd)
da.Fill(ds, "Customer")
End Using
Catch ex As Exception
End Try
End Using
例4-例3と同じですが、Try/CatchはUsing内にあります-これは違いを生みますか?
Using cn As New SqlConnection(ConnectionString)
Using cmd As New SqlCommand
Try
With cmd
.Connection = cn
.Connection.Open()
.CommandText = "dbo.GetCustomerByID"
.CommandType = CommandType.StoredProcedure
.Parameters.Add("@CustomerID", SqlDbType.Int, 4)
.Parameters("@CustomerID").Value = CustomerID
End With
da = New SqlDataAdapter(cmd)
da.Fill(ds, "Customer")
Catch ex As Exception
End Try
End Using
End Using
例5-例4と同じですが、CommandTextとcnがUsingステートメントで指定されています-これにはどのような利点がありますか?
Using cn As New SqlConnection(ConnectionString)
Using cmd As New SqlCommand("GetCustomerByID", cn)
Try
With cmd
.Connection.Open()
.CommandType = CommandType.StoredProcedure
.Parameters.Add("@CustomerID", SqlDbType.Int, 4)
.Parameters("@CustomerID").Value = CustomerID
End With
da = New SqlDataAdapter(cmd)
da.Fill(ds, "Customer")
Catch ex As Exception
End Try
End Using
End Using
例6-例5と同じですが、接続はcmdではなくcnで開かれます。ストアドプロシージャを1つだけ実行する場合は、cmdで接続を開く方がよいでしょうか。
Using cn As New SqlConnection(ConnectionString)
cn.Open()
Using cmd As New SqlCommand("GetCustomerByID", cn)
Try
With cmd
.Connection = cn
.CommandType = CommandType.StoredProcedure
.Parameters.Add("@CustomerID", SqlDbType.Int, 4)
.Parameters("@CustomerID").Value = CustomerID
End With
da = New SqlDataAdapter(cmd)
da.Fill(ds, "Customer")
Catch ex As Exception
End Try
End Using
End Using
DataAdapter.Fillコマンドは接続自体を開いたり閉じたりするので、cmd.Connection.Open()
は必要ありません。 (参照: http://msdn.Microsoft.com/en-us/library/377a8x4t.aspx の備考セクション)
SqlConnectionにUsing
を使用すると、.Close
を呼び出す効果があります。
変数cmd
は、スコープ外になると(または、.NETが再度使用されないと判断した場合はそれ以前に)、ガベージコレクションの対象になります。
例2では、DataAdapterが使用する前にcmdを破棄するのが良い考えかどうかはわかりません。
[ユーザー "JefBar Software Services"からの情報 SQLCommandオブジェクトでDisposeを呼び出す必要がありますか? ]執筆時点では、SqlCommand
で.Dispose
を呼び出しても効果はありません。 コンストラクターのコード のため:
public SqlCommand() : base() {
GC.SuppressFinalize(this);
}