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

Dotnet Discussion :

[2.0] Deux requêtes avec les mêmes paramètres


Sujet :

Dotnet

  1. #1
    Membre éclairé
    Homme Profil pro
    Développeur
    Inscrit en
    Juin 2006
    Messages
    645
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Juin 2006
    Messages : 645
    Points : 709
    Points
    709
    Par défaut [2.0] Deux requêtes avec les mêmes paramètres
    Bonjour,

    Je souhaite réaliser une application qui modifie des données dans une base. Je souhaite que celle-ci, en lui passant un paramètre (dans la suite, ce sera le booléen reportOnly), exécute ou "simule" l'éxécution de ce traitement.
    Dans les deux cas, je souhaite afficher ce qui est modifié / aurait été modifié.

    Pour insérer, j'utilise une requête de la forme INSERT... SELECT...
    Ainsi, pour afficher ce qui aurait été inséré, seule la clause SELECT (et tout ce qui suit) est à prendre en compte.

    Le code mis en place est le suivant :
    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
    StringBuilder SqlCmd = new StringBuilder(String.Empty);
     
    // Construction de la requete
    SqlCmd.Append("SELECT DISTINCT ... ");
    // etc
     
    // Liste de paramètres : utilisateur à habiliter
    OleDbParameter[] parametersList = new OleDbParameter[1];
     
    // Affectation du paramètre
    parametersList[0] = new OleDbParameter("@Par1", valeur);
     
    // Recuperation lignes
    OleDbDataReader dataReader = null;
    dataReader = ReturnDrFromSqlCommand(SqlCmd.ToString(), parametersList);
    try
    {
      while (dataReader.Read())
      {
        // Pour chaque ligne du dataReader, recuperation des infos
      }
    }
    finally
    {
      dataReader.Close();
    }
    if (!reportOnly)
    {
      // Exécution (insertion)   
      string SqlCmd2 = "INSERT INTO ... " + SqlCmd.ToString();
      ExecuteQueryOnDataBase(SqlCmd2.ToString(), parametersList);
    }
    Si cela peut être utile, le code de la méthode ExecuteQueryOnDataBase :
    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
    public void ExecuteQueryOnDataBase(string sqlCommand, OleDbParameter[] sqlParameters)
    {
      OleDbCommand oCommand = null;
     
      oCommand = new OleDbCommand(sqlCommand, DataLayer.SqlCnx);
      try
      {
        oCommand.CommandType = CommandType.Text;
        foreach (OleDbParameter parameter in sqlParameters)
          {
            oCommand.Parameters.Add(parameter);
          }
     
          oCommand.ExecuteNonQuery();
      }
      finally
      {
        oCommand.Parameters.Clear();
        oCommand.Dispose();
      }
    }
    et de ReturnDrFromSqlCommand :
    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
    public static OleDbDataReader ReturnDrFromSqlCommand(IDbConnexion connexion, string sqlText)
    {
        OleDbCommand command;
        OleDbDataReader dataReader;
     
        if (!connexion.Connected)
            connexion.Connect();
     
     
        command = new OleDbCommand(sqlText, connexion.SqlCnx);
     
        try
        {
            dataReader = command.ExecuteReader();
        }
        catch (OleDbException exc)
        {
            throw new EStarnetException(exc, sqlText);
        }
        finally
        {
            command.Dispose();
        }
     
        return dataReader;
    }
    Et voilà mon problème : lors de l'éxécution de la seconde requête (celle d'insertion), j'obtiens le message d'erreur suivant dans les log :
    2008-07-04 15:42:59,543 ERROR MonBatch.MonBatch - Exception: System.ArgumentException
    Message: L'élément OleDbParameter est déjà contenu dans un autre OleDbParameterCollection.
    Source: System.Data
    J'avoue que je ne vois pas en quoi ça pose un problème, ni comment résoudre ceci proprement (j'ai bien des idées sales à base de copie / duplication de code... mais je ne veux même pas y penser).

    Merci pour votre aide !

    Alban
    « Se demander si un ordinateur peut penser est aussi intéressant que de se demander si un sous-marin peut nager. »
    -- Edsger Dijkstra

  2. #2
    Membre éclairé
    Homme Profil pro
    Développeur
    Inscrit en
    Juin 2006
    Messages
    645
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Juin 2006
    Messages : 645
    Points : 709
    Points
    709
    Par défaut
    J'ai fini par trouver la solution : le problème venait de la méthode ReturnDrFromSqlCommand().
    J'ai rajouté un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    command.Parameters.Clear();
    avant le Apparemment, le Dispose() ne fait pas automatiquement le « vide » des paramètres.
    C'était vicieux !
    « Se demander si un ordinateur peut penser est aussi intéressant que de se demander si un sous-marin peut nager. »
    -- Edsger Dijkstra

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 08/01/2015, 21h23
  2. Réponses: 5
    Dernier message: 18/10/2012, 12h34
  3. Vitesse différente de deux requêtes quasi les mêmes
    Par iguypouf dans le forum Développement
    Réponses: 6
    Dernier message: 26/07/2010, 13h19
  4. Réponses: 5
    Dernier message: 04/04/2010, 00h14
  5. Repérer deux fichiers identiques mais pas avec les mêmes dates
    Par rambc dans le forum Général Python
    Réponses: 14
    Dernier message: 17/03/2009, 03h13

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