J'utilise SqlDataAdapter.Update avec DataTables pour mettre à jour deux tables SQL dans une même transaction. Si l'insertion échoue, je veux annuler toutes les données. Ceci est mon code:TransactionScope ne recule pas avec SqlDataAdapter.Update
using (var conn = new SqlConnection(_connectionString))
{
conn.Open();
using (var scope = new TransactionScope())
{
// Insert first table
using (var command = conn.CreateCommand())
{
command.CommandText =
@"INSERT INTO TableA(Id, Data)
VALUES(@id, @data)";
command.CommandType = CommandType.Text;
command.Parameters.Add(new SqlParameter("@id", SqlDbType.Int) { SourceColumn = "Id" });
command.Parameters.Add(new SqlParameter("@data", SqlDbType.Char) { SourceColumn = "Data" });
var adapter = new SqlDataAdapter();
adapter.InsertCommand = command;
adapter.Update(tableADataTable);
}
// Insert second table
using (var command = conn.CreateCommand())
{
command.CommandText =
@"INSERT INTO TableB(Id, Data)
VALUES(@id, @data)";
command.CommandType = CommandType.Text;
command.Parameters.Add(new SqlParameter("@id", SqlDbType.Int) { SourceColumn = "Id" });
command.Parameters.Add(new SqlParameter("@data", SqlDbType.Char) { SourceColumn = "Data" });
var adapter = new SqlDataAdapter();
adapter.InsertCommand = command;
adapter.Update(tableBDataTable);
}
scope.Complete();
}
}
Le problème que je vais avoir est que si une exception est levée lors de la deuxième exécution de la commande, les données de la première commande est toujours commited. Ai-je besoin de reculer explicitement? Ou est comment TransactionScope devrait se comporter lors de l'utilisation de SqlDataAdapter.Update? Quelque chose à noter est qu'à l'origine j'avais la création de SqlConnection dans l'instruction using TransactionScope, mais je l'ai déplacée car je recevais des erreurs que mon serveur DB n'avait pas été configuré correctement pour les transactions distribuées. Le fait que ma création SqlConnection soit en dehors de TransactionScope est-il lié?