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

ASP.NET Discussion :

Réutilisation d'un SQLParameter


Sujet :

ASP.NET

  1. #1
    Membre expérimenté
    Avatar de zooffy
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2004
    Messages
    3 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2004
    Messages : 3 895
    Par défaut Réutilisation d'un SQLParameter
    Bonjour à tous.

    J'ai un petit souci avec un SQLParameter et je ne comprends pas pourquoi je ne peux pas le réutiliser à volonté.

    Voici le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Dim LParamC(0) As SqlParameter
            LParamC(0) = New SqlParameter("idComment", IdComment)
            Dim dtComment As DataTable = RetournerTableP("EXEC dbo.CORE_CommentsTexteAuteur @idComment", LParamC)
    Dim ValeurVote As Integer = RetournerScalaireP("SELECT ISNULL(SUM(ValeurVote),0) AS ValeurVote FROM CORE_VoteComment WHERE IdComment = @idComment", LParamC)
    En gros, j'ai deux fonctions, une qui me retourne une table, l'autre qui me retourne une scalaire. Ces fonctions marchent à peu prêt pareil et prennent un SQLParameter en argument.
    Mais avec le code ci dessus il me retourne le message suivant sur la ligne qui demande le scalaire, donc la deuxième utilisation :
    Le format de la chaîne d'entrée est incorrect.
    Et mon logage d'erreur m'indique la chose suivante :
    L'élément SqlParameter est déjà contenu dans un autre SqlParameterCollection.
    Du coup, je pige pas pourquoi il veut pas utiliser deux fois de suite le SQLParameter alors que j'ai besoins du même paramettre pour faire mes deux requêtes.

    Pouvez vous m'aider ?

  2. #2
    Membre éprouvé Avatar de Joel Pinto Ribeiro
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2011
    Messages
    95
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 95
    Par défaut
    Le SqlParameter doit avoir une propriété unique qui le lie à une command et empêche par conséquent son utilisation sur plusieurs commands.

    2 solutions:

    1) Ne pas réutiliser le même paramètre .

    2) Faire un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    command.Parameters.Clear()
    apres l'utilisation de celui-ci.

  3. #3
    Membre expérimenté
    Avatar de zooffy
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2004
    Messages
    3 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2004
    Messages : 3 895
    Par défaut
    Donc le SQlParameter c'est comme un kleenex, ça marche qu'une fois ?

    Ta solution 1 est pas bonne dans mon cas : un identifiant, c'est un identifiant, du coup je suis obligé de réutiliser le même pamarètre.
    Si je veux obtenir le même enregistrement dans la base de donnée, je suis bien obligé de lui envoyer le même identifiant.

    Ta solution deux, je comprends pas bien où je le place le Clear ?
    Et puis, ça va vider le SQLParameter ça, donc va falloir le regarger. Autant faire le truc en double, ça ira plus vite je pense, non ?

    Et puis aussi, je me pose des questions sur les performances. Le fait de refaire la même chose deux fois, ça consomme pas un peu de ressources ?

    Merci pour ton aide.

  4. #4
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2011
    Messages
    269
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 269
    Par défaut
    Bonjour

    un identifiant, c'est un identifiant, du coup je suis obligé de réutiliser le même pamarètre
    Je sens une petite confusion. Un SQLParameter c'est utile a deux chose :
    - une certaine validation de la valeur, pour eviter les failles de type SQLInjection
    - avoir une seule requette (commande) pour plusieurs valeurs, et avec un bon SGBD on a une nette amélioration des performances.

    Donc oui un SQLParameter c'est un kleenex dédié à une seul commande, par contre il permet de ne pas figé la commande a une valeur.

    Un exemple sera peut etre plus parlant
    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
    const string idNameParameter = "@id";
    const string dataNameParameter = "@data";
    const string sqlInsert = "INSERT INTO [TABLE_TOTO] ([ID], [DATA]) VALUES (@id, @data)";
     
    SQLiteParameter idParameter = new SQLiteParameter(idNameParameter, DbType.Double);
    SQLiteParameter dataParameter = new SQLiteParameter(dataNameParameter, DbType.Int32);
     
    commandInsert = new SQLiteCommand(sqlInsert, connection);
    commandInsert.Parameters.Add(idParameter);
    commandInsert.Parameters.Add(dataParameter);
     
    for (int i = 1; i <= nbInsert; ++i)
    {
        idParameter.Value = i;
        dataParameter.Value = i;
     
        commandInsert.ExecuteNonQuery();
    }
    C'est dans ce cas là qu'un SQLParameter est réutilisé.

    Si tu as deux commande différente que tu as besoin de parametré sur la meme colonne de table. Peut importe le fait que tu vas utilisé la même valeur, il te faut deux instance SQLParameter.
    En revanche rien ne t’empêche d'utiliser le même nom de paramètre sur ces deux instance.

  5. #5
    Membre éprouvé Avatar de Joel Pinto Ribeiro
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2011
    Messages
    95
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 95
    Par défaut
    Citation Envoyé par zooffy Voir le message
    Donc le SQlParameter c'est comme un kleenex, ça marche qu'une fois ?

    Ta solution 1 est pas bonne dans mon cas : un identifiant, c'est un identifiant, du coup je suis obligé de réutiliser le même pamarètre.
    Si je veux obtenir le même enregistrement dans la base de donnée, je suis bien obligé de lui envoyer le même identifiant.

    Ta solution deux, je comprends pas bien où je le place le Clear ?
    Et puis, ça va vider le SQLParameter ça, donc va falloir le regarger. Autant faire le truc en double, ça ira plus vite je pense, non ?

    Et puis aussi, je me pose des questions sur les performances. Le fait de refaire la même chose deux fois, ça consomme pas un peu de ressources ?

    Merci pour ton aide.
    Cela ne va pas vider ton sqlParameter , cela va vider ton SqlCommand des parametres associé, à faire donc une fois que tu a lancé ta requete.
    Une fois ceci fait tu devrai pouvoir re-utiliser ton sqlParameter.

  6. #6
    Membre expérimenté
    Avatar de zooffy
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2004
    Messages
    3 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2004
    Messages : 3 895
    Par défaut
    Merci Joel pour cette précision. Je vais mettre ça en application.

    Merci Antoine pour ton aide, mais je dois bien avouer que j'ai rien compris à cet exemple.
    Je ne dois pas avoir le niveau d'abastraction nécessaire.
    Merci c'est pas grave, merci d'avoir passer du temps.

    Bonne journée à tous.

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

Discussions similaires

  1. Comment réutiliser une interface d'un scannner ?
    Par baume dans le forum API, COM et SDKs
    Réponses: 1
    Dernier message: 18/06/2005, 00h08
  2. réutilisation de composant
    Par La March dans le forum C++Builder
    Réponses: 8
    Dernier message: 14/04/2005, 15h41
  3. [VB.NET] Probleme pour réutiliser une sockets ??
    Par fdiedler dans le forum Windows Forms
    Réponses: 12
    Dernier message: 10/03/2005, 14h37
  4. [C#] [VS.NET] Réutiliser une Form d'une application windows?
    Par yannick_sch dans le forum Windows Forms
    Réponses: 4
    Dernier message: 14/10/2004, 14h28
  5. [Juridique] Comment réutiliser le code source d'une classe ?
    Par mathieu dans le forum Général Java
    Réponses: 8
    Dernier message: 17/05/2004, 13h40

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