Można jawnie utworzyć transakcję i przekazać, że ok, tzn
using(var connection = ...)
{
connection.Open();
using (var tran = connection.BeginTransaction())
{
try
{
FBSave(connection, tran);
FBSaveDetails(connection, tran);
tran.Commit();
}
catch
{
tran.Rollback();
throw;
}
}
}
Zauważ, że tutaj jesteś koniecznością również ustawić Transaction
na każdej komendy, więc dlaczego trzeba przekazać go, a wszystkie komendy muszą znajdować się na tym samym obiekcie połączenia.
Lub: można użyć TransactionScope
; ważne jest, że Open()
dzieje wewnątrzTransactionScope
aby uzyskać automatyczne wstępowania:
using(var tran = new TransactionScope())
{
FBSave();
FBSaveDetails();
tran.Complete();
}
czyli
using(var tran = new TransactionScope())
using(var connection = ...)
{
connection.Open();
FBSave(connection);
FBSaveDetails(connection);
tran.Complete();
}
z podejściem TransactionScope
, nie trzeba ustawić coś specjalnego - większość to jest automatyczne. Można oczywiście opcjonalnie przekazać połączenie metodom, ale mogą one również uzyskać własne połączenie, w większości przypadków będzie działało dobrze.
MS Access lub SQL Server? – andy
Jak zrobić swoją warstwę danych? przechowywane procedury? linq-sql? połączony? niepowiązany? –
Możesz robić, co chcesz, korzystając z transakcji, http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqltransaction(v=vs.100).aspx – Raghuveer