IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Problème de TransactionScope


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Décembre 2002
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 14
    Par défaut Problème de TransactionScope
    Bonjour, j'ai du code C# qui utilise le TransactionScope, mais il n'y a jamais de rollback.

    Le code est appelé depuis le backgroundworker.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    private int ExecuteOrd()
    {
        TransactionScope scope = new TransactionScope();
     
        using (scope)
        {
            try
            {
                 foreach (mDataSet.mRow row in m_InsertToDo)
                  {
                      dt.AddRow(row); //Insert dans table SQL2005
                  }
     
                  presenter.BusinessServiceClient.Update(CLE, row.NUM, IsLast); //Update dans une table SQL2000
     
                  //Génération du pdf (utilise le webservice reportingservices)
                  this.Dispatcher.Invoke(DispatcherPriority.Normal, new DelegateChangeLabelProgressBar(ChangeLabelProgressBar), "Génération du PDF en cours...");
                  GeneratePDF();
     
                  scope.Complete();
            }
            catch (Exception ex)
            {
                throw new Exception(ex.message);
             }
        }
    }
    Le rollback ne se fait jamais (je fais planter la sp appellée par la méthode Update)

    J'ai un message sur mon exception (exception was unhandled by user code).

    Si j'enlève le try catch, cela ne fait pas de rollback non plus.

    Quelqu'un peut-il m'aider ?

    Merci d'avance.

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Août 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2003
    Messages : 835
    Par défaut
    Salut,

    D'abord je ne maitrise pas les TransactionScope, donc si je dis une bêtise j'en suis désolé. Voilà ce qui me vient à l'esprit en lisant ton message:

    dt.AddRow(row); //Insert dans table SQL2005
    Il me semble que là tu insères une ligne dans une datatable (donc en mémoire) et non pas dans une base SQL2005. A moins que les opérations sur les datatable soient concernées par une transaction, ceci ne sera pas concerné par un éventuel rollback, non ?

    Le rollback ne se fait jamais (je fais planter la sp appellée par la méthode Update)
    Si la sp appelée par la méthode Update plante, je ne vois pas ce qu'il y a à "rollbacker". Tu voudrais annuler le dt.AddRow(row) ?

    J'ai un message sur mon exception (exception was unhandled by user code).
    Normal si ton exception n'est pas gérée qque part par toi .

    Dernier point, je vois que tu as mis ces lignes :

    this.Dispatcher.Invoke(DispatcherPriority.Normal, new DelegateChangeLabelProgressBar(ChangeLabelProgressBar), "Génération du PDF en cours...");
    GeneratePDF();
    dans le scope du transactionScope. Est-ce vraiment judicieux ? C'est à dire que si la génération du PDF échoue alors la transaction sera annulée. C'est peut être ce que tu veux faire, maisça me semble étrange.

  3. #3
    Membre averti
    Inscrit en
    Décembre 2002
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 14
    Par défaut
    D'abord, merci de ton intérêt

    Ensuite,

    dt.AddRow(row); //Insert dans table SQL2005
    Oui, je n'ai pas mis tout le code pour ne pas surcharger ce post. Après cet enregistrement dans la datatable, je fais un insert dans une DB sql 2005

    Si la sp appelée par la méthode Update plante, je ne vois pas ce qu'il y a à "rollbacker". Tu voudrais annuler le dt.AddRow(row) ?
    Oui, je veux rollbacker l'insert dans la base SQL 2005

    dans le scope du transactionScope. Est-ce vraiment judicieux ? C'est à dire que si la génération du PDF échoue alors la transaction sera annulée. C'est peut être ce que tu veux faire, maisça me semble étrange.
    Oui, car la génération du pdf fait partie du process. S'il échoue, je veux rollbacker l'insert SQL 2005 ET l'update SQL 2000

    J'espère t'avoir éclairci.

    Merci d'avance.

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Août 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2003
    Messages : 835
    Par défaut
    Oui c'est plus clair. Peut-être que tu devrais nous montrer ce code qui insère des données dans la base sql2005, le pb vient surement de là.

  5. #5
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Par défaut
    Tu as essayé avec ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    using (TransactionScope scope = new TransactionScope())
    {
        [...]
    }
    Besoin d'un MessageBox amélioré ? InformationBox pour .NET 1.1, 2.0, 3.0, 3.5, 4.0 sous license Apache 2.0.

    Bonnes pratiques pour les accès aux données
    Débogage efficace en .NET
    LINQ to Objects : l'envers du décor

    Mon profil LinkedIn - MCT - MCPD WinForms - MCTS Applications Distribuées - MCTS WCF - MCTS WCF 4.0 - MCTS SQL Server 2008, Database Development - Mon blog - Twitter

  6. #6
    Membre averti
    Inscrit en
    Décembre 2002
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 14
    Par défaut
    Tu as essayé avec ?
    Code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    using (TransactionScope scope = new TransactionScope())
    {
        [...]
    }
    Oui j'avais essayé, c'est pareil. Pas de rollback

    Oui c'est plus clair. Peut-être que tu devrais nous montrer ce code qui insère des données dans la base sql2005, le pb vient surement de là.
    Voici le code qui fait l'insert dans SQL 2005

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    presenter.BusinessServiceClient.CreateOperations(dt, out num_mvts);
    La fonction CreateOperations qui est appelée

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    public int CreateOperations(MouvementDataSet.MouvementDataTable operations, out int[] num_mvt)
            {
                int retVal = -1;
                num_mvt = new int[operations.Rows.Count];
                for (int j = 0; j < num_mvt.Length; j++) { num_mvt[j] = -1; }
                TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, TimeSpan.MaxValue);
                using (scope)
                {
                    PositionDataSet.PositionDataTable positions = new PositionDataSet.PositionDataTable();
                    for (int i = 0; i < operations.Rows.Count; i++)
                    {
                        MouvementDataSet.MouvementRow operation = (MouvementDataSet.MouvementRow)operations[i];
                            operation.DT_OPE = SystemManager.GetInstance().DateJour;
                            this.SignerOperation(ref operation);
                            PositionDataSet.PositionRow position = m_positionHelper.UpdatePositionAfterCreate(operation.NUM_CLI, operation.NUM_OPC, operation.DATE_OP,
                                operation.CODE_ENR, operation.DEVISE, operation.QUANTITE, operation.NET, operation.SENS, ref positions);
                            //positions.ImportRow(position);                             
                            retVal = m_entitiesManager.UpdateMouvementPosition(operations, positions, out num_mvt);
                    }
                    scope.Complete();
                }
                return retVal;
            }
    et la fonction UpdateMouvementPosition

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    public int UpdateMouvementPosition(MouvementDataSet.MouvementDataTable operations, PositionDataSet.PositionDataTable positions, out int[] num_mvt)
            {
                int r1 = 0;
                int r2 = 0;
                TransactionScope scope = new TransactionScope();
                using (scope)
                {
                    try
                    {
                        r1 = m_mouvementTA.Update(operations);
                        r2 = m_positionTA.Update(positions);
                        num_mvt = new int[operations.Rows.Count];
                        for (int i = 0; i < operations.Rows.Count; i++ )
                        {
                            MouvementDataSet.MouvementRow operation = (MouvementDataSet.MouvementRow)operations.Rows[i];
                            num_mvt[i] = operation.NUM_MVT;
                        }
                    }
                    catch (Exception e)
                    {
     
                        throw new Exception("Erreur lors de la mise à jour des mouvements et des positions correspondantes.\r\n" + e.Message, e);
                    }
                    scope.Complete();
                }
                return r1 + r2;
            }

Discussions similaires

  1. Problème TransactionScope !
    Par Sancha dans le forum C#
    Réponses: 3
    Dernier message: 22/02/2010, 15h24
  2. [VB.NET 2005] Problème de TransactionScope
    Par ironik dans le forum VB.NET
    Réponses: 2
    Dernier message: 27/02/2008, 12h16
  3. Problème d'installation oracle 8.1.7 sous NT
    Par Anonymous dans le forum Installation
    Réponses: 7
    Dernier message: 02/08/2002, 14h18
  4. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10
  5. Réponses: 6
    Dernier message: 25/03/2002, 21h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo