Команда 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 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, но соединение открыто на cn вместо cmd. Лучше ли открывать соединение на 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
1 ответ:
Адаптер Данных.Команда Fill сама откроет и закроет соединение, так что вам не нужно
cmd.Connection.Open()
. (Ref: раздел замечаний в http://msdn.microsoft.com/en-us/library/377a8x4t.aspx .)Использование
Using
для SqlConnection имеет эффект вызова.Close
для вас.Переменная
cmd
становится пригодной для сборки мусора, как только она выходит за пределы области видимости (или раньше, если .NET определяет, что она не будет использоваться снова).В вашем примере 2 я не уверен это такая хорошая идея, чтобы избавиться от cmd до того, как DataAdapter использовал его.