J'ai du code que je veux exécuter comme suit. Mais je reçois toujours l'exception "Cette SqlTransaction est terminée, elle n'est plus utilisable" à la 2ème itération. Quelqu'un pourrait-il m'aider à souligner ce que je fais mal ici? Merci!sqltransactions multiples dans single sqlconnection
SqlConnection cn = (SqlConnection)SqlConnectionManager.Instance.GetUserConnection(user);
cn.Open();
try
{
foreach (Master mRecord in masterList)
{
if (sqlTransaction == null)
sqlTransaction = cn.BeginTransaction();
SqlCommand cm = cn.CreateCommand();
cm.Transaction = sqlTransaction;
cm.CommandType = CommandType.StoredProcedure;
cm.CommandText = "pr_InsertRecords";
try
{
cm.ExecuteNonQuery();
Debug.WriteLine("Auditor.Write: end sql table value param");
sqlTransaction.Commit();
sqlTransaction.Dispose();
}
catch (Exception Ex)
{
Debug.WriteLine(" Exception message: " + Ex.Message);
if (Ex.InnerException != null)
{
Debug.WriteLine("Inner exception message" + Ex.InnerException.Message);
}
sqlTransaction.Rollback();
}
}
}
finally
{
cn.Close();
}
Salut Remus, une question au sujet de cette approche. Que faire si le SqlTransaction est passé à la méthode en tant que paramètre? par exemple: public void Ecrire (SqlTransaction SqlTransaction, Liste masterRecords, utilisateur de l'utilisateur, la méthode InsertMethod) { } –
EndlessSpace
Dans ce cas, l'appelant doit aussi passer le SqlConnection à utiliser, et est la responsabilité de l'appelant d'avoir un ' using' le bloc. Votre méthode, en tant qu'appelant, ne doit pas commettre ni disposer l'objet SqlTransaction transmis, car si tel est le cas, cela le rendrait inutilisable par l'appelant. –