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 :

Problème de requètes parametrés avec DAC


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de thelpi
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    217
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 217
    Par défaut Problème de requètes parametrés avec DAC
    salut à tous,

    j'ai réalisé une application c#/SQLServer qui fonctionne bien, mais depuis que je suis passé à l'indépendance vis à vis du type de base de données, je ne sais pas quel stratégie adopté pour mes requètes paramètrés.

    En gros, j'ai un objet commande qui dans un premier temps se prépare (définition du nom et du type des paramètres) puis plus loin dans le code je lui renseigne les valeurs des paramètres et je l'exécute. ces 2 parties se font dans 2 méthodes différentes.

    Voila mon code actuel, qui me parait complètement absurde (je pense que la je part tout l'intérèt de "préparer" la commande)

    Méthode de préparation de l'objet commande "cmdNonQuery"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    IDbDataParameter parameter;
    string[] paramsName = { "@id", "@ref", "@name", "@prtref", "@prtid", "@publish" };
    DbType[] paramsType = { DbType.Int32, DbType.String, DbType.String, DbType.String, DbType.Int32, DbType.Boolean };
                for (int i = 0; i < 6; i++)
                {
                    parameter = cmdNonQuery.CreateParameter();
                    parameter.ParameterName = paramsName[i];
                    parameter.DbType = paramsType[i];
                    cmdNonQuery.Parameters.Add(parameter);
                }
    cmdNonQuery.Prepare();
    Méthode d'exécution de la commande
    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
     
    IDbDataParameter parameter;
                for (int i = 0; i < 6; i++)
                {
                    parameter = (IDbDataParameter)cmdNonQuery.Parameters[i];
                    switch (i)
                    {
                        case 0:
                            parameter.Value = int.Parse(id);
                            break;
     
                        case 1:
                            parameter.Value = reader.GetValue(0).ToString();
                            break;
     
                        case 2:
                            parameter.Value = reader.GetValue(1).ToString();
                            break;
     
                        case 3:
                            parameter.Value = reader.GetValue(2).ToString();
                            break;
     
                        case 4:
                            parameter.Value = parentId;
                            break;
     
                        case 5:
                            parameter.Value = true;
                            break;
                    }
                    cmdNonQuery.Parameters[i] = parameter;
                }
    cmdNonQuery.ExecuteNonQuery();
    Je pense bien qu'il y'ait une meilleur solution mais je n'arrive pas à la trouver

    Merci de votre aide!

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par thelpi Voir le message
    Voila mon code actuel, qui me parait complètement absurde (je pense que la je part tout l'intérèt de "préparer" la commande)
    Ben non, en faisant comme ça la commande n'est parsée qu'une fois (lors du Prepare), et après tu changes seulement les valeur des paramètres. Donc si tu exécutes souvent cette requête, tu devrais gagner en performance grâce à cette méthode.
    Pour ce qui est de l'"absurdité" de ton code, moi ça ne me choque pas... par contre je ne vois pas trop l'intérêt des boucles for dans ce contexte, ça rend juste le code un peu moins lisible...

  3. #3
    Expert confirmé

    Avatar de Philippe Vialatte
    Homme Profil pro
    Architecte technique
    Inscrit en
    Juillet 2004
    Messages
    3 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2004
    Messages : 3 029
    Par défaut
    Ce ne serait pas plus simple de faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    cmd.Parameters.Add("@id", SqlDbType.Int32);
    cmd.Parameters.Add("@ref", SqlDbType.String);
    ....
    cmd.Parameters("@id").Value = id;
    cmd.Parameters("@ref").Value = reader.GetValue(0).ToString();
    ...

    Mon Blog

    The Cake is still a lie !!!



    Vous voulez contribuer à la rubrique .NET ? Contactez-moi par MP.
    Vous voulez rédiger des articles pour la rubrique .NET ? Voici la procédure à suivre.

  4. #4
    Membre confirmé Avatar de thelpi
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    217
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 217
    Par défaut
    OK merci les gars, je te fait confiance tomlev si tu me dit que mon Prepare est toujours utile

    pvialatte, en fait je crois qu'avec des command issue IDbCommand c'est pas possible, la méthode cmd.parameters.add() ne peut prendre qu'un objet en argument mais je peux me tromper

    c'est pour cette raison que je fait ce truc un peu bizarre...

    merci en tout cas de vous ètre pencher la dessus, bonne journée à vous

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

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Par défaut
    D'où ma méthode de la mort :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public static IDbDataParameter AddParameter(IDbCommand cmd, string paramName, DbType dbType, ParameterDirection paramDirection)
    {
    	IDbDataParameter result = cmd.CreateParameter();
    	cmd.Parameters.Add(result);
    	result.Direction = paramDirection;
    	result.DbType = dbType;
    	result.ParameterName = paramName;
    	return result;
    }
    // ...
    IDbCommand cmd = conn.CreateCommand();
    AddParameter(cmd, "hoho", DbType.Int32, ParameterDirection.Input);
    J'en aurais même fait une extension method si j'utilisais C# 3

  6. #6
    Membre confirmé Avatar de thelpi
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    217
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 217
    Par défaut
    Hum ça me plait ça je te le pique, même si la "direction" je connait pas...

    merci

  7. #7
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    ben c'est juste pour indiquer qu'un paramètre est en entrée ou en sortie...

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

Discussions similaires

  1. Problème de Requètes parametrés avec DAC
    Par thelpi dans le forum C#
    Réponses: 16
    Dernier message: 22/07/2008, 12h08
  2. Problème de requête SQL avec DISTINCT et COUNT ?
    Par [ZiP] dans le forum Langage SQL
    Réponses: 4
    Dernier message: 29/01/2007, 17h11
  3. Problème de requête count(*) avec DB2
    Par elsodiop dans le forum DB2
    Réponses: 3
    Dernier message: 30/11/2006, 16h11
  4. Réponses: 5
    Dernier message: 10/07/2006, 12h05
  5. Problème de requête SQL avec instruction TRANSFORM
    Par Nosper dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 21/06/2005, 16h15

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