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 :

[ADO] Peut-on commiter plusieurs fois ?


Sujet :

C#

  1. #1
    Membre habitué
    Inscrit en
    Février 2004
    Messages
    363
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 363
    Points : 161
    Points
    161
    Par défaut [ADO] Peut-on commiter plusieurs fois ?
    Bonjour,

    Je vous montre d'abord un exemple de mon code :

    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
                    SqlTransaction trans;
                    lock (conn)
                    {
                        trans = conn.beginTransaction("tname");
                    }
     
                    try
                    {
                        SqlCommand mcmd = new SqlCommand();
                        lock (conn)
                        {
                            mcmd.Transaction = trans;
                            mcmd.Connection = conn.Connector;
                        }
                        mcmd.CommandText = "DELETE FROM .... " +
                                "INSERT INTO ...";
     
     
                        for (int i = 0; i < lr.Count; i++)
                        {
                            ...
     
                            lock (conn)
                            {
                                mcmd.ExecuteNonQuery();
     
                                if((i % 500) == 0)
                                     trans.Commit();
                            }
                        }
     
                        lock (conn)
                        {
                            trans.Commit();
                        }
                    }
                    catch (Exception e)
                    {
                        trans.Rollback();
                    }

    En commitant qu'une seule fois, après ma boucle, ça passe, mais je peux avoir à traiter des centaines de milliers de lignes, donc je pensais commiter tous les 500 lignes, est ce que la partie :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
                                if((i % 500) == 0)
                                     trans.Commit();
    est correcte?

  2. #2
    Membre chevronné
    Avatar de olsimare
    Inscrit en
    Décembre 2006
    Messages
    1 179
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 179
    Points : 1 776
    Points
    1 776
    Par défaut
    Bonjour.

    Cela à l'air correct mais ça ne me semble pas être la meilleure solution si tu as du volume (les inserts unitaires c'est gourmand).

    Tu devrais peut être creuser des solutions à base de Bulk Insert par exemple.

    Cdt.
    Bon à savoir : la touche F1 ne sert pas à commander des places pour le grand prix de Belgique.

  3. #3
    Membre habitué
    Inscrit en
    Février 2004
    Messages
    363
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 363
    Points : 161
    Points
    161
    Par défaut
    Bulk insert? je ne connais pas, tu pourrais m'en dire plus? j'ai vu que ca utilisait le principe de fichier, mais le problème est que je ne peux pas enregistrer des fichiers sur le serveur.

  4. #4
    Membre habitué
    Inscrit en
    Février 2004
    Messages
    363
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 363
    Points : 161
    Points
    161
    Par défaut
    J'ai un message d'erreur quand je commit la 2ème fois :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SqlTransaction est terminé*; il n'est plus utilisable.
    J'ai oublié quelque chose?

  5. #5
    Membre émérite Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Points : 2 925
    Points
    2 925
    Par défaut
    Citation Envoyé par bakonu Voir le message
    J'ai un message d'erreur quand je commit la 2ème fois :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SqlTransaction est terminé*; il n'est plus utilisable.
    J'ai oublié quelque chose?
    Bah visiblement une transaction peut être commitée qu'une seule fois, il faudrait que t'en recrées une à chaque fois.
    ಠ_ಠ

  6. #6
    Membre habitué
    Inscrit en
    Février 2004
    Messages
    363
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 363
    Points : 161
    Points
    161
    Par défaut
    j'ai essayé de faire ça après chaque commit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    trans.Dispose();
    trans = conn.beginTransaction("tname"+i);
    mcmd.Transaction = trans;
    toujours la même erreur.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    17
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 17
    Points : 21
    Points
    21
    Par défaut
    Bonjour,

    Pour le Bulk inset, regarde du coté de SqlBulkCopy

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

Discussions similaires

  1. [Utilisation] Peut-on versionner plusieurs fichiers en une seule fois ?
    Par llaffont dans le forum Subversion
    Réponses: 0
    Dernier message: 18/03/2011, 16h33
  2. Réponses: 7
    Dernier message: 17/05/2006, 12h37
  3. Réponses: 2
    Dernier message: 10/07/2004, 17h14
  4. [Servlet] Comment utilisé une servlet plusieurs fois ?
    Par gandalf_le_blanc dans le forum Servlets/JSP
    Réponses: 9
    Dernier message: 03/06/2004, 14h49
  5. Peut-on utiliser plusieurs canaux DMA simultanément ?
    Par le mage tophinus dans le forum Assembleur
    Réponses: 18
    Dernier message: 26/09/2003, 09h18

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