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

Accès aux données Discussion :

C# Dataset et Update : une transaction pour résoudre les problèmes de lenteur ?


Sujet :

Accès aux données

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Février 2009
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 163
    Points : 120
    Points
    120
    Par défaut C# Dataset et Update : une transaction pour résoudre les problèmes de lenteur ?
    Bonjour à tous,

    J’ai une base de données SQL Server 2000 d’une dizaine de tables que j’utilise dans une application .NET en C # 3.5. Elle est chargée grâce à un Dataset. Les DataTables sont « Fillée » au chargement en fonction de la sélection d’utilisateur.

    Le problème ce trouve au niveau de l’insertion des données modifiées. En effet, une des DataTable se retrouve avec 7000 enregistrements modifiées (7000 row avec un RowState à ModifiedCurrent) : ce qui est normal.

    Lorsque je fait un tableAdapter.Update(dataSet.MaTable) : cela prend 45 secondes ! Cela est beaucoup trop long, surtout qu’il n’y a rien de spécial sur cette table.

    J’ai donc testé dans SQL Server Management Studio de faire les 7000 Update à la main :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    UPDATE matable SET  champ=xxx WHERE id=xxx	;
    UPDATE matable SET  champ=xxx WHERE id=xxx	;
    UPDATE matable SET  champ=xxx WHERE id=xxx	;
    …..7000 fois……
    UPDATE matable SET  champ=xxx WHERE id=xxx	;
    UPDATE matable SET  champ=xxx WHERE id=xxx	;
    Cela prend également 45 secondes. J’ai donc testé en faisant une transaction :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    BEGIN TRANSACTION
    UPDATE matable SET  champ=xxx WHERE id=xxx	;
    UPDATE matable SET  champ=xxx WHERE id=xxx	;
    UPDATE matable SET  champ=xxx WHERE id=xxx	;
    …..7000 fois……
    UPDATE matable SET  champ=xxx WHERE id=xxx	;
    UPDATE matable SET  champ=xxx WHERE id=xxx	;
    COMMIT TRANSACTION

    Là ça prend 1 seconde !

    J’en viens à la conclusion que tableAdapter.Update(dataSet.MaTable) n’utilise pas de transaction !

    Je cherche donc en C# à faire une transaction. En fouinant sur msdn et sur le net j’ai trouvé cela mais ça ne marche pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    using (TransactionScope scope = new TransactionScope())
    {
         tableAdapter.Update(dataSet.MaTable)
         scope.Complete();
    }
    J’ai une TransactionException : « La transaction a déjà été validée ou interrompue de manière implicite ou explicite ».

    Je ne sais pas d’où vient le problème. J’ajoute que c’est la première fois que j’utilise les DataSet et les Transactions en C# donc je n’y connais pas grand-chose, et je m’y prends surement mal.

    Donc si quelqu’un sait comment faire une transaction ou résoudre mon problème de lenteur je l’en remercie par avance !


    PS : je précise que j'ai configuré MS DTC . Bien ou mal je ne sais pas :

  2. #2
    Membre éclairé Avatar de chamamo
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    588
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 588
    Points : 735
    Points
    735
    Par défaut
    Bonjour

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    using (TransactionScope scope = new TransactionScope())
    {
         tableAdapter.Update(dataSet.MaTable)
         scope.Complete();
    }
    tu execute sans utilisé la transaction quand meme,


    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
    using (SqlConnection connection = new SqlConnection(connectString))
    {
        connection.Open();
     
        // demarrer la transaction.
        SqlTransaction sqlTran = connection.BeginTransaction();
     
       //associer le dataAdapter à la transaction
       dataAdapter.UpdateCommand.Transaction = sqlTran; //pour l'Update
     
        try
        {
              //commit
              sqlTran.Commit();
        }
        catch (Exception ex)
        {
            // Rollback
            sqlTran.Rollback();
        }
    }

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Février 2009
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 163
    Points : 120
    Points
    120
    Par défaut
    Génial ! Merci bien !

    Voici la solution finale :

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    using (SqlConnection connection = new SqlConnection(CDL_Quotas.Properties.Settings.Default.QuotasConnectionString))
                    {
                        connection.Open();
     
                        // demarrer la transaction.
                        SqlTransaction sqlTran = connection.BeginTransaction();
                        tableAdapter.Connection = connection;
                        tableAdapter.Adapter.UpdateCommand.Transaction = sqlTran;
                        tableAdapter.Update(dataset.matable);
                        sqlTran.Commit();
                    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 07/08/2010, 22h34
  2. Réponses: 2
    Dernier message: 13/04/2007, 02h22
  3. une fonction pour enlever les doublons d'un array
    Par secteur_52 dans le forum Delphi
    Réponses: 1
    Dernier message: 27/06/2006, 13h45
  4. Réponses: 2
    Dernier message: 22/11/2005, 14h06
  5. Comment utiliser Developpez.com pour résoudre votre problème
    Par Anomaly dans le forum Mode d'emploi & aide aux nouveaux
    Réponses: 0
    Dernier message: 08/01/2005, 11h11

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