Bir ADO.NET SqlCommand nesnesi oluşturan ve veritabanına kaydedilecek öğelerin bir listesini (SQL Server 2005) döngüler yapan bir "C" yöntemini "devraldım".Refactoring ADO.NET - SqlTransaction vs. TransactionScope
Şu anda, geleneksel SqlConnection/SqlCommand yaklaşımı kullanılır ve her şeyin çalıştığından emin olmak için iki adım (eski girdileri sil, sonra yenilerini ekler) bir ADO.NET SqlTransaction'a sarılır.
using (SqlConnection _con = new SqlConnection(_connectionString))
{
using (SqlTransaction _tran = _con.BeginTransaction())
{
try
{
SqlCommand _deleteOld = new SqlCommand(......., _con);
_deleteOld.Transaction = _tran;
_deleteOld.Parameters.AddWithValue("@ID", 5);
_con.Open();
_deleteOld.ExecuteNonQuery();
SqlCommand _insertCmd = new SqlCommand(......, _con);
_insertCmd.Transaction = _tran;
// add parameters to _insertCmd
foreach (Item item in listOfItem)
{
_insertCmd.ExecuteNonQuery();
}
_tran.Commit();
_con.Close();
}
catch (Exception ex)
{
// log exception
_tran.Rollback();
throw;
}
}
}
Şimdi, son zamanlarda .NET TransactionScope sınıfının hakkında çok şey okudum, ve merak ettim, tercih edilen yaklaşım burada ne var? Ben
using (TransactionScope _scope = new TransactionScope())
{
using (SqlConnection _con = new SqlConnection(_connectionString))
{
....
}
_scope.Complete();
}
tercih hangi
ve neden kullanarak geçiş yaparak şey (Hassasiyet, hız, güvenilirlik) kazanmak istiyorsunuz?
Marc
Tamam, teşekkürler John - ve evet, haklısın - bu örnek() blokları (henüz!) Kullanarak SqlCommand'a sahip değil - bu iş devam ediyor :-) –
re: SQLCommand'ı kullanarak, var mı? çöp toplama dışında, örneğin: SQLConnection için Dispose() Close() yöntemini çağırır, Dispose() herhangi bir SQLCommand yöntemini çağırır? –
Eğer bir sınıf 'IDisposable'ı uygularsa ve bu sınıfın bir örneğini oluşturursanız, o zaman Dispose'ı çağırmalısınız. Bunu yapmanın en basit yolu bir 'using' bloğu ile. Her zaman birini uygulamak alışkanlığına girmek en iyisi. –