web-dev-qa-db-ja.com

SqlCommand(ステートメントの使用/問題の処理)

次の例を見てください...

        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
9
cw_dev

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);
}
9
Andrew Morton