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 :

Appeler une procédure stockée dans une boucle


Sujet :

C#

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    53
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Tunisie

    Informations forums :
    Inscription : Août 2008
    Messages : 53
    Points : 32
    Points
    32
    Par défaut Appeler une procédure stockée dans une boucle
    Bonjour tout le monde, j'ai un souci concernant l'appel d'une procédure stockée. Dans mon code, je fais le parsing d'un fichier xml et selon le nombre de noeuds existant dans le xml, je fais l'appel de la proc stockée.
    Voila mon code:

    Code c# : 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
    Campaign CampaignInstance = new Campaign();
    // parsing xml
    XmlNodeList nodeList = DocList(xmlString);
    int i = 0;
     
     //boucle while selon le nombre nodeList
    while (i< nodeList.Count)
    {
    dt = DateTime.Now;
    ContactID = string.Format("{0:u}", dt);
    CampaignInstance.IdContact+= nodeList[i].Attributes["id"].Value;
    CampaignInstance.Tel1+=nodeList[i].SelectNodes("Tel1").Item(0).InnerText;
    CampaignInstance.Tel2+=nodeList[i].SelectNodes("Tel2").Item(0).InnerText;
    CampaignInstance.Tel3+=nodeList[i].SelectNodes("Tel3").Item(0).InnerText;
    objSqlParam2.ParameterName = "@PhoneNumber1";
    objSqlParam2.Value = CampaignInstance.Tel1;
    alParam.Add(objSqlParam2);
    objSqlParam3.ParameterName = "@PhoneNumber2";
    objSqlParam3.Value = CampaignInstance.Tel2;
    alParam.Add(objSqlParam3);
    objSqlParam4.ParameterName = "@PhoneNumber3";
    objSqlParam4.Value = CampaignInstance.Tel3;
    alParam.Add(objSqlParam4);
    try
    {
    //Appel de la proc stockée
    DataAccesInstance.RunProcc("", "sp_CAMPSDK_AddContact", alParam);
    alParam = new ArrayList();
    CampaignInstance = new Campaign();
    i++
    }
     catch (Exception)
    {
    throw;
    }
    }
    D'aprés le code, je dois exécuter autant de fois la proc stockée que le nombre nodeList. Et comme la procédure stockée fais une insertion d'une ligne dans la base de données, je dois trouver 3 lignes insérées si le nodeList=3.
    Mais ce qui est bizarre c'est que je trouve une seule ligne dans la base concernant le premier noeud quelque soit le nodeList. Sachant que quand j'exécute le code avec des temps d'arrêt j'obtiens autant de lignes que le nodeList. J'ai même ajouté un sleep dans la boucle while et la aussi j'obtiens le nombre d'insertion correcte. Mais comme le nombre nodeList peut être trés grand, donc le sleep n'est pas une vrai solution.
    Donc s'il vous plaît, dites moi comment je force l'attente de l'exécution de la procédure stockée et l'exécuter autant qu'il le faut dans la boucle.

    Merci d'avance

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Février 2003
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 2 177
    Points : 4 489
    Points
    4 489
    Par défaut
    1)les balises [ CODE][/CODE]
    2)le try ne sert a rien
    3)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    alParam = new ArrayList();
    CampaignInstance = new Campaign();
    serait plus logique au debut de la boucle où mieux definir les variables dans la boucle
    4) J'aime bien Foreach mais bon c'est un avis personnel

    Peut-on avoir le code de DataAccesInstance.RunProcc()?
    Je ne suis qu'un pauvre débutant alors ne frappez pas si mes idées ne sont pas bonnes

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    53
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Tunisie

    Informations forums :
    Inscription : Août 2008
    Messages : 53
    Points : 32
    Points
    32
    Par défaut
    Voila le code demandé:

    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
    public void RunProcc(string strConnect, string ProcName, ArrayList procParameters)
            {
                RunProcc(strConnect, ProcName, procParameters, CommandType.StoredProcedure);
            }
     
            public void RunProcc(string strConnect, string ProcName, ArrayList procParameters, CommandType commandType)
            {
                //****************************************
               //* ***************************************
     
     
                    strConnect = _ConnectCaterpillar;
     
                string strCommandText = ProcName;
                //create a new Connection object using the connection string
                SqlConnection objConnect = new SqlConnection(strConnect);
                //create a new Command using the CommandText and Connection object
                SqlCommand objCommand = new SqlCommand(strCommandText, objConnect);
                objCommand.CommandType = commandType;
                foreach (SqlParameter param in procParameters)
                {
                    objCommand.Parameters.Add(param);
                }
                try
                {
                    objConnect.Open();
                    objCommand.ExecuteNonQuery();
                }
                catch (Exception objError)
                {
     
                    throw;
                }
                finally
                {
                    objCommand.Parameters.Clear();
                    objConnect.Close();
                }
            }
    Sinon concernant les déclarations, je les ai fait exprès pour vider leur valeurs initiales. et pour le try oui il ne sert a rien maintenant c'était à titre d'exemple.

  4. #4
    Invité
    Invité(e)
    Par défaut
    Regardes si le nodeList.Count vaut bien le nombre de noeuds attendus. S'il insère une seule ligne dans ta base cela veut dire qu'il sort de ta boucle While alors qu'il n'a pas atteint le max définit par nodeList.Count.

    Pour le try catch, c'est utilise ça te permet de gérer les exceptions générées par ta procédure stockée et par exemple de passer au noeud suivant.

    Code C# : 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
     
    // parsing xml
    XmlNodeList nodeList = DocList(xmlString);
    int i = 0;
     
     //boucle while selon le nombre nodeList
    while (i< nodeList.Count)
    {
        alParam = new ArrayList();
        CampaignInstance = new Campaign();
        dt = DateTime.Now;
        ContactID = string.Format("{0:u}", dt);
        CampaignInstance.IdContact+= nodeList[i].Attributes["id"].Value;
        CampaignInstance.Tel1+=nodeList[i].SelectNodes("Tel1").Item(0).InnerText;
        CampaignInstance.Tel2+=nodeList[i].SelectNodes("Tel2").Item(0).InnerText;
        CampaignInstance.Tel3+=nodeList[i].SelectNodes("Tel3").Item(0).InnerText;
        objSqlParam2.ParameterName = "@PhoneNumber1";
        objSqlParam2.Value = CampaignInstance.Tel1;
        alParam.Add(objSqlParam2);
        objSqlParam3.ParameterName = "@PhoneNumber2";
        objSqlParam3.Value = CampaignInstance.Tel2;
        alParam.Add(objSqlParam3);
        objSqlParam4.ParameterName = "@PhoneNumber3";
        objSqlParam4.Value = CampaignInstance.Tel3;
        alParam.Add(objSqlParam4);
        try
        {
            //Appel de la proc stockée
            DataAccesInstance.RunProcc("", "sp_CAMPSDK_AddContact", alParam);
        }
         catch (Exception)
        {
            // TODO : logguer l'erreur
            continue;
        }
        finally
        {
            i++;
        }
     
    }

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    53
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Tunisie

    Informations forums :
    Inscription : Août 2008
    Messages : 53
    Points : 32
    Points
    32
    Par défaut
    Même avec ce code il insère une seule ligne.
    Ce qui est sure c'est qu'il n'y pas d'erreur qui se produit dans le try catch parce que j'ai mis même throw ex et j'ai pointé un point de break mais il n'est jamais atteint.
    Je ne comprend vraiment pas ce problème

    et concernant le nodeList il vaut bien le nombre de noeud souhaité, d'ailleurs quand j'exécute le même code mais juste avec des points de break ou un sleep, il insère correctement.
    Je ne comprends pas

  6. #6
    Invité
    Invité(e)
    Par défaut
    Très bizarre.
    Avec break point tout s’insère sans on a qu'une seule ligne qui s’insère. Avec juste ça je ne peux pas t'aider. Bonne chance pour la suite.

Discussions similaires

  1. Réponses: 3
    Dernier message: 30/12/2008, 09h33
  2. Réponses: 7
    Dernier message: 18/01/2008, 18h01
  3. Réponses: 27
    Dernier message: 08/03/2007, 16h09
  4. Appel d'une procédure stockée dans une procédure stockée
    Par MrEddy dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 13/09/2006, 16h17
  5. Réponses: 3
    Dernier message: 17/01/2006, 17h12

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